Series 29 — Code Last

결과물이 없는
시간

가장 생산적인 시간에는 코드가 없다

Part I — The Speed Trap

속도의 함정

무언가를 만들고 싶었다. Cursor를 열었다. 프롬프트를 쳤다. 코드가 나왔다. 거의 됐다. 한 군데를 고쳤다. 다른 데가 깨졌다. 그걸 고쳤다. 두 군데가 더 깨졌다. 세 시간이 지났다. 직접 작성하지 않은 코드를 디버깅하고 있다.

익숙한가?

2025년, AI 코딩 도구의 채택률은 84%에 달했다. 그러나 같은 해, AI 도구의 정확도를 신뢰하는 개발자는 29%로 떨어졌다. 쓰는 사람은 늘었는데, 믿는 사람은 줄었다. 이 역설의 중심에 속도가 있다.

45%
AI 생성 코드의 보안 결함률
Veracode GenAI Report, 2025
10x
6개월 만에 증가한 보안 결함
Apiiro Fortune 50 분석, 2025
70%
AI 코드 디버깅에 추가 시간을 쓰는 개발자
Harness, 2025
66%
"거의 맞지만 완전히 틀린" AI 결과에 좌절
Stack Overflow 2025 Survey

숫자가 말해준다. Veracode는 2025년 AI가 생성한 코드의 45%에 보안 취약점이 있다고 보고했다. LLM이 안전한 방법과 위험한 방법 중 선택할 때, 45%의 확률로 위험한 쪽을 골랐다. Java는 70%를 넘었다.

Apiiro는 Fortune 50 기업의 수만 개 레포지토리를 분석했다. AI 코딩 도구 도입 후 6개월 만에 월간 보안 결함이 10배 증가했다. 개발 속도는 4배 빨라졌지만, 보안 결함은 10배 늘었다. 속도가 빚을 만든 것이다.

Tenzai는 2025년 12월, Claude Code, Cursor, Devin 등 5개 주요 AI 코딩 도구를 동일한 3개 애플리케이션으로 비교 테스트했다. 15개 앱에서 69개의 취약점이 발견됐다. 결론은 이것이었다.

보안 통제에 관해서, 모든 코딩 에이전트가 처참하게 실패했다.
잘못 구현한 것이 아니다. 대부분의 경우, 시도조차 하지 않았다.

도구의 문제인가? 아니다. 도구는 시킨 대로 했을 뿐이다. 문제는 도구에게 시키는 방식에 있다. 맥락 없이, 계획 없이, 요구사항 정리 없이 "로그인 기능 만들어줘"라고 프롬프트를 치면, AI는 가장 흔한 패턴을 가장 빠르게 생성한다. 보안? 에지 케이스? 아키텍처 일관성? 시키지 않은 일은 하지 않는다.

급한 사람

  1. 프롬프트를 친다
  2. 코드가 나온다
  3. 에러가 난다
  4. 수정을 요청한다
  5. 다른 곳이 깨진다
  6. 처음부터 다시

돌아가는 사람

  1. 무엇을 만들지 정리한다
  2. 필요한 정보를 수집한다
  3. 요구사항을 문서화한다
  4. AI에게 맥락을 주입한다
  5. 한 번에 개발한다
  6. 디테일을 다듬는다

Andrej Karpathy는 2025년 2월 "vibe coding"이라는 용어를 만들었다. "코드가 존재한다는 사실조차 잊어버리고, 분위기에 몸을 맡기는 코딩." 1년 뒤, 그는 용어를 바꿨다. "agentic engineering" — 에이전트를 조율하는 엔지니어링. 그리고 이렇게 덧붙였다.

'engineering'을 강조하는 이유는, 거기에 기예와 과학과 전문성이 있기 때문이다.

바이브 코딩을 만든 사람조차 바이브만으로는 안 된다고 말하고 있다. 속도는 도구가 주는 것이 아니다. 계획이 주는 것이다.

Part II — The Brain Bottleneck

뇌가 감당 못 한다

문제는 AI 도구가 아니다. 문제는 뇌다. 인간의 워킹 메모리에는 한계가 있고, 계획 없이 코드부터 치는 행위는 그 한계를 전부 위반한다.

