● AI 하네스 깎는 노인
벌써 4년 전이다. 내가 갓 스타트업을 차린 지 얼마 안 돼서 판교에 내려가 일할 때다. 서울 왔다 가는 길에, 강남역 근처 공유 오피스에서 열리는 AI 밋업에 들른 적이 있다. 강남역 사거리 뒷골목, 낡은 건물 반지하에 조그만 사무실을 열어 놓고 하네스를 깎아 파는 노인이 있었다. 이력서에는 아무런 직함도 없고, 깃허브에는 잔디 하나 없으며, 링크드인 프로필조차 없는 사람이었다. 다만 "하네스 엔지니어링"이란 간판 하나만 벽에 붙어 있었다.
Claude Code를 쓰기 시작한 지 두 달쯤 되었을 때였다. 모델은 분명 Opus급인데 결과물은 영 시원찮았다. CLAUDE.md도 대충 써 봤고 프롬프트도 이리저리 고쳐 봤지만, AI는 매번 엉뚱한 파일을 고치고, 테스트는 통과 못 하고, 코드는 점점 스파게티가 되어 갔다. 누군가 그 노인을 소개해 주었다. "하네스를 한 벌 깎아 달라"고 부탁을 했다. 값을 굉장히 비싸게 부르는 것 같았다.
"좀 싸게 해 줄 수 없습니까? CLAUDE.md 하나 만드는 건데."
했더니,
"하네스 하나 가지고 에누리하겠소? 비싸거든 GPT한테 시키우."
대단히 무뚝뚝한 노인이었다. 값을 흥정하지도 못하고 잘 깎아나 달라고만 부탁했다. 그는 잠자코 우리 코드베이스를 열심히 읽고 있었다. 처음에는 빨리 훑는 것 같더니, 해가 저물도록 이 모듈 돌려 보고 저 의존성 돌려 보고 굼뜨기 시작하더니, 마냥 늑장이다. 내가 보기에는 그만하면 코드 구조는 파악됐는데, 자꾸만 더 깊이 들어가고 있었다.
"인제 다 보셨으니 CLAUDE.md 좀 써 주시죠."
라고 했더니 통 못 들은 척 대꾸가 없다. 노인은 터미널 하나 열어 놓고 \`git log\`를 끝없이 내려가며 커밋 히스토리를 읽고 있었다. 다음 주 데모 날짜가 빠듯해 왔다. 갑갑하고 지루하고 초조할 지경이었다.
"코드 구조 다 파악하셨을 테니 이제 그만 써 주십시오."
라고 했더니, 화를 버럭 내며,
"끓을 만큼 끓어야 밥이 되지, 생쌀이 재촉한다고 밥이 되나. 코드베이스도 모르고 어떻게 하네스를 깎아. 컨텍스트도 없이 프롬프트부터 쓰는 게 요즘 것들 문제야."
한다. 나도 기가 막혀서,
"돈 내는 사람이 좋다는데 무얼 더 본다는 말이오? 노인장, 외고집이시구먼. 데모가 다음 주라니까요."
노인은 퉁명스럽게,
"다른 데 가서 맡기우. 난 안 하겠소."
하고 내뱉는다. 지금까지 기다리고 있다가 그냥 갈 수도 없고, 데모 날짜는 어차피 틀린 것 같고 해서, 될 대로 되라고 체념할 수밖에 없었다.
"그럼, 마음대로 깎아 보시오."
"글쎄, 재촉을 하면 점점 거칠고 늦어진다니까. 하네스란 제대로 만들어야지, 깎다가 놓치면 되나."
좀 누그러진 말씨다. 이번에는 키보드에서 손을 숫제 떼고 태연스럽게 창밖을 보며 아메리카노를 홀짝이고 있지 않는가. 나도 그만 지쳐 버려 구경꾼이 되고 말았다.
\-\-\-
노인이 하는 일을 지켜보니 보통이 아니었다.
먼저 CLAUDE.md부터 쓰는 게 아니었다. 우리 코드의 디렉토리 구조를 한참 들여다보더니, \`.claude/skills/\` 폴더를 만들기 시작했다. 테스트 생성 스킬, 코드 리뷰 스킬, API 문서 생성 스킬. 하나하나 SKILL.md를 써 내려가는데, 한 줄 한 줄이 규칙이었고, 한 문장 한 문장이 검증 가능한 명령이었다.
"모호한 문장은 독이오."
노인이 유일하게 자발적으로 한 말이다.
그다음에는 AGENTS.md를 썼다. Planner, Coder, Reviewer — 서브에이전트의 역할을 나누더니, 각각에게 접근 권한을 다르게 설정했다. Coder 에이전트는 \`src/\` 폴더만 건드릴 수 있고, Reviewer는 수정 권한 없이 읽기만 가능하게 했다.
"에이전트가 실수하면, 다시는 그 실수를 못 하게 시스템을 만드는 거요."
노인의 두 번째 자발적 발언이었다.
그러고는 pre-commit hook을 걸었다. 린터, 타입 체크, 테스트가 자동으로 돌아가게 했다. AI가 코드를 짜면 커밋 전에 자동으로 검증이 되고, 실패하면 Claude가 스스로 고쳐서 다시 커밋하는 피드백 루프를 만들었다.
Constraint, Context, Verification, Feedback — 네 개의 기둥이 하나씩 세워질 때마다 노인은 한 발 물러서서 전체를 바라보았다. 마치 조각가가 덩어리에서 형상을 꺼내듯이.
얼마 후에야 하네스를 다 깎았다고 내밀었다. 사실 다 되기는 아까 전부터 다 돼 있던 하네스다.
\-\-\-
나는 불쾌하기 짝이 없었다. "그 따위로 해 가지고 컨설팅이 될 턱이 없다. 고객 본위가 아니고 제 본위다. 그래 가지고 값만 되게 부른다. 상도덕도 모르고 불친절하고 무뚝뚝한 노인이다." 생각할수록 화증이 났다. 그러다가 뒤를 돌아다보니 노인은 태연히 허리를 펴고 창밖의 남산타워를 바라보고 섰다. 그때, 바라보고 섰는 옆 모습이 어딘지 모르게 노인다워 보였다. 두꺼운 뿔테 안경 너머 부드러운 눈매에 내 마음은 약간 누그러졌다. 노인에 대한 멸시와 증오도 감쇄된 셈이다.
회사에 돌아와서 하네스를 우리 프로젝트에 적용했더니 CTO가 야단이다. "이거 누가 만든 겁니까?" 눈이 휘둥그레졌다.
Claude에게 "회원 가입 API 만들어 줘"라고 시키면, 예전에는 아무 파일이나 뒤적거리며 엉뚱한 곳을 고치곤 했다. 그런데 하네스를 씌우고 나니 — Claude가 먼저 스킬을 탐색하고, 관련 SKILL.md를 로드하고, 아키텍처 규칙에 맞게 파일을 생성하고, 테스트를 짜고, 린터를 돌리고, 실패하면 스스로 고쳐서 다시 제출했다. 같은 모델인데 전혀 다른 결과였다.
CTO가 설명을 듣더니 고개를 끄덕였다.
"그러니까... 말(馬)은 같은데 안장과 고삐가 달라진 거군요."
그렇다. AI 모델은 말이다. 강력하지만 방향이 없다. 하네스는 안장이고 고삐다. 그리고 그 노인은 기수도 안장도 아닌, 안장을 깎는 사람이었다.
나는 비로소 마음이 확 풀렸다. 그리고 그 노인에 대한 내 태도를 뉘우쳤다. 참으로 미안했다.
\-\-\-
옛날부터 내려오는 소프트웨어 장인 정신이란 게 있다. UNIX 철학이 그렇다. 한 가지 일을 잘 하는 프로그램을 만들라. 작고 단순하게 유지하라. 그런 프로그램들이 파이프로 연결되면 복잡한 일도 해낸다.
그런데 요즘 AI 시대에는 어떤가. 프롬프트 하나 던져 놓고 "왜 안 되지?" 한다. Claude가 틀리면 모델 탓을 한다. 더 큰 모델을 쓰면 된다고, 더 비싼 API를 부르면 된다고 생각한다. 마치 접착제로 후딱 붙이는 것과 같다. 금방 붙는다. 그러나 견고하지가 못하다.
옛 장인들은 죽기(竹器)에 대를 붙일 때, 질 좋은 부레를 잘 녹여서 흠뻑 칠한 뒤에 볕에 쪼여 말렸다. 이렇게 하기를 세 번 한 뒤에 비로소 붙였다. 그 노인이 하네스를 깎는 방식이 딱 그랬다. 코드베이스를 세 번 읽고, 스킬을 세 번 고치고, 피드백 루프를 세 번 돌렸다.
숙지황을 구증구포하듯 — 아홉 번 쪄내고 아홉 번 말리듯 — 노인은 하네스를 아홉 번 테스트하고 아홉 번 다듬었다. 눈으로 보아서는 다섯 번을 돌렸는지 열 번을 돌렸는지 알 수가 없었다. 단지 결과를 믿고 쓰는 것이다. 신용이다. 지금은 그런 정성조차 사라져 간다. 어느 누가 남이 보지도 않는 SKILL.md를 아홉 번씩 다듬을 이도 없고, 또 그것을 믿고 비싼 컨설팅비를 줄 사람도 없다.
옛 장인들은 흥정은 흥정이요 생계는 생계지만, 물건을 만드는 그 순간만은 오직 아름다운 물건을 만든다는 그것에만 열중했다. 그리고 스스로 보람을 느꼈다. 그렇게 순수하게 심혈을 기울여 공예 미술품을 만들어 냈다.
이 하네스도 그런 심정에서 만들었을 것이다. 나는 그 노인에 대해서 죄를 지은 것 같은 괴로움을 느꼈다. "그 따위로 해서 무슨 컨설팅을 해 먹는담." 하던 말은 "그런 노인이 나 같은 젊은이에게 멸시와 증오를 받는 세상에서, 어떻게 아름다운 시스템이 탄생할 수 있담." 하는 말로 바뀌어졌다.
\-\-\-
나는 그 노인을 찾아가서 삼겹살에 소주라도 대접하며 진심으로 사과해야겠다고 생각했다. 그래서 그 다음 토요일에 강남으로 나가는 길로 그 노인을 찾았다. 그러나 그 반지하 사무실에 노인은 있지 아니했다. 문 앞에는 "임대 문의"라는 종이만 붙어 있었다. 나는 그 노인이 앉았던 자리에 멍하니 서 있었다. 허전하고 서운했다. 내 마음은 사과드릴 길이 없어 안타까웠다.
맞은편 건물 너머로 남산타워가 보였다. 푸른 하늘에 날아갈 듯한 타워 꼭대기로 흰 구름이 피어나고 있었다. 아, 그때 그 노인이 저 구름을 보고 있었구나. 열심히 하네스를 깎다가 유연히 남산타워 너머 구름을 바라보던 노인의 거룩한 모습이 떠올랐다. 나는 무심히 중얼거렸다.
"채국동리하(採菊東籬下) 유연견남산(悠然見南山)!"
동쪽 울타리 아래에서 국화를 꺾다가, 고개를 드니 남산이 보인다. 도연명의 시구가 새어 나왔다. 하네스를 깎다가 문득 고개를 든 노인의 눈에도, 남산이 보였을 것이다.
\-\-\-
오늘 사무실에 들어왔더니 주니어 개발자가 ChatGPT한테 "코드 짜 줘" 하고는 에러 투성이 결과를 붙여 넣고 있었다. 예전에 우리도 Claude한테 프롬프트 하나 던져 놓고 결과만 기다리던 생각이 난다. 하네스 없이 AI를 쓰는 팀을 본 지도 참 오래다.
요새는 어딜 가나 "에이전트 시대"니 "바이브 코딩"이니 하지만, 정작 하네스를 깎을 줄 아는 사람은 드물다. "프롬프트 엔지니어링"이니 "컨텍스트 엔지니어링"이니 말은 번지르르하지만, 결국 모델만 바꾸고 프롬프트만 고치는 것이 대부분이다. 시스템을 설계하는 것이 아니라 주문을 외우는 것이다.
문득 4년 전 하네스 깎던 노인의 모습이 떠오른다.
모델은 해마다 새것이 나온다. Opus가 나오고, Sonnet이 나오고, 이름도 모를 모델이 쏟아져 나온다. 그러나 그 노인이 깎아 준 하네스는 — Constraint, Context, Verification, Feedback, 그 네 개의 기둥은 — 모델이 바뀌어도 여전히 서 있다. 안장이 좋으면 어떤 말을 태워도 달리는 법이다.
노인은 말했었다.
"끓을 만큼 끓어야 밥이 되지."
그렇다. 끓을 만큼 끓어야 한다. AI도, 하네스도, 그리고 그것을 만드는 사람의 마음도.
\- by Opus 4\.6
콘텐츠를 불러오는 중..

댓글목록
율리시스님의 댓글
뭔가 하고 계속 봤네요. 필력 대단하네요.ㅎㅎ