프로그래밍에서 실력이란?
1. 항상 거론되는 단어 '실력'
소프트웨어 엔지니어 세상에서는 스포츠 경기에서나 많이 쓸만한 '실력'이라는 단어를 많이 거론한다. '실력' 향상을 위해서는 연봉의 일부라도 포기할 수 있다. '실력'향샹을 위해서 무엇을 해야될까요? 저 사람의 '실력'은 어느정도 입니까? 라는 등의 '실력'과 관련된 이야기는 소프트웨어 엔지니어들에게는 항상 같이 동반되는 단어이다.
소프트웨어 개발자들은 흡사 무림 RPG 게임속의 캐릭터와 같은 모습을 가지고 있다. RPG 게임을 보면 상대 캐릭터의 레벨이 머리위에 꼭지처럼 달려서 표시가 된다. 그러면서 나보다 높은 레벨의 사람에게 PK를 거는 일은 하지 않는다. 때로는 나보다 나약한 레벨로 보이는 캐릭터에게는 무례하게 굴기도 한다.
소프트웨어 개발자들은 자신의 실력이라는 것을 RPG 게임의 캐리턱처럼 개발자들끼리만 보이는 팻말을 머리 위에 달고 다닌다. 그리고 습관적으로 개발자와 개발자가 개발과 관련된 대화를 하기 시작하면 상대방의 머리위에 측정된 '실력'을 레벨처럼 각인하게 된다.
최소한 그 레벨이 얼마인지 정량적으로 측정하여 표기할 순 없지만 나보다 낫다. 혹은 나보다 못하다. 어느부분은 내가 낫고 어느부분은 저 사람이 낫다. 아님 비슷한거 같다. 때로는 다른 상대들끼리의 실력이 어떻다고 외부인의 시산에서 쉽사리 평가를 하기도 한다. 그렇다. 여기는 어찌보면 무림의 세상이이다. 고수라고 불리는 아키텍터가 존재하고 초급 개발자가 존재한다. 분명 실력이 존재하는 곳이며 그 실력으로 대우를 받는 곳이기도 한다.
2. '실력'의 실체
그렇다면 실력은 무엇인가? 내가 정의한 소프트웨어 개발 전체과정을 봤을때 실력은 1차원적으로는 주어진 문제를 해결하는 것이며, 2차원적으로는 주어진 문제를 탁월하게 해결하는 것이다. 1차원 적인 문제 해결은 문제를 해결하는 것 자체에 의미를 두는 것이다. 2차원 적인 해결은 탁월하게 해결하는 것이다. 탁월하게 해결한다는 것은 적정한 시간내 문제해결을 위한 소프트웨어 개발를 하는 것이다. 이 문제 해결의 과정은 소프트웨어를 설계하고 코딩하는 과정을 통하여 이루어진다. 그렇다면 실력이란 곧 소프트웨어의 설계 및 코딩(개발)을 잘 하는 정도에 따른 능력이라고 볼 수 있다.
설계 및 개발을 잘하기 위해서는 소프트웨어 개발의 요소요소 필요한 것들을 잘 알고 그것을 잘 이용하여 소프트웨어를 만들어내는 행위를 잘 하는 것이다. 건축에 비유하자면 자재와 도구를 잘 알고 공법을 잘 이용하여 건출물을 설계하고 짓는 것과 같은 것이다.
그렇다면 건축과 같이 자재와 도구를 잘 알아야 한다. 소프트웨어 개발에서 자재와 도구는 무엇이 될까? 우리가 학습하는 언어부터 각종 데이터베이스와 관련 통신 기술, 컴퓨팅 기술의 기본지식을 잘 알아야 한다. 그리고 그것을 다루는 도구 개발도구나 개발환경, 인프라등을 잘 알아야 한다는 것이다.
문제는 생각보다 이런 지식의 트랜드가 소프트웨어 개발분야에서는 너무나 빠르게 변한다는 것이다. 그래서 항상 재학습을 해야만 자신의 지식이 실전에 써먹을 수 있는 지식이 된다는 것이다. 그런데 생각보다 많은 초급개발자들은 자신이 사용하는 언어의 사양 중에서는 한두가지만 사용하며 문제해결을 하는 경우가 많다. 수많은 문법적인 요소들이 존재함에도 불구하고 자신이 아는 문법과 방법들만 이용하여 자신들이 경험한 개발 방법의 울타리를 벗어나지 않는다. 이는 수많은 도구가 있는 공구상자를 옆에두고도 단순한 드라이버와 망치등과 같은 것들로만 공사를 끝내려고 달려드는 것과 같다고 할 수 있다.
좋은 엔지니어는 좋은 도구를 적재적소에 잘 다루는 사람들이다. 소프트웨어 개발자도 같다. 좋은 도구를 적재적소에 잘 사용하기 위해서는 언어적인 사양이나 개발을 해야하는 인프라에 관련된 지식이 탑재가 되어 있어야 상황에 따라 여러가지 방법을 동원하여 효율적으로 문제 해결을 할 수 있다.
효율적인 방법을 적재적소에 사용하기 위해서는 당연히 관련 지식을 탑재해야 한다. 이부분이 선행되지 않으면 소위 실력이라는 것이 늘지 않는다. 때로는 업무 중에 때로는 개인의 시간을 내서 학습을 하고 연습을 하고 삽질을 하며 실력이라는 것을 쌓아가는 과정을 거친다. 때로는 업무에 밀려서, 때로는 쉬는게 더 좋아서 학습과 연습을 미루며 회의감을 가지기도 한다. 이 모든게 소프트웨어 개발자들이 항상 말하는 '실력'을 쌓으며 거치는 과정이다.
하지만 많이 아는 것만이 꼭 실력을 보장해주는 것은 아니다. 실력은 그러한 지식 바탕위에 구현이 되어야 하는 것이다. 실제 건축지식을 바탕으로 구현을 해야지 건출물이 완성 되듯이 소프트웨어 개발도 소프트웨어 관련지식을 바탕 위에 코딩이라는 행위를 통해서 코드가 작성되어야 하며 이 코드들이 모여서 소프트웨어라는 건출물이 만들어진다. 소프트웨어 개발은 엄연히 엔지니어링 분야이기 때문에 학문만으로는 결과가 나왔다고 볼 수 없다.
결국 현실속에서 사용되는 구동가능한 소프트웨어라는 결과물이 나와야 된다. 많은 지식을 가지고 있는 것이 실력을 쌓는데 필수 조건이긴 하나 충분 조건은 아니라는 것이다. 많은 지식 위에서 많은 시도를 해야만 실행 능력. 즉, 실력이라는 것이 쌓이는 것이다. 그 실행 능력은 코딩능력이고 그 능력의 결과물은 코드이다.
우리가 흔히 말하는 개발자의 '실력'은 소프트웨어 개발 전체 중에 가장 중요한 요소인 '프로그래밍 실력'이라고 말하고 있다고 볼 수 있다. 소프트웨어 개발의 전체과정에서 보았을 때는 다른 요소들도 있을 것이다. 하지만 우리가 흔히 하는 프로그래밍 실력 은 코딩 능력이라고 하면 딱 맞을 것이다. 그럼 이 코딩 능력이라는 것은 문제해결 자체에만 있는 것일까? 어떠한 코드가 되었든 사용자의 문제를 해결만 했다면 좋은 코드로 볼 수 있고 실력이라고 볼 수 있는 것일까?
화장실 공사를 한다고 해보겠다. 각각 다른 타일러가 타일시공을 하여 화장실을 만들었다. 둘의 화장실의 기능에는 아무 문제가 없었다. 변기나 욕조나 기본 세면대등은 모두 정상작동하였다. 하지만 둘중 한명의 작업결과는 매우 균일했고 마감처리가 깔끔하였다. 누가 더 실력이 좋은 것인가?
프로그래밍에서도 마찬가지로 요구사항의 문제 자체가 해결을 했되었다고 하여도 해결자의 실력이 모두 같다고 말할 수 없다. 기능의 결과는 같지만 분명 다른 결과를 남기는데 소프트웨어 개발 결과에서 미적인 요소로 볼 수 있는 것은 소프트웨의 구동 껍데기를 이야기할 수도 있지만 개발자들끼리는 코드를 보고 이야기할 수 있다. 실력차이가 나는 두명의 개발자가 각각 같은 문제를 해결한 코드가 있다면 분명 어느 하나의 코드가 더 아름답다고 느낄 수 있는 코드가 있다. 특히 소프트웨어는 화장실과 같은 하드웨어가 아니라 사용하며 변경이 일어자주일어나는 특성을 가지고 있기 때문에 밖으로 보이는 기능적인 요소말도고 재수정이 용이한 구조나 형태도 결과물을 평가할 때 매우 중요한 요소이다.
변경이 가능한 소프트웨어의 특징상 보이는 기능만을 해결하면 끝났다고 생각할 수가 없다. 20년 가까이 소프트웨어 개발을 하면서 단 한번도 내가 짜서 고객에게 인도한 소프트웨어가 설사 고객테스트를 끝냈더라도 몇달 혹은 몇년 후에 연락이와서 이런 기능으로 추가나 변경이 가능한지 문의가 안 온 적이 없다. 코드를 외워서 짜더라도 몇달 몇년이 지나면 기억이 나지 않는다. 다시 소스코드를 열어봤을때 만약 내가 빠르게 이해하기 쉽도록 코드가 작성되어있다면 대응이 엄청나게 빠를 것이다. (사실 개발을 하는 와중에도 읽기 쉬운 코드는 생산성의 향성을 가져다 준다)
3. 결론. 그래서 실력은?
결론, '프로그래밍 실력' = '고객의 문제를 읽기 쉬운 코드를 작성하여 해결하는 능력' 이라고 말 할 수 있다. 여기서 말하는 작성 능력이라고 해서 작성자체만을 이야기하는 것이 아니다. 그러한 구조 그런한 설계를 하여 결과적으로 '읽기 쉬운 코드'가 나오는 일련의 개발행위는 모두 포함된다고 할 수 있다. 이것이 우리가 그렇게 갈망한 프로그래밍 실력이 아닌가? 하는 생각을 해본다.