In the process of selling your house, you’ve got to optimise for cleanliness and tidiness, which is a tweak to my usual habits, where I try to avoid multitasking and chunk similar tasks together. For example, washing all the dishes in one load at the end of the day, rather than 2 or 3 at a time throughout the day.
There’s an ongoing discussion at work about GitFlow vs Continuous Integration. I chose to try GitFlow on the current project to explicitly decouple features-in-progress from the release initiation and completion due to some major release management headaches in a previous project. This involved both trying to unwind features from trunk that were descoped or failed FAT, and trying to manage parallel versions at various stages (development, release preparation, support). The code was not continuously shippable.
This knocked a few traditional Continuous Integration advocates, as there was no longer a single place where all code was integrated, built and tested after every commit. We traded a highly shared, but less stable, state for a distributed set of more stable states where there is lag between completion of development and being shippable because we valued that more.
We optimised for releasable code rather than shared code, for multitasking and chunking rather than continually cleaning.
I like doing things more often to do them better, strengthening the muscles so each time causes less pain, and I accept that feature toggles are an alternative solution that tries to minimise the compromises by inflicting release information throughout the code.
I still don’t know which is the most effective approach long term, but given recent experience, I will tend toward continually shippable rather than continuously integrated code, so that the pain of integration is pushed back into smaller chunks, that in a good world fit inside a developer’s cognitive capacity. Can you convince me otherwise?