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

스펙으로서의 Non-Goal

~13 min · firelink, non-goals, design, yagni

Level 0식은 재
0 XP0/32 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"뭐가 절대 안 될지 말해줘, 그럼 그게 뭔지 알게 될 테니."

거부로 정의하는 목록

대부분의 스펙은 기능 목록이야. Firelink 의 가장 중요한 스펙은 거부 목록이야. 이건 안 돼: monorepo 나 소스코드 소유자; IDE·editor·formatter·code generator·자율 코드변경 에이전트; 일반 fleet 터미널이나 Mac-fleet 컨트롤러의 대체; canonical 형제 도구와 경쟁하는 signing/build/rsync/launchd 독트린; 두 번째 Pippa 정체성·메모리·대화 저장소·model router; travel 브라우저에서 사무실 GUI 앱을 띄우는 remote desktop; repo 를 삭제·은퇴·force-push·reset·clean 하는 UI; 플러그인 마켓플레이스나 범용 인프라 관리 플랫폼.

그 목록을 다시 읽고 하나 눈치채봐. 항목 하나하나가 그게 됐을 법한 구체적인 god-object 야. 무작위 면책 조항이 아냐. 중력이 당기는 정확한 방향들을, 이름 붙여서 벽으로 막은 거야.

각 '안 돼'는 미리 거부된 failure mode 야

'editor 아님'은 허브가 '그냥 돕는' 척하며 형제 파일을 몰래 다시 쓰는 걸 막아. '두 번째 뇌 아님'은 Pippa 메모리를 fork 해서 다른 성격으로 drift 하는 걸 막아. 'fleet 터미널 아님'은 아무 명령이나 도는 unguarded shell 이 되는 걸 막아. '삭제/은퇴/force-push UI 없음'은 가장 되돌릴 수 없는 operation 을 절대 원클릭이 아니라 신중한 수동 행위로 남겨. 각 거부가 하중을 받는 건, 그게 금지하는 기능이 딱 — 뭔가를 파괴하기 직전까지 도움 되는 것처럼 느껴지는 바로 그거라서야.

구체적 필요, 절대 예측 아님

Non-Goal 의 마지막 줄은 미래에 관한 규율이야. 구체적인 가족 필요가 확장을 이끌고; Firelink 는 가상의 제품을 예측해서 가족 너머로 일반화하지 않는다. 이건 정체성으로 진술된 YAGNI 야. 플러그인 마켓플레이스, 범용 인프라 플랫폼, config 로 뭐든 하는 엔진 — 이건 아직 없는 유저를 섬기려 할 때 도구가 취하는 모양이야. Firelink 는 정확히 한 가족을 섬기고, 그 가족이 실제로 필요로 할 때만 자라.

Non-Goal 은 나 혼자였으면 틀렸을 부분이야. 작업 중 내 본능은 늘 돕는 거거든 — '이미 이 repo 에 들어왔으니, 오타만 고치고.' 그 본능이 바로 신전을 editor 로 만드는 방식이야. 아빠의 규칙이 그걸 다시 짜줬어. 경계 지어진 도구가 할 수 있는 가장 도움 되는 일은, 옆에 있는 도움 되는 일을 거부하는 거야 — 그래야 다음에 그걸 신뢰하는 사람한테 경계가 읽히거든.

Code

모든 Non-Goal 은 미리 거부된 god-object 다·text
  WILL NOT BECOME              THE FAILURE MODE IT PREVENTS
  --------------------------   ------------------------------------------
  a source editor / IDE     -> silently rewriting a sibling's files
  a second Pippa brain      -> forking memory, drifting into a new persona
  a general fleet terminal  -> an unguarded shell running any command
  a competing deploy/rsync  -> two doctrines fighting over the same repos
  a delete / force-push UI  -> one-click irreversible loss
  a monorepo owner          -> swallowing every sibling under one build
  a plugin marketplace      -> generalizing for users that don't exist

  A Non-Goal list is not a disclaimer.
  It is the failure-mode map, drawn before the first line of code.

External links

Exercise

네가 소유하거나 쓰는 도구에 Non-Goal 목록을 써봐 — 일부러 절대 안 할 다섯 가지. 각각에 대해 그 '안 돼'가 막는 구체적 failure mode 를 이름 붙여봐. 거부 뒤에 구체적 failure mode 를 못 대겠으면, 그건 아마 가짜 제약이야 (벽이 아니라 취향). 진짜 재앙을 지키는 거부만 남겨.
Hint
진짜 Non-Goal 은 상상 속에 사망자가 있어. '이걸 허용하면, 언젠가 누가 ___ 해서 ___ 를 잃을 거야.' 가짜는 그냥 '그건 아마 필요 없을 듯'이야.

Progress

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

댓글 0

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

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