In this article, I make some critical comments about code.org’s inspirational video on programming in schools. In particular, a comic book super-power is a terrible analogy for programming.
How Easy Is Programming?
The code.org video starts with a series of luminaries including Bill Gates seemingly saying how easy programming is. The video is heavily edited and the speakers may be taken out of context.
And it’s true … at first. The simple “Hello, world” and other programs that people start out with are easy. Most programming and computer science classes teach relatively small (at most few hundred line) programs that are fairly easy, especially using a more English-like programming language such as Visual Basic or possibly Python. It is probably not a good idea to try to learn programming using C/C++ as your first language.
#include <iostream> using namespace std; int main(int argc, char ** argv) { cout << "Hello World!" << endl; }
Easy: "Hello World" in C++
The lead-in also emphasizes the idea that the mathematics in programming is simple, easy, nothing to be intimidated by. Its "basic arithmetic, addition, subtraction" the speakers seem to say.
And again this is true up to a point in most programming today. About 99 percent of professional programming today is business software, web sites, user interfaces, that involves only basic arithmetic. A lot of it is basically bookkeeping. Maybe one or two percent involves more advanced mathematics such as linear algebra, probability and statistics, mathematical modeling, and other topics.
But...is programming really that easy? If so, why do programmers make so much money? Well, real programming is often very complex. Real programs are usually anywhere from several thousand lines of code to hundreds, even millions of lines of code. They are much more complex than teaching examples like "Hello world" programs. Secondly, real programs usually have much higher reliability and quality requirements than a class project or software that the programmer writes for his or her own personal use or fun.
A line of code is something like a single moving part in a machine. Automobiles probably contain about 20,000 parts. The Space Shuttle Main Engine, one of the most sophisticated and powerful engines ever built, had about 50,000 parts. Even a simple commercial iPhone app probably has thousands of lines of code (I've written a few). More sophisticated business software systems are much more complex. Even though the mathematics is bookkeeping -- it is not calculus or group theory or something like that -- the programmers need to handle a level of complexity far beyond most classwork in any field, not just programming.
A leading theory of the human mind is that we possess a sort of short term working memory that can handle approximately seven items such as the digits in a phone number. There is probably some variation in the size of the working memory in different people. Maybe exceptional people -- including many people who are good at science, technology, engineering, and math (STEM) fields -- have a larger working memory: ten to twenty items at a time.
Teaching "Hello World" programs are simple enough that they can be handled by this working memory. Complex real-world programs exceed the working memory capacity of either everyone or nearly everyone. People with a working memory capacity of one-thousand must be exceptionally rare if they even exist: one in a million persons.
The working memory size may be organically determined, genetically encoded for example, in which case people with a normal working memory of seven items are likely at a serious disadvantage in programming unless they have some compensating ability or learned skill.
In my own experience, from conversing with programmers both casually and about coding or other technical topics, successful programmers often seem to have a larger than normal working memory all the time. I don't know of rigorous studies showing this for programmers, but there are studies showing correlations between working memory size and intelligence.
Programmers spend a lot of time trying to organize their programs so that they need only keep track of a small number of items at any one time. But obviously if you can keep track of more items at one time, you should be able to program faster, more reliably, and spend less time structuring the software to reduce the number of items that must be tracked at the same time.
Some programs, especially highly mathematical programs, are so complex that you cannot squeeze them into a structure where only a small number of items need be tracked at one time.
Professional-level programming is not all that easy and may depend on innate attributes in the same way that basketball players tend to be very tall. Chris Bosh who appears in the code.org video is reportedly six feet, eleven inches in height and legendary basketball player Kareem Abdul Jabbar is over seven feet.
I should add that I do not believe in a simple "mental horsepower" model of either programming or other STEM activities, in which "working memory" or some other attribute is the be-all/end-all. But, successful programmers do seem in my experience to have larger than normal working memories. It is easy to see how this would help in programming.
Although advanced mathematics is rare in programming today, this is likely to change. Indeed, the current big data/machine learning fad which involves much more advanced mathematics applied to business data, is likely a harbinger of the future.
It is certainly my hope that mathematics will be applied successfully to big problems like energy and health, rather than determining whether people with red ties are more likely to buy pet food over an iPhone in order to target those people with real-time mobile advertisements for pet food.
Programming is not a Super Power
The code.org video contains a statement that programming is like a super-power which is particularly inaccurate. It is not uncommon for programming, mathematics, science, and engineering to be portrayed like a comic-book super-power in movies, television, and (of course) comic books, but this portrayal is almost always grossly inaccurate.
In comic books, the heroes frequently have super-powers that enable them to solve problems -- usually defeat the bad guy -- very quickly with little or no trial and error. In the techno-thriller series Numb3rs, the main hero mathematician Charlie Eppes and his girlfriend are able to whip up both mathematics and computer programs that work flawlessly in days or even a few minutes. In one episode, they have one hour to rescue the kidnapped son of a hip-hop music mogul :-). Many other examples of this can be found in popular culture.
Programming is mostly debugging. Most time is spent tracking down and fixing bugs. That is particularly true of highly mathematical software. A very common misconception of people is that if you are a good programmer, you can write code that has no bugs. This is what might be expected from a naive analogy to a physical activity like playing an instrument or a sport like basketball -- or a comic-book super-power. All of these analogies are made in the code.org video. That is not the way it works.
Debugging is usually tedious, time-consuming, unpredictable and frustrating! That is especially true of highly mathematical software. Nothing like a comic-book super-power.
Comic-book super-heroes have fantastic super-powers that enable them to step outside of society and its limitations. Acting as individuals or in very small teams, they are able, largely thanks to their super-powers, to tackle and solve problems that have proven intractable in the real world. If the mayor is corrupt, the super-hero can walk through the walls of the mayor's heavily guarded mansion and retrieve damning evidence sealed in a vault.
Programming is almost never like this. Programming rarely gives programmers the power to step outside of society and its restrictions. Programmers usually work for companies and organizations that have great power over them. Most successful open-source software projects are funded by a company or institution. Programmer and free software movement leader Richard Stallman seems to spend much of his time preaching and trying to persuade other people of his unorthodox views. Quick! To the Bat-Fax! Batman!
Should Kids Learn to Program?
This is actually not as clear cut as the code.org video asserts. Schools should provide general knowledge and skills that are applicable throughout life and in many or all professions. This is typically what schools do. They teach reading, writing, basic arithmetic and some more advanced mathematics. Schools used to teach things like rhetoric, dialectic (critical thought and discussion), and so on, and sometimes still do.
I think there is actually a pretty strong case that kids should learn some more advanced mathematics than basic arithmetic, especially probability and statistics, in the modern world. More and more, medicine, public policy, and many other issues are wrapped in probability, statistics, and mathematical models. For example, trillions of dollars hinge on the question of the accuracy and reliability of "global warming" climate models that claim carbon dioxide from hydrocarbon fuels poses a deadly threat. The Big Data fad is likely to accelerate this trend. In this context, citizens should be able to understand the issues and work with computer programs such as R.
Welding is essential to modern life. Our civilization would collapse without skilled welders. Robots may change this, but it is still true. Nonetheless, does every kid need to learn how to weld? No. Like programming, welding is rather complex. A high school welding class is unlikely to teach the more complex sophisticated forms of welding on which our civilization depends.
It is not uncommon for people with limited contact with welding to grossly underestimate the issues involved in welding. Remember those losers in machine shop at school, how hard can it be? I watched a project set back at least six months because aluminum welding turned out to be way more involved than someone (who should have known better) thought. A little bit of knowledge can be dangerous.
"Hello world" programs and most high school and college computer science courses don't teach the difficulties encountered in large, complex real world programs. They also teach software development methodologies and coding rules that often prove ineffective or even disastrous in real world projects. The only real way to learn this at present is to write a several thousand line computer program, debug it, and ideally have it used by other people. That is beyond regular classwork and it is probably not practical for most people unless they are studying to become a professional programmer or something related where a good understanding of programming is needed.
In many respects, a more useful thing for many people to learn is the history of actual software development projects. The cost and schedule overruns. The crazed code rewrites of shipping flagship products that actually worked, followed by the collapse of a company as its competitor outpaced them. The software development methodologies that sounded good but empirically didn't work.
Conclusion
Programming is not a super-power. In fact, this is not obvious from writing simple, short programs like "Hello world" that are often taught in school or college. It takes larger projects and generally more experience to realize this is a terrible analogy.
My own suggestion is that it is probably worthwhile for most kids and most people to learn programming in the context of learning probability and statistics. There are a number of freely available statistical and numerical programming languages and tools such as R, Octave, SciLab, and Python/NumPy/SciPy that are useful for this. It may be better to learn the basics of programming in something like Visual Basic or Python that is closer to English before trying to use something like R or Octave. But also keep in mind that small programs like "Hello world" or simple statistical analyses of data are not like most professional programming projects.
© 2013 John F. McGowan
About the Author
John F. McGowan, Ph.D. solves problems using mathematics and mathematical software, including developing video compression and speech recognition technologies. He has extensive experience developing software in C, C++, Visual Basic, Mathematica, MATLAB, and many other programming languages. He is probably best known for his AVI Overview, an Internet FAQ (Frequently Asked Questions) on the Microsoft AVI (Audio Video Interleave) file format. He has worked as a contractor at NASA Ames Research Center involved in the research and development of image and video processing algorithms and technology. He has published articles on the origin and evolution of life, the exploration of Mars (anticipating the discovery of methane on Mars), and cheap access to space. He has a Ph.D. in physics from the University of Illinois at Urbana-Champaign and a B.S. in physics from the California Institute of Technology (Caltech). He can be reached at jmcgowan11@earthlink.net.
I think we should be careful when we decree that something is “hard” or “easy” because it assumes baseline that not everyone shares. Maybe “simple” vs “complex” is a better way to describe what we mean to say, but even that breaks down under close scrutiny. For example, is lifting 5 kg hard or easy? I would say easy. What about 10 kg? 50, 100? Well, hard and harder, but I am not a professional athlete. The point is, no one is born lifting 200 kg, it’s hard work that gets them there. The same is true with math and science, you’re born with a gram a genetic inclination, but that is not what makes you “smart” it’s how hard you work with what you’re given.
While I would like to agree with you because of how nice the sentiment seems I cannot bring myself to do so. I find that your post comes off as naive. There have been actual studies done of this concept that have led geneticists to believe that people are born with an aptitude, and in few cases thirst (the line here between genetics and nature being the cause is rather blurred as their have been cases of both and either) for knowledge that differs from person to person. How we choose to use this and how much we obtain is ultimately up to us. For example, I normally react to Mathematics, specifically analysis including the sub groups of calculus, it’s extensions, and the theory of complex variables or anything related to business, finance, or economics like I’m taking 5ccs of crack cocaine while I knew a guy in highschool who would look at pictures of cars as if he were looking at pornography. Different strokes and I suppose, continuing with my analogy, different girths.
I think that with the current state of the world, doing software requires not only the hard technical skills but a lot of soft skills, especially communication.
When I started college I thought that working with computers would be working *only* with a computer but, after a few years programming professionally, I can say confidently that programming is a team effort, 90% of the time.
Interesting post, I agree on several points. However, I am not sure after reading what exactly is you opinion, but I do not think that we should not teach programming in school. One thing that you missed in you discussion is the point of providing an opening for kids to “discover” programming as an activity. Everyone have to do this to start programming, also those inclined for it. And indeed it is the same thing with everything doing it professionally differs considerably from doing it in school (take literature, not every one of us should become writers, but we should not skip literature for that matter).
Of course, not everyone should do programming, but the fact is that there is tons of work in that area, and I guess we should expect it to continue that way, so it would be great if we could persuade more people to go into programming. Thus, I would ask for programming languages with even lower learning curves, so that people can be creative and discover the beauty in programming. The details will follow.
I received some comments and questions about working memory capacity and its variation.
My interpretation of the 7 +/- 2 items commonly quoted, based on Miller’s original article, is that +/- 2 should be interpreted as something like a standard deviation. This would mean about two thirds of the population have a working memory capacity in the range 5-9. About 95 percent are in the range 3-11 items, etc. A small elite fraction would be above ten. With a pure Gaussian distribution, twenty items would be very unlikely and one-thousand extremely extremely unlikely.
My own subjective impression is that I have met people with a working memory capacity in the range 10-20. This is not very scientific, but that is what it seems like to me. I don’t think I have met anyone over around twenty. I doubt the distribution is a perfect Gaussian and likely has a fat tail.
There are many scientific studies attempting to relate working memory capacity to intelligence. They are difficult to interpret in this straightforward way because they use specialized tests for working memory capacity in various contexts such as “reading span” that don’t correspond exactly to the common sense notion of a seven item buffer. Similarly, they often use specialized intelligence tests rather than the popular IQ tests many people may have encountered. They tend to show a positive but imperfect relationship between working memory capacity and intelligence.
The issue of whether there are innate variations in working memory capacity is contentious given its close relationship with intelligence and exceptional performance.
See, for example, this article:
Does Natural Exceptional Memory Exist? by Scott Barry Kaufman, Ph.D.
https://www.huffingtonpost.com/scott-barry-kaufman/does-natural-exceptional-_b_2927291.html
I personally would not classify someone with a working memory capacity of twenty as having a super-power, any more than I would classify Kareem Abdul Jabbar as having a super-power.
John
Programming IS a super power. One that let you avoid spending three hours comparing by eye two excell files, and being yelled at for half an hour by the boss because you missed a couple of discrepancies, just like what occured in the offce next to mine.
All right you can also say that intelligence is a super power, I don’t mind.
Agreed. It’s also a discipline which, like martial arts, changes fundamentally the way you see the universe, once you get far enough in and become advanced enough. A programmer’s mind works using a type of controlled schizophrenia: more work is done by the subconscious than by the conscious mind when programming, and the programmer achieves a type of Zen state. I hate people who interrupt me when I’m programming: I feel all that Zen slide out of my body and suddenly I’m back in the mundane world of consciousness. Being able to flip one’s mind into that state is a superpower, beyond doubt: learning to program a computer is not the same thing as becoming a programmer.
Is it more a super power, or just an art form. And like most forms of art, some techniques can be be taught/learned, while others a person just has or doesn’t (not everyone can be a Mozart, Leonardo da Vinci, or Bruce Lee, no matter how hard they try). In some cases this talent can manifest itself like a super power.. Batman is just a rich, athletic, guy with a talent for creating crime-fighting gadgets, but Batman doesn’t actually have super powers.
As a business and engineering nerd, the Batman and Ironman movies have always frustrated me. Mainly because they inherited their companies. I mean I like the concept, but if it’s not in programming (where new business ventures are launched everyday and become functioning and often very successful businesses) engineering firms often lack the capital to get all of the necessary equipment, get hung up on perfecting the product rather than selling it, or simply don’t have enough money for marketing left over.
Since you mentioned popular media’s depiction of programmers, one observation: not everyone out there is clueless. The Iron Man movies, which require incredible levels of suspension-of-disbelief, have one endearing trait: Tony Stark *debugs*. Each movie has included a scene or two where he’s trying something new, and it doesn’t work correctly on first trial.
Yes, there is a small amount of trial and error in “Iron Man,” mostly for humorous effect.
When popular culture portrays trial and error in invention and discovery, it is usually a few attempts which is very unrealistic, certainly for machines like the Iron Man suit. It is often done for humorous effect as in “Iron Man” or to add tension. The hero must get his invention to work in one hour before the aliens destroy Earth; a few failures with a last minute success makes for great drama (see Galaxy Quest for a satire of this).
I spent some time studying the amount of trial and error in the real world development of rockets. Robert Goddard, for example, left detailed notebooks and records. The development of rockets is comparable to what Tony Stark is depicted doing in “Iron Man”.
The amount of trial and error was tens of thousands of component level trials, hundreds of partial full system tests (rockets fired on a test stand), and hundreds of full system tests (launches), many of which failed — blew up in many cases. The actual development took years!
Similar levels of trial and error/debugging appear to be involved in tasks like proving a major mathematical theorem or research and development of a video codec.
I would note that a minority of popular culture portrayals are more realistic, but by necessity must move the years of struggle, trial and error, off-screen or compress them to a short few paragraph, at most few page description, which is easy to miss. The 2002 remake of “The Time Machine” with Guy Pearce, for example, has the hero spending three years, mostly off-stage, inventing his time machine. This is still fast for a breakthrough invention, which usually take at least five years.
John
I used to think programming wasn’t a superpower – but the longer I do it the more I think it actually is.
The thing is, there’s a big difference between being able to write code and being a great software developer. Anyone can learn to write code – just as anyone can learn to read and write English.
But could anyone write a book?
Being even a pretty good dev these days requires huge amounts of effort and passion. It’s not good enough to just have some chops any more. And it used to be! Back in the day, before the internets, if you could read a reference manual and understand it, you could be a great coder for the day… because there was nothing else. Most work was created in isolation, using a small number of commercially available toolsets and frameworks. You could reasonably have a cursory understanding of your entire ecosystem in a pretty short time.
But now being good isn’t just about doing some homework and having some chops, it’s a constant evolution. It means knowing when to use someone else’s code, for what, and that means being aware of it, and being able to understand it, and knowing when to write your own, and knowing when to abandon something you’ve been using in favor of the new new. It means keeping up with the increasingly-rapidly changing face of tech. It means trying to predict which new trends are going to get a footing, and which are fads… and accepting that you’ll spend a lot of time on learning some new thing only to have it die on the vine.
You need to understand design patterns, know how to implement the right ones and and when. You need a vast knowledge of the toolset out there, and time to keep current. You need to be organized, diligent, constantly critical of your own work.
Writing a book requires the foundation of knowing the chops of the language, but it also requires something else, that you can only get from having read thousands of other books. Programming is no different.
Great article!
These days, for better or worse, it has become possible for the average person to engage in programming activity, and similarly possible for people to think they know how to program to do so. The growth of ever-higher abstractions, frameworks, and APIs available to the masses makes it much easier for just about anyone to get their feet wet, and create a functioning application/website what have you. On the other hand, understanding what goes on underneath all the abstraction is what, to me, differentiates “real” programmers from those who think they have developed a super-power so-to-speak.
I agree. My dad is what I consider a real programmer. When he was my age, he didn’t have APIs and frameworks to abstract away all the hard stuff so he could just write thing.do(quicklySoICanGoToLunch). Because I have those frameworks and APIs, I can throw together some possibly decent code to accomplish a task quickly, but I have no clue what’s going on behind that framework.
I honestly look at people like my dad as if they have a superpower.
Indeed. Which then begs the question, how far down the rabbit hole do *I* need to go, and at what cost? Folks like your dad evolved their know-how as the tech evolved, over the course of their professional lifetimes (so far). As one who is just starting out, I don;t have that lifetime to spend learning Assembler –> C –> C++ –> Higher-level language.
I *can* (and regularly do) do some research, and attempt to grasp some of the fundamentals, but there are those who say such activity comes at the cost of productive time. I try to find a balance between wanting to know *everything* that lies beneath, and knowing just enough to inform my use of current technology/languages/platforms.
Do not confuse the needs of “professional programming” with that of “useful programming”. It’s like confusing “to know how to read and write” with “working in a magazine”. No one expects that with high school education you should be able to write for New Yorker, but we all expect high school students to be able to read a book. I n this sense, yes, programming is superpower, as read and writing it’s a superpower when everybody else is not able to do it.
I suspect we can draw a parallel to Arthur C Clarke’s:
“Any sufficiently advanced technology is indistinguishable from magic”
Which would be better stated in this case as:
“Any sufficiently advanced skill is indistinguishable from a super power”
Hi
I like the way you refer to “programming” as being more of debugging than anything else. I once went to an interview in which I was asked to write code using pen and paper only, things like mathematical calculations, Fibonacci sequence, recursive algorithms etc, and your guess is as good as mine, I failed that interview.
Of course I was disappointed with myself after it but I realized that the most proper thing I should have done in that interview was to refuse to write the code on paper. That’s not how it works. Programming is more stepping into code and discovering that the way you had initially imagined how a program works you coded is not actually how it is executing.
Thanks for a good article.
I couldn’t agree more. Interviews where they want you to write code on paper/whiteboard are ridiculous. I work with a guy who is brilliant as an engineer AND programmer, yet he uses Google to get code to use or figure something out. Just go into Object Browser in Visual Studio and look at all the Namespaces and everything under them. I daresay that no one has all of them memorized and if they do, I bet they aren’t married. 🙂
I strongly disagree with this. When we ask you to write code on paper, there is a specific reason we are asking that, and it comes down to productivity. If you can’t write a simple recursive algorithm to calculate fib(), without using Google and without needing to run it to be fairly confident it’s going to work, then you probably don’t have the chops to produce. You need to be able to write pseudo-code with no help. The code on paper is not checking your knowledge of syntax, it’s checking if you understand basic algorithms. It is the exact same things as “tell me how a quick sort works” and you should be able to do that. If you can’t code without electronic aids, you need to work on your ability to do that. My son is a jet mechanic – he says there’s two types of those – parts changers, and jet mechanics. That is, there are some people who can change out a bad part and hope the engine works again, and there are other people who understand how the engine works, and they can debug that engine and find out things like “another part is causing that one to break” and fix the root problem. In programming we have the same thing – some people can write code and some people can only put parts together. When you’re asked to code on paper, we’re trying to figure out which one you are.
These coding tests are never hard, and if you think you’re a good programmer, you should be itching for the chance to demonstrate that.
(jumping in) I see both points of view. But the reality is for most programmers, making practical applications that involve mostly just different ways of reinventing the wheel, 99% of coding these days is not writing clever algorithms. I probably couldn’t code a bubble sort in less than 15 minutes today, even though I could probably rattle off a quicksort from memory without a pen or paper a long time ago.
Why is that? Because you just don’t ever need to. The only value in a test like this is (IMHO) to see how recently someone got out of college.
The hard work in programming isn’t recall of some algorithm you’ll never actually use in practice, it’s your ability to create organized, structured, reusable code.
When I interview people I’ll ask them a few nuts and bolts questions to be sure they aren’t a joke. But I care much more to discuss code samples, technique, philosophy, use of patterns, generally – things that go into creating practical, maintainable software.
Seeing how someone might code a fibonacci is interesting. I might care a little bit if they use a basic recursive version or use memoization. But honestly, I don’t even care that much, since even good programmers write simple algorithms in a less-than-perfect way sometimes. Because good programmers also write code that makes it easy to swap out any algortihm if it ever becomes a bottleneck.
Keep in mind that I was responding to someone who thought the right approach was to refuse to do coding tests on paper. I think that would be a bad strategy, and I argued that it’s a bad strategy because on-paper coding tests are a valid way to judge someone’s skills. It’s not a test of high-level stuff, it’s the same “nuts and bolts” kind of questions you prefer to ask verbally. We’re just weeding out the non-programmers – it’s a FizzBuzz test. Walking out is not the right answer to a simple question – we want programmers who meet a challenge with gusto.
The argument I didn’t address is this “what kind of programmer will you be if the minor difficulty of writing code on paper makes you walk out”?
Programmers face the impossible every day, and we conquer it. If you can put some simple code from your head onto paper, how are you going to respond to real-world coding problems? By walking out? We don’t want that programmer. We want the one who grabs the pencil and says “yeah, let me show you how awesome I am!”
It doesn’t have to be coding tests, I’ve had people write DB diagrams, class diagrams, and so on – it depends on the job.
Well, to be sure I wouldn’t walk out of an interview if asked that question. But I might say, I can write it out faster with recursion, but a stack would run faster, what’s your preference?
I still think it’s silly to ask a programmer to write anything more than their name on paper. We don’t use paper. Why not put them in front of a computer?
Writing is too slow, and too cumbersome to present complex ideas on how to do code. I have been programming for about 38 years, and I started by writing my code out in assembly and hand assembling it only until I acheived an editor and an interpreter. The paper stayed, but as the comments and documentation of the code, not as a part of the coding process itself.
I migrated from that to punch cards, and from that to perforated tape, to magnetic tape, and finally to disks, the whole array of them from towers of high speed aluminum platters down to 3.25, CD’s and then DVD’s.
I often take up pen and paper and do some flow charting, or maybe some temporary coding to check out the forms of my thoughts or via a small notebook when I am away from my computer.
But coding on demand is not a strength of mine. However, I have been very successful over many years in a very difficult field.
You would probably not hire me. You might even question my skills, or even disregard me because I do not have much formal education in programming (in fact I was told to leave after my second PASCAL class because the professor made a mistake in the recursive descent parser analysis that I corrected.)
A person is more complex than that, the skill set comes in various forms due to the manner each of us views a problem and its potential solutions. Always have a plan B is a good motto.
Cutting and pasting is no differnet than using a library function except you can see the actual code if you select your source carefully. Many people cut and pasted my code in creating their programs. I appreciate the compliment.
Anyway, good luck on hiring someone who solves the right problem with the right solution just because he/she can put the answer on paper.
Just out of curious, how would you put a 10 thread multi-processor convolution on paper?
If someone asked me that, I would tell them I don’t know what that is and I don’t think it has any bearing on ASP.Net or SQL Server, which is where I specialize.
We obviously don’t ask people things that aren’t relevant to the job, and we don’t ask for things that can’t be represented on paper. I don’t think “trick” questions have any value, I want a practical demonstration of skills. Work history is only part of that, since I’m restricted in the questions I can ask from references. We need more information than that, which is the whole purpose of an interview. “Ok, you’ve passed the HR filter, now SHOW ME why I should hire you”
I personally do not understand the objection to giving a simple answer to a simple question on paper. I’ve seen a lot of people reject this idea for a lot of different reasons – some out of sheer arrogance “I can’t believe you’re asking ME to prove my ability” – I just can’t abide that. I want to say to those people, “if you’re so great, you should have no problem proving it, and your refusal to do it is like pleading the 5th – everyone knows you’re guilty when you do that, you’re just not letting us prove it.”
Why should an employer take a chance on someone who can’t prove their ability? Whether programming is a super power or not is debatable, but if you absolutely need someone who can leap tall buildings in a single bound, it would be very unwise to hire them without a demonstration of that ability. You don’t hire bands you’ve never heard, do you?
You would easily pass our tests unless you refused to do it, and we don’t care about education. I’ve been a programmer for 30 years, so I know where you’re coming from, I’ve been through most of that stuff myself. I have no objection to showing my ability on paper, as long as it’s a valid test.
“those losers in shop”
Wow, how typical, I learned how to weld, and to do woodworking, built homes for 7 years then went back to college and became a programmer, all before you were born. It’s folks like you that make America not so great. Anyone can program, it’s not that hard. It’s not even creative since you are bound by rules and the compiler and OS. Bunch of young weenies!
Go back and re-read the sentence before that one. He’s chastising the “oh-so wise” people with little practical experience who make such inaccurate generalizations.
sGs – Good for you. Good persepective. Welding and mechanics are a lot harder than they appear. I too have been a developer for about 30 years, written commercial successful products etc. I’ve also done some simple mechanic work back when engines were more ‘approachable’.
I liked Mcgowans article, but likening a line of code to a “part” is not a good analogy. Physical items, no matter how simple, are generally more complex that a line of code.
Interesting article. I agree some and disagree some. I just want to point out that sometimes learning to program is not at all about becoming a programmer. I write code at work and do well enough to get by, but I am nothing compared to some of my brilliant friends; however, the reasoning skills, logic, and thought processes I’ve learned in writing code apply to lots of other aspects of my life. For that, I encourage anyone who wants to learn to write some code to have at it — even if the goal is not to become a superpower programmer.
I so much appreciate you pointing me to code.org. Somehow I haven’t seen that yet and it so lines up with my personal mantra: Learning to program will make you better at anything you choose to do. Whether you move on to professional programming or dig ditches having learned the logic, reasoning, and abstraction mathematical skills that programming teaches, in some way better than Math itself does, will improve your life.
That said, I disagree with almost everything in this article. Yes, professional programming is different than academic programming. That doesn’t mean that you can “poopoo” an attempt to excite learners from trying out programming because they weren’t accurate enough for you. “They called it a super power but it’s not a super power.” Congratulations, you’re *that* nerd.
Wow! Interesting points shared. For some, programming is a Super Power. I am so glad that there is something available to introduce youth, schools, and others (via open source) to the process involved with programming. They are definitely using their minds in new ways when engaging in these types of activities.
As a math lover, I also hope that the emphasis on creating more student-centered learning activities that involve the application of mathematics will help to expose, immerse, and prepare learners (of all ages) to explore options in higher level math coursework. The benefits of understanding and applying more math are amazing!
Of the things that I find most interesting is your discussion of additional education. I’ve been tutoring for a few years now, and I compare the knowledge that the people that I’m working with to what I knew and struggled with at that time. There seems to be a definite shift that perhaps comes from teaching a curriculum that is designed to a standardized test. Gaps occur, particularly in math knowledge that I wouldn’t expect.
While I wasn’t particularly great at math, I did enjoy it, and since my father was a math teacher who created the computer science curriculum at the local high school, I was given a peculiar perspective. My dad refused to teach in 3 years what another local comp sci teacher taught which was taught in approximately two semesters of college coursework. Thus, for the honors computer science coursework, we used [Turbo] Pascal (which is quite readable) and went through two college textbooks associated with the first and second semester of the computer science curriculum. While early programs were simple, he stressed the importance of structured programming until we got to our final projects which were somewhat sophisticated. There weren’t many fans of my father, but the people who walked out of there understood more in 2 semesters than all but the most hardcore 3 year students at the other high school (proven by UIL comp sci competitions and AP tests anyway).
And no, I didn’t ask my dad for help at home. I made sure I did it the way everyone else did… in class or during office hours.
I agree with many of your opinions and am pleased someone is starting a dialog on these Ideas. I don’t however agree with some of what you have said. In my 30 years of programming and development experience, some of the most important traits needed to become a successful programmer are the ability to think logically and abstractly along with exceptional problem solving skills. Conceptualizing a system both from a high level and down to the smallest logical units is very important in larger projects.
Math skills are needed but, not necessarily to level you suggest for all types of programming; which brings me to my next point.
Just as there are many types of doctors (Surgeons, General Practice, Dentists …) there are many types of programmers as well.
Web front end programmer many only need rudimentary JavaScript and CSS skills.
Middle ware programmers would need a more structured knowledge of a foundation language like C# or Java.
Data base analysts and Data Scientists would need an even different skill set. This class of programmer, I agree would need a higher level of math acumen.
My point is that all are needed and desperately needed in this country. Many projects get understaffed or outsourced to another country because of a lack of qualified applicants locally.
I have been in several positions that involved hiring programmers and developers and unless I was trying to fill a data Scientist type of position I would focus on problem solving and critical thinking over Mathematics skills.
Does Code.org promote an unrealistic view of programming?
Maybe but, the need for Programmers and Developers is real. Sparking an interest in this subject, even if to only awaken the idea in a young person’s mind that being a programmer is a possibility, is something that I can definitely get behind.
Hmmm.
I think I was pretty clear that mathematics beyond basic arithmetic is actually rare in software development today. In particular I wrote:
And again this is true up to a point in most programming today. About 99 percent of professional programming today is business software, web sites, user interfaces, that involves only basic arithmetic. A lot of it is basically bookkeeping. Maybe one or two percent involves more advanced mathematics such as linear algebra, probability and statistics, mathematical modeling, and other topics.
I think we are in agreement on this point. I do think the role of more advanced mathematics is likely to grow in the future.
An unusually large working memory capacity is probably useful in mathematics, but also in many other contexts including most programming.
My opinion, based on personal experience and research, is that employers are excessively picky and often unrealistic in their attempts to hire programmers, which leads to the perception of a shortage. So long as these unrealistic ideas, which include the idea that programming is a super-power, persist careers in programming are likely to remain unstable — perhaps high paying but risky.
John
I agree that some employers are excessively picky when hiring programmers. I think some of this comes from either hiring managers that do not really understand what skills are needed to successfully complete their projects or working programmers doubling as hiring filters that are excessively harsh to increase their perceived value to the company.
One company I worked for had open vacancies for almost a year because they were looking for that Super Hero. It is unnecessary and wasteful.
I remember a line from years ago – ‘Programmers consider themselves to be artists but they are more like house painters.’
So, are we teaching kids to paint houses? I guess that’s useful if you have a lot of houses to paint and a lot of kids to do it. House painting, like any other learned skill, is not trivial – you have to know where to scrape, where to patch, what kind of paint to use where and when to apply the paint (not in wet weather or to unseasoned wood).
But are we developing procedural skills in these kids or developing an ability to think critically and independently?
I spent a good chunk of my career hiring and supervising engineers at all skill levels and the best people I found could communicate effectively while understanding the technical aspects of their jobs. If we teach kids that making a computer say ‘Hello World’ is the be-all and end-all we are short changing them and ourselves – all we will get is automatons who can write code but who cannot understand that code is nothing but a 2 x 4 in a larger structure.
‘Hello World’ is Lego programming – the pieces are there, you just have to snap them together. This is not education – it is teaching monkeys to type Shakespeare from a printed text. That would be a great achievement but, as a Pierre Bosquet said ‘C’est magnifique, mais ce n’est pas la guerre: c’est de la folie.’
We always teach our soldiers to fight the last war, and, by the same analogy, it seems we are teaching our students to solve the a set of problems that have been solved before.
I don’t know what skills these students will need in thirty years, but the greatest gift we can give is that of critical thinking – of asking the question ‘Why is ‘hello world’ so important to this teacher?’ The answer, unfortunately, reflects badly on us and our ability to guide those who will follow.
wb
Many programmers today seem to be quite successful copying code and being little more than parts assemblers. We do need people like that. Sure, we need innovative and creative programmers to do the hard stuff, but the business-as-usual kind of stuff – server admin, reports, things like that – script kiddies can do that stuff.
I agree with everything you said, but I think what we are teaching kids now is better than nothing. Most kids do not have the aptitude for ‘serious’ programming, but almost anyone can be creative with Legos. Exploring that creativity with Lego-style programming lessons is still valuable.
I think that there is too much emphasis placed here on programming as a “career” and the difficulty of programming professional systems which is definitely difficult, but it’s not the only reason to write programs or learn programming.
Programming can be used to entertain – writing a program for your 5 year old doesn’t entail stringent quality control – just a lot of pretty colors and maybe having his name appear occasionally. Programming is also a discipline that teaches rigor in your thinking – similar to math or music. Teaching these can be an end in itself, whether or not the student ever goes on to pursue a career in any of them. Let’s face it, not many of us become professional mathematicians or musicians but our country would be a poorer one without these in our schools (as we’re finding out in the case of music). I am known as a nitpicker who can find errors in text that other people pass over without noticing. You can argue whether this is “useful” (though in an editing job, it’s almost the entire job description) but I attribute it to being forced to notice tiny errors in programs for years and years. These skills carry over.
So yes, professional programming is not easy and if the only goal we can see in teaching programming courses is producing professional programmers then any encouragement to engage in these courses is unnecessary. But the programming that kids like to do IS easy and often (as in my case) leads them on to many, many other concepts and skills which enrich them and their understanding of the world.
Yes, I got a lot out of the old Erector sets and other canned mechanical bits way back when – it didn’t make me an engineer but it was fun. Perhaps the programming that is done today is similar to the nuts ‘n bolts stuff of the ’50s – but I don’t remember Erector sets being promoted as an apotheosis; it was just what we did (and could afford – no electric motors on my setups but I longed for them).
However, the nuts ‘n bolts were not the be-all and end-all. In fact, they were a very small part of what I did – learning to read a book was more important and, a few years later, I read books that showed me how to make an x-ray machine and build things with electron tubes – nothing that came in a box – I had to find the parts at the local electronics shops or in the Los Alamos junk bins.
It’s fine to lead kids to the water and show them how to drink, but they are a lot better off when they can find their own water.
There is always a shortage of great programmers, because there is always a shortage of great anything. I highly doubt that there is a shortage of good programmers, there actually seems to be a fairly reliable supply of OK to good programmers (I used to be one of them, largely self-taught).
What we do seriously lack are bad programmers. Not bad professional programmers, but people who are in other jobs who can make mediocre programs occasionally. Welding might be an acceptable analogy for systems or application programming, where the technical skill of the workers is the biggest constraint. But any technically adept computer user finds themselves doing programming work which is more like using J-B Weld: small, ugly, and ad hoc. Automation scripts, run-once data mangling, etc. Here technical programming skill is less important than understanding the problem domain and some patience getting it to run right.
The world runs a lot more smoothly by the help of people doing mediocre drain cleanings, room paintings, and glue-ups, lowering the transaction costs of finding and employing professionals. Much of the information-work world could benefit from people who can do the moral equivalent with computers.
I agree – programming for fun and entertainment is very high on my list. I enjoy buying those $50 evaluation boards from Freescale, NXP, TI and others and seeing just what I can mess up – cheap thrills, if nothing else. There’s a beaglebone black sitting on my desk right now saying ‘plug me in!’
Getting too serious about anything is a good way to make yourself miserable, and programming can do this in spades.
On the other hand, software (or ‘computers’ in the following) has a hard and fast rule:
Computers do what you tell them to do, which is not necessarily what you want them to do.
Understanding this distinction is important – what you tell something/someone to do is often not what you want them to to – and a sensitivity to the consequences of imprecise communication is a key skill.
A few followup points, partly in response to common themes in the comments from readers.
It is important to keep in mind what the article is not saying.
The article says that programming is not a super-power like the super-powers in comic books (or like magic).
The article does not say that one cannot accomplish great things using programming. What the article does say is that these great things usually required large amounts of calendar time, trial and error, and debugging — unlike a super-power.
The article also does not say that programming cannot be exhilirating, fun, or very satisfying. It can be.
The article does focus on professional programming. One of the reasons for this is that the code.org video has a strong focus on professional programming, programming as a career, not just a good thing for kids to learn. The longer nine-minute version of the code.org video has an even stronger focus on careers in programming including a prediction of a shortfall of one million programming jobs in ten years.
https://www.youtube.com/watch?v=dU1xS07N-FA
The analogy of programming to a comic-book superpower is particularly inaccurate with respect to most professional programming. Again this does not mean that professional programming cannot achieve impressive, even miraculous-seeming results…over much longer time scales and with much more trial and error than a superpower.
Many popular discussions like the code.org video muddy the distinction between science, technology, engineering, and mathematics (STEM) literacy — in the sense of what most people need to know to deal with our modern technological world — and STEM careers, but these are definitely not the same categories.
Sincerely,
John
Interesting article, I agree with a lot of the points you raise.
I do disagree with one particular statement:
“Programming is mostly debugging”
That is true mostly for dynamic languages. Depending on how strong your type system is, you spend less time debugging and more time designing your types (which is a good thing, because error are caught early in the process (compile time), and for all your code base, vs late in the process (run time) and only for the paths that are executed.
Mr. McGowan put into words what I’ve been thinking. Excellent article! In this world there is going on oversimplifying tendency, and very few tell the words of wisdom like Mr. McGowan.
Most of these comments, dated as they are, miss the key shift in the ‘coding’ or ‘programming’ universe.
I propose this analogy:
coders are house painters
software architects are designers (or, simply, architects). By this I don’t mean to imply that designers or architects are the end state – they are only able to embody larger errors in their work.
Learning how to ‘program’ implies learning how to develop code that accomplishes a specific task as directed by a specification. No more, no less. The important thing here is to adhere to the specification. There are many tools and techniques available to accomplish this, but the end product must do what is specified, described or otherwise defined. Perhaps that spec., description or definition is not what the client or system requires, but it’s not the coder’s job to change that w/o moving up the food chain.
To cite an advertisement for an IoT product, the task is to ‘feed the cat’ – and the advertisement demonstrates how easy it is to ‘feed the cat’ with the product being promoted. However, this does not cover all the intermediate activities – getting the IoT device recognized on the wider network so that it can be remotely accessed by another device, passing messages back and forth through possibly multiple levels of security devices, etc., etc. etc.
So you get the bit of code that ‘feeds the cat’ to work – locally – but how do you ‘feed the cat’ if you are in Bangalore and the cat’s in Minneapolis? Can’t say. Might work if the cat can hunt and there is an available food source.
And this brings me to architecture – I have had a long career in engineering and, later, in IT. These days I’m mostly a dilettante, playing with gizmos sent me by vendors large and small with whom I developed relationships over the years.
But this is not my most important activity – I spend a lot of time working with former employees and others I met during my professional life. Many of them are younger than my children and most of them are working in IT or engineering related to IT. Anyway, the most valuable skill this cohort of people have is communication – the ability to describe a problem and its proposed solution(s) in a way that their clients or financial backers can understand and then, in turn, make that description into a working system. Interestingly, many of the people I work with started out in the liberal arts – many are English majors, some have graduate degrees in Creative Writing. Most of them developed their IT skills on the job and through the extensive training programs offered by Microsoft, Apple, Oracle, the SANS Institute and many others.
But few of them are coders – the coders on their teams are often offshore or working on contract. In this universe coding has become a generic skill, taught at two year technical colleges or narrowly-focused four year institutions in developing countries. It’s the carpentry of software.
The software universe changes rapidly and there was a time when the architecture was defined by the code – but things have changed (or maybe not, think of an IBM ‘system analyst’ of the ’60s or 70s – they defined the architecture of systems that, today, seem trivial = but we cannot use our current knowledge to trivialize the past – that’s a fool’s game).
To make an analogy, code development is to systems as arithmetic is to differential equations – both are descriptions of ‘things’ but different levels of abstraction and generalization.
Teaching ‘coding’ to primary school students is probably a good idea – it puts them into the binary universe where devices work in accordance with their instructions. However, this is not the be-all and end-all of the software universe – it constantly extends itself and students must understand that a basic skill does not make them masters of the universe – it only teaches them how to put paint on the wall. And both the paint and the wall may become something very different by the time they are ready to sell their skills on the job market.
wb
Agreed, but it has some power to do something which we cant do.