Sunday, November 10, 2013

Iterative Development

Modern software engineering 'theory' is all about iterative. Each new development seems to be more iterative than the last (contrast agile with the waterfall process, for example). It is widely acknowledged that iterative development is better than 'big bang' development.

Open source development (by which I mean the open source development 'process', as opposed to just developing software under an open source licence) is intrinsically iterative - we have a huge lump of code which we add to (or subtract from) one small (hopefully) patch at a time.

I believe that making our development of each piece (bug, issue, patch, project, whatever) iterative rather than 'big bang' is important, but difficult. One attribute of the engineers I admire at Mozilla is that they achieve this. I try, but often fail, to do so. I think it is important to be iterative because it makes it easier to catch bad design decisions earlier, makes estimation and progress assessment easier (and thus it is easier to keep interested parties happy), and, I think (and somewhat counter-intuitively), it actually results in better design in the long run. That last one is (in my fuzzy beginnings of a theory) because the developer needs a better understanding of the problem upfront to be able to identify the iterative steps required. And, as you take these steps, that understanding (and thus the solution, including earlier stages) improves.

I don't really know how to be more iterative (I'd love to hear ideas in the comments). But, I do know you have to be pretty aggressive (intellectually) in sticking to the iterative path - saving things up and landing in a big bang is often the path of least resistance.


Anonymous said...

Iterative approaches are easier by accepting ambiguity and uncertainty. Or being certain that you will evolve the right solution at the end when you are uncertain what that end result will specifically be. I have found over 35 years you do need some overall 'in order of dimension' end goal/idea in mind, but getting there does require very incremental steps followed by user testing to validate - thats how creativity works, good invention works and in fact is how evolution has worked. There will always be many ways a solution might work and look to solve a problem - the diversity in animal life proves this. Iterative development has very strong foundational scientific theory in many areas that has proven to work. Keep the habit and the dynamics of the discipline and anticipation of what you will discover becomes fun and rewarding.

Chris said...

I think it helps a lot to accept that not every step along the way will be perfect or even correct, but just making the step is an important and worthwhile thing. It's a lot easier to improve something that exists than to work from scratch. I'm pleased when I see code I've written completely replaced (usually), it's confirmation that I've helped engineer a better solution.

Chris Peterson said...

Iterative design is fractal, applicable from UI feature design to bug fixes in a patch queue. To better understand iterative development, our industry should study both successful and unsuccessful examples of iterative design. :)