Home/Martin Fowler
Source

Martin Fowler

186 articles from Martin Fowler.

AI & ML — Making Your Data Ready for Agentic AI

Making Your Data Ready for Agentic AI

For thirty years we built data systems for human analysts, who supply the context, judgment, and skepticism to work around data that's incomplete or wrong. Autonomous agents supply none of that. They act on whatever they're handed, confidently. For data to be AI-ready we need to build a series of layers: a data foundation that makes data trusted, a context layer to apply proper meaning, and an acc

PSPramod Sadalage and Prem Chandrasekaran·August 27, 2026AI & ML
Career & Teams — Practitioner Voice

Practitioner Voice

Effective writing from a practitioner is a style distinct from academic writing or thought-leadership content. It relies on authority from experience (not credentials), naming tensions but letting them live, keeping the author in the writing, and the expectation that readers recognize the pattern from their own experience.

JHJim Highsmith·August 19, 2026Career & Teams
AI & ML — The Archaeologist’s Copilot

The Archaeologist’s Copilot

This article explains the approach I used to modernize a Java 1.5 codebase that no longer built reliably on modern machines. My early use of LLMs gave me plausible answers that did not hold up in the codebase. Progress came when I grounded the process in evidence, using AI to support analysis, validation in a stable Docker environment, and gradual refactoring protected by tests. The main takeaway

NMNik Malykhin·July 16, 2026AI & ML
Performance — The Orchestrator's Tax

The Orchestrator's Tax

Subagents get justified by time saved and parallel execution, but that's not what matters most in long-running multi-agent work. Every token in the orchestrator's context is competing for its attention, and the real value of a subagent is what it keeps out of that context, not how fast it runs. I argue that subagents should be treated as a tool for protecting the orchestrator's working memory, off

RGRahul Garg·July 16, 2026Performance
Performance — DSLs Enable Reliable Use of LLMs

DSLs Enable Reliable Use of LLMs

LLMs generate code incredibly fast, but to ensure they generate exactly what is intended, they need clear boundaries. Abstractions and Domain-Specific Languages (DSLs) provide a strong harness that guides LLMs right from the start. The example of Tickloom - a domain model and DSL for illustrating distributed system behavior - shows how we can use an LLM as a partner to iteratively build a DSL and

UJUnmesh Joshi·July 14, 2026Performance
Databases — Building Reliable Agentic AI Systems

Building Reliable Agentic AI Systems

This paper presents the Preclinical Information Center (PRINCE), a cloud-hosted platform developed by Bayer AG with Thoughtworks to address pharmaceutical industry challenges in drug development. PRINCE leverages Agentic Retrieval-Augmented Generation and Text-to-SQL to integrate decades of safety study reports. We describe PRINCE's evolution from keyword-based search to an intelligent research as

SSSarang Sanjay Kulkarni·June 16, 2026Databases
Security — The VibeSec Reckoning

The VibeSec Reckoning

“Vibe coding” - the practice of non-technical citizen builders using generative AI tools to rapidly develop applications, this has significantly accelerated software prototyping. However, because AI agents naturally prioritise the path of least resistance, they frequently recommend insecure configurations, creating systemic security exposure across industries. To combat this we need to write a sec

MFMartin Fowler·May 27, 2026Security
Engineering — Maintainability sensors for coding agents

Maintainability sensors for coding agents

In a recent article about harness engineering for coding agent users, I laid out a mental model for expanding a coding agent harness: a system of guides and sensors that increase the probability of good agent outputs and enable self-correction before issues reach human eyes. This article is a more practical follow-up where I walk through my experience with using sensors that help keep the codebase

BBBirgitta Böckeler·May 27, 2026Engineering
Engineering — What Is Code?

What Is Code?

Code has two distinct but intertwined purposes. It is a set of instructions for a machine, and it is also a conceptual model of the problem domain. A well designed codebase is a representation of the vocabulary of a domain. These abstractions reveal themselves only as developers build the software. Programming languages act as thinking tools, enabling the construction of a conceptual model that su

UJUnmesh Joshi·May 12, 2026Engineering
AI & ML — Structured-Prompt-Driven Development (SPDD)

Structured-Prompt-Driven Development (SPDD)

LLM programming assistants have demonstrated considerable value, but mostly with individual developers. The internal IT organization in Thoughtworks has been using them for their teams and have developed a method and workflow called Structured Prompt-Driven Development (SPDD). The article describes a simple example of this workflow with details in github. This workflow treats the prompts as a firs

