본문으로 건너뛰기

Becoming a Better Programmer: A Handbook for People Who Care About Code

Pete GoodliffeISBN 9781491905562

Overview

더 나은 코드를 쓰기 위한 태도/습관/실천 목록을 모아둔 핸드북. (책을 읽으며 기억할 포인트 위주로 정리)

Connections

  • Software Engineering (MOC)

챕터1 - 코드에 신경쓰기

긍정적인 관점, 건전한 태도

  • 의도가 드러나는 코드

  • 유지보수가 가능한 코드

  • 정확한 코드

  • 더 나은 구조를 가진 코드

  • 더 나은 테스트 또는 테스트가 가능한 코드

  • 더 쉬운 이해가 되는 코드

챕터2 - 정돈된 코드 유지하기

좋은 코드 레이아웃

  • 명백하다

  • 일관성이 있다

  • 주의를 끌거나 초점을 빼앗지 않고 코드의 의도만을 보여준다

  • 효율적으로 코딩할 수 있다

  • 유지 보수하는 시간이 줄어든다

  • 실수를 줄일 수 있다

(누군가)를 위해 코딩하라

  • 컴파일러를 위해
  • 지금 코딩하고 있는 나를 위해
  • 같은 팀의 동료
  • 후에 유지보수할 나 또는 동료 누군가

코드를 글처럼 작성하기

  • 비슷한 것끼리 묶기
  • 다른 것들은 나누기
  • 코드에서 빈 줄을 사용해 관련성 있는 코드끼리 나누기
function func() {
 // 값 가져오기
    ...
    ...
    
    // 값 처리하기
    ...
    ...
    
    // 값 반환하기
    ...
    ...
}

일관성 가지기

Tip: prettier를 사용하여 코드 포맷팅 자동화하기

들여쓰기, 연산자 옆의 공백, 대소문자, 괄호, 탭과 스페이스, 주석 형태 등

  • 상호합의하에 이루어진 레이아웃에 대한 규칙은 협업을 원활하게 할 수 있다
  • 정해진 규칙이 없는 경우, 파일에 대한 규칙,라이브러리에 대한 규칙 또는 표준 코딩 스타일 가이드를 사용할 수 있다

이름 짓기

잘 설명할 수 있고, 행동을 명확하게 드러낼 수 있는 이름 짓기

Tip: 좋은 이름은 서술적이고, 정확하고, 관용적이다

  • 이름에서 중복으로 설명하는 부분 피하기
  • 이름을 짧게 줄이는 것보다 잘 이해되는 이름이 좋다
  • 관용어법 지키기(카멜 케이스, 스네이크 케이스, 파스칼 케이스 등)
  • 헷갈리게 만드는 이름은 좋지 않다

코드 가다듬기

레이아웃을 다듬는 커밋과 기능을 변경하는 커밋을 분리하면 잘못되는 부분을 쉽게 알아차릴 수 있다

챕터3 - 코드 적게 쓰기

코드를 개선하는 좋은 방법 중 하나는 코드를 제거하는 것이다

코드가 많으면 생길 수 있는 문제

  • 불필요한 코드는 그 자체로 비용이다
  • 유지보수 비용이 증가한다
  • 프로그램을 파악하기 힘들어진다
  • 프로그램을 수정하기 어려워진다
  • 버그가 생길 가능성이 증가한다
  • 중복된 코드는 유지보수가 어렵다

허술한 논리

if문 사용

if(isTrue()) {
    return true
} else {
    return false
}
return isTrue() ? true : false
return isTrue()

비교

if(isTrue() === true)
if(isTrue())

복잡한 if문

function should_we_pick_bananas() {
    if(gorilla_is_hungry()) {
        if(banana_are_ripe()) {
            return true
        } else {
            return false
        }
    } else {
        return false
    }
}

function should_we_pick_bananas2() {
    if(!gorilla_is_hungry()) return false
    if(!banana_are_ripe()) return false
    return true
}

function should_we_pick_bananas3() {
    return gorilla_is_hungry() && banana_are_ripe()
}

로직 최적화

if( a || b )
if( a || ( !a && b ) )

중복

if문 중복

if(a) do_a();
if(a) do_b();
if(a){
 do_a();
 do_b();
}
if(a) {
 if(a && b) {
  // do
 }
}
if(a) {
 if(b) {
  // do
 }
}

반복 중복

for (let i = 0; i < MAX; i++) {
 // do
}
for (let i = 0; i < MAX; i++) {
 // do
}

죽은 코드

절대 만족할 수 없는 조건문 안의 코드, 반환문 아래의 코드, 반복될 일이 없는 반복문 등

  • 실행되지 않는 코드
  • 호출되지 않는 코드
  • 선언되었으나 할당되지 않은 변수
  • 메서드에 전달되었지만 사용하지 않는 매개변수
  • 전혀 사용되지 않는 열거형, 구조체, 클래스, 인터페이스

주석

  • 대부분의 코드는 주석을 필요로 하지 않는다
  • 주석을 쓰는 것보다 코드를 이해하기 쉽게 바꾸는 것이 나을 수 있다
  • 주석이 꼭 필요한 경우가 언제인지 생각해 보아야 한다
  • 코드는 언제든 vms를 통해 복구 가능하므로 이전 코드를 남기기 위해 주석을 사용할 필요가 없다

코드 축소

  • 장황하게 늘어질 코드를 효율적으로 축소할 수 있다
  • &&, ||, 삼항연산자를 사용해 조건문을 줄일 수 있다

나쁜 설계

  • 죽은 숲을 갈아엎는 것을 두려워 하지 마라
  • 기존의 좋은 라이브러리가 있다면 활용하는 것도 좋은 방법이다

공백

  • 적절한 공백을 사용하여 코드를 읽기 쉽게 구분할 수 있다

  • 코드를 작성하고 읽기 쉽게 개선

  • 작성이 끝난 후 스스로 정리

  • 불필요한 코드와 안쓰는 프로그램 제거

챕터 4- 코드 줄여 개선하기

  • 코드가 의미를 가질 때만 작성하기
  • 코드가 필요할 때만 작성하기
  • 작은 기능이라도 구현하는 것보다 필요한지를 먼저 생각하기
  • 요구사항은 프로그래머가 아닌 사용자 관점에서 생각해야 한다