복잡성의 본질과 모듈 설계
소프트웨어 엔지니어링의 본질은 코드를 많이 짜는 것이 아니라, 복잡성의 누적을 억제하여 시스템을 영원히 수정 가능한 상태로 지키는 것이다.
이 지도는 존 아우스터하우트(John Ousterhout)의 통찰을 바탕으로, 소프트웨어 시스템이 왜 시간이 갈수록 다루기 고통스러워지는지, 그리고 이를 막기 위해 모듈과 인터페이스를 어떻게 빚어야 하는지 다룬다.
생각의 지도 (Topic Map)
flowchart TD TOP["복잡성의 본질과 모듈 설계"] TOP --> C1["소프트웨어 복잡성의 세 가지 증상"] TOP --> C2["깊은 모듈과 정보 은닉"] TOP --> C3["오류를 존재하지 않도록 정의하기"] TOP --> C4["전술적 프로그래밍과 전략적 프로그래밍"] C1 -.->|복잡성의 2대 원인 차단| C2 C2 -.->|인터페이스 극소화 및 예외 소멸| C3 C1 -.->|점진적 누적을 막는 투자 규율| C4 class TOP,C1,C2,C3,C4 internal-link;
핵심 개념 노트
- 소프트웨어 복잡성의 세 가지 증상:
복잡성의 본질, 변경 증폭·인지 부하·미지의 미지라는 3대 징후, 그리고 의존성과 모호성의 상호작용. - 깊은 모듈과 정보 은닉:
모듈의 직사각형 면적 모델, 클래스염(Classitis) 비판, 시간적 분해의 함정, 복잡성을 아래로 끌어내리는 설계. - 오류를 존재하지 않도록 정의하기:
분산 시스템 장애의 92%를 차지하는 예외 처리의 덫, 의미론 재정의를 통한 특수 케이스 제거, 마스킹과 집합화. - 전술적 프로그래밍과 전략적 프로그래밍:
동작만 시키는 지름길의 유혹, 전술적 토네이도의 해악, 10~20% 설계 투자 법칙, ‘두 번 설계하라’의 실천.
출처
- A Philosophy of Software Design: 존 아우스터하우트의 소프트웨어 설계 철학 정본.