He also refers to “plan to throw one (a design or an implementation)
away”,which means forget about that prototype, start over and make it better
thistime. This (lack of versionning) seems to be a pretty big obstacle and
that’s understandable: who wants to admit that the previous version
wasn’tso great?
Well, once you’ve really tried throwing a few thousand lines away and
rewrite it all from scratch, I don’t think it will be that hard. It’s
incredible how superior each new version is to the previous one - and that
saves lots of time and frustration later on, when building on the code.
Design isn’t all about code, it’s also about data structures. If I may
paraphrase ESR again, smart data structures and dumb code is a lot easier
than the other way around. Sure, updating data structures (for a new
design) will mean updating/replacing a lot of code, but if the data
structures are smart, then the code will be easy [relatively speaking] to
replace anyway.
Especially in the proprietary world, where you have little time to clean
up
and rewrite code, you’ll be forced to add many times as many features as
you
could possibly imagine when designing the code. That’s when you wish you
spent a few more hours thinking that design through…
I think this applies to the situation you are describing:
“When you hit a wall in development – when you find yourself hard put
to think past the next patch – it’s often time to ask not whether
you’ve got the right answer, but whether you’re asking the right
question. Perhaps the problem needs to be reframed.”
A redesign is often a good idea in this situation, especially since the
non-techies that fund/control most software projects don’t always understand
why it is necessary to do so when all they want is this new feature.–
Olivier A. Dagenais - Software Architect and Developer