3-4
워킹 메모리 한계
인간이 동시에 처리할 수 있는 독립적 정보 덩어리 수. 변수 값, 제어 흐름, 호출 순서를 동시에 머릿속에 넣으면, 3-4개가 한계다.
Cowan, The Magical Mystery Four, 2001
23:15
컨텍스트 전환 회복 시간
중단 후 깊은 집중을 회복하는 데 걸리는 평균 시간. 프롬프트 결과가 기대와 다를 때마다 — 그것은 중단이다.
Gloria Mark, UC Irvine, 2023
49%
자기 중단 비율
외부가 아닌 스스로 일으키는 중단의 비율. "이것도 해볼까?" "저쪽 먼저 고칠까?" 계획이 없으면, 스스로 중단을 만든다.
Gloria Mark, Attention Span, 2023
50%
디버깅에 쓰는 시간
개발자가 새 코드를 작성하는 대신 디버깅에 소비하는 시간 비율. 계획 없는 코딩은 이 비율을 더 높인다.
Cambridge University Survey

George Miller의 "7 +/- 2"는 유명하지만, Nelson Cowan의 2001년 후속 연구가 더 엄격하다. 청킹 전략 없이 순수하게 처리할 수 있는 정보는 3-4개뿐이다. 변수 값 하나, 함수 호출 흐름 하나, 에러 메시지 하나 — 그것만으로 워킹 메모리의 절반이 차버린다.

Gloria Mark의 연구는 더 불편한 사실을 알려준다. 중단 후 깊은 집중을 회복하는 데 평균 23분 15초가 걸린다. 바이브 코딩에서 "프롬프트 → 결과 확인 → 수정 요청" 사이클은 매번 컨텍스트 전환이다. 그리고 중단의 49%는 외부가 아니라 자기 자신이 만든다.

여기서 핵심적인 발견이 하나 있다. Zeigarnik 효과다.

Bluma Zeigarnik이 1927년에 발견한 이 현상은, 완료하지 않은 작업이 머릿속에 남아 인지 자원을 계속 점유한다는 것이다. 바이브 코딩으로 달리는 사람은 끊임없이 미완성 작업을 안고 달린다. 에러를 고치면 다른 에러가 생기고, 기능을 추가하면 기존 기능이 깨진다. 모든 미완성이 워킹 메모리를 잠식한다.

그런데 후속 연구에서 밝혀진 것이 있다. 미완료 작업 자체가 문제가 아니라, 그 작업에 대한 구체적 계획이 없는 것이 문제다. 계획을 세우면 — 단순히 다음 단계를 적어두기만 해도 — 인지 부담이 해소된다.

미완료 작업이 아니라,
계획이 없는 작업이 머릿속을 잠식한다.

"결과물이 없어서 불안하다"는 감정의 정체는, 사실 "계획이 없어서 뇌가 과부하된 것"이다. 해법은 역설적으로 단순하다. 계획을 세워라. 문서로 써라. 머릿속의 미완성을 종이 위로 옮기는 순간, 뇌는 해방된다.

당신이 지금 하고 있는 것
  • 생각 정리 없이 바로 프롬프트부터 친다
  • 에러가 나면 AI에게 수정을 반복 요청한다 — 같은 컨텍스트에서
  • 결과물이 안 보이면 불안해서 더 빨리 코드를 쓰려 한다

세 가지 모두, 뇌의 인지 부하를 높이는 행동이다. 빠르게 하려고 할수록 느려지는 이유가 여기에 있다.

Part III — The First Three Hours

코드 없는 첫 3시간

불편한 진실이 있다. 프로젝트에서 가장 생산적인 시간에는 코드가 한 줄도 없다.

아래의 5단계를 따르면, 코딩을 시작하기 전까지 최소 2-3시간을 쓰게 된다. 그 시간 동안 결과물은 코드가 아니라 문서다. 그리고 그 문서가 이후의 모든 것을 결정한다.

STEP01

생각 정리

Clarify

무엇을 만들 것인가. 왜 만들 것인가. 누가 쓸 것인가. 무엇을 하지 않을 것인가. 대부분의 바이브 코더가 건너뛰는 단계다.

STEP02

자료 수집

Research

기술을 정하기 전에 선택지를 파악한다. 유사 서비스의 아키텍처를 분석하고, 잠재적 함정을 미리 확인한다.

STEP03

문서 작성

Document

PRD를 쓴다. 거창할 필요 없다. 핵심은 AI가 읽을 수 있는 구조화된 문서를 만드는 것이다.

STEP04

맥락 주입

Context

CLAUDE.md, .cursorrules, 또는 사용하는 도구의 규칙 파일을 작성한다. AI에게 "이 프로젝트에서는 이렇게 해라"를 알려주는 지시서다.

STEP05

개발 + 디테일링

Execute

이제 코드를 쓴다. PRD, 규칙, 아키텍처가 결정되어 있다. AI는 "무엇을 만들지" 묻지 않는다. 바로 만든다.

각 단계를 상세히 살펴보자. 그리고 각 단계에서 AI에게 건넬 수 있는 프롬프트를 제공한다. 대괄호 [ ] 안의 내용을 본인의 상황에 맞게 수정하고, AI에 붙여넣으면 된다.