WZWei Zhang and Jessie Jie Xia·April 28, 2026AI & ML
AI & ML — Patterns for Reducing Friction in AI-Assisted Development

Patterns for Reducing Friction in AI-Assisted Development

The practices that make human pair programming effective—onboarding, structured design discussion, shared standards—apply equally to working with AI coding assistants. I propose five patterns that bring this collaborative scaffolding to AI-assisted development, shifting the experience from correcting a tool to collaborating with a capable teammate.

RGRahul Garg·April 8, 2026AI & ML
Performance — Principles of Mechanical Sympathy

Principles of Mechanical Sympathy

Modern hardware is remarkably fast, but software often fails to leverage it. Mechanical sympathy - a concept borrowed from racing and popularized in software by Martin Thompson - is the practice of creating software that is sympathetic to its underlying hardware. This practice can be distilled into a set of everyday principles: Predictable memory access, awareness of cache lines, the single-writer

CSCaer Sanders·April 7, 2026Performance
AI & ML — Harness engineering for coding agent users

Harness engineering for coding agent users

To let coding agents work with less supervision, we need ways to increase our confidence in their result. As software engineers, we have a natural trust barrier with AI-generated code - LLMs are non-deterministic, they don't know our context, and they don't really understand the code, they think in tokens. This article explores a mental model that brings together emerging concepts from context and

BBBirgitta Böckeler·April 2, 2026AI & ML
Engineering — Ideological Resistance to Patents, Followed by Reluctant Pragmatism

Ideological Resistance to Patents, Followed by Reluctant Pragmatism

This article reflects on an ideological discomfort with software patents, a direct experience of patent aggression in the software industry, and the practical constraints faced by startups. It argues that while the patent system remains deeply flawed, defensive patenting can function as a shield in an asymmetric legal environment, especially for open-source innovators.

NJNaresh Jain·March 5, 2026Engineering
Architecture — Conversation: LLMs and the what/how loop

Conversation: LLMs and the what/how loop

A conversation between Unmesh, Rebecca, and Martin on how LLMs help us shape the abstractions in our software. We view our challenge as building systems that survive change, requiring us to manage our cognitive load. We can do this by mapping the “what” of we want our software to do into the “how” of programming languages. This “what” and “how” are built up in a feedback loop. TDD helps us operati

UJUnmesh Joshi, Rebecca Parsons, and Martin Fowler·January 21, 2026Architecture
Security — Stop Picking Sides

Stop Picking Sides

Many teams have turned into tribes wedded to exclusively adaptation or optimization. But this misses the point that both of these are important, and we need to manage the tension between them. We can do this by thinking of two operating modes: explore (adaptation-dominant) and exploit (optimization dominant). We tailor a team's operating model to a particular blend of the two - considering uncerta

JHJim Highsmith·January 13, 2026Security
Engineering — The Learning Loop and LLMs

The Learning Loop and LLMs

LLMs are useful because they lower the threshold for experimentation. But we have to beware that we don't use them to try to shortcut the learning loop that's an essential part of a software developer's practice. We have seen this problem with tools like low-code platforms, they provide a rapid burst of initial development, but we cannot sustain them because they undermine the learning required fo

UJUnmesh Joshi·November 4, 2025Engineering
Security — Agentic AI and Security

Agentic AI and Security

Agentic AI systems present unique security challenges. The fundamental security weakness of LLMs is that there is no rigorous way to separate instructions from data, so anything they read is potentially an instruction. This leads to the “Lethal Trifecta”: sensitive data, untrusted content, and external communication - the risk that the LLM will read hidden instructions that leak sensitive data to

KSKorny Sietsma·October 28, 2025Security
AI & ML — From Black Box to Blueprint

From Black Box to Blueprint

A common enterprise problem: crucial legacy systems become “black boxes”—key to operations but opaque and risky to touch. We worked with a client to use AI-assisted reverse engineering to reconstruct functional specifications from UI elements, binaries, and data lineage to overcome analysis paralysis. We developed a methodical “multi-lens” approach—starting from visible artifacts, enriching increm

TPThiyagu Palanisamy and Chandirasekar Thiagarajan·August 28, 2025AI & ML
AI & ML — Some thoughts on LLMs and Software Development

Some thoughts on LLMs and Software Development

I’m about to head away from looking after this site for a few weeks (part vacation, part work stuff). As I contemplate some weeks away from the daily routine, I feel an urge to share some scattered thoughts about the state of LLMs and AI.

