20P by neo 17시간전 | favorite | 댓글 4개

이고를 배제한 엔지니어링: 교훈과 통찰

서론

  • 기술 업계에서 이고와 지역주의(파벌주의)는 팀워크를 방해하는 주된 요소로 작용함
  • 엔지니어링 팀을 더 효율적이고 협력적으로 만드는 방법을 고민하며 얻은 통찰을 공유

책임 분배의 딜레마

  • 직원이 두 명만 있어도 업무 분배는 필수적임
    • 그러나 분배 방식은 즉각적이며 장기적인 영향을 미칠 수 있음
    • 많은 기업이 이러한 문제를 깊이 고민하지 않음

컴퓨터 과학의 현실

  • 많은 컴퓨터 과학자는 자신이 수학적 추상 작업과 관련된 학문에 발을 들였다는 사실을 나중에 깨달음
    • 이 초기 충격으로 인해 대부분의 경력을 컴퓨터 외의 분야에는 배운 내용을 적용하지 않으려는 태도를 보임
  • 업무 환경을 기술적 접근만큼 깊이 고민한다면 개선될 가능성이 있음

조직에서의 병폐와 경험

  • 성공적인 회사도 조직 병폐를 피하기 어렵고, 이를 통해 배울 수 있음
  • 초기 경력을 보낸 한 스타트업 사례:
    • 회사가 작은 초기 단계임에도 불구하고 이미 지나치게 관료화된 구조를 채택
    • 웹 요청 속도를 높이겠다는 잘못된 이론으로 "파이썬 미들레이어"를 추가
      • 결과적으로 더 많은 네트워크 홉이 발생해 성능이 저하됨
    • 하나의 기능을 출시하려면 여러 역할 간의 복잡한 협력이 필요
      • 데이터베이스 작업자는 DDL 작성 및 저장 프로시저 개발
      • 파이썬 개발자는 비효율적인 미들레이어 작업
      • PHP 개발자는 프론트엔드 코드 작성
    • 이러한 분업 구조로 인해 두 해 동안 신규 기능을 전혀 출시하지 못함
    • 결과
      • 비효율적 구조와 워크플로우의 결과로 전 직원이 해고됨
      • 난 아님. 불만 제기로 살아남음

대규모 회사에서의 역할 분화 문제

  • 배경: 1,000명 이상의 직원을 보유한 B2B 제품 회사에서 근무
    • 초기에 역할이 명확히 나뉜 기능별 팀(Feature Teams)과 공용 서비스 팀(운영, DBA 등) 구조를 운영
    • 초기에는 일반적인 구조처럼 보였음
  • 시간이 지나면서 역할이 과도하게 분화되며 비효율성이 증가
    • "Release Manager"라는 새로운 역할을 추가해 릴리스를 관리
    • 역할 추가의 이유가 명확하지 않고, 점점 복잡해지는 조직 구조
  • 문제 사례:
    • 프론트엔드 엔지니어는 프론트엔드 작업만, 백엔드 엔지니어는 백엔드 작업만 수행하도록 제한
    • 이러한 분리는 생존 가능했지만, 보안 팀이 모든 보안 작업을 전담하도록 한 정책은 심각한 문제를 초래
  • 결과: 역할을 작업과 동일시하면서 조직 효율성을 저해하게 됨
    • 팀 간 협력 부족과 업무 중복이 발생

분산된 제품 포트폴리오와 감독 구조의 부재

  • 주로 네이티브 클라이언트 애플리케이션을 개발하는 회사에서 근무
    • 초기에는 성공적인 주력 클라이언트 애플리케이션이 있었지만, 2020년대에는 분산되고 일관성 없는 프로젝트들이 병렬적으로 진행됨
  • 제품 포트폴리오 관리의 문제점
    • 전체 제품에 대한 감독 구조가 약함
    • 기술 스택이나 의사결정에서 제품 간 조율이 전혀 이루어지지 않음
    • 각 제품 팀은 독립적으로 CEO에게 보고하며, CEO는 조정 노력을 기울이지 않음
  • 공용 운영 기능 구축 시도
    • 운영 그룹이 아키텍처 결정 과정에 관여하지 않아 어려움이 발생
    • 운영 팀은 과거에 개발 팀이 사용했던 수백 개의 서비스 관리에 바빠 중요한 의사결정에 참여할 시간이 부족
    • 이는 조직적 비효율성의 전형적인 사례로 볼 수 있음

