More Code with Jason episodes

321 - Uncle Bob Martin thumbnail

321 - Uncle Bob Martin

Published 3 Jun 2026

Duration: 00:58:59

Explores software modeling complexities, AI's reliance on statistical prediction versus explanatory knowledge, the balance of elegance and accuracy, abstraction's role in managing entropy and disorder, and the evolution of programming principles like test-driven development and object-oriented design.

Episode Description

In this episode I talk with Bob Martin about his work with programming languages using AI, the essence of software engineering, and why understanding...

Overview

The podcast explores Bob Martins extensive career as a programmer and author of Clean Code, highlighting his over 50 years of experience across diverse fields like financial systems and computational geometry. It delves into his experiments with AI agents to design programming languages, resulting in a Lisp-like language with limitations compared to existing ones. Philosophical critiques of AI emphasize its reliance on statistical prediction rather than causal understanding, contrasting with human-like explanatory knowledge. The discussion also examines AIs memory constraintsstrong short-term memory but negligible long-term memoryand its inability to form cross-context associations, unlike humans. Additionally, it touches on the challenges of achieving Artificial General Intelligence (AGI), arguing that current AI lacks self-motivation or ambition, requiring external prompts to function effectively.

The podcast further addresses software engineering challenges, such as the inherent complexity of modeling real-world systems, where compromises and imperfections are inevitable. It draws parallels between scientific modeling and programming, emphasizing the balance between elegance and accuracy. Concepts like abstraction, dependency inversion, and object-oriented principles (polymorphism, inheritance) are analyzed, with a focus on how high-level modules should remain independent of low-level details to enhance modularity and maintainability. The discussion also highlights the role of testing in preventing code decay, advocating for test-driven development and comprehensive test suites as bulwarks against chaos. Finally, it touches on the evolving landscape of software development, including updates to Clean Code to reflect modern practices and the ongoing interplay between human expertise and AI tools in programming.

What If

  • What if you apply Bob Martins "Two Disks" philosophy to your current project structure?

    • Move: Prioritize writing unit tests for all core functionality before implementing production code. Treat your test suite as the authoritative source of behavior.
    • Why Now?: Without tests, changes to production code risk introducing errors that are hard to trace. A robust test suite acts as a "bulwark against chaos," enabling safe refactoring and feature addition.
    • Expected Upside: If production code is lost, your tests can reconstruct it, reducing risk during onboarding, handoffs, or backups. This also forces discipline in defining clear, testable interfaces.
  • What if you rearchitect your software using dependency inversion principles to decouple high-level policies from low-level details?

    • Move: Define base interfaces (e.g., ScheduleItem) and implement low-level modules as concrete types that adhere to these interfaces. High-level components should only depend on the interfaces, not the implementations.
    • Why Now?: Modern systems grow complex quickly. Decoupling through interfaces reduces brittleness, making it easier to swap out implementations or add new features without disrupting existing logic.
    • Expected Upside: Improved maintainability and scalability. For example, adding a new appointment type to a scheduler wont require changes to the policies that manage it, assuming the interface is met.
  • What if you design an AI-assisted coding workflow that explicitly validates generated code against a strict test suite before deployment?

    • Move: Use AI to draft code snippets, then automatically run unit tests and static analysis tools to verify correctness. Only deploy code that passes all defined tests.
    • Why Now?: AI-generated code lacks the "explanatory knowledge" and self-critique of humans, leading to potential inefficiencies or errors. Testing acts as a safety net for this.
    • Expected Upside: You retain the efficiency gains of AI (e.g., rapid prototyping) while mitigating its limitations. The test suite ensures code quality and aligns AI output with your projects reliability standards.

Takeaway

  • Prioritize Model Simplicity with Real-World Accuracy: When designing software systems, balance elegance and accuracy by accepting imperfections. Use abstractions like subway maps to simplify complex scenarios while ensuring models remain functional and adaptable to edge cases.
  • Apply Dependency Inversion to Reduce Coupling: Structure your code so high-level modules depend on abstractions rather than low-level implementations. Use interfaces or contracts to decouple logic, improving modularity and maintainability (e.g., base classes for schedule item with derived types).
  • Adopt Test-Driven Development (TDD) for Stability: Write tests before code to ensure maintainability and prevent "code rot." Treat tests as a bulwark against chaos, enabling confident refactoring and validating system behavior without relying on AI-generated, low-quality tests.
  • Master Detail Management Through Abstraction: Focus on organizing intricate code details using layered abstractions. Use high-level modules to encapsulate general functionality while low-level modules handle specifics, mirroring how highway systems streamline decision-making over local roads.
  • Refactor Regularly with Comprehensive Tests: Maintain code integrity by running tests after every change, especially when introducing new features. This prevents regression and ensures small modifications dont inadvertently break existing functionality, leveraging tests as a "trap door" to reconstruct production code if needed.

Recent Episodes of Code with Jason

27 Apr 2026 319 - Kellen Presley of Rhizome Compliance

Covers physical programming's tactile appeal, career shifts from engineering to compliance, AI in fraud detection, minimalism in code, community learning, and AI's impact on fintech and education.

9 Apr 2026 318 - Adam Dawkins, CTO of Dragon Drop

Scaling Ruby on Rails projects faces challenges from rigid conventions that hinder flexibility, requiring intentional architecture, refactoring, and modular design to counter pitfalls like short-term solutions, poor testing, and overreliance on inheritance, while promoting collaboration through shared terminology and practical strategies.

29 Mar 2026 317 - Edward Tewiah, Creator of PropertyWebBuilder

A real estate website toolkit, Property Web Builder, faced UI/UX complexity and monetization hurdles despite AI-driven customization efforts, revealing challenges in balancing technical execution, client preferences, and shifting business priorities.

27 Mar 2026 316 - Adapting to AI in the Agency World with Errol Schmidt

AI tools like Claude and Codex are revolutionizing software development by boosting productivity and shortening timelines, yet raise concerns about agency business models, critique "vibe coding" as unprofessional, explore evolving developer roles with AI handling complex tasks, anticipate job market shifts and obsolescence, emphasize human creativity and judgment, and contrast software's ephemeral value with art's enduring qualities in an AI-driven landscape.

More Code with Jason episodes