- Google에서 Design Doc은 코딩 전에 문제의 맥락, 고수준 구현 전략, 핵심 설계 결정을 정리해 설계 비용이 낮을 때 위험을 줄이는 문서임
- 문서의 가치는 완성된 코드 설명보다 트레이드오프와 대안을 드러내 조직이 같은 판단 근거를 공유하게 하는 데 있음
- 좋은 Design Doc은 맥락과 범위, 목표와 비목표, 실제 설계, 고려한 대안, 보안·개인정보·관측 가능성 같은 횡단 관심사를 프로젝트에 맞게 담음
- 설계가 이미 명확하거나 문서가 구현 절차만 나열한다면 Design Doc의 작성·리뷰 오버헤드가 이점보다 커질 수 있음
- 문서는 작성, 리뷰, 구현 중 갱신, 유지보수와 학습으로 이어지며, 출시 전 설계가 바뀌면 문서도 함께 업데이트하는 편이 좋음
Design Doc이 맡는 역할
- Google에서 Design Doc은 소프트웨어 시스템이나 애플리케이션의 주요 작성자가 코딩 프로젝트를 시작하기 전에 만드는 비교적 비공식 문서임
- 고수준 구현 전략과 핵심 설계 결정을 담되, 단순한 결정 목록보다 왜 그런 선택을 했는지 보여주는 트레이드오프가 중요함
- 소프트웨어 엔지니어링의 목적은 코드 생산 자체가 아니라 문제 해결이므로, 프로젝트 초반에는 비정형 텍스트가 코드보다 더 간결하고 이해하기 쉬울 수 있음
- Design Doc은 개발 생명주기에서 여러 역할을 함
- 변경 비용이 낮을 때 설계 이슈를 일찍 발견함
- 조직 안에서 설계 합의를 형성함
- 보안, 개인정보, 관측 가능성 같은 횡단 관심사를 놓치지 않게 함
- 시니어 엔지니어의 지식을 조직 안으로 확장함
- 설계 결정에 대한 조직의 기억을 남김
- 설계자의 기술 포트폴리오를 요약하는 산출물이 됨
Design Doc의 기본 구성
- Design Doc에는 엄격한 템플릿이 없으며, 첫 번째 원칙은 특정 프로젝트에 가장 적합한 형식을 고르는 것임
- 다만 자주 유용한 구조는 맥락과 범위, 목표와 비목표, 실제 설계, 고려한 대안, 횡단 관심사, 적절한 길이로 정리할 수 있음
-
맥락과 범위
- 새 시스템이 놓일 환경과 실제로 무엇을 만들지에 대한 거친 개요를 제공함
- 요구사항 문서가 아니므로 간결해야 하며, 독자가 빠르게 배경을 따라잡게 하는 데 초점을 둠
- 일부 사전 지식은 가정할 수 있고, 세부 정보는 링크로 연결할 수 있음
- 이 섹션은 객관적 배경 사실에 집중해야 함
-
목표와 비목표
- 시스템의 목표와, 때로는 더 중요한 비목표를 짧은 불릿 목록으로 정리함
- 비목표는 “시스템이 크래시하면 안 됨”처럼 목표의 단순 부정이 아니라, 목표가 될 수도 있었지만 명시적으로 제외한 항목임
- 데이터베이스 설계에서 ACID 준수는 목표인지 비목표인지 알아야 하는 좋은 예임
- 비목표라 해도 목표 달성을 방해하는 트레이드오프가 없다면 해당 속성을 제공하는 솔루션을 선택할 수 있음
실제 설계를 쓰는 방식
- 실제 설계 섹션은 개요에서 시작해 세부 사항으로 내려가야 함
- Design Doc은 소프트웨어 설계에서 발생한 트레이드오프를 기록하는 장소임
- 맥락이라는 사실, 목표와 비목표라는 요구사항을 바탕으로 해법을 제안하고, 특정 해법이 목표를 가장 잘 만족하는 이유를 보여줘야 함
- 문서 형식의 장점은 문제 집합에 맞는 표현 방식을 유연하게 선택할 수 있다는 데 있음
-
시스템 컨텍스트 다이어그램
- 많은 문서에서 system-context-diagram이 유용할 수 있음
- 이 다이어그램은 시스템을 더 큰 기술 환경의 일부로 보여주며, 독자가 이미 아는 환경 안에서 새 설계를 이해하게 함
-
API와 데이터 저장
- 설계 대상 시스템이 API를 노출한다면 API를 스케치하는 것이 대체로 좋음
- 형식적인 인터페이스나 데이터 정의를 그대로 복사해 붙여넣는 방식은 피해야 함
- 이런 정의는 장황해지기 쉽고 불필요한 세부 사항을 포함하며 빠르게 낡을 수 있음
- 설계와 트레이드오프에 관련된 부분에 집중해야 함
- 데이터를 저장하는 시스템은 데이터가 어떻게, 어떤 대략적 형태로 저장되는지 다뤄야 함
- 전체 스키마 정의를 붙여넣기보다 설계 판단과 관련된 부분을 설명하는 편이 좋음
-
코드와 의사코드
- Design Doc에는 코드를 거의 넣지 않는 편이 좋음
- 새로운 알고리듬을 설명하는 경우를 제외하면 의사코드도 드물게 사용해야 함
- 설계가 구현 가능하다는 점을 보여주는 프로토타입이 있다면 적절히 링크할 수 있음
제약 정도가 문서 형태를 바꿈
- 소프트웨어 설계와 Design Doc의 형태에 영향을 주는 주요 요인 중 하나는 해법 공간의 제약 정도임
- 한쪽 끝에는 목표만 있고 해법은 무엇이든 가능한 그린필드 소프트웨어 프로젝트가 있음
- 이런 문서는 넓은 범위를 다룰 수 있지만, 관리 가능한 해법 집합으로 좁혀가기 위한 규칙을 빠르게 정의해야 함
- 다른 한쪽 끝에는 가능한 해법은 잘 정의되어 있지만, 그 해법들을 어떻게 조합해 목표를 달성할지 명확하지 않은 시스템이 있음
- 변경하기 어려운 레거시 시스템일 수 있음
- 호스트 프로그래밍 언어의 제약 안에서 동작해야 하는 라이브러리 설계일 수 있음
- 이런 경우 비교적 쉽게 할 수 있는 작업을 나열할 수는 있지만, 목표 달성을 위해 이를 창의적으로 조합해야 함
- 여러 해법이 모두 완벽하지 않다면, 문서는 식별된 트레이드오프를 바탕으로 최선의 방식을 고르는 데 집중해야 함
대안과 횡단 관심사
-
고려한 대안
- 이 섹션은 비슷한 결과를 합리적으로 달성할 수 있었던 대안 설계를 나열함
- 각 설계가 만드는 트레이드오프와, 그 트레이드오프가 최종 선택으로 어떻게 이어졌는지에 초점을 둬야 함
- 선택되지 않은 해법은 간결하게 다뤄도 되지만, 이 섹션은 문서에서 매우 중요함
- 독자가 궁금해할 수 있는 다른 해법들이 프로젝트 목표에 비춰 왜 덜 바람직한지 보여줘야 함
-
횡단 관심사
- 조직은 이 섹션을 통해 보안, 개인정보, 관측 가능성 같은 횡단 관심사가 항상 고려되도록 할 수 있음
- 보통 각 관심사가 설계에 어떤 영향을 주고 어떻게 처리되는지 설명하는 짧은 섹션이 됨
- 팀은 자신들의 상황에서 어떤 관심사를 표준으로 삼을지 정해야 함
- Google 프로젝트는 중요성 때문에 별도의 개인정보 Design Doc을 요구하며, 개인정보와 보안에 대한 전용 리뷰가 있음
- 리뷰 완료는 프로젝트 출시 시점까지 요구됨
- 설계가 처음부터 이를 반영하도록 개인정보·보안 팀과 가능한 한 일찍 협업하는 것이 모범 사례임
- 해당 주제의 전용 문서가 있다면 중앙 Design Doc은 상세 내용을 반복하지 않고 참조할 수 있음
길이와 작성하지 않아도 되는 경우
-
적절한 길이
- Design Doc은 충분히 상세해야 하지만 바쁜 사람들이 실제로 읽을 수 있을 만큼 짧아야 함
- 큰 프로젝트에서는 약 10~20페이지가 적절한 지점으로 보임
- 그보다 훨씬 길어진다면 문제를 더 관리 가능한 하위 문제로 나누는 편이 나을 수 있음
- 1~3페이지짜리 미니 Design Doc도 가능함
- 점진적 개선이나 애자일 프로젝트의 하위 작업에 특히 유용함
- 긴 문서와 같은 단계를 수행하되, 더 간결하고 제한된 문제 집합에 집중함
-
작성하지 않아도 되는 경우
- Design Doc 작성에는 오버헤드가 있음
- 작성 여부는 설계 합의, 문서화, 시니어 리뷰 등의 이점이 문서 생성 비용을 넘어서는지에 달려 있음
- 핵심 판단 기준은 설계 문제가 모호한지 여부임
- 문제 복잡성, 해법 복잡성, 또는 둘 다 때문에 모호할 수 있음
- 모호하지 않다면 문서 작성 과정의 가치는 작음
- 문서가 사실상 구현 매뉴얼이라면 Design Doc이 필요하지 않을 수 있음
- “이렇게 구현하겠다”만 말하고 트레이드오프, 대안, 의사결정 설명이 없다면 바로 프로그램을 작성하는 편이 나았을 수 있음
- 해법이 너무 명확해서 트레이드오프가 없다면 문서의 가치가 낮음
- Design Doc의 작성과 리뷰 오버헤드는 프로토타이핑과 빠른 반복에 맞지 않을 수 있음
- 애자일 방법론을 따른다고 해서 알려진 문제의 해법을 제대로 고민하지 않아도 되는 것은 아님
- 프로토타이핑 자체가 Design Doc 작성의 일부가 될 수 있으며, “해봤고 동작한다”는 설계 선택의 강한 근거가 될 수 있음
Design Doc의 생명주기
- Design Doc의 생명주기는 네 단계로 구성됨
- 작성과 빠른 반복
- 리뷰
- 구현과 반복
- 유지보수와 학습
-
작성과 빠른 반복
- 문서는 작성자가 단독으로 쓰거나 공동 작성자들과 함께 작성함
- 이후 문제 공간을 가장 잘 아는 동료들과 공유하며 빠르게 반복함
- 동료들의 명확화 질문과 제안이 문서를 비교적 안정적인 첫 버전으로 이끎
- Google에는 버전 관리와 코드 리뷰 도구로 문서 만들기를 선호하는 엔지니어와 팀도 있지만, 대다수 Design Doc은 Google Docs에서 작성되고 협업 기능을 많이 사용함
-
리뷰
- 리뷰 단계에서는 원래 작성자와 가까운 협업자보다 더 넓은 독자에게 문서를 공유함
- 리뷰는 큰 가치를 더할 수 있지만 오버헤드의 함정이 될 수 있으므로 신중하게 다뤄야 함
- 가벼운 방식은 문서를 더 넓은 팀 메일링 리스트에 보내 사람들이 살펴볼 기회를 주는 것임
- 논의는 주로 문서의 댓글 스레드에서 이뤄짐
- 무거운 방식은 작성자가 문서를 시니어 엔지니어 독자 앞에서 발표하는 정식 설계 리뷰 회의임
- Google의 많은 팀은 이런 리뷰를 위한 정기 회의를 갖고 있음
- 이런 회의를 기다리면 개발 프로세스가 크게 느려질 수 있음
- 가장 중요한 피드백을 직접 구하고 더 넓은 리뷰를 진행의 차단 요소로 만들지 않는 방식으로 완화할 수 있음
- Google이 더 작은 회사였을 때는 설계를 하나의 중앙 메일링 리스트로 보내고 시니어 엔지니어들이 여유가 있을 때 리뷰하는 방식이 관례였음
- 이 방식은 회사 전체에 비교적 균일한 소프트웨어 설계 문화를 만드는 장점이 있었음
- 엔지니어링 조직이 훨씬 커지면서 중앙집중식 접근을 유지하기 어려워짐
- 리뷰의 주요 가치는 조직의 결합된 경험이 설계에 반영될 기회를 만드는 데 있음
- 특히 관측 가능성, 보안, 개인정보 같은 횡단 관심사를 설계가 고려하도록 하는 데 리뷰 단계가 일관되게 도움을 줌
- 리뷰의 핵심 가치는 이슈 발견 자체보다, 변경 비용이 낮은 개발 생명주기 초기에 이슈가 발견되는 데 있음
-
구현과 반복
- 추가 리뷰가 설계에 큰 변경을 요구할 가능성이 낮다는 확신이 생기면 구현을 시작할 때임
- 계획이 현실과 부딪히면 결함, 처리되지 않은 요구사항, 틀린 것으로 드러난 추정이 나타나고 설계 변경이 필요해질 수 있음
- 이 경우 Design Doc을 업데이트하는 것이 강하게 권장됨
- 경험칙으로, 설계한 시스템이 아직 출시되지 않았다면 반드시 문서를 업데이트해야 함
- 실제로는 사람들이 문서를 잘 업데이트하지 못하고, 다른 실무적 이유로 변경 사항이 새 문서로 분리되는 일이 많음
- 그 결과 하나의 일관된 문서라기보다 수정 조항이 붙은 미국 헌법 같은 상태가 될 수 있음
- 원래 문서에서 이런 수정 문서로 링크를 걸어두면, 나중에 유지보수 프로그래머가 Design Doc 고고학으로 대상 시스템을 이해하는 데 큰 도움이 됨
-
유지보수와 학습
- Google 엔지니어가 처음 만지는 시스템을 접하면 자주 묻는 첫 질문은 “Design Doc이 어디 있나?”임
- Design Doc도 다른 문서처럼 시간이 지나면 현실과 어긋나는 경향이 있지만, 시스템을 만든 사고 과정을 배우는 가장 접근하기 쉬운 진입점이 되는 경우가 많음
- 작성자는 1~2년 뒤 자신의 Design Doc을 다시 읽어보는 것이 좋음
- 무엇을 맞혔는지 확인함
- 무엇을 틀렸는지 확인함
- 오늘이라면 무엇을 다르게 결정할지 생각함
- 이런 질문에 답하는 과정은 엔지니어로 성장하고 시간이 지나며 소프트웨어 설계 역량을 개선하는 데 도움이 됨
언제 Design Doc으로 시작할지 판단하기
- Design Doc은 소프트웨어 프로젝트의 어려운 문제를 해결할 때 명확성을 얻고 합의를 형성하는 좋은 방법임
- 사전 조사로 피할 수 있었던 코딩의 막다른 길을 줄여 비용을 절약할 수 있음
- 동시에 작성과 리뷰에 시간이 들기 때문에 비용도 발생함
- 다음 질문을 고려할 수 있음
- 올바른 소프트웨어 설계가 불확실하고, 확신을 얻기 위해 사전에 시간을 쓰는 것이 타당한가?
- 모든 코드 변경을 리뷰하지 못할 수 있는 시니어 엔지니어를 설계 단계에 참여시키는 것이 도움이 되는가?
- 소프트웨어 설계가 모호하거나 논쟁적이어서 조직적 합의가 가치 있는가?
- 팀이 개인정보, 보안, 로깅 또는 다른 횡단 관심사를 설계에서 가끔 잊는가?
- 조직 안의 레거시 시스템 설계에 대한 고수준 통찰을 제공하는 문서가 강하게 필요한가?
- 이 질문 중 3개 이상에 “예”라고 답한다면, Design Doc은 다음 소프트웨어 프로젝트를 시작하는 데 좋은 방법일 가능성이 높음