Recently I've noticed a handful of decisions that should be made really early. Some examples:
- 1-step build
- unit test infrastructure
- create a Git repo
- 0 warnings
- clean static analysis / lint
- slow build tripwire
Some of these are important because they're easiest if you do them before you have any code.
For example, I've worked on many projects where build + test time was quite long. The slow edit/build/test cycle makes me less productive, so I'd like to optimize it. But the optimization work is expensive for the same reasons: because verifying the changes is slow.
.@jaybazuzi In all honesty, my build spits out a warning when it gets above 5 seconds. I occasionally optimize as a result.
— James Shore (@jamesshore) April 29, 2014
The longest build I've worked with was 12 hours end-to-end. We all knew it *could* have been faster, but that optimization work seemed so daunting. I could optimize all day long, and get to 11h55m.
I know there was a ton of duplicated code in different parts of the system. But refactoring to eliminate that duplication was also hard.
If we had maintained a fast build from the beginning, it would have been easier to keep it that way.
There is a balance to be struck. Maybe you're not sure if the idea you have is actually viable. You may want to spike it, or show a prototype to a user, before investing significantly in the idea. (See Lean Startup).
There are other tasks that should come soon but not necessarily immediately, like pushing that Git repo to another machine (so you don't lose it), or setting up an automatic CI build.