James Thompson — At The Intersection of Ruby & AI

Programmers Don’t Understand Value

Discover why programmers struggle with the concept of value in software development. Learn why technical debt only matters when it has real costs, why refactoring should focus on delivering customer value, and why our subjective preferences often cloud judgment. Find practical advice for evaluating technical work based on customer needs rather than personal bias, and strategies for balancing technical improvement with business impact.
Categories: Engineering Leadership, Tech Philosophy, Development Practices

In Honor of Legacy Code

Explore why we should honor rather than criticize legacy code in software engineering. Discover how working systems deliver business value even when using outdated technologies, and why a shift in perspective from selfish criticism to appreciative stewardship benefits both developers and organizations. Through real-world examples, learn to value the efforts of previous developers and focus on thoughtful evolution rather than wholesale replacement of functioning legacy systems.
Categories: Legacy Code & Maintenance, Tech Philosophy, Engineering Leadership

Tests Should Not Be Optional

Discover why code without automated tests should be considered inherently defective. Learn the crucial distinction between "what code does" versus "how it does it," and why tests should focus on behavior rather than implementation details. Explore how well-designed tests provide both confidence in system behavior and clear documentation for other developers. This practical guide covers strategies for adding tests to legacy systems, proper use of code coverage metrics, and creating tests that enhance rather than hinder future development work.
Categories: Development Practices, Software Architecture

Software Testing & Confidence

Explore how effective software testing builds the confidence needed to navigate complex codebases with certainty. Learn practical approaches to testing microservices, managing dependencies, and ensuring reliable inter-service communication. Discover why code without tests should be considered defective and how proper testing enables fearless refactoring and evolution. This practical guide offers strategies for gaining the confidence needed to maintain high-quality software across distributed systems.
Categories: Development Practices, Software Architecture

Microservices Will Mess Your Team Up

Understand the hidden costs and organizational challenges of microservices architecture before adoption. This article examines why boundary definition is critical, how operational complexity increases exponentially, and why technological diversity can become overwhelming without proper governance. Learn practical approaches for determining if microservices are right for your team, including domain mapping techniques and considerations for team structure based on Conway's Law.
Categories: Software Architecture, Team Collaboration, Engineering Leadership