Mathieu Eveillard publishes on his personal blog on December 7, 2022 (last updated March 17, 2025) a point-by-point counter-argument to the famous essay by David Heinemeier Hansson (DHH) *"TDD is dead.
#Mathieu Eveillard#TDD#Test-driven development#DHH counter-argument#David Heinemeier Hansson#TDD is dead long live testing 2014#Test-first vs Test-driven development distinction#low-level unit tests
Mathieu Eveillard publishes on December 7, 2022 (last updated March 17, 2025) on his personal blog a point-by-point counter-argument to the famous essay by David Heinemeier Hansson (DHH) "TDD is dead. Long live testing." (2014). Article categorized craft / best-of.
Pivotal distinction that DHH misses according to Eveillard: Test-first (writing all the tests before any code) vs Test-Driven Development (tests guide me in writing code, each time I write a bit of code in reaction to a new test). DHH actually criticizes Test-first while calling it TDD — a confusion that "hides an entirely different way of programming".
Three refutations: (1) TDD as hammer to beat down the nonbelievers — Eveillard concedes the deontological point but redefines "good code" as fine-grained, co-located unit tests, a safety net; (2) Rebalance from unit to system — TDD says nothing about system tests and does not say there is nothing outside TDD; system tests do not replace unit tests (an income tax return tested end-to-end = absurd); test pyramid — unit tests for millisecond feedback + early bug detection; (3) Horrendous monstrosities of architecture (service objects, command patterns) — Eveillard does not see these effects in functional programming, so it is attributable to OOP, not TDD.
Balanced conclusion: "TDD is not a religion, it's a tool." TDD is particularly well suited to domain code (the functional core of a bounded context, the core of the hexagon) — calculation engines, fine-grained business rules, edge cases galore — that is "30% of the codebase at most". Mentions the Law of the Instrument (if the tool doesn't help, it's because you've fallen into the hammer trap).
Relevance to the AI watch corpus: a craft article outside the AI corpus strictly speaking but resonates with Kent Beck (Vibe Coding vs TDD 2024-10 + Augmented Coding 2025-06), Frizzo's writing muscle atrophy, Osmani's Cognitive Surrender (PRs capped at 100 lines + solo keyboard time), Lattice (fine granularity atoms/molecules). Ethical convergence on "tool, not religion" with Karpathy (jagged intelligence), DORA ("all models are wrong but useful"), Talisman ("the work cannot be skipped"). Limited-scope convergence with Stanford's 35-40% greenfield vs ≤10% brownfield and Ng's Frontend > Backend > Infra > Research.
To be used for internal craft training sessions, team debates on TDD, articulation with the 2026 coding agents corpus, sourcing a synthetic aphorism.
Key takeaways
Date / source.December 7, 2022 (initial), March 17, 2025 (last updated). Personal blog mathieueveillard.com. Categories: craft, best-of.
Target. DHH, "TDD is dead. Long live testing." (RailsConf 2014, Signal v Noise post).
Pivotal thesis.TDD is not a religion, it's a tool. And DHH actually criticizes Test-first, not TDD. ### Eveillard's pivotal distinction | Concept | Definition | |---------|-----------| | Test-first | I write all the tests before writing a single line of code | | Test-Driven Development | Tests guide me in writing code — each time I write a bit of code in reaction to a new test | > "It's a shame this confusion is never cleared up, because it hides an entirely different way of programming." ### The 3 point-by-point refutations #### (1) "TDD as a hammer to beat down the nonbelievers"DHH: TDD used as a hammer to point at non-believers, to declare them unprofessional. Eveillard concedes: no point in pointing fingers, contrasts with the craftsman's humility. But redefines "good code":
Beyond the absence of bugs;
Unit tests. documenting behavior at the lowest level;
Co-located. with the code;
Safety net. — "The finer the mesh, the better regressions are avoided". #### (2) "Rebalance the testing spectrum from unit to system"DHH: shift from unit tests (with mocks) to system tests. Eveillard responds:
TDD does not prohibit anything beyond unit tests.
System tests do not replace unit tests (an income tax return tested end-to-end = absurd).
Test pyramid. — each type contributes its own value:
Unit tests = millisecond feedback → guides code writing via TDD;
Early bug detection → lower cost. On architecture: "horrendous monstrosities (service objects, command patterns)" — Eveillard does not see these effects in functional programming, so it is attributable to OOP, not TDD. #### (3) "I do not write software test-first"DHH: uses "Test first" even though the title announces TDD. Eveillard points to the semantic confusion between Test-first and TDD as the fundamental flaw in DHH's argument. ### The reasonable scope of TDD > "TDD is particularly well suited to domain code, the functional core of a bounded context. The core of the hexagon, the core of the reactor. A calculation engine, fine-grained business rules, edge cases everywhere. There, I don't know how to do it other than with TDD. But in the end, this represents only a small part of the codebase, 30% at most." | Code | TDD relevant? | |------|----------------| | Domain / business rules / calculation engine | STRONGLY YES | | Glue code / orchestration / IO | Less so | | UI / framework boilerplate | Not required | | Eveillard's estimate | 30% of codebase max | ### Connection to the watch corpus #### Relevance to the AI / coding agents 2025-2026 corpus The article is from 2022 (so before the coding agents explosion) but resonates with current debates:
Kent Beck — Vibe Coding vs TDD. (2024-10-17): Beck observes that vibe coding and TDD are not mutually exclusive — TDD remains relevant for domain code, exactly Eveillard's position.
Beck — Augmented Coding Beyond Vibes. (2025-06-25): the "augmented coding" stance relies on guardrails (tests) that TDD naturally provides.
Frizzo.Year With Claude Code (2026-05-05): "writing muscle atrophy" — maintaining a TDD practice is precisely an antidote to the atrophy of manual practice.
Osmani Cognitive Surrender. (2026-05-05): "PRs ~100 lines max", solo keyboard time — converges with Eveillard's idea that TDD keeps the developer within the methodological practice of the craft.
Lattice. (2026-05-05): Atoms / Molecules / Refiners — fine granularity, exactly what TDD encourages. #### "Tool, not religion" convergence
Eveillard."TDD is not a religion, it's a tool."
Karpathy. (2026-04-29): "jagged intelligence" — a tool with boundaries of effectiveness.
DORA ROI 2026. (2026-04-21): "all models are wrong but useful" — methodological humility.
Talisman Ontology Pipeline Refresh. (2026-05-04): "the work cannot be skipped" — methodology as a disciplinary tool.
→ Ethical convergence: rejecting both dogmatism AND the rejection of a methodological tool. #### "Limited scope" convergence
Eveillard. TDD = 30% of codebase max (domain code).
Stanford. (cited by DORA): 35-40% productivity greenfield vs ≤10% brownfield — uneven distribution by context.
Ng The Batch #350. (2026-04-24): Frontend > Backend > Infra > Research — differential acceleration by context.
→ Convergence: no methodological tool is universally applicable — always assess the relevant scope. ### Limitations to flag
Article outside the AI corpus. strictly speaking — focus on craft / historical TDD. Relevant indirectly.
No empirical figures. — conceptual argumentation, not a study.
No engagement with coding agents. in the 2025 version (the March 2025 update does not appear to have incorporated the AI/agents debate).
The 30% scope is an estimate not sourced by Eveillard — debatable depending on context (a compiler could be 80% domain).
Frame strongly oriented toward FP/hexagonal. — may seem dogmatic to developers strongly rooted in OOP/Rails.
Does not address. the CI/CD impact on testing strategy debate that other authors (DORA in particular) consider critical. ### To be used for
Internal craft / TDD training sessions. reference French-language teaching material.
Team debates on TDD. structured argumentation to clarify Test-first vs TDD.
Connection with the 2026 coding agents corpus. positioning current debates (vibe coding, agents, AI-augmented) within the historical continuity of craft debates.
Sourcing. the aphorism "TDD is not a religion, it's a tool" — a usable synthetic formula.
Attributed claims
TDD is not a religion, it's a tool
— Mathieu Eveillard
DHH criticizes Test-first, calling it TDD
— Mathieu Eveillard
system tests do not replace unit tests
— Mathieu Eveillard
TDD-relevant domain code represents at most 30% of the codebase
— Mathieu Eveillard
The knowledge graph extracted from this fiche — 12 entities, 16 relations.
In this graph :Mathieu Eveillard · David Heinemeier Hansson (DHH) · Test-Driven Development · Test-first · "Le TDD n'est pas une religion, c'est un outil" · Pyramide de tests · Code domaine / bounded context / cœur hexagone · Loi de l'Instrument · 30% codebase max TDD · Article DHH 2014 "TDD is dead" · craft / artisanat logiciel · Articulation TDD / coding agents 2026