For years, there has been a debate if anyone can (or should) learn programming or not. While reading the Notes and Javascript groups on LinkedIn, as well as the Notes forums on IBM developerWorks, I have read more than one post where someone wants to learn Javascript or Notes programming, but don’t have any programming experience/knowledge.
Can anyone learn to program? No. I would say half the population could learn at least the basics and mechanics of programming. So should everyone of those learn to program? In my opinion, absolutely no. Remember, it is widely considered that it takes about 10 years or 10,000 hours to be good at skills like programming or playing an instrument. A majority will not invest that time in practicing unless they really have the passion.
I think you also need to have a special mindset to become a good programmer. If you learn to program just because you think it is a good career, or something that will pay you a decent salary, but you don’t have the deep interest or the right aptitude, then you will most probably not be a good programmer.
I’m still wondering: why do people who can’t write a simple program even entertain the idea they can get jobs as working programmers? Clearly, some of them must be succeeding. Which means our industry-wide interviewing standards for programmers are woefully inadequate, and that’s a disgrace. It’s degrading to every working programmer.
At least bad programmers can be educated; non-programming programmers are not only hopeless but also cheapen the careers of everyone around them.
Passion
A sign of a good or great programmer is passion. You must be really interested in it to be good at it. Anyone can learn to drive a car, but you need passion and dedication to become a Nascar or F1 driver. This is what drove me to spend hours every day after school in the computer room, until the school closed for the night and I was kicked out. I did not have a computer at home, so this (together with the breaks between classes) was my only chance to practice programming. I wanted to learn, to be good at it, to get the computer to do what I wanted it to do. I wanted to find a problem and solve it, and then find a better way to solve the same problem, until I was satisfied I had the best solution I was able to create.
Problem Solving Skills
When you are a programmer, no matter what level, you need to be able to solve problems. If you are a junior programmer, you might get a task assigned to you by a more senior developer, but you still need to break down that task into smaller parts and solve the problem.
After a fair bit of trial and error I’ve discovered that people who struggle to code don’t just struggle on big problems, or even smallish problems (i.e. write a implementation of a linked list). They struggle with tiny problems.
So I set out to develop questions that can identify this kind of developer and came up with a class of questions I call “FizzBuzz Questions” named after a game children often play (or are made to play) in schools in the UK. An example of a Fizz-Buzz question is the following:
Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.Most good programmers should be able to write out on paper a program which does this in a under a couple of minutes. Want to know something scary? The majority of comp sci graduates can’t. I’ve also seen self-proclaimed senior programmers take more than 10-15 minutes to write a solution.
Logical and Abstract Thinking
This skill goes hand-in-hand with problem solving. You must be able to think though a problem and look at the logic behind it. What tasks/steps are being done in what order? What holes are there in the process? Where could things go wrong? You must be able to anticipate where errors might happen and put in preventive code for that.
Technical Knowledge and Interest
You need to understand the platform you are working with. For Notes and Domino this means understanding about views, forms, documents, as well as the Domino Object Model. For Javascript it means understanding the browser Document Object Model.
You also need to understand the limitations of the platform, and how code is handled internally. A typical example is how new Notes developers still often use GetNthDocument(), because they don’t understand how it works. In most cases, GetFirstDocument/GetNextDocument() is the preferred way to loop through a collection. Yes, there are some cases where GetNthDocument() can be used without any degradation in performance (I believe in a ordered collection, i.e. the result of FTSearch), but to avoid confusion, I alway recommend new Notes programmers to avoid using that specific function altogether.
But you also need to know about related technologies. If you only know Lotusscript or Formula language, you will have a much harder way to integrate with other systems. In the case of Notes, you need to know about XML, COM, HTML, CSS, Javascript and JSON, and understand what Ajax and REST are and how to use them. Knowing — or at least understanding — Java is also a plus. For Javascript, you need to know HTML and CSS well, in addition to the browser DOM. Each language and platform has its own set of skills you need to have some knowledge about.
Finally you need some basic match skills, as well as knowing your language. If you don’t know about the Modulo operator (available in all programming languages I know), you will struggle with your Fizz-Buzz code…
Aptitude
This is really a combination of everything listed above. Either you have it, or you don’t. You can’t teach aptitude.
Despite the enormous changes which have taken place since electronic computing was invented in the 1950s, some things remain stubbornly the same. In particular, most people can’t learn to program: between 30% and 60% of every university computer science department’s intake fail the first programming course. Experienced teachers are weary but never oblivious of this fact; brighteyed beginners who believe that the old ones must have been doing it wrong learn the truth from bitter experience; and so it has been for almost two generations, ever since the subject began in the 1960s.
Saeed Dehnadi and Richard Bornat, School of Computing, Middlesex University
So if you don’t have passion and aptitude for programming, perhaps you should consider some other type of work? The world don’t need more programmers who can’t program. But we need to find the ones that have the aptitude and passion and help them become better programmers, or at least give them the chance to learn.
The year I started 7th grade, a computer club was founded in my school. I had never programmed before, but I liked technology and had a cousin who worked as an engineer at Hewlett-Packard in Sweden, so I joined the club from the beginning.
In order to get an access card to the computer room, we had to take a couple of evening classes in Basic programming and general computer knowledge. While I was waiting for the classes to begin, I went to the library and borrowed a book on programming, read it and wrote programs in a notebook, just to understand the principle. When the classes started, I already had a good idea about how it worked, and soon I was spending all my free time after school in the computer room.
Over the next 6 years, I spent probably an average of 3 hours per day writing code, understanding how the computers worked, testing and learning different programs, and exchanging ideas with other and older students. I even choose programming (combined with geography, another favorite subject of mine) to be the subject of my graduation project. Together with my best friend, we calculated that we spent about 800 hours on the project. It even involved me writing a graphics program first, to allow us to draw the maps to use in the program…
We need to give the students of today, starting already in Middle School, the opportunity to learn programming. They need teachers with real work experience as programmers, not just theoretic experince. I know that for example Bruce Elgort (well known in the Lotus/IBM community) is teaching programming at Clark College in Vancouver, WA. But I think we need to find the students with aptitude for programming much earlier and help them become successful.
Perhaps with better education in the US, there would be less of a need to import foreign workers on H-1B visa. Or at least the companies would have a harder case to argue for importing less costly workers from India and China if there were enough good programmers already living in the United States to hire.
I agree, very well said. I wouldn’t consider myself a programmer, but I have learned enough for me to write small apps and scripts to do what I want, and I am fine with that. But like what you did for your graduation project investing over 800 hours, I’m definitely not that dedicated!
My take is a little bit different. There are really two very different questions here:
1) Should everybody learn HOW to program?
2) Should everyone BE a programmer?
The answer to question number 2 is obviously “no”, in just the same way that not everyone should be a writer of fiction, a mathematician, a physicist, a carpenter, or what have you. Even if we teach absolutely everybody the basics of programming in school from an early age — as we do with arithmetic/mathematics, the basics of literate production/consumption, with science (except where science is forbidden on religious grounds, like Texas ;-)), and as we once did with practical skills such as basic woodworking and so on — it would still take a large amount of effort, skills development and (one hopes) interest for people to move beyond mere awareness to a level at which they could become effective professionals. And there is certainly room for people to take a hobbyist’s interest in the matter or to supplement other domain knowledge in order to automate other things (creating macros and that sort of thing), just as someone can take their arithmetic and use it to balance a chequebook (do people still do that?) or take what they learned in shop class to install a set of shelves.
On the other hand, I believe that programming (for want of a better word) should be part of everybody’s basic education. It would help if we could divorce the idea of programming from the tools we use to express it (computers). “FizzBuzz” is a good example: most people of at least near-normal intelligence and ability are perfectly capable of *understanding* the rules and playing the game using those rules, but are almost completely incapable of *expressing* them correctly and unambiguously. (And it is incredibly depressing to see the code that is inevitably posted to any FizzBuzz-related comment thread by people who say they derive their income from programming computers.) Make no mistake, it is that language for expressing a process that is programming’s most valuable characteristic. That it may be used to control the behaviour of an electronic computer is a happy side effect, although that side effect is, perhaps, the thing that brought the need for a formal language of process description to the fore. (If you think you’re hearing the echoes of SICP here, you’re right.)
Most of the principles underlying high-level programming have a much broader application than controlling electronic computers. Linear processes, loops, conditionals, state change (often irreversible) and so forth can be extended to almost every area of human endeavour, and having an unambiguous, formal means of expressing them will add a lot of new tools to everybody’s toolbox.
The key will be to get ’em while they’re young. That won’t be just to identify kids who have an aptitude for programming; it will also eliminate many of the deficiencies that have been identified in the studies you’ve cited. We *can* teach people to form consistent models if we choose to, so why not choose to? Computers make a good environment for exploring this sort of knowledge precisely because they are so very stupid and literal-minded. It’s like explaining what you want done to the least-brilliant person you can imagine. If you can them to do it correctly, then and only then will you have described what you want done adequately. We need that skill everywhere.
I’m with Stan on this one. Programming teaches the basics of problem solving that will become a valuable life skill. The fact that many first year CS folks drop out is probably indicative of a problem in our High School curriculum, and not an indicator that folks need an inherent natural ability to program.
I’m no F1 driver, but that doesn’t mean I should stop driving. I make decent coin doing what I do, and I’d encourage anyone with my mediocre brain to go into coding if they have the inclination. At best they’ll find a career, at worst a logical way to solve problems.
Check out this ted talk: http://www.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code.html
His main point: Being able to use computers without knowing anything about programming is like being able to read without knowing how to write. Just like we teach everyone to write, even though we realize that not everyone will be a professional writer, we should teach everyone to program, even though most will not be professional programmers.
To encourage kids to learn, his team at MIT developed scratch.mit.edu, a fun way for kids to do cool stuff, like creating greeting cards, animations, their own computer games, etc. (and learn some programming concepts at the same time).
I was a high school teacher during the 1960s (chemistry, general science, mathematics) and around 1968-1969 started teaching them how to program. There weren’t many computers accessible to school kids way back then. They used a paper clip to press pre-punched chads out of 80-column cards, their program was sent otf to nearby Monash University (in Victoria, Australia) for execution, came back a few days later, and after any correction(s) over the ensuing week or two eventually gave them a printed report.
I left teaching to join IBM in 1970, don’t know if any of the kids went on to become professional programmers, but hopefully they learned the basic concepts of programming (and understood that computers are essentially pretty dumb in themselves).
The environment is slightly different today! My three young grandsons are all totally comfortable using their iPads, which do things that nobody (except science fiction writers) would have dreamed of during the 1960s. In fact even the youngest beats me hands down and he’s not even reach three years old yet.