Tuesday, March 31, 2015

Teaching Computer Science without Teaching Coding

I'm all for teaching more people how to code, but let's be clear that it's possible to understand a lot about how computers work, and about computer science, without knowing how to program.  And if we insist that people learn how to program before they learn how computers work, we will be setting up a barrier that will ultimately prevent most people from learning how computers work.  Because most people find coding boring and don't have the patience or motivation to learn all the tedious details required to get programs to work.  Why not teach the interesting concepts first as a way of motivating people how to learn to code?

I'll also note that people can -- and many people do -- learn how to program without learning grand ideas of computer science.  Learning these grand ideas, like computational complexity theory, will make someone a better programmer.  But many programmers never get that far.

I think we can teach basic aspects of how the Internet works to someone who does not know how to code.  I also think we could explain basic aspects of computational complexity theory to someone who does not know how to program.  For example, I think most people assume that all computational problems are linear in the size of the problem input.  Imagine it takes 1 second for a computer to add up a million numbers.  If you double the difficulty of the problem, you will double the time required to compute the answer, right?  Meaning that in this case, it would take about 2 seconds for the computer to add up two million numbers?  That happens to be the correct answer for this computational problem.  But the fact that some computational problems are worse than linear will astound most people, I think.  For example, for some problems the time required to compute a problem solution is the square of the difficulty of the problem.  But it is easy to explain examples of hard computational problems, like the Traveling Salesman problem.

So let's not think that learning to code is a prerequisite for understanding grand ideas of computer science, just as learning to be an auto mechanic is not a prerequisite for learning basic concepts of how cars work.

Sunday, March 29, 2015

Every Educated Person Should Learn the Grand Ideas of Computer Science

We take for granted that educated people should understand the grand ideas of science.  For example, the Big Bang theory, the theory of evolution, the atomic theory of matter -- these ideas are major human achievements.  They are also fun and beautiful ideas that are essential to understanding the world around us, and to participating in our increasingly technical society.  Every high school student learns these ideas -- you don't have to earn an undergraduate degree in biology to learn the theory of evolution. 

Unfortunately, high school students do not learn the grand ideas of computer science.  I believe that most non-computer scientists do not know any of the grand ideas of computer science, nor could they enumerate the subfields of computer science.  Most people equate computer science with programming, which is a bit like equating physics with electronics design.  Computer science and physics are the sciences behind the technologies. 

I posit that all high school students should learn the major results of computer science at a basic level: ideas such as computer networks, operating systems, development of programming languages and databases, artificial intelligence, computational complexity theory, and computer graphics.  I believe that the major results from these subfields could be explained at the high school level in a month.  I also believe they could be explained without teaching students how to code, and that the recent emphasis on teaching coding is a distraction from the bigger and more important notion of teaching the grand ideas of computer science to every member of our society.