01 / DefinitionWhat the role actually is
A Forward Deployed Engineer — FDE — is an engineer who embeds directly with a customer to build and ship solutions on top of their own company’s platform. Not a salesperson with a laptop, and not a support engineer closing tickets — an engineer who writes real code, in the customer’s environment, against the customer’s messy data.
The ordinary product engineer builds for an abstract, average user. The FDE builds for one customer at a time and gets close enough to see exactly where the product meets — or misses — reality.
02 / OriginWhere the role came from
The title was popularized by Palantir, whose model was to drop engineers into government and enterprise sites where the data was too sensitive, too tangled, or too weird to solve from a distance. The platform was powerful but generic; the FDE made it specific.
“The product gets you 80% of the way. The forward deployed engineer ships the last 20% — the part that’s different for every single customer.”
Now every AI company is rediscovering it. A foundation model is the ultimate generic platform, and turning it into a working system for a specific business is exactly the gap the FDE exists to close.
03 / The WorkA week in the field
A typical week has little to do with a normal sprint board. You start by sitting with the customer’s team to understand the workflow — not the feature request, the actual job. Then you prototype against their real data and usually discover it looks nothing like the demo. By Friday you’ve shipped something small that works, and filed three product gaps you hit along the way.
04 / In PracticeThe glue code nobody sees
Most FDE work looks unglamorous: reshaping a client’s export into something the platform can actually ingest. The code below is the kind of thing you write on day two — messy input in, clean records out.
def load_records(path: str) -> list[Record]:
rows = read_csv(path) # the customer's messy export
records = []
for row in rows:
if not row.get("id"): # skip the junk the export leaves
continue
records.append(Record(
id=row["id"].strip(),
name=clean(row.get("full_name", "")),
ts=parse_date(row.get("created")),
))
return dedupe(records) # same entity, five spellings None of this ships in the product. But the three data quirks you discover writing it — those become the feature requests that make the platform better for the next ten customers.
05 / Trade-offsWhere the role breaks
The role is not for everyone, and it has real costs. It is high-context and often high-travel, and it’s easy to get stuck: you can become so valuable to one account that you never leave it.
the last mile
customer, at times
vs a remote team
You protect yourself by treating every engagement as a source of product signal, not just delivery. If your work isn’t making the product better, you’ve quietly become a contractor.
06 / VerdictIs this you?
If you like shipping, dislike abstraction for its own sake, and get energy from watching a real user’s problem dissolve in front of you — this might be the best seat in the building. Here’s the shortlist.
- 01You write real code, but the job is the customer’s outcome — not your commit count.
- 02Comfort with ambiguity beats raw algorithm skill. The problem is never fully specified.
- 03Everything you build should generalize into the product — or be openly disposable.
- 04Bring the field back home. Your best output is the product gap nobody else could see.