[조직 문제 패턴 일반화 하기]

패턴 1: 역할과 작업의 혼동

  • 새로운 업무를 위해 새로운 직무 설명을 만드는 경향이 있음
    • 예: AI 관련 업무를 기존 엔지니어가 처리할 수 있음에도 불구하고, AI 엔지니어라는 새로운 역할을 신설
    • 이는 조직 내 갈등을 유발하며, 기존 팀원의 동기를 약화시킬 수 있음
  • 이러한 과도한 역할 분리는 불필요한 관료주의를 초래

패턴 2: DevOps 혁명의 불완전한 분포

  • 많은 회사가 "DevOps를 구현했다"고 주장하지만, 실제로는 분업과 갈등이 여전히 존재
    • 운영팀과 개발팀, 혹은 SRE와 개발팀 간의 명확한 경계는 협력을 저해
    • DevOps의 본래 목적은 협력과 공감을 통한 경계 허물기지만, 현실에서는 드물게 실현됨

패턴 3: 엄격한 업무 분업의 한계

  • 업무를 세분화하고 전문화하는 것이 리더에게는 당연해 보일 수 있음
    • 예: AI 업무는 AI 전문가, 운영 업무는 운영 담당자에게 전담
  • 하지만 이러한 구조는 병목 현상을 야기
    • 추가된 엔지니어가 새로운 작업을 생성해 속도를 높이려 하지만, 결과적으로 분석 대기 시간이 비선형적으로 증가
    • 데이터 과학자나 분석 리소스가 한계에 도달하면 전체 프로세스가 느려짐

패턴 4: 잘못된 조직 구조는 추가 작업을 초래

  • 조직 경계가 명확하지 않거나 잘못 설정되면 불필요한 작업량이 증가
    • 예: 보안 팀이 모든 보안 문제를 담당하며, 보안 티켓 큐가 생김
    • 개발 팀은 보안을 고려하지 않으면서 작업을 진행, 결과적으로 보안 작업이 늘어남
  • 이는 단기적으로는 무시될 수 있지만, 장기적으로 심각한 문제로 발전

패턴 5: 인간의 고질적인 편견

  • 자신의 역할을 과대평가하고 타인의 역할을 과소평가하는 경향
    • 일부는 서버 작업이 "기술적이지 않다"고 잘못 판단
    • 반대로, 제품 작업이 덜 기술적이라고 여기는 경우도 흔함
  • 이러한 태도는 팀 간 신뢰를 약화시키고 협력을 저해
    • "뛰어난 독단적 인물"은 시스템적 관점에서 실질적인 가치를 제공하지 못함
    • 리더와 조직은 이러한 태도를 "똑똑하다"거나 "가치 있다"고 잘못 평가하는 경우가 많음

[파벌주의와 이고]

  • 파벌주의(Parochialism)와 이고(Ego)는 조직 내 주요 비효율성의 원인
    • 파벌주의: 타인의 영역을 침범하지 않으려는 태도나 호기심 부족
    • 이고: 업무에 대한 자부심으로 긍정적 영향을 줄 수도 있지만, 영역 지키기나 타인의 능력을 과소평가하는 부정적 영향으로 나타날 수 있음
  • 이러한 본능적인 행동들은 공감 부족을 야기하고 협력을 저해

더 나은 사례: 성공적인 엔지니어링 팀의 경험

  • 과거 한 스타트업에서 수평적으로 분리된 "영지(fiefdom)" 구조를 단순화하고 더 작은 팀으로 재편
  • DevOps를 진지하게 도입한 리더들이 장벽을 허물고 협력을 촉진
    • 약 2년간의 "창의적 파괴"를 통해 모든 팀원이 다양한 업무에 참여
    • 결과적으로 인프라 안정성과 소프트웨어 출시 역량 회복
  • 조직 재편 후 엔지니어링 팀이 시간과 자율성을 확보
    • 이를 바탕으로 팀의 추가 역량을 어떻게 활용할지 논의

제안 1: 대규모 리팩터링 (Proposition 1: Boil the Ocean)

  • 종종 팀들은 여유 자원을 사용해 싫어하는 부분을 전면적으로 리팩터링
  • 하지만 이는 이미 시도된 방법으로 인기가 없었음

