기술적 지식이 전부가 아니다

프로그래밍은 배우기 쉽지 않습니다. 생초보에게 프로그래밍을 가르쳐보려고 해보면 알 수 있는데, 프로그래밍의 기초를 배우는 것에도 엄청난 양의 기반 지식과 훈련이 필요합니다. 알고리즘 분석, 특정 하드웨어에 대한 최적화, 분산 병렬 프로그래밍 등의 고급 기술을 배우기 위해서는 더더욱 많은 시간과 노력이 필요합니다. 그런 관점에서 볼 때 프로그래머 사이에서 그런 기술적 능력이 높이 평가되는 것은 당연합니다.

하지만 재밌게도 프로그래밍에서 가장 어려운 부분은 기술을 배우는 것이 아니라, 그 기술을 활용해서 무엇을 만들지 결정하는 것입니다. 이는 기술적 지식과는 크게 관련이 없는 부분입니다. 소프트웨어란 어떤 목표를 달성하기 위한 수단이고, 특정한 목적을 수행하기 위해 만들어진다는 것을 명심해야 합니다. 기술적 지식에는 학술적 가치가 내재되어 있긴 하지만 그 기술을 활용해서 현실의 문제를 해결하는 소프트웨어를 만들지 않는 이상 기술적 지식의 실용적인 가치는 전무하다고 보아야 합니다.

글쓰기로 비유하자면 프로그래밍 기술을 배우는 것은 문법을 깊이 있게 배우고, 각 문장 구조가 주는 효과를 학습하고, 단어 선택 능력을 키우는 것과 비슷할 것입니다. 고급 기술은 마찬가지로 복선, 상징, 운율 등의 문학적 표현법을 익히는 것과 비슷하겠죠. 그리고 프로그래밍 기술과 마찬가지로 이런 글쓰기 기술도 실제로 사람에게 영향을 미칠 수 있는 글을 쓰는데 활용되어야만 실용적 가치를 가질 수 있습니다.

안타깝게도 프로그래머들은 기술적인 문제를 해결하는데 정신이 팔려서 원래 해결하려던 실질적인 문제를 잊어버리는 안 좋은 경향이 있습니다. 나무를 워낙 좋아해서 거기에 집중하다보니 숲을 보지 못하게 되는 모양새입니다.

저도 그렇습니다. 지난 몇 개월 동안 정말 미친듯이 프로그래밍 공부를 했는데, 책이랑 온라인 강좌도 몇 개 끝내고, 컨퍼런스 동영상도 수십 개 넘게 보고, 팟캐스트도 수백 시간 넘게 들었습니다. 배우는 것을 좋아하는 만큼 정말 즐거운 시간이었습니다. 하지만 며칠 전에 갑자기 깨달았는데, 지난 몇 달 간 새로운 것을 배우는 즐거움에 취해서 프로그래밍의 궁극적인 목적, 즉 실질적인 가치를 만들어내는 수단이라는 것을 잊어버리고 말았던거죠. 그리고 이건 제가 아직 주니어 개발자라는 증거라고 생각합니다.

저는 자신이 해결하려고 하는 현실의 문제를 정확히 이해하고 그 문제를 시야에서 놓치지 않는 능력은 시니어 개발자가 되기 위해 필요한 능력 중 하나라고 생각합니다. 이건 언뜻 보기에는 간단해 보이지만, 이를 갖추기 위해서는 두 가지 매우 다른 능력을 동시에 터득하고 있어야 한다고 생각합니다.

첫 번째는 해결하려는 문제를 명확히 이해할 수 있는 능력입니다. 제대로 이해하지도 못하는 문제를 계속 염두에 두는 것은 불가능하기 때문이죠. 이를 위해서는 먼저 사업에 대한 이해가 필요한데, 현실의 문제에는 항상 사업적 요구사항과 한계가 존재하기 때문입니다. 또한 클라이언트의 말을 바탕으로 그런 사업적 요구사항을 파악해야하기 때문에 소통 기술도 필요합니다.

두 번째는 예상치 못한 문제가 발생하는 와중에도 프로젝트를 계속 넓은 관점에서 바라볼 수 있는 능력입니다. 이를 위해서는 새로운 문제를 한 눈에 이해할 수 있을 정도의 기술적 지식이 필요합니다. 그렇지 않으면 새 문제를 파악하기 위해 정신력을 쏟을 것이고, 그 과정에서 시야가 좁아지는 것을 피할 수 없기 때문입니다. 또한 평정심을 유지하는 능력도 필요하겠죠. 이는 얼마나 열심히 하건 상관 없이 공부로는 배울 수 없고 오랜 경험을 통해서만 습득할 수 있는 능력입니다.

물론 시니어 개발자는 다른 능력도 갖추고 있어야 합니다. 예를 들면 소프트웨어 구조를 디자인하고 알맞는 알고리즘을 선택할 수 있는 능력이 있습니다. 또다른 예로는 편법을 사용해서 단기적으로 개발 시간 단축하는 것과 장기적으로 기술 부채를 축적하는 것 사이에서 필요에 따라 적절히 선택할 수 있는 능력이 있겠네요. 시니어 개발자에 대한 제 기준이 너무 높은 것인지는, 오히려 너무 낮은 것인지는 잘 모르겠습니다. 확실한 것은 제가 갈 길은 아직 멀다는 것입니다.