Programming is one of the few professions where you regularly see self-taught practitioners. They have little or no formal education in the subject, but they often do quite well. In some cases, I’ve worked with some who were considered outstanding in their area of focus, like machine control or real-time.
Granted, early in their careers, these folks often produce nasty messes that happen to work well enough but are simply not maintainable or not extendable. But those who stick with it outgrow this phase with a little guidance and encouragement. I’ve also seen professional programmers who are no better and don’t give a damn.
One anecdote about a “real” programmer, a CS student, continues to stick in my mind. She had completed all coursework and was given to me as a summer intern during my post-doc for some extra credit. This was back in the days of daisy wheel printers and as her intern project I asked her to write a program to create x,y graphs on such a printer from input data pairs. After explaining what I wanted and drawing examples of the kind of output desired, she went off to “think about it”. The next day, she came in and told me such a program was impossible. Oh, and one of her CS TAs thought so too.
Of course, I already had such a program. I wanted a “professional” programmer to add some bells and whistles I hadn’t gotten to yet. When shown the working program, and asked to add some of the features (axis labeling for example), she again declared the problem impossible. I never got anything from that intern and would have flunked her. (My research adviser was much more kind-hearted and gave her a D.)
Contrast this to self-taught programmers. They often get into programming because they need something, like a game they want to play or a calculation that is not available any other way. The experience of getting something to do what you want is just magical. “Look, I tell the computer to do this and voila! It happens.” You can’t get that kind of behavior from your friends or spouse or dog.
I think what allows a self-taught programmer to succeed is their passion and enthusiasm for writing code. They haven’t been exposed to the structured education that beats that enthusiasm out of you. But they soon run up against problems that require more than just instinct and they tend to seek out the additional skills they need – algorithms, compiler design, data structures, numerical methods, and so on. They actively seek to improve their skills And they absorb what they need. As they gain experience, they tend to make fewer mistakes and do a generally better job. Just like regular programmers.
Often, they program in the face of active opposition from their management. Programming is not their “real job”. But they keep at it. What better demonstration of acumen and interest?
And it’s fun to talk to them. They are always excited about what they are working on.
This is all a bit self-serving, I know, since I am self-taught. But I was a CS TA as an undergraduate (teaching nursing students to program in FORTRAN of all things.) And I regularly booted up the campus mainframe from the front panel switches. (The path to the computing center was always hip deep in snow and up hill both directions.;-)) I have plenty of CS publications, both refereed and popular press. I even taught programming part time at the university for a couple of years (“Introduction to Programming in C”). But the self-taught just love the craft!