Step 01 — 생각 정리

"로그인 기능 만들어줘"라고 프롬프트를 치기 전에, 그 로그인이 OAuth인지 이메일/비밀번호인지, 소셜 로그인이 필요한지, 세션 관리를 어떻게 할 것인지를 정리해야 한다. 정리되지 않은 생각은 정리되지 않은 코드가 된다.

AI에게 질문을 받으면서 생각을 구조화할 수 있다. 아래 프롬프트는 AI가 핵심 질문을 던지고, 답변을 정리해주는 역할을 한다.

생각을 구조화하고 싶다면
대괄호 [ ] 안의 내용을 자신의 프로젝트에 맞게 수정한 뒤, AI에 붙여넣으세요.
다음 프로젝트의 요구사항을 구조화해주세요. 프로젝트: [프로젝트 이름이나 한 줄 설명] 목적: [이 프로젝트를 왜 만드는지] 사용자: [누가 쓸 것인지] 아래 질문에 대해 하나씩 답을 정리해주세요: 1. 핵심 기능 3가지는 무엇인가? 2. 반드시 포함하지 않을 기능은? 3. 성공 기준은 무엇인가? 4. 기술적 제약 조건은? 5. 유사 서비스나 참고할 제품은? 주의: 모호한 답변이 있으면 추가 질문으로 명확화해주세요. 출력: 마크다운 형식의 요구사항 정리 문서

Step 02 — 자료 수집

AI와 웹 검색을 활용하되, 수집한 자료를 정리하는 것이 핵심이다. 브라우저 탭 30개를 열어두는 것과, 핵심 정보를 문서 하나에 요약하는 것은 전혀 다른 행위다. 전자는 워킹 메모리를 소비하고, 후자는 워킹 메모리를 해방한다.

기술 조사를 시작하고 싶다면
대괄호 [ ] 안의 내용을 자신의 프로젝트에 맞게 수정한 뒤, AI에 붙여넣으세요.
다음 프로젝트를 위해 기술 조사를 해주세요. 프로젝트: [프로젝트 이름] 핵심 요구사항: [Step 1에서 정리한 핵심 기능] 기술 스택: [사용할 언어/프레임워크, 미정이면 "미정"] 조사할 항목: 1. 핵심 기능 구현에 필요한 기술/라이브러리 2. 유사 프로젝트의 아키텍처 분석 3. 알려진 함정이나 주의점 4. 성능/보안 측면의 고려사항 5. 대안 기술의 장단점 비교 주의: 2025년 이후 자료를 우선하고, 출처를 반드시 포함해주세요. 출력: 기술 조사 보고서 (마크다운, 항목별 구분)

Step 03 — 문서 작성

PRD(Product Requirements Document)를 쓴다. 거창할 필요 없다. 핵심은 AI가 읽을 수 있는 구조화된 문서를 만드는 것이다. 이 문서가 AI와의 대화에서 "맥락"이 된다. 매번 처음부터 설명하는 대신, 문서를 참조시킨다.

Simon Willison(Django 공동 창시자)의 황금률이 여기에 적용된다.

"내가 다른 사람에게 정확히 무엇을 하는지 설명할 수 없는 코드는, 내 저장소에 커밋하지 않는다."
Simon Willison
Django 공동 창시자
"LLM이 모든 코드를 작성했더라도, 당신이 검토하고, 테스트하고, 이해했다면 — 그건 바이브 코딩이 아니라 타이핑 보조다."
Simon Willison
Not All AI-Assisted Programming Is Vibe Coding, 2025
PRD를 작성하고 싶다면
대괄호 [ ] 안의 내용을 자신의 프로젝트에 맞게 수정한 뒤, AI에 붙여넣으세요.
지금까지의 논의를 바탕으로 PRD를 작성해주세요. 포함할 내용: 1. 프로젝트 개요 (한 문단) 2. 목표와 성공 지표 3. 사용자 스토리 (최소 5개, Given-When-Then 형식) 4. 기술 스택과 선택 근거 5. 아키텍처 개요 (주요 컴포넌트와 데이터 흐름) 6. API 설계 (엔드포인트 목록) 7. 데이터 모델 (엔티티와 관계) 8. 비기능 요구사항 (성능, 보안, 접근성) 9. 구현 우선순위 (P0/P1/P2) 10. 제외 범위 (명시적으로 하지 않을 것) 주의: 모호한 표현("적절한", "좋은") 대신 측정 가능한 기준을 사용하세요. 출력: PRD 문서 (마크다운, 섹션별 구분)

Step 04 — 맥락 주입

