기술

'이건 3시간이면 되지'라고 견적에 적으려는데, 과거의 내가 실측 3건을 들고 끼어들었습니다

2026.09.268분 읽기

견적서 초안을 뽑는 화면에서 항목 하나를 적고 있었습니다. '소셜 로그인 연동'. 공수 칸에 커서를 두는 순간 머릿속에서 먼저 나온 숫자는 3시간이었습니다. 소셜 로그인은 여러 번 붙여봤고, 지난번에도 금방 끝났다는 기억이 있었습니다.

그런데 그 '지난번'이 어느 프로젝트였는지, 실제로 몇 시간이 들었는지는 기억에 없었습니다. 남아 있는 건 '금방 끝났다'는 인상뿐이었습니다. 견적의 공수는 그 인상으로 적히고 있었습니다.


과소 산정은 다짐으로 안 고쳐졌습니다

견적을 적게 잡으면 그 차이는 전부 제 야근으로 메워집니다. 그래서 프로젝트가 끝날 때마다 '다음엔 넉넉히 잡자'고 다짐했습니다. 그 다짐은 다음 견적서를 열 때쯤이면 사라져 있었습니다. 다짐은 기억에 저장되고, 기억은 낙관 쪽으로 기울어 있습니다.

정작 데이터는 있었습니다. 내부 프로젝트 관리 도구에는 완료된 작업이 1,072건 쌓여 있었고, 그중 482건(45%)에는 실제 소요 시간이 분 단위로 적혀 있었습니다. 작업을 닫을 때마다 기록해둔 값입니다. 이 값을 견적을 쓸 때 꺼내 본 적은 한 번도 없었습니다.

문제를 다시 정의하면 이렇습니다. 과소 산정은 실력의 문제가 아니라 기억의 문제였습니다. 실측은 도구 안에 있는데, 견적을 적는 순간에는 기억만 쓰고 있었습니다. 그렇다면 고칠 것은 사람의 다짐이 아니라, 실측이 그 순간에 자동으로 끼어드는 구조입니다.

견적 공수 산정 BEFORE/AFTER — 기억으로 3시간을 적는 화면과 과거 완료 작업 3건의 실측 범위가 옆에 붙은 화면 비교


정공법은 데이터가 0건이었습니다

실측을 견적에 붙이는 방법으로 세 가지를 놓고 봤습니다.

방식

근거 데이터

상태

사람 기억으로 산정

없음. 인상만 남는다

기존. 낙관 편향이 반복된다

요구사항→작업 계보로 원가 역산

요구사항과 작업을 잇는 계보

정공법. 계보 데이터가 0건이라 불가

유사 작업을 검색해 실측 분포 첨부

완료 작업의 제목과 실측 시간

채택. 지금 있는 데이터로 바로 동작

정공법은 견적 항목이 어떤 요구사항에서 왔고, 그 요구사항이 과거에 어떤 작업으로 쪼개져 몇 시간이 들었는지를 계보로 거슬러 올라가는 방식입니다. 가장 정확하지만 그 계보를 아무도 기록해두지 않았습니다. 0건이면 아무리 좋은 설계도 오늘은 못 씁니다.

대신 이미 있는 두 가지를 썼습니다. 완료 작업의 제목과 실측 시간입니다. 제목이 비슷한 과거 작업을 찾으면 그 작업의 실측 시간이 딸려 옵니다. 계보만큼 정확하지는 않아도 사람의 인상보다는 훨씬 낫습니다.


항목 제목 하나로 과거 실측을 끌어옵니다

이 견적 초안 기능은 전에 도구 설명 문구 때문에 엉뚱한 요청에 호출된 적이 있었습니다. 그때는 도구가 불리는 조건을 고쳤고, 이번에는 도구가 내는 답의 내용을 손봤습니다.

견적 초안을 뽑을 때 항목마다 아래 순서를 돕니다.

견적 항목 제목을 질의로 삼아 도구 안의 노드 전체를 대상으로 벡터 검색을 합니다. 상위 8건, 유사도 점수 0.5 이상만 남깁니다.

그중 완료 상태이면서 실측 시간이 기록된 작업만 거릅니다. 진행 중인 작업과 실측이 빈 작업은 여기서 빠집니다.

남은 것 중 상위 3건을 샘플로 잡고, 중앙값과 최소~최대 범위를 계산합니다.

결과를 참고 텍스트로 만들어 견적 초안 응답의 해당 항목 옆에 붙입니다.

첨부되는 참고의 형태는 이렇습니다. 샘플과 숫자는 항목마다 달라지고, 마지막 줄은 고정입니다.

[실측 참고] 비슷한 완료 작업 3건
  중앙값 X시간 · 범위 Y~Z시간
  - 샘플 1: 작업 제목 / 실측 시간
  - 샘플 2: 작업 제목 / 실측 시간
  - 샘플 3: 작업 제목 / 실측 시간
  ※ 작성자 검토용. 견적서 본문에 옮기지 말 것

