
But in all fairness, Google fared better and that's where I am now.
Yes, metrics help to fit into the budget and cut failing projects earlier. However, imagine two projects, each with a budget of $1 million. One brings in the end $100 millions, another $2 millions. Imagine that each of them went out of control and cost in the end $2 million. For the first project, it’s not bad at all, for the second project - it’s a catastrophe.
It seems that the more software metrics matter for the project, the more useless it is.
The first story is about a guy, let's call him Kemal, who was a good strong developer with well thought-through code, good productivity, and low bugs level. He managed to find a style which worked great to his strengths and kept in control his weaknesses, whatever they were. One of the things, he always did, was to build code incrementally, if necessary refactoring previous levels on fly. It worked well for him in IC role, but then he become a lead. Worse than that, he become a lead for a new large component, essentially a product, where tons of new code had to be created.What happened next was that Kemal began spending a lot of time at work trying to get things together in his head and his new code, while the rest of his team was treading water or simply did not know what to do. He was occasionally sending them on some fool errands, for example, he could give them pieces to write, but then changed design on fly and all their work was thrown away. Sometimes, in the middle, Kemal could force a developer to rewrite perfectly working code many times to satisfy Kemal's style and views on the software development, just to throw it all eventually away with another change in design by Kemal. Just for reference, the project was fairly high profile, so Kemal's developerы were very good hand-picked developers. It's just he wanted everything written in his style and according to his latest opinion. Testers found some ways to entertain themselves, while program managers were treated like public enemies with an exception of one, who was eagerly rewriting his specs every day based on what Kemal mentioned this time. Naturally, the "spec" after that was completely useless.The project got stuck. Like, dead stuck. Finally, the manager of the project has convinced Kemal to try his luck in another group, appointed a new lead, who did not kept the project at throat, and the things started to develop.The second story is a little different. The guy, let's call him Chuck, was friendly and smiley, you know, dog style friendly, which could be really annoying to a cat person, but still everybody liked him. Chuck was not as much a developer as a hacker. I never seen any really complex code produced by him, but if you needed to borrow one million lines from another product and make it compile, build and work in your code base or quickly produce tons of more or less linear code with tons of calls to obscure APIs or fix tons of trivial bugs fast – Chuck was your guy.Once promoted to a lead, it occurred that his definition of a "lead" is not far from a slave driver on a plantation. To make things worse, he actually did not got much of a charter or a project to drive. Which, frankly, I believe to be the fault of the dev manager, who just wanted to delegate 1:1s and review paperwork instead of really building the team structure. In fact, all interesting and important work happened to be in the hands of the second lead, situation which did not work well with Chuck's idea that he gives his people tasks and they do those. I personally heard him saying "Why other team uses my RESOURCES?", where "resources" were people. I good lead could still handle the situation and make lemonade out of lemon by making his team a sort of service team driven by the requests of another team, but Chuck was not an experienced lead and he wanted his own projects, which clearly were not available.To make things even worse, he's got two people one of whom was fairly senior guy keeping good view of the whole project and driving on his own what needs to be done. In addition that guy also owned a piece of fairly complex multithreaded infrastructure code. Other team members occasionally did changes to that code, but when Chuck tried to do so, he almost inevitably was introducing new bugs to it ranging from dead locks to memory leaks. You can guess how well did it go with Chuck. In fact, he blamed the guy's programming style and eventually drove him off the team.Chuck still had support of the management, so he's still got more people who, after being mistreated as well, eventually also moved away, left the team and one of them even quit the company.
Let’s consider an example. Suppose, you have X bugs in area A and X (same number) bugs in area B. Developer A can fix N bugs per day in area B, but 4*N bugs per day in area A, while developer B can fix N bugs per day in area A or 4*N bugs per day in area B. How do you assign those bugs to developers?Ok, you may play a hardass and claim that "everybody should be able to fix bugs anywhere in the code". You may even have a legit reason for that - if you only have three developers including you, and one gets sick while another is on vacation, the one left will have to handle whatever will come his way. If so, pay with 4 times more time to do the same job. It's not like they are "bad developers", it's you who plays to their weaknesses and does not want to pick the bill – more time spent on the same amount of work.
Why? Because people are not computers. For years you created code for computers and then they did exactly as you wanted. Why did you become a lead? You wanted to do more. What limited you? Computer required every smallest detail to know what you want it to do. Now you’ve got people. If you want them to do exactly like you want to the smallest details like computers did, you will have to specify the same (if not more) amount of information, and so, you will end with the same (or even more) amount of work, that you already was not able to handle, with the exception that it’s a human on the receiving end, not a machine. Makes sense?