I’ve been managing a small team for the past 6 months now, when I was just a developer I always used to wonder why is that people who manage people get paid more than people that actually build the product and bring in the moolah. Ideally pay should be directly proportional to difficulty of task. If that’s the case let’s compare the relative efforts involved in programming vs. management. Since we developers understand programming very well, let us try and think of management as a programming activity where people are analogous to computers, getting a computer or group of computers to do what you want if similar to managing and getting work done from a person or a group of people. The dominant language style is different in both worlds, computer languages are dominated by imperative languages which require explicit instructions on how to do a particular task, whereas people programming is dominated by declarative(SQL like) languages where only the intent of the task is provided and not the actual steps.
When you don’t have experience with managing people it’s hard to imagine why people programming is hard, after all humans are logical and intelligent entities(with some exceptions) capable of making their own decisions and carrying out tasks based on just the expected outcome, sweet!! this is Object-Oriented utopia. Compared to computers which need to be told in very explicit terms what to do programming people should be a walk in the park.
Once you start managing people you realize that things are not so rosy, to put this in perspective, lets imagine that we were to design programs for a new set of computers that had human like qualities, here are some issues off the top of my head that you would face in programming this new breed of computers
– You could never predict the output for any given input, the output would be different on each machine and it would be a function of
1. Past programs – knowledge, experience, culture, ethics, attitude etc.
2. Physical conditions – physical health, fatigue etc.
3. Mental conditions – stress, family issues, inter-personal issues
– Efficiency would vary each day depending on mental and physical conditions
– While debugging, the computer would give you incorrect values for watch variables, so that you don’t think that it’s the computer’s fault.
– Not upgrading or paying enough attention to your computer could cause it to become grumpy and not execute the instructions properly
– Having sleeker and more powerful computers around could reduce the efficiency
– It would deliberately try to make other computers execute instructions improperly so as to get more upgrades
– The computers would not startup on some days
– A program that works on one computer or set of computers would always need some tweaking to make it work on a different set of computers
– Sometimes the computer would want to become a programmer himself and do underhanded stuff to make sure that the program does not work properly
I am sure there are many more issues you would face in programming this new system but I think the above set gets the point across. As you can see it’s making computers do what you want that is a walk in the park compared to people programming. To program a regular computer you can learn a programming language, or pick up a book on how to use some tool and 99.99% of the time the computer will exactly behave as it says in the book.
Is this exact behaviour possible with humans?, for sure there are a lot of books on how to deal with people, but they deal in probabilities, the only way you can predict the output for any given input with a reasonable level of certainty is experience. So like quantum mechanics, even with a well written program there is always a positive probability of unexpected outcome, when this is multiplied with the number of persons being programmed the uncertainty becomes unmanageable. This is usually combated by adding a layer of abstraction(middle managers, supervisors etc.) to reduce the uncertainty at higher levels. Thus programming people is tough infact tougher than any other engineering discipline that has predictable outcomes for any event.
Trying to get work done with a group of people is a herculean task compared to programming the regular computers, because even though we have the tough job of telling the computers what needs to be done correctly, management has the tougher job of understanding each individual person and coming up with a language to effectively program that person. Not only that, the program needs to change based on the presence or absence of other people. The effectiveness of a people programmer is directly proportional to the language used for programming each individual. This is also the reason why most good managers have years of experience, because experience based on an extensive dataset of inputs and outputs is required to effectively program people.
And that is why my dear fellow programmers, our managers are paid much more than us weenies trying to program these submissive and static regular computers. 🙂