코드 리뷰하면서 자주 있었던 상황 중 하나가 실제로 작성한 코드와 코드 설명이 전혀 다른 경우입니다. 물론 전혀 엉뚱한 코드를 작성했다는 의미는 아닙니다. 최소한의 테스트 및 동작 확인은 하고 리뷰를 요청하기 때문에 코드 자체는 의도한 대로 동작합니다. 다만, 코드를 읽는 사람에게 코드의 의도를 제대로 전달하지 못하는 게 문제입니다. 이 문제는 코드를 설명하는 추상화 수준과 실제로 코드가 작성된 추상화 수준이 전혀 다르기 때문에 발생합니다.
이메일로 유저를 등록하는 간단한 서버 요청/응답 코드를 예를 들어 보겠습니다. 이 요청/응답 프로토콜의 명세를 간략히 적어보면 다음과 같습니다. (편의를 위해 에러 처리는 생략했습니다.)
요청을 받음
요청 검증
이메일 정규화(canonicalize)
DB의 유저 정보 업데이트
검증 이메일 발송
응답을 보냄
위 명세를 코드로 옮기면 다음과 같은 코드가 나와야 합니다.
바꿔 말해, 명세와 코드의 추상화 수준이 같아야 합니다. 이렇게 작성하면 코드를 읽는 사람 입장에서
validateRequest나 canonicalizeEmail 같은 함수가 내부적으로 어떤 일을 수행하는지 살펴보지 않고도 전체 코드의 의도를 이해할 수 있습니다. 이런 함수를 별도의 함수로 분리하지 않고 registerUser 함수 안에 넣어서 작성했다면 코드를 의도를 읽기가 훨씬 힘들어졌을 겁니다.
재미있는 사실은 대부분의 개발자가 코드 리뷰 시에는 본인이 실제로 코드를 어떻게 작성했는지와 상관 없이 명세와 유사한 추상화 수준으로 설명을 합니다. 코드 리뷰어가 설명을 듣고 있기 때문에 이해할 수 있게 설명하려면 계속 일정한 수준으로 설명을 하는 수밖에 없기 때문입니다. 코드를 다른 개발자에게 말로 설명해 보는 것은 적절한 추상화 수준의 가독성 높은 코드를 짜는 좋은 방법입니다. 즉, 말하듯이 코딩해야 합니다.