--- title: "SDF: Software Design for Flexibility — 전체 개요" tags: [source, SDF] source: "Software Design for Flexibility, Hanson & Sussman (2021)" chapter: overview updated: 2026-04-30 --- # Software Design for Flexibility — 전체 개요 ## 서지 정보 - **저자**: Chris Hanson, Gerald Jay Sussman - **출판**: MIT Press, 2021 - **부제**: How to Avoid Programming Yourself into a Corner - **라이선스**: CC BY-SA 4.0 - **관련**: SICP의 고급 후속편으로 볼 수 있음 ## 책의 핵심 주장 > "It would be nice if all we had to do to add a new feature to a program was to add some code, without changing the existing code base." 대부분의 소프트웨어는 요구사항 변화에 취약하게 설계된다. 이 책은 이 문제에 대한 대안으로 **가산적 프로그래밍(additive programming)**: 기존 코드를 수정하지 않고 코드를 추가해서 기능을 확장하는 스타일을 제안한다. 생물학적 시스템(진화적 적응성, 퇴화성, 탐색적 행동)에서 영감을 받은 설계 원칙들을 Scheme 코드로 구체화한다. ## 챕터별 핵심 주제 | 챕터 | 제목 | 핵심 기법 | 가산성 기여 | |------|------|-----------|------------| | 1 | Flexibility in Nature and in Design | 철학·원칙 | 전체 프레임워크 | | 2 | Domain-Specific Languages | 컴비네이터, 래퍼, 도메인 모델 | 믹스앤매치 부품 | | 3 | Variations on an Arithmetic Theme | 제네릭 프로시저, 자동 미분 | 핸들러 추가로 확장 | | 4 | Pattern Matching | 패턴 매처, 단일화, 항 재작성 | 규칙 추가로 확장 | | 5 | Evaluation | 인터프리터, lazy eval, amb, call/cc | 언어 자체를 확장 | | 6 | Layering | 레이어드 데이터/프로시저 | 수정 없이 메타데이터 추가 | | 7 | Propagation | 전파기, 의존성 백트래킹 | 배선도에 전파기 추가 | ## 기법들의 관계 ``` 가산적 프로그래밍 (Ch1 철학) │ ├── 컴비네이터/DSL (Ch2) ──────── 도메인 특화 언어의 기반 │ │ │ └── 컴비네이터 한계 → 제네릭 프로시저 (Ch3) │ │ │ 자동 미분 (Ch3.3) │ ├── 패턴 매칭 (Ch4) ──────────── 항 재작성, 타입 추론 │ │ │ └── 단일화 → 부분 정보 결합 │ ├── 인터프리터 (Ch5) ──────────── 언어 설계의 완전한 자유 │ │ │ └── amb → 비결정적 탐색 │ ├── 레이어링 (Ch6) ─────────────── 수정 없는 메타데이터 추가 │ │ │ └── 의존성 레이어 │ │ └── 전파 모델 (Ch7) ─────────────── 다방향 제약 + 의존성 백트래킹 ``` ## 공통 테마 ### 가산성 (Additivity) 모든 기법은 기존 코드를 수정하지 않고 새 기능을 추가하는 방식을 제공: - Ch2: 컴비네이터에 새 부품 추가 - Ch3: 제네릭 프로시저에 새 핸들러 추가 - Ch4: 규칙 시스템에 새 규칙 추가 - Ch5: 인터프리터에 새 표현식 타입 추가 - Ch6: 데이터에 새 레이어 추가 - Ch7: 배선도에 새 전파기 추가 ### 부분 정보 (Partial Information) 여러 챕터에서 부분적으로 알려진 정보를 결합하여 더 완전한 답을 얻는 패턴이 반복된다: - Ch4: 단일화로 타입 제약 결합 - Ch7: 구간 값과 전제를 가진 값들의 결합 ### 관심사의 분리 (Separation of Concerns) - Ch1: served spaces vs. servant spaces (아키텍처 유추) - Ch2: 도메인 모델 / 제어 구조 / 게임 규칙 분리 - Ch3: 디스패치 전략을 dispatch-store로 분리 - Ch6: 기본 계산과 메타데이터 처리 분리 ## 사용 언어: Scheme Scheme을 선택한 이유: 1. 최소한의 문법 (자연스러운 파스 트리 표현) 2. 허용적(permissive) 언어 — 산술 연산자의 동적 재정의 가능 3. first-class 프로시저, 렉시컬 스코핑 4. reified continuations (call/cc) 5. 동적 바인딩 정적 타입 시스템은 의도적으로 배제 — 유연성 전략의 지적 탐색을 저해하기 때문. ## 저자들의 배경 - Gerald Jay Sussman: Scheme 공동 창시자, MIT 교수, SICP 공저자 - Chris Hanson: MIT/GNU Scheme 주요 개발자, Google/Datera 경력 - 합산 100년 이상의 프로그래밍 경험 ## 챕터별 wiki 페이지 - [[SDF-ch1-flexibility]] — Ch1: Flexibility in Nature and in Design - [[SDF-ch2-dsl]] — Ch2: Domain-Specific Languages - [[SDF-ch3-generic-procedures]] — Ch3: Variations on an Arithmetic Theme - [[SDF-ch4-pattern-matching]] — Ch4: Pattern Matching - [[SDF-ch5-evaluation]] — Ch5: Evaluation - [[SDF-ch6-layering]] — Ch6: Layering - [[SDF-ch7-propagation]] — Ch7: Propagation