객체지향 파이썬 프로그래밍 [파이썬 고급 기능으로 강력한 애플리케이션 개발]
- 원서명Mastering Object-oriented Python (ISBN 9781783280971)
- 지은이스티븐 로트(Steven F. Lott)
- 옮긴이심지현
- ISBN : 9788960779754
- 45,000원
- 2017년 02월 17일 펴냄
- 페이퍼백 | 792쪽 | 188*235mm
- 시리즈 : acorn+PACKT
판매처
개정판책 소개
소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/object-oriented-python)
요약
파이썬의 내장 기능을 활용해 강력한 애플리케이션을 개발하려면 객체지향 파이썬을 완벽하게 이해해야 한다. 이 책은 크게 세 가지 주제를 다룬다. 첫째, 파이썬의 내부 요소와 매끄럽게 통합되는 클래스를 생성할 수 있는 스페셜 메소드를 설명한다. 둘째, 객체를 파일이나 데이터베이스에 지속시키는 방법을 살펴본다. 끝으로 일관적인 개발과 유지 보수를 위한 테스트와 디버깅, 설명서 작성법을 다룬다. 객체지향의 관점에서 여러 디자인 패턴을 소개하고, 상세한 예제를 제공해 이해를 돕는다.
이 책에서 다루는 내용
■ init() 메소드의 다양한 디자인 패턴 이해
■ 파이썬3 추상 기반 클래스의 기본 기능과 이를 애플리케이션에서 사용하는 방법
■ with문을 활용해 콜러블 객체와 컨텍스트 매니저 디자인
■ JSON, YAML, Pickle, CSV, XML과 같은 형태로 객체 직렬화 수행
■ 정교한 로컬 데이터베이스로서 셸브 모듈 활용
■ 내장 SQLite 모듈을 사용해 파이썬 객체를 SQL 데이터베이스와 맵핑
■ RESTful 웹 서비스로 파이썬 객체 전송
■ doctest와 unittest.mock 모듈의 사용법을 포함해 자동 단위 테스트 전략을 고안
■ 커맨드 라인 인자를 파싱해 설정 파일과 환경 변수에 통합
이 책의 대상 독자
이 책은 고급 파이썬을 다루기 때문에 파이썬 3에 익숙해야 한다. 상당히 크거나 복잡한 문제를 해결해야 할 때 도움을 받을 수 있다.
다른 언어에 숙련된 프로그래머라면 언어를 파이썬으로 변경할 때 도움을 받을 수 있다. 이 책은 문법이나 기타 기본적인 개념은 소개하지 않는다.
고급 파이썬 2 프로그래머는 파이썬 3로 변경할 때 도움을 받을 수 있다. (버전 2에서 3로 옮기는 등의) 전환 유틸리티나 (six처럼) 병립하는 라이브러리는 다루지 않는다. 이 책은 전적으로 파이썬 3에서만 볼 수 있는 새로운 개발에 집중한다.
이 책의 구성
0장, ‘준비’에서는 단위 테스트와 doctest, docstring, 스페셜 메소드명과 같이 미리 알아야 할 주제를 다룬다.
1부, ‘스페셜 메소드를 통한 파이썬 다운 클래스’에서는 애플리케이션의 클래스 정의를 파이썬의 내장 기능에 맞게 통합하는 방법과 객체지향 프로그래밍 기법을 자세히 살펴본다. 1부는 다음과 같이 총 9개의 장으로 구성된다.
1장, ‘init() 메소드’에서는 init() 메소드의 상세한 설명과 구현을 제공한다. 단순 객체를 위한 다양한 유형의 초기화를 살펴본다. 이를 기반으로 컬렉션과 컨테이너를 포함하는 좀 더 복잡한 객체도 알아본다.
2장, ‘파이썬과 매끄러운 통합: 기초 스페셜 메소드’에서는 간단한 클래스 정의를 확장해 스페셜 메소드를 추가하는 방법을 상세히 설명한다. 무엇을 오버라이드해야 하고 언제 실제로 필요한지 알려면 객체로부터 상속받은 기본 동작 방식을 알아야 한다.
3장, ‘속성 접근과 프로퍼티, 디스크립터’에서는 기본 처리가 어떻게 동작하는지 자세히 살펴본다. 언제 어디서 기본 동작을 오버라이드할지 정해야 한다. 또한 디스크립터를 분석하고, 파이썬의 내부 동작 방식을 훨씬 더 깊이 이해해야 한다.
4장, ‘일관적인 디자인의 ABC’에서는 collections.abc 모듈에 들어 있는 추상 기반 클래스를 전반적으로 살펴본다. 수정하거나 확장할 다양한 컨테이너와 컬렉션의 일반적인 개념을 알아본다. 이와 비슷하게 구현할 숫자의 개념도 알아본다.
5장, ‘콜러블과 컨텍스트 사용’에서는 contextlib에 있는 도구를 사용해 컨텍스트 매니저를 생성하는 방법을 알아본다. 콜러블 객체의 수많은 변형 디자인을 선보인다. 이를 통해 상태 기반 콜러블 객체가 단순한 함수보다 더 유용한 이유를 알아본다. 바로 뛰어들어 사용자만의 컨텍스트 매니저를 작성하기 전에 먼저 기존 파이썬 컨텍스트 매니저를 사용하는 방법을 알아본다.
6장, ‘컨테이너와 컬렉션 생성’에서는 컨테이너 클래스의 기초를 설명한다. 컨테이너로 만든 후 컨테이너가 제공하는 다양한 기능을 제공할 수 있는 다양한 스페셜 메소드를 복습한다. 내장 컨테이너를 확장해 기능을 추가하는 방법도 알아본다. 또한 내장 컨테이너를 래핑하고 래퍼를 통해 메소드를 하위 컨테이너에 위임하는 방법도 살펴본다.
7장, ‘수 생성’에서는 +, -, *, /, //, %, ** 같은 필수 산술 연산자를 다룬다. 또한 <,>, <=,>=, ==, != 같은 비교 연산자도 알아본다. 새로운 수를 확장하거나 생성하는 디자인 고려 사항을 요약하며 끝낸다.
8장, ‘장식자와 믹스인: 횡단 관점’에서는 간단한 함수 장식자와 매개변수를 갖는 함수 장식자, 클래스 장식자, 메소드 장식자를 다룬다.
2부, ‘지속성과 직렬화’에서는 영속 객체를 다룬다. 영속 객체는 저장소 매체에 직렬화된다. 주로 JSON으로 변환해 파일 시스템에 사용한다. ORM 계층은 객체를 데이터베이스에 저장할 수 있다. 2부에서는 지속성을 다루는 여러 대안을 살펴보며, 다음과 같은 5개의 장으로 구성된다.
9장, ‘직렬화와 저장: JSON, YAML, Pickle, CSV, XML’에서는 JSON과 YAML, pickle, XML, CSV 같은 다양한 데이터 표현에 초점을 맞춘 라이브러리를 사용해 간단한 지속성을 다룬다.
10장. ‘셸브를 통한 객체 저장과 추출’에서는 shelve와 dbm 같은 파이썬 모듈로 기초적인 데이터베이스 연산을 설명한다.
11장, ‘SQLite를 통한 객체 저장과 추출’에서는 SQL과 관계형 데이터베이스라는 좀 더 복잡한 세계로 이동한다. SQL의 특징은 객체지향 프로그래밍의 특징과 일치하지 않으므로 임피던스 불일치 문제가 생긴다. 일반적으로 ORM 계층을 사용해 넓은 도메인의 객체를 지속시킨다.
12장, ‘객체 전송과 공유’에서는 객체를 전송하기 위한 HTTP 프로토콜과 JSON, YAML, XML 표현을 알아본다.
13장, ‘설정 파일과 지속성’에서는 설정 파일로 파이썬 애플리케이션을 동작시키는 다양한 방법을 다룬다.
3부, ‘테스트와 디버깅, 배포, 유지 보수’에서는 데이터를 수집해 고성능 프로그램을 지원하고 디버깅하는 방법을 알아본다. 지원에 따른 혼란과 복잡도를 감소시키기 위해 가능한 한 가장 좋은 설명서를 생성하는 데 필요한 정보를 제공한다. 다음과 같은 5개의 장으로 구성된다.
14장, ‘로깅과 경고 모듈’에서는 logging과 warning 모듈을 이용해 감사와 디버그 정보를 생성하는 방법을 알아본다. 이를 통해 print() 함수를 사용하는 것보다 더 의미 있는 단계로 나아간다.
15장, ‘테스트 가능한 디자인’에서는 테스트 가능한 디자인과 unittest 및 doctest의 사용법을 다룬다.
16장, ‘커맨드라인 처리’에서는 옵션과 매개변수를 파싱하는 argparse 모듈의 사용법을 살펴본다. 한걸음 더 나아가 명령 디자인 패턴을 사용해 셸 스크립트를 작성하지 않고도 합쳐지고 확장될 수 있는 프로그램 컴포넌트를 생성한다.
17장, ‘모듈과 패키지 디자인’에서는 모듈과 패키지 디자인을 다룬다. 이러한 디자인은 좀 더 높은 수준의 고려 사항이다. 모듈 내에 연관된 클래스와 패키지 내에 연관된 모듈을 살펴본다.
18장, ‘품질과 설명서’에서는 소프트웨어가 올바르고 적절히 구현됐다는 신뢰를 쌓을 수 있는 디자인 설명서를 작성하는 방법을 다룬다.
목차
목차
- 0장. 준비
- 카지노 블랙잭
- 게임 시작
- 블랙잭 플레이어 전략
- 블랙잭 시뮬레이션의 객체 디자인
- 성능 측정: timeit 모듈
- 테스트: unittest와 doctest
- 단위 테스트와 기술 스파이크
- 문서화 문자열: RST 마크업과 설명서 도구
- IDE 선택
- 스페셜 메소드명
- 요약
- 카지노 블랙잭
- 1부, 스페셜 메소드를 통한 파이썬다운 클래스
- 1장. init () 메소드
- 내포된 최상위 클래스: object
- 기반 클래스 객체 init() 메소드
- 최상위 클래스에서 init () 구현
- init () 으로 매니페스트 상수 생성
- 팩토리 함수로 init () 활용
- 불완전한 팩토리 디자인과 모호한 else절
- elif 시퀀스를 이용한 단순화와 일관성
- 매핑과 클래스 객체를 이용한 단순화
- 두 병렬 매핑
- 튜플 값에 매핑
- 부분 함수 방식
- 팩토리용 플루언트 API
- 각 하위 클래스에서 init () 구현
- 단순 복합 객체
- 컬렉션 클래스 래핑
- 컬렉션 클래스 확장
- 추가적인 요구 사항과 또 다른 디자인
- 복잡한 복합 객체
- 복합 객체 초기화
- init() 이 필요 없는 상태가 없는 객체
- 복합 객체 초기화
- 추가 클래스 정의
- 다중 전략 init ()
- 좀 더 복잡한 초기화 방법
- 정적 메소드 초기화
- 기타 init () 기법
- 타입 검사를 포함하는 초기화
- 초기화, 캡슐화, 프라이버시
- 요약
- 2장. 파이썬과 매끄러운 통합: 기초 스페셜 메소드
- repr ()과 str () 메소드
- 컬렉션이 아닌 str ()과 repr ()
- 컬렉션의 str ()과 repr ()
- format () 메소드
- 중첩 포맷 명세
- 컬렉션과 포맷 명세 위임
- hash () 메소드
- 해시 선택
- 불변 객체의 정의 상속
- 불변 객체 정의 오버라이딩
- 가변 객체 정의 오버라이딩
- 가변 핸드로부터 불변 핸드 생성
- bool () 메소드
- bytes () 메소드
- 비교 연산자 메소드
- 비교 연산 디자인
- 같은 클래스의 객체 비교 구현
- 서로 다른 클래스의 객체 비교 구현
- 하드 점수와 소프트 점수, 다형성
- 서로 다른 클래스 비교 예제
- del () 메소드
- 참조 계수와 소멸
- 순환 참조와 가비지 컬렉션
- 순환 참조와 weakref 모듈
- del ()과 close() 메소드
- new () 메소드와 불변 객체
- new () 메소드와 메타클래스
- 메타클래스 예제 1: 속성 정렬
- 메타클래스 예제 2: 자기 참조
- repr ()과 str () 메소드
- 요약
- 기본 속성 처리
- 속성과 init () 메소드
- 프로퍼티 생성
- 즉시 계산 속성
- 세터와 딜리터 프로퍼티
- 스페셜 메소드로 속성 접근
- slots 을 포함하는 불변 객체 생성
- 튜플 하위 클래스로서 불변 객체 생성
- 즉시 계산 속성
- getattribute () 메소드
- 디스크립터 생성
- 비데이터 디스크립터 사용
- 데이터 디스크립터 사용
- 요약, 디자인 고려 사항, 트레이드오프
- 프로퍼티와 속성
- 디스크립터로 디자인
- 예고
- 추상 기반 클래스
- 기반 클래스와 다형성
- 콜러블
- 컨테이너와 컬렉션
- 수
- 기타 추상화
- 반복자 추상화
- 컨텍스트와 컨텍스트 매니저
- abc 모듈
- 요약, 디자인 고려 사항, 트레이드오프
- 예고
- 예고
- ABC 콜러블로 디자인
- 성능 향상
- 메모이제이션이나 캐싱 사용
- functools를 사용한 메모이제이션
- 콜러블 API로 단순성 추구
- 복잡도와 콜러블 API
- 컨텍스트 관리와 with문
- 십진 컨텍스트 사용
- 기타 컨텍스트
- enter ()와 exit () 메소드 정의
- 예외 처리
- 팩토리로서의 컨텍스트 매니저
- 컨텍스트 매니저 삭제
- 요약
- 콜러블의 디자인 고려 사항과 트레이드오프
- 컨텍스트 매니저의 디자인 고려 사항과 트레이드오프
- 예고
- 컬렉션의 추상 기반 클래스
- 스페셜 메소드 예제
- 표준 라이브러리 확장 사용
- namedtuple() 함수
- deque 클래스
- ChainMap 유스케이스
- OrderedDict 컬렉션
- defaultdict 하위 클래스
- Counter 컬렉션
- 새로운 종류의 컬렉션 생성
- 새로운 종류의 시퀀스 정의
- 통계 리스트
- 즉시 계산과 지연 계산
- getitem (), setitem (), delitem (), 슬라이스 이용
- getitem (), setitem (), delitem () 구현
- 리스트 래핑과 위임
- iter ()로 반복자 생성
- 새로운 종류의 매핑 생성
- 새로운 종류의 집합 생성
- 디자인 원리
- Tree 클래스 정의
- TreeNode 클래스 정의
- 이진 트리 집합 실험
- 요약
- 디자인 고려 사항과 트레이드오프
- 예고
- 수의 추상 기반 클래스
- 사용할 타입 결정
- 메소드 결정과 반사 연산자
- 산술 연산자의 스페셜 메소드
- 수 클래스 생성
- FixedPoint 초기화 정의
- FixedPoint 이항 산술 연산자 정의
- FixedPoint 단항 산술 연산자 정의
- FixedPoint 반사 연산자 구현
- FixedPoint 비교 연산자 구현
- 수 해시 계산
- 좀 더 유용한 반올림 디자인
- 기타 스페셜 메소드 구현
- 할당 연산자로 최적화
- 요약
- 디자인 고려 사항과 트레이드오프
- 예고
- 클래스와 의미
- 함수 구성
- 클래스 구성
- 클래스 디자인 원리
- 관점 지향 프로그래밍
- 내장 장식자 사용
- 표준 라이브러리 장식자 사용
- 표준 라이브러리 믹스인 클래스 사용
- 컨텍스트 매니저 믹스인 클래스 사용
- 클래스 기능 중지
- 간단한 함수 장식자 작성
- 별도 로거 생성
- 장식자의 매개변수
- 메소드 함수 장식자 생성
- 클래스 장식자 생성
- 클래스에 메소드 함수 추가
- 보안을 위한 장식자
- 요약
- 디자인 고려 사항과 트레이드오프
- 예고
- 지속성과 클래스, 상태, 표현
- 일반적인 파이썬 용어
- 파일 시스템과 네트워크 고려 사항
- 지속성을 지원하는 클래스 정의
- 블로그와 포스트 렌더링
- JSON으로 덤프와 로드
- 예제 클래스에서 JSON 지원
- 맞춤형 JSON 인코딩
- 맞춤형 JSON 디코딩
- 보안과 eval() 이슈
- 인코딩 함수 리팩토링
- 날짜 문자열 표준화
- JSON을 파일에 쓰기
- YAML로 덤프와 로드
- YAML 데이터를 파일에 포매팅
- YAML 표현 확장
- 보안과 안전 로드
- 피클로 덤프와 로드
- 안정적인 피클 처리를 위한 클래스 디자인
- 보안과 전역 이슈
- CSV로 덤프와 로드
- 간단한 시퀀스를 CSV로 덤프
- CSV로부터 간단한 시퀀스 로드
- 컨테이너와 복잡한 클래스 처리
- CSV 파일에 다양한 행 타입 덤프와 로드
- 반복자로 CSV 행 필터링
- CSV 파일에 조인 행 덤프와 로드
- XML로 덤프와 로드
- 문자열 템플릿을 사용한 객체 덤프
- xml.etree.ElementTree로 객체 덤프
- XML 문서 로드
- 요약
- 디자인 고려 사항과 트레이드오프
- 스키마 진화
- 예고
- 영속 객체 유스케이스 분석
- ACID 속성
- 셸프 생성
- 객체의 키 디자인
- 객체의 대리 키 생성
- 간단한 키로 클래스 디자인
- 컨테이너나 컬렉션의 클래스 디자인
- 외래 키로 객체 참조
- 복잡한 객체의 CRUD 연산 디자인
- 데모 스크립트 작성
- 최상단 색인 생성
- 스키마 진화
- 디자인 고려 사항과 트레이드오프
- 애플리케이션 소프트웨어 계층
- 예고
- SQL 데이터베이스, 지속성, 객체
- SQL 데이터 모델: 행과 테이블
- SQL DML문을 통한 CRUD 처리
- SQL SELECT문으로 행 쿼리
- SQL 트랜잭션과 ACID 속성
- 기본 키와 외래 데이터베이스 키 디자인
- SQL로 애플리케이션 데이터 처리
- 순수 SQL로 클래스와 유사한 처리 구현
- 파이썬 객체와 SQLite BLOB 열 매핑
- 파이썬 객체와 데이터베이스 행 수동 매핑
- SQLite의 접근 계층 디자인
- 컨테이너 관계 구현
- 색인으로 성능 향상
- ORM 계층 추가
- ORM 친화적인 클래스 디자인
- ORM 계층으로 스키마 생성
- ORM 계층으로 객체 조작
- 태그 문자열로 포스트 객체에 쿼리
- 색인으로 성능 향상
- 스키마 진화
- 요약
- 디자인 고려 사항과 트레이드오프
- 매핑 대안
- 키와 키 디자인
- 애플리케이션 소프트웨어 계층
- 예고
- 클래스, 상태, 표현
- HTTP와 REST를 사용한 객체 전송
- REST를 통한 CRUD 연산 구현
- 비CRUD 연산 구현
- REST 프로토콜과 ACID
- JSON이나 XML, YAML 표현 선택
- REST 서버 구현: WSGI와 mod_wsgi
- 간단한 REST 애플리케이션과 서버 생성
- REST 클라이언트 구현
- RESTful 서비스 데모와 단위 테스트
- 콜러블 클래스를 사용한 WSGI 애플리케이션
- RESTful 객체 식별자 디자인
- 다중 계층 REST 서비스
- 룰렛 서버 생성
- 룰렛 클라이언트 생성
- 안전한 REST 서비스 생성
- WSGI 인증 애플리케이션
- 웹 애플리케이션 프레임워크로 REST 구현
- 메시지 큐를 사용한 객체 전송
- 프로세스 정의
- 큐 생성과 데이터 제공
- 요약
- 디자인 고려 사항과 트레이드오프
- 스키마 진화
- 애플리케이션 소프트웨어 계층
- 예고
- 설정 파일 유스케이스
- 표현과 지속성, 상태, 사용성
- 애플리케이션 설정 디자인 패턴
- 객체 생성을 통한 설정
- 설정 계층 구조 구현
- INI 파일에 설정 저장
- eval() 변형으로 더 많은 리터럴 처리
- PY 파일에 설정 저장
- 클래스 정의를 통한 설정
- SimpleNamespace를 통한 설정
- 파이썬의 exec()를 사용한 설정
- exec()을 걱정할 필요가 없는 이유
- 체인맵을 사용한 기본 값과 오버라이드
- JSON이나 YAML에 설정 저장
- 플랫 JSON 설정 사용
- YAML 설정 로딩
- 프로퍼티 파일에 설정 저장
- 프로퍼티 파일 파싱
- 프로퍼티 파일 사용
- XML 파일에 설정 저장: PLIST 등
- 맞춤형 XML 설정 파일
- 요약
- 디자인 고려 사항과 트레이드오프
- 공유 설정 생성
- 스키마 진화
- 예고
- 기본 로그 생성
- 클래스단 공유 로거 생성
- 로거 설정
- 로깅 시스템 가동과 중지
- 로거 명명
- 로거 레벨 확장
- 다수의 목적지를 위한 핸들러 정의
- 전달 규칙 관리
- 설정 주의 사항
- 제어와 디버그, 감사, 보안을 위한 특수 로깅
- 디버깅 로그 생성
- 감사와 보안 로그 생성
- 경고 모듈 사용
- 경고로 API 변경 알림
- 경고로 설정 문제 알림
- 경고로 가능한 소프트웨어 문제 알림
- 고급 로깅: 최근 메시지와 네트워크 데스티네이션
- 자동 테일 버퍼 생성
- 원격 프로세스에 로깅 메시지 전송
- 큐 초과 방지
- 요약
- 디자인 고려 사항과 트레이드오프
- 예고
- 테스트 단위의 정의와 분리
- 종속성 최소화
- 간단한 단위 테스트 생성
- 테스트 스위트 생성
- 에지와 코너 케이스 넣기
- 테스트 종속성 모킹
- 더 많은 동작을 테스트하는 목 객체 사용
- doctest를 사용한 테스트 케이스 정의
- doctest와 unittest 결합
- 더욱 완전한 테스트 패키지 생성
- 설정과 해제 사용
- OS 자원에 대한 설정과 해제 사용
- 데이터베이스에 대한 설정과 해제 사용
- TestCase 클래스 계층 구조
- 외부에서 정의한 예상 결과 사용
- 자동 통합 또는 성능 테스트
- 요약
- 디자인 고려 사항과 트레이드오프
- 예고
- OS 인터페이스와 커맨드라인
- 인자와 옵션
- argparse로 커맨드라인 파싱
- 간단한 온오프 옵션
- 인자가 있는 옵션
- 위치 인자
- 기타 인자
- --version 표시와 종료
- --help 표시와 종료
- 커맨드라인 옵션과 환경 변수 통합
- 좀 더 설정 가능한 기본 값 제공
- 환경 변수로 설정 파일 값 오버라이딩
- 설정 파일로 환경 변수 오버라이딩
- 설정에 None 값 할당
- 도움말 출력 맞춤화
- 최상위 main() 함수 생성
- 설정의 DRY 원칙
- 중첩 설정 컨텍스트 관리
- 전체적 프로그래밍
- 명령 클래스 디자인
- 분석 명령 하위 클래스 추가
- 애플리케이션 내에 기능 추가와 패키징
- 상위의 복합 명령 디자인
- 추가 복합 명령 디자인 패턴
- 다른 애플리케이션과의 통합
- 요약
- 디자인 고려 사항과 트레이드오프
- 예고
- 모듈 디자인
- 모듈 디자인 패턴
- 모듈과 클래스
- 일반적인 모듈 구성
- 전체적 모듈과 독립 모듈
- 패키지 디자인
- 모듈-패키지 하이브리드 디자인
- 여러 구현을 포함하는 패키지 디자인
- 메인 스크립트와 main 모듈 디자인
- 실행 가능한 스크립트 파일 생성
- main 모듈 생성
- 전체 프로그래밍
- 실행 가능한 스크립트 파일 생성
- 장기 실행 애플리케이션 디자인
- src와 bin, test로 코드 조직
- 파이썬 모듈 설치
- 요약
- 디자인 고려 사항과 트레이드오프
- 예고
- help() 함수에 쓰일 문서화 문자열 작성
- pydoc을 사용한 설명서
- RST 마크업을 통한 출력 개선
- 텍스트 블록
- RST 인라인 마크업
- RST 디렉티브
- RST 배우기
- 효과적인 문서화 문자열 작성
- 모듈과 패키지를 포함하는 파일단 문서화 문자열 작성
- RST 마크업으로 상세 API 작성
- 클래스와 메소드 함수의 문서화 문자열 작성
- 함수 문서화 문자열 작성
- 더욱 정교한 마크업 기법
- 스핑크스를 사용한 설명서 생성
- 스핑크스 퀵스타트 사용
- 스핑크스 설명서 작성
- 설명서를 위한 4+1 뷰 작성
- 구현 문서 작성
- 스핑크스 교차 참조 생성
- 스핑크스 파일을 디렉토리로 리팩토링
- 설명서 작성
- 문학적 프로그래밍
- 문학적 프로그래밍 유스케이스
- 문학적 프로그래밍 도구 다루기
- 요약