Lesson 0027 · Master Designer · Module 1
Build vs Buy
Lesson 0026 gave the developer's version. The Master Designer's version adds the full accounting: licensing, upgrades, vendor risk, and the one question that overrules everything.
Mission tie-in: the first Complexity Trade-Off — where you learn to make decisions under constraints instead of by preference.
Knowledge: the full cost ledger
The two forces: control and fit (build) against time-to-value and inherited maturity (buy). The unit of decision: the component — never the system, and specifically the component you can draw a port around. "We are a build shop" and "we buy wherever possible" are both refusals to decide, and both are how a team ends up owning a billing engine and renting its recommendation model.
The ledger below is a proxy for the real question, which is not money. Money is fungible and, at these sizes, small. Senior engineering attention is neither. Buying converts an unbounded maintenance obligation into a bounded, renegotiable contract; building converts recurring cash into an asset you can shape — but only for as long as you keep staffing it. The ledger's job is to make the horizon visible so the attention argument can be had honestly.
Where it stops applying. The ledger decides nothing when the two options are not genuinely substitutable: if the vendor's 80% is the wrong 80%, the columns are comparing different products. It also assumes a stable horizon — a four-year break-even is noise for a business that might pivot or be acquired in eighteen months. And the differentiator test overrules it in both directions: never buy your edge because the licence is cheap this year, and never build your plumbing because the four-year arithmetic flatters you.
Both options have costs that are easy to undercount. The discipline is writing both ledgers:
| Build | Buy | |
|---|---|---|
| Visible | Dev time, tests, docs | License, subscription |
| Hidden | Every bug and edge case forever; the team must learn the domain you built | Upgrade cadence, vendor roadmap, contract lock-in, supply-chain surface |
| Control | Total — it's yours | Bounded — you follow their pace |
| Fit | Exactly your problem | Their 80% — you adapt to it |
The overruling question (from lesson 0026, now with the ledger behind it): is this your differentiator? If the thing you're building is the reason customers choose you, build — you cannot outsource the thing that makes you you. If it's plumbing — identity, billing infrastructure, file storage, a data-grid component — buy, and spend your team on the differentiator instead.
The third option, often missed: buy the boring 80% and build the 20% that matters. A vendor library + your adapter (lesson 0026's wrap rule) is usually the honest middle: their maturity, your edge.
The middle path has a shape, and it is the port from lesson 0009:
# your 20%: the workflow vocabulary, owned by you
class SignatureService(Protocol):
def request(self, doc: Document, signer: Party) -> RequestId: ...
def status(self, request: RequestId) -> SignatureStatus: ...
# their 80%: maturity, contained behind the port
class VendorSignatureAdapter:
def __init__(self, client: VendorSDK) -> None:
self._client = client
def request(self, doc: Document, signer: Party) -> RequestId:
envelope = self._client.envelopes.create(...) # their words stop here
return RequestId(envelope.id)
The port is the boundary of the purchase. Everything the vendor is genuinely good at lives on one side; everything that makes the workflow yours lives on the other. When their v3 renames envelopes to agreements, exactly one file changes — and the upgrade tax stops being a project.
A ledger with numbers in it (illustrative)
Document signing, sized by one team at a loaded rate of €90/hour:
- Build: 400 h to first release (€36,000), then ~80 h/year of maintenance and edge cases (€7,200/yr) — plus a legal review of signature validity that nobody on the team is qualified to sign off.
- Buy: €1,500/month licence (€18,000/yr), 16 h for the adapter (€1,440, once), ~8 h/year of upgrade tax (€720/yr).
| Cumulative | Year 1 | Year 2 | Year 3 | Year 4 |
|---|---|---|---|---|
| Build | €43,200 | €50,400 | €57,600 | €64,800 |
| Buy | €20,160 | €38,880 | €57,600 | €76,320 |
Break-even lands in year three. That single number reframes the argument: below a three-year horizon the ledger says buy and it is not close; above it, buying is a subscription you keep renewing. Teams argue for months about build vs buy without ever writing the two columns that make the horizon visible.
And notice what the ledger still does not settle. If signing were the product, you would pay the €43,200 in year one and call it the cost of owning your edge. If it is plumbing, the year-four crossover is an argument for renegotiating the licence, not for writing an e-signature stack. The ledger sizes the decision; the differentiator test makes it.
Worked example: what the senior looked at before the price
Same document-signing decision, watched over the shoulder of someone who has made it before. They do not open the pricing page first. They ask two questions the ledger cannot answer.
"If this vendor triples the price at renewal, or is acquired and sunset, what do we do on the Monday after?" That is the reversibility question, and it produces a number: sixteen hours to write a second adapter plus roughly forty hours to export and verify the historical signature records — about €5,000, once. A vendor whose exit costs more than a year of licence owns you, whatever the ledger says. Here it does not.
"Which of our twelve workflow steps does the vendor do natively, which need configuration, and which need a workaround?" Ten native, one configured, one workaround. That last count is the number to watch: past about two workarounds you are on the road to the failure mode where half the codebase exists to fight the 20% that never fitted.
Only then does the ledger get written, and only then does the tempting middle option get considered and rejected: a "thin build" implementing just the three signature types actually needed. It looks like the 80/20 move and it is not. Signature validity is a legal question with jurisdictional edge cases that nobody on a four-person team can evaluate, and the €36,000 build price does not include the liability transfer — which is most of what the vendor is actually selling. Recognising what is really being purchased is the skill; the arithmetic is bookkeeping.
The sequel is the part worth remembering. Three years later the vendor raised prices 22% at renewal. Because the port existed, the team ran a three-week spike against a competitor, priced the switch at the €5,000 they had estimated, and used a credible alternative to negotiate the increase down. They never migrated. The port's return was not the migration it enabled — it was the negotiating position it created, and that return does not appear on any line of the ledger.
† The upgrade tax is the most undercounted buy-cost: every vendor release is a contract negotiation between their roadmap and your code. Choose vendors with slow, boring release cadences — McKinley's boring-technology rule is a buying strategy, not just a building one.| Ask | Build if… | Buy if… |
|---|---|---|
| Is this why customers choose us? | yes — it is the edge | no — it is plumbing |
| Would a bug here be a breach or a lawsuit? | only with a real security budget | yes — you are buying the liability too |
| How fast does this part of our domain move? | faster than any vendor ships | slower than the vendor’s roadmap |
| Can we leave in a quarter if we must? | always — it is yours | only if there is an export path in the contract |
| Who is paged at 3 a.m. when it breaks? | your team, forever | still your team — vendors don’t take your pager |
- "Buying is cheaper because we don't pay engineers."
- You pay engineers for the integration, the upgrade tax, the workarounds and the incident response. The vendor does not take your pager, and a vendor outage is still your outage as far as your customers are concerned.
- "The break-even year decides it."
- The break-even sizes the decision. The differentiator test and the exit cost make it. A three-year crossover is irrelevant information if your planning horizon is eighteen months.
- "Open source is 'build' because it's free."
- Open source is buy with a different contract. You still inherit someone else's roadmap, and you may inherit their abandonment. Price is not the axis; who owns the roadmap is.
- "We'll build it and open-source it later."
- Maintaining a public project is a larger obligation than a private one, not a smaller one: issues, releases, compatibility promises and other people's use cases. "We'll open-source it" is a plan to acquire work, not to shed it.
When this is the wrong move
Don't run the full ledger on a cheaply reversible decision. If the component is a library behind a port you could swap in a week, spend an hour and take the boring option — the meeting costs more than either choice. Don't run it when the component is small enough that the evaluation dominates the work: in an enterprise with a procurement process, a forty-hour component can take six weeks to buy, and procurement time is a cost of buying that no ledger line captures. And don't run it at all before you have named the unit: "build or buy our platform" is not a decision, it is a dozen decisions wearing one coat.
Skill: which ledger wins?
Your startup's product is its recommendation engine. You should:
A billing system with vendor support and an API is best treated as:
The most undercounted cost in "buy" is:
Practice on your own code
Pick a system component you're about to build or buy (or already built). Write both ledgers — visible and hidden — for each option. Then state, in one sentence, why the differentiator test lands where it does.
In the lab. The phase-3 checkpoint has you run the build-vs-buy ledger for the carrier-label integration on the returns-resolution service — both columns, the exit cost, and the workaround count against the workflow steps — and then write the one sentence in which the differentiator test lands.
Reveal: a worked ledger
A team needed document signing. Vendor option: mature e-signature SaaS (license + their API). Build option: 400 hours + legal review of signature validity. The differentiator test: signing is plumbing — customers buy the workflow, not the signature. Buy. The adapter around the vendor's API took two days, and the workflow team stayed on the workflow.
- Explain to a junior, in two sentences, why the exit cost matters more than the break-even year.
- Find one dependency or vendor in your own system this week and estimate the Monday-after cost of losing it. Name what that number changes about how you would negotiate.
- Predict what your team is spending its best quarters on in a year if the differentiator test is never asked out loud.
Your win
You can write the full cost ledger for build vs buy, apply the differentiator test that overrules the ledger, and recognize the 80/20 middle path.
Read and watch deeper
- "Choose Boring Technology", Dan McKinley — the buying-side posture, upgrade tax included.
- "Simple Made Easy", Hickey — the cost-of-complexity frame that makes the ledger honest.
- Software Architecture in Practice, Bass et al. — the quality-attribute trade-off analysis (ATAM) this ledger is a small version of.
- "In Defense of Not-Invented-Here Syndrome", Joel Spolsky — the primary statement of the differentiator rule: build your core competency, buy everything else.
- Watch: ArjanCodes YouTube — search "build vs buy".
- Next: lesson 0028 — Abstraction vs Duplication.
- Reference: Trade-offs — build vs buy, including the signal that you chose wrong.
Run your real ledger past your agent-teacher and let it poke the hidden columns.