p.83~162 TDD로 문제를 해결해 나가면서 자연스럽게 알고리즘이 나온다. 테스트를 통과시키기 위해 너무 많은 구현을 해야 한다면, 작성한 테스트를 지우고 더 단순한 테스트를 작성. BDD, Given, When, Then. TDD와 같다. 테스트 대역 - 더미, 스텁, 스파이, 모의 객체, 가짜. 테스트에 확실함을 요구하면 테스트는 유연하지 않게 되고 테스트에 유연성을 요구하면 확실함은 줄어든다. DB 테스트. DB를 테스트하지 마라, DB를 비즈니스 규칙과 분리. 테스트 데이터베이스를 만들어서 테스트한다. 백업 활용. GUI 테스트. GUI를 테스트하지 마라. 데이터를 확인한다.
~p.82 소프트웨어에 대한 수요는 엄청 늘고 있지만 소프트웨어를 만드는 프로그래머들 중에 장인의 수는 매우 적다. 규율, 기준, 윤리를 배우며 소프트웨어 장인의 길을 찾자. 테스트 주도 개발. 리팩터링. 단순한 설계. 공동 프로그래밍. 인수 테스트. TDD에 대한 이야기, 예제를 통해 하나의 단계씩 진행하며 설명. Stack과 볼링 점수를 계산하는 프로그램을 만든다.
p.391~440 액션의 순서를 타임라인 다이어그램으로 나타내기. 액션은 실행 시점과 횟수가 중요한데, 이를 분석하기 위한 방식이다. 싱글 스레드를 가진 자바스크립트의 특성상 타임라인을 단순화할 수 있다. 비동기 처리가 중요한데, 책에서는 콜백을 소개하고 있지만 Promise 객체를 활용하면 훨씬 편리할 것 같다.
p.355~390 중첩 데이터 구조를 변경하기 위하여 재귀 함수를 활용한다. 재귀를 안전하게 사용하려면 종료 조건이 있어야 하고, 재귀 호출을 해야 하고, 재귀 호출을 할수록 종료 조건에 다가가야 한다. 종료 조건이 빈 배열이라면, 재귀 함수의 각 호출에서 배열의 항목을 하나씩 없애야 한다. 그렇지 않으면 무한 반복. 데이터 구조가 중첩되어 있다면 편리함을 위해 추상화 벽을 사용.
p.301~354 map, filter, reduce. 자바스크립트에서 배열의 메소드로 주로 사용하다가 함수로 보니 색다로웠다. reduce는 map, filter는 물론 다양한 것들을 할 수 있다. 함수형 도구 체이닝. 함수의 결괏값으로 또 다른 함수를 호출하고 반복한다. 선언적으로 코드를 작성할 수 있다. 데이터 변화의 흐름을 파악하기 쉽다.
p.231~265 일급 값, 변수에 저장이 가능하고 함수의 인자와 리턴값으로 사용될 수 있다. +와 같은 연산자도 함수를 만들어 일급으로 사용할 수 있다. 아래와 같은 plus 함수를 굳이 왜 만들까? 라고 생각했던 적이 있었는데 이해가 확 됐다. const plus = (a, b) => a + b; 고차 함수, 함수를 인자로 넘기로 리턴값으로 사용할 수 있는 함수. 함수를 인자로 받으면 다양한 동작을 추상화할 수 있다. 함수 이름에 있는 암묵적 인자를 하드 코딩에서 명시적 인자로 리팩토링. 본문을 콜백으로 바꾸기.
p.201~230 추상화 벽. 세부 구현을 감춘 함수로 이루어져 있다. 알 필요가 없는 부분은 내부에 감춰놓는다. 데이터 구조가 바뀌더라도 추상화 벽 위에 있는 함수는 신경쓸 필요가 없다. 데이터 구조가 아닌 '아이템을 추가한다' 라는 것이 중요하기 때문. 작은 인터페이스. 추상화 벽 위의 계층에 코드를 추가하는 것이 좋다. 편리한 계층. 개발을 하기에 당장 편리하다면 너무 설계에 연연할 필요는 없다. 자주 바뀌는 코드는 계층의 위쪽에, 아래쪽에 있는 함수 테스트하기, 계층이 낮을수록 재사용하기 좋다. p. ~58 빨간색 줄 - 가장 중요한 곳, 객관적으로 가장 핵심인 곳 파란색 줄 - 일반적으로 중요한 곳, 객관적으로 중요한 곳 초록색 줄 - 개인적으로 재밌는 곳, 남들이 밑줄 긋지 않았을 ..
p.154~200 방어적 복사, 깊은 복사를 한다. JavaScript에서는 lodash의 _.cloneDeep 사용을 권장한다. 외부에서 안전한 코드로 데이터가 들어오면 깊은 복사, 데이터 변경, 종료 or 깊은 복사후 return 데이터가 안전한 코드에서 밖으로 나갈때 깊은 복사를 하고 return 카피-온-라이트, 방어적 복사는 둘 다 상황에 따라 필요하다. 계층형 설계. 추상화 레벨을 맞춘다. 같은 계층끼리는 같은 목적을 가져야 한다. 서로 호출하면 안 되고 아래 계층을 바라봐야 한다. 계층형 설계 패턴인 '직접 구현'.