Home Blog Articles Books About Me Contact Me ThoughtWorks

Martin Fowler: Articles

Popular

Some articles keep showing up as regular choices for visitors. So I thought I'd put them first in case you're looking for them, or if not to see what counts as popular around here.

The New Methodology
In the past few years there's been a rapidly growing interest in agile (aka "lightweight") methodologies. Alternatively characterized as an antidote to bureaucracy or a license to hack they've stirred up interest all over the software landscape. In this essay I explore the reasons for agile methods, focusing not so much on their weight but on their adaptive nature and their people-first orientation. I also give a summary and references to the processes in this school and consider the factors that should influence your choice of whether to go down this newly trodden path.
Latest Significant Version: April 2003
Is Design Dead?
For many that come briefly into contact with Extreme Programming, it seems that XP calls for the death of software design. Not just is much design activity ridiculed as "Big Up Front Design", but such design techniques as the UML, flexible frameworks, and even patterns are de-emphasized or downright ignored. In fact XP involves a lot of design, but does it in a different way than established software processes. XP has rejuvenated the notion of evolutionary design with practices that allow evolution to become a viable design strategy. It also provides new challenges and skills as designers need to learn how to do a simple design, how to use refactoring to keep a design clean, and how to use patterns in an evolutionary style.
Latest Significant Version: February 2001
Continuous Integration (with Matt Foemmel)
An important part of any software development process is getting reliable builds of the software. Despite it's importance, we are often surprised when this isn't done. Here we discuss the process that Matt has put into place on a major project at ThoughtWorks, a process that is increasingly used throughout the company. It stresses a fully automated and reproducible build, including testing, that runs many times a day. This allows each developer to integrate daily thus reducing integration problems. Japanese Translation

Enterprise Application Architecture

For most of my career I've specialized in enterprise application work. Enterprise applications have their own particular challanges and techniques that work with them. These articles explore some of the patterns, principles and practices that I've uncovered in this work.

Developing Patterns of Enterprise Software
A short page on the growing community and body of work in capturing patterns for the development of enterprise applications.
Latest Significant Version: May 2003
Errant Architectures
Software Development magazine adapted chapter 7 (Distribution Strategies) of my book Patterns of Enterprise Application Architecture as an article in their magazine. I suspect they liked it due to its tone and the inclusion of the First Law of Distributed Object Design. (Registration required with CMP)
Domain Logic and SQL
Over the last couple of decades we've seen a growing gap between database-oriented software developers and in-memory application software developers. This leads to many disputes about how to use database features such as SQL and stored procedures. In this article I look at the question of whether to place business logic in SQL queries or in-memory code, considering primarily performance and maintainability based on an example of a simple, but rich SQL query.
Latest Significant Version: February 2003
Evolutionary Database Design (by Pramod Sadalage and Martin Fowler)
Over the last few years we've developed a number of techniques that allow a database design to evolve as an application develops. This is a very important capability for agile methodologies. The techniques rely on applying continuous integration and automated refactoring to database development, together with a close collaboration between DBAs and application developers. The techniques work in both pre-production and released systems.
Latest Significant Version: January 2003

Analysis Patterns

Patterns are important to me, as they are a key technique to discussing and capturing what makes good design. Analysis Patterns were the subject of my first book, and they continue to be a topic that interests me deeply.

New Analysis Patterns
I've returned to writing about Analysis Patterns and this will probably lead to a new book in the hopefully near future. As I work towards it, this is the place where I'll post my work in progress. Japanese Translation
Patterns for things that change with time
Summarizes various patterns that you can use to answer questions about the state of an information in the past. These include questions of the form "what was Martin's address on 1 July 1999" and "what did we thing Martin's address was on 1 July 1999 when we sent him a bill on 12 August 1999".
Quantity
Handling dimensioned numbers such as: 12 ft and $9.99
Range
Treating a range of values, such as Oct 22-25 as a single object.
Accounting Patterns
In my book I included a chapter of patterns to do with accounting. Here I update and greatly expand on this topic. The primary pattern here is that of Posting Rule, which takes us from a passive accounting system to an active one. There's also discussion of entires, accounts, transactions, and the tricky matter of adjustments.
Organization Structures (Accountability)
This is a rework of the accountability chapter from the original analysis patterns book. It does some small updates to the patterns, but the main change is a complete rewrite of the chapter to put it into the new form that I'm now working with.
Dealing With Roles
A range of patterns that look at ways to handle situations where objects of a class can play different roles in various situations.
Specification
Patterns that describe how you can describe specifications of kinds of objects. Essentially the most general form allows you to encode predicate expressions as an interpreter of objects. These are useful for representing object queries, and for defining a requirement that objects need to match.
Recurring Event in Calendars
How to build an object structure that allows you to represent complicated recurring events. Such as the schedule for street cleaning when I lived in the South End of Boston.
Dealing with Properties
Many things have properties, and there are many ways to model how these properties work. These range from simple explicit properties to complex property models with an active knowledge level for validation. These patterns discuss some of the options in handling this.
Application Facades
Analysis Patterns talked about the topic of application facades. This article gives a much more in depth treatment of this idea, including a lot of sample code to help you implement it. This is also an extension of the Java example I gave in chapter 11 of UML Distilled.
UML Diagrams
I'd intended to put together UML diagrams for the patterns in the book. As it turned out I've come the view that other things were more important. Some others did work on diagrams, however, so here there are some for chapters 2-5

