Programming is not a Super-Power - John F. McGowan June 4th, 2013
http://math-blog.com/2013/06/04/programming-is-not-a-super-power/
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.
.END
No comments:
Post a Comment