My name is Martin Fowler: I’m an author, speaker, and loud-mouth on the design of enterprise software. This site is dedicated to improving the profession of software development, with a focus on skills and techniques that will last a developer for most of their career. I’m the editor of the site and the most prolific writer. It was originally just my personal site, but over the last few years many colleagues have written excellent material that I’ve been happy to host here. I work for ThoughtWorks, a really rather good software delivery and consulting company. To find your way around this site, go to the intro guide.

News and Updates

My atom feed (RSS) announces any updates to this site, as well as various news about my activities and other things I think you may be interested in. I also make regular announcements via my twitter feed, which I copy to my facebook page.

photostream 108

Sun 23 Apr 2017 10:16 EDT

Alex Knob Trail, Franz-Josef Glacier, New Zealand

Viticulture and The Gallerist

Sun 16 Apr 2017 07:08 EDT

In latter half of last year, I bought two board games: Viticulture and The Gallerist. I've enjoyed them both, and have been struck by their similarities. Enough to inspire me to write this note comparing the two of them. They both have a strong theme of running a business with a primary production path, but differ in randomness and weight.


Build the MVP Canvas

Wed 05 Apr 2017 09:03 EDT

Paulo Caroli completes the Lean Inception by summarizing all the knowledge gained during the week into the MVP Canvas. As well as summarizing the user-centered work from earlier on, this includes looking at the business case and how progress will be measured.


QA in Production

Tue 04 Apr 2017 09:07 EDT

Traditionally, QA focuses on testing the software before release into production to see if it's ready for such release. But Rouan Wilsenach points out that, increasingly, modern QA organizations are also focusing attention onto the software running in production. By analyzing logs and other monitoring tools, they find quality problems to highlight to the development organization. This approach works particularly well with organizations that use continuous delivery to put new versions of the software into production rapidly and reliably.


One Line of Code that Compromises Your Server (Part 2)

Mon 03 Apr 2017 09:11 EDT

Now Jack has the session key, he moves on to show how he can use it to gain administrative rights on the application, and further to get a shell on the server itself. He wraps up with some advice on how to prevent these kinds of attacks.


photostream 107

Sat 01 Apr 2017 10:45 EDT

Lake Matheson, New Zealand

One Line of Code that Compromises Your Server

Thu 30 Mar 2017 09:22 EDT

Forgive the click-bait title, but Jack Singleton really is talking about how one line in a web-application configuration can hand the keys of a server out to an attacker. The line of code in question sets the key for signing and encrypting cookies. In this first installment, Jack shows how it's surprisingly easy to crack a poorly chosen key for this purpose, which is the first step that will lead him to a shell on the server.


Sequence the Features

Wed 29 Mar 2017 09:30 EDT

Now the Lean Inception has a list of features put in the context of the user journeys. On Thursday afternoon Paulo leads the team to use this information to sequence these features into several iterations of an MVP.



Refactoring has become a core skill for software developers, it is the foundation behind evolutionary architecture and modern agile software development. I wrote the original book on refactoring in 2000, and it continues to be an interest of mine.

I’ve recently posted several essays on refactoring here:

  • JavaScript offers many targets for refactoring, so Refactoring a JavaScript Video Store takes the original video store example from the book and explores it in JavaScript. It outlines four directions you can take the refactoring: a nested function with a dispatcher, using classes, and transformation using an intermediate data structure.
  • While most of our logic is written directly in an imperative language, it is sometimes very useful to represent such logic in a data structure. Refactoring to an Adaptive Model describes this refactoring, which produces an adaptive model interpreted by generic code.
  • As a program grows in size it’s important to split it into modules, so that you don’t need to understand all of it to make a small modification. In Refactoring Module Dependencies I modularize a small example using layering and introducing Service Locator and Dependency Injection. I illustrate these using both Java and JavaScript so you can see how this modularization looks in different languages.
  • When I write code that deals with external services, I find it valuable to separate that access code into separate objects. Refactoring code that accesses external services shows how I would refactor some congealed code into a common pattern for this.
  • Modern languages give us the opportunity go beyond the loop as a way of handling repetitive behavior. Refactoring with Loops and Collection Pipelines provides a series of small examples of refactoring loops into my preferred approach.
  • Refactoring Code to Load a Document looks at how manipulating large JSON documents can often be made easier by encapsulating a combination of loading strategies.

TW logo

I discovered ThoughtWorks in 2000: then a small American company whose philosphy of software development was remarkably similar to my own. Now we’ve grown to around 4000 people world-wide, but kept the values that make us special. My colleagues have built critical systems for many clients in that time, and I’ve learned many lessons from them. While doing this, we found we often didn’t have the tools we needed, so we started to build them. This led to open-source tools such as CruiseControl, Selenium, Frank, and Moco as well as commercial products.

I have many opportunities, but I’ve stayed at ThoughtWorks because of the quality of my colleagues, who include both well-known speakers and those who may not be famous names but do an excellent job of software delivery (and feed me the information to write about). We are inspired by working with each other and our unusual three-pillar philosophy that raises professional excellence and social justice to the same level as financial performance.

And we are always looking for more great people to join our curious company. Maybe I’ll see you in one of our offices some day.

Continuous Integration and Delivery

For a long time I’ve been a champion of Continuous Integration which reduces integration risk by integrating early and often, an application of the principle of Frequency Reduces Difficulty. We’ve found CI to be a core technique at ThoughtWorks and use it almost all the time. At the heart of this is a style of development that minimizes long feature branches with techniques like Branch By Abstraction and Feature Toggles.

While this is useful, there was still risk present from software that works in the development environment to getting it to work in production. As a result we developed Deployment Pipelines to reduce this risk, moving closer to our aim of Continuous Delivery: building software in such a way that we confidently deploy the latest builds into production whenever there is a business need. We find this improves feedback, reduces risk, and increases the visibility of project progress.

For more information: take a look at my guide page on Continuous Delivery.

photo: Manuel Gomez Dardenne

Upcoming Talks
1-2goto: Chicago


API design · academia · agile · agile adoption · analysis patterns · application architecture · application integration · bad things · big data · build scripting · certification · clean code · collaboration · computer history · conference panels · conferences · continuous delivery · 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 · expositional architectures · extreme programming · gadgets · ieeeSoftware · infodecks · internet culture · interviews · language feature · languageWorkbench · lean · legacy rehab · legal · metrics · microservices · microsoft · mobile · model-view-controller · noSQL · object collaboration design · parser generators · photography · podcast · popular · presentations · privacy · process theory · productivity · programming platforms · project planning · projects · recruiting · refactoring · refactoring boundary · requirements analysis · retrospective · ruby · scrum · security · software craftsmanship · 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

2017 · 2016 · 2015 · 2014 · 2013 · 2012 · 2011 · 2010 · 2009 · 2008 · 2007 · 2006 · 2005 · 2004 · 2003 · 2002 · 2001 · 2000 · 1999 · 1998 · 1997 · 1996

All Content