Split View: FDE 플레이북: 버리는 프로토타입으로 이기기
FDE 플레이북: 버리는 프로토타입으로 이기기
- 들어가며 — 슬라이드가 아니라 돌아가는 것
- 왜 버리는 프로토타입인가
- 스파이크: 위험을 먼저 걷어낸다
- 의도적 기술 부채: 빌리되, 기록하라
- 언제 하드코딩할 것인가
- 아하 모먼트까지 최단 거리로
- 기대치 관리: 데모는 데모라고 말하라
- 프로토타입에서 프로덕션으로
- 안티패턴: 이럴 때는 멈춰라
- 마치며
- 참고 자료
들어가며 — 슬라이드가 아니라 돌아가는 것
포워드 배포 엔지니어(FDE)의 세계에서 가장 강력한 무기는 잘 만든 발표 자료가 아닙니다. 고객의 진짜 데이터 위에서 실제로 돌아가는 프로토타입입니다. 백 장짜리 제안서보다, 고객이 자기 데이터가 화면에서 움직이는 걸 보는 3분이 더 큰 설득력을 가집니다.
그리고 이 프로토타입의 핵심 특징은 하나입니다. 버릴 것을 전제로 만든다. 프로덕션 코드처럼 정성 들여 다듬는 게 아니라, 가치를 증명하기 위한 목적으로만 빠르게 조립하고, 증명이 끝나면 미련 없이 버립니다. 이 글은 그 "버리는 프로토타입"으로 어떻게 이기는지에 대한 플레이북입니다.
왜 버리는 프로토타입인가
전통적인 엔지니어링 감각으로 보면 이 접근은 낭비처럼 보입니다. 어차피 버릴 걸 왜 만드나? 답은 명확합니다. 프로토타입의 목적은 코드를 남기는 게 아니라, 배움과 확신을 남기는 것이기 때문입니다.
며칠간의 프로토타입 하나가 답해 주는 질문들을 생각해 보세요.
- 이 문제에 이 기술이 정말로 통하는가?
- 고객의 데이터는 우리가 가정한 만큼 깨끗한가, 아니면 지옥인가?
- 고객이 진짜로 원하는 게 우리가 상상한 그것이 맞는가?
- 이 방향으로 6개월을 투자할 가치가 있는가?
이 질문들에 대한 답은 문서를 아무리 읽어도 나오지 않습니다. 오직 실제로 만들어 봐야 나옵니다. 그리고 답을 얻고 나면, 그 조잡한 코드 자체는 이미 소임을 다한 것입니다.
스파이크: 위험을 먼저 걷어낸다
애자일 세계에는 **스파이크(spike)**라는 개념이 있습니다. 불확실성이 가장 큰 부분을 먼저 찔러 보는, 시간 제한을 둔 탐색적 작업입니다. FDE의 프로토타입은 본질적으로 거대한 스파이크입니다.
핵심은 가장 위험한 가정을 맨 먼저 검증하는 것입니다. 프로젝트가 실패한다면 어디서 실패할까? 그 지점을 먼저 공략합니다.
예를 들어 "고객의 PDF 계약서 10만 건에서 특정 조항을 추출한다"는 프로젝트라면, 가장 큰 위험은 UI도 인증도 아닙니다. 모델이 그 지저분한 실제 PDF에서 조항을 제대로 뽑아내는가입니다. 그러니 UI는 나중이고, 며칠 안에 진짜 PDF 몇 백 건에 모델을 돌려 정확도를 확인하는 게 먼저입니다. 그게 안 되면 나머지는 의미가 없으니까요.
스파이크의 규칙은 단순합니다.
- 시간을 못 박는다: "이틀 안에 결론을 낸다." 스파이크는 무한정 늘어지면 안 됩니다.
- 질문을 명확히 한다: "이게 되나 안 되나"라는 예/아니오 질문을 세웁니다.
- 결과는 지식이다: 성공하면 자신감을, 실패하면 방향 전환을 얻습니다. 둘 다 이득입니다.
의도적 기술 부채: 빌리되, 기록하라
버리는 프로토타입에서는 기술 부채가 죄가 아니라 전략입니다. 다만 의도적이어야 합니다.
"나쁜 부채"는 자기도 모르게 쌓이는 부채입니다. "좋은 부채"는 눈 뜨고 빌리는 부채입니다. "지금은 속도가 중요하니 여기서 지름길을 탄다. 나중에 프로덕션에서는 이렇게 제대로 할 것이다"라고 스스로 알고 빌리는 것이죠.
의도적 기술 부채를 다루는 원칙은 이렇습니다.
- 부채임을 기록한다: 지름길을 탄 자리에 표시를 남깁니다. 프로토타입을 발표할 때도 "이 부분은 데모용 임시 처리"라고 솔직히 밝힙니다.
- 핵심 로직과 임시 처리를 분리한다: 진짜 가치를 증명하는 핵심 부분(예: 추출 로직)은 나름 신경 쓰고, 주변부(인증, 저장, UI)는 과감히 대충 합니다.
- 되돌릴 수 있게 둔다: 나중에 이 지름길을 걷어내야 할 때 어디를 손대야 하는지 명확하게 남겨 둡니다.
언제 하드코딩할 것인가
프로토타입에서 하드코딩은 부끄러운 일이 아니라 강력한 기법입니다. 문제는 "어디를" 하드코딩하느냐입니다.
원칙은 이렇습니다. 증명하려는 가치의 바깥에 있는 모든 것은 하드코딩 후보다.
- 인증/권한: 데모에서 로그인 흐름은 대개 가치가 아닙니다. 그냥 토큰 하나를 박아 둡니다.
- 설정값: 고객사 이름, 임계값, 카테고리 목록 등은 일단 코드에 박습니다. 나중에 설정으로 뺍니다.
- 주변 통합: 아직 붙이지 않은 외부 시스템은 가짜 응답으로 흉내 냅니다.
반대로, 절대 하드코딩하면 안 되는 것이 있습니다. 바로 데모의 심장, 즉 증명하려는 그 가치입니다. 조항 추출 데모에서 추출 결과를 미리 손으로 넣어 두면, 그건 데모가 아니라 사기입니다. 고객이 즉석에서 자기 문서를 던졌을 때 진짜로 작동해야, 그 순간이 아하 모먼트가 됩니다.
아래는 이 감각을 코드로 표현한 예시입니다. 진짜 가치(추출)는 실제로 돌리고, 나머지는 뻔뻔하게 하드코딩합니다.
# demo_extractor.py — 데모용 프로토타입 (버릴 코드)
# [하드코딩 OK] 데모의 가치가 아닌 것들
DEMO_CUSTOMER = "acme-corp"
FAKE_AUTH_TOKEN = "demo-token-do-not-ship"
TARGET_CLAUSE_TYPES = ["indemnification", "termination", "liability"]
def get_current_user():
# [의도적 부채] 데모에서는 인증을 흉내만 낸다. 프로덕션에서는 진짜 OAuth로 교체.
return {"org": DEMO_CUSTOMER, "token": FAKE_AUTH_TOKEN}
def extract_clauses(pdf_text: str) -> list[dict]:
# [진짜 가치] 여기만큼은 실제로 동작해야 한다. 절대 하드코딩 금지.
# 고객이 즉석에서 던진 문서에도 진짜로 작동하는 것이 데모의 핵심.
prompt = build_extraction_prompt(pdf_text, TARGET_CLAUSE_TYPES)
response = call_llm(prompt)
return parse_clauses(response)
def save_results(results: list[dict]) -> None:
# [의도적 부채] 데모에서는 그냥 로컬 JSON. 프로덕션에서는 DB로 교체.
import json, pathlib
pathlib.Path("demo_output.json").write_text(json.dumps(results, indent=2))
아하 모먼트까지 최단 거리로
FDE 프로토타이핑의 목표는 단 하나로 수렴합니다. 고객을 아하 모먼트까지 최대한 빨리 데려가는 것. 아하 모먼트란, 고객이 "아, 이게 우리 문제를 이렇게 풀어 주는구나"를 머리가 아니라 눈으로 이해하는 순간입니다.
이 거리를 줄이는 몇 가지 원칙이 있습니다.
- 고객의 데이터로 시연한다: 우리 샘플 데이터로 아무리 잘 돌아가도 고객은 남 얘기로 듣습니다. 고객 자기 데이터가 움직이는 순간, 그제야 자기 일이 됩니다.
- 가장 인상적인 한 흐름만 완성한다: 열 가지 기능을 어설프게 보여 주기보다, 하나의 "와우" 흐름을 매끄럽게 완성합니다. 데모는 넓이가 아니라 깊이입니다.
- 첫 30초에 승부를 건다: 고객의 주의력은 짧습니다. 로그인, 설정, 온보딩으로 시간을 끌지 말고, 열자마자 핵심 가치를 보여 줍니다.
- 실제 결과를 보여 준다: 목업 화면이 아니라 진짜 계산된 결과여야 합니다. 고객은 진짜와 가짜를 귀신같이 구별합니다.
기대치 관리: 데모는 데모라고 말하라
버리는 프로토타입의 가장 큰 위험은 기술이 아니라 오해입니다. 데모가 너무 매끄러우면, 고객(그리고 때로는 내부 영업)은 "거의 다 됐네요, 다음 주에 배포할 수 있죠?"라고 생각해 버립니다. 며칠짜리 데모와 프로덕션 사이에는 몇 달의 거리가 있는데도 말입니다.
그래서 기대치 관리는 프로토타이핑의 필수 절반입니다.
- 데모임을 분명히 한다: "이건 가치를 보여 드리기 위한 프로토타입이고, 뒤에는 임시 처리가 많습니다"라고 먼저 말합니다.
- 프로덕션까지의 남은 일을 보여 준다: 데모 뒤에 필요한 진짜 작업(에러 처리, 규모 확장, 보안, 통합)의 목록을 함께 제시합니다.
- "빙산"의 비유를 쓴다: 데모는 물 위로 드러난 빙산의 꼭대기이고, 프로덕션은 물 아래 거대한 몸통이라고 설명합니다.
이걸 제대로 하면, 데모의 감동을 유지하면서도 비현실적인 일정 압박을 피할 수 있습니다.
프로토타입에서 프로덕션으로
데모가 성공하고 계약이 진행되면, 이제 진짜 질문이 옵니다. 이 프로토타입 코드를 어떻게 프로덕션으로 만들 것인가?
여기서 흔한 실수 두 가지가 있습니다. 하나는 프로토타입을 그대로 프로덕션으로 밀어 넣는 것이고(임시 처리가 그대로 남아 폭탄이 됩니다), 다른 하나는 처음부터 전부 다시 쓰는 것입니다(배운 것을 버립니다). 좋은 답은 대개 그 사이에 있습니다.
- 핵심 로직은 살리고, 껍데기는 갈아 끼운다: 프로토타입에서 진짜로 검증된 것은 핵심 가치 로직(추출·매칭·계산)입니다. 이 부분은 잘 다듬어 살리고, 하드코딩했던 인증·저장·UI·통합은 제대로 다시 짭니다.
- 의도적 부채를 하나씩 갚는다: 앞서 남겨 둔 부채 표시를 지도 삼아, 임시 처리를 정식 구현으로 하나씩 교체합니다.
- 프로토타입을 명세서로 쓴다: 프로토타입 자체가 "고객이 원하는 것"의 가장 정확한 명세입니다. 다시 쓰더라도, 이 살아 있는 명세를 기준 삼습니다.
- 경계를 다시 긋는다: 어디까지가 이 고객만의 맞춤이고, 어디부터가 제품에 넣을 일반 기능인지 이때 판단합니다. (이 주제는 다음 글에서 깊게 다룹니다.)
안티패턴: 이럴 때는 멈춰라
버리는 프로토타입도 잘못 쓰면 독이 됩니다. 다음 신호가 보이면 접근을 재점검해야 합니다.
- 데모가 몇 주째 늘어진다: 며칠이어야 할 프로토타입이 몇 주가 되면, 그건 이미 프로토타입이 아니라 방향 없는 프로덕션입니다.
- 버릴 코드에 애착이 생긴다: "이거 잘 짰는데 아깝다"는 마음이 들면 위험 신호입니다. 프로토타입은 버릴 수 있어야 자유롭습니다.
- 가짜 데이터로만 잘 돈다: 고객의 진짜 데이터에서 무너진다면, 아직 위험을 검증하지 못한 것입니다.
- 아무도 아하를 느끼지 못한다: 데모를 봐도 고객이 시큰둥하다면, 문제나 가치 가설 자체가 틀렸을 수 있습니다.
마치며
FDE의 프로토타이핑은 "대충 만든다"가 아니라 "무엇을 대충 만들지 정확히 안다"는 기술입니다. 가장 위험한 가정을 스파이크로 먼저 찌르고, 가치의 바깥은 뻔뻔하게 하드코딩하고, 고객을 자기 데이터의 아하 모먼트로 최단 거리로 데려가고, 데모는 데모라고 정직하게 말하고, 검증된 핵심만 프로덕션으로 승격시킵니다.
버리는 프로토타입의 역설은, 버릴 것을 만들었기에 오히려 가장 값진 것 — 확신과 방향과 고객의 신뢰 — 을 남긴다는 점입니다. 다음 글에서는 이렇게 한 고객을 위해 만든 것이 어떻게 모든 고객을 위한 플랫폼으로 자라나는지를 이야기합니다.
참고 자료
- Spike (Extreme Programming) 개념: http://www.extremeprogramming.org/rules/spike.html
- Martin Fowler, "Technical Debt": https://martinfowler.com/bliki/TechnicalDebt.html
- Steve Blank, "Get Out of the Building": https://steveblank.com/
- Palantir, "A Day in the Life of a Forward Deployed Software Engineer": https://blog.palantir.com/a-day-in-the-life-of-a-palantir-forward-deployed-software-engineer-45ef2de257b1
- "Do Things That Don't Scale" (Paul Graham): https://paulgraham.com/ds.html
The FDE Playbook: Winning With Throwaway Prototypes
- Introduction — Not Slides, Something That Runs
- Why a Throwaway Prototype
- The Spike: De-Risk First
- Deliberate Tech Debt: Borrow, but Record
- When to Hardcode
- The Shortest Path to the Aha Moment
- Managing Expectations: Say the Demo Is a Demo
- From Prototype to Production
- Anti-Patterns: When to Stop
- Wrapping Up
- References
Introduction — Not Slides, Something That Runs
In the world of the forward deployed engineer (FDE), the most powerful weapon is not a polished deck. It's a prototype that actually runs on the customer's real data. Three minutes of a customer watching their own data move on screen is more persuasive than a hundred-page proposal.
And this prototype has one defining trait: it's built to be thrown away. Not lovingly polished like production code, but assembled fast for the sole purpose of proving value — and once the proof lands, discarded without regret. This post is the playbook for winning with that throwaway prototype.
Why a Throwaway Prototype
To traditional engineering instincts, this approach looks wasteful. Why build something you're going to throw away? The answer is clear: the goal of a prototype is not to leave behind code, but to leave behind learning and conviction.
Think about the questions a few days of prototyping can answer.
- Does this technology actually work for this problem?
- Is the customer's data as clean as we assumed, or is it hell?
- Is what the customer truly wants the thing we imagined?
- Is this direction worth investing six months in?
No amount of reading documents answers these. Only actually building it does. And once you have the answers, the crude code itself has already done its job.
The Spike: De-Risk First
The agile world has a concept called the spike — a time-boxed, exploratory piece of work that pokes at the area of greatest uncertainty first. An FDE's prototype is, in essence, one giant spike.
The core idea is to validate the riskiest assumption first. If the project is going to fail, where would it fail? Attack that point first.
Take a project like "extract a specific clause from 100,000 of the customer's PDF contracts." The biggest risk isn't the UI or authentication. It's whether the model can correctly pull the clause out of those messy real PDFs. So the UI comes later; first, within days, you run the model over a few hundred real PDFs and check the accuracy. If that doesn't work, nothing else matters.
The rules of a spike are simple.
- Time-box it: "We reach a conclusion in two days." A spike must not drag on forever.
- Frame a clear question: Pose a yes/no question — "does this work or not?"
- The output is knowledge: Success buys confidence; failure buys a pivot. Both are wins.
Deliberate Tech Debt: Borrow, but Record
In a throwaway prototype, technical debt is not a sin but a strategy — as long as it's deliberate.
"Bad debt" is debt you pile up without noticing. "Good debt" is debt you take on with eyes open: "speed matters now, so I'm taking a shortcut here; later, in production, I'll do it properly like this."
The principles for handling deliberate tech debt:
- Record that it's debt: Leave a marker wherever you took a shortcut. When you present the prototype, honestly say "this part is a demo-only stopgap."
- Separate core logic from stopgaps: Put real care into the part that proves the actual value (say, the extraction logic), and cut corners boldly on the periphery (auth, storage, UI).
- Keep it reversible: Leave it clear where to touch when it's time to rip the shortcut out later.
When to Hardcode
In a prototype, hardcoding isn't shameful — it's a powerful technique. The question is where you hardcode.
The principle: everything outside the value you're trying to prove is a candidate for hardcoding.
- Auth / permissions: In a demo, the login flow is usually not the value. Just wire in a token.
- Config values: Customer name, thresholds, category lists — bake them into the code for now. Extract to config later.
- Surrounding integrations: Fake the responses of external systems you haven't wired up yet.
Conversely, there's one thing you must never hardcode: the heart of the demo, the very value you're proving. If you pre-fill the extraction results by hand in a clause-extraction demo, that's not a demo — it's a con. It has to genuinely work when the customer throws their own document at it on the spot. That moment is the aha moment.
Here's an example expressing this instinct in code. The real value (extraction) actually runs; everything else is shamelessly hardcoded.
# demo_extractor.py — demo prototype (throwaway code)
# [HARDCODE OK] things that are not the value of the demo
DEMO_CUSTOMER = "acme-corp"
FAKE_AUTH_TOKEN = "demo-token-do-not-ship"
TARGET_CLAUSE_TYPES = ["indemnification", "termination", "liability"]
def get_current_user():
# [DELIBERATE DEBT] the demo only fakes auth. Replace with real OAuth in production.
return {"org": DEMO_CUSTOMER, "token": FAKE_AUTH_TOKEN}
def extract_clauses(pdf_text: str) -> list[dict]:
# [REAL VALUE] this part must actually work. Never hardcode.
# Working on a document the customer throws in live is the heart of the demo.
prompt = build_extraction_prompt(pdf_text, TARGET_CLAUSE_TYPES)
response = call_llm(prompt)
return parse_clauses(response)
def save_results(results: list[dict]) -> None:
# [DELIBERATE DEBT] demo just writes local JSON. Replace with a DB in production.
import json, pathlib
pathlib.Path("demo_output.json").write_text(json.dumps(results, indent=2))
The Shortest Path to the Aha Moment
The goal of FDE prototyping converges on one thing: get the customer to the aha moment as fast as possible. The aha moment is when the customer understands — with their eyes, not their head — "oh, this is how it solves our problem."
A few principles for shortening that distance:
- Demo on the customer's data: No matter how well it runs on your sample data, the customer hears it as someone else's story. The moment their own data moves, it becomes their problem.
- Finish exactly one impressive flow: Rather than showing ten features half-baked, polish a single "wow" flow to a smooth finish. A demo is depth, not breadth.
- Win in the first 30 seconds: Attention is short. Don't burn time on login, setup, and onboarding — show the core value the moment it opens.
- Show real results: Not a mockup screen, but genuinely computed output. Customers can smell the difference between real and fake.
Managing Expectations: Say the Demo Is a Demo
The biggest risk of a throwaway prototype isn't technical — it's misunderstanding. If a demo is too smooth, the customer (and sometimes your own sales team) concludes, "this is basically done, you can ship next week, right?" — even though months separate a few-day demo from production.
So expectation management is the essential other half of prototyping.
- Be clear it's a demo: Say up front, "this is a prototype to show value, and there are a lot of stopgaps behind it."
- Show what's left to production: Present the list of real work the demo hides — error handling, scaling, security, integrations.
- Use the "iceberg" metaphor: The demo is the tip of the iceberg above the water; production is the vast body beneath.
Do this well and you keep the demo's impact while dodging unrealistic schedule pressure.
From Prototype to Production
When the demo lands and the deal moves forward, the real question arrives: how do you turn this prototype code into production?
Two common mistakes lurk here. One is shoving the prototype straight into production (the stopgaps stay and become bombs); the other is rewriting everything from scratch (throwing away what you learned). The good answer usually sits in between.
- Keep the core logic, swap the shell: What the prototype genuinely validated is the core value logic (extraction, matching, calculation). Polish and keep that; properly rebuild the auth, storage, UI, and integrations you had hardcoded.
- Pay down the deliberate debt one by one: Using the debt markers you left as a map, replace each stopgap with a real implementation.
- Use the prototype as a spec: The prototype itself is the most accurate spec of "what the customer wants." Even if you rewrite, treat this living spec as the reference.
- Redraw the boundary: Decide here what is bespoke to this one customer and what belongs as a general feature in the product. (The next post digs deep into this topic.)
Anti-Patterns: When to Stop
The throwaway prototype turns toxic if misused. Reexamine your approach if you see these signals.
- The demo drags on for weeks: A prototype that should take days but takes weeks is no longer a prototype — it's directionless production.
- You grow attached to throwaway code: If you catch yourself thinking "this is nicely written, shame to toss it," that's a warning. A prototype is only free if you can throw it away.
- It only runs well on fake data: If it collapses on the customer's real data, you haven't validated the risk yet.
- Nobody feels the aha: If the customer shrugs at the demo, the problem or the value hypothesis itself may be wrong.
Wrapping Up
FDE prototyping is not the skill of "building sloppily" but of "knowing exactly what to build sloppily." Poke the riskiest assumption first with a spike, shamelessly hardcode everything outside the value, get the customer to the aha moment of their own data by the shortest path, honestly call a demo a demo, and promote only the validated core to production.
The paradox of the throwaway prototype is that precisely because you built something to throw away, you keep the most valuable things — conviction, direction, and the customer's trust. The next post is about how something built for one customer grows into a platform for all of them.
References
- Spike (Extreme Programming): http://www.extremeprogramming.org/rules/spike.html
- Martin Fowler, "Technical Debt": https://martinfowler.com/bliki/TechnicalDebt.html
- Steve Blank, "Get Out of the Building": https://steveblank.com/
- Palantir, "A Day in the Life of a Forward Deployed Software Engineer": https://blog.palantir.com/a-day-in-the-life-of-a-palantir-forward-deployed-software-engineer-45ef2de257b1
- Paul Graham, "Do Things That Don't Scale": https://paulgraham.com/ds.html