- 전역변수에는 서술적인 이름을, 지역변수에는 짧은 이름을 붙인다.
- 일관성을 지킨다.
- 함수 이름은 능동형으로 쓴다.
- 정확한 이름은 쓴다.
- 들여쓰기로 구조를 알아보기 쉽게 한다.
- 표현식을 자연스럽게 쓴다.
- 괄호를 써서 애매함을 해결한다.
- 복잡한 표현은 잘게 쪼갠다.
- 명료하게 쓴다.
- 부수적 효과를 피한다.
- 들여쓰기와 중괄호는 스타일의 일관성을 지킨다.
- 일관성을 위해 관용 표현을 사용한다.
- 다중 결정이 필요할 때는 else-if를 쓴다.
- 매크로는 쓰지 않는다.
- 매크로 전체 인자는 괄호로 묶는다. (c)
- 매직 넘버에 이름을 달아라
- 숫자는 매크로로 쓰지 말고 상수로 정의하라. (c)
- 아스키 문자는 문자 상수로 쓴다. (c)
- 언어에서 제공하는 것으로 객체의 크기를 계산한다.
- 명확한 코드에는 주석을 달지 않는다.
- 함수와 전역 데이터에 주석을 단다.
- 나쁜 코드는 주석을 달지 말고 새로 작성한다.
- 주석과 코드가 불일치 하면 안된다.
- 명확하게 작성한다.
- 구현은 숨긴다.
- 서로 겹치지 않게 기본 항목을 선택한다.
- 사용자가 모르는 곳에서 일을 하지 않는다.
- 어디서나 같은 일은 같은 방식으로 한다.
- 자원은 반드시 해제한다.
- 에러는 저수준에서 잡는다.
- 에러는 고수준에서 처리한다.
- 예외는 예외 상황에서만 처리한다.
- 자주 나오는 패턴을 찾는다
- 가장 최근에 변경한 부분을 확인한다.
- 같은 실수를 반복하지 않는다.
- 오늘 할 디버깅을 내일로 미루지 않는다.
- 스택 추적값을 확인한다.
- 작성하기 전에 읽는다.
- 코드를 다른 사람에게 설명한다.
- 버그를 재현할 수 있게 한다.
- 각개격파한다.
- 수가 의미하는 바를 연구한다.
- 결과를 출력해서 범위를 좁힌다.
- 자가 검증 코드를 작성한다.
- 로그 파일을 작성한다.
- 그림을 그린다.
- 디버거를 사용한다.
- 기록한다.
- 경계에서 테스트한다.
- 사전 조건을 테스트한다.
- 사후 조건을 테스트한다.
- 단정문을 사용한다.
- 방어적 프로그래밍을 한다.
- 리턴 값을 검사한다.
- 점층적으로 테스트한다.
- 단순한 부분을 먼저 테스트한다.
- 어떤 결과가 나와야 하는지 확인한다.
- 보존 속성을 검증한다.
- 독립적인 구현 버전을 비교한다.
- 코드 커버리지를 측정한다.
- 회귀 테스트를 자동화한다.
- 자급자족형 테스트를 창조한다.
- 시간 측정을 자동화한다.
- 프로파일러를 사용한다.
- 병목에 집중한다.
- 그림을 그려본다.
- 더 나은 알고리즘을 사용한다.
- 더 나은 데이터 구조를 사용한다.
- 컴파일러 최적화 기능을 사용한다.
- 코드를 튜닝한다.
- 중요하지 않은 것은 최적화 하지 않는다.
- 공통된 부분 표현식을 하나로 모은다.
- 비싼 연산을 싼 연산으로 바꾼다.
- 루프를 펼치거나 제거한다.
- 빈번히 사용되는 값을 캐싱한다.
- 특수한 메모리 할당 함수를 작성한다.
- 입력과 출력은 버퍼링한다.
- 특수한 경우를 따로 처리한다.
- 결과를 사전 계산한다.
- 근사값을 사용한다.
- 저수준 언어로 재작성한다.
- 최소 데이터 타입을 사용해서 공간을 절약한다.
- 쉽게 재계산할 수 있는 값을 저장하지 말라.
- 표준을 유지한다.
- 주류를 따라 프로그래밍 한다.
- 언어의 골치거리 부분을 인식한다.
- 여러 컴파일러로 시도한다.
- 표준 라이브러리를 사용한다.
- 어디서나 쓸 수 있는 기능만 사용한다.
- 조건 컴파일을 지양한다.
- 시스템 의존성은 별도 파일에 담는다.
- 시스템 의존성은 인터페이스 뒤에 숨긴다.
- 데이터 교환은 텍스트를 사용한다.
- 데이터를 교환할 때 고정된 바이트 순서를 사용한다.
- 명세를 바꾸면 이름을 바꿔라.
- 기존 프로그램 및 데이터와 호환성을 유지한다.
- ASCII라고 가정하지 마라.
- 영어라고 가정하지 마라.