So You Want to be a Programmer

Jeff,

I couldn’t agree more. I remember back in high school, I would see kids with games on their TI-83+ and it fascinated me that people could “somehow” make games that run on a calculator. And so my curiosity led to me writing my first code in BASIC on my TI-83+ graphing calculator.

Looking back, I wonder where I would be today if the internet didn’t exist 10 years ago. I might very well not be where I am today. The sheer wealth of resources out there for kids and adults to find by merely querying their favorite search engine is insane… we don’t need to be trying to teach everyone to code, those who desire/need to learn to will do just so without it being imposed upon them. There are very few barriers to entry, if any at all for most. Being relatively young, and only having heard stories about the days of punch cards, vacuum tubes, etc. I can only imagine the barriers to learning to code that existed back then.

Had I taken a programming class in middle or high school, I might have found my love for code before my 30’s. Had the people in my life been been less discouraging when I wrote a text based adventure game at 19 for fun, I wouldn’t have a final next week to deal with. Girl nerds in the 90’s was still rather taboo. So I’m all for a mandatory basic programming/comp sci class when kids are being forced to choose what they are going to do for the rest of their lives.

However, I agree with the meaning of this and the previous harsher post. The learn to code movement is just rather silly. You can get the benefit of the problem solving easier from logic puzzles without having to bother with syntax. You can understand computers quicker by googling the issues that come up instead of asking someone to fix it.

The posts get longer and less cogent.

To take yourself to the next level of development, from just a rank-and-file, there has to be passion. Otherwise it’s just for the money. At least that’s what I get from your telling of Parable of the Accountant.

To the car analogy (and yes every analogy breaks down), I would say that while you don’t need to learn how to change a tire to be a competent driver, it’s at least worth learning how to do.

Coding might not have the same “life-skill” value as changing a tire, but you can make the argument of learning to retrain your brain towards how to analytically solve problems is. That’s the value of learning how to code. Not so much the hello world, but to stop and think “How can I write software to make this easier.”

Should everyone learn to code? No.
Should everyone who uses a computer for their work, learn to code. Yah, I think so.

I have to agree to some extent with the backlash against this post and your previous post, I do think you’re missing the point.

It’s not about learning to code, it’s learning when to code. Despite what we would all like to think is common knowledge - that computers are good at doing repetitive tasks, this is still widely unknown amongst non-technical users. Ineffeciencies and problems that could be easily automated are highly prevalent in a vast number of companies, yet those running up against these problems don’t even seem to recognise that they’re problems that could be solved with a computer.

I completely agree with you that not everyone should become programmers, but the easiest way to help users understand the problems that programming helps to solve is to teach the very basics.

To try and use your plumbing analogy, if water starts spilling across your kitchen floor, everyone knows to call a plumber. If people in your company spend all day typing the same values into the same fields of a database or a spreadsheet, it’s still not largely known to call a programmer.

The second, slightly orthogonal issue is that the essence of programming is generally not taught in schools, meaning we’re missing out on the opportunity to introduce the most suitable students to the field unless they stumble upon it purely by accident.

I’m firmly in the “everybody should learn” camp, but I think the point is being missed by both sides (here at least, and in some of the spill-over discussions I’ve seen elsewhere).

At the risk of “No True Scotsman”, the universalist argument has not been that people can’t truly be users (as opposed to “the used”, I suppose) unless they know how to program their own computers, or at least write effective macros and utilities, the Stallmanites (both orthodox and conservative) notwithstanding. As Jeff and others have eloquently pointed out, for most people a computer is nothing more than a versatile sort of appliance. And if we in the development community are doing our jobs properly, we are making $person awesome at $task. (I really miss Kathy Sierra.)

Programming will probably always be a specialist venture. We may be able to modularize the heck out of things, but it’s unlikely that we’ll ever get much beyond the equivalent of a Moog synthesizer. Remember them? You could spend hours playing with patch cords without ever finding a way to change the pitch with the keyboard, and getting anything other than a rudely biological sound out of one required either special knowledge (whether that be book learnin’ of the waveform interaction or experience with the synth) or luck. People who are trying to accomplish $task will learn what they need to use to do $task; their productive value lies somewhere other than in building TaskDoer 2100 (which is where our value lies).

