<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Underdog Blog</title><description>Craftsmanship is a moral obligation.</description><link>https://www.underdog-blog.com/</link><item><title>The Four Accelerate Metrics</title><link>https://www.underdog-blog.com/posts/accelerate-metrics/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/accelerate-metrics/</guid><description>Lead time, deployment frequency, mean time to restore, and change fail percentage measure what actually matters in software delivery.</description></item><item><title>ACID Transactions</title><link>https://www.underdog-blog.com/posts/acid-transactions/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/acid-transactions/</guid><description>Understanding the four critical properties that database transactions must guarantee to ensure data integrity and system reliability</description></item><item><title>Agile and SOLID</title><link>https://www.underdog-blog.com/posts/agile-and-solid/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/agile-and-solid/</guid><description>An in-depth exploration of how SOLID principles enable agile teams to build maintainable, adaptable code</description></item><item><title>AI and Software Engineering: Iteration Compression, Not Revolution</title><link>https://www.underdog-blog.com/posts/ai-iteration-compression/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/ai-iteration-compression/</guid><description>AI has compressed the iteration cycle, not transformed the discipline. The constraint was never writing code. It was always understanding.</description></item><item><title>Architecture Is A Team Decision</title><link>https://www.underdog-blog.com/posts/architecture-is-a-team-decision/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/architecture-is-a-team-decision/</guid><description>Why software architecture decisions impact the entire team and how different architectural patterns affect development efficiency</description></item><item><title>Some Architectures Work Better with LLMs Than Others</title><link>https://www.underdog-blog.com/posts/architectures-and-llms/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/architectures-and-llms/</guid><description>Architectural patterns that emphasize code locality work better with LLM-assisted development than patterns optimizing for shared abstractions.</description></item><item><title>Brooks&apos; Law</title><link>https://www.underdog-blog.com/posts/brooks-law/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/brooks-law/</guid><description>Understanding the counterintuitive principle that adding more developers to a delayed software project often increases the delay</description></item><item><title>Build vs. Buy: Why Custom Solutions Win</title><link>https://www.underdog-blog.com/posts/build-vs-buy/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/build-vs-buy/</guid><description>Examining how the economics of custom development have shifted to favor building over buying for core business capabilities</description></item><item><title>CAP Theorem</title><link>https://www.underdog-blog.com/posts/cap-theorem/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/cap-theorem/</guid><description>Understanding the impossibility of simultaneously guaranteeing Consistency, Availability, and Partition tolerance in distributed systems</description></item><item><title>Choosing an Architecture</title><link>https://www.underdog-blog.com/posts/choosing-an-architecture/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/choosing-an-architecture/</guid><description>A practical guide to selecting the right architectural pattern based on what actually changes in your codebase</description></item><item><title>Composition over Inheritance</title><link>https://www.underdog-blog.com/posts/composition-over-inheritance/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/composition-over-inheritance/</guid><description>Why building objects from smaller components creates more flexible and maintainable code than deep inheritance hierarchies</description></item><item><title>Comprehension Can&apos;t Be Reduced to the Artifact</title><link>https://www.underdog-blog.com/posts/comprehension-cant-be-reduced-to-the-artifact/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/comprehension-cant-be-reduced-to-the-artifact/</guid><description>Peter Naur argued in 1985 that programming isn&apos;t about producing code. It&apos;s about building a theory of how problems map to solutions.</description></item><item><title>Constantine&apos;s Equation</title><link>https://www.underdog-blog.com/posts/constantines-equation/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/constantines-equation/</guid><description>Understanding the fundamental equation that shows why software costs are dominated by maintenance, not initial development</description></item><item><title>Control Flow Complexity</title><link>https://www.underdog-blog.com/posts/control-flow-complexity/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/control-flow-complexity/</guid><description>Why decisions buried deep in functions create complexity, and how pushing them to system boundaries creates simplicity</description></item><item><title>Conway&apos;s Law</title><link>https://www.underdog-blog.com/posts/conways-law/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/conways-law/</guid><description>Understanding the fundamental principle that software systems mirror the communication structure of the organizations that build them</description></item><item><title>Coupling and Cohesion</title><link>https://www.underdog-blog.com/posts/coupling-and-cohesion/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/coupling-and-cohesion/</guid><description>Understanding the fundamental forces that shape software architecture: how modules depend on each other and how well elements within modules work together</description></item><item><title>The Daily Stand-Up</title><link>https://www.underdog-blog.com/posts/daily-stand-up/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/daily-stand-up/</guid><description>Understanding how daily stand-ups coordinate collaborative teams through strategy conversations, not status reports</description></item><item><title>Dependency Inversion Principle</title><link>https://www.underdog-blog.com/posts/dependency-inversion-principle/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/dependency-inversion-principle/</guid><description>Why inverting dependencies is the key to flexible, maintainable software architecture</description></item><item><title>DRY and SRP</title><link>https://www.underdog-blog.com/posts/dry-and-srp/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/dry-and-srp/</guid><description>Resolving the apparent conflict between Don&apos;t Repeat Yourself and Single Responsibility Principle in software design</description></item><item><title>English Is Not Specific Enough for Code</title><link>https://www.underdog-blog.com/posts/english-is-not-specific-enough/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/english-is-not-specific-enough/</guid><description>We spent fifty years building languages to escape the ambiguity of English, and then we volunteered to go back.</description></item><item><title>Expressive Code</title><link>https://www.underdog-blog.com/posts/expressive-code/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/expressive-code/</guid><description>Why code should communicate its intent clearly to humans, not just execute correctly for computers</description></item><item><title>Feature Flags</title><link>https://www.underdog-blog.com/posts/feature-flags/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/feature-flags/</guid><description>Understanding how feature flags separate deployment from release and enable safe, gradual rollouts in production</description></item><item><title>Fibonacci Estimating</title><link>https://www.underdog-blog.com/posts/fibonacci-estimating/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/fibonacci-estimating/</guid><description>Understanding why agile teams use the Fibonacci sequence for estimations and how it matches human estimation capabilities</description></item><item><title>Freedom Is Not Chaos</title><link>https://www.underdog-blog.com/posts/freedom-is-not-chaos/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/freedom-is-not-chaos/</guid><description>How high functioning teams achieve freedom through deliberate constraints rather than the absence of structure</description></item><item><title>Goodhart&apos;s Law</title><link>https://www.underdog-blog.com/posts/goodharts-law/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/goodharts-law/</guid><description>When a measure becomes a target, it ceases to be a good measure</description></item><item><title>Head Metrics vs. Tail Metrics</title><link>https://www.underdog-blog.com/posts/head-metrics-vs-tail-metrics/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/head-metrics-vs-tail-metrics/</guid><description>Head metrics measure activity. Tail metrics measure outcomes. Only one resists Goodhart&apos;s Law.</description></item><item><title>The Hidden Cost of Agentic Development</title><link>https://www.underdog-blog.com/posts/hidden-cost-of-agentic-development/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/hidden-cost-of-agentic-development/</guid><description>Why AI code generation optimizes for the wrong variable and violates Constantine&apos;s equation about software economics</description></item><item><title>The Hidden Cost of Timezones</title><link>https://www.underdog-blog.com/posts/hidden-cost-timezones/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/hidden-cost-timezones/</guid><description>How distributed teams multiply Work In Progress through timezone blocking, and why Conway&apos;s Law suggests aligning work allocation with communication patterns</description></item><item><title>Idempotency</title><link>https://www.underdog-blog.com/posts/idempotency/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/idempotency/</guid><description>Why operations that produce the same result when repeated are essential for reliable distributed systems and fault-tolerant design</description></item><item><title>Immutability</title><link>https://www.underdog-blog.com/posts/immutability/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/immutability/</guid><description>Why objects that cannot be changed after creation lead to more predictable, debuggable, and thread-safe code</description></item><item><title>Imperative vs Declarative Paradigms</title><link>https://www.underdog-blog.com/posts/imperative-vs-declarative-paradigms/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/imperative-vs-declarative-paradigms/</guid><description>A practical guide to understanding and effectively using both imperative and declarative programming approaches</description></item><item><title>In Order To</title><link>https://www.underdog-blog.com/posts/in-order-to/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/in-order-to/</guid><description>How two simple words can reveal whether your team&apos;s practices are serving a purpose or just going through the motions</description></item><item><title>Interface Segregation Principle</title><link>https://www.underdog-blog.com/posts/interface-segregation-principle/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/interface-segregation-principle/</guid><description>How to design interfaces that are specific to their clients rather than general-purpose, preventing unnecessary dependencies.</description></item><item><title>Jevons Paradox and Software Engineering</title><link>https://www.underdog-blog.com/posts/jevons-paradox-and-software-engineering/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/jevons-paradox-and-software-engineering/</guid><description>Every efficiency gain in software&apos;s 70-year history has expanded the industry, not contracted it. AI follows the same pattern.</description></item><item><title>JSON Web Tokens</title><link>https://www.underdog-blog.com/posts/json-web-tokens/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/json-web-tokens/</guid><description>Understanding JWT structure, practical usage patterns, and critical security considerations for stateless authentication</description></item><item><title>Lauffer&apos;s Law</title><link>https://www.underdog-blog.com/posts/lauffers-law/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/lauffers-law/</guid><description>How commercial framing shapes software architecture: software systems reflect the commercial narrative that justified their creation</description></item><item><title>Law of Demeter</title><link>https://www.underdog-blog.com/posts/law-of-demeter/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/law-of-demeter/</guid><description>Reduce coupling by limiting object interactions to direct neighbors instead of reaching through multiple objects</description></item><item><title>Law of Diffusion</title><link>https://www.underdog-blog.com/posts/law-of-diffusion/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/law-of-diffusion/</guid><description>How innovations spread through organizations and why technical excellence alone doesn&apos;t guarantee adoption</description></item><item><title>Law of Triviality</title><link>https://www.underdog-blog.com/posts/law-of-triviality/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/law-of-triviality/</guid><description>Why teams spend more time debating trivial details than important decisions, and how to allocate attention more effectively</description></item><item><title>Lines of Code is a Bad Measurement</title><link>https://www.underdog-blog.com/posts/lines-of-code/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/lines-of-code/</guid><description>Why measuring productivity by lines of code is counterproductive and actively rewards what good engineering tries to eliminate</description></item><item><title>Liskov Substitution Principle</title><link>https://www.underdog-blog.com/posts/liskov-substitution-principle/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/liskov-substitution-principle/</guid><description>How to ensure your code works with any implementation of an interface or base type, not just the original one.</description></item><item><title>Little&apos;s Law</title><link>https://www.underdog-blog.com/posts/littles-law/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/littles-law/</guid><description>Mathematical foundation for understanding workflow: work in progress, throughput, and lead time are mathematically linked in every stable system</description></item><item><title>Locality of Behavior</title><link>https://www.underdog-blog.com/posts/locality-of-behavior/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/locality-of-behavior/</guid><description>Design for understanding: code behavior should be comprehensible by reading only that code, not multiple files or abstraction layers</description></item><item><title>London vs Detroit Testing Styles</title><link>https://www.underdog-blog.com/posts/london-vs-detroit-testing-styles/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/london-vs-detroit-testing-styles/</guid><description>Understanding the two fundamental philosophies that shape how you write, structure, and maintain your tests</description></item><item><title>Microservice Architecture</title><link>https://www.underdog-blog.com/posts/microservice-architecture/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/microservice-architecture/</guid><description>Why microservices solve team coordination problems, not technical problems, and why most organizations would be better served by monoliths</description></item><item><title>Never Nester</title><link>https://www.underdog-blog.com/posts/never-nester/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/never-nester/</guid><description>How avoiding deeply nested code structures reduces cognitive load and improves code readability</description></item><item><title>Why I Prefer One Week Sprints</title><link>https://www.underdog-blog.com/posts/one-week-sprints/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/one-week-sprints/</guid><description>How shorter sprint cycles with protected time and built in recovery enable sustainable velocity through reduced WIP</description></item><item><title>Open/Closed Principle</title><link>https://www.underdog-blog.com/posts/open-closed-principle/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/open-closed-principle/</guid><description>How to design software that is open for extension but closed for modification</description></item><item><title>The Value of Software is in Its Optionality</title><link>https://www.underdog-blog.com/posts/optionality/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/optionality/</guid><description>Why software&apos;s real value lies not in what it does today, but in what it allows you to do tomorrow when circumstances change</description></item><item><title>Pair Programming Is the Best Code Review</title><link>https://www.underdog-blog.com/posts/pair-programming-is-the-best-code-review/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/pair-programming-is-the-best-code-review/</guid><description>How pair programming achieves the theoretical minimum feedback cycle time by moving review into the implementation process itself</description></item><item><title>Pull Requests Make Code Worse</title><link>https://www.underdog-blog.com/posts/pull-requests-make-code-worse/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/pull-requests-make-code-worse/</guid><description>A critical examination of pull requests in private repositories and why pair programming might be a better alternative</description></item><item><title>The Purpose of Abstracting</title><link>https://www.underdog-blog.com/posts/purpose-of-abstracting/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/purpose-of-abstracting/</guid><description>Good abstractions create new semantic levels where you can be absolutely precise, not vague wrappers that leak implementation details.</description></item><item><title>Richardson Maturity Model</title><link>https://www.underdog-blog.com/posts/richardson-maturity-model/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/richardson-maturity-model/</guid><description>Understanding the spectrum between simple HTTP APIs and truly RESTful systems through Leonard Richardson&apos;s four-level maturity model</description></item><item><title>The Case for Shorter Feedback Cycles</title><link>https://www.underdog-blog.com/posts/shorter-feedback-cycles/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/shorter-feedback-cycles/</guid><description>Why multiple formal frameworks from control theory to learning science all converge on the same conclusion about rapid feedback</description></item><item><title>Single Responsibility Principle</title><link>https://www.underdog-blog.com/posts/single-responsibility-principle/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/single-responsibility-principle/</guid><description>Why SRP is about having one reason to change, not doing one thing</description></item><item><title>SOLID In TypeScript</title><link>https://www.underdog-blog.com/posts/solid-in-typescript/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/solid-in-typescript/</guid><description>Practical examples and implementations of SOLID principles using TypeScript, with clear before and after comparisons</description></item><item><title>Specifications VS Value</title><link>https://www.underdog-blog.com/posts/specifications-vs-value/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/specifications-vs-value/</guid><description>Contrasting waterfall&apos;s specification-focused approach with agile&apos;s value-driven development methodology</description></item><item><title>Separate Structural Changes from Behavior Changes</title><link>https://www.underdog-blog.com/posts/structural-changes-vs-behavior-changes/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/structural-changes-vs-behavior-changes/</guid><description>Every change is either reshaping the code or changing what it does. Mixing them together is one of the most common sources of unnecessary risk.</description></item><item><title>Tasks Are Promises, Not Requirements</title><link>https://www.underdog-blog.com/posts/tasks-are-promises-not-requirements/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/tasks-are-promises-not-requirements/</guid><description>Why lightweight kanban tickets enable agile adaptation while detailed upfront requirements create the same friction they replaced</description></item><item><title>Technical Debt</title><link>https://www.underdog-blog.com/posts/technical-debt/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/technical-debt/</guid><description>Understanding Ward Cunningham&apos;s technical debt metaphor and how to use it effectively in modern software development</description></item><item><title>Tell, Don&apos;t Ask</title><link>https://www.underdog-blog.com/posts/tell-dont-ask/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/tell-dont-ask/</guid><description>Understanding how to maintain proper encapsulation by telling objects what to do rather than asking for their data</description></item><item><title>Test Behavior, Not Implementation</title><link>https://www.underdog-blog.com/posts/test-behavior-not-implementation/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/test-behavior-not-implementation/</guid><description>Why tests coupled to implementation details prevent refactoring while behavior-focused tests enable confident change</description></item><item><title>The Calendar Crisis: How High WIP Creates a Meeting Trap That Destroys Throughput</title><link>https://www.underdog-blog.com/posts/the-calendar-crisis/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/the-calendar-crisis/</guid><description>Why everyone&apos;s calendars are impossibly full and how applying Theory of Constraints can break the meeting spiral by reducing Work-in-Progress</description></item><item><title>The Pursuit Of Predictable Projects</title><link>https://www.underdog-blog.com/posts/the-pursuit-of-predictable-projects/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/the-pursuit-of-predictable-projects/</guid><description>Exploring how work decomposition and continuous feedback can dramatically improve project estimation accuracy from 70% to 95%</description></item><item><title>Theory Of Constraints</title><link>https://www.underdog-blog.com/posts/theory-of-constraints/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/theory-of-constraints/</guid><description>Understanding why improving anything other than your system&apos;s single constraint produces no improvement at all</description></item><item><title>Trunk-Based Development: The Path to Continuous Delivery</title><link>https://www.underdog-blog.com/posts/trunk-based-development/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/trunk-based-development/</guid><description>A data-driven exploration of why elite software teams are 160% more likely to practice trunk-based development and how it enables continuous delivery</description></item><item><title>Ubiquitous Language</title><link>https://www.underdog-blog.com/posts/ubiquitous-language/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/ubiquitous-language/</guid><description>How establishing a shared vocabulary between business and development teams eliminates translation overhead and improves software quality</description></item><item><title>Unplanned Work</title><link>https://www.underdog-blog.com/posts/unplanned-work/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/unplanned-work/</guid><description>How to identify, track, and systematically reduce unplanned work that disrupts sprint goals and team productivity</description></item><item><title>Verbs Over Nouns</title><link>https://www.underdog-blog.com/posts/verbs-over-nouns/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/verbs-over-nouns/</guid><description>How organizing code around behaviors instead of objects creates more maintainable systems and better aligns with business thinking</description></item><item><title>The Walking Skeleton</title><link>https://www.underdog-blog.com/posts/walking-skeleton/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/walking-skeleton/</guid><description>Using end-to-end integration to unlock parallel development and reduce work-in-progress</description></item><item><title>You Are Always Wrong</title><link>https://www.underdog-blog.com/posts/you-are-always-wrong-concept/</link><guid isPermaLink="true">https://www.underdog-blog.com/posts/you-are-always-wrong-concept/</guid><description>Why assuming code will need to change leads to better software design and how to prepare for inevitable requirements changes</description></item></channel></rss>