- 기술적 취향은 기술적 실력과는 다른 개념으로, 뛰어난 능력이 있어도 취향이 나쁠 수 있고, 능력이 부족해도 취향이 좋을 수 있음
- 소프트웨어 엔지니어의 취향은 프로젝트에 맞는 엔지니어링 가치 선택 능력을 의미함
- 어떤 코드가 보기 좋다/나쁘다, 어떤 설계 결정이 만족스러운가, 어떤 문제에 집착하는가와 같은 감각에서 드러나며, 이는 곧 자신이 중시하는 엔지니어링 가치의 집합을 반영
- 소프트웨어 엔지니어링의 모든 결정은 트레이드오프의 연속이며, 미성숙한 엔지니어는 특정 접근을 절대적 진리로 여기지만 성숙한 엔지니어는 맥락에 따라 유연하게 가치를 조율함
- 좋은 취향은 특정 프로젝트에 맞는 가치들의 우선순위를 선택할 수 있는 능력이며, 나쁜 취향은 "베스트 프랙티스" 같은 절대적 기준에 집착하는 경직성에서 나타남
- 취향은 다양한 프로젝트 경험과 개방적 사고를 통해 쌓이며, 결국 프로젝트 성공 여부를 통해 좋은 취향의 유무가 드러남
기술적 취향과 실력의 차이
- 기술적 취향은 뛰어난 실력과 반드시 일치하지 않음
- 누구나 요리 실력과 별개로 좋은 음식과 나쁜 음식을 구분할 수 있는 것처럼, 소프트웨어에서도 능력보다 앞서 취향이 형성됨
- 어떤 코드가 "좋아 보이는지" 혹은 "별로인 것처럼 보이는지"에 따라 엔지니어의 취향이 반영됨
- 어떤 설계 결정에 만족을 느끼고, 어떤 문제에 더 신경을 쓰는지는 취향의 일부로 작동함
- 기술적 능력은 반복과 학습으로 성장 가능하지만, 취향은 그보다 모호하고 직관적인 방식으로 발달함
-
엔지니어링 취향의 지표
- "이 코드가 보기 좋다/나쁘다"라고 느끼는 것
- 일부 설계 결정에 대한 강한 만족감 또는 무덤덤함
- 퇴근 후에도 계속 신경 쓰이는 소프트웨어 문제와 그렇지 않은 문제
- 취향이란 현재 프로젝트에 맞는 엔지니어링 가치를 채택하는 능력이라고 생각함
실력과 취향의 구분
- "좋아 보이는 코드"가 실제로 더 좋은 코드여야만 할까하는 의문이 있음
- 예: map/filter를 선호하는 사람은 코드 가독성과 순수 함수를 중시하지만, for 루프를 중시하는 사람은 성능과 단순한 확장을 중시할 수 있음
- 이는 옳고 그름의 문제가 아니라 중시하는 가치의 차이임
- 언어나 컨텍스트에 따라 각각의 장단점이 존재하기 때문에, 어떤 선택이 반드시 더 좋은 것은 아님
- 각 엔지니어가 중요하게 보는 가치가 다르며, 이에 따라 선호가 달라짐
엔지니어링 취향이란 무엇인가
- 소프트웨어 엔지니어링의 거의 모든 결정은 상충하는 가치 간의 균형(트레이드오프) 임
- 미숙한 엔지니어는 자신의 취향에 지나치게 고집을 부림
- 성숙한 엔지니어는 다양한 관점에서 이점을 파악하고, 현재 상황에 맞는 선택을 중시함
- 중요한 것은 X(기술)와 Y(기술) 중 무엇이 더 좋은가가 아니라, 현재 프로젝트에 X의 장점이 Y보다 더 필요한가의 판단임
-
엔지니어링 가치의 예시
- Resiliency: 시스템이 장애나 네트워크 문제에도 잘 동작하는가
- Speed: 이론적 한계에 가까운 성능을 보이는가, 불필요한 작업이 많은가
- Readability: 새로운 엔지니어가 빠르게 이해하고 적응할 수 있는가, 함수가 짧고 명확한가
- Correctness: 잘못된 상태가 모델링되는가, 테스트와 타입, assert 등이 충분한가, 심지어 형식적 검증이 적용되는가
- Flexibility: 시스템 확장이 쉬운가, 변화가 간단하게 적용되는가
- Portability: 특정 환경에 종속적인가, 배포 환경 변화가 간단한가
- Scalability: 10배, 100배 트래픽 증가 시 시스템 확장 또는 자동 스케일링이 가능한가, 병목이 어디에 존재하는가
- Development speed: 시스템 확장이 얼마나 빠른가, 대부분의 엔지니어가 작업 가능한가
- 그 외에도 elegance, modern-ness, 오픈소스 활용, 유지 비용 등 다양한 가치 존재
- 모든 엔지니어가 각 가치에 같은 수준의 관심을 갖지는 않음
- 본인이 어떤 가치를 가장 높게 평가하는지에 따라 사용하는 언어, 프레임워크, 설계 패턴 등이 달라짐
나쁜 취향의 특징
- 나쁜 취향은 본인이 선호하는 가치가 현재 프로젝트에 적합하지 않을 때 발생함
- 특정 기술, 방법론의 장점을 자신의 프로젝트에 일관되게 밀어붙이는 유연성 부족이 문제임
- 항상 "best practice"만을 내세우는 주장에는 상황 맞춤형 판단 결여가 있음
- 유연성 없는 엔지니어는 특정 프로젝트에서는 잘 맞을 수 있으나, 환경 또는 업무 변화 시 심각한 문제를 야기할 수 있음
좋은 취향의 특성
- 좋은 취향은 문제 상황에 따라 올바른 엔지니어링 가치를 잘 선택하는 능력임
- 단순 기술 능력과 달리, 복잡한 실제 프로젝트 맥락에서만 검증 가능함
- 자신이 동의한 설계 결정이 채택된 프로젝트가 잘 진행되면 본인 취향의 적합성을 가늠할 수 있음
- 다양한 프로젝트 경험, 어느 순간에 새로운 가치에 대한 개방적 태도가 중요한 학습 요소임
- 유연성을 유지하고, 특정 기술이나 방법에 대한 고정관념을 피하는 것이 좋은 취향 형성에 도움을 줌
맺음말
- 좋은 취향은 실력만큼이나 중요하며, 성장 과정에서 다양성과 유연성, 그리고 자기 성찰을 통해 개발 가능함
- 몇몇 사람들은 경험 이상으로 뛰어난 취향을 보이기도 함 (프로그래밍 및 타 분야의 영재 등)
추가 논의
- Hacker News 댓글에서는 "취향"의 존재 자체에 회의적인 의견도 있었음
- 일부는 모든 문제에 단 하나의 올바른 해법이 있다고 주장했지만, 저자는 현실에서는 여러 해법이 가능하고, 결국 개인의 가치와 맥락이 선택을 좌우한다고 반박함
- 또 다른 의견으로는 고객과 비즈니스 맥락도 취향의 일부라는 지적이 있었음