By Martin Jul
I am working on an agile development project in tandem with a database team using a traditional somewhat iterative waterfall approach.
The application has some metadata that are basically a bunch of enumerations in the database.
In order to support multiple languages in the GUI we had added a table with translations of the language specific text for one type of metadata to the development database. This way we have a language-neutral domain model and can ask for translations of various bits of the metadata (say, for populating dropdown lists with something humanly readable).
This step taken, we asked the database team to incorporate the translation table in the database in the future.
Then we continued working on the steps for fulfilling the requirements involving that particular dropdown list.
Some days later the DBAs asked us about a general approach for translating all metadata. We discussed it briefly and they set off to work.
When they delivered the database the week after we discovered that generalizing from that single example had been a very poor idea. Meanwhile we had uncovered some more requirements with the customer and that particular solution was very poor for a lot of the other data.
In other words they had implemented the wrong thing for every piece of metadata except that first table. Waterfall at its best.
This of course now forced the database group to undo a lot of work and come up with another solution spending valuable resources on the way. We had tried to think to far ahead, make uninformed decisions up-front instead of informed, on-demand decision-making. And predictably, the waterfall approach once again proved itself a loser.
Now, on the application side no rework was needed: by focusing on solving only the specific, known problem we had produced no code to solve the unknown requirements. No code needed to be changed.
Agile development done right is a big timesaver and it underlines the fact that iterative development is not about week- or daylong iterations, but "baby step" iterations of minutes and seconds.