By Harry Keller
Editor, Science Education
[See Harry’s related articles: Is Building Apps for Everyone?, Need More Software Engineers? Teach Thinking Skills Better, and ‘Computer Science’ Contains Little or No Science. -Editor]
Many educators seem to be promoting the benefits and even the necessities of teaching computer science courses before high school graduation. I have not seen any of these people suggest which courses to eliminate to make room for this new course. Despite this, many suggest that computer science (mostly translates to computer programming) be a required subject.
I have seen some say that writing software should begin in kindergarten. Others decry its absence from middle schools. Finally, quite a few lobby for adding it to high school curricula. As you might expect, the origin of each is from practitioners in each. Exposure to the basic concepts of computers, what you might call the “nature of computing,” is a good idea, but the rising din of voices telling us to add computer programming classes throughout our public education system should be tempered by reality.
Much of the pressure comes from just a few arguments and assumptions. Most of these are fallacies. I list some below and explain them.
1. There is a huge job shortage and high demand for computer programmers.
This may be the most recurrent theme for those promoting computer programming in schools. There are two problems with this argument. Large businesses, the ones making the most noise, are inflating their numbers to further this bit of misinformation. Also, the numbers do not indicate the level of programming skill required for these jobs.
The reason for the inflation is simple: H1-B visas. By importing computer programmers from other countries, these huge companies can keep costs down in two ways. They pay those H1-B programmers very low wages. You’ll find the workers sharing small two-bedroom houses with as many as ten people in them. Secondly, low wages for the immigrants help to keep wages of our citizens low as well.
Even if those numbers were anywhere near accurate, they do not reflect the specific computer skills required. (See 7 below.)
2. The skills you learn writing software in fifth grade or tenth grade will translate into job success.
Schools are not intended to be job training factories, and today’s fashionable software may soon be obsolete. Learning to write in this or that language can be quite valueless as a specific skill. Just ask the many students who learned PL/I or Algol.
Furthermore, writing the sort of toy programs you’ll see in K-12 courses is not very good training for the real world. A wide variety of skills come into play when you are doing industrial-strength programming.
While you may be able to find some good reasons for teaching programming to young students, making jobs for them is not one of them. Instead, focus on good reasoning and thinking skills, especially critical thinking and communication skills. I like science for these, but nearly any course can provide them.
3. Anyone can become a computer programmer.
You might as well tell me that anyone can become a professional musician or a profession artist or an NFL football player. The capabilities we begin life with plus the abilities we develop in our early years shape our potential. Writing software requires strong analytical abilities, good abstraction, enormous attention to detail, and a personality that can stand lengthy rejection by an impersonal machine.
Creating software is not for everyone. Some may be so disheartened by the attempt that they reject technology in general as a result. We should not be pushing a course onto those who by their innate abilities or their personal inclinations are not suited to it.
This is not to say that teaching some version of computer science is a bad thing. We should be teaching the nature of computing, just not forcing every student to attempt programming.
4. Changing our school curricula will alleviate this demand.
The idea that you can create more computer science majors in colleges by giving them programming classes before then lacks any data to prove the case. Mere exposure to the nature of computing before college should find any students who may be interested in this career path.
Today, we must train our students to think critically above all. Coding does not do that, and it’s not appropriate to take time away from other studies that may in order to satisfy some inflated demand. Those students will be in the workplace for many decades. Do not sacrifice their future for some imagined current crisis.
5. Everyone should learn to write computer software.
Why? That’s the important question you should ask when any such assertion is made.
Who will benefit from this change and how? Writing software requires that, first, you learn the syntax and semantics of a computer language. Any language that can allow serious programs to be written tends to be very complex. Programming requires analysis of a task to be performed by a computer, a time-consuming job by itself. It then requires careful breaking down of the task into small, codable segments. You code the segments and then test. Testing is another entire discipline. Typically, people take years to master this stuff.
I can see teaching a simple form of spreadsheet macros or some trivial pseudo-language, and that’s really enough programming for most students.
Once initiated into software in a small way, some people will just love it and seek more. Others will detest it. These days, the Internet provides more than adequate support for those seeking to learn more about programming. Once in college, they can learn much of the details, theories, and discipline that accompanies software engineering. Actually, someone with no programming experience at all but with an aptitude for it can learn everything necessary to be a programmer in four years of college.
Only one thing is necessary, and that’s for students to understand what computing is really all about. Those with an interest will pursue that interest.
6. A substantial and ongoing computer science graduation rate will help the economy.
If those students have little aptitude for software, attempting to train them in software engineering will not help anything. The least capable graduates will be competing at the bottom of the profession against good students in Russia and India who will work for much less money, possibly even below our poverty level here.
Even if the job market for software professionals is as great as people say and even if our schools can crank out enough graduates to meet this demand, what happens once the demand has been met? The demand will not increase as rapidly as graduates emerge. The machinery will be in place — courses, professors, school recruiting, etc. — and won’t suddenly shut down because the demand has been met. Were all this possible, and I think it ill-advised, you’d create a glut of programmers competing against the world where living costs are significantly lower.
No matter how this problem is addressed in our schools, the results will not be what we seek. Our economy will not boom just because we train more software coders.
7. All computer programmers are equal (interchangeable parts).
No one says this explicitly, but it’s implicit in the remarks made. The available jobs will vary considerably with respect to the talent required. Someone who knows databases will not be doing GUI work. Only those with real-time experience (or geniuses) can jump right in and do real-time programming. Embedded CPUs will be a huge problem for most CS grads. And so it goes.
Another relatively little known fact about programmers is how widely they vary in productivity. In many fields, it’s possible to see ratios of two to one. In some, worker productivity may rise to as high as ten to one in particular areas. Software engineering is unusual in having ratios as high as 100 to one. Due to simple slow coding, errors, time for documentation, and necessity for repetitive testing, some programmers produce only an average of one or two completed lines of code per day. Others can exceed 100 lines per day, tested and documented.
Just because there are a certain number of jobs and a supposedly equal number of grads does not mean that all of the jobs will be filled or that all of the grads will find jobs. In fact, it’s extremely unlikely that even half will match up. It’s like saying that there’s a certain level of demand for teachers without indicating how many ELA, history, math, science, and other subjects the jobs are for. You’d also have to indicate grade level and other information as well. It’s like that for computers as well.
The above are my opinions based on years of following this market and reading the ideas and opinions of many others. I spent a large part of my career in various computer-related jobs. In one, I supervised the creation of a new computer. I have created software in at least a dozen assembly languages and in BASIC, FORTRAN, C, C++, Java, and more. I have built databases in several major relational database programs and even one that was not relational. I have built real-time software, GUI software, drivers, embedded CPU software, and much more. Some of my projects have been for Fortune 500 companies and have included mission-critical software. I have managed, supervised, and worked with too many programmers to count. I write the above so that you will know that I understand this area.
I do welcome comments about the value of including computer programming courses in our public K-12 schools. This is not a trivial matter to be dismissed with a neat column by those in favor or those opposed (like myself). Before committing to a huge investment in people and equipment, all aspects should be aired. My article here intends to help that process.