소프트웨어 엔지니어링에서의 "좋은 취향"이란 무엇인가?

1 month ago 13

  • 기술적 취향은 기술적 실력과는 별개 개념임
  • 소프트웨어 엔지니어의 취향은 프로젝트에 맞는 엔지니어링 가치 선택 능력을 의미함
  • 엔지니어마다 가치관이 다르며, 유연성 부족이 나쁜 취향을 불러올 수 있음
  • 좋은 취향은 단순한 기술 실력보다 복잡한 맥락에 맞게 가치 우선순위를 조정하는 능력임
  • 다양한 경험과 개방적 사고가 소프트웨어 엔지니어링에서 좋은 취향을 기르는 데 도움을 줌

기술적 취향과 실력의 차이

  • 기술적 취향은 뛰어난 실력과 반드시 일치하지 않음
  • 누구나 요리 실력과 별개로 좋은 음식과 나쁜 음식을 구분할 수 있는 것처럼, 소프트웨어에서도 능력보다 앞서 취향이 형성
  • 어떤 코드가 "좋아 보이는지" 혹은 "별로인 것처럼 보이는지"에 따라 엔지니어의 취향이 반영됨
  • 어떤 설계 결정에 만족을 느끼고, 어떤 문제에 더 신경을 쓰는지는 취향의 일부로 작동
  • 기술적 능력은 반복과 공부로 기를 수 있으나, 좋은 취향은 더 불가사의하게 형성됨

엔지니어링 취향의 지표

  • "이 코드가 보기 좋다/나쁘다"라고 느끼는 것
  • 일부 설계 결정에 대한 강한 만족감 또는 무덤덤함
  • 퇴근 후에도 계속 신경 쓰이는 소프트웨어 문제와 그렇지 않은 문제

실력과 취향의 구분

  • "좋아 보이는 코드"가 실제로 더 좋은 코드여야만 할까 의문이 있음
  • 예시로 map, filter와 for loop 선호 차이는 엔지니어의 가치관 차이로 설명 가능
  • 언어나 컨텍스트에 따라 각각의 장단점이 존재하기 때문에, 어떤 선택이 반드시 더 좋은 것은 아님
  • 각 엔지니어가 중요하게 보는 가치가 다르며, 이에 따라 선호가 달라짐

엔지니어링 취향의 정체

  • 소프트웨어 엔지니어링의 거의 모든 결정은 트레이드오프
  • 미숙한 엔지니어는 자신의 취향에 지나치게 고집을 부림
  • 성숙한 엔지니어는 다양한 관점에서 이점을 파악하고, 현재 상황에 맞는 선택을 중시함
  • 중요한 것은 X(기술)와 Y(기술) 중 무엇이 더 좋은가가 아니라, 현재 프로젝트에 X의 장점이 Y보다 더 필요한가의 판단

엔지니어링 가치의 예시

  • Resiliency: 시스템이 장애나 네트워크 문제에도 잘 동작하는가

  • Speed: 이론적 한계에 가까운 성능을 보이는가, 불필요한 작업이 많은가

  • Readability: 새로운 엔지니어가 빠르게 이해하고 적응할 수 있는가, 함수가 짧고 명확한가

  • Correctness: 잘못된 상태가 모델링되는가, 테스트와 타입, assert 등이 충분한가, 심지어 형식적 검증이 적용되는가

  • Flexibility: 시스템 확장이 쉬운가, 변화가 간단하게 적용되는가

  • Portability: 특정 환경에 종속적인가, 배포 환경 변화가 간단한가

  • Scalability: 10배, 100배 트래픽 증가 시 시스템 확장 또는 자동 스케일링이 가능한가, 병목이 어디에 존재하는가

  • Development speed: 시스템 확장이 얼마나 빠른가, 대부분의 엔지니어가 작업 가능한가

  • 그 외에도 elegance, modern-ness, 오픈소스 활용, 유지 비용 등 다양한 가치 존재

  • 모든 엔지니어가 각 가치에 같은 수준의 관심을 갖지는 않음

  • 본인이 어떤 가치를 가장 높게 평가하는지에 따라 사용하는 언어, 프레임워크, 설계 패턴 등이 달라짐

나쁜 취향의 특징

  • 나쁜 취향은 본인이 선호하는 가치가 현재 프로젝트에 적합하지 않을 때 발생함
  • 특정 기술, 방법론의 장점을 자신의 프로젝트에 일관되게 밀어붙이는 유연성 부족이 문제임
  • 항상 "best practice"만을 내세우는 주장에는 상황 맞춤형 판단 결여가 있음
  • 유연성 없는 엔지니어는 특정 프로젝트에서는 잘 맞을 수 있으나, 환경 또는 업무 변화 시 심각한 문제를 야기할 수 있음

좋은 취향의 특성

  • 좋은 취향은 문제 상황에 따라 올바른 엔지니어링 가치를 잘 선택하는 능력임
  • 단순 기술 능력과 달리, 복잡한 실제 프로젝트 맥락에서만 검증 가능함
  • 자신이 동의한 설계 결정이 채택된 프로젝트가 잘 진행되면 본인 취향의 적합성을 가늠할 수 있음
  • 다양한 프로젝트 경험, 어느 순간에 새로운 가치에 대한 개방적 태도가 중요한 학습 요소임
  • 유연성을 유지하고, 특정 기술이나 방법에 대한 고정관념을 피하는 것이 좋은 취향 형성에 도움을 줌

맺음말

  • 좋은 취향은 실력만큼이나 중요하며, 성장 과정에서 다양성유연성, 그리고 자기 성찰을 통해 개발 가능함
  • 몇몇 사람들은 경험 이상으로 뛰어난 취향을 보이기도 함 (프로그래밍 및 타 분야의 영재 등)

Read Entire Article