4.0

4.0 4부 소개: 코드와 품질 메트릭

2부와 3부는 작업이 어떻게 움직이는지와 그것을 만드는 사람들이 어떻게 지내는지를 측정했다. 이 부는 산출물 자체로 방향을 돌린다: 코드, 그리고 메트릭이 그 품질에 대해 알려줄 수 있는 것과 알려줄 수 없는 것. 코드 품질 메트릭은 이 책의 어떤 메트릭 패밀리보다 가장 긴 역사를 가지고 있으며, 사이클로매틱 복잡도는 1976년까지 거슬러 올라가고, 그에 맞먹는 가장 긴 오용의 역사도 가지고 있다. 이 부는 그 역사를 진지하게 다룬다: 모든 주제는 진정으로 유용한 신호를 그것이 목표가 되는 순간 그 신호가 게임당하는 구체적이고 잘 문서화된 방식과 함께 이름 붙인다.

이 여섯 주제를 연결하는 공통된 맥락은 어떤 단일 코드 메트릭도 그 자체로 품질을 포착하지 못하며, 가장 인기 있는 것들 중 몇몇은 고립되어 추구될 때 적극적으로 오도한다는 것이다. 높은 테스트 커버리지 백분율은 아무런 의미 있는 것도 검증하지 않는 테스트와 공존할 수 있다. 낮은 복잡도 점수는 기술적으로는 단순하지만 개념적으로는 일관성 없는 코드와 공존할 수 있다. 이 부의 각 주제는 그 주요 메트릭을 그 구체적인 사각지대를 잡아내는 보완적인 확인과 짝짓는다: 유지보수성 맥락과 함께하는 복잡도, 뮤테이션 테스트와 함께하는 커버리지, 핫스팟 분석과 함께하는 처닝, 사람의 판단과 함께하는 정적 분석, 그리고 끝없이 자라나는 외면받는 백로그가 아니라 우선순위가 매겨진 개선과 함께하는 기술 부채.

대규모 팀에게 코드와 품질 메트릭은 어느 한 사람의 머릿속에 담기에는 너무 큰 코드베이스를 관리할 수 있게 만드는 것이다. 다섯 명 팀은 시스템의 어느 부분이 취약한지에 대한 공유된 암묵적 지식에 의존할 수 있다. 수십 개의 서비스에 걸친 오백 명 엔지니어 조직은 그 취약함을 체계적으로 찾기 위한 계측된 신호가 필요하다. 흔히 몇 년이 아니라 수십 년 단위로 측정되는 코드베이스를 가지고 있는 엔터프라이즈와 정부 조직은 제한된 유지보수 투자가 가장 많은 도움이 될 곳에 우선순위를 두기 위해 이 부의 메트릭에 의존한다.

이 부의 주제

  • 4.1 코드 복잡도 메트릭: 사이클로매틱 복잡도와 그 친척들, 그것들이 실제로 예측하는 것, 그리고 그것들의 잘 문서화된 게임 위험.
  • 4.2 테스트 커버리지와 테스트 효과성: 왜 커버리지 백분율 홀로는 보이는 것보다 적게 말해 주는지, 그리고 뮤테이션 테스트가 어떻게 그 간극을 메우는지.
  • 4.3 코드 처닝과 핫스팟 분석: 불균형한 몫의 결함과 유지보수 비용을 책임지는 코드베이스의 특정하고 작은 부분을 찾아내는 것.
  • 4.4 정적 분석과 코드 스멜 메트릭: 자동화된 코드 품질 신호, 그 실제 가치, 그리고 사람의 판단에 대한 그 한계.
  • 4.5 기술 부채 측정: 보이지 않고 비공식적으로 논의되는 부채를 눈에 보이고, 우선순위가 매겨지고, 관리 가능한 포트폴리오로 만드는 것.
  • 4.6 문서화와 지식 메트릭: 문서가 단지 존재하는지가 아니라 실제로 도움이 되는지 측정하는 것.

이 주제들이 서로 연결되는 방식

이 여섯 주제는 코드의 가장 작은 단위로부터 바깥으로 쌓인다. 주제 4.1은 단일한 함수나 메서드 수준에서 시작하고, 주제 4.2는 테스트가 실제로 그 단위의 행동을 검증하는지 묻는다. 주제 4.3은 전체 코드베이스에 걸쳐 어떤 파일과 모듈이 먼저 관심을 받을 자격이 있는지 찾기 위해 확대해서 본다. 주제 4.4는 그 모든 것을 지속적으로 훑는 자동화된 도구 계층을 더한다. 주제 4.5는 이 네 가지로부터 축적된 발견을 분산되고 다뤄지지 않은 걱정이 아니라 관리되고 우선순위가 매겨진 백로그로 바꾼다. 그리고 주제 4.6은 이 모든 것을 안전하게 유지하는 데 필요한 지식이 실제로 문서화되어 있고 찾을 수 있는지 측정하며 이 부를 마무리한다.

이 부는 2부의 안정성 메트릭에 직접 다시 연결된다: 변경 실패율(주제 2.10)은 상당 부분 이 부가 상류에서 측정하는 코드 품질의 하류 결과다. 그것은 또한 5부의 제품 메트릭으로 앞으로 연결되는데, 누락된 결함(주제 5.1)은 흔히 이 부가 프로덕션에 도달하기 전에 드러내도록 만들어진 정확히 그 복잡도 핫스팟과 커버리지 간극으로 추적할 수 있기 때문이다.