In my mind, software development is very simple.
A developer is most efficient when they can work independently without requiring external input. For maximum work output, tasks should be separated and distributed to developers that match the skillset. Minimal communication is required, and the worker continuously adapts to become more efficient.
However, there are several issues with this approach.
1. Decreased job satisfaction.
No one wants to work on the similar tasks their entire career. The human mind likes to learn and be challenged.
2. Lower morale
Human interaction is lacking, and work, which consumes the majority of our day, will not be enjoyable.
3. Increased fatigue
I’ve read that we’re limited to an hour or two of continuous concentration. Attempting to maximize output will easily fatigue the mind resulting in burnout.
4. It encourages one-dimensional growth
There are benefits to specialization, but the world needs well-rounded citizens to make democracy work.
There are activities that may slow down work in the immediate run but will mitigate the above issues and/or potentially increase the rate of work output in the future.
1. Relevant job training
2. Pair programming
These activities are beneficial and necessary to mix-in with the daily grind, but they will not be as efficient as an independently working developer that has the right skill set. Thus, in order to maximize output, these activities should not hold precedence over working independently unless the developer cannot work independently without guidance. If guidance is required consistently, tasking may need to be improved or the developer might not have the right skill set.
Most importantly, work output is useless if the project is headed in the wrong direction. It is absolutely critical the work is spent going towards the right direction, or the work will be unnecessary and negatively impact employee morale, etc.
When the direction is unknown, let the developers take a break while things are being figured out.