Preparing your learning space...
43% through Solution Design tutorials
Every design meeting produces the same two questions: "which technology do we use?" and "do we build this or buy it?" Both are judgment calls with real consequences. This tutorial gives you a repeatable framework for choosing technology and a scorecard for the build-vs-buy decision.
A technology choice is a commitment with a long tail. Pick a framework, database, or platform and you inherit its ecosystem, its quirks, its upgrade schedule, and its failure modes — for the life of the solution.
The choice matters in three places:
In FDE work there's a fourth: the customer's environment. The best tool in the world is useless if the customer's IT team can't host it, secure it, or support it.
Run every candidate technology through the same checklist:
| Criterion | The question to ask |
|---|---|
| Fit | Does it actually solve the requirement, or will you fight it? |
| Maturity | Is it stable, documented, and used in production by others? |
| Community & support | When you're stuck at 11pm, will an answer exist? |
| Team familiarity | Does the team (and the customer's team) know it? |
| Operational cost | What does it cost to run, monitor, and upgrade? |
| Lock-in | How painful is it to leave later? |
| Licensing | Are the license terms compatible with the customer's policies? |
Note: "fit" comes first deliberately. A mediocre tool that fits the problem beats an excellent tool you have to bend the problem around.
"Boring technology" means technology whose failure modes are well known: it's been around, it's widely used, and surprises are rare. Postgres is boring. The database released last month is not.
The argument isn't against new tools — it's about spending your innovation budget. Every project gets a limited amount of novelty it can absorb. Spend it on the part that makes the solution special, not on the plumbing.
Innovation budget: 1 risky choice per project (roughly) Spend it on: the novel matching algorithm that solves the customer's problem Don't spend: an unfamiliar database, a new language, AND a new deployment model
Best Practice: default to what the team already runs in production. Familiarity is an underrated selection criterion — the fastest stack is the one you've debugged before.
When two or more options survive the checklist, score them in a matrix. Weight the criteria by what matters for this project:
| Criterion (weight) | Option A: Managed Postgres | Option B: Self-hosted Postgres | Option C: NoSQL store |
|---|---|---|---|
| Fit (3) | 3 | 3 | 2 |
| Ops cost (3) | 3 | 1 | 2 |
| Team familiarity (2) | 3 | 3 | 1 |
| Lock-in (1) | 2 | 3 | 2 |
| Weighted total | 26 | 21 | 16 |
Score 1–3 per cell, multiply by weight, sum. The numbers don't need to be perfect — the value is that the matrix forces you to name why you prefer one option, and the weights make the trade-offs explicit.
Note: if two options score within a couple of points, they're effectively tied — pick the more boring one and move on. Long debates over near-ties are how projects lose weeks.
Build vs buy is the question of whether to write a capability yourself or adopt something that already exists — a SaaS product, an open-source library, a managed service, or a platform feature.
It applies at every scale:
The instinct of many engineers is to build. The instinct of many managers is to buy. Both instincts are wrong sometimes — the answer comes from comparing the full costs, which are rarely what they look like.
Building looks free because the first version is cheap. The real bill arrives later:
What building actually costs: ✓ First version (the part everyone estimates) ✓ Bug fixes (forever) ✓ Security patches (forever, urgently) ✓ Upgrades & migrations (every major release) ✓ Monitoring & on-call (it's 2am and it's yours) ✓ Documentation (or nobody else can touch it) ✓ Feature requests (every stakeholder, forever)
A rule of thumb from the industry: maintenance costs 2–3× the original build over the system's life. If the first version takes two weeks, budget a month-plus of ongoing attention.
Buying looks expensive because the invoice is visible. But it has hidden costs too:
Buying trades build risk for dependency risk. Neither is zero.
Answer these five questions and the decision usually makes itself:
| Question | Leans BUY | Leans BUILD |
|---|---|---|
| Is this capability core to the customer's edge? | No — it's commodity (email, auth, payments) | Yes — it is the differentiator |
| Do good options already exist? | Yes, mature and proven | No, or none fit the requirement |
| How special are the requirements? | Standard behavior works | Heavily customized behavior needed |
| Who maintains it long-term? | Vendor maintenance is acceptable | Customer/you must control it |
| What are the data & compliance rules? | Vendor meets them | Data can't leave the customer's network |
The strongest signal is the first row: never build what is commodity, always consider building what is the differentiator. A logistics company's competitive edge is its routing logic, not its password-reset email.
The delivery solution needs to send SMS and email notifications to drivers and customers. Running the scorecard:
| Question | Answer | Lean |
|---|---|---|
| Core to the customer's edge? | No — notifications are commodity | BUY |
| Good options exist? | Yes — Twilio, SendGrid, SES, all mature | BUY |
| Special requirements? | Just templates + delivery status | BUY |
| Long-term maintenance? | Vendor handles deliverability, spam rules, carrier changes | BUY |
| Compliance? | No restriction on notification data | BUY |
Decision: buy — use a managed SMS/email provider behind a thin wrapper.
# Thin wrapper: keeps the vendor swappable
def send_notification(channel: str, to: str, template: str, data: dict):
if channel == "sms":
return sms_provider.send(to, render(template, data))
if channel == "email":
return email_provider.send(to, render(template, data))
raise ValueError(f"Unknown channel: {channel}")
The wrapper is the quiet hero: the rest of the code never mentions Twilio or SendGrid, so switching vendors later is a one-file change. Buy the product, but own the interface.
Save your progress and earn XP for completing tutorials.
4 questions · Pass with 70%+
1What is the first criterion in the technology selection checklist, and why is it prioritized?
2In the decision matrix example, what weight is assigned to the "Fit" criterion?
3What is the "boring technology" principal's main argument?
4What does the build-vs-buy scorecard's first question ask?
Technology
Forward Deployed Engineer
Lesson group
Solution Design
Progress
43% complete