Summary
Martin Fowler, chief scientist at Thoughtworks, Inc. and author of numerous
books on software design and process, talks with Bill Venners about
how to combat design decay, the cost of flexibility and reusability,
four criteria for a simple system, and test-first design of interfaces.

Over the last decade, Martin Fowler pioneered many software development
techniques in the development of business information systems. He's well known
for his work on object-oriented analysis and design, software patterns, Unified
Modeling Language, agile software processes (particularly extreme programming),
and refactoring. He is the author of Analysis Patterns (Oct. 1996),
Refactoring (June 1999; coauthored with Kent Beck, et al.), UML
Distilled (Aug. 1999; with Kendall Scott), Planning Extreme
Programming (Oct. 2000; with Kent Beck), and the soon to be released
Patterns of Enterprise Application Architecture (Nov. 2002), all
published by Addison Wesley.

In this six-part interview, which is being published in weekly installments,
Fowler gives his views on many topics, including refactoring, design, testing,
and extreme programming. In Part I, Fowler makes
the business case for refactoring and testing, and describes the interplay
between refactoring, design, and reliability. In Part
II, Fowler discusses design principles of avoiding duplication, separating
presentation and domain logic, being explicit, and describes how refactoring
depends on code ownership. In Part III, Fowler
differentiates between planned and evolutionary design, suggests that focusing
on superficial problems can lead to the discovery of substantial problems, and
claims that doing a good job won't slow you down. In this fourth installment,
Fowler discusses design decay, flexibility and reusability versus complexity,
four criteria for a simple system, and interface design.

Design Decay and Refactoring

Bill Venners: Why do designs decay over time?

Martin Fowler: If you have a notion of planned design, that the design
is something that's right at the beginning, then it's kind of inevitable that the design will
decay. So many things in life do decay. The point is that you need to know how to keep a
design from decaying. That's what refactoring is about, techniques to reverse the
decaying process.
Refactoring is relatively new technique. We're still not used to what it gives us.
But one thing it gives us is you can use refactoring
to stop the decaying of designs. In fact, you can reverse the process and
actually make designs improve over time.