예전(이라고는 하지만 얼마 되지 않은 과거)에 나는 The practice of programming(프로그래밍의 모든 것)이라는 책을 샀다. the c programming language라는 선구자격 책을 쓴 분이라고 하는데 이 책 역시 그 분이 쓴 책이라는 선전문구에 혹하여, 그리고 알라딘 중고 서점이어서 매우 싼 가격(엄청 오래 된 책이라서..)에 그 책을 업어왔다.

그런데 그 이후, 리팩토링 구판 책을 읽으면서 아 예전 번역서는 사서 읽으면 안되겠구나. 왜 옛 프로그래머 분들은 그렇게 번역서에 회의적이었는지 알겠다. 같은 기분이 되어서 그 책은 손 위에 얹고픈 마음이 잘 일지 않았다.(사실 다른 책들도 여럿 있었기 때문에 딱히 그 책을 읽지 않고도 계속해서 독서를 이어갈 수 있기도 했고.)

그러던 와중에 예전에 한뭉텅이 책을 구매했고 그 중 한권이 바로 이 책, 프로그래밍 수련법이다. 사실 the practice of programming이라는 책이랑 완전히 같은 책을 번역한 건데 최근에 번역한 책이라는 것이 상당히 중요하다. 옛날 번역서에 대한 나의 반감의 골은 이렇게 점점 깊어만 가고.. ㅋ(사실 이런 관점에서 보고 있었기에 그 책은 펼쳐보지도 않았다.. 아무튼 새롭게 번역한 책이 내 손에 들어왔는데 그 책을 다시 볼 이유도 없고.)

그리고 저번에 루아 책을 한번(대충) 다 읽고 난 후에 선택한 책이 바로 이 책이었다. 그때 뭉텅이로 산 책들 중 마지막 책이다.

일단 이 책에서 나왔던 원칙들을 옮겨보자.


스타일

  • 전역변수에는 서술적인 이름을, 지역변수는 짧은 이름을 붙여라.
  • 일관성을 지켜라.
  • 함수 이름에는 능동형을 쓰라.
  • 정확한 이름을 쓰라.
  • 들여쓰기로 구조를 알아보기 쉽게 하라.
  • 표현식을 자연스럽게 쓰라.
  • 괄호를 써서 애매함을 해소하라.
  • 복잡한 표현은 잘게 쪼개라.
  • 명료하게 쓰라.
  • 부수효과를 조심해라.
  • 들여쓰기와 중괄호 ‘{}’를 쓰는 스타일에서는 일관성을 지키라.
  • 일관성을 위해 관용 표현을 사용하라.
  • 다중 결정이 필요할 때는 else-if를 사용하라.
  • 매크로 함수를 멀리하라.
  • 매크로 전체와 각 인자를 괄호로 묶어라.
  • 매직넘버에 이름을 달아주라.
  • 숫자는 매크로로 쓰지 말고 상수로 정의하라.
  • 아스키 문자는 숫자 코드 말고 문자 상수로 쓰라.
  • 언어에서 제공하는 것을 써서 객체의 크기를 계산하라.
  • 명확한 코드에는 주석을 달지 말라.
  • 함수와 전역 데이터에 주석을 달아라.
  • 나쁜 코드오ㅔ 대해 설명하지 말고 코드를 새로 짜라.
  • 주석과 코드가 모순되게 하지 말라.
  • 혼란스럽게 하지 말고, 명확하게 하라.

인터페이스

  • 구현의 세부 사항을 숨겨라.
  • 서로 겹치지 않게 기본 항목들을 선택하라.
  • 사용자가 모르는 곳에서 일을 꾸미지 말라.
  • 어디서나 같은 일을 같은 방식으로 처리하라.
  • 자원을 결자해지하라.
  • 에러는 저수준에서 잡고, 고수준에서 처리하라.
  • 예외적 상황에서만 예외 처리를 하라.

디버깅

  • 자주 나오는 패턴을 찾으라.
  • 가장 최근에 변경한 부분을 감사하라.
  • 같은 실수를 두 번 반복하지 말라.
  • 오늘 할 디버깅을 내일로 미루지 말라.
  • 스택 추적값을 확인하라.
  • 작성하기 전에 읽으라.
  • 코드를 다른 사람에게 설명하라.
  • 버그를 재현할 수 있게 하라.
  • 각개격파하라.
  • 수가 의미하는 바를 연구하라.
  • 결과를 출력해서 탐색 범위를 좁혀라.
  • 자가검증 코드를 작성하라.
  • 로그 파일을 작성하라.
  • 그림을 그려라.
  • 도구를 사용하라.
  • 기록하라.

