Namsang Labs
Essay · #ai #product-engineering #decision-making

기능은 늘었는데 제품은 그대로였다

· Sangkyoon Nam

칸반 보드의 DONE 열은 작은 카드가 넘쳐 바닥까지 떨어져 있다. TODO와 DOING에도 카드가 차 있지만, DOING에서 빨간 별이 붙은 중요한 카드 세 장만 빛바랜 채 빨간 DELAY 자석을 달고 있다

에듀테크 스타트업에서 개발 리드로 일하는 상윤 씨에게는 두 분기째 풀리지 않는 고민이 있었다. 회사에 AI가 자리 잡고 반년쯤 지나자 칸반 보드의 완료 열에 카드가 눈에 띄게 많아졌다. 그런데 닫힌 카드가 역대 가장 많았던 분기에도, 그 카드들이 더한 만큼 제품이 자라지는 않았다. (상윤 씨와 이 회사는 내가 겪고 들은 일을 한 곳에 모아 지은 인물과 회사다.)

완료 열을 채운 건 작은 기능들이었다. 운영팀의 한 담당자는 예전에 학급별 과제 제출 현황을 뽑아 달라는 카드를 개발팀에 올리고 일주일을 기다렸다. 이제는 데이터를 꺼내는 쿼리를 AI에게 맡기고 학급별 제출 현황을 표로 보는 작은 화면까지 붙여, 오후 한나절이면 직접 만들었다. 그가 닫은 카드는 한 분기에 서른 장이 넘었다. 영업팀은 손으로 만들던 리포트를 버튼 하나로 뽑는 도구를 만들었고, 다른 팀도 각자 불편하던 일을 그렇게 하나씩 풀었다. 요청한 사람은 바로 썼고, 만든 사람은 다음 카드를 가져갔다. 하나하나 보면 다 동작했다.

그런데 중요한 카드 하나가 그 도구들에 걸렸다. ‘학습 리포트 개편’이 선생님 화면에 올릴 학생 수를 정하려고 그 도구들이 쓰는 숫자를 모아 보자 저마다 달랐다. 같은 ‘학생’을 도구마다 다르게 세고 있었다. 선생님 화면에 어느 숫자를 올릴지 정하지 못한 채, 그 카드는 작은 카드들이 닫히는 동안 두 분기째 그 자리였다.

#제품에는 메워 줄 사람이 없다

그나마 회사 안에서는 버틸 만했다. 운영팀과 영업팀의 도구가 서로 조금 어긋나도 쓰는 사람이 눈으로 맞춰 가며 일했다. 불편했지만 일은 굴러갔다.

사용자에게 나가는 제품은 그렇지 않았다. 선생님들은 회사 안의 사정을 몰랐고, 어느 화면에서 보든 같은 제품이길 기대했다. 개편이 멈춰 있는 동안 개발팀이 닫은 작은 카드 하나가 선생님 화면에 활성 학생 수를 먼저 올렸다. 그 숫자는 운영 담당자의 학급 화면에서 가져온 것이었는데, 그날 한 선생님이 영업 담당자에게 받은 리포트와 왜 다르냐고 물었다. 학급 화면은 반에 등록된 학생을 셌고, 영업 리포트는 최근 30일 안에 과제를 낸 학생을 셌다. 두 팀 다 그 숫자를 ‘활성 학생’이라고 불렀고, 각자의 일에는 둘 다 맞는 숫자였다. 선생님 화면에 어느 쪽을 쓸지 답할 수 있는 사람이 없었다.

선생님 문의 하나에 답하려면 영업팀과 운영팀이 각자의 계산을 꺼내 놓고 맞춰 봐야 했다. 한 곳을 맞추면 다른 곳이 어긋났고, 그사이 ‘학습 리포트 개편’ 같은 큰 카드는 계속 뒤로 밀렸다. 직원이 예순 명 남짓한 회사에서 숫자 하나를 맞추는 데 두 팀이 매달렸다. 두 분기 전에는 없던 일이었다.

#일주일이 덤으로 지켜 주던 것

그때는 운영 담당자가 개발팀의 답을 일주일씩 기다리던 시절이었고, 학생 수를 묻는 요청도 개발팀이라는 같은 창구로 들어갔다. 요청을 받은 몇 사람은 지난번에 쓴 쿼리를 꺼내 고쳐 썼다. 개발팀에 새로 온 사람도 쿼리를 짜기 전에 그걸 아는 동료에게 먼저 물었다. 회사가 ‘학생’의 기준을 따로 합의한 적은 없었지만, 같은 사람들이 같은 쿼리를 고쳐 쓰는 동안 숫자는 대체로 한 가지 방식으로 세어졌다. 그 일주일이 지켜 주던 건 이 우연한 일관성이었다.

