C.W.K.
Stream
Lesson 02 of 04 · published

앱 대 Mac

~14 min · firelink, watchfire, single-responsibility, orthogonal

Level 0식은 재
0 XP0/32 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Mac 하나가 여러 앱을 돌려. 앱 하나가 여러 Mac 에서 돌아. 두 축, 두 허브 — 둘을 위한 god-console 하나가 아니라."

일부러 두 허브

가족엔 control center 가 둘 있고, 일부러 뚜렷해. Watchfire 가 머신 을 소유해. Tailscale 도달성, explicit-target fleet 터미널, environment-domain sync, system·service state, macOS 업데이트 campaign, Mac enrollment 과 retirement. Firelink 가 애플리케이션 을 소유해. 그 머신이 돌리는 cwk* 제품들 — census, launch, birth, deploy, version. 다른 형제들이 각자 앱 도메인을 소유하는 데서, Watchfire 는 머신 자체를 소유하고, Firelink 는 그 위에서 도는 것의 허브야.

왜 mega-hub 하나가 아냐?

'모든 걸 관리'하는 console 하나를 짓고 싶어져. Firelink 와 Watchfire 는 그걸 거부해, 머신과 앱이 직교하는 축 이라서. 한 Mac 이 여러 애플리케이션을 돌리고; 한 애플리케이션이 여러 Mac 에서 돌아. lifecycle 이 달라 — Mac 은 enroll·update·retire 되고; 앱은 born·deploy·version 돼. operation 이 다르고, 소유자가 다르고, failure mode 가 달라. 둘을 한 허브에 욱여넣으면 가족 전체가 피하는 바로 그 god-object 가 나와. 단일 멘탈 모델이 안 맞을 만큼 넓어서 모든 화면이 무관한 두 질문에 동시에 답해야 하는 console. 각자 하나의 명확한 책임을 가진 두 focused 허브가 이해 가능하게 남아.

cross-hub 경계는 단방향이다

두 허브는 만나긴 해, 깔끔하게 한 방향으로. Firelink 는 Watchfire 의 peer id 와 last-observed host별 liveness 를 consume 해 — read-only overlay 로, Watchfire 자기 타임스탬프를 지니고, 절대 갓 나온 Firelink probe 로 제시되지 않고. Firelink 는 host 를 관리하려 절대 안 해; 그건 Watchfire 도메인, 끝. 경계는 관찰적이야. Firelink 는 '이 앱의 Mac 이 Watchfire 기준 언제 마지막으로 도달 가능했음'을 보여줄 수 있고, 그게 다야. 각 허브는 자기 축에서 권위 있고 상대 축에선 read-only 손님이야.

두 관리 관심사가 직교하면, 각자 단일 책임의 자기 허브를 주고, 서로 도메인에서 read-only 손님으로만 만나게 해. 무관한 두 축을 위한 mega-console 하나는 아무도 머릿속에 못 담는 god-object 가 되고; 각자 한 축에서 권위 있는 두 focused 허브는 읽히고 안전하게 남아.

Code

직교하는 축: 축마다 허브 하나·text
                 APPS  (Firelink owns this axis) ------------------>
               +-----------+-----------+-----------+-----------+
  M   office   |  Pippa    |  Ember?   |  Firelink |   ...     |
  A            |  running  |  (server) |  (self!)  |           |
  C   server   |  ...      |  Ember    |  ...      |  ...      |
  S            |           |  running  |           |           |
  |   macbook  |  ...      |  ...      |  ...      |  ...      |
  v            +-----------+-----------+-----------+-----------+
 (Watchfire owns this axis)

  Watchfire  = authoritative on the ROWS  (the Macs themselves)
  Firelink   = authoritative on the COLS  (the apps those Macs run)
  Cross-hub  = Firelink reads Watchfire liveness READ-ONLY (a timestamped
               overlay), and never manages a host. One direction only.

External links

Exercise

누가 한 도구에 묶은 두 관리 관심사를 네 세계에서 찾아 (예: '서버'와 '그 위에서 도는 서비스', 또는 '유저'와 '그들의 콘텐츠'). 두 축이 실제로 직교해 — 하나의 각각이 다른 것 여럿과 관계돼? 그렇다면 분리를 스케치해. 두 허브, 축마다 하나, read-only 손님으로만 만나는. 각 화면이 정확히 한 종류 질문에 답하면 뭐가 명확해져?
Hint
직교성 테스트: B 당 A 여럿, A 당 B 여럿을 가질 수 있어? 그렇다면(Mac 당 앱 여럿, 앱 당 Mac 여럿), 둘 다이려는 도구 하나는 늘 트렌치코트 입은 두 도구처럼 느껴져. 축을 따라 나누는 게 각 view 가 단일 질문에 답하게 만들어.

Progress

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

댓글 0

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

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