MFMartin Fowler·August 28, 2025AI & ML
Frontend — Research, Review, Rebuild

Research, Review, Rebuild

The Bahmni open-source hospital management system started over nine years ago with a front end using AngularJS and an OpenMRS REST API. We wished to convert this to use a React + TypeScript front end with an HL7 FHIR API. In exploring how to do this modernization we used a structured prompting workflow of Research, Review, and Rebuild - together with Cline, Claude 3.5 Sonnet, Atlassian MCP server,

RRRahul Ramesh·August 27, 2025Frontend
AI & ML — Building your own CLI Coding Agent with Pydantic-AI

Building your own CLI Coding Agent with Pydantic-AI

CLI coding agents are a fundamentally different tool to chatbots or autocomplete tools - they're agents that can read code, run tests, and update a codebase. While commercial tools are impressive, they don't understand the particular context of our environment and the eccentricities of our specific project. Instead we can build our own coding agent by assembling open source tools, using our specif

BOBen O'Mahony·August 27, 2025AI & ML
AI & ML — Conversation: LLMs and Building Abstractions

Conversation: LLMs and Building Abstractions

Unmesh and Martin exchanged some emails about building abstractions while working with an LLM. They talk about the influence of Brooks's framing of essential and accidental complexity, and how this carries over to thinking of programming as both growing and applying abstractions. An LLM is useful in both modes of working, but has to be used differently. We can't reduce growing abstractions to a st

UJUnmesh Joshi and Martin Fowler·August 26, 2025AI & ML
Career & Teams — Team OKRs in Action

Team OKRs in Action

OKRs have become a popular way to connect strategy with execution in large organizations. But when they are set in a top‑down cascade, they often lose their meaning. Teams receive objectives they didn’t help create, and the result is weak commitment and little real change. High‑performing teams work in another way. They define their own objectives in an organization that uses a collaborative proce

PCPaulo Caroli·August 13, 2025Career & Teams
Networking — The Reformist CTO’s Guide to Impact Intelligence

The Reformist CTO’s Guide to Impact Intelligence

The productivity of knowledge workers is hard to quantify and often decoupled from direct business outcomes. The lack of understanding leads to many initiatives, bloated tech spend, and ill-chosen efforts to improve this productivity. Technology leaders need to avoid this by developing an intelligence of the business impact of their work across a network connecting output to proximate and downstre

SNSriram Narayan·August 12, 2025Networking
AI & ML — How far can we push AI autonomy in code generation?

How far can we push AI autonomy in code generation?

We ran a series of experiments to explore how far Generative AI can currently be pushed toward autonomously developing high-quality, up-to-date software without human intervention. As a test case, we created an agentic workflow to build a simple Spring Boot application end to end. We found that the workflow could ultimately generate these simple applications, but still observed significant issues

BBBirgitta Böckeler·August 5, 2025AI & ML
AI & ML — Who is LLM?

Who is LLM?

Is an LLM a stubborn donkey, a genie, a slot machine, or Uriah Heep?

MFMartin Fowler·July 22, 2025AI & ML
Engineering — Expert Generalists

Expert Generalists

As computer systems get more sophisticated we've seen a growing trend to value deep specialists. But we've found that our most effective colleagues have a skill in spanning many specialties. We are thus starting to explicitly recognize this as a first-class skill of “Expert Generalist”. We can identify the key characteristics of people with this skill - and thus recruit and promote based on it. We

UJUnmesh Joshi, Gitanjali Venkatraman, and Martin Fowler·July 2, 2025Engineering
Engineering — The DeepSeek Series: A Technical Overview

The DeepSeek Series: A Technical Overview

The appearance of DeepSeek Large-Language Models has caused a lot of discussion and angst since their latest versions appeared at the beginning of 2025. But much of the value of DeepSeek's work comes from the papers they have published over the last year. This article provides an overview of these papers, highlighting three main arcs in this research: a focus on improving cost and memory efficienc

SMShayan Mohanty·June 18, 2025Engineering
Security — Threat Modeling Guide for Software Teams

Threat Modeling Guide for Software Teams

Threat modeling is a systems engineering practice where teams examine how data flows through systems to identify what can go wrong - a deceptively simple act that reveals security risks that automated tools cannot anticipate. Rather than conducting security analysis as a separate or upfront activity, teams should integrate threat modeling into their development process through small, regular activ

GMGayathri Mohan and Jim Gumbley·May 20, 2025Security
AI & ML — Function calling using LLMs

