Personally, I mostly hear such complaints/requests from companies that are involved in providing some sort of infrastructure for their own applications or for sectors of industry. I suspect that is simply a reflection on where C++ is most important so they talk to me, and that the problem is ubiquitous in organizations that provide large complex systems. I consider the problem/need universal. The US industry could absorb more good developers than there are currently students enrolled in IT-related programs but not all of those programs and all of those students would qualify as good in this context.
Take a simple example: A friend of mine looked at the final projects of a class of third-year CS students from a famous university. Essentially all had their code littered with magic constants. They had never been taught that was bad style in fact they had never been taught about programming style because the department taught computer science; not programming. That is, programming was seen as a lowly skill that students either did not need or could easily pick up on their own.
I have seen the result of that attitude in new graduate students: It is rare that anyone thinks about the structure of their code or the implications for scaling and maintenance those are not academic subjects. Students are taught good practical and essential topics, such as algorithms, data structures, machine architecture, programming languages, and systems, but only rarely do they connect the dots to see how it all fits together in a maintainable program.
Robert Dewar made an essential point. The companies are complaining because they are hurting. They cant produce quality products as cheaply, as reliably, and as quickly as they would like. They correctly see a shortage of good developers as a part of the problem. What they generally dont see is that inserting a good developer into a culture designed to constrain semi-skilled programmers from doing harm is pointless because the rules/culture will constrain the new developer from doing anything significantly new and better.
Also, people in industry tend to be impatient. To significantly improve the results of education takes years. Remember, the 2012 graduates are already in university and the 2016 graduates just entered high school.
The magic constant example is indicative. Few students see code as anything but a disposable entity needed to complete the next project and get good grades. Much of the emphasis in teaching encourages that view.
The students I saw were neither stupid nor lazy; they were simply systematically pointed in another direction. Next, I looked at the textbooks used for beginning students and found them fairly accurate, but tedious, uninspiring, and dodging important hard issues. They never went beyond the basics most of the C++ standard library was deemed advanced and at best presented towards the very end of a semester course. Worse still, they were insufferably verbose and obsessed with technical details.
Had I been given such books as a 1st year student, I would have changed fields. Those books were trying to spoon feed the students. Good students need to be challenged! The contemporary Math, Physics, and Biology books I have seen are far, far more conceptually challenging than what we present to CS and engineering students in the area of programming.
So I designed and taught a beginning programming class several times using slides and notes that I wrote along the way, replacing the traditional textbook we started out with. My textbook Programming Principles and Practice using C++ will be available in December 2008. Im also making supporting material, such as lecture slides, available so I hope some of my ideas will see wider use.
One thing thats different is that I sat down and asked myself: what does a student have to know before starting a first project to produce code for the use of others? Assuming supervision for that first project, my book and course is an answer to that question. The answer includes error handling, class design, file I/O, graphics and minimal GUI, standard library containers and algorithms. It also presents the basic principles of object-oriented programming and generic programming.
The aim is to instill a degree of professionalism; to get to the point where the students can write software suitable for the use by others than themselves. The book presents more material, more advanced material, and moves faster than other books aimed at that level of student. Apart from that, it is quite conventional. You could say that I expect more from my students and trust them more than is conventional. I assume them to be adults. So far, it worked for many hundreds of students.
What should high schools do to prepare students for university-level software development? When I entered a Math course as a 1st year student, the department head said something like this in his welcoming lecture: I dont care if you know math well teach you that from scratch but I hope you know how to work hard and to read & write English, because youll need that to keep up. I think he had an important point: current freshmen appear to have been spoon fed and many find it hard to adjust to independent work and to shake the impression that you work only to improve your grades.
High schools could teach students to work hard at something (just about anything), to search out information as needed, and learn to express their ideas in writing and orally. Project-based work is good for that. Exactly which programming language is used for software is less important, but the aim should not be to make tasks as simple as possible but to challenge students.