Everybody does not need to learn to code.
slate.com
slate.com
In middle school, a special instructor was brought in to teach programming to the GATE kids. She decided she could only handle one student. So out of the entire class, only one kid was exposed to programming in school
When it was time to enter high school, there were two public schools in the area. One had an AP Computer Science class, but the student body was notorious for its high rates of drug abuse. My parents stuck me in the other, which offered no programming classes at all.
In college, I applied to be a CS major, but I was required to choose a second major since CS was impacted. The school admitted me into my second choice of major. Despite pleading my case with the CS department and arguing with the provost after I enrolled, I was unable to switch into the CS major or take CS classes.
I don't mean to whine. I'm sure I had it a lot better than many self-taught programmers. And maybe if I fought harder, I would have gotten in. But the education system did me no favors in learning CS.
And when I see politicians and Silicon Valley billionaire executives lamenting the lack of skilled programmers in the U.S. while doing nothing effective to fix the problem, I have to roll my eyes.
It matters because that's exactly what this discussion is about: making coding/programming part of our educational system.
It's about teaching kids programming in schools, and providing them with the same time, resources, and instruction they get to learn cursive or algebra or home economics or English.
Of course, we could always get rid of those subjects too, and expect the kids who are interested to learn them from books in their free time.
Also, not to cast aspersions on your upbringing, but how were you introduced to programming? Did you have a computer in the house or at a friend's house? Or did you just imagine sitting at a computer, and imagine typing commands into a computer, and imagine the results? Perhaps home computers are commonplace now, but it wasn't always the case. And it's not always the case in poor households. Is it likely that children from poor families and attending poor schools would have the same exposure to programming that you enjoyed?
We've been teaching kids math, writing, reading, etc., for centuries (and we still struggle with it). But coding is relatively new, and our educational system doesn't know what the hell it's doing.
This is a major problem for adults learning to use computers in general, and for programming in particular. If you're afraid of poking at a system and possibly breaking it, it's very difficult to learn how it works.
I was taught long division as a child. Didn't like it; who does? Nor do I use it.
But...
When I was 15, I finally got a chance to study programming. One of the first things our professor showed us, was how to do string-based long division, with a computer.
The enlightenment was profound.
Why was I doing this, when everyone else was learning to symbolically find quadratic roots on paper? Why do we teach algorithms for years, and never, ever teach Algorithms if you don't specifically ask? Why is Al-Khawarizmi's legacy in education Al-gebra, and not Al-gorithms, which are actually named after him?
Currently, the answer is "if you want to get into college / learn more advanced things, you have to learn to do this, all by hand."
The answer should be "Well, if you want to get into college, you're going to have to learn how to program that calculator yourself. So you need to understand how to do what it does, or you can't tell it what to do".
The difference is huge.
The real answer has always been that you need to learn intuitively what "division" actually means, and we have no clue how to teach that, but doing it by hand seems better than the alternatives. I'm not sure if teachers just choose not to phrase it this way or they don't know either (in which case the real reason is because they were told not to allow calculators). But calculations are easy. Intuition is hard. Until we have better ways to teach intuition, I'm afraid we'll have to keep trying to let kids build it via forcing a slow-down of the thought process by having them do it by hand.
A better example would be integrals and antiderivatives. One can certainly learn how to "find the integral" just by using antiderivatives. One could learn how it applies to the real world, as well. "A ball is moving at 30m/s for 10 seconds, what distance did it travel?" Increment the exponent, divide the coefficient, plug in X.
But then kids approach, say, revolutions of solids. Suddenly, due to the way they're taught, they think that there are different formulae for rotating about the x and y axes. If they're taught how to construct the Riemann summation from scratch, see the relationship between that and integrals, and see the relationship between a curve and its revolution, I think that's when they start to get the idea of what an integral (not an antiderivative) really is.
It's the difference between saying:
I want to find the volume of y = x^2 rotated about the x axis. I have the function and I know I need to multiply it by the formula for a circle and then integrate it.
vs
I want to find the volume of something. I can describe each point on the cross section. Each item in the summation can be described as circular. I can describe all of these circular sections at once by adding them all together. The integral is that sum. I can find that integral by finding the antiderivative of the original description.
Which seems more "true?" Which is more difficult to teach? If kids always used calculators to pursue question 1, they'd never arrive at the problems that would let them arrive at question 2.
Really? I mean, I guess I don't like long division; nor do I dislike it. But I like being able to get its results, and I do it all the time in my head. What do you use instead?
Personally, I like the ability to at least be able to get a rough approximation of an answer without having to resort to tech... but hey, call me old fashioned.
Well, that's what all good programmers do, so it doesn't look like not being good at math as been a disadvantage - quite the opposite I'd say. Sometimes you need to tackle things from a slightly different angle.
That sounds so inconvenient. Sometimes I like to design programs or solve problems in my head when I'm in the swimming pool. I don't think they'd let me bring a calculator or phone in there.
Professionally, I write parallel OpenCL software used by the mathematics, physics and chemical engineering communities. The irony is not lost on me.
EDIT: When I need to approximate long division, I multiply up from the divisor towards the dividend. I find this dramatically easier. My mother is incapable of subtracting in the normal sense, and does the same operation with addition.
Most of my clock cycles, when I'm thinking, are playing a complex and ever changing set of arpeggiated notes. While I suspect that this is my linguistic ability functioning in some kind of overdrive, I have no particular insight into the exact process.
- Studying medicine at school so you can avoid engaging with the expensive medical system for all but the most critical issues? - Studying law so that you understand how to read contracts and understand legislation?
Mathematics and language are the building blocks of programming. We study those. Going further upstream into the outputs of those disciplines (medicine, law, computer science) to pick compulsory topics doesn't strike me as making much sense.
Also, how do we reconcile this with the emphasis on design whereby the concept of the underlying nuts and bolts should be abstracted away from the end user? (two very separate questions I know)
I would figure a lot of what you pay a doctor for is not to mend every problem you have with your body to but to ensure that it's done timely, safely, and with the least amount of risk/damage/scarring/whatever as possible. Yeah you could probably do your own surgery but why?
Learning to code is hardly as serious an undertaking and yet it teaches you how to think about solving a problem, estimating time to solve that problem, and reducing the amount of time needed to create the solution to that problem. It teaches general problem-solving skills and at the very least can lead to recreational uses (building small games or family web sites).
I think problem-solving is probably one of the most important skills one needs in his toolbox to succeed in life and so why wouldn't it be taught as early as children can comprehend it?
This is the key statement. But I don't think it needs to be taught through programming, people were problem solving way before the invention of computers, or even electricity. I know this is HN so we have a biased view on this, but the ability to think/problem solve and programming do not go hand-in-hand.
I certainly agree that everyone should have exposure to programming, and the opportunity to pursue this further if they so wish, but to thrust it upon everyone is not the answer - not everyone will end up in a job where IT is the main focus.
Mathematicians are generally doing ad-hoc applied computer programming in order to carry on mathematics at this point. Give the academy another 50-100 years to figure out what this means, if anything, about the fundamentals of each discipline.
I think we'll conclude that advances in the rest of mathematics are all built on computable mathematics now, including proof, making computation foundational until/unless someone finds a more powerful approach.
PS: There are no doubt mathematicians reading this, and the ad-hoc part may make you bristle. If you can point me to a paper that begins with a proof of correctness, of both the hardware and operating system which ran whatever code was involved, I'll take it back.
Basic computer understanding is not, or at least is being taught extremely poorly. Children don't need to learn the intricacies of Word. What they should be taught is how to code (so they understand basics of computers/filesystems/text editors) & use Google (so they know how to find more information) - everything else they can teach themselves.
However, I don't think we need to force today's programming languages upon people. Let's invent the printing press of programming languages, making the cost of learning to program much easier. (IFTTT is working on this.)
But people who can do any of the above proficiently have many doors and options open to them that others don't. And those who can do it at least a little bit can at least have some awareness for when they hire someone to do it for them.
It is the mentality of imperative knowledge that should be considered when talking about teaching programming. Not the idea that all people should know how to compile Linux.
There is nothing special about programming; like learning a language, it is very possible to become competent, and anybody who is not mentally delayed can do so - it just takes effort. If you can code competently well done, but don't think yourself special.
But... Learning a little Spanish can increase one's appreciation for Spanish culture. Even attempting to learn some programming can make one much more effective when they hire or direct a programmer, or engage in discussions about online privacy, or ask someone to help analyze a problem.
"But people who can do any of the above proficiently have many doors and options open to them that others don't. And those who can do it at least a little bit can at least have some awareness for when they hire someone to do it for them."
In an age when people are starting to interact with computer more than with other people, it's certainly valuable.
I don't worry too much about novices building shitty things, because debugging crappy code takes way too much energy then learning the language, from my knowledge, nobody enjoys that unless they get paid. And IMO corporations hiring crappy programmers is a problem that has nothing with everybody learning to code.
The proper wording for what the retarded author intended (it's Slate, after all) is "Perhaps not everybody needs to learn to code" or similar, but the not needs to negate the universal quantification. Because negation is not commutative with quantifiers, what the title says is not the same.
I'm no JS expert, but... I thought that was a big NO-NO.
Here's a Stack Overflow post that outlines some of its pros and cons. http://stackoverflow.com/q/802854/1288
People talk about code "literacy" as though it's the 21st century equivalent to reading and writing, but this is crazy -- even as a programmer, I don't interact with any of my devices via code. Being a programmer doesn't help me troubleshoot Windows or get my printer working. I don't configure my apps on my iPhone using code; I use their preferences screens. I don't have databases I need to query using SQL, anywhere outside of my job.
Programming is a profession, period. It's not a generally useful skill like riding a bike is. It can be useful to teach in schools, but only in the same way high school chemistry is -- not so the general population learns it, but just so the students who might want to choose it as a career, have enough of an initial taste of it to realize that.
I think that is partly an artifact of closed source OSes. When I used OS X, I almost never fixed a problem with programming (other than a problem like "I don't have a program to do this"). Having switched to Ubuntu, I actually have found programming to be a useful way to work around problems.
Sometimes there's a "right" way that involves digging through documentation to find some random option, and an easy way that involves writing a shell script.
>It's not a generally useful skill like riding a bike is.
I totally disagree. It's not as useful as riding a bike, but it's certainly useful even when not used professionally. I recently was working out a recipe for a "one food to rule them all" inspired by soylent, and I wrote a program to calculate the ingredient proportions. It had nothing to do with professional programming, and it was incredibly useful.
Learning to program also teaches you a thing or two about problem solving and critical thinking. I have a 5 month old daughter. Guess what I will get her to play with as soon as she is old enough to start hitting the keyboard ? Yep, it will be programming.
Just knowing this setup below can let you do some really power automation of manual tasks and can save you a lot of time.
Example template in Python:
import csv
with open('mydata.csv', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
# Data manipulation hereBut this suggests a different way of teaching intro programming, one that is more tool-based than concept-based, a way that's about searching for the existence of a tool and then finding and reading its documentation or examples so that one can use it in a simple, encapsulating control program. If you don't know about the existence of imagemagick, are you going to think you can loop through all the images in a folder and resize them, or extract a subimage from them, or something else, without having to write a ton of code? Maybe not, but you might search for a command line program to do the hard part and discover the tool, or it might have been part of an intro programming course focused on "look at all the neat things general computers can do to save you time if you have this problem". Same thing with Python's csv module, which someone who has used Python for over a year in a CS class may not have even known was there all along. There are lots of powerful one-liners and small code chunks that deserve a lot of respect since they can save so much time.
When someone says "everyone needs to learn to code", they probably don't mean that everyone needs to become an expert. It's the same when we say "everyone needs to learn math" or "everyone needs to learn how to write."
On the other hand, when people say that "no, everyone does not need to learn to code", they tend to compare learning to code with software development, graduate level physics, etc.
But everyone should learn how to use their computer effectively. Everyone would be better off if they were a "power user." And in the current state of computing, the complexity of computer architecture is not yet sufficiently encapsulated as to render it unnecessary to attain basic competency in some programming language in order to achieve that.
In other words, in order to leverage your computer's full power, you need to learn some scripting language and be comfortable operating your computer from a shell (be it bash, cmd, powershell, whatever).
Most people don't seem to have a clue how many degrees of computer literacy there are. The assumption seems to be, that you are either "computer illiterate" (which means you are an old person who hunts-and-pecks at the keyboard, double-clicks everything, and can at most use "the Googles" to do a search), or you're a "normal person" who can touch type and operate a GUI and maybe do basic formulas in MS Excel, or you're a "geek" who can read and write any type of programming code, build me a website, fix my internet connection, disassemble and repair my computer hardware, etc etc and you probably slid out of the womb knowing how to do that stuff. Yet somehow, you are still only making a modest hourly wage working at the Genius Bar or the Geek Squad.
Where most people really should be is somewhere in between the "normal person," GUI-only level, and the imaginary super-geek, computer whiz level.
Let's take it a step further... "Everyone should learn how to change a cam-belt", "Everyone should learn how to perform a basic car service"..."Everyone should know how to rebuild an engine".
How far do you want to take it? I agree with the OP, moreso nowadays that we move more to consumption based computing devices.
To continue my analogy of the motor car to coding, to me both are really on a 'need to know basis' in the modern landscape.
You don't really need nor may be able to easily learn the intricacies of how your car works these days as they're a lot more sophisticated than the vehicles of yore and they're also lot more reliable when it comes to their intended purpose.
Does operating your iPad need anywhere near the learned skill of running programs on the C64 of yore?
As it is, the most states try to bake learning how to write formal logic proofs into geometry and they do it fairly poorly.
[1] if by 'learning to code' they mean 'call a few ad-hoc libraries to process and format strings into <foo> concrete syntax' then I'd say it's domain specific and it's useless outside the current trend.
But I disagree with the notion that, as the OP states, that learning to code is futile because "most who “learn to code” will end up learning anything that sticks."
One of the most common niche phone apps I've seen used day-to-day, among my peers, are apps used to calculate tips from a bill. Even though the math needed to do so is trivial: it's literally a concept mastered by fourth or fifth grade. Yet these tip-calculating apps are popular. Obviously, math is not something that "sticks" in a practical way with most non-STEM people...yet, why do we bother spending roughly one-third of the K-12 curriculum teaching and testing it?
Well, from my layperson's viewpoint, I'd argue that while many people lose the ability to do math, they at least understand that it exists. They may not be able to multiply 0.15 or even 0.20 against a whole-dollar amount in under 30 seconds, but they at least get the concept of percentage of a whole, and, if there are multiple diners, the concept of division and order of operations (you want to divide the bill after adding the tip).
Would they understand this without any education in math? I'm just a layperson but I'm guessing that such a concept could be totally foreign to someone who has never learned division. At the very least, if such a person were given a malicious app that incorrectly calculated the tip (on the order of 2 to 3x, in favor of the server), that person would have no idea that they were being fleeced.
So I think that it's too early to give up on coding just yet...there's a middle ground between baking out a skeleton Rails app and having done enough code to understand logic and computational thinking for the rest of your life.
I don't know how you would even need 30 seconds to do this. Lets say our bill is $62.50. Finding 20% of that is simply multiplying that by 0.20, which is also just multiplying by 2 and moving the decimal point over on stinking place.
2 * 62.50 = $125.00 ~ 12.50
It's that simple. I don't even think about it. Maybe people just see '20%' and that scares them.
Maybe that's where the problem lies. Your average non-coding person might spend all day trying to figure out how to sort a list of names but it would come naturally to a C+ programmer like myself, and come even faster and in a much better algorithm/implementation to someone who's a good programmer.