시스템 프롬프트가 AI의 성격을 정하듯, 규칙 파일이 프로젝트의 성격을 정한다. CLAUDE.md, .cursorrules, 또는 사용하는 도구의 규칙 파일에 코딩 컨벤션, 금지 사항, 아키텍처 결정을 넣는다. AI는 매번 이 파일을 읽고 프로젝트 맥락을 파악한다.

규칙 파일이 없으면 AI는 매 대화마다 백지에서 시작한다. 규칙 파일이 있으면 AI는 프로젝트를 아는 동료처럼 행동한다.

프로젝트 규칙 파일을 작성하고 싶다면
대괄호 [ ] 안의 내용을 자신의 프로젝트에 맞게 수정한 뒤, AI에 붙여넣으세요.
이 프로젝트의 AI 코딩 규칙 파일을 작성해주세요. 프로젝트: [프로젝트 이름] 기술 스택: [PRD에서 확정된 스택] PRD 위치: [PRD 파일 경로] 포함할 내용: 1. 프로젝트 개요 (AI가 맥락을 파악할 수 있는 2-3문장) 2. 폴더 구조 (주요 디렉토리와 역할) 3. 코딩 컨벤션 (네이밍, 포매팅, 패턴) 4. 금지 사항 (절대 하지 말아야 할 것 목록) 5. 의존성 규칙 (허용된 라이브러리, 버전 고정 여부) 6. 테스트 규칙 (테스트 프레임워크, 커버리지 기준) 7. Git 규칙 (브랜치 전략, 커밋 메시지 형식) 8. 참조 문서 경로 형식: CLAUDE.md (Claude Code) 또는 .cursorrules (Cursor) 주의: "~하는 것이 좋다"가 아니라 "~해야 한다/하지 않는다"로 작성하세요. 출력: 규칙 파일 전문

Step 05 — 개발 + 디테일링

이제 코드를 쓴다. 그런데 이 시점에서 코딩은 놀랍도록 빠르다. 왜? AI가 모든 맥락을 알고 있기 때문이다. PRD가 있고, 규칙이 있고, 아키텍처가 결정되어 있다. AI는 "무엇을 만들지" 묻지 않는다. 바로 만든다.

Kent Beck의 원칙이 여기에 정확히 들어맞는다. "Make it work, make it right, make it fast." 먼저 동작하게 만들고, 올바르게 고치고, 그다음 최적화한다. 1-4단계에서 "right"의 기준을 이미 정의했으므로, 5단계에서는 "work"에 집중할 수 있다.

기능을 구현하고 싶다면
대괄호 [ ] 안의 내용을 자신의 프로젝트에 맞게 수정한 뒤, AI에 붙여넣으세요.
PRD와 프로젝트 규칙을 참조하여 다음 기능을 구현해주세요. 구현할 기능: [PRD의 사용자 스토리 번호 또는 기능 설명] 우선순위: [P0/P1/P2] 참조 문서: - PRD: [파일 경로] - 규칙: [CLAUDE.md 또는 .cursorrules 경로] 구현 조건: 1. PRD의 아키텍처 설계를 따를 것 2. 규칙 파일의 코딩 컨벤션을 준수할 것 3. 에지 케이스 처리를 포함할 것 4. 단위 테스트를 함께 작성할 것 5. 보안 고려사항을 체크할 것 주의: 구현 전에 접근 방식을 먼저 설명하고, 승인 후 코드를 작성할 것. 출력: 구현 코드 + 테스트 코드 + 변경사항 요약

Martin Fowler의 기술 부채 분류가 경고하는 것이 있다. 계획 없이 쌓인 부채는 Reckless/Inadvertent — 무모하면서 자각도 없는 부채다. 네 가지 분면 중 최악이다. 부채가 있다는 사실조차 모르기 때문에, 갚을 방법도 모른다.

5단계 워크플로우는 이 최악의 분면을 피하기 위한 것이다. 1-4단계에서 무엇을 만들고 무엇을 만들지 않을지 결정했으므로, 5단계에서 발생하는 부채는 최소한 Prudent/Deliberate — 신중하고 의도적인 부채가 된다.

급해도 괜찮은 경우
  • 프로토타입 / 버릴 코드 — 학습이 목적이면 빠르게 만들고 빠르게 버려라
  • 이미 잘 아는 영역 — 도메인 지식이 충분하면 문서 없이도 맥락이 머릿속에 있다
  • 단순 CRUD — 복잡도가 낮으면 계획의 ROI도 낮다

이 글이 말하는 "급할수록 돌아가라"는, 당신이 잘 모르는 영역에서 복잡한 것을 만들 때의 이야기다. 모든 상황에 5단계를 적용하라는 뜻이 아니다.

급할수록
돌아가라

코드가 없는 시간은 낭비가 아니다.
가장 생산적인 시간이다.