# Matthew D. Webb > Engineering leader: platform engineering, governance and AI adoption across financial services and retail at scale. This site is a portfolio, a CV and an engineering notebook in one. Written in the first person and kept current. Article prose is the canonical source; everything below links to pages on this site unless noted. ## Articles - [Two million games, one running clock](https://mdwebb.io/articles/system-design/two-million-games-one-running-clock/): Plate two: two players sharing one truth while the clock runs, and why the bravest thing a real-time system can do is stop. (2026-07-10) - [Securing GenAI at enterprise scale](https://mdwebb.io/articles/securing-genai/): Large language models are rarely the weakest part of a GenAI system. The prompts, permissions, tools and people wrapped around them usually are. (2026-07-06) - [Answering questions with MCP](https://mdwebb.io/articles/ask-matt/): This site now answers questions over MCP through a tool called `ask_matt`. It quotes from published articles, hands over the hand-kept numbers when a question wants one, cites everything, and refuses the rest. The refusal took the most design effort. (2026-07-03) - [The anatomy of a resilient system](https://mdwebb.io/articles/the-anatomy-of-a-resilient-system/): Servers fail every day. Whether that becomes an outage depends far more on the organisation than the infrastructure. (2026-06-22) - [The traceability problem](https://mdwebb.io/articles/the-traceability-problem/): Most engineering systems are built to answer what happened. The harder question, the one that surfaces at the worst possible moment, is who changed what, when, why, and whether they should have. (2026-05-20) - [Interviewing engineers in the age of AI](https://mdwebb.io/articles/interviewing-engineers-in-the-age-of-ai/): When every candidate has a world-class assistant in the next tab, the interview stops measuring memory and starts measuring judgement. Most processes haven't noticed yet. (2026-04-23) - [Don't let AI borrow your brain](https://mdwebb.io/articles/dont-let-ai-borrow-your-brain/): The danger of AI isn't that it makes engineers less productive. It's that it quietly removes the exercise that kept them sharp in the first place. (2026-03-30) - [DORA metrics are not performance metrics](https://mdwebb.io/articles/dora-metrics-are-not-performance-metrics/): Lead time, deployment frequency and change failure rate tell us a great deal about delivery systems. They tell us surprisingly little about the performance of individual engineers. (2026-03-19) - [AI doesn't change Conway's law](https://mdwebb.io/articles/ai-doesnt-change-conways-law/): Every technology generation promises to transform how software gets delivered. Most of them eventually rediscover that organisational structure shapes the outcome far more than the tools the engineers happen to be holding. (2026-03-05) - [Golden paths and engineering governance](https://mdwebb.io/articles/golden-paths-and-engineering-governance/): The most effective governance models don't rely on approval boards, process documents or compliance checklists. They make the right thing the easiest thing, and then mostly get out of the way. (2026-02-21) - [One design system, twenty retail brands](https://mdwebb.io/articles/design-system-across-brands/): Shared components promise consistency and speed. They also quietly centralise risk. What it takes to run a single UI platform across brands that genuinely want to look different. (2026-02-09) - [From novelty to plumbing](https://mdwebb.io/articles/ai-in-engineering-teams/): The interesting question is no longer whether engineers use AI tools, but where they belong in the workflow and where they quietly make things worse. (2026-01-28) - [A payment system that refuses to guess](https://mdwebb.io/articles/system-design/a-payment-system-that-refuses-to-guess/): The second in the series: a system where the dangerous failure is not downtime but doubt, and where the guardrails exist to stop the machine resolving that doubt with optimism. (2026-01-24) - [Your AI doesn't need another API, it needs a toolbox](https://mdwebb.io/articles/your-ai-doesnt-need-another-api/): Why Model Context Protocol matters less because of the protocol itself and more because it solves a problem every engineering organisation eventually encounters. (2026-01-17) - [What AI adoption actually looks like inside a 300+ engineer organisation](https://mdwebb.io/articles/what-ai-adoption-actually-looks-like/): The hardest part of AI adoption isn't choosing tools. It's changing how engineers, leaders and organisations work around them. (2026-01-03) - [Designing a URL shortener for its worst day](https://mdwebb.io/articles/system-design/designing-a-url-shortener-for-its-worst-day/): Resilience is a design input, not a deep dive at the end. The first in a series: the smallest system everyone knows, designed around the question of what is allowed to die. (2025-12-29) - [Moving money is hard](https://mdwebb.io/articles/moving-money-is-hard/): Most software engineers think a payment is a database transaction. The payments industry has spent decades proving otherwise. (2025-12-01) - [Secrets are everywhere](https://mdwebb.io/articles/secrets-are-everywhere/): Year after year the breach reports tell the same story: not sophisticated attackers, just credentials sitting somewhere they shouldn't. (2025-11-01) - [Building a double-entry ledger in 200 lines](https://mdwebb.io/articles/building-a-double-entry-ledger/): Every system that tracks value eventually needs a ledger, and most start with a balance column and a sense of optimism. The fix is double-entry bookkeeping: five hundred years old, and small enough to build in an afternoon. (2024-03-01) - [Why most technical debt is really organisational debt](https://mdwebb.io/articles/why-most-technical-debt-is-really-organisational-debt/): Code rarely becomes hard to maintain because engineers wanted it that way. More often the architecture is just a faithful record of the incentives, constraints and decisions of the organisation around it. (2024-02-01) - [Why most engineering metrics fail](https://mdwebb.io/articles/why-most-engineering-metrics-fail/): The problem isn't that engineering metrics are useless. The problem is that we often ask them to answer questions they were never designed to answer. (2024-01-01) - [JavaScript security essentials: the pitfalls that still break production](https://mdwebb.io/articles/javascript-security-pitfalls-that-break-production/): Most JavaScript security failures aren't exotic. They come from trusting the wrong boundary, executing the wrong string, or forgetting how much power the browser hands to whoever turns up. (2023-03-01) - [The architecture of a chess engine](https://mdwebb.io/articles/the-architecture-of-a-chess-engine/): A modern chess engine can evaluate millions of positions per second, yet most of its strength comes from surprisingly simple ideas: search, pruning, caching, and a relentless obsession with efficiency. (2023-02-01) - [Why React re-renders: understanding the Fiber work loop](https://mdwebb.io/articles/why-react-re-renders/): Most React performance problems are really scheduling problems. A practical look at Fiber, reconciliation, and what actually happens after setState. (2023-01-01) - [Building a desktop platform is like building an operating system](https://mdwebb.io/articles/building-a-desktop-platform/): Most engineers think desktop platforms are about windows and toolbars. The hard parts are identity, communication, deployment, versioning and convincing hundreds of applications to coexist without setting fire to each other. (2022-04-01) - [Building a trading exchange in 200 lines](https://mdwebb.io/articles/building-a-trading-exchange-in-200-lines/): Modern financial exchanges move billions of dollars a day, yet the core matching engine comes down to a handful of data structures and a few unglamorous rules. (2022-03-01) - [Designing for sub-100ms: latency budgets in trading UIs](https://mdwebb.io/articles/latency-budgets-trading-uis/): When a price moves, the screen has one job: show it before the trader notices the delay. A practical look at spending a latency budget across transport, processing, rendering and paint. (2022-01-01) - [Most JavaScript performance problems aren't JavaScript problems](https://mdwebb.io/articles/most-js-performance-problems-arent-js/): After enough profiling sessions you start to realise the language is rarely the bottleneck. Our assumptions usually are. (2021-02-01) - [Twelve months chasing mastery](https://mdwebb.io/articles/twelve-months-chasing-mastery/): A year spent discovering that mastery is much less glamorous than it looks. (2021-01-01) - [Caching is easy until it isn't](https://mdwebb.io/articles/caching-is-easy-until-it-isnt/): Most caching strategies look brilliant during architecture reviews and become considerably less impressive the first time stale data reaches production. (2020-02-01) - [Why JavaScript performance is weird](https://mdwebb.io/articles/why-javascript-performance-is-weird/): Modern JavaScript engines are astonishingly fast, but only because they spend most of their time pretending your code is better than it actually is. (2020-01-01) - [The event loop is not what you think](https://mdwebb.io/articles/the-event-loop-is-not-what-you-think/): Most explanations stop at the call stack and callback queue. The reality is more interesting, and explains many of the bugs engineers encounter in production. (2019-12-01) ## Site - [Experience](https://mdwebb.io/experience/): roles, tenure and the systems built along the way - [Projects](https://mdwebb.io/projects/): products, published packages and experiments - [CV](https://mdwebb.io/cv/): the conventional one-page version, with a PDF download - [About](https://mdwebb.io/about/): who I am and how I work - [Article archive](https://mdwebb.io/articles/archive/): every article in one chronological index - [Hobbies](https://mdwebb.io/hobbies/): a chess centre, distance running, chess over the board ## Projects - [Prep DB](https://prepdb.io/): Opening stats over millions of master games, answered in a single index scan, transpositions included. - [Seen It](https://seen-it.app/): Movie tracking is tedious. Most people quit before they start. - [Boardcast](https://boardcast.studio/): Broadcasting live chess with near-zero latency over unreliable venue WiFi. - [Chess Clock](https://clock.chessmoves.io/): The DGT clocks are beautiful, so, I wanted the option of one in my pocket... - [Book This](https://bookthis.io/): Running a fitness studio shouldn't require spreadsheets and guesswork. - [Landmark Fitness](https://www.landmarkfitness.io/): Building workplace fitness without turning it into workplace surveillance. - [React Chess](https://www.chessmoves.io/): Most chess components are harder to integrate than the game itself. - [React Calendar](https://react-calendar.mdwebb.io/): Everyone underestimates date logic. Everyone regrets it, I'm no exception. - [Chess Library](https://chess.mdwebb.io): Engine analysis is heavy; nobody wants a live Stockfish worker just to spot a blunder. - [AI Trader](https://trade.mdwebb.io): Getting autonomous agents to decide instead of vanishing into infinite planning loops. - [Delivery Simulator](https://simulator.mdwebb.io): Every team argues about process; nobody sees the second-order effects until it ships. - [Friends Quiz](https://www.friendsquiz.io/): Making 'fastest finger wins' indisputable at scale. - [Atlas](https://atlas.mdwebb.io): Fully offline playable country & capitals quiz game. - [Sudoku Solver](https://sudoku-solver-three.vercel.app/): The puzzle takes minutes. Watching a backtracking algorithm speedrun it never gets old. - [Rogue Trader](https://github.com/matt-d-webb/rogue-trader): You don't learn C++ from a book. ## Machine access - [RSS feed](https://mdwebb.io/feed.xml): full article content - Markdown renditions: append `.md` to any article URL (drop the trailing slash) for the raw source, e.g. https://mdwebb.io/articles/two-million-games-one-running-clock.md - MCP endpoint: `https://mdwebb.io/mcp/` (Streamable HTTP, no auth). Tools: about, list_articles, get_article, get_experience, get_projects, get_reading, ask_matt, get_stats, get_availability, things_i_will_say_no_to. Point an MCP client at it to query the CV and articles directly; ask_matt answers from the article collection (verbatim, with citations) and the hand-kept numbers, and refuses the rest; get_stats has the personal numbers in one call (chess rating, running, the chess centre). - [For agents](https://mdwebb.io/for-agents/): the human-readable guide to all of the above