As far as I can tell, pretty much everybody graduating that wants a job gets a job. Naturally, not everybody goes to work for Google or Facebook, but this includes people even worse than the presumably hypothetical "John".
Also, people like "Norman" are just as likely to get snapped up by Google and then still work in relative obscurity. Well-paid, enjoyable relative obscurity with great benefits and a great culture, but relative obscurity nonetheless.
Really, the talent shortage works like this: you, as a company, would love a "Norman". You'd be happy with a "John". You'd probably be content with anybody who can program. Instead you get "Barry" who can't write a FizzBuzz program in any language. All this puts upward pressure on programmer salaries and benefits (good) and motivates recruiters to spam me about openings for senior Java developers (bad).
Also, a lot of companies do claim to want very good engineers. But I've found this to be empty rhetoric as often as not: for every company claiming that and actually having a stringent interview process and difficult technical problems there's a company willing to accept anybody to work on their CRUD app but wants their ad to sound cool.
Anyhow: there is some shortage of programmers of any but minimal competence. That is what "talent shortage" actually means, and, as far as I can tell, it's actually accurate.
Not that it's wrong to evaluate based on that criteria. However, for people like the hypothetical John it's quite hard to keep up with a good CS program and manage to do impressive things on the side. So you end up with people with strong potential, much of it not yet actualized, who spend the first years of their careers in a job of questionable usefulness (excel macros?). I think there are more of those people than commonly assumed, and I do think they can contribute well in much better places. They may be slow at first, but give them 6 months and they will be strong members of the team. Granted, a startup may not have 6 months to give, but once you've got some resources under your belt a green-but-talented engineer can be a great investment.
I don't have a lot of advice besides "practice".
Well, I do have some. Don't be afraid to open up the tool's source and read it. Try to design the tool yourself and you'll get a better sense of how it's likely to do things.
But mostly, practice.
Anecdote: I like to think I can write fizzbuzz in a couple languages.
I have actually avoided HR. I've been too lazy to send out resumes, and I only really want to work at small startups (at least for now). All of the interesting offers I got had some concrete spark independent of my education: for example, I got one after doing well at a hackathon and another from an HN post (but largely thanks to my knowing Haskell and having some interesting projects on GitHub).
I think that if you don't mind not working for an established company, you will have to worry much less about your education (but, probably, more about your actual skills). Of course there are good startups and bad startups, but I've found the good ones to be very good not just from a technical standpoint but also from an employment standpoint.
However I ran into a bunch companies that did not know how to hire and I also found that the more successful the company was the better they were at the process, defiantly a correlation there.
I think our industry sets a high bar for "minimal competence". It isn't fizzbuzz. I went to an interview where I was asked to write, on the whiteboard, a recursive solution to the problem of printing all possible permutations of a string. I blew it, and of course I went home and worked on it a bit and solved it (the way I usually program, try it a bit, run it, modify, test, iterate), and I emailed them my solution, but that's how it goes: no offer. I want to be very clear about this, I am not complaining. This company has every right to decide what their interview process will be. But of course it irritates me to no end to hear about how there's a shortage of programmers beyond "minimal competence", especially when the people doing the hiring what to hire whip-smart engineers at roughly half the rate a top MBA or law grad would command.
I've had such discussions on this board with people about the the concept of a "shortage" at the "market rate" when everyone is experiencing hiring troubles at this rate. I think it's an absurd notion - if demand clearly exceeds supply, this is not evidence of a shortage, it is evidence that salaries need to rise to reach an equilibrium. All I can say is that some very intelligent and rational people simply disagree with me on this.
As a personal anecdote - I was in grad school at Berkeley during the first dot com boom, when industries were claiming a severe shortate of engineering graduates. I saw reports of average starting salaries out of the MBA program, the JD program, and the various MS/PhD engineering grads... not a single engineering degree program, even PhDs in CS, were at the MBA or JD level. Why is there so much resistance to paying engineers what it will actually take to get more top people into the field?
But Biglaw/MBA Consulting pay so much because the firms are oligopolies with gentlemen's agreements not to compete on price.
That's not going to happen in a field with mesurable results.
While there does seem to be some basis for questioning the data, I do think that the employment reports support the notion that the average starting salary for someone out of a "Top 5" law school greatly exceeds the pay for an MS or PhD grad of a top engineering school.
Is this something you'd disagree with? - ie., do you think that the job placement reports from the various grad schools at UC Berkeley and other top institutions are so unreliable that we can't draw general conclusions from the numbers?
I also completely agree with you about biglaw and consulting. Law actually does resemble a cartel in many ways, and oligopolies certainly exist in consulting and drive up pay. But to me, that's beside the point. If smart people can make gobs of money in other fields (never mind why, the important thing is that they can), why should we be surprised that they won't become programmers for 80K a year?
Note: I'm not talking about on-the-job training from someone who doesn't know what a computer is to a master programmer. I'm talking about allowing people who are less immediately capable into the workplace and mentoring/growing them into strong contributors.
I'll admit I haven't seen a lot of explicit on-the-job training (besides that dealing with internal technologies), but I have seen a lot of people who's first job is less challenging than their later ones, who use it as a growing experience and a stepstone.
The real question is whether a large number of programmers don't reach their full potential or do so significantly later than they would have with proper mentoring. A difficult thing to find evidence for either way.
See books: Outliers, The Talent Code
When your developers cost $75 an hour including overheads, paying people for those 10,000 hours is an extremely costly proposition.
Everyone wants to hire master engineers, but it's not like master engineers are available for hire.
For programmers, most of the initial chunk of that time is through hobby programming or through formal training at a college or the like. That's 3000 hours that the company didn't pay for. That's probably the experience most programmers walk in to any company as a Jr Developer, and they are paid accordingly. Nobody is being offered $150k/yr with that level of experience. Maybe $30-$40 depending on where they are working, and then are promoted and given raises above that.
Of course these things are company-dependent, but I'm a comparatively junior developer and for purposes of internal costing my employer costs my time at $75 an hour.
In all seriousness, this is ridiculous, of course natural talent exists, what gladwell et al are really getting at to me is that it's not enough to have natural talent and execute once. That isn't how success works in the real world, even if it outwardly appears that way. I have Los of friends who are artists and I moved cities last year from one where the local ar school was very practically focused to one where the prominent art school is obsessed with concept and object art. The art and quality of artists in the new city is laughable, apart from those who have been trained in and practiced their craft elsewhere or in their own time however. It's an inescapable fact that if you want to be good at something you need to practice and fail.
Well then, what is natural talent, how do you objectify and measure it in a person, if it so obviously exists?
Success is best correlated with time invested in skill development. Natural talent is bullshit, it's like attributing height to a basketball player's success.
My point was, skill and hours practiced are far better predictors of success than a voodoo attribute like natural talent. In the above case, I tried to use height as an example of a "natural ability" person could be advantaged in.
There are some areas where I am quite frankly talented. Once I get Perl coding on accounting software, there is very little that can stop me and quite frankly I can outperform nearly any programmer I have ever worked with.
On the other hand, there are also things which I cannot do very well no matter how hard I try. When I was in college for example I used to be able to help struggling students in areas like analytical geometry understand the problems and go from getting C's to getting A's. But I couldn't get above a C myself.
I don't know why you can't score A's at math though. It makes no sense to me as to why you can help others get good grades but can't get good grades yourself. It probably means you lack the hours applying through repetitive practice.
Similarly in chemistry lab, I could help anyone else but I would invariably run all the right tests on all the wrong samples. This made me a great lab partner but a disaster on my own.
As I have gotten older I have learned coping mechanisms but some things I can't do and I pass those onto others.
At the same time I have always been top of my class in many things, while putting in quite a bit less effort than average. These ranged from history to some of the sciences, to some cases of math (calculus, some algebra).