June 6th, 2005
Today I was reading Martin Fowler’s article Who needs an architect? which I thought was excellent. The most interesting comment being this one, which he apparently culled from the talk of an economist named Enrico Zanninoto:
One aspect I found particularly
interesting was his comment that irreversibility
was one of the prime drivers
of complexity. He saw agile methods, in
manufacturing and software development,
as a shift that seeks to contain
complexity by reducing irreversibility—
as opposed to tackling other complexity
drivers. I think that one of an architect’s
most important tasks is to remove
architecture by finding ways to eliminate
irreversibility in software designs.
I think this is what really attracts me to the Hexagonal Architecture. My experience has been that using this design along with agile development methods it becomes possible to reverse almost any other design decision. It is possible to do this with a classic layered architecture only if you can run the entire system in a single process. As soon as you need to distribute work to another computer or process, the thing begins to fall apart.
In the system I am working on right now there are several problem areas that need a lot of refactoring. They don’t lose me sleep though, because they are well separated from eachother, and I know it won’t cost us much to do the refactoring later. The real problems come about when you have multiple problem areas, and the complexity of one begins to spill into another. This happens when you build data access or transport logic right into your ui for example. You can’t reverse the data access decisions because your ui will be impacted. You can’t build a new or better ui without duplicating the data access logic.