말하듯이 코딩하라

코드 리뷰하면서 자주 있었던 상황 중 하나가 실제로 작성한 코드와 코드 설명이 전혀 다른 경우입니다. 물론 전혀 엉뚱한 코드를 작성했다는 의미는 아닙니다. 최소한의 테스트 및 동작 확인은 하고 리뷰를 요청하기 때문에 코드 자체는 의도한 대로 동작합니다. 다만, 코드를 읽는 사람에게 코드의 의도를 제대로 전달하지 못하는 게 문제입니다. 이 문제는 코드를 설명하는 추상화 수준과 실제로 코드가 작성된 추상화 수준이 전혀 다르기 때문에 발생합니다.

이메일로 유저를 등록하는 간단한 서버 요청/응답 코드를 예를 들어 보겠습니다. 이 요청/응답 프로토콜의 명세를 간략히 적어보면 다음과 같습니다. (편의를 위해 에러 처리는 생략했습니다.)

  • 요청을 받음
  • 요청 검증
  • 이메일 정규화(canonicalize)
  • DB의 유저 정보 업데이트
  • 검증 이메일 발송
  • 응답을 보냄

위 명세를 코드로 옮기면 다음과 같은 코드가 나와야 합니다.

function registerUser()
{
    var request = receiveRequest();
    validateRequest(request);
    canonicalizeEmail(request);
    updateDbFromRequest(request);
    sendEmail(request.Email);
    return sendResponse("Success");
}

바꿔 말해, 명세와 코드의 추상화 수준이 같아야 합니다. 이렇게 작성하면 코드를 읽는 사람 입장에서 validateRequestcanonicalizeEmail 같은 함수가 내부적으로 어떤 일을 수행하는지 살펴보지 않고도 전체 코드의 의도를 이해할 수 있습니다. 만약, 이런 함수를 별도의 함수로 분리하지 않고 registerUser 함수 안에 넣어서 작성했다면 코드를 의도를 읽기가 훨씬 힘들어졌을 겁니다.

재미 있는 사실은 대부분의 개발자가 코드 리뷰 시에는 본인이 실제로 코드를 어떻게 작성했는지와 상관 없이 명세와 유사한 추상화 수준으로 설명을 합니다. 코드 리뷰어가 설명을 듣고 있기 때문에 이해할 수 있게 설명하려면 계속 일정한 수준으로 설명을 하는 수밖에 없기 때문입니다. 코드를 다른 개발자에게 말로 설명해 보는 것은 적절한 추상화 수준의 가독성 높은 코드를 짜는 좋은 방법입니다. 즉, 말하듯이 코딩해야 합니다.

Advertisements

3 thoughts on “말하듯이 코딩하라

  1. 나 역시 이 상황을 많이 접했지. 난 그걸 두고 ‘말과 코드 사이의 괴리’라고 표현해왔다. 발표, 세미나하는 내용을 들어보면 상당히 잘 하는 것 같은데, 실제 코드를 보면 그 내용이랑 큰 괴리가 있더군. 그래서 실망하거나, ‘나한테 리뷰를 받을 기회가 있었다면 좋았을텐데.’ 이런 생각도 하곤 했지. 이런 문제를 경험한 건 나와 똑같은데, 원인에 대한 분석은 다르네. ㅎㅎ 내가 분석한 내용을 한번도 글로 표현해 본 적이 없어서, 지금 바로 정리하기 쉽지 않구나.

    추가로 글 중에서 약간 불명확한 부분이 있는 것 같다.

    다만, 코드에 의도는 전혀 표현하지 못한 것이 문제입니다. -> 요 부분이 clarify 되어야 할 것 같다. 저 문장의 의도가 ‘말로 설명할 때의 의도’ 일 듯?

    좋아요

댓글이 닫혀있습니다.