Daily Digest
Why TDD and AI coding tools exploit the same psychological flaws
Drew DeVault draws a provocative parallel between Test-Driven Development cults and GenAI adoption, arguing both exploit developers' psychological need to feel competent while potentially undermining actual code quality.
- TDD's hidden influence on architecture: While ensuring test coverage, TDD shapes codebases to be "testable" rather than well-designed, and provides no guarantee that passing tests verify the right behavior for actual user needs.
- The dopamine trap of development metrics: Both TDD's green test suites and AI's rapid output create addictive feedback loops through coverage percentages, CI badges, and productivity metrics that make developers feel competent regardless of actual code quality.
- AI coding agents as the new performance theater: GenAI tools let mediocre programmers experience the rush of 10x developer productivity, building "cathedrals" quickly that have beautiful test coverage but rotten foundations underneath.
- The psychological cost of shortcuts: Developers chase these tools despite knowing the externalities (environmental costs, job displacement) because the feeling of finally being "great" at programming overrides long-term concerns.
Latest Articles - Page 14
Testing: exceptions and caches
Two testing-related things I found recently. Unified exception testing Kacper Borucki blogged about parameterizing exception testing, and linked to pytest docs and a StackOverflow answer with similar
Should you include engineers in your leadership meetings?
While Staff Engineer was first and foremost an attempt to pull the industry towards my perspective on staff-plus engineering roles, writing it also changed my opinions in a number of ways. Foremost, i
Writing Visualizations with Remotion
Remotion is having a bit of a moment at the moment, and I decided to play around with the Claude Code integration. Here are a couple videos I was able to make in <10 minutes summarizring data on my bl
Curiosity is the first-step in problem solving.
Despite my best efforts, I have been wrong a lot over the years. I’ve been wrong about technology patterns (in 2014, I thought microservices would take over the world), I’ve been wrong about managemen
Stripe's Lighthouse Hiring pattern.
I did a lot of hiring at Uber, some days I would be doing back-to-back 30 minute phone screens for several hours in a row. That said, while Uber taught me how to hire at scale, it was Stripe that taug
Pressure Without a Plan.
When we launched Digg v4, the old site turned off, but the new site didn’t turn on. There was a lot of pressure to get things working, but no one knew what to do about it. It took almost a month to ge
The Value of Things
One of the reasons I write is to help me organize my own mind. I have a compulsive need to figure things out and I’ll lay awake at night shuffling sentences around in my head until it hangs together.
Considering Strictly Monotonic Time
Considering Strictly Monotonic Time Jan 23, 2026 Monotonic time is a frequently used, load bearing abstraction. Monotonicity is often enforced using the following code: fn now(clock: *Clock) Instant
Fragments: January 22
My colleagues here at Thoughtworks have announced AI/works™, a platform for our work using AI-enabled software development. The platform is in its early days, and is currently intended to support Thou
Conversation: LLMs and the what/how loop
LLMs help developers explore the "what/how" loop of software abstraction more fluidly, complementing TDD in managing cognitive load and building adaptable systems.
Elegant and safe concurrency in Rust with async combinators
Rust's async combinators enable elegant, functional concurrent programming while maintaining safety and declarative code style.