2026년 6월에 이 매거진은 「도메인 전문가의 시대」로 창간 여섯 달을 닫았다. 결론은 한 문장이었다 — 무엇을 만들지 가장 잘 아는 사람이 앞에 선다.
그 글은 앞선 다섯 편을 한 문단씩 요약해 접는 종합 글이었다. 종합 자체는 옳은 형식이다. 문제는 요약된 것들에 증거가 없었다는 것이다. 없는 것을 다섯 개 모으면 다섯 배로 없다.
그래서 이 재작성는 순서를 뒤집었다. 먼저 전부 다시 만들었고, 이제 접는다.
이 글이 딛는 것은 열다섯 개의 샘플이다. 전부 빌드되고, 실행되고, 화면이 있는 것은 렌더까지 확인됐다. 하나는 책상 위 실물 보드 두 대에 붙어 있다.
무엇이 실제로 증명됐나
여섯 달 전 글의 명제들을, 이번에 실제로 확인된 것만 남기고 다시 적는다.
화면은 정의이고, 정의는 작다. 한 화면이 1~2 킬로바이트다. 매장 서버가 키오스크·POS·주방에 각각 내주는 세 화면의 합이 3,555 바이트였다. (화면 층만 녹는다)
전송을 골라도 코드는 갈라지지 않는다. 같은 클라이언트가 USB 시리얼의 STM32와 Wi-Fi 너머의 ESP32에 붙었다. 다른 것은 브리지 프로그램 하나였다. (보드가 자기 화면을 건넨다)
하드웨어를 갈아 끼워도 규칙은 산다. 섭씨 센서를 화씨 모델로 바꾸고 노드를 둘 늘려도, 서버 코드와 규칙은 한 글자도 바뀌지 않았다. (센서를 갈아 끼워도 제어는 그대로)
빌드 없이 화면이 바뀐다. JSON 2,940바이트를 2,934바이트로 고치자 83밀리초 만에 반영됐고 컴파일러는 실행되지 않았다. (폴더 하나가 앱이다)
안 만든 능력은 닿지 않는다. 도구 목록에 없는 것은 사람이 눌러서도, 모델이 골라서도 호출되지 않았다. (내놓지 않은 것이 앱을 지킨다)
그런데 결론은 절반만 맞았다
여기가 여섯 달 전 글과 갈라지는 지점이다.
그 글은 문턱이 낮아졌다는 쪽에 무게를 다 실었다. 2할의 벽이 낮아졌으니 8할을 가진 사람이 앞에 선다는 것.
만들어 보니 문턱은 실제로 낮았다. 회비 도구는 45줄이었다. 재배 규칙 한 조각은 7줄이었다.
그런데 그것만으로는 앞에 서지지 않는다.
일곱 개의 현장 도구를 만들면서, 매번 같은 것이 문제였다. 낮은 문턱이 아니라 믿을 수 있는가였다.
- 농부의 화면에 "평균 18일"이 떴을 때 — 그게 기록에서 나온 건지 누가 적어 둔 건지 구별할 방법
- 교사가 8점을 봤을 때 — 왜 8점인지
- 세무사가 4월 27일을 봤을 때 — 법정 기한인지 주말에 밀린 건지 오타인지
- 혼자 일하는 사장이 목록 맨 위를 봤을 때 — 왜 그게 맨 위인지
- 물려받은 노트를 읽을 때 — 누가 언제 알았는지, 그리고 틀린 것으로 밝혀진 줄이 지워졌는지
전부 같은 물음이다. 결과 옆에 근거가 있는가.
그리고 이게 문턱보다 어렵다. 문턱은 도구가 낮춰 주지만, 근거는 만드는 사람이 넣어야 한다. 넣지 않아도 화면은 똑같이 잘 뜬다. 그래서 안 넣게 된다.
혼자 만드는 사람에게 특히 그렇다
여섯 달 전 글이 못 본 것이 하나 더 있다.
도메인 전문가가 자기 도구를 만든다는 건, 틀렸을 때 잡아 줄 사람이 없다는 뜻이기도 하다. 회사의 도구는 리뷰가 있고 QA가 있고 다음 담당자가 있다. 자기 도구에는 자기뿐이다.
그래서 이 시리즈의 열다섯 개 샘플에서 가장 많이 한 일은 화면 만들기가 아니라 검증에 조건을 넣는 일이었다.
| 무엇을 지켰나 | 어디서 |
|---|---|
| 계산된 평균이 소스에 상수로 존재하면 실패 | 농부 |
| 부분점수가 이유 없이 나오면 실패 | 교사 |
| 마감일이 소스에 문자열로 있으면 실패 | 세무 |
| 항목에 출처가 없으면 실패 | 1인 사업 |
| 정정된 줄이 사라지면 실패 | 물려받은 노트 |
| 판정 어휘가 방출되면 실패 | 진료 흐름 |
| 화면이 60줄을 넘으면 실패 | 회비 |
| 캡처가 서로 같으면 실패 | 전부 |
마지막 줄이 이 표에서 제일 값싸고 제일 자주 일했다. 화면이 안 그려졌는데 PNG는 정상적으로 나오는 일이 세 번 있었다. 로그는 매번 멀쩡했다.
그 표는 문장이 아니라 파일이다
위 여덟 줄은 이 글이 정리한 요약이 아니다. 각각 샘플 폴더의 verify.sh 안에 실패 조건으로 적혀 있고, 조건이 깨지면 그 샘플은 통과하지 못한다.
첫 줄부터 보면 이렇다. 농부 편의 "평균 18일"이 계산된 값인지 적어 둔 값인지 가르는 자리다.
AVG=$(grep -o "average from records: [0-9.]*" captures/run.log | awk '{print $4}')
if grep -RIn --exclude-dir=captures -F "$AVG" farm_server/bin farm_log.mbd bundle_host/lib; then
echo " the average $AVG appears literally in the source — it must be computed"
exit 1
fi
화면에 뜬 값을 소스 전체에서 되찾아 본다. 찾아지면 실패다. 결과가 맞는지를 검사하는 게 아니라 결과가 어디서 왔는지를 검사한다.
나머지 일곱도 같은 자리에 있다.
| 무엇을 지켰나 | 어디에 적혀 있나 |
|---|---|
| 계산된 평균이 소스에 상수로 존재하면 실패 | farm-log/verify.sh:35 |
| 부분점수가 이유 없이 나오면 실패 | grading-tool/verify.sh:34 |
| 마감일이 소스에 문자열로 있으면 실패 | deadline-board/verify.sh:33 |
| 항목에 출처가 없으면 실패 | one-person-desk/verify.sh:34 |
| 정정된 줄이 사라지면 실패 | inherited-notebook/verify.sh:33 |
| 판정 어휘가 방출되면 실패 | clinic-flow/verify.sh:33 |
| 화면이 60줄을 넘으면 실패 | club-dues/verify.sh:11 |
| 캡처가 서로 같으면 실패 | 샘플마다 (DISTINCT) |
마지막 줄이 제일 짧다.
DISTINCT=$(ls -l captures/*.png | awk '{print $5}' | sort -u | wc -l | tr -d ' ')
[ "$DISTINCT" -eq 3 ] || { echo " $DISTINCT distinct sizes out of 3 — a screen rendered blank"; exit 1; }
파일 크기만 본다. 그런데 앞서 적은 세 번을 잡은 게 이 두 줄이다 — 화면이 비어 있어도 PNG 는 정상적으로 만들어지고, 로그도 매번 멀쩡했다. PNG 가 나왔다는 사실은 화면이 그려졌다는 증거가 아니다.
이 두 줄이 무엇을 못 잡는지도 적어 둔다. 크기가 서로 다르기만 하면 통과하므로, 틀린 화면 세 장은 통과한다. 이 게이트가 막는 것은 빈 화면이지 잘못된 화면이 아니다. 잘못된 화면은 위의 일곱 줄이 각자 도메인 쪽에서 막는다.
순서가 뒤집힌다는 말의 실제 크기
여섯 달 전 글의 표현을 다시 쓴다. 오랫동안 도메인 전문가는 뒤에서 설명하고 개발자가 앞에서 만들었다고.
만들어 보고 그 순서를 이렇게 고쳐 적는다.
앞에 서는 것은 판단이다. 사람이 아니라.
- 농부의 판단은 일곱 줄로 적혔고, 부품 번호를 한 글자도 갖지 않아서 하드웨어보다 오래 산다
- 교사의 기준은 문자열 목록이라 본인이 되읽고 고칠 수 있다
- 세무사의 규칙은 저장되고 날짜는 계산된다
- 공장 엔지니어의 점검표는 요약하지 못하도록 검증이 원문을 대조한다
그리고 이 넷 어디에도 "전문가가 코드를 짰다"는 대목이 없다. 판단이 짧게 적힐 형식으로 옮겨졌고, 그 형식을 누군가는 만들어야 했다. 이 시리즈에서 그 누군가는 나였다.
그래서 정확히 말하면 이렇다. 도메인 전문가가 앞에 서는 것이 아니라, 도메인 전문가의 판단이 앞에 서고 나머지가 그 뒤로 물러난다. 그 자리를 만드는 일은 여전히 누군가의 일이고, 다만 그 일이 예전보다 얇아졌다.
여섯 달 전 글에서 빼는 것
재작성이므로, 그때 적었으나 지금 못 받치는 것을 뺀다.
여섯 인물의 성과 수치를 뺀다. "십 분에", "자정을 되찾았다", "서른 권이 한 화면으로" 같은 것들이다. 그 수치들은 특정 인물에게서 잰 것이 아니었다. 일곱 편 전부 같은 형태를 직접 만든 구성이고, 각 편 첫 문단에 그렇게 적혀 있다.
이건 작은 정정이 아니다. field 줄기의 논지는 "당신도 된다"는 허락이고, 허락은 사례의 실재에 얹혀 있다. 실재를 확인하지 못한 채 같은 문장을 반복하면 허락이 아니라 광고다.
그래서 이 종합 글이 접는 것도 좁아진다. "사람들이 해냈다"가 아니라 "이런 도구가 이렇게 생겼고, 이만큼 짧고, 이런 조건에서 믿을 만하다" 까지다.
"이들은 비유가 아니다"라는 자기표방도 뺀다. 이번엔 비유가 아니라 실제 형태대로의 구성이고, 그렇게 적었다.
다음 여섯 달이 갚을 것
여섯 달 전 글이 열어 둔 자리 중 다음 여섯 달이 갚을 것들이다.
- "말하면 화면이 된다" — 사람의 말이 정의가 되는 변환. 일곱 편 전부에서 그 단계는 내가 손으로 했다. 그 변환은 다음 자리다.
- 오프라인·캐시 — 창간호가 답한 자리에 지금도 실측이 없다.
- 앱스토어 정책 — 근거 가이드라인 인용 없이 해석만 있다.
- 운영 비용 — 이 시리즈의 서버는 전부 로컬 프로세스였다.
- 모델의 도구 선택 정확도 — LLM 편의 모델은 결정론적 스텁이었다.
- 경험의 둘째·셋째 층 — 사실이 기술이 되고 기술이 예측이 되는 것. 며칠 돌린 샘플로는 안 보인다.
- 도메인 전문가가 이 형식을 직접 다룰 수 있는가 — 45줄이 읽을 만하다는 것까지가 확인된 것이고, 처음 보는 사람이 얼마 만에 쓰는지는 그런 사람에게 시켜 봐야 안다.
이 샘플의 범위
여섯 달 전 글의 정직 절 넷은 유지한다. 개발자는 사라지지 않고, 모든 것이 도구가 되지는 않고, 경계를 긋는 것 자체가 도메인 지식이고, 쉬워진 건 손이지 책임이 아니다.
마지막 문장이 이번에 가장 크게 확인됐다. 열다섯 개를 만들면서 쉬워진 것은 화면을 띄우는 손이었고, 어려워진 것은 그 화면을 믿어도 되는지 스스로 확인하는 책임이었다.
그리고 이번에 알게 된 것을 더한다.
이 글에는 새 샘플이 없다. 종합 글의 일은 새로 짓는 게 아니라 이미 지은 것을 딛는 것이다. 여섯 달 전 글의 문제는 딛을 것이 없는데 딛는 척했다는 것이었고, 이번엔 열다섯 개가 있다.
그 열다섯 개도 대부분 시뮬레이터다. 실물 하드웨어에 붙은 것은 하나뿐이고, 나머지는 전부 C로 짠 시뮬이거나 합성 데이터다. 각 편에 그렇게 적혀 있다.
앞에 서는 것
여섯 달 전 글은 이렇게 닫혔다 — 끝이 아니라 시작이라고.
여섯 달이 지났고, 시작한 것을 다시 만들어 보고 나서 그 문장을 이렇게 고쳐 적는다.
문턱은 낮아졌다. 45줄과 7줄이 그 증거다.
그런데 낮은 문턱은 좋은 도구를 보장하지 않는다. 넘어간 다음에 필요한 것은 결과 옆에 근거를 두는 습관이고, 그건 도구가 대신해 주지 않는다.
그래서 앞에 서는 사람에게 필요한 것은 코딩이 아니라 자기 도구를 의심하는 방법이다. 이 시리즈가 실제로 만든 것도 화면 열다섯 개가 아니라 의심의 형식 열다섯 개 — 무엇이 참이어야 하는지를 통과 조건에 적어 두는 방식 — 였다.
기록에서 나온 숫자와 적어 둔 숫자는 화면에서 똑같이 생긴다. 그 둘을 구별할 방법을 가진 사람이, 앞에 선다.
makemind.dev 「탐구」 — 인용한 실측은 전부 함께 실린 샘플에서 나왔다.