- 10k~200k 줄 규모의 오픈소스 프로젝트는
README,CONTRIBUTING옆에 ARCHITECTURE 문서를 두면 신규 기여자가 코드 구조를 파악하는 비용을 줄일 수 있음 - 낯선 프로젝트에서는 패치 작성이 대략 2배 느려지는 것보다, 어디를 고쳐야 하는지 찾는 데 10배 더 걸리는 문제가 더 큼
- 이 문서는 고수준 구조와 자주 바뀌지 않는 내용을 짧게 담고, 코드와 계속 동기화하기보다 1년에 몇 차례 점검하는 방식이 적합함
- 핵심 구성은 문제의 조감도와 코드맵(codemap) 이며, 큰 모듈과 관계를 보여줘 “X를 담당하는 코드가 어디인가”에 답해야 함
- 중요한 이름, 아키텍처 불변조건, 계층·시스템 경계, 횡단 관심사를 남기되 직접 링크보다 이름 검색을 유도하면 유지보수 부담이 줄어듦
ARCHITECTURE 문서가 줄이는 비용
- 오픈소스 프로젝트에서 가끔 기여하는 사람과 코어 개발자의 가장 큰 차이는 프로젝트의 물리적 아키텍처를 아는지 여부임
- 낯선 코드베이스에서는 파일을 임의 순서로 놓인 논리 조각처럼 순차적으로 읽게 됨
- 이미 의미 있는 기여를 한 개발자는 머릿속에 코드 지도가 있어 필요한 위치로 바로 이동하고, 없으면 해당 코드를 옮길 수도 있음
ARCHITECTURE파일은 이 간극을 낮은 비용으로 줄이는 수단임- 문서는 짧아야 함
- 반복적으로 기여하는 사람이 모두 읽어야 하기 때문임
- 짧을수록 미래 변경으로 무효화될 가능성이 낮음
ARCHITECTURE에는 자주 바뀌지 않을 내용을 담는 것이 기준임- 코드와 계속 동기화하려 하지 않음
- 대신 1년에 몇 차례 다시 검토함
무엇을 담아야 하는가
- 먼저 프로젝트가 해결하는 문제를 조감도 수준에서 정리함
- 이어서 어느 정도 상세한 코드맵(codemap) 을 작성함
- 큰 단위의 모듈과 서로의 관계를 설명함
- “X를 하는 것은 어디에 있는가”에 답해야 함
- “내가 보고 있는 이것은 무엇을 하는가”에도 답해야 함
- 각 모듈의 내부 동작까지 깊게 들어가지는 않음
- 그런 내용은 별도 문서나, 더 낫게는 인라인 문서로 옮김
- 코드맵은 국가 지도이지 주별 지도책이 아님
- 코드맵을 쓰는 과정에서 프로젝트 구조도 함께 점검할 수 있음
- 코드맵에서 가까이 두고 싶은 것들이
tree .실행 결과에서도 인접한지 확인할 수 있음
- 코드맵에서 가까이 두고 싶은 것들이
- 중요한 파일, 모듈, 타입 이름은 명시함
- 직접 링크는 시간이 지나며 깨질 수 있으므로 피함
- 대신 이름으로 심벌 검색을 하도록 유도하면 유지보수 부담 없이 관련된 비슷한 이름의 항목도 발견할 수 있음
- 아키텍처 불변조건은 명시적으로 적어야 함
- 중요한 불변조건은 어떤 것이 “없다”는 형태로 나타나는 경우가 많음
- 예로 웹 개발에서 모델 계층이 뷰에 의존하지 않는다는 사실은 코드만 읽어서는 알아내기 어려울 수 있음
- 계층과 시스템 사이의 경계도 표시해야 함
- 경계는 그 뒤에 있는 시스템 구현에 대한 정보를 암시함
- 가능한 모든 구현까지 제약함
- 좋은 경계는 코드에서 무작위로 찾기 어렵기 때문에 문서화가 유용함
- 코드맵 뒤에는 횡단 관심사를 위한 별도 섹션을 추가함
- 참고할 만한 예시는 rust-analyzer의 architecture.md에서 볼 수 있음