In any large enough company, there are front-line workers, management, and executives. Executives set direction, management sets up the situation for the workers, and workers do the labor.
Workers do the company business every day, providing capabilities to external or internal customers. Management gets them the tools and training they need, for today and for the next quarter, keeping the existing system running. Executives think in larger timescales: what new capabilities does the business need? What will we change?
Executives are system builders.
Software developers are considered to be front-line workers, doing the work. But we don’t really do the work, do we? Computers do.
In a travel company, computers receive booking requests and track what’s available and send out receipts. In a ride-share company, computers coordinate between riders and drivers. Computers do the same work, with consistency and precision, a zillion times per day.
Software developers decide what the computer should do in every situation. We add new capabilities. We change what happens at the front line. We are system builders.
A software team is a lot like an executive team.
Executive teams are cross-functional, with experts in each facet of the system, who also understand the system’s purpose as a whole. This is important, because decisions of the executive team have magnified consequences, as they’re carried out zillions of times by the system they’re building. Like in software.
There’s a lot of research into executive team collaboration. I think we can apply much of it to software teams. For instance, generativity: in the best teams, members care about more than their individual reputation.
If developers are executives and computers are the workers, that leaves management. Who sets up the situation for the computers to succeed? Infrastructure people. Who deals with problems that arise? Ops.
Infra and Ops are like middle management.
No wonder ops and dev need work together. When management and executives are at cross purposes, little of use gets done.
In software development, I am a system builder.
In any large enough software system, there are computers, infrastructure, and software developers. Developers set direction, infrastructure sets up the situation for the computers, and computers do the labor.
Sometimes we speak of our software organization as if it were an assembly line. What is different if a developer is more like a COO?