1장: 깨끗한 코드

코드가 존재하리라

  • 코드는 요구사항을 상세히 표현하는 수단. 어느 수준에 이르면 코드의 도움 없이는 요구사항을 상세히 표현하기란 불가능하다!

나쁜 코드

  • 좋은 코드는 중요하며, 이 분야에서 가장 강조되어 온 전제 중 하나다.

  • 80년대 한 킬러 앱 (Killer App)을 만든 회사의 사례

    • 출시 후 커다란 인기를 누렸으나, 제품의 출시 주기가 점점 늘어남

    • 이전 버전에 있었던 버그가 다음 버전에도 그대로 남아있고, 시동 시간이 길어지고 프로그램이 죽는 횟수도 늘어남

    • 결국 회사는 얼마 못 가 폐업

    • 원인은 바로 나쁜 코드 탓!

  • 프로그래머라면 모두 나쁜 코드로 고생한 경험이 있다.

  • 스스로가 짠 쓰레기(mess) 코드를 나중에 손보겠다고 생각한 경험이 있다. 하지만 나중은 결코 오지 않는다 (Later equals never.)

나쁜 코드로 치르는 대가

  • 나쁜 코드는 개발 속도를 크게 떨어트린다. 프로젝트 초반에는 번개처럼 나가다가 1-2년만에 굼벵이처럼 기어가는 팀도 많다.

  • 나쁜 코드가 쌓일수록 팀 생산성은 떨어진다. 관리자들은 나름대로 복구를 시도하고자 새 인력을 투입하지만, 생산성을 높여야 한다는 압박감에 나쁜 코드를 더 많이 양산한다.

  • 간혹 아예 새로운 시스템을 구축하는 방법을 택하기도 하지만, 같은 방식이라면 결국 이는 반복된다.

태도

  • 코드가 왜 그렇게 되었을까? 요구사항이 변해서? 일정이 촉박해서? 잘못은 전적으로 우리 프로그래머들에게 있다. 우리가 전문가답지 못했다.

  • 관리자와 마케팅은 약속과 공약을 내걸며 우리(프로그래머)게 정보를 구한다. 우리에게 정보를 구하지 않도라도 우리가 적극적으로 정보를 제공해야 마땅한다.

  • 사용자는 요구사항을 내놓으며 우리에게 현실성을 자문한다. 프로젝트 관리자는 일정을 잡으며 우리에게 도움을 청한다.

  • 프로젝트를 계획하는 과정에 우리에게도 책임이 있고, 나쁜 코드가 초래하는 실패에는 더더욱 책임이 크다.

원초적 난제

  • 기한을 맞추려면 나쁜 코드를 양산할 수 밖에 없다?

    • 나쁜 코드를 양산하면 기한을 맞추지 못한다. 엉망인 상태로 인해 속도가 늦어지고, 결국 기한을 놓친다.

    • 작업을 빨리 하는 방법은 언제나 코드를 최대한 깨끗하게 유지하는 습관이다.

깨끗한 코드라는 예술?

  • 깨끗한 코드를 어떻게 작성할까?

    • 깨끗한 코드는 그림 그리기와 비슷하다. 그림을 엉망으로 그렸는 지 판단하는 것이 곧 그림을 잘 그린다는 이야기가 아니듯, 나쁜 코드를 구분할 줄 안다고 깨끗한 코드를 작성할 줄 안다는 뜻은 아니다.

  • 코드 감각

    • 좋은 코드와 나쁜 코드를 구별할 뿐만 아니라, 절제와 규율을 적용해 나쁜 코드를 좋은 코드로 바꾸는 전략도 파악한다.

깨끗한 코드란?

  • 비야네 스트롭스트룹

    • 우아한(elegant) 코드: "보기에 즐거운 (pleasing)" 코드

    • 효율적인(effecient) 코드: 속도가 느리고, CPU 자원을 낭비하는 코드는 우아하지 못하다!

    • 나쁜 코드는 나쁜 코드를 유혹(tempt)한다!

    • 철저한 오류 처리: 세세한 사항까지 꼼꼼하게 신경 쓰기. 프로그래머들이 대충 넘어가는 부분 중 하나가 오류 처리다. 나머지는 메모리 누수, 경쟁 상태(race condition), 일관성 없는 명명법.

    • 깨끗한 코드는 한 가지를 잘 한다. 한 가지 역할에 집중한다!

  • 그레디 부치

    • 가독성: 깨끗한 코드는 단순하고 직접적이다. 깨끗한 코드는 잘 쓴 문장처럼 읽힌다.

    • 명쾌한 추상화: 코드는 추측이 아니라 사실에 기반해야 한다. 반드시 필요한 내용만 담아야 한다. 코드를 읽는 사람에게 프로그래머가 단호하다는 인사를 줘야 한다.

  • 데이브 토마스

    • 깨끗한 코드는 작성자가 아닌 사람도 읽기 쉽고 고치기 쉽다.

    • 테스트 케이스가 없는 코드는 깨끗한 코드가 아니다!

    • 깨끗한 코드에는 의미 있는 이름이 붙는다.

    • 의존성은 최소이며 각 의존성을 명확히 정의한다.

  • 마이클 페더스

    • 주의(care): 코드를 주의깊게 짜는 방법, 누군가 시간을 들여 깔끔하고 단정하게 정리한 코드

  • 론 제프리스

    • 중복을 피하라, 한 기능만 수행해라, 제대로 표현하라, 작게 추상화하라!

  • 워드 커닝햄

    • 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드.

    • 코드가 그 문제를 풀기 위한 언어처럼 보인다면 아름다운 코드라 불러도 되겠다.

우리(저자 본인을 비롯한 진영)의 생각 (로버트 C. 마틴)

  • 깨끗한 변수 이름, 깨끗한 함수, 깨끗한 클래스를 만드는 방법을 소개한다.

  • 이 책에서 가르치는 교훈과 기법은 우리 진영이 믿고 실천하는 교리이다. 우리가 가르치는 교훈을 따른다면 우리가 만끽한 이익을 여러분도 누리리라.

  • 하지만 우리 생각이 전적으로 옳다라는 단정은 금물이다.

Last updated