읽기 좋은 코드가 좋은 코드다

지은이
더스틴 보즈웰, 트레버 파우커
분류
컴퓨터/IT
시작일
2024/07/18
완독일
2024/07/31
평점
3.0 / 5.0
책 사진을 추가해 주세요
책 속 문장 또는 소감을 기록해 주세요

서평

게임 개발을 할 때, 새로 온 프로그래머에게 이전 프로그래머가 짜둔 코드를 리팩토링해달라는 부탁을 한 적이 있었다. 보름 정도 보더니 새로 만드는 게 좋겠다고 하였다. 이전 프로그래머와 새로 온 프로그래머는 친분도 있었고, 주석도 알차게 적었다고 했지만 남의 코드를 분석하는 건 정말 어려운 일인가 보다.
사업팀장으로 있었던 게임회사에서도 비슷한 경험이 있었다. 사업은 기존 게임의 리뉴얼을 원했지만, 몇 개월을 허비했지만 결국 기획데이터를 변경하여 레벨업을 쉽게 해 주는 정도로 타협을 보았다.
모두가 인정할 만큼 읽기 좋은 코드를 짠다는 건 쉽지 않다. 프로그래머마다 배운 방식이 다르고, knit한 코드를 짜기에는 시간도 넉넉치 않기 때문이다. 그럼에도 불구하고 관용적인 규칙을 알고 있다면 최소한 말 몇마디는 보탤 수 있지 않을까라는 생각에 이 책을 읽었다.
마치 작가지망생에게 소설 잘 쓰는 법을 알려주는 것같다. 그런 방법들을 배우면 글쓰기에 자신감이 생기듯이, 코드를 읽고 작성하는 것에 대한 밤톨만한 자신감이 생겼다.
Search
기록
Day
페이지
책 속 한 문장 또는 소감
P.5 ~ P.48
- 특정한 단어를 사용하라 Ex.) Get → Fetch, Download - 보편적인 이름 사용을 피하라 Ex.) tmp, retval - 변수명에 세부정보를 덧붙여라 - Scope가 넓으면 긴 이름을 사용하라 - 대문자나 밑줄 등을 의미있는 방식으로 활용하라
P.49 ~ P.60
- 경계를 포함하는 한계값을 다룰 때는 min과 max를 사용하라 - 경계를 포함하는 범위에는 first와 last를 사용하라 - 경계를 포함하고/배제하는 범위에는 begin과 end를 사용하라 - 불리언 값을 정할 때는 is나 has같은 단어를 같이 쓴다
P.61 ~ P.74
- 일관성과 간결성을 위해 줄바꿈을 재정렬하라 - 메소드를 활용하여 불규칙성을 정리하라 - 도움이 된다면 코드의 열을 맞춰라 → 열 정렬 - 의미 있는 순서를 선택하고 일관성있게 사용하라 - 선언문을 블록으로 구성하라 - 코드를 문단으로 쪼개라
P.75 ~ P.90
- 주석으로 설명하지 말아야 하는 것 : 코드에서 유추할 수 있는 내용, 설명 자체를 위한 설명을 달지 마라, 나쁜 함수/변수 이름에 주석을 달지 마라 ⇒ 좋은 코드 > 나쁜 코드 + 좋은 주석 - 생각을 기록하라 : ⇒ TODO l 앞으로 해야할 일, FIXME | 오동작을 일으킨다고 알려진 코드, HACK | 아름답지 않은 해결책, XXX | 위험! 큰 문제가 발생할 수 있음 ⇒ 상수값을 왜 그렇게 정했는지 이유를 설명하라 ※ // 이런 제길, 이 리스트 안에 중복된 항목이 있으면 곤란해 지잖아! // ⇒ XXX | 이 코드는 리스트 안에 있는 중복된 항목을 다루지 않는다. 그것까지 감안하면 예외처리가 너무 많을 것이기 때문이다
P.91 ~ P.100
* 주석은 높은 ‘공간 대 비율’을 갖춰야 한다. - 코너케이스를 설명해 주는 입/출력 예를 사용하라 - 코드의 의도를 명시하라 - 표준화 등 많은 의미를 함축하는 단어로 주석을 간단하게 만들어라
P.101 ~ P.119
- 조건문에서 인수의 순서 : if (변화하는 값 ≤ 안정적인(고정적인) 값) - if/else 블록 순서 : 긍정적이고, 쉽고 흥미로운 경우를 앞에 놓아라. ⇒ 분홍색 코끼리는 생각하지 마세요 - 삼항연산자(cond ? a : b), do/while 루프, goto는 가독성을 떨어뜨린다 - 선형적인 코드를 추구하라
P.120 ~ P.131
- 커다란 표현을 쪼개는 가장 쉬운 방법은 하위 표현을 담을 추가 변수(설명 변수)를 만드는 것이다 - 드모르간의 법칙 : not을 분배하고 and/or을 바꿔라 1) not (a or b) == (not a) and (not b) 2) not (a and b) == (not a) or (not b)
P.132 ~ P.150
* 변수와 가독성 - 변수 제거하기 : 임시, 중간결과, 흐름제어 역할의 변수는 제거하는 게 좋다 - 변수 범위 좁히기 : 전역 변수 피하기. 자바스크립트에서 변수를 항상 var와 함께 선언하고 변수의 범위를 함수 내부로 국한시키는 것이 좋다 - 값을 한 번만 할당하는 변수를 선호하라 (const 키워드 사용)
P.151 ~ P.190
- 일반적인 목적의 코드를 프로젝트의 특정 코드에서 분리하라 - 한 번에 하나의 작업만 수행하도록 코드를 재구성한다 - 생각을 코드로 만들기 ⇒ 고무오리 기법(Rubber Duck Debugging) ⇒ 통찰은 종종 단순히 문제를 큰소리로 설명하면서 발견된다! https://ko.wikipedia.org/wiki/고무_오리_디버깅
P.191 ~ P.222
* 코드베이스를 작게 유지하기 - 사용하지 않는 코드 제거하기 - 주변에 있는 라이브러리를 적극 활용하기 - 일반 프로그래머가 하루에 출시가능한shippable 코드는 평균 10줄 정도다 * 테스트와 가독성 - 각 테스트의 최상위 수준은 간결해야 한다. - 테스트 실패시 버그 추적과 수정에 도움이 될 만한 에러메시지를 출력해야 한다 - 무엇이 테스트되는지 분명하게 드러나도록 테스트 함수에 충분한 설명이 포함된 이름을 부여하라
P.223 ~ P.242
* 예제 : 분/시간 카운터 - ConveyorQueue : 시스템이 허락하는 한도 내에서 무제한의 크기를 갖는 큐로서 옆으로 한 칸 움직일 우 있으며, 큐 안에 담긴 모든 항목의 총합을 관리한다 - TrailingBucketCounter : 시간의 흐름에 따라서 ConveyorQueue를 옆으로 한 칸 이동시키고, (현재 시간에 가장 가까운 최근) 시간 구간의 카운트를 저장한다 - MinuteHourCounter : TrailingBucketCounter 두 개를 보관한다. 하나는 1분, 다른 하나는 1시간에 대한 카운트용이다