[Clean Code] 주석..
예전에 면접질문으로 아래와 같은 질문을 받은 적이 있다.
“코드를 이해하기 쉽게하기위해 어떻게 하시나요??”
나는 대답했다.
간략하게 짜고, 중복이 없어야 하며 주저리 주저리.. 그리고는 ”주석을 잘 달아 놓는다“ 라고 말을 했던 기억이 났다.
그러자 다시 재질문이 돌아왔다.
“주석이 꼭 필요한가요??”
나는 또 대답했다.
”하고자 하는 일을 잘 적어두면 좋은 주석이라 생각한다“
그리고는 면접이 다시 이어졌다.
창피한 이야기지만.. Clean Code를 제대로 읽어본 적이 없는 나였고. 최근 Clean Code를 읽다가 주석에 관한 부분을 읽으며.. 무릎을 탁 쳤던 기억이 나서 글을 적어 본다.
Clean Code에서는 주석을 다음과 같이 정의한다
주석은 사실상 기껏해야 필요악이다.
코드나 함수로 의도를 명확히 표현하지 못하기 때문에 주석의 힘을 빌어 면피하려고 한다. 주석은 나쁜 코드를 보완하지 못한다
난 지금까지 코드를 짜고 어떤 일을 하고 어떤 경우에 동작하는지 ”친절하게“ 남겨두는 것이 좋은 것이라 생각했었다.
그러나 책을 읽다가 그것이 결국 내가 코드의 표현으로 의도를 나타내지 못하기 때문이라는 사실에 반박을 할 수가 없었다.
책에서 다루는 주석의 나쁜 면을 내 생각과 함께 장리해보면 아래와 같다.
- 주석과 코드는 완벽한 동기화를 보장하지 않는다.
- 최초 코드 작성자는 만들어진 코드와 함께 친절한 주석을 달아둔다.
- 버그수정 혹은 기능 추가, 기능 제거 등과 같은 유지보수가 진행되지만, 주석도 함께 수정한 경우가 많이 있는가? 없다.
- 로직이 분리되고, 복사되며 이동하지만, 주석이 항시 따라다니지 않는다.
- 결국 코드와 주석은 분리되고, 수정사항 반영이 어긋나기 시작한다.
- 코드의 표현력이 좋지 않은 것을 감추기 위한 핑계에 불과하다.
- 개발자는 코드로 대화한다는 말도 있다. 잘 짜여진 코드(의미와 동작이 명확한)는 별도의 주석이 필요 없다.
- 읽어내려가기 힘들거나, 너무 많은 행동을 하거나, 의도를 나타내지 못하는 모호한 함수명 혹은 변수명을 사용한 후, 그것에 대한 설명을 코드가 아닌 텍스트로 하려고 하는 것이다.
그렇다면 좋은 주석은 없을까??
- api spec 혹은 date format등 협의된 스펙등의 정보를 제공하는 주석은 괜찮다.
- deplicated 되는 메서드 혹은 warning, todo 등 개발간에 경고하거나 전달해야 하는 주석도 괜찮다.
- 다만 todo같은 경우, 적용이 완료되면 잘 지워주어야 한다.
결국 이야기의 결론은 아래와 같다
코드로 의미를 표현하고, 명확한 의미를 나타내도록 코드표현에 그만큼의 시간동안 더 노력해야 한다.
이 책을 읽지 못하였더라면, 나는 계속 로직에만 집중한 코드를 짜고, 의미를 표현해내려는 노력을 많이 하지 않은 채, “친절한” 주석을 달며, “신경썼다” 라는 기분을 만끽하고 있지 않을까..
함수명, 변수명 등에 대한 내용들은 적어도 신경을 안쓰고 개발하지는 않았기에 마음에 확 와닿지 않았지만, 주석관련 내용은, 내가 가지고 있던 생각을 완벽히 바꿔준 부분이라 꼭 남겨보고 싶었다.