Read 4 conference talk excerpts — architecture, technical debt, ML in production, and API design — then answer comprehension questions. Advanced vocabulary and argument structure.
How to follow a tech talk in English
Thesis first: speakers often state the main argument in the first 60 seconds — listen for it
Analogies: complex concepts are explained via familiar comparisons (debt = mortgage, monolith = building)
Challenge words: "but", "however", "the trap is", "the problem is" — signal the key point
Summary signals: "my recommendation", "the takeaway", "what I want you to remember" — write these down
0 / 4 completed
1 / 4
📄 Transcript
[Conference talk excerpt — on microservices vs. monolith. PyCon-style talk.]
Speaker: "...so let me challenge the conventional wisdom here. We've all heard 'start with a monolith, extract microservices later.' And I mostly agree — but the phrase hides a trap.
The trap is this: when people say 'monolith', they mean different things. There's the well-structured modular monolith, where your code is organised into clearly bounded modules that happen to deploy together. And then there's the big ball of mud — everything coupled to everything, deployment is terrifying, nobody knows what anything does.
The second one is not a stepping stone to microservices. It's a dead end. You can't extract services from a codebase where nothing has clear ownership. You end up doing two hard things at once: decomposing the domain AND building a distributed system.
My recommendation: if you're starting fresh, invest in the modular monolith. Define your domain boundaries like you would for services — just don't make them services yet. Then, when you have genuine scaling or team autonomy reasons to extract, you can do it surgically, because the seams are already there."
What is the speaker's main argument, and what distinction do they draw between types of monolith?
The nuanced argument: "start with a monolith" is good advice, but only for a structured modular monolith — not a "big ball of mud".
Key architecture vocabulary:
"monolith" = an application deployed as a single unit (one codebase, one process)
"modular monolith" = a monolith with clear internal module boundaries — organised by domain, not just by technical layer
"big ball of mud" = a codebase with no clear structure, high coupling, low cohesion — architectural anti-pattern coined by Brian Foote and Joseph Yoder
"microservices" = an architecture where each function is a separate deployable service
"extract" = pull a piece of functionality out of the monolith into its own service
"seams" = natural boundaries in code where you can split — like seams in a garment
"surgically" = precisely, without damaging surrounding code
2 / 4
📄 Transcript
[Conference talk excerpt — on technical debt. QCon-style talk.]
Speaker: "Technical debt is one of those terms everyone uses and nobody defines. Let me give you a framework from Ward Cunningham, who coined the term. His original metaphor was financial debt — not because it's bad, but because it has interest.
If you take on debt deliberately — you ship something quick to hit a deadline, knowing you'll refactor later — that's like a mortgage. You get the house now, you pay it off over time. Manageable.
The dangerous one is the debt you don't know you have. The codebase that grew without clear ownership, the API designed by someone who left three years ago, the 'we'll document it later' that never happened. That's high-interest debt — compounding daily.
The indicator I use: watch your onboarding time. If it takes a new developer more than two weeks to make a meaningful change, something is wrong with your codebase. That's the interest you're paying. Not in code, but in understanding tax — every new engineer has to re-discover the same knowledge the previous one discovered."
According to the speaker, what is the difference between "deliberate" and "accidental" technical debt, and what metric do they use to measure accumulated debt?
Deliberate debt (like a mortgage — manageable) vs. accidental debt (undocumented, compounding). Metric: onboarding time.
High-interest compounding debt: "Nobody knows why this works" — every developer has to rediscover it
Key vocabulary:
"technical debt" = accumulated cost of quick/poor decisions that make future changes harder
"refactor" = restructure code without changing its external behaviour
"compounding" = growing at an accelerating rate (financial term: interest on interest)
"understanding tax" = the cognitive cost paid by every developer who needs to understand poorly documented code
"code ownership" = clear responsibility for a module/service — "nobody owns this" leads to decay
The onboarding metric is brilliant: It's observable, measurable, and doesn't require code analysis tools — just ask a new developer how long it took to ship their first meaningful change.
3 / 4
📄 Transcript
[Conference talk excerpt — on machine learning in production. MLOps talk.]
Speaker: "...there's a well-known joke in ML: getting 90% accuracy on your validation set takes an afternoon. Getting to 95% takes a week. Getting to 99% takes a PhD. But that's a distraction. Because getting your 90%-accurate model into production, keeping it there, and knowing when it degrades — that's the hard part nobody teaches.
Let me talk about model drift. Your model is trained on historical data. The world changes. Users change their behaviour. Distribution shift happens — the data your model sees in production starts to differ from the data it was trained on. And your accuracy quietly degrades with no error messages, no exceptions, no 500s. Just wrong predictions, silently, at scale.
The solution is monitoring. Not infrastructure monitoring — model monitoring. You track: prediction distribution (is the output distribution still what you expect?), feature distribution (is the input data still within training distribution?), and ground truth latency (how long before you can verify if the prediction was right?).
The phrase I use with my teams: treat your model like a system, not like a file. A file doesn't need monitoring. A system does."
What is "distribution shift" and what does the speaker mean by "treat your model like a system, not like a file"?
Distribution shift = data in production drifts from training distribution → silent accuracy degradation. "System not a file" = models need monitoring like any production service.
MLOps vocabulary from this talk:
"validation set" = a held-out subset of data used to evaluate model performance during training
"model drift" = gradual degradation of model performance over time (a broader term than distribution shift)
"distribution shift" = the statistical distribution of real-world data diverges from training data distribution
"prediction distribution" = what the model outputs — if it starts predicting "positive" 90% of the time when it used to say 50/50, something changed
"feature distribution" = the statistical distribution of input features — is user age distribution changing? Purchase amounts?
"ground truth" = the actual correct answer — in ML, often only available after a delay (did the user click? Did the loan default?)
The speaker's key insight: Traditional software fails loudly (errors, exceptions). ML fails silently — wrong predictions with no error messages. This requires a different class of monitoring.
4 / 4
📄 Transcript
[Conference talk excerpt — on API design. APIWorld talk.]
Speaker: "...let me talk about the two hardest problems in API design: backwards compatibility and versioning — which are related but not the same.
Backwards compatibility means: if I change my API, existing clients continue to work without modifications. The rule of thumb: additions are safe, removals are breaking, modifications require care.
Adding a new optional field? Safe — existing clients ignore it. Removing a required field? Breaking — every client that reads it breaks. Renaming a field? Breaking, even if you add the old name as an alias.
Now versioning. Everyone thinks versioning solves backwards compatibility. It doesn't — it just pushes the problem to 'how do you run v1 and v2 in parallel indefinitely?' URL versioning (v1, v2 in the path) is the most visible approach but it multiplies your maintenance burden. Header versioning is cleaner but harder to discover. My recommendation: invest heavily in backwards compatibility so you rarely need to version. When you do, deprecate explicitly — set a sunset header, communicate a timeline, and actually remove old versions. Zombie APIs — versions you support but nobody officially should use — are a maintenance trap."
What does the speaker mean by "additions are safe, removals are breaking"? What is a "zombie API"?
"Additions safe, removals breaking" = the cardinal backwards compatibility rule. Zombie APIs = deprecated versions that still run, consuming maintenance effort.
API versioning vocabulary:
"backwards/backward compatibility" = new versions of the API work with older clients without changes on the client side
"breaking change" = a change that causes existing clients to fail without modification
"URL versioning" = /api/v1/users vs. /api/v2/users — explicit in the path
"header versioning" = version specified in HTTP headers, keeping the URL clean but less discoverable
"deprecate" = signal that a feature will be removed in the future
"sunset header" = an HTTP header (Sunset: date) telling API consumers when an endpoint will be decommissioned
"zombie API" = a deprecated version that was never actually removed and must still be maintained
The rule in action:
✅ Adding { "email": "..." } to a response — safe
❌ Removing "phone" field — breaks any client reading it
❌ Renaming "user_id" to "id" — breaks all code using user_id