제안 2: "자기 과시" 활동 (Proposition 2: Dress Like Big Dorks)

  • 팀의 유휴 시간을 사용해 팀 문화를 강조하는 상품 제작 등 시도
    • 그러나 이것은 주요 전략으로는 적합하지 않았음
  • 결정적 사건: 디자이너의 빌드 오류
    • 한밤중 디자이너가 빌드를 깨뜨렸고, 팀은 이를 복구해야 했음
    • 처음에는 디자이너와 코더 간의 역할을 더 명확히 나누자는 의견이 제기
      • 그러나 팀의 한 사람이 디자이너에게 배포 키를 직접 제공하는 과감한 결정을 내림
    • 결과:
      • 디자이너가 코드 작업에 참여하며 협업 수준이 향상
      • 팀은 모니터링, 테스트 스위트 등을 구축해 안전한 작업 환경 조성
      • 작업 효율성과 생산성이 크게 개선

제안 3: 다른 팀의 역량 강화 (Proposition 3: Empower Everybody Else)

  • 팀의 여유 자원을 활용해 다른 팀을 지원하고 역량을 강화하는 전략 채택
    • 기술적, 비기술적 팀 모두에 적용
    • 조직 전반의 협력을 촉진하고 효과적인 실행으로 연결

실천 의지

  • 디자이너 사례 이후 다양한 그룹과 협력하며 비슷한 성공을 경험
  • 팀의 자유 시간과 조직적 권한을 활용해 각 팀이 효과적으로 협력할 수 있도록 지원
  • 성공적인 실행은 전사적 협력과 공감이 기반이었음

[성공적인 실행의 느낌]

  • 전문가 vs. 소유자
    • 팀은 도메인 전문가를 두되, 특정 작업이나 도메인의 "소유자"를 두지 않음
    • 보안 사례: 보안팀이 모든 문제를 처리하는 대신, 팀 전체가 보안을 책임지고 보안팀은 팀원들의 역량을 향상시키는 역할
    • 다른 분야에서도 이 모델이 적용되었어야 했지만, 대부분의 팀은 실현하지 못함
  • 실패 사례
    • 프론트엔드와 백엔드 엔지니어를 철저히 분리
    • 협력 부족으로 인해 GraphQL 같은 불필요한 복잡성을 초래
    • 특정 역할의 전문가는 필요하지만, "프론트엔드"와 "백엔드"로 직함을 나누는 것은 비효율적
  • 핵심 원칙:
    • "도메인 전문가, 소유자는 아님"
    • 전문가가 자신의 업무 외에도 다른 팀원을 도울 시간을 확보하도록 유도

프로액티브한 협업 촉진

  • 여유 시간 제공
    • 전체적인 팀워크를 유지하기 위해 팀원들에게 여유 시간을 부여
    • 단순히 자연스러운 협력을 기다리지 않고, 의도적으로 시스템에 활력을 불어넣음
  • 심리적 안전과 인그룹 확장
    • 사람들은 자신이 속한 그룹에서 심리적 안전감을 느끼며 실험하거나 새로운 것을 배움
    • 팀원들의 "인그룹"을 확장하기 위해 시간과 자원을 투자
    • 부트캠프: 다른 팀에서 강제로 근무하게 하여 협업 기회 제공
    • 해커톤: 비슷한 효과를 내는 이벤트로 활용

의도적인 팀 가치

  • 팀의 철학과 원칙 정립
    • 코드 리뷰, 부트캠프, 해커톤 등 다양한 활동의 높은 목표를 명확히 정의
    • 엘리트주의는 독이라고 선언
    • 모든 구성원이 "필요한 일을 직접 처리"하는 문화를 조성
  • 상호 신뢰와 개선 기대
    • 다른 사람의 작업물을 다룰 때 항상 더 나은 상태로 남기겠다는 강한 기대 설정
    • 이러한 문화는 팀원들이 기꺼이 협력하도록 유도

