---
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
