본문 바로가기
C.W.K.
Stream
Lesson 05 of 05 · published

혼자 움직이는 여섯 버전 도메인

~13 min · self-contained, versioning, compatibility, architecture

Level 0릴 입문자
0 XP0/39 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"제품, 번들 빌드, 상태 스키마, URL 프로토콜, libmpv 빌드, golden-corpus 리비전은 각자 자기 호환성 이유로 전진해."

한-숫자의 오류

앱이 '버전 하나' 를 가진다고 상상하면 깔끔하지. 안 그래. Ashen Reel 은 버전을 지닌 게 최소 여섯 개고, 각각 완전히 다른 이유로 바뀌어. 걜 다 한 숫자에 욱여넣으면 두 실패 중 하나를 얻어. dylib repin 할 때마다 제품 버전을 올리거나. 사용자한텐 아무 뜻 없는 거짓 churn 이지. 아니면 아무도 호환성 깨짐을 못 알아채게 딥링크 문법을 조용히 바꾸거나. 모든 걸 뜻하는 숨은 깨짐이고. 한 숫자는 여섯 종류의 독립적 변화에 대해 정직할 수가 없어.

여섯 도메인, 여섯 이유

고침은 각 도메인에 이름을 붙이고 자기 시계로 전진하게 두는 거야.

  • 제품 버전. 보이는 릴리스야. cwk-product.json 이 소유하고 Firelink 로 전진해. 사람이 '무슨 버전' 하면 뜻하는 그 숫자.
  • 번들 빌드 번호. 출시 가능한 아무 빌드에 째깍하는 배포 카운터. 이야기가 아니라 집계고.
  • 상태 스키마 리비전. 로컬 SQLite 모양이 바뀌고 마이그레이션이 필요할 때만 올라.
  • URL 프로토콜 버전. cwkashenreel:// handoff 문법이 바뀔 때만 올라.
  • libmpv 빌드. embed 된 엔진이 새 빌드로 repin 될 때 전진해.
  • golden-corpus 리비전. 필수 미디어 매트릭스가 바뀔 때 전진하고.
호환성 도메인당 버전 하나. 절대 전부에 한 숫자가 아니야. 버전 번호는 '이게 저거랑 호환돼?' 에 답해. 딥링크, 데이터베이스, 엔진, 릴리스. 이 다른 짝짓기들이 그 질문을 서로 다른 것에 대해 묻는 거고, 각각 자기 호환성이 실제로 바뀔 때만 움직이는 자기 답을 받을 자격이 있어.

전체 체계가 카드 한 장에 들어가고, 그 카드를 지키는 게 conflation 을 막아.

제품 버전은 canonical 이고 단수야. 정확히 한 출처, cwk-product.json 이 보이는 제품 릴리스를 지니고, 표시 표면이 'v' 를 붙여. 패키지 버전, 번들 빌드 번호, 스키마 리비전, Git 커밋은 경쟁하는 제품 버전이 아니야. 그중 뭐든 '그 버전' 으로 취급하는 게 빌드 번호가 마케팅 페이지에 오르는 방식이고. canonical 제품 번호 하나, 사적 호환성 카운터 여럿이야.

왜 분리가 미래의 너한테 친절인가

독립 버전 도메인은 1년 뒤 이걸 디버깅하는 사람한테 주는 선물이야. 뭔가 깨지면, 버전들이 정확한 이야기를 해줘. '스키마는 rev 4 인데 이 데이터베이스는 rev 3 이니까 마이그레이션.' '딥링크는 프로토콜 2 라는데 이 빌드는 1 만 말하니까 거절.' 여섯이 다 한 숫자로 뭉개졌으면, 그 진단 하나하나가 추측이야. 도메인에 이름을 붙이는 게 '버전 1.0.0 인데 왜 안 돼?' 를 구체적이고 답할 수 있는 호환성 질문 세트로 바꿔주고. 그게 트랙 전체의 교훈을 축소한 거야. 실제로 독립인 것에 대한 정직이, 시스템을 읽을 수 있게 만들어.

Code

여섯 버전 도메인, 전진할 여섯 이유. 절대 합치지 마·text
DOMAIN          SOURCE                   BUMPS WHEN...
------          ------                   -----------
product         cwk-product.json         Dad ships a visible release (Firelink owns)
bundle build    Info.plist build number  any deployable build (a counter, not a story)
state schema    SQLite schema revision   the local DB shape changes (migration needed)
URL protocol    handoff grammar version  the cwkashenreel:// grammar changes
libmpv build    pinned dylib manifest    the embedded engine is repinned
golden corpus   corpus manifest revision the required-media matrix changes

// Repinning libmpv does NOT bump the product version.
// A product release does NOT force a schema migration.
// Each domain moves on its own clock, for its own compatibility reason.

External links

Exercise

네가 일하는 시스템의 모든 '버전' 을 나열해. 제품 버전, API 버전, DB 스키마 버전, config 포맷, 프로토콜, 데이터-파일 포맷. 각각에 대해, 그게 올라야 할 이유 '하나' 를 적어. 그다음 지금은 함께 움직이게 강제됐는데 실제론 다른 이유로 바뀌는 둘을 찾아. 걜 쪼개면 어떤 거짓 churn 이나 숨은 깨짐이 없어져?
Hint
각 버전 번호는 한 특정 것에 대한 호환성 질문에 답해. 네 버전 둘이 항상 lockstep 으로 움직이는데 서로 다른 호환성 계약을 대표하면, 예를 들어 'API 모양' 이랑 '릴리스' 처럼, 하나를 이유 없이 올리거나 다른 하나의 깨짐을 숨기는 거야. 각 계약한테, 그 계약이 바뀔 때만 움직이는 자기 번호를 줘.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.