Last week I shared a link on Facebook - Why Johnny Can't Program: A New Medium Requires A New Literacy – that makes that case that everyone should learn how to program. Philip A DesAutels, my good friend and one of the smartest people I know, replied in Facebook with a long well-though out reply. With his permission I copied it below as a sort of guest post. I would love replies either to the origional article or to Philip’s reply. Who is right? Philip or Douglas Rushkoff? Should everyone learn to program and if so how much? Or should we only push a few into programming? [EDIT: The ACM and CSTA have a new report out about computer science education in the US. I blog about it here.]
I truly understand the place of CS in HS and so, I feel the need to rail against this article... Let's start with a line that sums up the central premise - "Digital tools are not like rakes, steam engines, or even automobiles that we can drive with little understanding of how they work." Ummm, hello Douglas, first each of these technologies - hand tools, steam engines and automobiles transformed humanity, each had a very dedicated training program for professionals and users and each was encapsulated to the point where it the technology (or its meta-equivalent - is now so well hidden that only a few experts need the professional design skills while the mass of users can apply the technology with some technical skills and deep domain skills. Let me explain.
Rakes, aka hand tools - I am trained at the nation's premier craft school, the North Bennet Street School, in the art of using hand tools to build wood structures. I was in a class of 12 Preservation Carpenters who know how the make (not buy) moulding, who can build a timber frame and who can carve a Corinthian Column capital with an appropriate acanthus spinosus leaf detail. And if I continued in that profession, I would have been in a minority of carpenters, practicing an art form. Our chief competition and the reason most in the 'real carpentry' trade can't charge someone the $80 an hour is what I would term modernization... aka the Big Box and the lumber yard. Sally homeowner can run to Ikea and buy cabinets that she can put up herself, she can go to home depot and buy wood flooring that is prefinished and a sink that requires no open flame to install. Why would she call me unless she lives in a period house and wants to preserve an art form? Technology has encapsulated my skills (learned in two hard years of apprenticeship) and made them available to the masses. Is there still a need for real carpenters, not just assemblers as I call what most 'pros' and homeowners are (intentionally derogatorily since I am a real carpenter...)? You bet! But we do not have nor need tens of thousands of students studying the fine art of carpentry in its Vetruvian classical form. We need students studying modern building codes and sustainable building practices for the modern age. If they can't shoot a moulding by hand or tell you the appropriate ratios for moulding in a room, does it matter? NO... If these modern carpentry students can't use that encapsulated technology to build modern structures that are safe, energy efficient and stylish then we and they have a problem. Even if a few very skilled in the carpentry profession are creating the encapsulated components, there won't be anybody to apply them.
I could make the same ranting point about steam engines - not many of us firing up the coal boiler to make steam to open the garage doors today...or the automobile - when was the last time YOU even checked you oil let alone adjusted the timing or valves... The points I make here are that 1.) Technology encapsulates, 2.) Encapsulated technology requires domain skills combined with a new type of technical skill to apply encapsulated technologies to modern problems. And.. herein lies the problem with the argument presented in this article and the call for more CS programs in High School. To what end? Is this like a call for more carpenters to learn how to make mouldings by hand? More HVAC professionals to learn how engines are designed? I THINK SO.
There are students for whom programming is a desired skill. They want to be developers. Great for them. The giant hole in our workforce isn't entry level developers who can hash out c code and write a compiler from scratch. It is for people with combined skills who can APPLY encapsulated technology (lots thanks to companies has been encapsulated) to specific domains.
So I offer up a different call. In high school, teach students how to apply technology. Teach them how technology fits with their domain of interest. Teach them how to use the components not how to build them. Those students that want to become more technical can choose to learn down the stack to real engineering (aka CS, CE, EE) or up the stack to become expert in technical domain applications (IS, CIS, Project Management, Bioinformatics).
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.
How many people need to program? Anyone who uses a spreadsheet. Anyone who wants to customize a web page. Anybody with the horrible task of customizing generic business software to work for a small business. And to borrow one of your examples, anyone creating a Sharepoint portal would benefit from a bit of programming experience.
Many tasks in the modern world are just programming in disguise, often not very well-disguised. Alongside Firefox, Safari, Microsoft Word, and other programs that show off man-decades of professional UI design effort to hide the nature of the machine from users, regular people must also use many programs that expose the logic of programming, either intentionally (Microsoft Excel, Microsoft Access, even Word macros) or unintentionally (hordes of poorly or hastily designed business applications.)
The work of providing polished, usable user interfaces for every computer system will never be done. The world moves too fast. Imagine a world not with smoothly humming cars, but with tens of thousands of different car-like devices, many of which were patched together in a month by a poorly paid college intern.
Also, don't forget that changing a spreadsheet, configuring software for a small business, or editing the rules governing what happens to a sales invoice are all poorly-disguised programming tasks and will always require a certain analytical mindset, right up until the computers are ready to take over those tasks and reduce us to fetching coffee. Programming is a great preparation for those tasks, just like writing history papers is a good preparation for writing business memos. That's how school works: we don't force high school kids to write business memos and customize enterprise business software. We teach them more abstract tasks that are less mired in real-world complexities: how to do research, how to write well-structured papers, and (hopefully) how to build and control simple computer systems.
The author's comparison of programming to carpentry is misleading, misguided, mis... er, plain wrong. Programming is an art, but also an engineering, mathematical and scientific discipline. The author claims carpentry to be an art, as well as a technical skill. Surely, but, no offense to the author, if all carpenters were to change profession tomorrow, the world would survive. The same cannot be said for programmers, which drive a 400 billion dollar industry, and sustain a growing dependence on software.
As Bjarne Stroustrup (inventor of C++) once noted in Technology Review, "The idea of programming as a semiskilled task, practiced by people with a few months' training, is dangerous. We don't have as an aim that architecture (of buildings) and engineering (of bridges and trains) should become more accessible to people with progressively less training." He ends with: "let's not let most people loose on the infrastructure of our technical civilization".
Sorry Philip, bad example. Not horrible, offensive, etc., but misleading and rather naive.
I agree with Phillip. I would recommend a deeper understanding of computing for the USER. People don't have a clue of the very basics of computing.
How many people click on an attachment to save and can never find it again? People don't understand the concept of CC vs BCC. Folks don't not the difference between an Operating System, a browser, and a website. Learning how to program is NOT something everyone should learn. Phillips is right on the mark in suggesting we adjust the education system to teach application of encapsulated technology. A good book on the subject is Daniel Pink's A While New Mind.
I, on the other hand, very much agree with Philip's example. I also agree with his conclusion, but am unsure how to put it into practice. That is, I don't know how to teach students to "use technology" in ways that will be tranferable to technologies of even 5 or 10 years hence. Partly there is an issue with abstraction. The kind of transfer we want depends on a degree of abstraction that many high school students are not yet developmentally ready for (see Piaget and others).
Of course, the same point applies to the pro-programming camp. We, the experts, see all the many ways in which programming skills transfer to the modern world. But, I believe the evidence strongly shows that novices, who have taken perhaps one semester of programming in Alice or Scratch or Java or whatever, cannot make this transfer. That is, taking one or two courses in programming will not necessarily prepare students to accomplish the tasks mentioned above (eg, customizing a spreadsheet or configuring software). It is not until a greater level of expertise is developed that we will see the kinds of benefits from transfer that we want.
If the public school system could teach kids to not open every freakin' email attachment they get I'd be delighted.
We don't need everyone to know how to program. What the modern workplace (and home) needs is people aware of Anti-Virus Pro, Nigerian Princes, and other tech hoodlums/scams. Teach the kids how to identifiy spoofed pages and that links can take you somewhere other than advertised.
Just like drivers training doesn't teach you about the engine but rather, how to use the power of a car safely, even so we need people who are aware of how to use technology safely.
I agree with Philip in this, it seems reasoned to say in many technologies we start with a complex beast that few understand and use. Gradually this beast becomes mainstream then more and more people want to build and maintain their own instance of it. Once we understand the technology we need only to amend it to our needs, not redesign from scratch.
A weaving machine is a perfect example, you may need them in a company but a generic machine that can be configured to create the weave you want is easier and less expensive than attempting to create your own weaving machine each time you create a new design weave.
This analogy can be applied directly to software, we have a core set of people who have a deep understanding of creating applications for a PC, they then expose a simple interface that allows a user to configure it to their needs, although example of this are not so easy.
Schools have development tools now where you can drag and drop a component of functionality, such as "for every item it have, do something". In simple terms they express what they want to do and the complexity of how it is done is hidden by the professional developers.
Is this not just a case of a language specific to your skills:
A writes in assembly to create a low level O/S
B writes in c++ to create a GUI for the OS
C writes in C# to create applications that run on the OS in the UI
D uses that application to build their process upon
At point A you need a thorough understanding of the hardware and architecture with out knowing the specific purpose for which it will be used.
At point D you know nothing of your hardware, how to retrieve data from a database with SQL, etc. But you do know what you want to do.
Surely we are back to the abstraction of complexity we see in so many other real world systems. Maybe we just need to ask is there really two different disciplines here:
I just want to comment on this part
"Teach them how to use the components not how to build them."
I totally agree on this. I have experienced the same thing at the University. I was forced to learn how a network functions, not how to crate one, or configure one. Regarding security I learned all kinds of differnet algoritmns
I am not opposed to what Phillip says here, yet I don't see how this article contradicts Douglas Rushkoff's. That article is not about teaching high school children create compilers or operating systems, it is not even about making them professional programmers. It just claims that for people to have a better idea to utilize and understand the technology that use extensively each day, a programming starter course in high school is necessary. At least that is what I understood from it.
The carpentry example just doesn't fit to the current argument in many ways. The knowledge of carpentry to sit on a chair is not necessary, because chairs or buildings or hardwood floors are not things that you tweak or configure to your liking to be used efficiently. The original article only says that we use web sites or tools like MS Excel everyday whether we want to or not. The technology we use every day is getting highly interactive and to be able to interact with it, or even just use it securely we need to understand how it is done. It is not saying that we need to learn how to write it from scratch.
People don't know how to connect modems, they don't know what is a registry and why certain operating systems gets slow as they use it. They don't know what is a virus, or an anti virus, they don't know what is a session or security. I know that programming course won't teach these but even computer science majors don't teach these, it just that as you learn programming you get interested and learn it yourself. It is just telling the students that this computer thingy with bright lights is something that you can talk to, and they are just programmed to do things they do by people like them.
I disagree with Philip.
I agree with the idea that we don't need to pump out trained carpenters, because we have new technology that has advanced that craft. However programming does not fit in that category.
With carpentry, we don't need to learn the old ways because we have new ways, but we are also well versed in those new ways. If we wish to advance carpentry, we need people to learn the mass production techniques we use today, and then push that technology forward to stay on the forefront of carpentry.
However, the internet and computers in general are still advancing via good old fashioned software development. New paradigms and advancements come from software development shops. If we wish to stay at the forefront, we need programmers, not techs who's only training is domain specific knowledge. That knowledge will be useless if a new piece of software replaces the previous.
The whole point of object-oriented programming was supposed to solve the need for *deep* understanding & low-level coders.
Instead letting experts in a particular field bolt together components, much the same as an architect designs buildings from pre-fabricated materials. Rather being tediously bogged down with making the building's component parts.
What we have ended up with is experts on a particular programming language (C++ etc) and very few experts on the problems that need solving.
Maybe there's an element of job protection that has maintained the developer status quo for the last 20-25yrs.
It has to stop, give us the tools to solve problems simply and without the need for C++ gurus.
Teaching programming at high school or college for those who don't aspire to be developers show people how a computer is working--it removes the mystery and shows them that they're the ones controlling the computer. I realize that it's not something that can be quantified as I learned while working on my Master's thesis--where I taught a computer literacy course that had programming in it (14 years ago). The programming portion was taught at the beginning of the course and I saw students try things that went covered in class (e.g. using Access versus dBASE IV for the database portion--keep in mind, this was 1996:-)
I did the same thing as a full-time instructor at a community college for another type of course and saw the same thing. The best part that happened there that I saw--students wanted to major in it or take more computer science courses as electives (kind of goes along with Omer said--about getting interested).
I've been working as a developer for the past 10 years and I've worked with all kinds of users and yes, when it comes to speadsheets, web pages, and databases--both for work and personal use--people are doing programming.
I say let's make better power users of the future and teach programming in high school.
Philip is basically correct. But at the same time, he misses an important point.
We don't learn ancient carpentry techniques so that we can become masters in the art of ancient carpentry and make a profession of it. (At least not the vast majority of us who have no desire for that.) We learn ancient carpentry techniques so we can learn how to learn, have an appreciation for various fields of study, and learn to view problems from different perspectives. And sometimes for the pure enjoyment of it.
This is the reason I Home Ec in High School, and the reason I studied anthropology, and music, and the reason I play chess and poker. And each of those things has made it easier in the long run to learn other new things, and each has given me important lessons I can apply in other areas, and each has given me an appreciation for differerent perspectives.
Philip is correct that we should definitely teach students to apply technology. But we should also teach them specific technologies. It's interesting to note that the majority of civilization knows how to use a computer and cell phone, but probably could not survive if left alone on a tropical island.
Chris said, "I, on the other hand, very much agree with Philip's example. I also agree with his conclusion, but am unsure how to put it into practice. That is, I don't know how to teach students to "use technology" in ways that will be tranferable to technologies of even 5 or 10 years hence."
And that is the reason, Chris, that we should teach them to program (and other things.) So that they learn how to learn. So that they can learn to use technology on their own and adapt.
"The whole point of object-oriented programming was supposed to solve the need for *deep* understanding & low-level coders."
I don't agree at all with that (except to the extent that all "high level" languages eliminate the need for "low level" code.)
Interestingly enough I agree with both sides of this debate. We certainly need to offer more technical courses in high school that will help lead students down a path to success. We do not need to offer them en mass however.
I think back to when I went to high school and many of the students took typing (as in with a typewriter). Was this a useful skill for everyone? No. As a result not every student needed to take it, only those who wished to excel at it.
All student where however required to take a gym class where they were exposed to different forms of physical fitness. Why? Simply because it is best that we have fit teenagers rather than ones who are unfit. It helps them to remain healthy; it lowers the burden on society when they become ill from diseases that strike the unfit.
Now you may be asking why do I bring these things up? Simply to point out that some things are necessary and others are not. Programming is something that some students will find interesting and as such may lead them into CS course of study later in life. Others may choose to ignore it as they desire other skills such as working with their hands. In other words let it be an elective course, do not ram it down the throats of the students. They will learn better this way and enjoy the study rather than shun it.
Finally I have been exposed to situations in my study of Information Technology where students were required to learn programming. Many had a difficult time with it, whether it was in Visual Basic or bash scripting. Many of us are not "built" to program. Our brains are not wired for it. Will many of the younger generations pick it up easily, YES!. But many will not. We do not want automatons in this world that all can do the same thing as this will ultimately stifle invention and advancements. Let each decide their own path and learn the skills they choose. We will all be happier well adjusted individuals for it!