책소개
디자인을 배우는 가장 좋은 방법은 예제에 있고,
소프트웨어 디자인의 가장 좋은 예는 프로그래머가 직접 사용하는 도구에 있다!
소프트웨어 디자인을 배우는 가장 좋은 방법은 다양한 예제를 연구하는 것이다. 그리고 프로그래머들이 일상적으로 사용하는 도구들에서 뛰어난 디자인 예제를 찾을 수 있다. 이 책에서는 프로그래머들이 사용하는 도구들의 소규모 버전을 만들어 이들을 명확히 이해하고 경험 많은 프로그래머들이 어떻게 사고하는지에 대한 통찰을 제공한다. 파일 백업 시스템, 테스트 프레임워크, 정규 표현식 매처, 브라우저 레이아웃 엔진, 아주 작은 컴파일러 등 다양한 사례를 통해 공통 설계 패턴을 탐구하고, 코드의 테스트 용이성이 재사용 용이성으로 이어짐을 보여주며, 디버거, 프로파일러, 패키지 매니저, 버전 관리 시스템이 어떻게 작동하는지 이해하여 이를 더 효과적으로 활용할 수 있도록 돕는다.
또한 이 도서는 저자가 소프트웨어 디자인을 교육하기 위한 교재로서 처음 집필된 도서로, 소프트웨어 관련 학부 수업 교재로 적합하다. 예시가 과도하게 추상적이지 않아 이해가 쉬우며, 연습 문제의 난이도가 마냥 낮지 않아 수업 후 과제로 사용하기 좋다.
목차
서문
CHAPTER 1 소개
1.1 누구를 위한 책인가요?
1.2 어떤 도구와 아이디어를 다루나요?
1.3 이 책은 어떻게 구성되어 있나요?
1.4 이 책을 만들게 된 이유는 무엇인가요?
1.5 사람들이 이 자료를 어떻게 사용하고, 기여할 수 있나요?
1.6 도움을 준 사람들
CHAPTER 2 시스템 프로그래밍
2.1 디렉터리를 나열하려면 어떻게 해야 할까요?
2.2 콜백 함수란 무엇인가요?
2.3 익명 함수란 무엇인가요?
2.4 원하는 파일들을 어떻게 선택할 수 있을까요?
2.5 선택한 파일들은 어떻게 복사할 수 있을까요?
2.6 연습
CHAPTER 3 비동기 프로그래밍
3.1 비동기 실행은 어떻게 관리할까요?
3.2 프로미스는 어떻게 작동하나요?
3.3 작업들은 어떻게 연결할 수 있을까요?
3.4 실제 프로미스는 어떻게 다를까요?
3.5 어떻게 프로미스를 사용해서 도구를 만들까요?
3.6 더 읽기 쉽게 만들 수 없을까요?
3.7 비동기 코드에서 에러를 어떻게 처리할 수 있을까요?
3.8 연습
CHAPTER 4 유닛 테스트
4.1 유닛 테스트는 어떻게 구성해야 하나요?
4.2 테스트 등록, 실행, 보고를 어떻게 분리할 수 있을까요?
4.3 테스트 등록은 어떻게 구성해야 하나요?
4.4 어떻게 테스트 커맨드라인 인터페이스를 구현할 수 있을까요?
4.5 연습
CHAPTER 5 파일 백업
5.1 파일을 어떻게 고유하게 식별할 수 있을까요?
5.2 파일을 어떻게 백업할 수 있을까요?
5.3 이미 백업된 파일을 추적하려면 어떻게 해야 하나요?
5.4 파일을 수정하는 코드는 어떻게 테스트할까요?
5.5 연습
CHAPTER 6 데이터 테이블
6.1 데이터 테이블은 어떻게 구현할 수 있을까요?
6.2 구현 성능을 어떻게 테스트할까요?
6.3 테이블을 저장하는 가장 효율적인 방법은 무엇일까요?
6.4 이진 저장이 성능을 향상시키나요?
6.5 연습
CHAPTER 7 패턴 매치
7.1 쿼리 셀렉터를 어떻게 매치시킬 수 있을까요?
7.2 간단한 정규 표현식 매처를 어떻게 구현할 수 있을까요?
7.3 확장 가능한 매처는 어떻게 구현할 수 있을까요?
7.4 연습
CHAPTER 8 표현식 해석하기
8.1 텍스트를 어떻게 토큰으로 나눌 수 있을까요?
8.2 토큰 목록을 어떻게 트리로 변환할까요?
8.3 연습
CHAPTER 9 페이지 템플릿
9.1 우리의 템플릿 시스템에서 코드는 어떻게 보일까요?
9.2 값을 어떻게 추적할 수 있을까요?
9.3 노드를 어떻게 처리할 수 있을까요?
9.4 노드 핸들러는 어떻게 구현할까요?
9.5 제어 흐름은 어떻게 구현하나요?
9.6 이 모든 것을 어떻게 할 수 있었나요?
9.7 연습
CHAPTER 10 빌드 매니저
10.1 빌드 매니저에는 어떤 내용이 있나요?
10.2 어디서부터 시작할까요?
10.3 오래된 파일은 어떻게 찾나요?
10.4 오래된 파일을 어떻게 업데이트하나요?
10.5 제네릭 빌드 규칙은 어떻게 추가할까요?
10.6 다음으로 무엇을 해야 하나요?
10.7 연습
CHAPTER 11 레이아웃 엔진
11.1 행과 열의 크기는 어떻게 조정할까요?
11.2 행과 열의 위치는 어떻게 배치할까요?
11.3 엘리먼트는 어떻게 렌더링하나요?
11.4 엘리먼트를 맞추기 위한 줄 바꿈은 어떻게 할까요?
11.5 어떤 CSS들을 지원할까요?
11.6 연습
CHAPTER 12 파일 보간기
12.1 자바스크립트를 어떻게 동적으로 평가할까요?
12.2 파일들은 어떻게 관리할까요?
12.3 파일은 어떻게 찾나요?
12.4 코드 조각은 어떻게 삽입할까요?
12.5 삽입 외의 방법은 없을까요?
12.6 연습
CHAPTER 13 모듈 로더
13.1 네임스페이스는 어떻게 구현할까요?
13.2 모듈은 어떻게 로드하나요?
13.3 순환 종속성을 처리해야 하나요?
13.4 모듈이 다른 모듈을 어떻게 로드할까요?
13.5 연습
CHAPTER 14 스타일 체커
14.1 자바스크립트를 파싱해서 AST를 만들려면 어떻게 해야 하나요?
14.2 AST에서 무언가를 찾으려면 어떻게 해야 하나요?
14.3 어떻게 검사를 적용할 수 있을까요?
14.4 AST 워커는 어떻게 작동할까요?
14.5 AST 워커가 작동하는 다른 방식은 무엇일까요?
14.6 할 수 있는 다른 종류의 분석은 무엇일까요?
14.7 연습
CHAPTER 15 코드 제너레이터
15.1 어떻게 함수를 다른 함수로 교체할 수 있을까요?
15.2 자바스크립트 코드를 어떻게 생성할 수 있을까요?
15.3 함수가 실행되는 빈도는 어떻게 측정할까요?
15.4 함수 실행 시간을 어떻게 측정할 수 있을까요?
15.5 연습
CHAPTER 16 문서 생성기
16.1 문서 주석을 추출하려면 어떻게 해야 할까요?
16.2 우리가 다룰 입력은 무엇인가요?
16.3 이름 중복을 피하려면 어떻게 해야 할까요?
16.4 코드는 데이터다
16.5 연습
CHAPTER 17 모듈 번들러
17.1 어떤 테스트 케이스를 사용하나요?
17.2 어떻게 종속성을 찾을 수 있을까요?
17.3 어떻게 여러 파일을 안전하게 하나로 결합할까요?
17.4 파일은 어떻게 서로 액세스할 수 있나요?
17.5 연습
CHAPTER 18 패키지 매니저
18.1 시맨틱 버전 관리란 무엇인가요?
18.2 어떻게 일관된 패키지 집합을 찾을 수 있을까요?
18.3 어떻게 제약 조건을 만족시킬 수 있을까요?
18.4 어떻게 작업을 줄일 수 있을까요?
18.5 연습
CHAPTER 19 가상 머신
19.1 가상 머신의 아키텍처는 무엇인가요?
19.2 이 명령을 어떻게 실행할까요?
19.3 어셈블러 프로그램은 어떻게 생겼나요?
19.4 어떻게 데이터를 저장할 수 있을까요?
19.5 연습
CHAPTER 20 디버거
20.1 어디서부터 시작할까요?
20.2 트레이싱 디버거는 어떻게 만들 수 있을까요?
20.3 어떻게 디버거를 대화형으로 만들까요?
20.4 대화형 애플리케이션을 어떻게 테스트할 수 있을까요?
20.5 연습
CHAPTER 21 결론
부록 A
부록 B
저자소개
출판사리뷰
CHAPTER 1 소개
이 책의 독자 대상, 사용 기술, 도서 구성, 책의 집필 동기 등을 소개하는 챕터입니다.
CHAPTER 2 시스템 프로그래밍
자바스크립트의 핵심 요소인 비동기 실행과 깊은 관련이 있는 콜백 함수를 배우고, 익명 함수 및 파일의 선택, 복사를 배우는 챕터입니다.
CHAPTER 3 비동기 프로그래밍
콜백 함수를 개선하여 비동기 프로그래밍을 더 쉽게 만들어 주는 기능인 프로미스와 해당 기능의 작동 방식을 설명하고, 프로미스와 동일한 핵심 기능을 제공하는 클래스를 직접 만들어 프로미스의 상세한 사용 방법을 배우는 챕터입니다.
CHAPTER 4 유닛 테스트
소프트웨어의 정상 작동을 확인하는 유닛 테스트를 작성하고 실행하는 도구의 사용법을 배웁니다. 유닛 테스트의 구성, 등록, 실행, 보고 및 인터페이스를 구현하는 방법까지 전반적으로 다루는 챕터입니다.
CHAPTER 5 파일 백업
해시를 이용한 파일 식별 방법과 백업 방법, 백업 파일 추적 및 테스트 방법을 소개하는 챕터입니다.
CHAPTER 6 데이터 테이블
데이터 테이블의 구현 방식과 연산 방법을 배우고, 구현한 데이터 테이블의 성능을 테스트해 봅니다. 또한 테이블을 저장하는 효율적인 방법을 알려주고, 이진 형태로 저장하는 것이 실제로 성능 향상에 도움이 되는지도 설명하는 챕터입니다.
CHAPTER 7 패턴 매치
정규 표현식을 만들어 보며, 동작 방식을 살펴보고 쿼리 셀렉터의 매치 방법, 정규 표현식 매처 구현, 이렇게 만든 매처의 확장 등을 배우는 챕터입니다.
CHAPTER 8 표현식 해석하기
앞 장에서 만든 정규 표현식을 해석하는 코드를 만드는 챕터입니다.
CHAPTER 9 페이지 템플릿
정적 사이트 생성기 구현에 필요한 페이지 템플릿 시스템을 만듭니다. 결과물로 일종의 프로그래밍 언어를 만들게 되고, 초보자와 숙련자의 이해도 차이를 실감하게 됩니다.
CHAPTER 10 빌드 매니저
자바스크립트와 같은 인터프리터 언어에서도 유용하게 사용할 수 있는 빌드 매니저를 만들어 봅니다. 빌드 매니저를 만들어 오래된 파일의 관리 방법을 배우고, 빌드 규칙의 추가법을 익히는 챕터입니다.
CHAPTER 11 레이아웃 엔진
작은 레이아웃 엔진을 직접 만들어 브라우저가 어디에 무슨 내용을 배치할지 결정하는 방식을 배우는 챕터입니다. 행과 열의 크기 조정, 배치, 엘리먼트의 렌더링 등을 자세히 배우게 됩니다.
CHAPTER 12 파일 보간기
파일 보간기를 만들어 파일을 관리, 평가하여 코드 조각 삽입하는 작업을 해 보는 챕터입니다.
CHAPTER 13 모듈 로더
코드를 실수로 덮어 쓰지 않도록, 로드 하는 내용을 캡슐화 하는 모듈 로더를 만들어 봅니다. 네임스페이스의 구현 방법, 모듈의 로드 방식, 순환 종속성의 처리 여부, 모듈 간의 로드 등을 다룹니다.
CHAPTER 14 스타일 체커
간단한 린터를 만들어 소스 코드를 파싱하여 데이터 구조를 만들고, 해당 구조 하에 규칙을 적용하는 방법을 소개하는 챕터입니다. 데이터 구조로는 추상 구문 트리를 사용합니다.
CHAPTER 15 코드 제너레이터
만든 코드의 모든 부분이 동작하는지 확인 제너레이터를 만드는 챕터입니다. 해당 도구를 통해 코드 각 라인을 적어도 한 번은 테스트할 수 있도록 하여 버그의 가능성을 줄여줍니다.
CHAPTER 16 문서 생성기
코드 내 주석 등을 분석하여 문서로 변환하는 도구를 만드는 챕터입니다. 해당 챕터에서 코드는 데이터라는 이 도서에서 가장 핵심적인 주제를 다시 한 번 언급해 줍니다.
CHAPTER 17 모듈 번들러
애플리케이션이 의존하는 모든 파일을 찾아서 이를 하나의 로드 가능한 파일로 결합하는 모듈 번들러를 구현해 보는 챕터입니다. 네트워크 요청을 한 번으로 줄여 훨씬 효율적인 동작을 가능케 하고, 의존성이 해결되는지 테스트되므로 실행 가능성을 확보해 줍니다.
CHAPTER 18 패키지 매니저
애플리케이션 설치에 필요한 각 요소를 체크하고 설정을 만들기 위해 설치해야 할 각 패키지의 버전을 확인하는 패키지 매니저를 만들어 보는 챕터입니다.
CHAPTER 19 가상 머신
자바스크립트가 변환되어 실행되는 과정을 이애할 수 있도록 프로세서를 시뮬레이션하여 실습하는 챕터입니다. 가상머신 하에서의 프로그램 실행과 데이터 저장, 어셈블러 프로그램의 구조 등을 배웁니다.
CHAPTER 20 디버거
디버거의 작동 원리를 이해하기 위해, 간단한 디버거를 만들어 프로그램들을 테스트해 보는 챕터입니다.
CHAPTER 21 결론
모든 내용을 마무리하는 챕터입니다.
작가의 말
소프트웨어 디자인을 배우는 가장 좋은 방법은 다양한 예제를 연구하는 것입니다. 그리고 프로그래머들이 일상적으로 사용하는 도구들에서 뛰어난 디자인 예제를 찾을 수 있습니다. 이 도서는 프로그래머들이 사용하는 도구들의 소규모 버전을 만들어 이들을 명확히 이해하고 경험 많은 프로그래머들이 어떻게 사고하는지에 대한 통찰을 제공합니다. 파일 백업 시스템, 테스트 프레임워크, 정규 표현식 매처, 브라우저 레이아웃 엔진, 아주 작은 컴파일러 등 다양한 사례를 통해 공통 설계 패턴을 탐구하고, 코드의 테스트 용이성이 재사용 용이성으로 이어짐을 보여주며, 디버거, 프로파일러, 패키지 매니저, 버전 관리 시스템이 어떻게 작동하는지 이해하여 이를 더 효과적으로 활용할 수 있도록 돕습니다.
이 책의 자료는 자기 주도 학습, 소프트웨어 설계에 관한 학부 과정 또는 현업에서 일하는 프로그래머를 위한 집중 주간 워크숍의 핵심 자료로 사용할 수 있습니다. 각 장에는 크기와 난이도가 다양한 연습 문제가 포함되어 있으며, 현대 자바스크립트의 기본 지식이 요구되지만, 언어의 고급 기능은 도서에서 소개하면서 설명하고 있습니다.