Matt Pocock argues that despite advances in AI-driven coding, strong software fundamentals and clear communication between developers and AI remain essential to produce maintainable, high-quality code. He advocates for practices like Domain-Driven Design, Test-Driven Development, and modular architecture to bridge understanding gaps, reduce complexity, and ensure AI serves as a tactical tool under human strategic guidance.
It Ain't Broke: Why Software Fundamentals Matter More Than Ever — Matt Pocock, AI Hero @mattpocockuk
In his talk, Matt Pocock emphasizes that software fundamentals are more crucial than ever in the age of AI-driven coding. He challenges the popular “specs to code” movement, which suggests that developers can simply write specifications and let AI generate code without deeply engaging with the code itself. Through his own experiments, Pocock found that repeatedly running AI compilers without understanding or refining the code leads to increasingly poor-quality outputs. He highlights that bad code—characterized by complexity and difficulty to modify—is expensive and limits the benefits AI can provide, underscoring the enduring importance of solid software design principles.
Pocock draws on classic software engineering literature to frame his argument. He references John Ousterhout’s definition of bad code as complex and hard to change, and the concept of software entropy from The Pragmatic Programmer, which describes how codebases tend to degrade if changes are made without considering the overall design. He also introduces Frederick P. Brooks’ idea of the “design concept,” an intangible shared understanding among collaborators, and explains how this concept is often missing between developers and AI. To bridge this gap, Pocock developed a “grill me” technique where the AI relentlessly questions the developer to reach a shared understanding before coding begins, improving alignment and outcomes.
Another key challenge Pocock addresses is the communication gap between developers and AI, which can result in verbose or misaligned outputs. He advocates for adopting Domain-Driven Design (DDD) principles, particularly the creation of a ubiquitous language—a shared vocabulary that aligns domain experts, developers, and AI. Pocock created a skill that scans codebases to extract terminology and generate a markdown file of this language, which helps the AI communicate more clearly and produce code that better matches the intended design. This shared language reduces verbosity and improves the coherence of AI-generated code.
Pocock stresses the importance of feedback loops such as static typing and automated testing to ensure AI-generated code works correctly. He highlights that AI often struggles with incremental development and tends to produce large amounts of code before testing, which is inefficient. To counter this, he recommends Test-Driven Development (TDD), which forces small, deliberate steps: writing tests first, then code, and finally refactoring. He also discusses the architectural concept of deep modules—large, well-encapsulated components with simple interfaces—which make codebases easier to test and maintain. This modular approach helps both developers and AI manage complexity and improve code quality.
Finally, Pocock points out that well-designed codebases not only improve AI collaboration but also reduce cognitive load on developers. By focusing on designing clear interfaces and delegating implementation details to AI, developers can concentrate on strategic system design rather than getting bogged down in low-level details. He concludes that code is not cheap; investing in good design and software fundamentals remains essential. AI can serve as a tactical programmer, but human developers must act as strategic leaders, applying decades of software engineering wisdom to harness AI effectively. Pocock offers resources and training to help developers build these skills and thrive in the evolving AI landscape.