The two core goals of a software developer are to produce as many features as possible, as correctly as possible. Correct meaning bug free, as specified, without poor design choices, etc. All development practices and software qualities are just byproducts of attempting to execute on these core goals.
- Flexibility allows for updates to be made later in less time, producing software with the desired (correct) features.
- All forms of testing are meant to increase correctness.
All development practices can be held against the ultimate goal of either boosting productivity, or improving confidence in the software. This can be used to differentiate between necessary and unnecessary principles. Necessary principles are those that ultimately save time, or waste time but improve confidence. Anything else is puritanical and should be avoided.
These two outcomes, more software and better software, can be thought of as interchangeable. If software is developed in less time, more time can be dedicated to improving the code, referred to as polishing. Conversely, it's usually possible to speed up development by skimping on quality.