There has also been an intimation that people will gain a clearer understanding of the development process, including things like project estimation and programmer husbandry by learning to sling a bit of code themselves. That is both a very long way from the truth and a long way from the universalists’ point. In terms of the truth: do you really want somebody basing their understanding of highrise engineering difficulties and construction schedules on knowledge gleaned from building a gazebo during a carpentry night course? Because that’s the sort of thing we’re talking about here.

No, the true utility of having everybody learn to program (not necessarily code, but program) is to be found in the education of our children. As a side effect, we may find that we increase the pool of potential professional developers that we can draw from, but that, too, is missing the point somewhat. We have a tremendously narrow view of what it is that we’re doing simply because the main application of it is accidentally tied up with computers at the moment, and because the bloody-minded literalness of digital computers (or, as Hofstadter’s Crab so wonderfully named them, “smart-stupids”) is an excellent milieu in which to test what we are really doing. What we are really doing is formalizing process, and that has application just about anywhere you care to look.

There are pedagogical aspects that need careful attention; what is taught and explored needs to be generalized to the wider world. There are just too many things that kids are exposed to in school without ever really learning their applicability outside of the classroom. We laugh at Schlemiel the Painter, but there are people out there in the real world performing strenuous physical tasks with a big-O of n^2 or n! without having any intuitive understanding of the complexity or how to determine whether there might be a better way. And what of those whose job it is to write instuctions for other people? That’s not the exclusive province of documentation departments. Having a sense of how things may be interpreted, how things can go wrong, debugging, and so forth certainly wouldn’t hurt. You may be able to do a top-down process improvement by bringing in time-and-motion analysts, but you’ll get a lot more bang for the buck (and a lot more bucks from the bang) if people working at the pointy end can optimize their own work.

We who are in the biz are going to have to know (ideally) the “multivariate calculus” level of the formalism, as well as the accidental details of computing languages and environments, in much the same way as any specialist needs to have an in-depth technical knowledge of their area of specialty. That’s not what needs to be universalized. It’s the “arithmetic” level, maybe with a bit of “basic algebra”. And while programming a digital computer might be a good vehicle for developing some of that understanding, it’s not about getting everybody up to speed in JS/Java/C#. Raspberry Pi will include Scratch; Alice/Looking Glass is similar for kids beginning slightly older. I’m still a fan of Logo and chasing turtles around – I never actually used a Logo machine, but I grokked recursion after reading about it (and before practical home computers).

Kids who want to go on to “real” programming can, using real-world programming tools, but if everybody had a basic understanding of how to decompose tasks and a feel for patterns of performance (learning big-O without ever thinking of saying the word asymptote), they’ll all benefit. Well, unless they go on to study and then teach English Lit or something silly like that.

Jeff Atwood write extraordinary posts, the extraordinary is that after all the verbose he don’t get it.

"So, no, I don’t advocate learning to code for the sake of learning to code. What I advocate is shamelessly following your joy."
That’s not new, I would say “do what you love”, and that doesn’t mean that “not everyone should not learn to code”.
There are always things that you should learn and you do not love, and things that you shouldn’t but you do love.

When you learn to code, you do not learn how to write commands in a certain order, you learn how to think and solve problems.

Well since most of us are actually coding against frameworks that are very abstracted from the actual “computer” upon which they reside, I don’t think any of this kind of stuff strictly counts as computer programming…

Whilst I would agree with Jeff that this drive will not necessarily make good problem solvers (afaic, programming starts and ends on paper; anything else is just an implementation detail) and is perhaps more likely to end up producing Schleimels than anything else, I would also point out that if you throw enough mud at a wall, some of it will surely stick and as a way to perhaps encourage people to see if they are ready to try it for “real” - people who for example are already programmers (just not computer programmers - anyone who has ever designed any kind of a process is already a problem-solver) then I say, why not?

If nothing else it might help to de-mystify the profession and help someone to express their ability in something other than human language.

On the flip side; a part of me is scared that someday I’ll have to deal with a client who is convinced I can build a facebook clone in a week because they can “debug HTML, it’s not that hard” :slight_smile:

So you should be doing what you value instead of learning for the sake of learning… Except you can’t value something you haven’t learned, so your advice doesn’t help. Also, you should probably value learning in general anyway as it leads to knowledge and also keeps your brain healthy. Learning doesn’t guarantee living a good life, but it’s arguably the best approach. This post is just a self-serving attempt at damage control after finding out that “please don’t learn” is seen as harmful advice. The only good follow-up from you would have been to show humility, but instead there is more verbose guru-style twaddle about how you are right because of <insert cliché here>. It’s the point where at least this reader is parting ways with Coding Horror.

In the future, everyone will be interacting with code. A lot of us are going to be interacting with programs that let us tweak settings or maybe even churn out something resembling a finished program or homepage. Maybe we will even interact with honest-to-god coders.

To dot any of that at some non-ridiculous level of effeciency, we will have to learn “the first thing about coding”. Maybe even the second. We need to code, a bit, in school. The same way we need to “math around” a bit in school, in order to understand basic tenets of math (ie. tax, purchases, loans, engineering, the world).

This is absolutely horrifying:
"On two occasions I have been asked,—“Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?” … I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question. "

And it is still going on, in the corridors of economic and political power. And teaching everyone the first couple of things about coding would alleviate it.

It’s easy to setup straw men on either side of the debate. You’re not saying that anyone should be computer illiterate while your detractors don’t claim that everyone should write an OS. As you mention, ‘coding’ is tricky to define. Do Excel formulas count? How about simple MS Office scripting? I’m sure we’d all agree that everyone should learn basic skills that someone out there will call ‘coding’.

Regardless of where you draw the line, what I think you’re missing is that programming skills are only becoming more important as time goes on. Minimal acceptable competence is not a static concept. Although the ability to read was once only of marginal importance, forward-thinking individuals realized that it’s nigh impossible to err on the side of becoming too literate. While programming is not currently essential to a majority of occupations, it’s difficult to predict what things will look like a few decades hence. Learning to program might not be worthwhile for Michael Bloomberg but I can’t imagine not teaching a child born in this millenum. The ‘plumbing’ analogy really breaks down when applied to more widely used skills such as ‘algebra’.

Can you move the coding horror blog to the stackexchange already so we can vote replies up/down…

wading thru all the posts can be tedious, but crowdsourcing the quality ones (both positive and negative) would be great.

I think anyone who works with data needs to learn some basic programming. Even if they never write programs, the experience can at least give them a taste of what programs can do.

There is a big difference between computer and cars or plumbing: computers are infinitely programmable, and the average user often has no idea about the many things their computer could do for them, if only the right program for it existed.

Despite the advances in what software written by professional programmers can do, there will always be some obscure need that is so specialized that it can only be solved with a custom-written program.

People know that if the plumbing doesn’t work, they can call a plumber, but they often don’t even notice that their computer “doesn’t work” and they could/should call a programmer. By “doesn’t work” I don’t mean that it is malfunctioning, but that it is being underutilized.

I’ve had coworkers who wasted hours, or even days, doing repetitive labor on a computer. When I learn about it, I write a script to automate the task. Writing the script usually takes a few minutes, or an hour at most, and ends up saving them huge amounts of time. You would wonder why they didn’t ask for help before. The reason was that they had absolutely no idea that the task could be automated. When you show them that the computer can do that, they are as surprised as if it were doing magic (thus proving that Arthur C. Clarke was right).

My hope is that teaching people like my coworkers some basic programming will increase the odds that they will ask for help when they need to use a computer efficiently. This could even lead to increased employment for real programmers like us!

Your analogy to car mechanics and changing a tire is a good one, but it actually does more to undermine your position than support it.

One of the biggest problems as a “programmer” (I know, you hate that title), is that the consumers don’t understand the differences in complexity between incredibly different projects, such as, a device driver and parsing a text file.

I’m no mechanic, but I understand that rebuilding a transmission is much harder than changing a tire.

Secondly,

I think this article written by your fellow Stack Overflow founder is especially relevant – http://www.joelonsoftware.com/articles/LeakyAbstractions.html

Just because I’m a user of software doesn’t mean it doesn’t benefit me to understand at least a little bit about the abstraction.

