소프트웨어 설계 Map of Content
복잡성을 통제하고 신뢰성·확장성·유지보수성을 극대화하는 소프트웨어 아키텍처와 엔지니어링의 정본 지식 지도다. 상위 전체 지도는 위키 지식 개요를 참고한다.
이 지도가 있는 이유
“수정하기 쉬운 코드는 어떻게 설계하는가”, “모듈의 경계와 인터페이스는 어떻게 나눠야 하는가”, “분산 시스템과 데이터베이스에서 일관성과 장애를 어떻게 통제하는가”에 답하기 위한 지도다.
처음 읽는다면 소프트웨어 복잡성의 세 가지 증상부터 시작한다.
flowchart TD TOP["소프트웨어 설계"] TOP --> S1["복잡성의 본질과 모듈 설계"] TOP --> S2["데이터 집약 시스템과 분산 아키텍처"] TOP --> S3["소프트웨어 공학의 인간적 요소"] TOP --> S4["사이트 신뢰성 엔지니어링과 복원력"] TOP --> S5["스토리지 엔진과 분산 합의 아키텍처"] TOP --> S6["체계적 디버깅과 소프트웨어 신뢰성"] class TOP,S1,S2,S3,S4,S5,S6 internal-link;
세부 주제 지도 (Sub-MOCs)
소프트웨어 설계 도메인은 여섯 가지 층위의 핵심 질문군으로 구성된다:
- 복잡성의 본질과 모듈 설계 (노트 4개, 출처 1개)
- 단일 코드베이스의 복잡성을 억제하고 깊은 모듈을 구축하는 설계 원칙과 전략적 프로그래밍.
- 시작 노트: 소프트웨어 복잡성의 세 가지 증상, 깊은 모듈과 정보 은닉, 오류를 존재하지 않도록 정의하기.
- 데이터 집약 시스템과 분산 아키텍처 (노트 4개, 출처 1개)
- 마틴 클레프만의 DDIA를 바탕으로 한 저장 엔진(LSM vs B-Tree), 비동기 복제 지연, 2PC와 분산 합의, 파생 이벤트 스트리밍.
- 시작 노트: 저장 엔진의 두 갈래와 색인, 복제 지연과 일관성 모델, 파생 데이터와 이벤트 스트리밍.
- 소프트웨어 공학의 인간적 요소 (노트 4개, 출처 1개)
- 프레더릭 브룩스의 고전을 바탕으로 한 일정 지연의 역설(브룩스의 법칙), 개념적 무결성, 외과의사 팀, 은총알 비판.
- 시작 노트: 브룩스의 법칙과 의사소통 비용, 개념적 무결성과 시스템 아키텍처, 소프트웨어에 은총알은 없다.
- 사이트 신뢰성 엔지니어링과 복원력 (노트 4개, 출처 2개)
- 구글 SRE와 MIT 낸시 레브슨의 시스템 안전 공학 정본.
- 100% 무장애 안티패턴을 극복하는 SLO와 에러 예산, 토일 50% 통제와 비난 없는 포스트모템, STAMP 안전 제약 모델, 분산 과부하 및 연쇄 장애 방어.
- 시작 노트: SLO와 에러 예산, 토일 통제와 비난 없는 포스트모템, 과부하 제어와 연쇄 장애 방어, STAMP 안전 제약 모델과 시스템 사고.
- 스토리지 엔진과 분산 합의 아키텍처 (노트 3개, 출처 1개)
- 페트로프의 『데이터베이스 내부 원리』. 디스크 위의 B-Tree와 LSM-Tree, 쓰기 선행 로그, 여러 노드의 합의와 쿼럼 복제를 하나로 잇는다.
- 시작 노트: B-Tree와 LSM-Tree의 저장 구조 트레이드오프, WAL과 불변 SSTable의 영속성 아키텍처, 분산 합의와 쿼럼 기반 복제 메커니즘.
- 체계적 디버깅과 소프트웨어 신뢰성 (노트 3개, 출처 1개)
- 첼러의 『Why Programs Fail』. 결함에서 오류, 실패로 이어지는 인과 체인을 과학적 방법과 자동화된 원인 격리로 추적한다.
- 시작 노트: 결함-오류-실패의 인과 체인, 델타 디버깅과 자동화된 최소 실패 원인 격리, 과학적 방법론 기반 디버깅과 불변식 검증.
처음 읽는 길잡이
- 소프트웨어 복잡성의 세 가지 증상: 시스템을 병들게 하는 변경 증폭, 인지 부하, 그리고 가장 치명적인 미지의 미지.
- 깊은 모듈과 정보 은닉: 작은 인터페이스 뒤에 거대한 구현을 숨기는 깊은 모듈의 원리.
- 오류를 존재하지 않도록 정의하기: 예외 던지기를 멈추고 API의 의미를 재정의하여 특수 케이스를 없애는 법.
- 전술적 프로그래밍과 전략적 프로그래밍: 당장 돌아가게만 만드는 지름길의 유혹을 이겨내는 10~20% 투자 법칙.