Incremental
so how can one be purely incremental, when each increment will be implemented through the same series of steps?
A dictionary definition will help here:
Increment - NOUN
An increase or addition, especially one of a series on a fixed scale.
‘all sizes from 4–30 mm in 1 mm increments’
In terms of software development, "incremental" is taken to mean "not all in one go". It is the antithesis of "if you build it, they will come", and it's more akin to "build what you need, don't build for possible future versions".
It means that if your application has a FooService
class, that there is no expectation that someone will spend X time making the entire FooService
class (let's assume it has features A, B, C, and D), at which point it is considered "finished".
Instead, someone working on task 1 might create a FooService
class because they need the A feature, so they develop only the A feature. Then, at some later time, someone working on another task finds themselves in need of a B feature, and FooService
is the right place to put it. So now, they develop the B feature. At another point in time, someone might need a D feature, so they add it. Maybe after a while, you notice that B's implementation was very simple but because it is now being heavily used, it needs to be more robust, so you upgrade B to B2.
Little steps, one after the other, as opposed to knowing precisely what you're going to build = incremental development.
If an analogy helps: if you're expecting to hold a blueprint of the entire house before you start building it, you're not doing incremental development.
Iterative
the word "iterative" - if the meaning is enahnced to mean "refining and revising work", where does it fit in the classical story development scenario: you develop story B, and once it passes the tests and meets your DoD and Acceptance criteria, it is Done. You added it on the top of the existing baseline. In the mean time, some other stories are finished, ideally Done and hence certainly not meant to be refined or reworked
If you look at a particular feature in your software (let's call it A), that was probably created because of a story.
But when that story is done, that doesn't mean that you will never touch A again. A new story might be written, which brings some requirements that lead to A needing to be changed, extended, or even made obsolete.
some other stories are finished, ideally Done and hence certainly not meant to be refined or reworked
A story should be finished and then not touched again. But the source code that was related to that story doesn't get that same expectation. Just because these lines of code were related to story A doesn't mean that there isn't (or won't be) a story B which also influences what this code does.
Stories are rigid, and will be finished and done with. The code that was written for that story, however, is a living entity which should gradually be changed/updated to keep adapting to the ever-changing needs of the application.
Agile
So, to me it does not seem different from the decades old incremental models (which some claim are examples of Agile models, some say they are not). Just developing features one by one, with early testing and frequent delivery of working increments.
There is a difference between developing one step at a time, and planning development one step at a time. Agile pushes more towards the latter, more so than older models.
The goal is to not be waterfall, i.e. not trying to immediately build a comprehensive solution. People are notoriously bad at guessing the future, and waterfall specifically asks you to guess what you will need for the foreseeable lifetime of your application.
The odds of you spending time and effort building something that you end up not needing, or needing in a different way than you once anticipated, are so high that it makes the initial effort (and mental load that accompanies it) not worth it. At least, according to Agile.
Keep in mind that what I describe here is how Agile sees the world. Not every model works for every scenario.
I've worked on software projects involving major infrastructure safety, and the waterfall model is paramount to ensure that all involved parties are interacting with each other correctly, down to the strictly versioned chipsets in each PLC controller.
It leads to a more rigid process and severely decreased flexibility in development, e.g. you're not allowed to quickly update the chipset's functionality, but when peoples' lives (and billions of dollars in repair costs) are at stake, flexibility is not the most important priority.