08. 스타일 가이드와 규칙

hyeon.z·2022년 12월 14일
0

구글 엔지니어는 이렇게 일한다

08. 스타일 가이드와 규칙

주요 내용

  • 규칙과 지침의 목표는 시간과 확장 관점에서의 탄력성을 높이는 것이어야 함
  • 상황이 변하면 규칙도 바뀌어야 함
  • 규칙의 변경을 위해 규칙이 만들어진 근거를 기록해야 함
  • 핵심은 일관성
  • 가능한 규칙들이 자동으로 적용되도록 해야 함

규칙(rule)은 코드 전반에서 따라야 하는 강제사항이며, 꼭 필요한 경우를 제외하고는 무시할 수 없습니다. 지침(guidance)은 권장사항과 모범 사례를 뜻합니다. 구글에서는 프로그래밍 스타일 가이드로 정리해 표준으로 삼고 있습니다. 또한 구글은 스타일 가이드를 프로그래밍 언어별로 관리하며, 이를 통해 코드의 지속 가능성을 높입니다.

1. 규칙 만들기

좋은 것과 나쁜 것의 해석은 조직마다 차이가 있으므로 조직이 추구하는 가치를 확실히 해야합니다. 그런 다음 규칙을 만들면 엔지니어들은 코드를 표현하는 '형식'보다 '내용'에 집중할 수 있게 됩니다. 규칙을 정의할 때 반드시 던져야 하는 질문은 "어떤 목표를 이루려 하지?"입니다.

[기본 원칙]

  • 규칙의 양을 최소화
    규칙이 많아지면 규칙 모음을 관리하기 어렵고 비용도 증가합니다. 그래서 너무 자명한 규칙은 의도적으로 배제합니다.

  • 코드를 읽는 사람에게 맞추기
    코드 작성자보다는 읽는 사람에게 최적화해야합니다. 코드는 작성되는 횟수보다 읽히는 횟수가 더 많습니다.

  • 일관성 있는 규칙
    코드베이스의 스타일과 기준이 일관되면 코드를 작성하는 엔지니어와 읽는 이들은 '어떻게' 표현하느냐가 아닌 '무엇을' 수행하느냐가 집중할 수 있습니다. 또한 일관성에 위계를 둬야합니다. 일관성을 위해서는 '무엇'을 선택했냐가 아니라 '선택을 했다'는 사실에 의의가 있습니다.

    [우선 순위]
    단일 파일 > 팀 > 프로젝트 > 전체 코드 베이스
  • 오류가 발생하기 쉽거나 예상치 못한 동작을 유발하는 구조 피하기
    예상과 다르게 동작할 여지가 있거나 정확한 동작을 예측하기 까다로운 구조는 사용하지 않도록 제한합니다. 예를 들어 구글은 python 스타일 가이드는 reflaction 등 몇 가지 고급 기능을 사용하지 못하게 제한합니다.

  • 꼭 필요하다면 실용성을 위해 예외를 허용하기
    일관성은 중요하지만 융통성이 필요합니다.

[스타일 가이드]

  • 위험을 피하기 위한 규칙

  • 모범 사례를 적용하기 위한 규칙

  • 일관성을 보장하기 위한 규칙

2. 규칙 수정하기

규칙은 고정불변이 아닙니다. 그러므로 각각의 결정을 뒷받침하는 근거를 명시해둬야 합니다. 장단점과 잠재적인 파장을 분석하고, 변경량이 규모에 무리가 없는지 검증하는 데 시간을 많이 써야합니다. 각 결정에 이른 근거를 문서로 남겨두면 규칙을 변경해야 할 때가 언제인지를 알 수 있습니다. '문제'는 잠재적인 가능성이 아니라 현존하는 코드에서 발견된 패턴으로 입증해야 합니다.

스타일 가이드 수정 대부분은 커뮤니티의 토론에서 발생하곤 합니다.

구글은 스타일 중재자(style arbiter)라는 언어별 소유자를 두고, 스타일 가이드에 대한 최종 결정과 승인을 책임집니다. 예외 상황도 스타일 중재자와 함께 논의하고 결정합니다.

3. 지침

지침이란 구글 엔지니어링 경험에서 선별한 지혜이자 과거에서 배운 교훈들로부터 추린 모범 사례들을 문서로 남긴 것입니다. 사람들이 자주 실수하는 것 혹은 아직 익숙하지 않은 새로운 주제라서 혼란스러워하는 것들에 집중합니다.

규칙(Rule)은 반드시(must) 지켜야 한다면, 지침(guidance)는 되도록(should) 따라야 하는 것

4. 규칙 적용하기

규칙을 적용할 때는 자동화 도구를 활용하는 것이 좋습니다. 도구를 활용할 경우 시간이 흐르거나 조직이 커져도 규칙이 누락되는 것을 방지할 수 있습니다. 또한 일관성있게 적용할 수 있습니다. 언어 사용법과 관련한 규칙들의 상당수는 정적 분석 도구로 강제할 수 있습니다. 물론 모든 규칙을 도구로 적용하는 것은 불가능할 수 있습니다. 때로는 사람이 판단해야만 하는 규칙도 있기 때문입니다.
구글은 코드의 형식을 일관되게 관리하기 위해 자동 스타일 검사기와 코드 포맷터를 적극 이용합니다. 그래서 presubmit 검사로 포맷터를 반드시 사용하게 합니다.

[구글의 코드 포맷터]
c+ : clang-format
python : YAPF
Go : gofmt
Dart : dartfmt
BUILD 파일 : buildifier
profile
software engineer

0개의 댓글