www.martinfowler.com Open in urlscan Pro
34.198.71.201  Public Scan

Submitted URL: http://www.martinfowler.com/
Effective URL: https://www.martinfowler.com/
Submission: On June 14 via api from US — Scanned from DE

Form analysis 3 forms found in the DOM

GET https://www.google.com/search

<form method="GET" action="https://www.google.com/search">
  <input type="hidden" name="ie" value="UTF-8">
  <input type="hidden" name="oe" value="UTF-8">
  <input class="field" type="text" name="q" size="15" maxlength="255" value="">
  <button class="button" type="submit" name="btnG" value=" " title="Search">
    <input type="hidden" name="domains" value="martinfowler.com">
    <input type="hidden" name="sitesearch" value="">
    <input type="hidden" name="sitesearch" value="martinfowler.com">
  </button>
</form>

GET https://www.google.com/search

<form method="GET" action="https://www.google.com/search">
  <input type="hidden" name="ie" value="UTF-8">
  <input type="hidden" name="oe" value="UTF-8">
  <input class="field" type="text" name="q" size="15" maxlength="255" value="">
  <button class="button" type="submit" name="btnG" value=" " title="Search">
    <input type="hidden" name="domains" value="martinfowler.com">
    <input type="hidden" name="sitesearch" value="">
    <input type="hidden" name="sitesearch" value="martinfowler.com">
  </button>
</form>

GET https://www.google.com/search

<form method="GET" action="https://www.google.com/search">
  <input type="hidden" name="ie" value="UTF-8">
  <input type="hidden" name="oe" value="UTF-8">
  <input class="field" type="text" name="q" size="15" maxlength="255" value="">
  <button class="button" type="submit" name="btnG" value=" " title="Search">
    <input type="hidden" name="domains" value="martinfowler.com">
    <input type="hidden" name="sitesearch" value="">
    <input type="hidden" name="sitesearch" value="martinfowler.com">
  </button>
</form>

Text Content

 * Refactoring
 * Agile
 * Architecture
 * About
 * Thoughtworks
 * 
 * 
 * 
 * 


TOPICS

Architecture

Refactoring

Agile

Delivery

Microservices

Data

Testing

DSL


ABOUT ME

About

Books

FAQ


CONTENT

Videos

Content Index

Board Games

Photography


THOUGHTWORKS

Insights

Careers

Radar


FOLLOW

RSS

Mastodon

LinkedIn

X (Twitter)

BGG

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: 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



San Francisco




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 · 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 · generative AI ·
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

2024 · 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,
LinkedIn, X (Twitter), or Mastodon feeds. I also have a page dedicated to recent
changes.

--------------------------------------------------------------------------------


A SHORT NOTE ON HOW I USE AND RENDER FOOTNOTES

Wed 22 May 2024 14:17

Last week I added a small feature to this website, changing the way it renders
footnotes. That prompted me to write this quick note about how I use footnotes,
and how that influences the best way to render them.

more…

--------------------------------------------------------------------------------


TEST-DRIVING HTML TEMPLATES

Tue 21 May 2024 11:06



When building a server-side rendered web application, it's 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. My colleague Matteo Vaccari has written an article on
how to use TDD to test drive these templates using xunit-style tools which can
be run easily from the command line or as part of build scripts.

In this first installment Matteo describes how such tests can check the
generated HTML for validity, with examples in Java and Go.

more…

--------------------------------------------------------------------------------


DATA FETCHING PATTERNS IN SINGLE-PAGE APPLICATIONS

Tue 14 May 2024 09:49

Juntao Qiu is a thoughtful front-end developer experienced with the React
programming environment. He's contributed a couple of useful articles to this
site, describing helpful patterns for front-end programming. In this article he
describes patterns for how single-page applications fetch data. This first
installment describes how asynchronous queries can be wrapped in a handler to
provide information about the state of the query.

more…

--------------------------------------------------------------------------------


JOINING LINKEDIN

Thu 28 Mar 2024 12:26

As the enmuskification of Twitter continues, I’ve increasingly heard that more
people are using LinkedIn to keep up with new professional material. So, a
couple of weeks ago, I set up my LinkedIn account, so people can follow me on
that platform.

more...

--------------------------------------------------------------------------------


FAREWELL, JOHN KORDYBACK

Wed 27 Mar 2024 12:48



John Kordyback, a treasured colleague and friend, died last week, aged 64.

more…

--------------------------------------------------------------------------------


UNCOVERING THE SEAMS IN MAINFRAMES FOR INCREMENTAL MODERNISATION

Tue 26 Mar 2024 09:32



Mainframe systems continue to run much of the world's computing workload, but
it's often difficult to add new features to support growing business needs.
Furthermore the architectural challenges that make them slow to enhance also
make them hard to replace. To reduce the risk involved, we use an incremental
approach to legacy displacement, gradually replacing legacy capabilities with
implementations in modern technology. This strategy requires us to introduce
seams into the mainframe system: points in which we could divert logic flow into
newer services. In a recent project Alessio Ferri and Tom Coggrave investigated
several approaches to introduce these seams into a long-lived mainframe system.

more…


TOPICS

Architecture

Refactoring

Agile

Delivery

Microservices

Data

Testing

DSL


ABOUT ME

About

Books

FAQ


CONTENT

Videos

Content Index

Board Games

Photography


THOUGHTWORKS

Insights

Careers

Radar


FOLLOW

RSS

Mastodon

LinkedIn

X (Twitter)

BGG

© Martin Fowler | Privacy Policy | Disclosures