실데이터로 돌려봤습니다. '소셜 로그인 연동' 항목에 과거 완료 작업 3건이 정확히 잡혔고, 실측은 0.5시간에서 5시간 사이였습니다. 제가 적으려던 3시간은 그 범위 안에 있었습니다. 다만 범위의 양 끝이 10배 차이였습니다.

이 10배가 이 기능의 핵심입니다. 같은 '로그인 연동'이라도 어느 프로젝트에 붙이느냐에 따라 일의 크기가 달랐습니다. 중앙값 하나만 보여주면 그 차이가 가려집니다.

범위를 같이 보여주니 '이번 건은 어느 쪽인가'를 먼저 묻게 됩니다. 그 질문이 낙관이 끼어들던 자리를 대신합니다. 작성자는 이 참고를 보고 공수를 조정합니다. 3시간을 그대로 두더라도, 5시간짜리 사례가 있었다는 것을 알고 두는 것과 모르고 두는 것은 다릅니다.

견적 항목 제목으로 과거 완료 작업의 실측 시간 분포를 끌어오는 4단계 — 벡터 검색, 완료·실측 필터, 상위 3건·중앙값·범위, 초안 첨부


참고는 검토자까지만 갑니다

만들면서 먼저 정한 것이 노출 경계입니다. 이 실측 참고는 견적 작성자가 검토할 때만 보입니다. 견적 데이터에 저장하지 않고, 고객에게 나가는 견적서 문서에도 넣지 않습니다. 도구 지침에는 '견적서 본문에 옮기지 말 것'을 문장으로 박아 두었습니다.

이유는 단순합니다. '비슷한 일이 지난번엔 0.5시간 걸렸다'는 내부 원가 힌트입니다. 이 줄이 고객 문서에 그대로 실리면 견적의 근거를 고객이 역산할 수 있습니다.

AI가 만든 참고 자료는 잘 만들어질수록 그대로 복사하고 싶어집니다. 그래서 작성자의 주의가 아니라 규약으로 막았습니다.

두 번째로 정한 것은 실패 방식입니다. 유사한 작업이 없거나 검색 자체가 실패해도 그 항목만 참고 없이 넘어갑니다.

참고 첨부는 보조 기능이라, 견적 초안 생성 자체를 막지 않는 것이 조건이었습니다. 항목 열 개 중 하나가 검색에 실패했다고 견적 전체가 안 나오면 그 기능은 켜둘 수 없습니다.

실측 참고의 노출 경계 — 작성자 검토 화면까지는 가고 고객 견적서 문서에는 가지 않는다


완료 작업의 실측 시간은 잠자는 원가 원장입니다

이번에 다시 본 것은 작업을 닫을 때 적어둔 실측 시간이 그 자체로는 아무 가치를 내지 않는다는 점입니다. 482건이 있어도 견적 화면에서 안 보이면 0건과 같습니다.

유사도 검색 하나가 그 원장을 견적과 계획의 참고 자료로 바꿨습니다. 기록은 되어 있었고, 꺼내 쓰는 경로만 없었습니다.

정공법의 길은 닫지 않았습니다. 요구사항과 작업 사이의 계보가 쌓이면 계보 역산을 따로 검토하기로 하고 미뤄두었습니다. 지금 있는 데이터로 우회하되 데이터가 쌓였을 때 올라갈 자리를 남겨두는 것이, 이런 보조 기능을 만들 때의 기본 모양입니다.

한계도 같이 적어둡니다.

제목이 비슷해도 맥락이 다를 수 있습니다. 그래서 중앙값 하나가 아니라 범위를 같이 보여줍니다.

실측 기록률이 낮으면 분포가 편향됩니다. 여기서는 45%였고, 기록 습관이 이 기능의 선행 자산입니다.

과거 실측은 과거의 숙련도와 도구 기준입니다. AI 도구 도입처럼 생산성이 바뀌는 변화가 오면 분포도 같이 낡습니다.


견적에 실측을 붙이기 전에 볼 것

완료 작업에 실제 소요 시간이 기록되고 있는가, 기록률은 몇 %인가

견적을 적는 그 화면에서 과거 실측이 보이는가, 아니면 다른 화면을 열어야 보이는가

중앙값만 보여주는가, 최소~최대 범위까지 보여주는가

내부 원가 힌트가 고객 문서로 흘러가는 경로를 규약으로 막았는가

참고 기능이 실패했을 때 본 기능이 같이 멈추지 않는가


마무리

'이번엔 넉넉히 잡자'는 다짐은 다음 견적서를 열 때 사라져 있었습니다. 그 자리에 과거의 제가 실측 3건을 들고 끼어들게 하고 나서야 낙관이 멈췄습니다. 견적을 사람이 적는 한 낙관은 끼어듭니다. 그렇다면 낙관보다 먼저 도착하는 것을 데이터로 바꾸면 됩니다.

#견적#과소산정#실측데이터#벡터유사도#노출경계#softfail#공수산정