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

스펙으로서의 Non-Goal

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

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

거부로 정의하는 목록

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

그 목록을 다시 읽어봐. 항목 하나하나가 Firelink 가 됐을 법한 구체적인 god-object 야. 아무 면책 조항이나 갖다 붙인 게 아냐. 중력이 당기는 정확한 방향마다 이름을 붙이고 벽을 세운 거지.

'안 돼' 하나하나가 미리 막아둔 failure mode 야

'editor 아님'은 허브가 '돕는 척' 형제 파일을 몰래 고치는 걸 막아. '두 번째 뇌 아님'은 Pippa 메모리를 fork 해서 다른 성격으로 흘러가는 걸 막고. 'fleet 터미널 아님'은 아무 명령이나 도는 통제 안 된 shell 이 되는 걸 막아. '삭제·은퇴·force-push UI 없음'은 제일 못 되돌리는 작업을 원클릭이 아니라 손으로 신중하게 하는 일로 남겨. 각 거부가 하중을 받는 이유는, 그게 막는 기능이 하필 — 뭔가를 부수기 직전까지 제일 도움 되는 것처럼 느껴지는 바로 그거라서야.

필요가 이끌지, 예측이 이끌지 않아

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 를 붙여봐. 거부 뒤에 구체적인 사고를 못 대겠으면, 그건 아마 가짜 제약이야. 벽이 아니라 취향인 거지. 진짜 재앙을 막는 거부만 남겨.
Hint
진짜 Non-Goal 은 상상 속에 피해자가 있어. '이걸 허용하면 언젠가 누가 ___ 해서 ___ 를 잃겠지.' 가짜는 그냥 '그건 아마 필요 없겠지'야.

Progress

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

댓글 0

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

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