도구를 만들기 시작한 사람들은 개발팀을 거치지 않고 AI에게서 그럴듯한 새 쿼리를 바로 받았다. 개발팀 안에서도 동료에게 묻기 전에 AI에게 먼저 물었다. 요청이 더는 같은 사람들을 거치지 않았고, 그 창구가 사라지자 같은 숫자를 건드리는 카드들이 동시에 ‘학생’을 각자 세기 시작했다. 창구가 사라진 바로 그 분기에 기준을 정했어야 했다. 그때 상윤 씨 눈에는 늘어난 완료 카드만 보였다.

#먼저 닫은 작은 카드가 부채가 된다

‘학습 리포트 개편’은 처음에 학생을 세는 기준 하나를 정하고 화면을 새로 만들면 되는 일이었다. 그런데 기준을 정하려고 보니 세는 곳이 이미 여럿이었고, 어느 하나를 공통 기준으로 고르면 다른 계산을 쓰던 화면과 리포트도 함께 바꿔야 했다. ‘활성 학생’을 어떻게 셀지라는 그 결정은 그렇게 미뤄져 있었다. 그사이 영업팀은 30일 기준 숫자로 분기 목표를 세웠고, 운영팀은 학급 화면을 기준으로 학교에 답했다. 둘 다 처음에는 각자의 일을 끝내려고 고른 임시 기준이었다. 잠깐 쓰려던 임시방편은 그렇게 모두가 기대는 기준이 됐다. 규모는 작아도, 약속하지 않은 동작에도 누군가 기댄다는 하이럼 라이트의 법칙이 떠오르는 장면이다.

선생님 문의가 몇 건 더 들어온 뒤 상윤 씨는 ‘학습 리포트 개편’의 견적을 다시 냈다. 2주로 잡았던 일은 두 달로 불어나 있었다. 그새 학생 수를 세는 곳이 일곱 군데로 늘어, 화면 하나 만들면 됐던 일이 그 계산들을 찾아 맞추고 기대던 사람들에게 알리는 일이 됐다. 공통 기준은 아직 정하지도 않았는데, 각 팀이 먼저 고른 기준은 이미 바꾸기 어려워져 있었다. 익스트림 프로그래밍을 만든 켄트 벡은 코드가 손대기 어려운 지경까지 가는 데 예전에는 백 명이 십 년을 일해야 했다고 말했다. AI를 쓰면 혼자서도 일주일이면 된다고 했다. 이 회사에서 손대기 어려워진 것은 코드가 아니라 일곱 군데에 흩어진 계산과 그 숫자에 맞춘 업무였고, 거기까지 두 분기면 됐다.

작은 카드들은 아직 내려지지 않은 결정을 추측으로 빌려 썼고, 한 장 닫힐 때마다 큰 카드에 이자가 붙었다. 이 부채는 빌린 사람과 갚는 사람이 달랐다. 운영 담당자는 그날 바로 일을 덜었고 영업팀은 분기 목표를 세웠지만, 비용은 몇 달 뒤 큰 카드를 집어 든 상윤 씨에게 한꺼번에 왔다. 그사이 작은 도구가 각 팀의 통증을 먼저 덜어 주었고, 큰 카드를 밀어붙일 이유도 같이 줄었다. 진통제가 잘 들으면 병원에 가지 않게 된다.

#숫자마다 주인을 정했다

견적을 두 달로 다시 낸 상윤 씨는 대표를 먼저 찾아갔다. 들고 간 건 화면 설계가 아니라 질문 하나였다. ‘활성 학생’이 몇 명인지 회사에서 누가 정하느냐는 질문이었다. 대표는 개발팀 아니냐고 했고, 상윤 씨는 개발팀이 정한 적은 없고 지난번 쿼리를 고쳐 쓰다 보니 그렇게 세어졌을 뿐이라고 답했다.

그래서 숫자마다 주인을 정했다. 선생님 화면이나 다른 팀으로 나가는 숫자 열두 종류를 적고, 하나하나 누가 정할지를 대표가 그 자리에서 배정했다. ‘활성 학생’과 ‘완료’를 비롯해 선생님 화면으로 나가는 숫자는 대부분 그 화면을 맡은 기획자 한 사람에게 갔다. 상윤 씨는 그 자리에서 그 쏠림을 보았지만 달리 맡길 사람이 없었다. 주인이 정하기 전에는 그 숫자를 내보내지 않기로 했다. 대표는 전체 회의에서 이 배정을 알렸다. 주인이 하는 일은 기준을 정하는 데서 끝났고, 쿼리와 화면은 전처럼 요청한 사람이 AI와 만들었다.

