I believe that we should teach everyone to code, even though I accept the reality that computing can be inherently complicated to include and maintain in a general curriculum.

I don't know if Tim Cook can code. Despite Steve Jobs' fantastic ability to do talk to a technical crowd about WebObjects [0], Woz claims Jobs never wrote a single line of code in his life.

But Tim Cook is Tim Cook, and Steve Jobs is Steve Jobs. For all lesser people, coding is both a powerful skill and more importantly, a profound way to think, never mind a medium for better understanding the computers that are inextricable from modern life.

Yes, the "Should you learn to code" debate is a frequent one on HN. I've found that when I disagree with people here, it's because we differ about what programming can do. I don't see programming as a means to be a web dev, or dev ops, or data scientist. I see it as something more basic but more universal: the ability to make machines do exactly what we want.

I teach journalism at the university level. And I force all journalism students to learn SQL, even as most of them have never done any type of scripting. My initial motive was because SQL was simply the most direct way to deal with bigger-than-Excel datasets and to do JOIN operations. I've come to appreciate that SQL is the most concise way to describe what we exactly what we want to do with data -- e.g. the simplicity and explicitness of SORT and GROUP BY, compared to memorizing the Excel menu actions for sorting and aggregation.

Because I learned SQL on the job long after I studied computer science, I never really saw it as a proper programming language. To this day I don't even know to define variables and functions in SQL. But now, I see that it still embodies important programming fundamentals, including how the interpreter is literal and unforgiving, how we have to know and state exactly what we want because the interpreter doesn't assume, and how important is to know exactly what you want and what you expect -- determinism and reproducibility are inherent attributes of programming.

To give an idea of how far removed today's college students are from what computing is at its core: on the first day of SQL, I explain how SQL is a language, and instead of button clicking, we write out what we want into the client using SQL syntax. Inevitably, a student will interrupt and ask how somehing about why the client isn't running my code. Or, how do we know when we've made an error.

After a few years of this, I understand their confusion: they see me type a SELECT statement into the client, and yet nothing happens. Well, of course nothing happens because I haven't told the client (or REPL) to execute it. But these students are so confused because they simply do not use software that waits for the user to execute (or, not so long ago, clicking the OK button). Think about it. Typing anything into Google Chrome's address bar causes an auto completion to execute. Same with Facebook. With things like Snapchat/Tindet/Instagram, you don't do anything that remotely feels like executing a typed-in command (most users probably think a Google search query is basically an executed command).

So IMO, learning programming is useful -- not necessarily to become a developer -- because you can be aware of the principles of computation without having to take a course that covers logic gates/NAND/ALUs/Assembly, etc. I teach Python for elective classes. But if journalism students don't take any other programming classes, at least they can put SQL on their resume.

[0] https://www.youtube.com/watch?v=goNXogpwvAk