Here's the thing. I don't have a CS degree. I can program financial systems pretty well, but I am not a CPA either. I know enough about these things to have intelligent discussions with accountants and CS experts.
However I engineer frameworks for building accounting systems. I can do this self-employed. Nobody asks me for credentials. People find the software and they come to me for services. I also provide database consulting.
However from time to time I get job offers. During tough times I have inquired about them only to find out that I am "not qualified."
So I am "not qualified" to do a job for which they will pay me less than what folks pay me otherwise, largely because I do not have a piece of paper saying that someone else says I passed some classes. So I don't care, get back to running my own business, and work on growing that.
Excessive credentialism is a problem here. Companies don't know how to recruit, and they expect HR to do the wrong things. Resume-screening by HR is the single biggest problem in employment in the US today.
That's usually the key point. I have a number of friends without college degrees that do just fine. Their usual modus operandi is to meet someone from the company at a conference, consult for them for a while, and then get hired once the company sees how awesome their work is.
I wish this weren't needed, but hiring managers function under conditions of very low information, and they wade through too many resumes of low quality to avoid filtering it on some criteria. Degrees and GPA are the most easily quantifiable filtering criteria, and so that's what makes it into the filtering software.
I think what's ultimately needed is a way to reveal more information about a candidates' abilities in a very short amount of time. Contract-to-hire works for this, but has the problem that many candidates (and in particular, good candidates) don't have time to devote to a project that may lead to a job. So does tokenadult's persistent suggestion of a work-sample test (and HireArt's implementation), but these both have the problem of being able to cut down an employee's daily duties into a small problem that can be given as a short task. Many of the skills that a really experienced employee brings to the table are only evident on long, hard, extremely challenging problems.
Or let's say someone with Java experience is available but you are looking for Scala. I just use these as the initial comparisons but I'm sure there are more. Can you not let the python person train up on Ruby on Rails and have a strong candidate?
I understand its best to match one to one what is being looked for, but I wonder how many good candidates are being passed by because they don't fit the perfect stack but are likely able to perfectly adapt.
I think in most companies yes, they're off the list. Bottom line-ism is king these days. Companies see bringing someone in and up as a cost, not an investment. All they want to do is pull from the well, but not put anything in. They want perfect fits, and they want other companies to make them. It sounds like a frighteningly random and risky policy.
You can find this paradigm in many econ/business courses. You invest in capital; you pay for labor.
I expect I would have significant trouble getting hired to do a different specialization, like parts of a videogame engine (say c or C++ or python or lua). So as long as database backed websites are in demand I'm probably ok, but if those disappeared tomorrow I could become a statistic - if everything becomes apps, I'll manage, but that round of interviewing won't be as easy as the last few rounds of interviewing were and I'll probably have to take some personal time developing a demo to talk about.
I've seen two friends with mainframe experience end up having lots of trouble finding new jobs - they could certainly program, but had nothing they could point to that seemed relevant to the web dev jobs. And a friend who works on videogame engines is trying to make a switch to websites and it's looking hard to make that switch.
So, I don't think it's strictly along language lines, but I do think employers are hesitant to sub in one type of programmer for another. I'm not convinced they are wrong - there's lots of specialized knowledge to pick up along the way that mostly seems to be taught by screwing up a project at some point, and it's safer to hire somebody who has already screwed it up elsewhere once.
But that's rails... ruby is a pretty strong language, and it's a much closer map to python than other options. As for your other languages...
Someone who's spent their life in PHP with no experience outside that language? At this point, I'd probably pass on that resume. The problems I deal with require a breadth of experience in deeper software engineering-y topics: networking, storage, maintainability... my assumption would be that you haven't been given hard enough problems that require you to get outside of the PHP box, if that's all you've ever done.
Similarly Java vs. Scala. I see a lots of J2EE resumes, and my experience with interviewing those folks is they may understand the J2EE/Hibernate/SOA/webapp stack, but when it comes to non-webapp problems, they're lost. I'd be more likely to talk to someone who has Java, C and Python experience, but no Scala, than someone who's got a broad Java base but has never branched out of that particular language. Scala experience, whether or not immediately relevant, is more likely to be correlated to be harder problems, self-development and exploration -- at the very least, that someone is trying to keep up with industry trends.
Maybe my J2EE and PHP judgments aren't fair; but they're heuristics developed over some time.
As a guy who's always looking for advice on getting an entry-level position, I've been told to learn a dozen or so technologies before applying for a junior position: HTML, CSS, JS, Python/Django||Ruby/Rails||PHP, Linux, Data Structures and Algorithms, Photoshop, Design Principles. I also need to have some good quality projects and approach hard problems, which can be time-consuming and difficult on your own. Even then, some places filter out candidates who don't have a CompSci degree.
To me, this seems a little high for a junior position (Any company, not Google) and sounds more like a full-stack web developer (I'm just shooting for a Front End spot). With no professional experience, there's no way I'm going to be proficient in all of those domains unless I spend a long time learning on my own and that doesn't exactly pay the bills.
As the problems get harder and more people drift towards CompSci, the requirements for even a minimum-level position will continue to increase, while the time to learn all of the requirements remains the same. This will hurt the talent pool in the long run, although people that have been riding the wave will command very large salaries if the talent gap continues to widen.
The way I would approach it if I were gunning for an entry-level frontend dev position would be to just start building webpages. Start with HTML, and layer on CSS. Make it interactive with Javascript. Now serve it up from the backend with Django/RoR/PHP, which will also teach you Linux. Work with it for a while and you'll see the reason to learn Design Principles. You don't have to learn everything about those topics at once, but as you face new problems with your webapp, you layer on new skills.
Having some experience in one of those frameworks is certainly useful but it's not really a requirement of being a front-end dev.
As long as you're intelligent and can use Google you'll pickup working knowledge of a language or framework quickly. This is why the best companies hire people based on who are they are, not what they know.
There is also the semantic issue of how deep one must understand a language or framework. For example; I build custom WordPress themes and have a general knowledge of PHP but I'd never put on my resume that I know PHP. Not because I don't want to work with it, but because working knowledge doesn't constitute extensive knowledge.
If you want real advice for getting an entry-level position, it's actually quite simple. Step one: build things. This will help you develop the necessary skills to contribute to a team. Step two: tell people about them. The majority of job openings are filled through referrals and networking; sending in resumes to job postings online is a very inefficient use of your time.
I feel a lot of employers are exceptionally bad at communicating their actual requirement. Ironically, one of the sure sighs that your job description is bullshit is having a line that says "excellent communication skills". Anything about "fast-paced environment" too.
Bringing it back to tech specifically, in my (anecdotal) experience people are rarely bothered by lack of knowledge of a specific framework assuming that the candidate has experience in something similar, or more generally if it is safe to believe that the candidate can get up to speed and contribute in a reasonable amount of time.
At this point we are of course just comparing anecdotes. I will also note, though, that there are a lot of very different subsectors within tech, and hiring practices vary widely between them. In accordance with the venue I am here mostly referring to startups (including late-stage startups).
I suppose the salaries of engineers are evidence enough that there is a talent shortage. Though, I've been perusing for a job and would not respond to maybe 85% of job postings because companies can't clearly articulate what they do and what the position they're offering is. I've been to plenty of interviews where they clearly haven't looked at my github, and then ask me odd, incredibly domain specific algorithm questions, and then turn me down as untalented. I've been to plenty of interviews where they think I'm talent, but in all their bragging about how talented their team is, I see signs of lazy engineers.
I think your judgement of how small the hiring problem is is way off. Coupled with companies' unwillingness to hire and train mid-level engineers to senior level (which really only takes a few months with an interested candidate) is the bigger problem.
Re job postings, most jobs are not filled through job postings. If you want to find a job at a company that knows how to hire, you will have much better luck if you find the opening through networking or a referral. I have literally never got an engineering job through any other channel. (Note that this does not serve as evidence toward your indictment of HR, most networking/referral hires still go through HR to at least some extent).
Yes these can be learnt by a motivated junior developer reading books and the like, but they can be taught and explained better and faster by a senior developer.
Case in point when I started at a real programming job, I already knew how to program pretty well, but it was the other organisational and system design concepts that I needed help with.
Pragmatic Programmers was always a fun start for me back in the day, even some MS Press and plenty of O'Reilly.
Most of what I learned came from blogs and time spent at a computer, however.
There's no substitute for practicing the art of programming to learning actually useful programming skills. Write, run, rinse, repeat. Have fun :)
Oh and when applying for jobs, I found http://pragprog.com/book/algh/land-the-tech-job-you-love useful.
It comes down to living in the trenches yourself or learning from someone that has already done so.
Yes, hiring unexperienced people and training them is an option, but you can't do that for your entire engineering team. Hiring new grads isn't a problem, hiring people senior enough to make those new grads productive is.
In short, not only is this post an advertisement, it's not even an accurate one. The talent gap is a significant problem, and it's only going to get worse if we don't acknowledge it.