XP and Agile Methods

I've been long interested in the approaches of what are now called agile methods. My New Methodology article provides a summary of my perspective on them and a survey of the whole field. I've also written quite a few articles on XP, which I've been involved with ever since working on the C3 project.

The New Methodology
In the past few years there's been a rapidly growing interest in agile (aka "lightweight") methodologies. Alternatively characterized as an antidote to bureaucracy or a license to hack they've stirred up interest all over the software landscape. In this essay I explore the reasons for agile methods, focusing not so much on their weight but on their adaptive nature and their people-first orientation. I also give a summary and references to the processes in this school and consider the factors that should influence your choice of whether to go down this newly trodden path.
Latest Significant Version: April 2003
Using an Agile Software Process with Offshore Development
For the last two years ThoughtWorks has operated a lab in Bangalore India to support our software development projects in North America and Europe. Traditional approaches to offshore development are based on plan-driven methodologies, but we are very firmly in the agile camp. Here I discuss our experiences and lessons learned in doing offshore agile development. So far we've discovered that we can make it work, although the benefits are still open to debate.
Latest Significant Version: September 2003
Canadian Workshop on Scaling XP/Agile Methods (by Jonathan Rasmusson and Jim McDonald)
As XP and other Agile methods gain popularity, questions are beginning to surface regarding how to scale XP beyond teams of 10-12 people. In mid February 2003 a workshop dedicated to the subject was held in Banff Alberta Canada. In this article we report on the keynote speeches from Ken Schwaber, and Martin Fowler, as well as other leading practitioners.
Latest Significant Version: March 2003
Evolutionary Database Design (by Pramod Sadalage and Martin Fowler)
Over the last few years we've developed a number of techniques that allow a database design to evolve as an application develops. This is a very important capability for agile methodologies. The techniques rely on applying continuous integration and automated refactoring to database development, together with a close collaboration between DBAs and application developers. The techniques work in both pre-production and released systems.
Latest Significant Version: January 2003
The XP 2002 Conference
At the end of May 2002, the XP community once again descended on the Mediterranean island of Sardinia. In this article I look at the plenary speeches from Ken Schwaber, David Parnas, Enrico Zaninotto, Bill Wake, and the Standish Group's Jim Johnson. They lead me into some thoughts on the essence of agile development, the role of mathematical specifications, the complexity of irreversibility, metaphor, and the best way to drastically cut software costs.
The Agile Manifesto: where it came from and where it may go
In February 2001 a group of seventeen software pundits got together in Snowbird UT to discuss the growing field of what used to be called lightweight methods. We decide to use the term agile to describe this new breed of agile methods. We also wrote the Manifesto for Agile Software Development , setting out the values and principles of these agile processes. I was one of these self-elected visionaries and have since come across many questions about this group's origins and future. This essay describes my opinion about the answers.
Latest Significant Version: February 2002
The Manifesto for Agile Software Development
A group of seventeen people got together in Snowbird, UT in February 2001 to talk about new styles of lightweight methods. One result of this is coining the word agile to represent a new breed of agile processes for software development. We also put together a Manifesto for Agile Software Development which describes the values and principles of these agile methods. Jim Highsmith and I wrote this article for Software Development magazine to further explain the manifesto.
Planning and Running an XP Iteration (with Cara Taber)
Since the begining of the new millenium, we've been running an interesting XP project. It's interesting not just because it was one of the first XP projects at ThoughtWorks, but also due to its size: around 50 people are involved. Here we talk about how we run this project by focusing around the activities that need to be done for a single iteration, and how the various subteams work around that iteration.
Latest Significant Version: January 2001
Variations on a Theme of XP
One of the attractive things about XP is that it gives quite definite statements about what you should do to be doing XP. Furthermore that set of practices is carefully designed to fit together. Taking anything out has serious consequences. Yet one of the principles of XP and other light methods is that they be self adaptive: that is you should change the process as you are developing the project. How does this notion fit in with the rigid practices of XP? Japanese Translation
Is Design Dead?
For many that come briefly into contact with Extreme Programming, it seems that XP calls for the death of software design. Not just is much design activity ridiculed as "Big Up Front Design", but such design techniques as the UML, flexible frameworks, and even patterns are de-emphasized or downright ignored. In fact XP involves a lot of design, but does it in a different way than established software processes. XP has rejuvenated the notion of evolutionary design with practices that allow evolution to become a viable design strategy. It also provides new challenges and skills as designers need to learn how to do a simple design, how to use refactoring to keep a design clean, and how to use patterns in an evolutionary style.
Latest Significant Version: February 2001
The XP 2000 Conference (with Jack Bolles)
In late June over a hundred people gathered on the Mediterranean island of Sardinia to take part in the XP2000 conference to discuss Extreme Programming (XP) and other flexible methodologies.
Continuous Integration (with Matt Foemmel)
An important part of any software development process is getting reliable builds of the software. Despite it's importance, we are often surprised when this isn't done. Here we discuss the process that Matt has put into place on a major project at ThoughtWorks, a process that is increasingly used throughout the company. It stresses a fully automated and reproducible build, including testing, that runs many times a day. This allows each developer to integrate daily thus reducing integration problems. Japanese Translation
Continuous Integration with Visual C++ and COM (by William E Caputo and Oren Miller)
The Continuous Integration principles are applicable in many different development environments. While the principles remain largely unchanged from project to project, the implementation of this practice can vary considerably. Variables such as language, platform, team size & team location provide unique implementation challenges. Here we will outline how we've implemented CI in a COM/Windows environment for a project developing primarily in Visual C++.
Quick Page on XP
A short summary of XP with links to where you can find the real meat..
Keeping Software Soft
Why we need methods that assume software should be soft and open to change.
The Almighty Thud
Why you shouldn't write a lot of documentation. Japanese Translation
Keynote at SD East
At Software Development East in 2000, I gave a keynote "Keeping Software Soft", which covers very similar material to my essay The New Methodology. Dr Dobbs magazine made the doubtful decision to tape this and offer it as a webcast. This way you get to see a very small shaky picture of me umming and erring. Isn't technology wonderful?

