Skip to content

Latest commit

 

History

History
196 lines (125 loc) · 14.6 KB

7. Measuring Engineering Productivity.md

File metadata and controls

196 lines (125 loc) · 14.6 KB

7. 엔지니어링 생산성 측정하기

  • 엔지니어링 생산성 자체에 집중하는 전문가팀을 별도로 꾸려두면 회사 성장 과정에서 아주 중요하고 값진 통찰을 얻을 수 있다.

7.1 엔지니어링 생산성을 측정하는 이유

  • 조직이 두 배 커지면 소통 비용은 제곱으로 늘어난다.
  • 개선 사이클 자체를 만들고 관리하는 데도 인력이 투입된다. 구글은 소프트웨어 엔지니어링 생산성 개선과 더불어 개선 업무 자체의 효율까지 높이는 목표를 세웠다.
  • 엔지니어링 생산성을 이해하기 위한 전담 연구팀을 꾸려 트레이드오프에 대응했다.

7.2 선별: 측정할 가치가 있는가?

  • 측정 자체에도 비용이 많이 든다. 의미 없는 측정을 하느라 시간과 자원을 낭비하지는 말아야 한다.
  • 생산성 측정 시 질문에 대해 고려해볼 것

어떤 결과를 기대하고 왜 그런가?

  • 우리 모두는 어떤 일이 일어나야 하는지에 대한 선입견을 가지고 있다. 이 사실을 인정하고 시작하면 무의식 속에서 의도한 결과를 억지로 만들어내는 실수를 막을 수 있다.

데이터가 기대한 결과를 뒷받침한다면 어떤 조치를 취하겠는가?

  • 아무런 조치를 취하지 않을 거라면 측정을 해봐야 의미가 전혀 없다. 측정 결과에 상관없이 어차피 현상 유지할 계획인지를 주의해야 한다.

부정적인 결과가 나온다면 적절한 조치를 취할 것인가?

  • 이 질문을 던지는 이유는 부정적인 결과가 나와도 결정이 바뀌지 않는 경우가 흔하기 때문이다.
  • 결정권자들은 연구 결과를 알고는 싶어 하지만 다른 이유들을 들어서라도 이미 정해진 진로를 잘 틀지 않는다.

결과에 따른 조치는 누가 결정하고 언제 수행하는가?

  • 측정 의뢰자가 조치를 취할 권한이 있는지(혹은 권한자를 대신해 직접 수행할 사람인지)를 확인한다.
  • 소프트웨어 프로세스를 측정하는 궁극적인 목적은 사업적인 결정을 내리는 데 도움을 주기 위함이다. 그래서 결정을 내릴 사람이 누구이고 또 그에게 확신을 주려면 어떤 형태의 데이터가 필요한지를 이해해야 한다.
  • 결정권자를 만나서 설문 결과나 로그 데이터를 신뢰하는지, 복잡한 통계 분석에 익숙한지, 인터뷰에서 공감되는 이야기가 나오면 결정에 큰 영향을 주는지 등을 확인해야 한다. 결정권자가 결과의 형태를 신뢰하지 않는다면 이 역시 프로세스를 측정할 필요가 없다.

  • 어떤 도구나 프로세스가 생산성에 미치는 영향을 측정하지 말아야 할 합당한 이유는 많다.

당장 프로세스/도구를 변경할 여유가 없다

  • 더 빠른 빌드도구로 바꾸면 매주 몇 시간씩 절약할 수 있지만, 당장 달성해야할 급한 마일스톤이 있는 경우 등

어떤 결과가 나오든 곧 다른 요인에 의해 의미가 없어질 것이다

  • 조직 개편을 앞두고 소프트웨어 프로세스를 측정하는 상황, 폐기한 제품의 기술 부채를 평가하는 일 등
  • 이해관계자가 해당 문제와 맞지 않는 특정 방식만을 신뢰한다면 고생해서 데이터를 모을 이유가 없다.

측정 결과를 이미 확정된 계획을 뒷받침하는 용도로만 쓴다

  • 개선 정도가 작더라도 일을 계획대로 진행하고자 하는 경우