마무리 생각

  • 기술 업계의 문제: 엘리트주의와 독단적 리더십
    • 겸손이 결여된 독단적 리더는 팀의 협력을 저해하고 불필요한 잔혹함을 조장
    • 기술 업계는 종종 이러한 독단적 리더를 유용한 존재로 착각하지만, 이는 기생적이고 해로운 현상
    • 타인을 존중하는 행동이 급진적이어야 할 이유가 없지만, 현실적으로 그렇지 않음
  • 협력이 더 나은 결과를 가져옴
    • 협력은 결과를 개선하고, 독단적 리더가 없는 삶은 더 나아짐
    • 파벌주의와 이고를 없애기 위한 노력이 필요
  • 권한 부여의 중요성
    • 팀원들이 호기심을 가지고 협력하도록 격려하려면 리더의 허가와 지지가 필요
    • 예: 배포 작업을 SRE가 아닌 개발자가 직접 처리하도록 변경
      • 초기에는 개발자의 실수에 대한 우려가 있었지만, 대부분의 개발자가 문제를 스스로 해결하며 성공적이었음
      • 제품 엔지니어들이 스스로 문제를 처리하고자 하는 태도를 보여줌
  • 시스템에 여유(slack) 제공
    • 부트캠프나 해커톤 같은 프로그램은 지속적인 헌신이 필요
    • 이러한 프로그램은 시스템의 여유가 없으면 사라지기 쉬움
    • 우리는 컴퓨터를 100%로 가동하지 않지만, 스스로에게는 그렇게 하려는 경향이 있음
  • 가치와 보상의 중요성
    • 리더는 협력과 호기심을 보상하고 이를 팀 문화로 정착시켜야 함
    • CEO들은 종종 긍정적인 프로그램(부트캠프, 해커톤)을 없애려 하지만, 부정적인 프로그램(의무적 코드 리뷰)을 없애려는 노력은 부족함
    • "고통"이 결과를 가져온다는 잘못된 믿음은 버려야 함
    • 고통은 결과의 대리 지표로 적합하지 않으며, 협력과 신뢰가 더 나은 성과를 가져옴

구구절절 맞는말이네요..
하지만 현실은..................ㅠㅠ

진짜 좋은글 같네요!

좋은글입니다.

Hacker News 의견
  • 소프트웨어 개발에서 프로그래머의 자아를 배제하는 것이 중요하다는 의견이 있음. 팀워크를 통해 소프트웨어 제품을 팀의 성과로 보는 것이 바람직함.

    • 그러나 인간의 자아는 자연스러운 것이며, 이를 완전히 배제하기 어려움.
    • 효과적인 시스템은 인간의 기본적인 특성을 인정하고 그 안에서 작동해야 함.
  • 개발 경력에서 얻은 교훈으로, 불필요한 프로세스를 추가하지 말고, 모든 역할에서 제품의 소유권을 요구하며, 반응적인 결정을 피하고, 팀 간의 협력을 장려해야 한다고 조언함.

  • 최고의 팀은 전체 스택을 소유하는 피자 팀과 필요할 때 조언을 제공하는 전문가들로 구성됨.

    • 모든 사람이 온콜 상태일 때 문제를 신속하게 해결할 수 있음.
    • 과거에는 작업이 너무 복잡하고 전문적이어서 이러한 접근이 흔하지 않았음.
  • 스포츠 메타포는 기술 분야에서 인기가 없지만, 스포츠 팀의 역학은 좋은 비즈니스 팀과 유사하다는 의견이 있음.

  • 조직의 성공은 각 구성원이 그룹의 필요를 충족시키기 위해 이타적으로 행동하는 데 달려 있음.

    • 이타심은 에너지와 생산성을 소모하는 기생적 요소임.
    • 연민은 이타심의 치료제이며, 도덕적 나침반의 방향을 맞추는 데 도움을 줌.
  • 의도적인 팀 가치 설정의 중요성을 강조함.

    • 모든 사람이 어떤 작업도 수행할 수 있어야 하며, 환경을 개선하는 것이 중요함.
  • 성장 부서에서 일하면서, 처음에는 매니저가 모든 커밋을 검토하고 병합했지만, 나중에 자신이 직접 프로덕션에 배포할 수 있는 권한이 있었음을 깨달음.

  • 도메인 전문가가 도메인 소유자보다 선호되며, 지나치게 명시적인 전문화는 문제를 일으킬 수 있음.

    • 그러나 모든 사람이 자율성을 가질 수 있는 것은 아니며, 이는 팀의 기술 수준과 동기 부여에 따라 달라짐.
    • 대규모 프로젝트에서는 더 많은 프로세스와 가드레일이 필요할 수 있음.