Again, I’m not a car mechanic, but I do know that an overheated engine can be helped by turning on the heater, because the heater works by just pulling heat from the engine. So, even though I don’t plan on becoming a mechanic, it benefits me to learn a little bit about the abstractions of the things I use everyday, like cars and software.

They teach programming in year 10 here in Australia (~16 years old) and i’m 31 now. For my end of year project i wrote a RPG adventure (overhead map and all, inventory and a boss!) while everyone else had trouble doing the “ask for a name and show it in a sentence” problem.

Now the question is: Did it help ANYONE of those in my class learn to think better, learn to understand computers better, learn to critically think better? NO - if anything it caused more confusion and they were just generally lost for the entire year. It was a complete waste of time for them.

The problem is that anyone at all can manage to write a few lines of code and get it working - the benefit of doing this exercise are next to nil so unless you want to be an actual coder and are genuinely interested WHY are you going it? If you want to just “see what its like cause you might like it” then go for it! you might indeed enjoy it :slight_smile: and good luck to you! But don’t try and force it down EVERYONE’S throat. It just doesn’t work unless the student is actually interested.

@Brendan Abel
Learning what you listed about cars is akin to learning how to use the OS of a computer e.g files, file attributes, how to copy n paste, how to install an application and remove it again - NOT programming. These are the things that actually help users use their computers effectively.

Learning ‘a bit of programming’ is like randomly spending a week with a mechanic to learn a bit of how to tear down an engine ‘just cause it helps me understand engines’. Which would be insane to most people and that’s why we developers are wondering why everyone suddenly wants to learn some coding on a whim.

What people need to learn is how systems work, how files work, how the internet actually works - these things will give you a real benefit and huge levels of productivity at work or home and most people do NOT know them.

People STILL have no idea how EMAIL works for gods sake. Some spammer uses our from address from a newsletter to sell some viagra and they reply to us with angry letters and possible legal action (yes our smtp servers are ip relay restricted and i check the logs each time just in case, it’s never us) - they have no idea anyone can effectively use anyone anyone’s email address as the from address without an issue - its just very likely to be marked as spam that’s all. You tell people this (young or old!) and they think you are crazy.

People need REAL computer education, effective education about real technically things they use! Personally i think email is broken and we need a real alternative - Email 2.0 as it were heh

Interestingly, people like doing the opposite. When you tell them not to do something, they seem to get anxious about why not to, so they do it.

For a supposedly rational bunch we sure do love jumping on the latest fashion / bandwagon /magic bullet.

Everyone should learn to code? Be careful what you wish for :wink:

http://i.imgur.com/Mev10.jpg

Seems that since that post where Jeff told about the benefits of everybody telling the true, he’s getting a lot of sincere opinions about his blog. If he should follow those opinions, he could stop posting about “things about life” and could go back writing about “things about computers , a strictu sensu”.

Totally agree with Jeff.

I think the “Everyone Should Learn To Code” is really just an attempt by programmers to make our job easier. How many times have we thought, “Man, the user wouldn’t be bitching about this if they just effing understood how this stuff really worked?”

This movement, to me, is programmers trying to solve their own problems instead of the problems of the users.

Lord knows I’ve spent time with people explaining that I understand that to them a certain change should be “like a 30 second change” but it actually a 4-developer, 3-week nightmare involving multiple vendors, etc. It’s frustrating and I wish - at those times - they understood that better. But that’s not their job. Their job is not to understand me, it is my job to understand them.

The entire argument strikes me as very Apple vs. Linux in approach. The Apple approach insists that the user shouldn’t be required to understand anything other than their want, whereas the Linux approach encourages the user to try and solve their want on their own. Is there anything wrong with the latter? No. Is it for everyone, no. And that’s the problem with the “everyone should learn to code” conceit.

Perfect example of how knowing a bit of programming and the basics of what a computer and a program is, is a great idea:

http://tech.slashdot.org/story/12/05/31/237208/judge-rules-apis-can-not-be-copyrighted

A judge with no understanding of programming could have made this an absolute disaster for interoperability, licensing, and basically doing anything on a computer where a big software monopoly already has a vested interest (hint: that is a lot).