측정할 수 있는 지표들이 문제를 평가하기에 충분히 정확하지 않으며, 다른 요인들 때문에 혼탁해질 우려가 크다

  • 필요한 지표를 측정할 수 없는 경우, 정확도는 떨어지더라도 코드 라인 수 같은 다른 지표들을 측정해볼 수 있다. 하지만 지표의 정확성이 떨어진다는 이유로 원래대로 일을 진행시킬 것이므로 의미가 없어질 수 있다.

7.3 GSM 프레임워크: 목표와 신호를 뒷받침하는 의미 있는 지표 선정하기

  • 구글이 지표를 만들 때 사용하는 프레임워크, GSM: 목표(Goal), 신호(Signal), 지표(Metric)

목표(Goal)

측정자가 원하는 최종 결과. 측정을 통해 이해하고 싶은 내용을 고차원의 어휘로 표현하되 특정한 측정 방식을 명시해서는 안 된다.

신호(Signal)

원하는 최종 결과를 이루었는지 판단하는 방법. 우리가 측정하고 싶어 하는 것이지만 신호 자체는 측정하지 못할 수도 있다.

지표(Metric)

실제로 측정하는 대상. 신호를 대변한다. 이상적인 측정법은 아닐 수 있으나 충분히 가깝다고 믿는 것이어야 한다.


  1. 목표를 세우고, 신호를 정한 다음, 마지막으로 지표를 만드는 순서 덕분에 가로등 효과를 없애준다.

가로등 효과(streetlight effect): 가로등 아래에서 열쇠 찾기. 보이는 곳만 봐서는 정작. 열쇠가 떨어진 곳은 살펴보지 못할 수 있다는 의미. 예를들어 진짜 필요한 지표인지와 관계. 없이 쉽게 구할 수 있고 측정하기 쉬운 지표를 사용하는 것.

  • GSM은 손쉽게 이용할 수 있는 지표가 아니라 목표를 이루는 데 실제로 도움이 되는 지표가 무엇인지를 생각해보게 이끌어준다.
  1. GSM은 실제로 결과를 측정하기 앞서 원칙에 입각하여 적절한 지표들을 산정하게 해줌으로써 지표 크리프(metrics creep)와 지표 편향(metrics bias)을 예방해준다.
  • GSM은 '목표를 측정할 수 있는 능력'을 기준으로 지표를 선정하게 해준다. 이해관계자는 GSM에 따라 선택된 지표들이 원래 목표와 관련이 깊으며 결과를 측정하기 위한 최선의 지표들이라는 데 쉽게 동의할 것이다.
  1. GSM은 측정이 되는 영역과 그렇지 않은 영역을 알려준다.
  • 먼저 모든 목표를 나열한 다음 각 목표를 포착할 수 있는 신호들을 찾아낸다.

  • 모든 신호가 다 측정할 수 있는 것은 아니다. 그리고 측정할 수 없더라도 괜찮다. 최소한 측저할 수 없는 것이 무엇인지는 알 수 있기 때문이다. 누락된 지표가 무엇인지 알고 있으니 새로운 지표를 만들어야 할지 아니면 측정 자체를 그만두는 게 나을지를 판단해볼 수 있다.

  • 중요한 것은 추적 가능성(traceability)를 잃지 않는 것이다. 각각의 지표로부터 관련된 신호를 찾아낼 수 있고, 나아가 그 신호가 대변하는 목표에까지 거슬러 추적할 수 있어야 한다. 그래야만 어떤 지표가 무엇을 측정하고 왜 측정하는지를 알 수 있다.

7.4 목표(Goal)

  • 목표는 원하는 속성을 설정하되 어떠한 지표도 명시해서는 안 된다. 따라서 목표 자체는 측정이 불가능하다.
  • 목표 목록을 잘 정의하면 신호와 지표 선정 단계로 들어서기 앞서 모든 이해관계자의 동의를 얻을 수 있다.
  • GSM의 효과를 보려면 가장 먼저 측정할 목표 목록을 올바로 작성해야 한다.
  • 생산성에 영향을 주는 트레이드오프들을 다 감안하지 못해서 측정 결과가 잘못된 길로 인도되는 경우도 많았다.
  • 이를 방지하기 위해 트레이드오프가 일어나는 다섯 개 목표(QUANTS)를 고안했다.

