Software development is a young profession, and we are still learning the techniques and building the tools to do it effectively. I've been involved in this activity for over three decades and in the last two I've been writing on this website about patterns and practices that make it easier to build useful software. The site began as a place to put my own writing, but I also use it to publish articles by my colleagues.

In 2000, I joined Thoughtworks, where my role is to learn about the techniques that we've learned to deliver software for our clients, and pass these techniques on to the wider software industry. As this site has developed into a respected platform on software development, I've edited and published articles by my colleagues, both ThoughtWorkers and others, to help useful writing reach a wider audience.

photo of Martin Fowler

photo: Christopher Ferguson

Martin Fowler

A website on building software effectively

If there's a theme that runs through my work and writing on this site, it's the interplay between the shift towards agile thinking and the technical patterns and practices that make agile software development practical. While specifics of technology change rapidly in our profession, fundamental practices and patterns are more stable. So writing about these allows me to have articles on this site that are several years old but still as relevant as when they were written.

As software becomes more critical to modern business, software needs to be able to react quickly to changes, allowing new features to be be conceived, developed and put into production rapidly. The techniques of agile software development began in the 1990s and became steadily more popular in the last decade. They focus on a flexible approach to planning, which allows software products to change direction as the users' needs change and as product managers learn more about how to make their users effective. While widely accepted now, agile approaches are not easy, requiring significant skills for a team, but more importantly a culture of open collaboration both within the team and with a team's partners.

This need to respond fluently to changes has an important impact upon the architecture of a software system. The software needs to be built in such a way that it is able to adapt to unexpected changes in features. One of the most important ways to do this is to write clear code, making it easy to understand what the program is supposed to do. This code should be divided into modules which allow developers to understand only the parts of the system they need to make a change. This production code should be supported with automated tests that can detect any errors made when making a change while providing examples of how internal structures are used. Large and complex software efforts may find the microservices architectural style helps teams deploy software with less entangling dependencies.

Creating software that has a good architecture isn't something that can be done first time. Like good prose, it needs regular revisions as programmers learn more about what the product needs to do and how best to design the product to achieve its goals. Refactoring is an essential technique to allow a program to be changed safely. It consists of making small changes that don't alter the observable behavior of the software. By combining lots of small changes, developers can revise the software's structure supporting significant modifications that weren't planned when the system was first conceived.

Software that runs only on a developer's machine isn't providing value to the customers of the software. Traditionally releasing software has been a long and complicated process, one that hinders the need to evolve software quickly. Continuous Delivery uses automation and collaborative workflows to remove this bottleneck, allowing teams to release software as often as the customers demand. For Continuous Delivery to be possible, we need to build in a solid foundation of Testing, with a range of automated tests that can give us confidence that our changes haven't introduced any bugs. This leads us to integrate testing into programming, which can act to improve our architecture.

Photostream

Cape Cod, MA (2017)

Data Management

There are many kinds of software out there, the kind I'm primarily engaged is Enterprise Applications. One of the enduring problems we need to tackle in this world is data management. The aspects of data managment I've focused on here are how to migrate data stores as their applications respond to changing needs, coping with different contexts across a large enterprise, the role of NoSQL databases, and the broader issues of coping with data that is both Big and Messy.

Domain-Specific Languages

A common problem in complex software systems is how to capture complicated domain logic in a way that programmers can both easily manipulate and also easily communicate to domain experts. Domain-Specific Languages (DSLs) create a custom language for a particular problem, either with custom parsers or by conventions within a host language.

Books

I've written seven books on software development, including Refactoring, Patterns of Enterprise Application Architecture, and UML Distilled. I'm also the editor of a signature series for Addison-Wesley that includes five jolt award winners.

My Books Page...

Conference Talks

I'm often asked to give talks at conferences, from which I've inferred that I'm a pretty good speaker - which is ironic since I really hate giving talks. You can form your own opinion of my talks by watching videos of some my conference talks.

My Videos Page...

Board Games

I've long been a fan of board games, I enjoy a game that fully occupies my mind, clearing out all the serious thoughts for a bit, while enjoying the company of good friends. Modern board games saw dramatic improvement in the 1990's with the rise of Eurogames, and I expect many people would be surprised if they haven't tried any of this new generation. I also appear regularly on Heavy Cardboard.

My Board Games page...

Tags

