주석문을 잘 작성하기는 매우 힘들기 때문에, 주석문이 프로그램을 읽는 사람들
  에게 도움을 주기보다는 오히려 피해를 주기 쉽다.
  따라서, 주석문의 효용에 대한 뜨거운 논쟁은, 정신적 효용에 대한 철학적 논쟁
  만큼이나 애매하다. 만일 소크라테스가 컴퓨터 프로그래머였다면, 그와 그의
  제자들은 다음과 같은 토론을 벌였을 것이다.
  
              주석문(The Commento)
          
  등장 인물:
  
  트라시마쿠스(THRASYMACHUS): 남의 말을 잘 믿으며 이론적인 것을
        좋아하는 순수 주의자. 읽은 것은 모두 믿음.
        
  칼리클레스(CALLICLES): 구식 학교에서 프로그래밍을 배웠고, 논쟁으로
        단련된 배테랑. '현실적' 프로그래머.
        
  글라우콘(GLAUCON): 젊고 자신만만하며 거만한 '컴퓨터 투사'.
  
  이스메네(ISMENE): 실속 없는 호언장담에 지친 중견 프로그래머.
  
  소크라테스(SOCRATES): 현명한 노(老) 프로그래머.
  배경 : 주례 모임
  
  "저는 우리의 프로젝트를 위한 주석문의 규칙을 제안하고자 합니다."
  트라시마쿠스가 말했다.
  "우리들 가운데 몇 명은 자기가 작성한 코드에 주석문을 거의 넣지 않는데,
  주석문이 없는 코드는 거의 읽을 수 없다는 사실을 우리는 모두 알고 있지
  않습니까?"
  
  "자네, 대학을 졸업한 지 얼마 안되었지?" 칼리클레스가 대답했다.
  "주석문은 이론적으로는 만병 통치약이지만, 실제로 프로그래밍을 해 본 사람
  이라면, 주석문이 코드를 더 읽기 힘들게 만든다는 것을 누구나 다 안다네.
  영어는 C 언어나 파스칼보다 정밀하지 않기 때문에, 쓸 데 없는 말만 늘어놓게
  되지. 하지만, 프로그래밍 언어는 간결하면서도 요점을 놓치지 않는다네. 만일
  자네가 코드도 명료하게 작성할 수 없다면, 어떻게 주석문을 알기 쉽게 작성할
  수 있겠나? 게다가, 나중에 코드를 변경하면, 주석문은 뒤떨어진 정보를 담고
  있는 셈이 되네. 이래도 자네가 '구식'인 주석문에 집착한다면, 자네는 장래가
  없는 거야."
  
  "저도 그 말에 동의합니다." 글라우콘이 끼어들었다.
  "주석문이 지나치게 많은 코드는 읽을 것이 많기 때문에 읽기가 힘듭니다. 저는
  그런 코드를 읽었던 경험이 있는데요, 내가 왜 그토록 많은 주석문을 읽어야
  하는지 이해할 수 없었습니다."
  
  "잠깐만." 이스메네가 커피 잔을 놓으며 말했다.
  "주석문이 남용될 수 있다는 것에는 나도 동의하지만, 좋은 주석문은 금보다
  값지지. 나는 주석문이 있는 코드와 없는 코드를 모두 다루어 본 경험이 있는데,
  내가 다루기 쉬웠던 쪽은 주석문이 있는 것이었지. 나는 주석문을 반드시 사용
  해야 한다고 규칙으로 정할 필요는 없다고 생각하지만, 주석문을 사용하도록
  장려할 필요는 있다고 생각하네."
  
  "만일 주석문이 시간 낭비에 불과하다면, 왜 그것을 사용하는 사람이 있을까,
  칼리클레스?" 소크라테스가 물었다.
  
  "다른 사람들이 요구했거나, 주석문이 유용하다는 글을어딘가에서 보아서겠지
  요. 하지만, 주석문에 대하여 심사숙고한 사람이라면, 어느 누구라도 주석문이
  쓸모 있다는 결론은 내리지 않을 겁니다."
  
  "이스메네는 주석문이 유용하다고 생각하네. 이스메네는 우리와 3 년 동안 같이
  있었는데, 그 동안 자네가 작성한 주석문이 없는 코드와 다른 사람이 작성한
  주석문이 있는 코드를 모두 관리했지. 그런데, 그녀는 주석문이 있는 코드가
  좋다고 했네. 자네는 이같은 사실을 어떻게 생각하나?"
  
  "주석문은 쓸모 없는 것입니다. 왜냐 하면, 주석문은 코드의 내용을 장황하게
  되풀이하는..."
  
  "잠깐만요." 트라시마쿠스가 말을 가로챘다.
  "좋은 주석문은 코드를 반복하거나 설명하지 않습니다. 코드의 의도를 명확하
  게 할 뿐이지요. 주석문은 코드의 의도를 코드보다 높은 수준으로 추상화하여
  설명해야 합니다. 이것이 선배님이 원하는 것이지요."
  
  "그렇지." 이스메네가 말했다.
  "나는 내가 바꾸거나 고쳐야 할 부분을 찾기 위하여 주석문을 살펴보지. 코드를
  단순히 반복하는 주석문은 전혀 도움이 되지 못한다는 의견은 옳아. 왜냐 하면,
  코드에 이미 모든게 나타나 있으니까. 나는 주석문을 읽을 때, 주석문이 책의
  머리말이나 목차와 비슷하기를 바란다네. 나는 주석문을 통하여 코드에서 내가
  원하는 부분을 찾고, 그곳을 읽기 시작하거든. 영어 문장 한 줄을 읽는 편이,
  프로그래밍 언어로 작성된 코드 20 줄을 읽고 분석하는 것보다 훨씬 빠르지."
  이스메네는 커피를 한잔 더 들이켰다.
  
  "나는 주석문을 싫어하는 사람들을 대충 다음과 같은 부류로 분류하지.
  (1) 자기 코드가 가능한 한 명료하게 작성되었다고 생각하는 사람.
  (2) 실제는 그렇지 않은데도 불구하고, 다른 프로그래머들이 자기 프로그램에
  커다란 관심을 가질 것이라고 착각하는 사람.
  (3) 다른 프로그래머들의 지능을 과대 평가하는 사람.
  (4) 게으른 사람.
  (5) 자기 코드의 기능을 다른 사람이 이해할까 봐 두려워하는 사람. "
  
  "코드 평가회가 커다란 도움이 될 수 있습니다, 선생님."
  이스메네가 이야기를 계속했다.
  "만일 누군가가 주석문을 쓸 필요가 없다고 주장하다가 평가회에서 '이봐,
  자네 코드는 도대체 무슨 일을 하는거야?' 와 같은 질문들의 공세에 맞닥뜨린
  다면, 그는 그제야 코드에 주석문을 사용하기 시작할 것입니다. 만일 그래도
  그가 자발적으로 주석문을 사용하려 하지 않는다면, 그들의 매니저가 강제로
  시킬 것 입니다."
  
  "칼리클레스. 나는 자네가 게으르거나 자네의 코드를 다른 사람이 알아보는 것
  을 두려워한다고 자네를 비난하지는 않네. 나는 자네가 작성한 코드에 감탄한
  다네. 자네는 우리들 중 가장 훌륭한 프로그래머의 하나일세. 하지만, 자네가
  주석문을 사용한다면, 자네 코드는 지금보다 훨씬 이해하기 쉬울 것이네."
  
  "하지만, 주석문은 자원의 낭비입니다." 칼리클레스가 반박했다.
  "훌륭한 프로그래머라면, 스스로 설명하는 코드를 작성할 줄 알아야 합니다.
  알아야 할 모든 것이 코드 안에 들어 있어야 한다는 것입니다."
  
  "절대 아닙니다!" 트라시마쿠스가 의자에서 벌떡 일어나며 말했다.
  "컴파일러가 알아야 할 모든 것만 코드 안에 들어 있으면 되는 겁니다!
  칼리클레스 당신의 말은, 마치 당신이 알아야 할 모든 것이 2 진 실행 파일에
  들어 있다고 주장하는 것처럼 들리는 군요! 당신이 그 파일을 읽을 수 있다면
  말입니다! 어떤 일이 일어날까를 설명하는 내용은 코드 안에 들어있지 않습니
  다."
  
  트라시마쿠스는 자신이 서 있다는 것을 깨닫고는, 조용히 자리에 앉았다.
  "선생님. 이 논쟁은 말도안됩니다. 왜 우리가 주석문의 가치에 대하여 논쟁을
  벌여야 하는 것입니까? 제가 지금까지 읽었던 모든 책들에는, 주석은 유용한
  것이므로 아끼지 말고 사용해야 한다고 적혀 있었습니다. 우리는 이 논쟁에
  괜히 시간만 낭비하고 있는 겁니다."
  
  "자, 진정해라, 트라시마쿠스, 칼리클레스에게 얼마나 오랫동안 프로그래밍을
  했었는가 물어 보아라."
  
  "칼리클레스, 얼마나 오래 하셨습니까?"
  
  "글쎄... 약 15 년 전인 아크로폴리스 4 세 때부터이군. 아마 그 동안 대형
  시스템 십여 개를 처음 설치할 때부터 마지막으로 해체할 때까지 지켜보았을
  거야. 그리고, 내가 다루었던 핵심 부분은 십여 개를 훨씬 넘을 거야. 그것들
  중 시스템 두 개에는 50 만 줄이 넘는 초대형 프로그램을 사용할 정도였기 때
  문에, 나는 내 의견에 자신이 있네. 주석문은 쓸모 없는 거야."
  
  소크라테스는 젊은 프로그래머를 바라보았다.
  "칼리클레스가 이야기했듯이, 주석문에는 문제점이 상당히 많다네. 하지만,
  자네는 그것을 깨달을 만큼 아직 경험이 쌓여 있지 않을 뿐이지. 잘못 작성된
  주석문은, 아예 없는 것보다도 못하다네."
  
  "제대로 작성되었더라도, 주석문은 쓸모 없습니다."
  칼리클레스가 말했다.
  "주석문은 프로그래밍 언어보다 정밀하지 못합니다. 나라면 절대로 사용하지
  않을 겁니다."
  
  "칼리클레스. 하지만 이스메네가 지적했듯이, 정밀하지 못하다는 것이 주석문의
  장점이라네. 즉, 더 짧은 말로도 전체를 표현할 수 있다는 뜻이지. 주석문을
  사용하는 이유는, 우리가 고수준 언어(high-level language)를 사용하는 이유
  와 같다네. 즉, 주석문을 사용하면 높은 수준의 추상화를 얻을 수 있는데, 이것
  이야말로 프로그래머의 최대의 무기가 아닌가!"
  
  "저는 그 의견에 동의할 수 없습니다. 주석문을 작성하는 데에 주력하는 대신,
  읽기 쉬운 코드를 작성하는 데에 주력해야 합니다. 훌륭한 프로그래머라면,
  코드 자체에서 작성자의 의도를 파악할 주 알아야 합니다. 만일 코드에 에러가
  있다면, 코드 작성자의 의도를 파악하는 것이 무슨 소용이 있습니까?"
  글라우콘이 자신만만하게 이야기 했다. 칼리클레스는 고개를 끄덕였다.
  
  "자네 이야기를 들으니, 자네는 그 동안 다른 이들이 작성한 코드를 수정해야
  하는 일이 없었던 모양이군."
  이스메네가 말했다. 칼레클레스는 갑자기 천장의 연필 자국을 물끄러미 바라
  보았다.
  
  "자네는 왜 자네가 반년이나 일년 전에 작성한 코드를 읽어보려 하지 않지?
  그렇게 하면, 자네의 코드를 읽는 실력과 주석문을 작성하는 능력이 향상될텐
  데. 굳이 두 가지 가운데에서 한 가지를 택할 필요는 없다네. 나는 고쳐야 할
  코드 두 줄을 찾기 위해서 수백 줄의 코드를 정신을 집중해서 읽을 필요는 없
  다고 생각하거든."
  
  "좋습니다. 코드를 찾는 데에 주석문이 유용하다는 사실은 인정하겠습니다."
  글라우콘이 말했다. 그는 전에 이스메네가 작성한 프로그램을 보고 감탄했던
  적이 있었기 때문이다.
  "하지만, '코드를 변경하면, 주석문은 뒤떨어진 것이 된다' 는 칼리클레스의
  또 다른 논점은 어떻게 되는 겁니까? 저는 비록 프로그래밍을 한지 얼마 되지
  않았습니다만, 주석문을 갱신하려는 프로그래머는 여태껏 보지 못했습니다."
  
  "글쎄, 그건 옳을 수도 있고 아닐 수도 있지." 이스메네가 말했다.
  "만일 자네가 주석문을 전적으로 믿고 코드만 의심한다면, 자네는 심각한 문제
  에 봉착하게 될 걸세. 실제로, 주석문과 코드의 내용이 일치하지 않는다는 것
  은, 양쪽 모두에 잘못된 것이 있다는 뜻을 나타내는 경향이 있지. 하지만, 주
  석문의 일부가 나쁘다고 해서, 주석문 전체를 매도해서는 안된다네. 잠깐만,
  커피포트를 가지러 부엌에 다녀오겠네."
  이스메네가 방을 떠났다.
  
  "내가 주석문을 싫어하는 가장 큰 이유는, 주석문은 자원을 낭비한다는 점입니
  다."
  칼리클레스가 말했다.
  
  "여러분 가운데, 주석문을 최단 시간에 작성하는 방법을 생각해 본 사람이 있
  나?"
  소크라테스가 말했다.
  
  "PDL을 사용하여 루틴을 설계한 다음, PDL을 주석문으로 변환하고 그 사이를
  코드로 채우는 것이 어떨까요?"
  글라우콘이 말했다.
  
  "좋아. 주석문 때문에 코드가 반복되는 부분이 없다면, 괜찮은 방법이겠군."
  칼리클레스가 말했다.
  
  "주석문을 작성한다면, 자기가 작성한 코드가 하는 일을 좀 더 세밀하게 검토
  하게 되지."
  이스메네가 부엌에서 돌아오면서 말했다.
  "만일 주석문을 쓰기가 어렵다면, 코드가 나쁘거나 자기가 코드를 충분히 이해
  하지 못한 것이라네. 둘 중 어떤 경우이든 간에, 코드에 시간을 쏟아야 한다는
  것은 자명하네. 그러니까, 주석문을 작성하는 데에 사용한 시간은 낭비된 것이
  아니지."
  
  "좋았어."
  소크라테스가 말했다.
  "더 이상 질문할 것이 떠오르지 않는군. 오늘의 최우수 토론자는 이스메네라고
  생각하네. 우리는 주석문을 더욱 많이 사용하도록 하세. 하지만, 아무렇게나
  사용해서는 안되네. 여러분들이 어떤 주석문이 진짜로 쓸모 있는 것인가를 깨
  달을 수 있도록, 앞으로 코드 평가회를 열도록 하겠네. 다른 사람이 작성한
  코드를 이해하기가 힘들다면, 그 코드를 쓴 사람에게 코드를 개선할 방법을 깨
  닫게 해 주세." 
Posted by 용학도리
,