We have the same problem over here.
The kids have grown up with VisualBasic, C# and PHP - HTML
is not a programming language and does not have anything to do with computer programming!!!. That is in-and-of-itself not a problem, I learnt BASIC, C and Pascal when I was growing up and I tought myself assembler.
What is missing, is an understanding of the hardware and how it works.
That is what made my generation, on average, better programmers than the average new programmer today.
Most courses today concentrate on readability of code and elegance. None of the trainees (or even younger, experienced programmers) that I've worked with have had a clue about optimising code for efficiency, based on the processor they are using.
Most look aghast when you start editing their code to do simple things, like changing tests (if statements, for, while etc.) to always test for positive results first and dropping through to the negative, where possible. Testing the negative might make more sense to a human reading the code, but it slows the program down dramatically. Testing for a positive is more efficient and uses fewer processor cycles.
The problem is, on a single use, modern PC, you usually won't notice this when you are programming on your own machine, for yourself. When you start coding on a machine that is being shared by hundreds of users (terminal server, web server, mail server etc.) that starts to make a huge difference.
Status messages also seem to be ignored. We often get displays showing which files are currently being copied or installed. That wastes an incredible amount of time, even if it is 1 of 10,000, 2 of 10,000 etc.
Two examples: I came onto a project for consolidating corporate accounts. It exported the data to a file for transmission to corporate headquarters. This code took about 1.5 hours to run. I had to change some other things in the code, but needed to export the data at the end of each test, to look at the results. The 1.5 hours soon got on my nerves, so I looked at the export code, to see if it could be optimised. It exported many thousand accounts and said which account it was exporting as it exported it. I changed the code to only output every 10th account, that reduced the time to 1 hour. Changing it to every 100th account dropped the export down to around 10 minutes!
The second example: I joined a company that made e-shops. The programmers had really complex code to generate the menus from even more complex queries on the database. The menu structure could take over 40 seconds to generate, when the web server or the SQL server were under load. Obviously, this was a big problem for an e-shop and when the store appeared in the PayPal newsletter, the project manager would sit at a console and restart the MySQL process every 2 - 3 minutes, because it was choking! The web server side had 4 load balanced servers, each of which could handle around 50 requests at a time, before they collpased in a gibbering heap.
Looking at the code, I set the programmers the task of testing positives instead of negatives, even if it seemed more logical to test for the negative. That saved about a second per request when the server was under load.
The bigger problem was the SQL code. Nobody at the company had any database analysis and design experience. It was too late to re-design the database, it would have taken weeks of effort to change the whole system to work with a more efficient design, so the task was reduced to finding a way to optimise the queries that were called.
By looking at how the queries were made up and looking at the detailed optimisation documents from MySQL, I re-ordered the joins in the query and moved some of the logic from the join itself to the WHERE clause. Re-ordering the checks into biggest to smallest influence also helped.
In the end, the query went from an average of 20 seconds (40 seconds on a loaded server) to under 1 second to execute.
The next time they had a PayPal newsletter, each server was coping with around 250 transactions at a time and they were being returned in under 2 seconds on average. That was a huge improvement.
This is why an understanding of how processors (or database servers) work is more important than being able to just write elegant code. The code we produced after the optimisation was still elegant, still readable, but for the computer it was also much more efficient and saved an incredible amount of time!
I did Computer Studies at school and Computer Science at college. I didn't learn much on either course!
I did learn something about processor design on both courses and that was the most important thing I learnt. But most of the coding I taught myself, either from books or looking at code printed in computer magazines, like Comput & Video Games, Your Computer or Practical Computing.
At school, our teacher took the CSE exam with us! He didn't know much about computers and there were two of us in the class that had computers at home and knew how they worked and how they were programmed. We ended up pretty much running the practical sessions of the class, with the teacher asking us how things were done at first and then the other students bypassing him and coming directly to us after a few lessons.
Even the O level course came to me to get code debugged, before handing it in - I wasn't allowed to do O level, because I was in a lower Math set!
My first day at college, we had to write a simple BASIC program on a Commodore PET to calculate the minimum number of coins required to give change. I had that finished in the first 10 minutes of the 90 minute lesson. I spent the rest of the lesson writing machine code (no assembler available) to draw a border around the screen, split it in two, with a horizontal line at the bottom. It poled the keyboard and displayed huge numbers at the top of the screen and displayed little piles of coins at the bottom... The teacher looked at my running program and said "oooh, I didn't know you could do that with a computer!"
That pretty much summed up the course! I did learn some things on the theory and discipline side, but on the practical programming side, I was way ahead of my teachers.