인텐트 부채(The Intent Debt)
TMT기술 부채는 코드에 쌓입니다. 인지 부채는 사람 머릿속에 쌓입니다. 인텐트 부채는 당신이 아예 쓰지 않았을 수도 있는 산출물들, 즉 시스템이 지금 모습이 된 이유를 설명해 주는 목표, 제약, 그리고 근거에 쌓입니다. 운이 좋다면 이런 것들이 팀 문서나 대화에 여기저기 흩어져 있겠지만, 대부분은 불완전합니다. 이건 에이전트가 대신 갚아 줄 수 없는 유일한 종류의 부채이고, 에이전트 기반 엔지니어링이 등장하면서 가장 값비싸진 부채입니다.
부채가 쌓이는 세 가지 장소
Margaret-Anne Storey가 제안한 Triple Debt Model은 소프트웨어 건강을 생각하기에 깔끔한 틀입니다. 부채는 기술 부채, 인지 부채, 인텐트 부채 세 가지 모델로 나눌 수 있습니다.
기술 부채는 코드에 쌓입니다. 나중에 시스템을 변경하기 어렵게 만드는 구현 선택들이 쌓여 생기는 것입니다. 얽히고설킨 모듈, 마감에 쫓겨 했던 지름길, 새어나가는 추상화 같은 것들이죠. 이건 수십 년 전부터 잘 알려져 있습니다. 느려지는 빌드, 깨지기 쉬운 테스트, 딱 한 파일만 건드리려 해도 밀려오는 두려움으로 이 부채를 체감하게 됩니다.
인지 부채는 사람에게 쌓입니다. 공유된 이해가 닳아 없어지면서, 존재하는 코드의 양과 어떤 인간이 이해하고 있는 양 사이에 간극이 벌어지는 상태입니다. 저는 이것을 이해 부채라고도 불러 왔습니다. 시스템이 팀의 머릿속 모델이 확장되는 속도보다 더 빨리 커질 때 이 부채가 쌓입니다. 코드는 흠 잡을 데 없이 깔끔할 수 있지만, 아무도 그 깔끔한 코드를 이해하지 못하면 치명적인 인지 부채를 떠안고 있는 셈입니다.
인텐트 부채는 산출물에 쌓입니다. 시스템이 지금 모습이 된 이유를 설명해 주는 외부화된 근거, 목표, 제약이 없거나 닳아 없어진 상태입니다. 여기서 핵심 단어는 “외부화된(externalized)”입니다. 근거는 팀 동료, 미래의 나, 혹은 에이전트가 읽을 수 있도록 어딘가에 글로 남아 있어야지, 머릿속에만 담겨 있어서는 안 됩니다. 인텐트 부채가 높아지면 시스템은 처음 의도했던 방향에서 점점 표류하고, 언제, 왜 빗나가기 시작했는지 아무도 설명하지 못하게 됩니다.
이 세 가지는 서로 독립적이라는 점을 이해하는 데 저도 한참이 걸렸습니다.
기술 부채는 낮지만 인텐트 부채는 높을 수 있습니다. 내가 시스템을 완벽하게 이해하고 있을 수 있습니다(나 개인에게는 인지 부채가 없음). 그런데 그 인텐트가 내 머릿속에만 있고 어디에도 남아 있지 않다면(외부화된 인텐트가 없다면) 다른 모든 사람에게는 엄청난 인텐트 부채가 됩니다.
내 입장에서는 이 셋이 비슷하게 느껴지지만, 각자 별도의 청구서를 보내 옵니다.
왜 인텐트 부채만은 에이전트가 도와줄 수 없는가
AI 덕분에 코드는 그 어느 때보다 빨리 만들어집니다. 그래서 기술 부채는 감수하기도, 갚기도 쉬워졌습니다. 엉켜 있는 모듈 하나를 에이전트에 맡기면 리팩터링해 줄 겁니다.
인지 부채도 마찬가지로, 대부분의 엔지니어가 생각하는 것보다 쉽게 회복됩니다. 시스템의 일부를 이해하지 못하겠다면, 에이전트에게 설명해 달라고 요청하면 됩니다. 코드는 여전히 존재하고, 모델이 그 코드를 읽어 다시 설명해 줄 수 있기 때문에, 잃어버렸던 머릿속 모델의 일부를 필요할 때마다 재구성할 수 있습니다.
인텐트는 다릅니다. 에이전트는 인텐트를 생성할 수 없습니다. 인텐트만큼은 반드시 당신에게서 나와야 하는 입력이기 때문입니다. 모델은 코드로부터 그럴듯한 근거를 추론해 낼 수 있습니다. 마치 당신이 이전 엔지니어가 왜 그렇게 했는지 추측하듯이 말이죠. 하지만 인텐트에 대한 추측은 인텐트 그 자체가 아닙니다. 모델은 300ms 디바운스 값이 의도적인 UX 결정이었는지, 벤치마크 결과였는지, 아니면 누가 한 번 적어 놓고 두 번 다시 손대지 않은 숫자인지 알지 못합니다. 그럴듯하고 자신감 넘치는 이유를 지어낼 뿐이고, 모른다고 솔직하게 말하는 것보다 오히려 더 안 좋습니다.
세 가지 부채 중, 인텐트 부채만이 에이전트가 대신 구제해 줄 수 없는 영역입니다. 에이전트는 코드를 써 주고, 이해를 회복시켜 줄 수 있습니다. _왜 그렇게 되었는지_에 대해서만큼은 결국 꾸며 낸 이야기밖에 내놓지 못합니다.
에이전트는 “안 써 둔 것”의 비용을 훨씬 빠르게 복리로 키운다
팀들은 오랫동안 높은 인텐트 부채를 대충 안고도 버텨 왔습니다. 그 인텐트를 사람 머릿속과 오래된 문서에 떠맡겼기 때문입니다.
새 사람이 팀에 합류해도, 모든 걸 다 글로 남기진 않았습니다. 시간이 지나면서 자연스럽게 인텐트를 흡수할 거라고 여겼기 때문입니다. 복도에서의 대화, 코드 리뷰 코멘트, “아, 그건 2023년에 사고가 한 번 나서 그렇게 안 해” 같은 이야기들 말이죠. 지식은 사람에서 사람으로 옮겨 다니며 쌓였습니다. 네 해를 버틴 엔지니어 한 명이 사실상 인텐트 문서 전체인 셈이었습니다. 비싸고 손실도 많았지만, 그럭저럭 작동하긴 했습니다.
에이전트는 이 모델을 깨 버립니다. 팀에 에이전트를 도입하는 것은 장기 기억이 전혀 없는 주니어 인력들을 한 번에 팀 규모만큼 늘리는 것과 같습니다. 에이전트는 대부분의 세션을 ‘빈 손’으로 시작합니다. 수년간 사람들 사이에서 쌓인 암묵적 인텐트는 전혀 가지지 못합니다. 당신이 읽을 수 있는 산출물로 외부화 하지 않은 인텐트는, 에이전트에게는 아예 존재하지 않는 셈입니다.
이 때문에 “안 써 두는 것”의 경제학이 완전히 바뀝니다. 외부화되지 않은 인텐트는 예전에는 가끔 한 번씩만 비용을 청구했습니다. 누가 새로 들어왔을 때나, 누가 떠났을 때 정도요. 이제는 에이전트를 한 번 돌릴 때마다, 그 세션마다 비용을 냅니다. 에이전트를 얼마나 많이 돌리느냐에 비례해서요.
지금 막 병렬 실행에 들떠서 띄워 둔 20개의 에이전트를 떠올려 보세요. 각각은 당신을 한 번도 만나 본 적이 없고, 당신 마음을 읽을 수 없으며, 인텐트가 비어 있는 자리는 그럴듯한 추측으로 가득 채워 버리는 팀 동료입니다. 제가 예전에 썼던 오케스트레이션 비용의 일부는 사실 인텐트 부채 비용입니다. 수많은 에이전트를 관리하는 일이 그렇게 피곤한 이유 중 상당수는, 애초에 적어 두지 않은 인텐트를 계속 다시 공급해 줘야 하기 때문입니다.
이해 부채 논의의 나머지 절반
예전에 제가 이해 부채에 대해 썼을 때, 지금 다시 짚고 싶은 포인트가 하나 있습니다. 인텐트 부채를 알게 되니 그 지점이 더 날카롭게 다가옵니다.
그 글에서 저는 상세한 스펙이 완전한 해답이 될 수는 없다고 주장했습니다. 스펙을 실제 동작하는 코드로 옮기는 과정에는, 어떤 스펙도 전부 담을 수 없는 수많은 암묵적인 결정들이 개입합니다. 그리고 스펙이 모든 것을 코드 수준으로 세세하게 담고 있다면, 그 스펙은 사실상 코드 그 자체이고, 다만 더 느린 언어로 쓴 코드일 뿐입니다. 이 생각은 지금도 유효하다고 믿습니다.
인텐트 부채는 그에 대한 보완적인 진실입니다.
모든 인텐트를 다 담을 수 없다고 해서, 아무 인텐트도 담지 않아도 된다는 뜻은 아닙니다. 이제 에이전트가 당신을 대신해 내려 주는 암묵적인 결정들, 스펙이 끝내 나열하지 못할 그 수많은 선택들의 근거는, 적어도 “잘못되면 비싸게 치러야 할” 것들만큼은 기록해 두지 않으면 그대로 증발해 버립니다. 모든 것을 다 적어 둘 수는 없습니다.
그렇지만 “틀리면 값비싼” 선택들에 대해서는 왜 그렇게 했는지 기록을 남겨야 합니다. 그렇지 않으면 나중에 아무도 그 이유를 복원하지 못합니다.
이해 부채는 “코드가 존재한다는 이유만으로 올바르다고 믿지 말라”고 경고합니다.
인텐트 부채는 “코드가 존재한다고 해서 그 코드에 담긴 이유 까지 보존된다고 믿지 말라”고 경고합니다. 코드는 “답”입니다. 인텐트는 그 답이 풀어야 했던 “질문”입니다. AI는 당신이 적어 두지 않은 질문에 대한 답을 끝도 없이 잘 지어내 주는 탁월한 존재입니다.
인텐트 부채가 높은 상태는 어떻게 보이는가
인텐트 부채는 잘 드러나지 않습니다. 대신 아주 독특한 종류의 무력감으로 모습을 드러냅니다.
- 에이전트가 버그를 “고친다”며 가드 절을 하나 삭제해 버렸는데, 아무도 이 가드가 진짜로 꼭 필요했던 것인지, 아니면 예전 코드의 잔재였는지 말하지 못합니다. 왜 있었는지를 문서나 커밋 메시지 어디에도 남겨 두지 않았기 때문입니다.
- 리팩터링 과정에서 사용자가 의존하던 동작이 바뀝니다. 리뷰는 깨끗이 통과했습니다. 변경 diff는 깔끔해 보였고, 테스트도 전부 통과했습니다. 하지만 그 테스트들이 담고 있던 건 예전 동작뿐이었지, 인텐트까지는 담고 있지 않았습니다.
- 왜 두 서비스가 직접 호출 대신 큐로 통신하는지 물었을 때, 솔직한 답이 “에이전트가 그렇게 하길래 괜찮아 보여서요”라면, 그 답변은 이미 이자가 붙기 시작한 인텐트 부채입니다.
혹시 인지적 항복(cognitive surrender)을 경험해 본 적이 있다면, 즉 스스로도 더 이상 근거를 복원하지 못하는 설계를 끝까지 방어해야 했던 순간을 떠올려 보세요. 인텐트 부채는 그러한 구멍이 팀 단위, 레포 단위로 글로 박제된 버전입니다.
인지적 항복은 그 순간, 나 자신의 태도에 관한 이야기입니다. 인텐트 부채는 그러한 순간이 백 번, 천 번 쌓였을 때 다음 사람, 다음 에이전트가 물려받게 되는 레포의 상태입니다.
상환 방법: 인텐트를 1급 산출물로 외부화하라
지난 몇 달 동안 제가 써 온 거의 모든 글은 이제 돌이켜 보면 인텐트 부채 관리에 관한 이야기였습니다. 다만 그때는 그걸 그렇게 부르지 않았을 뿐이죠. 핵심은 매번 같았습니다. 머릿속에만 있는 인텐트를 꺼내, 에이전트가 읽을 수 있는 어딘가로 옮기는 것.
구현이 아니라 인텐트를 위한 스펙을 써라. 좋은 스펙은 목표, 제약, 양보할 수 없는 것들, 그리고 “기능적으로 동작한다”를 넘어선 명시적인 완료 정의(빠른가, 접근 가능한가, 안전한가, 즐거운가)를 담습니다. 스펙은 코드만으로는 담기지 않는 인텐트를 실어 나르는 그릇입니다.
AGENTS.md를 설정 파일이 아니라 인텐트 장부로 취급하라. 제가 계속해서 /init을 쓰지 말라고 이야기하는 이유가 여기에 있습니다. 자동 생성된 파일은 코드가 _무엇인지_를 묘사할 뿐입니다. 인텐트 파일은 팀이 _무엇을 의미하는지_를 기록합니다. 팀의 관례, “우리는 이런 이유로 이런 방식은 쓰지 않는다”, 개별 파일에서는 보이지 않는 제약들이 여기에 담깁니다. 에이전트는 이런 것들을 추론해 낼 수 없고, 오히려 이런 정보가 가장 절실합니다.
결정이 내려지는 자리에서 바로 기록하라. 가벼운 결정 로그(ADR)는 인텐트 부채 상환 그 자체입니다. 결정을 내리는 그 순간, 왜 그런 결론에 이르렀는지 적어 두는 데 드는 비용은 거의 없습니다. 하지만 결정을 내린 사람이 다른 팀으로 옮겨간 뒤, 8개월이 지나 다시 그 이유를 복원하려 하면 엄청난 비용이 듭니다. 에이전트 덕분에 로깅은 그 어느 때보다 쉬워졌습니다. 예전의 “번거로워서 안 쓴다”는 변명은 이제 통하지 않습니다.
학습 루프가 인텐트를 다시 써 내려가게 하라. 저는 스스로 개선하는 에이전트에 대해 이야기하며, 세션이 끝날 때마다 learnings 파일을 업데이트하는 루프를 제안해 왔습니다. 이 루프는 인텐트 부채를 거꾸로 흡수하는 펌프와도 같습니다. 실수의 근본 원인을 기록하는 것, “X를 시도해 봤지만 Y 때문에 통하지 않았음”을 남기는 것, 이 모든 것이 원래라면 “그때 참 고생했지” 하는 기억 속에만 머물다 사라졌을 인텐트를 다시 밖으로 끌어내는 행위입니다.
여기서 쓰고 있는 도구들 자체는 새롭지 않습니다. 달라진 건, 이제 우리의 일이 더 이상 주로 머릿속에서 일어나지 않는 시대에, 왜 그런 선택을 했는지가 머릿속에만 존재하도록 내버려 두지 않겠다는 태도, 그 훈련입니다.
가치가 이동한 자리
오랫동안 소프트웨어에서 드문 자원이자 가장 값진 능력은 “정확한 구현을 만들어 내는 능력”이었습니다. 코드를 쓰는 일은 비쌌고, 우리는 코드를 얼마나 잘 쓰느냐에 맞춰 최적화했습니다.
AI는 코드를 싸게 만들었고, 이해는 회복 가능한 것이 되었습니다. 목표, 제약, 이유로 이루어진 인텐트만이 여전히 사람에게서 시작되어야 하는 유일한 입력입니다. 그리고 지난 수십 년 동안 우리는 이걸 외부화하는 데 가장 서툴렀습니다. 머릿속에 담아 두고도 그럭저럭 버틸 수 있었기 때문입니다.
팀이 몇 안 되는 사람들로 이루어져 있고, 수년에 걸친 공동의 맥락을 통해 인텐트를 흡수할 수 있을 때는 그 방식이 그럭저럭 통했습니다. 지금처럼, 팀의 절반이 매 세션마다 낯선 사람처럼 아무것도 모르는 상태로 시작하는 에이전트인 시대에는 통하지 않습니다.
기술 부채는 시스템을 바꾸기 어렵게 만듭니다. 인지 부채는 시스템을 이해하기 어렵게 만듭니다. 인텐트 부채는 시스템이 여전히 당신이 원했던 일을 하고 있는지조차 알기 어렵게 만듭니다. 그리고 이 셋 중, 에이전트가 대신 갚아 줄 수 없는 유일한 부채가 바로 이 인텐트 부채입니다. 이 부분만큼은 끝까지 당신 몫으로 남습니다. “왜”를 적어 두십시오. 이제 그게 레포에 남길 수 있는 것들 가운데 가장 값진 것이 되어 가고 있으니까요.