Does everyone need to learn to program?
blogs.msdn.com
blogs.msdn.com
The reality is that almost all of the sciences (and even some of the social sciences) have come to the point where you need to be able to program. Any data-driven field will require you to do data analysis. A decade ago you would need to know math, today you need to know math, and R. This is not the same as writing a compiler, but it is programming. And that's the best case scenario. In many fields, like genomics and ecology, the programming tasks become much more complex.
And that's just the sciences. The business world is also increasingly data-driven, and with increasing amounts of data there's increasing amounts of coding involved. Sure, not every field requires an understanding of programming, but not every field requires an understanding of history, and it's still taught year after year.
http://software-carpentry.org/
The idea being to teach "just enough programming" in the same way you might teach a non-carpenter to do basic home repairs.
Everybody works with electrical equipement - it would be helpful if some of the 'non-technical' employees here understood about checking that it was plugged in, and not spilling drinks into it.
It's not clear that a little bit of PCB layout design would help that - just like knowing a bit of logo wouldn't help them with not remembering where they had saved the word file they expect me to find.
My solution? I wrote a Ruby script in 2 hours, then an R script in 1 hour (to run the stats). They're both flexible, reusable, and efficient. They get my boss her report the same day as my raw data come to me. And since my source data comes from another computer program, the process is flawless and does not suffer from copy errors or improperly paired metadata.
People should not have to do repetitive tasks like aggregation or mapping data to metadata by hand. We should be teaching every high schooler basic scripting and (more generally) that we can outsource the mundane to a computer.
Beyond that, he misunderstands the reason for teaching programming. Not everything taught in high school is expected to be the basis of a student's profession. We don't teach English classes with the intent or expectation of turning all of the students into professional literary critics, and we don't make everyone take algebra because we think they will or should all become mathematicians. Similarly, the basics of programming can be useful to a lot of people who aren't professional programmers. Everyone I know in technical fields (and many people who aren't) had to write code to solve a problem at some point.
With regard to applying existing encapsulations, it seems there are too many with interfaces too different to gain much from teaching how to use individual components. If we can find something that applies generally to all of them, we'll have something worth spending the time to teach.
Perhaps I'm less inclined to see programming as something exclusively for specialists because I first learned programming from someone whose profession and primary expertise are not programming.
That's right, we teach English because we expect students to be able to read and write and speak cogently. We teach algebra because we expect them to be able to use it in most jobs that will be available to them. We should teach programming because... We you know? It really isn't quite as urgent.
I believe that kids should be taught just enough about computers, including programming, so that they are demystified. A student in high school doesn't need programming as a skill, but he doesn't need to know that a computer is a tool to be manipulated, not an 'experience' to be bought. One course in Python in high school would enough for this, but more valuable possibly would just be teaching them that can open up the command line once in a while.
90% of office workers would benefit from the ability to write an Excel Macro. I don't even think that's a hard sell. Any businessman who understands what Excel does would understand that.
Of course, long term Excel is a toy, and there are all sorts of benefits to be had from more general tools like Python.
I too, would like this to be true. However, the unfortunate truth is that the main market for windows-based HPC is... monstrous, clusterized excel computations.
Well, if you only focus on job preparation, maybe. But education is not just supposed to prepare people for work; it's supposed to prepare them to be good citizens. That requires teaching students a whole variety of skills, but it particularly requires teaching them analytic modes of thought.
Learning how to program means learning how to think in new ways. Generally speaking, those modes of thought are not taught in other educational disciplines: e.g., solving problems via recursion or iteration, and algorithmic thinking generally. So CS education fills a niche that, in large part, would otherwise go unfilled. Coupled with its more "practical" economic benefits, offering it seems like a no brainer to me.
Being a good "citizen" is a full time job, and a job which pretty much everyone fail at. Everybody need to specialize or find themselves a niche within the economy and get good at what they do so they don't get out-competed. "Citizenship" knowledge just get swept by the wayside.
I don't much about foreign policies, domestic issues, drugs, nor do I have time to learn the shenanigan of elected officials, etc. I know computer programming. I also know attempts by self-interested people who try to get a piece of the pie at the expense of the public in my domain. Software patents and intellectual property right in general are what I am really informed about.
The issue of "governing" should take care of itself much like every other profession take care to solve other people's problem instead of expecting entire people to be wise in governing.
Knowledge in our economy's workforce is diffused. Nobody know how to make a pencil, but there are lot of people who knows how to make part of the pencils, or make possible making pencils. Nobody will learn how to make all part of the pencils, because people gain from specialization and division of labor.
We shouldn't expect the masses to be reasonably wise and strong enough to guard their interests from harmful special interest. Forget the concept of citizenship duty and rework the system according to the real strength and limitation of the people.
I think this is an incredibly dangerous attitude. Society works when human beings recognize what they have in common; a society in which all social and political organization is based on specialization and individual differences is a society in which people are divided and susceptible to tyranny. I will gladly trade some economic productivity for a citizenship which recognizes its common interests, actively pursues them, and knows how to defend its members against exploitation.
Understand that there are such concise ways articulating thoughts that every letter means something, and the thought must be fully specified. And what can go wrong with simple logic mistakes -- and likewise how things can seem to work just fine despite the existence of certain classes of mistakes.
...because we expect people to be able to reason through problems and understand that the computer isn't magic.
There are several layers to this. In general, I think people older than ~50 approach computers in a totally different way than people younger than ~20, with us in the middle a little spread out. A good friend's father, for instance, used to hit Space in his word processor to center headings. He didn't do this because he didn't find the button for center alignment, he did it because he didn't think to look for it.
Another dad recently bought a new Android phone. He was studying the rather thick manual carefully, while his 10 year old daughter grabbed the phone, snapped a picture and just started using it. Startled, her father asked her how she knew all this stuff, to which she replied that she didn't know how to do it beforehand, she just did what seemed reasonable.
It might be a stretch, but I think that programming is on the same range of using computers (tools in general? I don't know) in this way. Solving problems is basically trying what seems most reasonable first. A well defined API is usable without even consulting the documentation.
I definitely think that teaching basic programming and computer science to everybody would be a huge win to society.
Sometimes I think of myself as a literate monk in medieval times. I imagine that lots of people would request their services, friends and family needing help with writing and reading. This is also one of the biggest reasons for my wanting more people to learn how to program: It's purely selfish, I get awfully stressed by having people come to me with ideas they can't implement, trying to make me do it for them.
I'm sure a lot of people here have similar experiences.
Right on.
I know people who can write a compiler from scratch but have no idea how to help a customer solve a business problem.
I also know people who can diagnose business, project, and people problems but have no idea what the underlying technology is or how to apply it.
The critical path for the masses is in the intersection of these 2 sets.
The preparation for that probably requires cursory study of a lot of things and deep study of one or two things.
Does everyone need to learn to program? No. But a little more understanding by everyone can go a long way.
I'm not sure that I'm ready to hand down some sort of moral imperative, but I do think that learning programming brings _advantages_ to one in almost any other profession. But this can be said about almost any cross-disciplinary study.
Really, it's hard to have an outside perspective on this; we all see programming as important (if not necessary) because our lives revolve around tech. Yet many of my friends do not know how to program, and they get along just fine. Almost all of them that have gone on to learn the basics have enjoyed the additional perspective, however.
Thinking about what I'd studied in public school, I wish I could trade hours spent learning rules of grammar for hours spent learning how to create and organize symbolic logic.
IMO, this is the Java Schools approach to computer learning. How many people here have railed that high school computer training is actually Word and Excel training. It can be valuable, but only if you're learning the underlying concepts and not just learning the keystrokes to do something.
We need to teach folks that (a) computers aren't magic, (b) there's a logical approach to solving problems and it happens to be called programming, and (c) programming can be fun.
[EDIT: Fixed formatting.]
Programming isn't a specific academic discipline as it is a TOOL to be used. Students that go on to study biology should have enough coding skill to know what they don't know, and go from there to do some genetic data analysis.
Mechanical engineer track students should be able to do some modeling and implement the algorithms behind them.
Business track students should be able to do more powerful analyses than excel sorting.
I only took a BASIC course in 8th grade and a 2-week C course in college, the rest was self-taught. But I've found myself using programming significantly more than any of the higher level calculus I've learned (not that this should be replaced!!)
At least where I am from there seems to be a glut of specialized and educated people. Industry jobs that would be easily serviced by a technician for the pay-grade they offer and skill set they require are instead demanding CS degrees and years of experience. It's like asking a master carpenter to install your Ikea furniture.
Many of the tools that we've spent the last two decades building have allowed anyone with some spare time and a copy of a few technical manuals to build a decent web application in no time. What's even more amazing is that a lot of these skills are simply taught socially. My nieces never learned how to build websites, integrate it with their social networks, customize it, and all that in school. They learned it from friends and online.
I don't think "everyone" needs to learn how to program, but that most of them will to some degree as computer technology becomes more ingrained in our daily lives.
And the ability to write
10 print "I am great" 20 goto 10
has led directly to the wide understanding of technology and the rational approach to science and computers we see today among both the general population and our political leaders.
But maybe that's just me. Not everybody had an older brother.
Or any pushed through with NCLB, to my knowledge.
As someone who's learned from the trenches, you need to know how to program on some level. Even if you're just a lowly IT Dude, knowing some batch, a little shell and at least a little SQL can make your life * magnitudes* easier. Take for example Cisco's networking packages: IOS and CBOS
CBOS and IOS are similar, but different. they have the same syntax but different connotations for them... but because I know one, I know the other. I can solve problems on one machine with basic knowledge of the overall design.
Same with Linux. Or Unix. Or BSD. Or (insert *nix here). I can solve problems by thinking and using some shell to solve my problem in an elegant and useful way that I can then write down and keep in my Little Bag 'o tricks.
I know how to solve problems in the IT world because I know how to program and how to think. Does this mean I have no concept of business and such? No, in fact the university I'm currently attending requires FOUR different business classes to get an IT degree. I'm not kidding you.
High school doesn't teach you how to think. It's designed to push out factory workers to go into industries and do slave labor. That's been the case now for nearly 200 years, if not more.
If you want to know how to get kids into a better position and get them /mentally/ into the top point, require in high school a Cognitive Problem-Solving class which requires group work to solve interesting problems like "A meteorite is going to hit us in 3 days you have these at your disposal what do you do? 2.4 million lives are at stake." and you are graded on your thought process. Maybe not the outcome, but the thought process.
FWIW, I'm a C#/Shell programmer. /bin/zsh is my shell.
Now in this new post-industrial world, perhaps we need to add something that is a universal like R&Wing. It might be basic programming - enough to deal with basic data/text manipulation. It might be basic web development / online tech. It might even just be a big sampler of different things to show them how to solve problems creatively.
Does everyone need to be able to write a persuasive essay?
Does everyone need to be able to conduct a simple but rigorous scientific experiment?
Does everyone need to be able to prove a theorem?
The answer to all these questions is "no" along with the answer to the original "question". But these questions and their answers miss the original point. Sure, a given person can have a fine and even high-paid life without any of a number skills.
But should our education system make systematic effort to give most students a small portion of the skills needed to understand the modern world? Yes, yes! The point is that the education system desperately needs to be exposing people to the skills needed for a high-level understanding of the modern world (exactly what isn't well tested by multiple choice tests BTW).
The point is that a class on "computers" should give everyone an idea of what is and isn't possible with them - a far cry from learning Excel macros.
I think it's important for everyone to at least get exposed to what programming can and can't do. The crux of the problem is all of the people who don't even realize that they are spending hours or days at a time, time-and-again, performing a repetitive task that could be done automatically with a program. We sometimes encounter the same problem from the other side: someone expects a program to magically do way more than is reasonable.
Is it important for everyone to know how to program? Absolutely not. I think exposing everyone to programming, however, would be very valuable. While many are likely to forget the details or not care, I contend that the majority would at least retain some of the notions of what is and isn't programmable.
There are FAR FAR FAR more jobs out there today for someone with the technical skills to build a SharePoint portal, or light up a CRM instance or build a bioinformatics database than there are for someone who can build the next Python compiler. Let's stop trying to train the mass of high school students to become preservation carpenters, and instead make them very good contractors.
I don't think it's a far comparison to say that compiler-writers are like preservation carpenters, practicing an unnecessary art form, because while there are already tools to make CS easier, part of the nature of technological advancement in CS is in creating better tools. But he's knocking those that...make...the tools.