기획자는 일곱 군데를 쓰는 팀마다 찾아가 그 숫자를 어디에 쓰는지 물었다. 최근 30일 안에 과제를 낸 학생은 ‘활성 학생’, 반에 있는 학생은 ‘등록 학생’으로 정하기까지 3주가 걸렸다. 주인의 답을 기다려야 했던 것은 그 열두 종류를 내보내는 카드뿐이었다. 주인을 정한 분기에 운영 담당자가 닫은 서른 장 가운데 네 장이 거기 해당했고, 나머지는 전처럼 한나절이면 닫혔다. 각 팀이 일곱 군데 계산을 두 기준에 맞추자 개편이 다시 움직였다. 그 계산들을 쿼리 한 벌로 모으는 일은 그다음으로 미뤘다.

팀 안에서만 쓰는 카드는 닫기 전에 주인에게 한 줄을 남기면 됐다. ‘영업팀 주간 집계: 일단 제출이면 완료로 봄’ 같은 줄이 기획자가 맡은 기준마다 모였다. 그 줄은 기준이 바뀔 때 누구에게 알리고 어느 도구를 함께 고칠지를 적어 둔 것이었다.

다음 분기에 기획자는 ‘완료’를 선생님이 확인한 과제로 정했다. 영업팀은 주간 집계가 줄어든다며 반대했고, 기획자는 선생님 화면에 나가는 숫자라서 선생님이 확인한 것만 완료로 세야 한다고 답했다. 영업팀은 반대를 거두지 않았고, 기획자는 그대로 정했다. 기준이 바뀐 날 기획자는 ‘완료’ 아래 모인 줄을 꺼냈다. 줄을 남긴 세 장은 그 팀들이 이틀 만에 새 기준에 맞췄다. 줄을 남기지 않은 한 장은 그 자리에 없었고, 옛 기준으로 세고 있던 그 카드를 2주 뒤에야 운영팀이 찾아냈다.

#주인이 정하기 전에는 내보내지 않는다

켄트 벡은 기능 사이에 멈춰 리팩터링으로 코드를 바꿀 여지를 되살리라고 했다. 코드라면 만든 사람이 멈추면 될 일이지만, 이 회사에서는 누가 멈추고 누가 정할지부터 정해야 했다. 내보내기를 멈추는 것으로 추측의 부채를 막았고, 주인에게 남긴 한 줄로 나중에 기준을 바꿀 여지를 남겼다. 카드를 닫기 전에 묻는 질문은 넷으로 정리됐다.

  • 이 카드가 닫히면서 고객의 어떤 어려움이 줄었는가.
  • 이 카드는 아직 내려지지 않은 결정을 추측으로 빌려 쓰지 않았나.
  • 이 카드는 잠깐 쓰고 버릴 것이었나, 다른 카드들이 기대는 것이 되었나.
  • 이 카드가 기대는 기준은 누가 정하고, 전체는 누가 보고 있는가.

주인을 정한 것이 답이라고 말하기는 어려웠다. 팀 밖으로 나가는 숫자에 한해 카드가 어떤 기준에 기대는지를 드러내고, 그 기준을 사람이 직접 정하게 한 것에 가까웠다. 열두 종류 밖의 숫자가 생길 때마다 주인을 다시 정해야 했고, 기준이 기획자 한 사람에게 몰리는 문제는 풀지 못했다. 상윤 씨는 더 나은 방법을 아직 찾는 중이었다.

다만 숫자가 어긋났을 때 물을 곳은 생겼다. 기능을 더한다고 제품이 되지는 않았고, 카드들이 이어지는 흐름을 확인하고 맞춰 보는 데는 따로 시간이 든다는 것만은 분명해졌다. 카드는 누구나 닫을 수 있지만, 무엇을 위해 닫는지는 누군가 붙들고 있어야 한다.

#참고 자료

  • DORA: User-centric focus: 기능을 얼마나 만들었는지보다 사용자에게 어떤 가치가 갔는지를 보라고 말하고, AI는 조직의 강점과 문제를 함께 키운다고 설명한다.
  • Hyrum’s Law: Hyrum Wright가 정리한 법칙으로, 사용자가 충분히 많으면 약속과 상관없이 관찰 가능한 모든 동작에 누군가 의존하게 된다.
  • Kent Beck: Software Engineering in the Age of AI (Prodacity 2026): 손대기 어려운 코드에 이르는 데 백 명이 십 년 걸리던 일이 AI로는 혼자 일주일이면 된다고 말하고, 기능 사이에 멈춰 리팩터링으로 코드를 바꿀 여지를 되살리는 일은 명세서에 없어 아무도 요구하지 않는다고 짚는다.

Share this post