Emergent Design and Evolutionary Architecture in Sydney

Posted on February 23rd, 2010 by Kim Lerchbacher3 Comments

Fuelled by Stephen’s glowing recommendation of the Thoughtworks presentation “Emergent Design & Evolutionary Architecture”, I went along to Neal Ford’s repeat performance in Sydney this morning.

The talk presented some very sensible sounding ideas on software “design”, and few more on “architecture”. Stephen has covered some points that stood out for him in his post, and here are a couple more that I consider worthy of mention or additional comment.

Software is not a Bridge

Ford articulated a few points in Jack Reeves’ article “What Is Software Design?” (which I haven’t yet read in full) that apply as much today as they did 8 years ago.

  • The final goal of any engineering is some kind of documentation (the “design”) - once the documentation is done it is passed on to manufacturing to be built
  • In software engineering the design document is the source code, and the manufacturing process is linking and compiling
  • Software is expensive to design, and essentially free to build (manufacture)
  • Therefore the cheapest way to verify the design is to build and test (this of course does not work so well for bridges)

Stephen has already mentioned that “requirements gathering is a lossy compression algorithm”. You start with an idea about what you want/need, it is compressed into requirements (and information is lost in the process), then the requirements are “re-hydrated” back into code (in which the developers must try and fill in the gaps in the requirements to recreate something like the original idea).

Conclusion: Get from the idea to the code as directly as possible, then build and test. Emergent design and evolutionary architecture (and Agile principles/practices in general) are ways to do this better.

Emergent Design

When you start designing software, there are unknown unknowns which make it difficult (if not impossible) to design a perfect solution upfront. Emergent design is “doing enough design to get by until you work out what you didn’t know when you started”.

Abstracting too early is just speculation without facts. Emergent design is about “effective” abstraction - discovering abstractions and idiomatic patterns in your code that work, and reusing them. Idiomatic patterns are not the Gang of Four design patterns, but are ways of solving problems that work well for the problem or enterprise in question (and therefore should be abstracted for reuse).

Ford posed the question - “how do you know when to abstract?”. And the answer - “experience”. An experienced architect is someone who has seen enough to know what’s good/bad. It is difficult for someone to explain exactly how to do this because the knowledge and understanding required to do it is innate.

There were additional points here about technical debt and complexity (which Stephen has covered), TDD, refactoring and code metrics (most of which we have already found from other sources).

Evolutionary Architecture

Ford explained that architecture must “evolve” (rather than “emerge”) because it has to be there from the beginning.

I personally have never been clear on the difference between design and architecture (which would be required to understand the need for the different verbs). Ford offered a few definitions pulled from the article “Who needs an architect” by Martin Fowler, ending with the chosen definition - “stuff that’s hard to change later”. I haven’t been able to work out what “evolutionary” architecture is (yet) to a degree that would make this information useful, but there is a technical explanation in this IBM article.

Build vs Buy

The question of whether to build or buy software for some of our internal systems has been on my mind for quite some time. Ford offers this flowchart as a method of answering the big question:
figure4

The key point is that software that meets a strategic need should be built. If the software will perform a commoditisable business process (aka. overhead), then you can consider buying. Software should only be bought if it is useful to the business straight away (without requiring customisations which can take a significant amount of time), and if it is extensible (as opposed to merely customisable).

For us, this means we might consider buying our Customer Relationship Management system, but if (hypothetically) we wanted to make our licensing system a strategic point of differentiation, then we would need to build it.

In Closing

Emergent design and evolutionary architecture is all about delaying decisions until the last responsible moment, to minimise unnecessary complexity, to give your software projects the best chance of success.

The presentation had a few nice lessons, but it was just an overview of the subject - there is much more detailed and practical information on “doing” emergent design in the IBM technical library.

Comments

  1. Paul McArdle says:

    Thanks Kim,

    This is an excellent detailed overview to augment the notes Stephen put together earlier.

    Just a couple of clarifications from my frame of reference:

    Engineering is more than just bridges

    I would re-iterate the comment I made on Stephen’s post - in the same way that others outside the software space might have a simple view of Software Engineering, so should caution be advised when looking at other engineering disciplines too simply:

    Yes, Software is not a Bridge, but there are many other examples that have plenty in common with the software process.

    I talked about the difference between design and manufacture here. In other engineering domains (any time a novel product/asset is being developed) part of the design process will also include experimentation in terms of how to manufacture.

    Jack Reeve’s article is about a Design/Manufacture paradigm (not Engineering)

    I read this copy of “What is Software Design?”. Not sure if this is 100% the same as the one Neal Ford refers to.

    I can personally remember the debate about whether software was an engineering discipline - back when the article was written (1992) was just after I graduated and there was no software engineering discipline at university. Rather, there was a “Computer Science” degree shoe-horned into the Science Faculty at UQ. Those who were interested in software (not me at the time) did a degree in CS coupled with a Electrical Engineering degree.

    Certainly, the profession of software engineering has come a long way since that time.

    I understand the reasons why it is important to clarify the distinction between Design and Manufacture as I did here (even in red), and to point out the reason why software engineering is predominantly a design-centric process.

    I fully support this distinction as I see it will lead to better software being developed (i.e. through Lean/Agile and other processes).

    However, I think a cold shower is needed for anyone who continues to believe that:
    “The final goal of any engineering activity is the some type of documentation” (from Jack’s article). It was wrong back in 1992 when the paper was written, and it’s still just as wrong today.

    I have friends in many different disciplines of engineering (my degree is in mechanical) and, if they heard a statement like that, they would collapse in fits of laughter!

    The ones who would laugh most are the friends I have who are Manufacturing Engineers. Under Jack’s perverse logic, these friends would see the untenability of their position and vanish in a puff of smoke!

    My friends the Construction Engineers would also quake in their steel capped boots waiting for the anti-matter to get them, too.

    Don’t get me wrong - I think Jack’s article is quite good.

    1) Back in 1992, Jack should just have stayed away from a woefully incomplete metaphor about the full scope of engineering - as this just serves to close doors and further confuse people.

    2) However, that was back in 1992, when the debate about whether software was a real engineering discipline was all the rage. Why anyone continues to quote something like this now is beyond me.

    Jack sums it up much better in his summary:

    “Programming is a design activity—a good software design process recognizes this and does not hesitate to code when coding makes sense.”

    I agree with this entirely!

    By inference, he even makes a good point to sum up when to code and when to put something in another form of document (e.g. Design Specification) - i.e. only when it does not make sense to code.

    Hope this clarifies things.

    Paul

  2. adriang says:

    Build vs Buy…

    Just to keep this in perspective….Ford had a huge IT department for the maintenance and delivery of their internal applications. Most of it outsourced to Compuware, and as the product manager responsible for Fords application development platform, I’ve had more than a few trips to Dearborne.

    An internally built application needs to be integrated with other applications and it needs to be maintained. Maintenance can become an ‘interrupt’ to regular business.

    • Paul McArdle says:

      Thanks Adrian,

      I agree with your comment - in the end it comes down to what is core to our business, and what is not.

      We may be able to use a CRM system off-the shelf. However we get to that starting point, we will need to fill in quite a bit around it (ourselves) in order that we can get to 20x client numbers whilst maintaining only a small team (and few physical locations).

      The “Marketing Management System” will increasingly be a core part of our competitive advantage (i.e. it already is, but it’s just in my head at present - one of our challenges is to get it out of there and into a tangible form that can be scalable, and sustainable).

      Cheers

      Paul

Leave a Reply