프로그래밍 수련법

1. 짧은 평가, 느낀점

책을 읽게 된 것은 단순한 계기인데, 같은 회사의 동료인 권국헌님의 택배를 대신 받은 것이 시작이었다. 국헌님은 평소에 실수나 빈틈을 별로 보여주지 않으시고, 가끔가다 슬랙으로 좋은 팁들을 전수해 주시는 자주 해주셨으면 좋겠지만 훌륭한 시니어 엔지니어시다.

어쨌든, 택배를 받고 국헌님의 책상으로 갔더니 이 책이 놓여있었다. 국헌님이 읽으시는 “수련”책이라니, 과연 어떤 책일지 궁금해졌다. 그래서 그날 바로 구매를 했던 것으로 기억한다.

C, C++의 허들

책의 거의 모든 예제 코드들이 C로 되어있고, 가끔씩 고수준 언어라며 C++과 java코드가 예제로 나온다. 이는 생각보다 읽는데 시간이 걸리는 원인이 되었다. C, java코드를 아예 읽지 못하는 것은 아니지만, 긴 예제 코드에 포인터와 메모리 할당, 해제함수들이 곁들여 지면서 상당한 고통을 만들어 내었다.

옛날 책이라 어쩔 수 없는 부분이지만, 만약 내가 C나 java코드를 아예 읽을 줄 몰랐더라면 진작에 덮어버렸을 것 같다. 조금 아쉬운 부분이라고 할까.

공감하기 힘든 부분들

몇 가지 부분들이 있었는데, 지금 생각나는 것들 중 하나는 ‘테스트’ 항목에서 직접 자동화된 테스트를 만드는 법에 대한 부분이 대표적이다. “그냥 test framework를 쓰면 끝나는일 아닌가?”라는 생각이 먼저 들었고, 지면을 많이 할애할 부분도 아니었다고 생각한다. 다만 책을 쓰는 시점에는 지금처럼 친절한 test framework가 없었기 때문에 그랬던 것인가, 하는 생각도 든다.

정확한 파트는 기억이 나지 않지만, 위의 예시 처럼 종종 공감하기 힘든 부분들이 있었다(아! C의 macro에 대한 이야기도 있었다). 그런 부분이 나올때 마다 부담없이 슥슥 넘어가거나 전하고자 했던 메시지를 찾는데 시간을 더 쏟았다.

그럼에도 불구하고

사실 K문고 사이트에서 이 책의 평점을 1점을 준 사람이 있다. 그 사람의 평을 요약하자면 “대부분 C로 예제 코드가 쓰여 있으며, 실제로 쓸만하고 적용할 만한 내용이 없다. 저자 자신만의 코딩세계를 보여주는 그들만의 잔치다.” 라고 부정적으로 쓰여있다.

물론 위의 몇몇 아쉬운 부분들이 있지만 책이 전달하는 전체젝인 메시지는 정말 좋다고 생각한다. 각각의 파트에서 놓치기 쉽거나 간과하기 쉬운 부분들을 잘 짚어주고 있으며, 근거나 설명도 꽤나 충실하다. 그렇기때문에, C가 익숙한 사람들이라면 코드를 읽는 즐거움이 있을 것이고, 본인처럼 C가 익숙하지 않다면 각자의 언어나 상황에 적용해 보는 즐거움이 있을것이라 생각한다.

위의 ‘실제로 쓸만하고 적용할 만한 내용이 없다.‘라는 평가는 너무 박한 평가라는 생각이 든다. 본인이 생각하기에, 책의 예시를 그대로 적용하는 것이 아니라, 그 예시들이 전달하려고 하는 내용을 좀 더 추상적인 개념으로 받아들이면 된다고 본다. 그것만으로도, 이 책은 (특히 주니어를 막 벗어나려고 하는 사람들은) 충분히 읽을 가치가 있다고 생각한다.

2. 요약

8장과 9장은 요약하지 않았다. 호환성을 생각하고 표준을 준수하라는 내용을 장황하게 늘어놓을 필요는 없다고 생각했기 때문이다.

스타일

  1. 이름
  1. 표현식과 문장
  1. 일관성과 관용표현
  1. 매직넘버
const a = [1..10]

//bad
const aLength = 10
//good
const aLength = a.length
  1. 주석
  1. 이렇게 하는 이유가 무엇인가?

알고리즘과 데이터 구조

  1. 검색
  1. 정렬
  1. 크기가 커지는 배열들
  1. List
  1. Tree
  1. Hash table
  1. 요약

3. 설계와 구현

4. 인터페이스

설계의 핵심은 서로 대립하는 목표와 제약 사이에서 균형을 잡는 것이다.

  1. 프로토타입 라이브러리
  1. 다른 사람이 쓸 수 있는 라이브러리
  1. 명세서
  1. 인터페이스 원칙
  1. 자원관리
  1. 중단, 재시도, 실패
  1. 사용자 인터페이스

5. 디버깅

좋은 프로그래머는 코드 작성 시간과 비슷한 시간을 디버깅에 쏟으며, 실수에서 배움을 얻는다.
디버깅을 줄여주는 방법은 다음과 같다.

  1. 디버거
  1. 실마리가 뚜렷한 쉬운 버그
  1. 실마리가 없는 어려운 버그
  1. 최후의 수단
  1. 재현이 불가능한 버그
  1. 타인의 버그
  1. 요약

6. 테스트

  1. 개발하면서 테스트하기
  1. 체계적인 테스트
  1. 자동화
  1. 부하 테스트
  1. 누가 테스트하는가?

7. 성능

컴퓨터의 성능이 좋아진 지금에도, 프로그램의 성능은 항상 고민해야 한다. 하지만 정말로 병목이 있거나, 프로그램을 명확하면서도 더 빠르게 만들 수 없다면 최적화를 진행하지 않는다.

그렇기 때문에, 최적화의 첫원칙은 하지 않는다이다.

  1. 시간 측정과 프로파일링
  1. 속도를 위한 전략
  1. 코드 튜닝
for(let i = 0; i < 3l i++>) {
  a[i] = b[i] + c[i]
}

// to be
a[0] = b[0] + c[0]
a[1] = b[1] + c[1]
a[2] = b[2] + c[2]
  1. 공간을 위한 전략
  1. 요약