API design · Generative AI · agile · agile adoption · analysis patterns · application architecture · application integration · bad things · board games · build scripting · certification · collaboration · computer history · conference panels · conferences · continuous delivery · covid-19 · data analytics · database · design · dictionary · distributed computing magazine · diversions · diversity · documentation · domain driven design · domain specific language · domestic · encapsulation · enterprise architecture · estimation · event architectures · evolutionary design · experience reports · expositional architectures · extreme programming · front-end · gadgets · ieeeSoftware · infodecks · internet culture · interviews · language feature · language workbench · lean · legacy rehab · legal · metrics · microservices · mobile · noSQL · object collaboration design · parser generators · photography · platforms · podcast · popular · presentation technique · privacy · process theory · productivity · programming environments · programming style · project planning · recruiting · refactoring · refactoring boundary · requirements analysis · ruby · security · talk videos · team environment · team organization · technical debt · technical leadership · test categories · testing · thoughtworks · tools · travel · uml · version control · web development · web services · website · writing

2023 · 2022 · 2021 · 2020 · 2019 · 2018 · 2017 · 2016 · 2015 · 2014 · 2013 · 2012 · 2011 · 2010 · 2009 · 2008 · 2007 · 2006 · 2005 · 2004 · 2003 · 2002 · 2001 · 2000 · 1999 · 1998 · 1997 · 1996

All Content

Recent Changes

If you'd like to be notified when I post new material, subcribe to my RSS, Twitter, or Mastodon feeds. I also have a page dedicated to recent changes.


TDD with GitHub Copilot

Thu 17 Aug 2023 14:44 EDT

At Thoughtworks, we are strong practitioners of Test Driven Development (TDD). Naturally this leads to the question of how generative AI can help with this technique. Paul Sobocinski writes a brief memo explaining how some of our teams have used TDD with GitHub Copilot. As ever, co-pilot can't be relied on to fly the plane, but can suggest some useful ideas for the red and green steps. It isn't very helpful for the all-important refactoring step.

more…


We will miss Stefan Tilkov

Mon 14 Aug 2023 14:58 EDT

We are saddened today to learn of the passing of Stefan Tilkov. We’ve met Stefan several times at workshops and conferences and always enjoyed his good company and insightful views. He advocated many of the things that we and our colleagues support - and as well as skillfully explaining these ideas, he also backed them up with concrete experience from his work. We shall really miss his wise contributions online, and regret that we won’t get the chance to chat with him again. We offer our condolences to his family, friends, and colleagues at INNOQ.

more...


Creating an integrated business and technology strategy

Tue 08 Aug 2023 16:05

My colleague Sarah Taraporewalla describes an approach to building technology strategy that challenges the convention. It starts by identifying the overall strategic directions that the organization is considering, and using common aspects of these directions to indicate the investigations needed for the organization to understand the technology implications raised by that strategic change. This first installment looks at two of these directions: expanding the business by creating complementary products, and expanding the business into new markets and regions.

more…


Bottlenecks of Scaleups: Cost Efficiency

Mon 31 Jul 2023 09:30 EDT

As startups begin to grow rapidly, they often find that early decisions that helped them find a product/market fit lead to excessive costs once traffic increases. These costs can threaten a scaleup's ability to grow. Sofia Tania and Stefania Stefansdottir have worked with many scaleups in this predicament and share their approach to understanding and reducing these costs.

more…


Exploring Gen AI - The toolchain

Wed 26 Jul 2023 10:52 EDT

My colleague Birgitta Böckeler has long been one of our senior technology leaders in Germany. She's now moved into a new role coordinating our work with Generative AI and its effect of software delivery practices. She's decided to publish her exploration in a series of memos. The first memo looks at the current toolchain for LLMs, categorizing them by what tasks they help with, how we interact with the LLM, and where they come from.

more…


Bliki: TeamTopologies

Tue 25 Jul 2023 09:25 EDT

Any large software effort, such as the software estate for a large company, requires a lot of people - and whenever you have a lot of people you have to figure out how to divide them into effective teams. Forming Business Capability Centric teams helps software efforts to be responsive to customers’ needs, but the range of skills required often overwhelms such teams. Team Topologies is a model for describing the organization of software development teams, developed by Matthew Skelton and Manuel Pais. It defines four forms of teams and three modes of team interactions. The model encourages healthy interactions that allow business-capability centric teams to flourish in their task of providing a steady flow of valuable software.

more ...


Bliki: TwoPizzaTeam

Tue 25 Jul 2023 09:22 EDT

A two-pizza team is a small team that fully supports software for a particular business capability. The term became popular as it used to describe how Amazon organized their software staff.

more ...


How platform teams get stuff done

Wed 19 Jul 2023 10:21 EDT

Platform teams have a unique reliance on other teams to ensure adoption of their platform - getting code changes into other teams' codebase is critical to their success. Pete Hodgson structures how platform teams collaborate into phases of migration, consumption, and evolution. He describes what's different in each of these phases, the operating models to adopt, and which cross-team collaboration patterns work best.

more…