A common concern I hear when working with teams is how much time should we spend in design or architecture of our product.  I had a real nice conversation with a team last week around this topic and wanted to share some of that discussion.

The conversation started with a comment around 'we were told in agile we don't do any design. That seems crazy.  How do you find the right balance.'  No design or architecture consideration ever is crazy.

My perspective is you start with what the cost of change is to an application.  Changing a stack is high cost, so you probably want to understand the stack.  Changing a method or implementation should be a low cost change - so I wouldn't design it but let it emerge based on the needs of the system.

Those are simple scenarios, the two ends of the spectrum.  We then discussed - in their world - what changes are expensive?  There is a whole lot of gray between 'stack' and 'method' - in your world, what is an expensive change?  Now that you identify some of those changes, why are they expensive?  For some teams schemas are a high cost change.  It can be a high cost change because of separations of responsibilities - i.e. the data architect wants normalization across the enterprise.  Or it can be high cost because there is no data migration strategy.  If you want flexibility, what can you do to lower the cost of those changes?  If the cost is lower, how comfortable are you with designing versus allowing the needs to emerge?

The cost of change can be high for a variety of challenged dev practices.  Lack of tests, lack of refactoring, highly coupled code - these all lead to high cost of change.  When this is the norm, teams feel the need to design more.  This really doesn't solve the problem.  The problem is the cost of change.  Instead of designing more, teams should consider looking at why the cost of change is high and what is possible to lower that cost.

This was a real nice conversation with all dev, test, operations, and management engaged.

What costs do you have and what can be lowered?