Function calling using LLMs

While LLMs excel at generating cogent text based on their training data, they may also need to interact with external systems. Function calling allows them to construct such calls. The LLM does not execute these calls directly, instead it creates a data structure that describes the call, passing that to a separate program for execution and further processing. The LLM's prompt includes details abou

KPKiran Prakash·May 6, 2025AI & ML
AI & ML — Emerging Patterns in Building GenAI Products

Emerging Patterns in Building GenAI Products

As we move software products using generative AI technology from proof-of-concepts into production systems, we are uncovering a range of common patterns. Evals play a central role in ensuring that these non-deterministic systems are operating within sensible boundaries. Large Language Models need enhancement to provide information beyond a generic and static training set. Most of the time we can d

BSBharani Subramaniam and Martin Fowler·February 25, 2025AI & ML
Distributed — Refactoring with Codemods to Automate API Changes

Refactoring with Codemods to Automate API Changes

Refactoring is something developers do all the time—making code easier to understand, maintain, and extend. While IDEs can handle simple refactorings with just a few keystrokes, things get tricky when you need to apply changes across large or distributed codebases, especially those you don’t fully control. That’s where codemods come in. By using Abstract Syntax Trees (AST), codemods allow you to a

JQJuntao QIU | 邱俊涛·January 22, 2025Distributed
Performance — Design Token-Based UI Architecture

Design Token-Based UI Architecture

Design tokens are design decisions as data and serve as a single source of truth for design and engineering. Utilizing deployment pipelines, they enable automated code generation across platforms, allowing for faster updates and improved consistency in design. Organizing tokens in layers—progressing from available options to tokens that capture how they are applied—ensures scalability and a better

AKAndreas Kutschmann·December 12, 2024Performance
Engineering — Designing data products

Designing data products

Working backwards from the end goal is a core principle of software development, and we’ve found it to be highly effective in modelling data products. In this article we'll explore a step-by-step, methodical approach to identifying data products that avoids overdesign while providing just enough clarity for teams to begin implementation. Starting with a use case, we work backward to define data pr

KPKiran Prakash·December 10, 2024Engineering
Architecture — Using the Strangler Fig with Mobile Apps

Using the Strangler Fig with Mobile Apps

Incremental replacement of a legacy mobile application is a challenging concept to articulate and execute. However, we believe by making the investment in the pre-requisites of legacy modernization, it is posible to yield benefits in the long term. This article explores the Strangler Fig pattern and how it can be applied to mobile applications. We chart the journey of an enterprise who refused to

MFMatthew Foster and John Mikel Amiel Regida·November 5, 2024Architecture
Engineering — Legacy Modernization meets GenAI

Legacy Modernization meets GenAI

So far, most attention to Generative Artificial Intelligence (GenAI) in software development is on generating code. But we believe there is as much, if not more, value in understanding existing code - particularly long-lived, large, and complex legacy systems. We have been experimenting with GenAI for modernization with our clients, embodied in a tool called CodeConcise, which combines a Large Lan

AFAlessio Ferri, Tom Coggrave, and Shodhan Sheth·September 24, 2024Engineering
Distributed — Governing data products using fitness functions

Governing data products using fitness functions

Decentralized data management requires automation to scale governance effectively. Fitness functions are a powerful automated governance technique we've applied to data products within the context of a Data Mesh. Since data products serve as the foundational building blocks (architectural quanta) of a data mesh, ensuring robust governance around them significantly increases the chances of a succes

KPKiran Prakash·September 5, 2024Distributed
Frontend — Test-Driving HTML Templates

Test-Driving HTML Templates

When building a server-side rendered web application, it is valuable to test the HTML that's generated through templates. While these can be tested through end-to-end tests running in the browser, such tests are slow and more work to maintain than unit tests. Unit tests, written in the server-side environment, can check for valid HTML, and extract elements with CSS selectors to test the details of

MVMatteo Vaccari·June 5, 2024Frontend
Engineering — Data Fetching Patterns in Single-Page Applications

Data Fetching Patterns in Single-Page Applications

When a single-page application needs to fetch data from a remote source, it needs to do so while remaining responsive and providing feedback to the user during an often slow query. Five patterns help with this. Asynchronous State Handler wraps these queries with meta-queries for the state of the query. Parallel Data Fetching minimizes wait time. Fallback Markup specifies fallback displays in marku

JQJuntao QIU | 邱俊涛·May 29, 2024Engineering