Software Design Reference Master Designer · Complexity Trade-Offs

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

Both options have costs that are easy to undercount. The discipline is writing both ledgers:

BuildBuy
VisibleDev time, tests, docsLicense, subscription
HiddenEvery bug and edge case forever; the team must learn the domain you builtUpgrade cadence, vendor roadmap, contract lock-in, supply-chain surface
ControlTotal — it's yoursBounded — you follow their pace
FitExactly your problemTheir 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:

CumulativeYear 1Year 2Year 3Year 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.

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.
Field notes · five questions, both columns
AskBuild if…Buy if…
Is this why customers choose us?yes — it is the edgeno — it is plumbing
Would a bug here be a breach or a lawsuit?only with a real security budgetyes — you are buying the liability too
How fast does this part of our domain move?faster than any vendor shipsslower than the vendor’s roadmap
Can we leave in a quarter if we must?always — it is yoursonly if there is an export path in the contract
Who is paged at 3 a.m. when it breaks?your team, foreverstill your team — vendors don’t take your pager

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.

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.

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

Run your real ledger past your agent-teacher and let it poke the hidden columns.