어제 주석에관해 여기에 질문을 올렸는데 반응이 상당히 스펙타클하더군요


이글에서 유동닉 asdf가 접니다. 프갤에 codesafer같은분이 절대고수로 여겨지고 조언을 준다는게 너무 어이가없어서 고정닉하나 팠습니다. 


저는 저분이랑 싸울 마음도없고 하나하나 따져서 다퉈봤자 득이될게 없으므로 그냥 무시하고 주석잘쓰는 가이드 하나 써봤습니다.


-----------------------------------------------


주석이란 무엇이고 어디에 필요한가?


주석이란건 코드를 자명하게 만들기가 불가능한경우 이해를 돕기위해 쓰는게 주석입니다. 이 애매모호한 이유에서인지 많은분들이 잘못된 생각을 가지고계신데, 코드자체가 한눈으로 봤을때 이해가 가능하면 당연히 주석은 필요없습니다. Clean Code라는 유명한 책속에는 저자 Robert C Martin이란분이 이런말을 했지요.

The proper use of comments is to compensate for our failure to express ourself in code. Note that I used the word failure. I meant it. Comments are always failures. We must have them because we cannot always figure out how to express ourselves without them, but their use is not a cause for celebration.... Every time you express yourself in code, you should pat yourself on the back. Every time you write a comment, you should grimace and feel the failure of your ability of expression.

번역해보면 "주석을 쓰는 이유의 정석은 우리가 코드를통해 우리가 원하는 목적을 완벽하게 표현하지 못하기때문이다. 그러니까 주석은 실패를 일컫는다" 이런뜻입니다.. 여기서 많은분들이 "어 그럼 코세가 한말이 맞는거 아님??" 이라고 하실텐데 끝까지 읽어봅시다. "하지만 우리는 매번 주석없이 코드만으로 우리의 목적을 표현하지 못하며 그럼으로인하여 주석이 꼭 필요하다."


그러니까 쉽게말해서 당신이 누구가 됬건 어떤 능력자가되었던 코드만으로 당신의 풀목적을 설명하기에는 부족하다는겁니다. 예를 들어서 코드로 이 변수를 이렇게 저렇게 쉬프트 해서 어디에 저장해라라고 쓸수는 있지만 그짓을 왜하고있는건지는 코드로 간결하게 쓰기 어렵단말입니다. 이럴때 주석이란 표현도움이를 사용해서 코드의 가독성을 높혀줍니다. 표현력으로 따지면 당연히 자연언어가 코드보다 훨씬 위겠죠? 


"나는 진짜 코딩 졸라잘해서 그딴거 필요없다" 하시는분들.. 인터넷에 둘러보시고 내로라 하는 프로그래머들이 쓴 코드중 주석이 없는 프로젝트가 존재하는지 한번 보세요.


크롬 브라우저 코드 - https://chromium.goog1esource.com/chromium/src.git/+/master

안드로이드 커널 코드 - https://android-review.goog1esource.com/#/admin/projects/

텐서플로우 코드 - https://github.com/tensorflow/tensorflow

리눅스 커널 코드 - https://github.com/torvalds/linux

아폴로11 우주선 코드 - https://github.com/chrislgarry/Apollo-11

비트코인 코어 코드 - https://github.com/bitcoin/bitcoin


잘 만들어지고 인정받는 프로젝트중 주석없는 프로젝트 없습니다.


구체적으로 어떤 상황에서 주석을 사용해야하나?

  • 코드를 봤을때 뭘하는지는 알겠으나 그걸 왜 하고있는지 바로 알기가 쉽지않을때
  • 여러가지 방법으로 구현가능한 코드에 경우에는 왜 구지 이 방식으로 구현했는지 바로 알기 어려울때
    • (이걸 안하면 후에 다른사람이 (또는 미래의 자기 자신이) 당신의 코드를 자기 방식대로 고치려 할수있음)
  • 상대방이 코드리뷰를 했을때 '아.. 이건 물어볼거같다' 하는게 있을때
  • 상대방이 코드리뷰를 했을때 실제로 물어본것이 있을때
    • (상대방이 갓뉴비가 아니라면 분명 당신의 코드에는 문제가 있는것. 조금더 간결하게 바꾸던가 안되면 주석 추가.)

구체적으로 어떻게 쓰면되나요?


일단 주석은 크게 TODO, 다큐멘테이션, 구현 설명 이렇게 3종류로 나뉩니다. TODO는 뭐 알아서 이해가 되실테니 패스하고.

다큐멘테이션은 보통 함수나 클래스 전에 이안에서 무슨일이 일어난다거나 리턴발류가 일컫는 의미등등을 써놓는겁니다. 급하게 찾은 예제를 하나 봅시다


https://github.com/tensorflow/tensorflow/blob/master/tensorflow/cc/framework/cc_op_gen.cc 라인 294 에보면 이렇게 되있습니다.


// Returns a <string, bool> pair. The string is the C++ type name to be used for

// attr_type when defining an object of that type. The bool is a flag to

// indicate whether to treat the type as const when accepting the C++ type as an

// argument to a function.

std::pair<const char*, bool> AttrTypeName(StringPiece attr_type){

  static const std::unordered_map<StringPiece, std::pair<const char*, bool>,

<style type="text/css"><span style="font-size: 9pt;"> p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #454545} span.Apple-tab-span {white-space:pre} </style><span style="font-size: 9pt;">

                                  StringPiece::Hasher>


주석에서 리턴값을 제시하고 그 리턴값을 어떻게 사용하는게 본 저자의 목적 (intent) 인지를 알수있습니다. 이 주석이 없었다면 당신은 아마 코드 전체를 흝어보고 리턴벨류가 어디서 우러러나오는지 역주행을 한다음에나 알수있을겁니다. 역주행 후에도 리턴벨류인 1번째 인덱스를 보고 이건 뭐지라고 생각해봐야 합니다. 차이가 느껴지시나요?


이와 다르게 구현설명은 보통 함수안에서 쓰입니다. 이번에는 https://github.com/kokke/tiny-AES128-C/blob/master/aes.c 라인 252으로 가봅시다.

AES는 암호화 알고리즘인데 딱히 이분이 쓰신 파일전체의 주석내용들이 완벽히 간결하거나 좋은 예제는 아닙니다만 코드는 대충 간결하고 보기 쉬우니 한번 봅시다.

ShiftRows()라는 함수를 보면 state라는 포인터를 가지고 마구 비비는걸 보실수 있습니다. 물론 코드를 읽으고 분석해보면 뭘하는지 의도를 눈치챌수있지만

주석이있으므로 저자의 목적 (intent)을 이해하고 다음 코드로 바로 넘어가거나 아니면 저자의 목적이라는 문맥을 이해하고 코드를 더 쉽게 분석할수 있습니다.


시간상 예제가 이거밖에없고 가이드 첨써보는거라 설명이 모자랄텐데 그래도 도움이 되셨으면 좋겠내요. 도움된다는분이 계시면 내일 수정하고 더 올리겠습니다.


tl;dr - 존나기내 안읽음 요약좀


주석은 필수입니다.