Columns for Distributed Computing

In the late 90's I wrote the "Methods in Practice" column for Distributed Computing Magazine. Consider whether these are the reasons that the magazine is no longer with us....

Keeping Software Soft
Why we need methods that assume software should be soft and open to change.
Use and Abuse Cases
Ways in which to go badly wrong with Use Cases.
Is there such a thing as Object Oriented Analysis?
My thoughts on the role of analysis in OO projects..
Testing Methods: The Ugly Duckling
Why testing is much more important than most methodologists realize..
What's a Model For?
What is the point of drawing up UML Models?
Refactoring: Doing Design After the Program Runs
A short introduction to Refactoring.
The Almighty Thud
Why you shouldn't write a lot of documentation. Japanese Translation
How Standard is Standard UML?
What does it mean to have a standard UML, and why the standard doesn't standardize as many things as people think it does..

Refactoring

Refactoring Home Page

You can find all my material on refactoring on the refactoring home page

Refactoring Home Page
Articles on refactoring, links to more articles (and tools) on refactoring, index of all the refactorings in the book with additional comments and a few more refactorings..
Crossing Refactoring's Rubicon
In January 2001 two Java tools crossed Refactoring's Rubicon. Refactoring in Java now has serious tool support
Latest Significant Version: February 2001

Supplements for UML Distilled

Some additional material that builds on what I wrote for UML Distilled

