프로그래머로 살면서 내 수준이 어디일까 항상 궁금했다. 결론부터 이야기하자면 나도 내 수준을 정확히 말할 수는 없다. 수능 점수처럼 딱 떨어지는건 아닌 것 같다. 하지만 좋은 프로그래머와 S급 프로그래머에 대해서는 이야기를 해볼 수 있을 것 같다. 또한 C급 프로그래머가 어떤 사람인지도 말할 수 있을 것 같다.
좋은 프로그래머는 좋은 코드를 쓴다. 좋은 코드의 정의는 조금씩 다르지만 보편적으로 동의하는 사안들이 있다. 첫번째는 가독성이다. 표현이 모호할 수 있지만 좋은 코드는 읽기 쉽다. 매우 정교한 알고리즘이라 해도 읽기 쉬운 코드가 있고, 쉬운 기능을 구현하는데도 읽기 힘든 코드가 있다. 이 중 좋은 코드는 과정의 복잡함과는 별개로 읽기 쉽고, 이해하기 쉽다.
코드의 가독성은 코드쓰는 방법론에 대한 이야기이기도 하지만 패턴에도 크게 영향 받는다. 회사는 크건 작건 코드 스타일 가이드가 존재하며, 존재하지 않는다면 코드의 품질을 이야기할 수 없는 수준의 작은 회사일 것이다. 통일된 코드 스타일 내에서 유지보수가 편리한 코드를 작성하는 것은 좋은 프로그래머의 덕목이라 생각한다. 반면 코드 스타일을 준수하지 않거나, 작성 패턴이 매번 달라지는 사람은 함께 일하기 어렵다.
두번째 덕목은 성장일 것이다. 프로그래밍의 세계는 느리면서도 빠르게 변화하고 진화한다. 고인 기술을 연마해야하는 기업도 존재하겠지만 많은 기업들은 새롭게 변화되고 있는 기술을 사용 중이며, 트랜드를 따라 개발을 하고 있다. 이런 연유에서 현재 트랜드를 따라오지 못하는 프로그래머는 뛰어나다 말하기 어렵다. 새로운 프레임워크에 적응하지 못한다면 장기적으로 자신의 기술이 대체될 때 자신도 함께 대체될 가능성이 많기 때문이다.
성장력은 많은 기업들에서 원하는 덕목이지만 문제는 성장력의 지표를 측정하는게 쉬우면서도 어렵다. 객관적 지표는 포트폴리오 프로젝트가 있겠지만 이미 회사에 다니고 있는 사람에게 있어서 성장력은 가시적으로 표현되기 어렵다. 또한 매일매일 일하는 프로그래머들은 일을 하면서 성장하기도 하지만 일의 대부분이 반복적이고, 기존에 해왔던 것을 강화하는 수준에 머물기도 한다. 그렇기에 성장은 말처럼 쉬운게 아니기도 하고, 정량지표로 측정되기에 어렵다.
내가 생각하기에 나이가 들어가면서 나타나는 성장의 차이는 테크놀로지에 대한 현실적인 이해와 큰 연관이 있다. 대기업에서 일하는 현업 개발자들을 만나보면 차이가 어디에서 나타나는지 확연히 보이는데, 현업에서 빠르게 성장한 프로그래머들 치고 현재 테크놀로지에 문외하거나 경험이 적은 사람은 보기 드물었다. 물론 이들은 좋은 프로그래머를 넘어 S급 프로그래머이긴 하지만, 이들의 특징은 적건 많건 최신 테크놀로지에 대해 활동하거나 글을 쓰거나 오픈소스에 참여하거나 회사에서 테스트 프로젝트로 테크놀로지를 검증한다.
또한 성장은 프로그래머가 가진 흥미와 직결되는 이슈다. 프로그래밍이 취미인 프로그래머가 있고, 그렇지 않은 프로그래머가 있다. 취미로 계속 새로운 기술과 프로젝트를 시도하는 사람은 필연적으로 새로운 기술에 대해 연마하고, 적은 경험이라도 쌓게 된다. 이 작은 차이는 경험이 있다, 없다를 가르게 되고 결과적으로 트랜드를 이해하는지와 이해하지 못하는지를 가르게 된다.
웹개발이 처음이거나 옛날 프레임워크만 사용하던 사람에게 있어서 graphql의 의미와 필요성은 크게 와닿지 않을 것이다. 또한 누군가에게 장고와 익스프레스의 차이를 말할 수 없을 것이고, 구글 클라우드와 AWS의 차이를 장단점을 말하기 어려울 것 같다. 이정도면 좋은 프로그래머가 아니라 S급 프로그래머라 할지도 모른다. 사실 이 글에서 나는 좋은 프로그래머와 S급 프로그래머의 기준을 명확하게 말할 의도는 없는데, S급인 사람은 모든게 뛰어나기에 좋은 프로그래머의 덕목을 모두 포함하기 때문이다.
그럼 C급 프로그래머는 어떨까? 점수로 치면 평균 또는 평균 아래의 프로그래머에 대해 말해보자면 한마디로 요약할 수 있다. 평균 이하는 자신의 문제점을 정확히 모른다. 가독성이 높은 코드를 쓰지 못하지만 본인이 가독성이 높은 코드를 썼다고 착각할 수 있다. 왜 이런 일이 펼쳐질까? 좋은 코드는 자신만이 쓴다고 해서 완성되는게 아니다. 남의 코드를 많이 봐야할 뿐더러, 내가 생각했던 것보다 좋은 알고리즘이나 패턴이 세상에 많이 알려져있다. 자기 객관화가 되어있지 않기에 자신의 코드 품질에 대해 이야기하기 어렵고, 결과적으로 좋지 않은 코드를 작성한다.
이는 작은 프로젝트에서는 크게 문제가 되지 않을 것이다. 하지만 프로젝트가 장기화되고 레거시 코드가 쌓이고, 필요한 코드와 필요없는 코드, 삭제, 수정, 생성이 난무하면서 설계가 변경될 때 진면목이 나타난다. 코드가 명확하다면 유지보수가 편리하기에 잘 쓴 코드라는 것을 단번에 알아챌 수 있다. 반면 어떤 코드는 자신이 작성했음에도 혼란을 주기도 한다. 자신의 코드를 자신이 못 읽는다면 그 사람이 좋은 프로그래머라 할 수 있을까?
또한 내가 생각하는 평범함과 좋음을 나누는 기준 중 하나는 기록이다. 코드는 생각을 컴퓨터 언어로 변환한 것이다. 코드에 생각과 의도가 담겨있지만 항상 그 생각과 의도가 타인과 내 자신에게 일정하게 리턴하지 않을 것이다. 그렇기 때문에 기록이 중요하다. 기록은 다양한 형태로 가능한데 적절한 주석으로 표현할 수도 있고, 따로 문서를 만들 수도 있다. 개인적으로는 엑셀을 통해 중요 파라미터나 목적 정도를 기입하는 편인데, 시간이 더 들어감에도 불구하고 협업 및 유지보수에 큰 도움을 준다.
기록만큼 중요한 것이 하나 더 있는데 바로 로그다. 좋은 시스템은 에러가 아예 없는게 아니라 에러를 잘 트레킹하고, 대응하는게 중요하다. 최악의 시스템은 에러가 있음에도 어디에서 발생했는지 왜 발생했는지 모르는 것임을 생각해보면 로그의 중요성은 두 번 강조해도 부족하다. 에러를 로깅하는 것은 시스템의 항상성을 만들어 주고, 문제에 빠르게 대응할 수 있게 해준다. 사용자의 행동 패턴이나 사용량의 변화 같은 모니터링과 관련된 로그는 단순히 개발을 넘어 마케팅과 시장에 대한 인사이트, UI/UX의 개선점 등과 같은 제품 전체의 퀄리티에 직접적인 가치를 제공한다.
이를 중요하게 다룰 수 있고, 적절한 방식으로 데이터를 포맷하는 일에 가치는 둔다면 제품의 항상성과 퀄리티 향상에 크게 기여할 수 있다. 이런 면에서 단순히 개발을 하는 것과 한 발 더 나아가 제품의 가치에 기여하는 것은 한 끝 차이라 할 수 있다. 물론 로그를 찍는 일이나 적절한 데이터를 추출하고, 트래킹하는 것은 코드 자체로는 간단할 수 있지만 그것을 활용하고자 하는 것은 시스템을 생각해야만 가능한 일이다.
내가 대학에서 프로그래밍을 가르쳐봤을 때와 주변에 프로그래밍 전공자들을 보았을 때 놀랐던 점은 그들이 프로그래밍을 하나의 학문처럼 수동적으로 학습하는 모습을 봤을 때다. 내 경우엔 학문이 아닌 재미와 열망의 실현으로 프로그래밍을 대했으나 전공자들 중 몇몇은 하기 싫은 과목을 공부하는 것 같은 느낌을 받았는데, 이 증거가 이들이 진행 중인 프로젝트의 숫자이다.
내가 만난 모든 뛰어난 프로그래머는 수 많은 프로젝트 경험이 있다. 그들은 작건 크건 자신이 프로젝트를 진행하거나 다른 사람의 프로젝트에 참여하면서 자신의 커리어와 실력을 쌓는데 남는 시간을 사용한다. 반면 평범하거나 그 이하의 수동적인 프로그래머는 이러한 레코드가 없다. 수동적으로 학교에서 내준 프로젝트를 한 것이 그들의 포트폴리오였고, 숙제로 만든 앱이 자신이 만든 최고의 앱인 경우도 많았다.
자신이 만들 수 있는 기술과 능력이 있음에도 활용하지 않는 사람이 최고가 될 수 있을까? 아니면 업계의 리더로 존재할 수 있을까? 분명 끌려가는 사람이 될 것이다. 리더는 소수이다. 비율상 언제나 리더와 능력있는 사람은 소수이고, 많은 이들이 동일하게 뛰어날 순 없다. 인정하고 싶지 않아도 대부분은 평균이며, 평균 주변에 존재한다. 그런 의미에서 자신이 뛰어나지 않다면 C급이라 생각하거나 그 이하라 생각하는게 성장에 도움이 될 것이라 생각한다.
나는 내 스스로를 C급이라 생각한다. 위에 말한 모든 것들을 지키지 않아서가 아니다. 위의 말한 것들 중 내가 실천하는 것들도 많지만 결정적으로 내가 남들보다 뛰어나다라고 스스로 확신하지 않기 때문이다. 또한 나와 S급 프로그래머와의 간극이 너무도 선명하게 느껴진다. 그들보다 내가 부족한 것들이 너무도 많아 나는 설령 내가 A,B 어디쯤 있더라도 스스로를 C급으로 생각하고 발전하고 싶다.
마지막으로 한가지를 말하고 마치자면 좋은 프로그래머와 C급 프로그래머는 남의 눈에 쉽게 판별되기 어렵다. 하지만 정말 뛰어난 프로그래머는 확 눈에 띈다. 자신이 부정해도 남들이 S급이라 말해준다. 등급에 연연할 필요는 없지만 나는 선택한 길에서 평범한 놈으로 살고 싶진 않다. 내가 잘하는 것을 발전시켜 S급 프로그래머로 살 것이다.