Hiring Programmers and The High Cost of Low Quality
An anonymous reader writes "Why is it so hard to find good programmers? And why should companies favor hiring fewer more senior developers rather than many junior ones? Frank Wiles discusses his thoughts in his article A Guide to Hiring Programmers: The High Cost of Low Quality"
FTA: ...Experience is key, but not necessarily in ways you might imagine. Time in the saddle, with a particular language is not as important as diversity of experience. Someone who has worked in several disparate industries, a generalist, is often a much better developer than one who has spent years in the same industry. There are exceptions to this, but in general I have found this to be the case. Bonus points if your developer was a systems administrator in a former life.
Some of the best developers I know were originally trained as journalists, mathmaticians, linguists, and other professions not normally associated with software development...
As a generalist programmer, originally trained in cognitive science, who has formerly worked in several disparate industries, was a systems administrator, programs in half a dozen languages (including perl), etc, etc...Apparently I'm supposed to be making twice my salary. Goddamnit!
*stomps off in search of his boss*
These days, being a programmer generalist (even worse, one with admin experience) just increases the types of shit that get dumped on you...Where they might have had to hire a person to do the front end GUI code, a person to do the database work, a person to set up the server, and a person to code all the services that need to constantly run in the back end, instead, since they've got you, you can do it all, while the specialists sit around drinking coffee and making catty comments about how much better they are at what they do than you are.
My advice is specialize in something to the point where when you do any work on it, it's immediately out of the comprehension of a generalist or a less accomplished programmer...Sure, everyone will hate you, but they'll have to deal with you, and you'll be in a position to dictate terms. What's a generalist got? They're great employees. Big deal. Being a great employee is like being a great dog; at the end of the day, they'll still euthanize your ass when you're no longer of use.
//Not bitter or anything.
ad logicam Claiming a proposition is false because it was presented as the conclusion of a fallacious argument.
that is all.
One aspect not discussed: Programmers are in short supply because demand for code and new features is limitless.
My company right now has huge demands for new features and new software. While development is desperately trying to fight the urge to pump out more and more features, they fail miserably each cycle. This is coupled with the fact that we have tons of work to do cleaning up bugs. No one can stop and catch their breath, the work keeps piling on.
This cycle will continue until a customer realizes they can't get something on time, or the quality is so bad the software won't sell any more. Customers think the software just materializes because they see it on the shelf. It took years to get it that way.
Salesreps do and say anything to get the contract signed, and the details get ironed out later. As long as the cash rolls in, large companies aren't going to change this.
"All great wisdom is contained in .signature files"
The hardest part of finding a new job is getting past the recruiters, who are generally not capable of anything more than keyword matching against your experience. Use your contacts if you can to get in front of the technical managers who will understand that your domain knowledge and overall experience is more valuable than which languages you have been using for the past few years.
But I think that if the über-programmer really does exist, then eventually the free market will figure that out, and compensate him accordingly.
It has, and then some. These "über-programmers" are what you and I know as "wildly successful startup founders." Part of the reason it's so hard to hire them is because they are mostly already independently wealthy and / or personally invested in a project of love that no offer of cash and benefits will draw them away from. Most likely, if the former is not true, the latter will eventually cause it to be true. The best and most common way of hiring an über-programmer is to buy the company they currently work for.
Unpleasantries.
As a recently graduated CS student, I find this type of thinking to be incredibly infuriating at times. Companies only want to hire people with experience. Yet to gain this experience, I need a job. The circular logic goes round and round until you have a brain aneurism.
My college never stressed learning any one language well. Rather, it taught us the tools and techniques we would need to survive in the ever-changing world of software development. Yet none of this seems to count for anything. No past experience with a company? Goodbye. The fact of the matter is, I need to start somewhere. Right now I'm sitting at a job that I feel doesn't tap my abilities, yet I put up with it for the "experience." The number of opportunities for fresh graduates are few and far between, and you have to take what you can get.
"Now I'm seriously serious!" - Serious Sam
Dumb question, but if nobody trains new developers, then where the heck are those more experienced developers supposed to come from? And of course the related question, where did the few that we now have come from?
T
Laws are horrible moral guides, moral guides make even worse laws.
By some estimates, Good Programmers can be a factor of ten or more productive than Bad Programmers, yet they are seldom paid more than a few tens of % higher. It would be far better for most companies to pay double the going salary to attract only the best, but unfortunately business thinking does not seem to be structured that way.
Most organisations base their planning on some convenient notions like programmer-months etc, using some standardised measure for programmer capability. These measures are great because they make the spreadsheets look neat and tidy. They also make all the outsourcing logic work: "I can get programmers in country xxx for $10 per hour". Untimately they are flawed because you get what you measure. If you don't pay a premium for good programmers you won't get them. You end up spending mucch more on crappy programmers.
Engineering is the art of compromise.
Some people are self-taught or learn on the job. Not everybody needs to learn from another person.
Computers are useless. They can only give you answers.
-- Pablo Picasso
Domain knowledge is the primary difference between a 1 day LOE and a 1 week LOE, not programming "skill".
There is no class of general "uber" programmer that can be brought on to an arbitrary company's internal development project and hit the ground running at a pace 10 or even 2 times that of the standard-fare developers already on the project. This is a complete myth.
However, the domain knowledge gap can in most cases be narrowed very cost effectively through knowledge transfer, training, and tools.
If you skimp on resourcing and experience anywhere in your development organization, it should be on programmers. Inexperienced and unskilled programmers can be compensated for effectively through targeted specification, management, and quality assurance processes. The key is to have processes in place to identify and rectify programmer failure early and often.
Computer programming isn't rocket science, it's bridge building. You have planners and you have builders. Builders pour cement and put rivets in place, and there are processes in place to identify, rectify, and robustly handle individual builder error. Bridges do not arbitrarily drop cars off into the river below due to individual builder error, and neither should software programs crash due to individual programmer error.
I'm going to take advice on hiring programmers from a Perl cool-aid drinker. Sure, just the very minute I get my brain replaced with a cauliflower. Perl is an horrifically bad language. It's called "write-only" for a reason. It makes great programmers produce merely adequate code, makes good programmers produce bad code, and makes bad programmers think they're great. Feh. A properly trained, incentivized and provisioned Java team can run rings around a Perl team in terms of working code produced, as well as (more importantly) cost to develop and cost to maintain.
However if you are one of the aforementioned mainframe experts then you need to take a crap job or some side jobs as a web developer, starting off working for free for non-profits and the like, then as your skills progress you can start charging then work your way up from there. Then you can start looking for the mainframe web devs that you are aiming for. However if you are like most people you become a specialist because that is where the job field led you. You may see that there is a good paycheck in the area or it may interest you but that is exactly why those jobs pay well, because they are a rare person and unless a trade school offers a program you are SOL.
The purpose of the article is to explain that a good dev can make up for some serious problems as a beginner programmer, or if your company is big enough you can hire the underlings to do the crap coding while the expert does all the engineering, planning and actual Development. Those entry level people pay their dues coding and recoding the same scripts over and over for the guru and after a while they move up, taking that knowledge with them. However if a company cannot afford a whole host of devs, they had better hire the good ones rather than the entry level employees.
CS: It is all sink or swim...oh and did I mention there are sharks in that water?
There are other issues besides technical skills. The higher you rise in the food chain, the more the "soft skills" matter. Organizational skills, people skills, communication skills. All the elegant code in the world doesn't make up for a prima donna who won't show up for a critical meeting or who openly disrespects "lesser" members of the team. The last thing in the world most people want is to hire the developer equivalent of Terrel Owens... because, just like Owens, they will leave damaged teams in their wake. Morale counts. The reason that leads get paid more than individual contributors is not just because of technical skills. It's because they can herd cats. It's because they can recognize that business reality sometimes has to trump "ideal" elegance or philosophy-of-the-week. It's because they can convince Dev to talk to QA to talk to Product Management to talk to Sales. It's because they can somehow get a clear functional spec from the marketing guy. It's because they can get by with existing equipment instead of demanding an Intel Core 31337 for their desktop. It's because they don't have to have an HR apologist in tow smoothing ruffled feathers everywhere they go. "Senior" implies so much more than "technical guru".
Everybody gets what the majority deserves.
1. it isn't garbage and spaghetti because you have difficulty following the technique, there are a thousand ways to do anything. It's garbage and spaghetti when it doesn't work well, and when it's under documented.
2. Could you really write it in six months without referencing the code you are talking about? It's one thing to write code when the problems have been solved, quite another to solve the problems.
3. the scope of a job changes over time. For a new programmer, start looking for scope creep, it's a friend and an enemy.
4. code changes over time because languages change over time. Look for those situations in the spaghetti code where those guys that you are better than wrote functions that were not available in the language. You may get a surprise that they did something really elegant to overcome something missing in the language originally that exists now.
5. lets say that there were five programmers on the code before you, one after another. The first four might have been gods gift to programming, it only takes one pretentious newbie in the chain to really screw up pretty code.
certainly none of these apply to your project, but it's something to think about as you are exposed to projects in your career.
A positive attitude may not solve all your problems, but it will annoy enough people to make it worth the effort.
There's no one programmer who does the work of ten other programmers. One uber-programmer does just as much work as one ordinary programmer. It's just that the results solve ten times as many problems. Programming is fundamentally a design problem. A great bridge designer doesn't do the work of ten lousy bridge designers; the great one designs one great bridge in the time it takes the ten lousy ones to design ten lousy bridges.
The best approximation is that each problem has a certain complexity and a certain size. The size determines how long it will take, and it doesn't matter how good the developers are. The complexity determines how good a developer is needed to make progress at all. If you've got only easy problems, an uber-programmer doesn't help you much (unless the programmer can find a smaller, harder problem that replaces the big easy one). If you've got a hard problem, ten average programmers will work on it forever without getting any results.
And there's one last thing specific to computers: the computer can solve easy problems for you, but making it do so is a hard problem. But solving that one hard problem (plus some processor time) resolves a lot of easy problems. Another type of hard problem is writing a magic library function that makes a range of moderately hard problems easy enough for average programmers to solve.
If you've got ten people essentially doing data entry, an uber-programmer may be able to eliminate the need for them to do that at all. If you've got ten developers working on some problem, an uber-programmer may be able to double their productivity. In either of these cases, the uber-programmer directly produces something that isn't part of the actual project, but the benefit to the project is on the order of ten average programmers' work. And, if the uber-programmer reduces the complexity of the problem to put it in reach of the rest of the team, no amount of ordinary programmers' work would benefit the project as much as the uber-programmer's contribution. Of course, if you require an uber-programmer to literally do the work of average programmers, there's no benefit at all.
I've been a software engineering manager for a long time. I don't blame the higher education system. Nearly all CS programs cover enough of the basics to form a foundation for lifetime learning in CS. The rest is up to the student and their own innate passion. If they have a passion for the technology and chose CS as a labor of love, then they'll do fine. There have been many graduates of CS programs who declared CS majors when counseled to 'get into computers' by a high school guidance counselor. I always look for the passion players when I hire people. I avoid the people who chose CS as a 'sensible career in computers'. I've seen some passionate lovers of CS that come from tiny state universities run circles around graduates of Stanford, MIT, and Berkely.
For 100's of years you have the senior crafts man and his apprentices.
You can't get good quality with just Senior crafts man, or just junior apprentice types.
The Junior ones just don't know how to make the trade offs or the how and why things are done a certain way and end up painting then selves into a corner or making a mess for the next guy to deal with. But they are young and full of energy.
The Senior ones, just don't have the patients or excitement about over all of the stupid little details. They just can't get excited about doing the same thing over and over. But they think ahead for the next guy, they know how to avoid problems and usually know how to fix problem when they arise.
Also they have usually have a long list of other senior developers they can call on for help and advice.
Often on a really difficult problem the phone and E-mail are your best tools.
As my former partner the infamous Jesus Monroy used to say, on a boat you need rower and captains. Too many of either doesn't work.
As a senior developer, I find I am best at working the really difficult problems, but lack the patients for the more mundane bulk coding.
Also like doing architecture work.
But thing work best when there a Junior programmer that will get stuck on a problem and usually hide in the cube for weeks trying to solve it. Where when I am around I usually can take one look and tell then exactly how to fix it. As a result they tend to get 10x or more work done when I am around.
Also junior programmer usually just start writing code when giving a project with little consideration on design. The end result tends to be large, slow and almost impossible to debug.
As someone experienced, I find that laying out the design, the foundation, if you will that everything else is to be built of from is critical.
Once designed correctly, the code is much smaller, simpler, is easy to work on and debug. It also less code means it runs faster, loads faster and uses less resources.
Also less code, means it faster to implement. So I'll spend more then 1/2 of the development time on research and testing, and design, before I ever type the first line of code in. But in the end, I get done faster and almost never have any logical bugs, memory leaks and have never needed a debugger, just type-o's as mostly, of only I could spell...
I hate nothing worse the Bloated code.
I am always doing that which I can not do, in order that I may learn how to do it. - Pablo Picasso
Is it surprising that finding good people is the hard part? Is it any different than the effort it takes lure a world-class CEO to run your company in hopes of making many times his salary/bonus/stock options in return?
Most companies are lazy, and don't try to measure the value of any employee in a company, just hire people to fit a job description and cross their fingers. To make matters worse, after hiring the wrong person they don't know how to get rid of them. Is all this really a revelation? People are lazy, and as implied all over the article and the comments to it, not enough companies seem to try hard enough. Is it not like buying a lotto ticket and hoping your numbers are drawn to be rich? Finding the right people vastly improve the odds of the company's success. That's what it's all about. End of story.
I think the single best way to find good programmers is to find enthusiasts.
:-)
The reason is that it's easier to determine how enthusiastic someone is than how good a product they develop:
- enthusiasts usually have side projects
- enthusiasts often create libraries of code that can be reused
- enthusiasts will have a variety of favorite tools - and can explain why they like them
- enthusiasts will likewise have a variety of favorite methods - and can explain why they like them
- enthusiasts read widely in their field
- enthusiasts know the names of those who have made impacts on their field
- enthusiasts often find themselves putting in too many hours - because they *enjoy* the work
- enthusiasts gravitate together - put them in a room together and you'll have a lively conversation
And there are technologies, methods and tools that attract enthusiasts. For example, I've found that even if python and ruby aren't the most marketable languages out there - they are great ways to find the enthusiasts.
Of course, this won't help a manager that lacks enthusiasts on his team. But a technical manager who is himself an enthusiast, and builds such a team should be able to easy find more. At least in my humble opinion.