Errata for UML Distilled
Errata for the second edition of UML Distilled
Defining the UML Kernel
At UML World in 2000 we had a panel discussion on whether we should have a kernel for the UML. SD Magazine turned it into a surprisingly coherent article (there's nothing like a good editor!) Take a look to see how frighteningly small I would make the kernel.
Changes in UML Versions
Changes in the various versions of the UML
Application Facades
Analysis Patterns talked about the topic of application facades. This article gives a much more in depth treatment of this idea, including a lot of sample code to help you implement it. This is also an extension of the Java example I gave in chapter 11 of UML Distilled.

Columns for IEEE Software

At the beginning of 2001 I started to edit a column on design for IEEE Software.

Who Needs an Architect?
What is architecture, and who exactly is an architect? These are questions that seem to get everyone very heated. So in this IEEE Software column, I let Ralph Johnson explain about architecture: with a definition that matches all others in a way that nobody agrees with. I also talk about two sub-species of architect: Architectus Reloadus and Architectus Oryzus.
The Difference between Marketecture and Tarchitecture (by Luke Hohmann)
When we think about software architecture, we usually think about its technical architecture. But there's also another important architecture - the one we use to communicate with the customers of the software: the marketing architecture. Neglecting this "marketecture", and its relationship with the "tarchitecture", can get development projects into a lot of trouble.
Components and the World of Chaos (by Rebecca Parsons)
Why chaos theory suggests that component assembly may not be as easy as it's cracked up to be.
Patterns
My IEEE column on the valuable contributions that patterns can make to understanding software design.
When to Make a Type
Guidelines on when to make a new user defined type (or class) for values.
Using Metadata
You can use metadata based approaches to remove the pain from tedious data oriented tasks.
How .NET's Custom Attributes Affect Design (by James Newkirk and Alexei Vorontsov)
Jim and Alexei took a leading role in developing a new version of NUnit. From this they reflected on how design is affected by the new .NET language feature of attributes.
Yet Another Optimization Article
It always surprises me that many well-established principles about performance optimization aren't very well known. This article is yet another attempt to cover these.
Public versus Published Interfaces
Many modern languages make a distinction between public and private features in a module. A distinction that doesn't get made so often is between public and published features: and that may be a more important distinction.
Avoiding Repetition
It's sometimes quite remarkable how the simple rule of avoiding repetition in software can lead into good design
Separating User Interface Code
One of the first lessons I learned was to always keep user interface code separate from anything else. Not just is this still good advice, it's surprising how often it's forgotten.
The Importance of Being Closed (by Craig Larman)
Craig's spot in the column looks at the importance of the Open-Closed principle and Protected Variation, and why Parnas's information hiding is more than encapsulation. He also gives some tips on ways to implement a protected variation.
Reducing Coupling
Thinking about how to visualize and reduce coupling.
To Be Explicit
Often designs techniques are used to make a system more flexible, but end up being harder to work with. One of the reasons is that explicitness is a property that often gets forgotten in design.

All these IEEE Software articles are copyright IEEE. Personal use of this material is permitted. However, permission to reprint/republish this material for advertising or promotional purposes or for creating new collective works for resale or redistribution to servers or lists, or to reuse any copyrighted component of this work in other works must be obtained from the IEEE.

Others

The section for papers that don't fit anywhere else.

Interview with Artima.com
I was interviewed by Bill Venners for his artima.com web site. In the interview I touch upon refactoring, evolutionary design, flexibility, and test driven development. Bill even manages to make me sound coherent.
Reflection vs Code Generation (by Mike Rettig with Martin Fowler)
Written and thought out very ably by my colleague Mike Rettig. I helped a bit along the way and he was kind enough to credit me. The article talks about techniques for eliminating repetitive code using reflection or code generation and talks about the advantages and disadvantages of each approach.
"Developers try to avoid tedious, redundant programming at all costs. Solid coding principles such as inheritance, polymorphism, and design patterns help developers avoid code redundancy. But in the uncertain realm of software development, these principles cannot eliminate the need for code maintenance and rewrites. To a large extent, maintenance is unavoidable, and attempts to create software that never requires maintenance only results in software guaranteed never to work. However, this article shows that you can use the power of Java's Reflection API to reduce tedious code writing, and use active code generation to overcome reflection limitations."
Enterprise Transforming Projects That Don't Kill the Enterprise
This article is based on a talk I gave at LOMA, an insurance industry conference, in 2001. In it I examine a few software development projects that ThoughtWorks has done which are, to some degree "enterprise transforming". The talk (and paper) are aimed at a non-technical audience. From the projects I draw out some common lessons learned. In essence these are: Deliver Frequently, Expect Surprises, Get High Level Executive Support, Treat Business and Software Development as Partners, Choose Technology for the Future, People are The Critical Success Factor, and Keep Learning. A version of this article was recently published in Resource magazine.
Writing with XML
For quite a while now, I've been doing most of my writing using XML - even to the point of writing my last book in XML. As I've mentioned this to people they've asked me a number of questions about my experiences, and that's been enough to prompt this little article on the whole thing.
Latest Significant Version: January 2003


© Copyright Martin Fowler, all rights reserved