코드 품질(Quality of the code)

  • 작성된 코드의 품질은 어떤가?
  • 회귀 버그를 예방하기에 충분한 테스트 케이스가 갖춰졌는가?
  • 아키텍처는 위험과 변경을 받아들일 수 있을 만큼 유연한가?

엔지니어들의 몰입도(Attention from engineers)

  • 엔지니어들은 얼마나 자주 몰입 상태에서 깨어나는가?
  • 알림은 엔지니어의 주의력이 얼마나 흐트리는가?
  • 도구는 엔지니어들이 작업 맥락을 전환하는데 도움을 주는가?

지적 복잡성(Intellectual complexity)

  • 작업을 완료하는데 인지 부하가 얼마나 걸리는가?
  • 해결해야 할 문제에 내재된 복잡성은 어느 정도인가?
  • 엔지니어들이 불필요한 복잡성을 처리해야 하는가?

박자와 속도(Tempo and velocity)

  • 엔지니어들이 작업을 얼마나 빨리 완수할 수 있는가?
  • 릴리스를 얼마나 빨리 밀어낼 수 있는가?
  • 주어진 시간에 얼마나 많은 작업을 완료하는가?

만족도(Satisfaction)

  • 엔지니어가 도구에 얼마나 만족하는가?
  • 도구가 엔지니어에게 필요한 기능을 얼마나 잘 지원하는가?
  • 엔지니어들이 주어진 업무와 완성한 제품에 얼마나 만족하는가?
  • 엔지니어들이 번아웃되지는 않는가?

가독성 팀이 작성한 목표

코드 품질

  • 가독성 프로세스를 거친 엔지니어는 품질이 더 좋은 코드를 작성한다.
  • 가독성 프로세스를 통해 일관성이 높아진다.
  • 가독성 프로세스는 건실한 코드 문화에 기여한다.

엔지니어들의 몰입도

  • 가독성은 몰입과 관련이 없다.

지적 복잡성

  • 가독성 프로세스를 거친 엔지니어는 구글의 코드베이스와 최선의 코딩 모범 사례를 배우고, 프로세스 중에는 멘토링을 받는다.

박자와 속도

  • 가독성 프로세스를 거친 엔지니어는 일을 더 빠르고 효율적으로 완료한다.

만족도

  • 엔지니어는 가독성 프로세스의 이점을 확인하고 프로세스 참여를 긍정적으로 생각한다.

7.5 신호(Signal)

  • 신호는 목표 달성 여부를 알 수 있는 방법이다.
  • 모든 신호를 측정할 수 있는 것은 아니지만 신호와 목표가 1:1 상태가 아닌 지금 단계에서는 괜찮다. 모든 목표에는 신호가 최소한 하나는 필요하다 (둘 이상이 좋긴하다).
  • 어떤 목표들은 신호를 공유하기도 한다.
목표 신호
가독성 프로세스를 거친 엔지니어는 품질이 더 좋은 코드를 작성한다. 가독성 승인을 얻은 엔지니어가 작성한 코드가 그렇지 않은 엔지니어가 작성한 코드보다 품질이 좋다. 가독성 프로세스가 코드 품질에 긍정적인 영향을 준다.
가독성 프로세스를 거친 엔지니어는 구글의 코드베이스와 최선의 코딩 모범 사례를 익히게 된다. 엔지니어가 가독성 프로세스로부터 배운 것이 있다고 보고한다.
가독성 프로세스를 거친 엔지니어는 작업을 더 빠르고 효율적으로 완수한다. 가독성 승인을 얻은 엔지니어는 그렇지 않은 엔지니어보다 더 생산적이라고 스스로 여긴다. 가독성 승인을 얻은 엔지니어가 작성한 변경은 그렇지 않은 엔지니어가 작성한 변경보다 리뷰가 더 빨리 끝난다.
엔지니어들이 가독성 프로세스의 이점을 확인하고 프로세스 참여를 긍정적으로 생각한다. 엔지니어들이 가독성 프로세스가 가치있다고 생각한다.

