- 소프트웨어 엔지니어링 문화에서 복잡한 시스템을 만드는 사람이 더 인정받고, 단순한 해결책을 선택한 사람은 평가받지 못하는 구조가 지속됨
- 승진 평가와 인터뷰, 설계 리뷰 등에서 복잡성이 “영향력”으로 오인되어, 불필요한 추상화와 확장성을 추가하는 경향이 강화됨
- 단순한 구현은 “보이지 않는 성과”로 남지만, 복잡한 구조는 화려한 서술과 문서화로 승진 서류를 채우기 쉬움
- 진정한 숙련도는 더 많은 도구를 쓰는 것이 아니라, 언제 복잡성을 배제해야 하는지 아는 판단력과 자신감에 있음
- 엔지니어와 리더 모두 단순함을 가시화하고, 이를 공식적으로 인정하는 평가·보상 체계를 만들어야 함
단순함 vs 복잡함: 승진 서사의 비대칭
- 같은 팀의 두 엔지니어 사례: Engineer A는 50줄의 간결한 코드로 며칠 만에 기능을 출시, Engineer B는 새로운 추상화 레이어, pub/sub 시스템, 설정 프레임워크를 도입해 3주에 걸쳐 완성
- Engineer B의 작업은 승진 패킷에 "확장 가능한 이벤트 기반 아키텍처 설계, 재사용 가능한 추상화 레이어 도입, 설정 프레임워크 구축"으로 기술 가능
- Engineer A의 작업은 "기능 X 구현"이라는 세 단어로만 표현됨
- 실제로는 더 나은 작업이었지만, 단순하게 보이도록 만들었기 때문에 비가시적 기여가 됨
- "피한 복잡성"으로는 아무도 승진하지 못함 — 복잡성이 똑똑해 보이는 이유는 평가 체계가 그것을 보상하도록 구성되어 있기 때문
면접과 디자인 리뷰에서 복잡성이 강화되는 구조
- 시스템 디자인 면접에서 단순한 솔루션(단일 데이터베이스, 직관적 API, 캐싱 레이어)을 제안하면 면접관이 "천만 명의 사용자가 오면?"이라고 압박
- 서비스, 큐, 샤딩을 추가할수록 면접관이 만족하는 경험을 하게 됨
- 후보자가 배우는 교훈: "단순한 답은 충분하지 않았다"
- 면접관이 압박하는 데 합리적 이유(압박 속 사고력, 분산 시스템 이해도 확인)가 있을 수 있지만, 후보자에게 전달되는 메시지는 "복잡성이 인상적"이라는 것
- 디자인 리뷰에서도 "미래 대비(future-proof) 를 해야 하지 않나?"라는 질문에 불필요한 레이어와 추상화를 추가하게 되는 패턴 반복
- 문제가 요구해서가 아니라, 회의실이 기대해서 추가하는 것
- 코드 중복 몇 줄을 피하려고 만든 추상화가 오히려 이해와 유지보수를 어렵게 만드는 사례 다수 경험
- 코드는 더 "전문적"으로 보였지만, 사용자는 기능을 더 빨리 받지 못했고, 다음 엔지니어는 변경 전 반나절을 추상화 이해에 소비
적정 복잡성 vs 불필요한 복잡성(Unearned Complexity)
- 복잡성 자체가 문제가 아님 — 수백만 건의 트랜잭션 처리에는 분산 시스템이, 10개 팀이 같은 제품을 만들면 서비스 경계가 필요
- 문제는 불필요한 복잡성: "데이터베이스 한계에 도달했으니 샤딩 필요"와 "3년 후에 한계에 도달할 수 있으니 지금 샤딩하자"의 차이
- 이를 이해하는 엔지니어의 코드와 아키텍처는 "당연히 그렇지"라는 느낌, 마법도 영리함도 없고 이해 못해서 바보 같은 느낌도 없음
- 시니어로 가는 실제 경로는 더 많은 도구와 패턴을 배우는 것이 아니라, 언제 사용하지 않을지를 아는 것 — 복잡성을 추가하는 건 누구나 가능하지만, 빼는 데는 경험과 자신감 필요
엔지니어를 위한 실천 방안
- 단순함을 가시화해야 함 — 작업이 스스로 말해주지 않음, 평가 체계가 그것을 들을 수 있도록 설계되어 있지 않기 때문
- "기능 X 구현" 대신 "이벤트 기반 아키텍처와 커스텀 추상화 레이어를 포함한 세 가지 접근법을 평가한 뒤, 단순 구현이 현재와 예상 요구사항을 모두 충족한다고 판단, 2일 만에 출시하고 6개월간 무장애 운영" 으로 기술
- 무언가를 만들지 않기로 한 결정도 결정이며, 중요한 결정 — 그에 맞게 문서화 필요
- 디자인 리뷰에서 "미래 대비해야 하지 않나?"라는 질문에 단순히 굴복하지 말고, "나중에 추가하려면 이만큼 걸리고, 지금 추가하면 이만큼의 비용 발생, 기다리는 게 낫다"고 제시
- 반박이 아니라 검토를 마쳤음을 보여주는 것
- 매니저에게 "작업 문서화 방식이 코드뿐 아니라 내가 내린 결정을 반영하도록 하고 싶다"고 직접 대화 — 매니저 입장에서도 옹호할 언어를 제공받는 것
- 이 모든 노력에도 가장 정교한 시스템을 만든 사람만 승진시키는 팀이라면, 그것도 유용한 정보 — 일부 조직은 단순함을 진심으로 가치 있게 여기고, 다른 조직은 말만 그렇게 하면서 반대를 보상
엔지니어링 리더를 위한 실천 방안
- 인센티브를 설정하는 것은 리더의 책임 — 대부분의 승진 기준은 복잡성을 보상하도록 설계되어 있으며, "임팩트"는 구축한 것의 규모와 범위로 측정되는 경향
- 구축한 것뿐 아니라 회피한 것도 평가에 반영해야 함
- 디자인 리뷰에서 "확장성은 고려했나?" 대신 "출시 가능한 가장 단순한 버전은 무엇이고, 더 복잡한 것이 필요하다는 구체적 신호는 무엇인가?" 로 질문 변경
- 이 한 가지 질문이 게임을 바꿈: 단순함을 기본값으로, 복잡성에 입증 책임 부여
- 승진 논의에서 인상적인 시스템 목록으로 구성된 패킷에 "그게 전부 필요했나? pub/sub 시스템이 실제로 필요했나, 아니면 서류상 좋아 보였을 뿐인가?"라고 반문 필요
- 팀원이 깔끔하고 단순한 것을 출시하면 서사 작성을 도와야 함 — "여러 접근법을 평가하고 문제를 해결하는 가장 단순한 것을 선택"이 설득력 있는 승진 사례가 되려면 리더가 실제로 그렇게 취급해야 함
- 팀 채널에서 공개적으로 축하하는 대상에 주의 — 크고 복잡한 프로젝트만 칭찬하면 사람들은 그것에 최적화
- 코드를 삭제한 엔지니어, "아직 필요 없다"고 말하고 맞았던 엔지니어를 인정해야 함