앱 너머의 설계 — 프레임워크, AI 모델, 프로토콜
how-to-design-a-program-from-scratch|6단계 설계 프로세스는 앱이 아닌 것을 만들 때도 적용되는가. 뼈대는 유지되지만, 각 단계에서 묻는 질문이 달라진다.
변하지 않는 것과 달라지는 것
변하지 않는 것: 요구사항 분석, 도메인 모델링, 구조 결정, 검증은 항상 필요하다.
달라지는 것: "사용자"의 정의, 설계의 반복 빈도, 검증 방법, 추가 고려사항.
| | 앱 | 프레임워크 | AI 모델 | 프로토콜 | |---|---|---|---|---| | 사용자 | 최종 사용자 | 개발자 | 없음 (학습 대상) | 양쪽 구현체 | | 요구사항 | 기능 목록 | API 표면 설계 | 문제 정의 + 메트릭 | 상호운용성 | | 도메인 모델 | 현실 개념 | 추상적 개념 | 수학적 구조 | 통신 + 상태 머신 | | 반복 빈도 | 낮음 | 중간 | 매우 높음 | 낮음 | | 검증 | 기능 테스트 | API 사용성 | 정량 메트릭 | 상호운용성 테스트 |
Framework 설계
요구사항의 차이
앱은 "기능 목록"을 정한다. 프레임워크는 **"가능성의 공간"**을 설계한다:
- 이 프레임워크를 쓰는 개발자가 뭘 하고 싶어하는가?
- 어디까지 자유도를 줄 것인가?
- 어디서 제약을 걸어야 잘못된 사용을 방지하는가?
추가되는 우선순위
- API 직관성: 5분 안에 시작할 수 있는가?
- 확장성: 예상 못한 사용을 허용하는가?
- 하위 호환성: 업데이트해도 기존 코드가 깨지지 않는가?
- 에러 메시지 품질: 잘못 쓰면 뭐가 틀렸는지 알려주는가?
도메인 모델의 차이
현실 개념이 아니라 추상적 개념을 모델링한다. Svelte의 경우: Component, Reactive Statement, Store, Transition.
컴포넌트 분해의 차이
기능별이 아니라 개발자가 접하는 계층별로 나눈다: Public API → Internal Core → Compiler/Runtime → Plugin System.
AI Model 설계
과정 자체가 다르다
앱은 "설계 → 구현 → 검증"이 비교적 선형적. AI 모델은 "가설 → 실험 → 측정 → 수정"의 반복이다:
각 단계의 대응
| 앱 설계 | AI 모델 설계 | |---|---| | 요구사항 | 문제 정의 + 성공 메트릭 | | 도메인 모델 | 환경/데이터 설계 (수학적 구조) | | 아키텍처 | 모델 아키텍처 (네트워크 구조, 알고리즘) | | 컴포넌트 분해 | 학습 파이프라인 (architecture-patterns-overview|Pipe & Filter) | | 테스트 | 실험 & 정량 측정 | | 유지보수 | 분석 & 개선 루프 |
뼈대는 대응되지만, AI 모델은 반복 횟수가 압도적으로 많다.
검증의 차이
앱: "기능이 동작하는가?" → 통과/실패
AI: "성능이 충분한가?" → 정량 메트릭
+ "왜 이렇게 동작하는가?" → 해석 가능성
+ "다른 환경에서도 되는가?" → 일반화 테스트
Protocol 설계
핵심 차이: 사용자가 둘 이상
앱의 사용자는 한쪽(최종 사용자). 프로토콜의 사용자는 양쪽 구현체로, 독립적으로 만들어도 서로 통신할 수 있어야 한다.
상태 머신이 핵심
프로토콜에서는 "어떤 상태에서 어떤 메시지를 받으면 어떤 상태로 전이하는가"를 형식적으로 정의해야 한다. 앱 설계에서는 보통 이 수준의 형식화가 필요 없다.
추가 고려사항
- 버전 관리: v1 클라이언트가 v2 서버와 통신 가능한가?
- 확장성: 새 필드 추가 시 기존 구현이 안 깨지는가?
- 에러 복구: 메시지 유실/순서 변경에도 상태가 일관적인가?
- 명세의 명확성: 다른 사람이 명세만 읽고 구현할 수 있는가?
정리
6단계의 뼈대는 뭘 만들든 유지된다. 바뀌는 건 각 단계에서 묻는 질문의 종류다: 앱은 "이 기능이 필요한가?", 프레임워크는 "이 API가 직관적인가?", 모델은 "이 가설이 맞는가?", 프로토콜은 "양쪽이 이해할 수 있는가?"