7.6 지표(Metric)

  • 지표는 신호를 측정하는 방법의 최종 형태이다.
  • 신호 자체가 아니라 측정 가능한 프록시이다. 대리하는 개념이다 보니 신호를 완벽하게 측정해내지는 못할 수 있다.
    • 예) 가독성 프로세스를 거친 엔지니어들의 코드 리뷰가 빨라졌는지를 측정하기 위해 설문과 로그 데이터를 조합해 사용한다.
  • 애초에 측정 불가능한 신호라면 연관 지표가 하나도 없을 것이다.
    • 예) 코드 품질 측정. 구글도 엔지니어들에게 코드 품질을 스스로 평가하라고만 요청하고 정량적인 측정은 포기함.

7.7 데이터로 지표 검증하기

  • 경험표집법(Experience Sampling Method, ESM): 일상 생활 중 특정한 사건을 경험한 직후에 즉각적인 응답을 요구하는 연구 방법.
  • 정량적 지표는 힘과 확장성을 주기 때문에 유용하나, 맥락 정보나 설명이 빠져있다.
  • 세 가지 지표를 조합하여 가독성 프로세스가 생산성에 미치는 영향을 평가했다.
    1. 가독성 프로세스에 특화된 설문조사를 수행했다. 이 설문은 프로세스를 갓 끝마친 엔지니어를 대상으로 수행하여 프로세스에 관한 즉각적인 피드백을 얻을 수 있었다. 즉각적이라는 점에서 회상 편향을 피하는 데 효과적이지만 최신 편향과 표본 편향이 나타날 수 있다.
    2. 가독성과 직접 관련은 없는 대신 가독성 프로세스가 영향을 줄 것이라 기대되는 지표들을 추적하기 위해 분기별로 대규모 설문조사를 수행했다.
    3. 개발자 도구를 활용하여 엔지니어들이 특정 작업을 완료하는데 걸리는 시간을 알려주는 정밀한 로그 지표를 이용했다.

7.8 조치를 취하고 결과 추적하기

  • 주어진 주제로 연구를 마친 뒤에는 언제나 개선을 멈추지 않고 지속하는 방법을 담은 '추천 할 일 목록'을 제공했다.
  • 올바른 데이터와 도구를 제공한다면 엔지니어들 스스로 합리적인 트레이드오프를 찾아낸다.

7.9 마치며

  • 생산성 전문가로 구성된 팀을 두는 것이 소프트웨어 엔지니어링의 다양한 측면에서 아주 유익하다는 사실을 깨달았다.
  • 생산성 연구팀은 항상 데이터 중심으로 판단하면서 주관적인 편향을 제거하는 걸 목표로 삼아야 한다.

7.10 핵심 정리

  • 생산성 측정에 앞서 결과가 긍정적이든 부정적이든 실행 가능한 조치로 이어지는지 확인해야 한다. 결과를 보고도 취할 수 있는 조치가 아무것도 없다면 측정할 가치가 없다.
  • GSM 프레임워크를 활용하여 의미 있는 지표를 선택해야 한다. 좋은 지표라면 측정하려는 신호를 잘 대표하며, 연관된 목표까지 추적해 올라갈 수 있다.
  • 지표는 생산성의 모든 측면(QUANTS)를 다루도록 선택해야 한다. 그래야 기껏 개선한 생산성 요인(예: 개발자 속도)이 결국은 다른 요인(예: 코드 품질)을 희생한 대가로 얻어지는 우를 방지할 수 있다.
  • 정성적 지표도 지표다. 엔지니어의 믿음(생각)을 장기간에 걸쳐 추적하는 설문 메커니즘을 고려해보자. 정성적 지표가 나타내는 결과가 정량적 지표와 일치해야 한다. 그렇지 않다면 잘못된 정량적 지표일 가능성이 크다.
  • 개발자 워크플로와 보상 제도에 영향을 주는 제안을 찾아내는 걸 목표로 삼아야 한다. 추가 훈련이나 문서화를 추천해야 하는 경우도 있지만, 개발자의 습관을 고쳐줘야 실질적인 변화로 이어져 정착될 가능성이 크다.