테스트

  • 경계에서 테스트하라.
  • 사전, 사후 조건을 테스트하라.
  • 단정문을 사용하라.
  • 방어적으로 프로그래밍하라.
  • 리턴값을 검사하라.
  • 점층적으로 테스트하라.
  • 단순한 부분을 먼저 테스트하라.
  • 어떤 결과가 나와야 하는지 알라.
  • 보존 속성을 검증하라.
  • 독립적인 구현 버전을 비교하라.
  • 테스트 범위를 측정하라.
  • 회귀 테스트를 자동화하라.
  • 자급자족형 테스트를 창조하라.

성능

  • 시간 측정을 자동화하라.
  • 프로파일러를 사용하라.
  • 과열지역에 집중하라.
  • 그림을 그려보라.
  • 더 나은 알고리즘이나 데이터 구조를 사용하라.
  • 컴파일러의 최적화 기능을 켜라.
  • 코드를 미세조정(tune)하라.
  • 중요하지 않은 것을 최적화하지 말라.
  • 공통된 부분 표현식을 하나로 모으라.
  • 비싼 연산을 싼 연산으로 대체하라.
  • 루프를 펼치거나 제거하라.
  • 빈번히 사용되는 값을 캐싱하라.
  • 특수한 메모리 할당 함수를 작성하라.
  • 입력과 출력을 버퍼링하라.
  • 특수한 경우를 따로 처리하라.
  • 결과를 사전계산하라.
  • 근사값을 사용하라.
  • 저수준 언어로 재작성하라.
  • 최소 데이터 타입을 사용해서 공간을 절약하라.
  • 쉽게 재계산할 수 있는 값을 저장하지 말라.

호환성

  • 표준을 유지하라.
  • 주류를 따라 프로그래밍하라.
  • 언어의 골칫거리 부분을 인식하라.
  • 여러 컴파일러로 시도하라.
  • 표준 라이브러리를 사용하라.
  • 어디서나 쓸 수 있는 기능만 사용하라.
  • 조건 컴파일을 지양하라.
  • 시스템 의존성을 별도 파일에 지역화해 담아라.
  • 시스템 의존성을 인터페이스 뒤에 숨겨라.
  • 데이터 교환에는 텍스트를 사용하라.
  • 데이터를 교환할 때 고정된 바이트 순서를 사용하라.
  • 명세를 바꾼다면 이름도 바꾸라.
  • 기존 프로그램 및 데이터와 호환성을 유지하라.
  • ASCII라고 전제하지 말라.
  • 영어라고 전제하지 말라.

다 적고 보니 꽤 많구나. 이렇게 긴 글을 읽으면서 뻔한 소리구나.. 뭔 소리지? 아 맞다 나도 이런 기분을 느꼈어 등등 여러가지 감정을 느낄 수 있었는데, 우선 나는 C언어에 대해 거의 모르는 것이나 다름없다는 사실을 깨달았다. 사실 c언어에서 사용하는 memcopy 정도도 제대로 사용법을 모르는데.. 내가 공부했던 건 c언어가 아니라 언어 체계 전반을 두루뭉술하게 깨우치는 정도였구나.. 하는 자기성찰의 시간을 가졌다. 결국 나는 c를 할 줄 모르는 것이었다..(이게 copy & paste의 결론이다..)

그리고 처음 이 책을 읽을때는 당연히 c에 대한 내용일줄 알았는데 알고 보니 c/c++/java를 아우르는 내용이었다. 그래서 더 유익하고 재밌었음. 그 언어 각각으로 프로그램을 보여주는 부분은 특히 더 유용하다! 일 수 있었으나 지하철에서 읽어왔기에 대충 대충 슉슉 넘어갔다..

또, 회사에서 내가 막 디버깅을 하고 있는데 디버깅 파트를 읽는 것 역시 동기부여가 되었다. 재미있었어.

디버깅 하니까 생각났는데, 난 언제쯤 유닛 테스트 코드를 작성하게 될까.. ㅋ.. 씁..

아무튼 재미있었다. 저 위에 것들은 가끔 간간히 한번씩 다시 읽어봐야지. 다음 책은 뭐하지! 세븐 랭귀지 / 리팩토링 신판 둘 중 하나를 읽게 될 것 같다!