I really, really disagree with Jeff Atwood here. Jeff has interpreted "learn to code" with "become a programmer". They're not the same thing. I don't think that is what this meme is about at all.
Programming is logical thinking in practise. Programming is breaking a problem set down, thinking step by step through it, thinking of edge cases, and making it work. There is nothing wrong with Jeff's BASIC example, if that is where the mayor of NYC ends up.
There was once a time when books were only read and written by an elite group. Now everyone can read - and everyone can write. There are still the elite authors that write better than the rest of us. Just because everyone can write, doesn't mean everyone is trying to be a professional author.
Computers are a part of society. To function well in society, it's beneficial to understand a little about how they work, and how to make them do things. The essence of programming is making a computer do something more efficiently than you can.
Programming isn't just the advanced stuff - recursion, pointers, functional programming, or whatever. Maybe Jeff is too far down the rabbit hole to realise this, but most people don't know what programming even looks like. They don't know how we tell computers to do the things they do. Recently I was with a customer, making notes about changes I needed to make to their application. They asked me "Is that how you make it do that?". No - that was my TODO file. And these are people that work on computers all day, every day.
It's beneficial if marketing folk understand the basics of programming when they're doing web ads. It's useful that CAD engineers know the basics so they can automate AutoCAD. Its useful that financial accountants know basic programming so they can become more efficient with analysing data.
If the mayor of NYC wants to learn to program in his spare time, why the hell not? I bet there wouldn't be the same complaints if he wanted to learn how to surf.
With a couple of months of programming knowledge, I wrote a program that saved my company $2MM/year. The key was combining knowledge of the business processes with some knowledge of programming. There were people with knowledge of one or the other, but not both.
I still can't write a basic app, but that doesn't matter. I can do things that provide massive value, and I wouldn't be able to do them without programming knowledge.
I think Jeff is underestimating how much time the average office worker would save simply by learning Excel Macros or some basic scripting. Learning to program is really damn valuable, especially in fields where most people don't know any programming.
I agree with this wholeheartedly. My line of work could be made much easier through some very simple software. The only reason that software doesn't exist is because (I assume that) nobody with programming knowledge understands the needs of someone who does my job. Or cares, for that matter. There aren't many of us.
I'm working my way through Ruby on Rails tutorials simply because I think there's tremendous value to be created without the need for anything groundbreaking. Just tailored.
And if I'm right, I'll be able to afford to hire someone to fix my crappy code.
If you are right there are probably a hundred people on here able to provide a working MVP alongside you and do it faster, cleaner and pick up on solutions you cant possibly know yet. Be a domain expert.
I'm sure anyone here could do that. But how many people here are looking for a non technical co-founder? Coders are solving their own problems, and until I can hack together a prototype I don't think I'll be able to draw any attention from real programmers.
I think I'd actually prefer a pure domain expert who can express their business and ideas well than a half-assed programmer.
No offence, but what often ends up happening is you turn into a know-it-all client. "This should only take an hour. You just have to loop over these results and format them...".
Finding a technical co-founder is a sales process where you need to prove that it's a good idea and that you've made a significant investment yourself (I would prefer if it wasn't code) like thinking through the interface, and as many use cases / stories as you can think of, and describing in detail the problem(s) being solved.
The pitches we hate are the guys who know you through a friend who want you to make a Groupon-like application for their specific market, without having invested more than the 5 minutes it took to write it down while baked. I'm still not going to be sold on this idea even if they manage to throw together some terrible PHP site that sort of acts like a real application.
That being said, I'm in the boat that thinks at least some rudimentary programming skills would be useful for everyone.
> you need to prove that it's a good idea and that you've made a significant investment yourself ... like thinking through the interface, and as many use cases / stories as you can think of, and describing in detail the problem(s) being solved.
That sounds exactly like the skillset of a good software engineer. This whole debate is about the fact that a whole bunch of people don't know how to break down a large problem into small logical pieces.
"describing in detail the problem(s) being solved" is about the most concise and accurate description of programming I can think of. Asking someone non-technical to do this is like asking a ramen noodle-eater to describe in detail the process of flambéing Steak Diane.
I agree it's a good skill to have in many careers, software engineer included, but it is definitely not the definition of programmer. If you wanted to map this skill to a profession, I'd probably go with Business Analyst being the closest.
Breaking a problem down into solvable parts is something I was taught in math and it was invaluable. I'd written programs before and after that, so I wouldn't say that this technique makes you a programmer. Rather it's an approach you'll need to be a good programmer.
Asking someone non-technical to describe the problem they want to solve in detail is completely within the realm of reason. Non-technical != moron. Knowing how to do this, does not make you a programmer. Likewise, being a programmer doesn't make you good at this.
What about knowing enough coding to understand the amount of work that needs to be put in to transform an idea into reality? Also to be able to construct the interface is easier when you know some code. Those are some reasons why I'm investing time to learn programming.
I think the assumption that you will understand the amount of work needed for a given solution is part of the problem. Estimating a project accurately is NOT a skill you're going to pick up by learning a bit of programming.
As a programmer of many years, I still miss-calculate the amount of work required to solve a problem. It's something you get better at over time, but I totally sucked at it when I was starting out as a programmer. It's one of the hardest skills to attain IMO.
I think it's great that more people learn to code. I'm just saying it's not some magic faerie dust that solves all your problems. It's just another piece of the puzzle.
Not by me. I can't afford to pay them unless I can raise some money. I don't see how I can raise the money unless I can cobble together a prototype myself... even if just to show that my idea is viable and that I'm serious about it.
I wrote an online attendance system for my school, which often come with way more features than we need and cost in the range of $50k. It's not $2 million, but $50k is a teacher's salary. In education, that's huge. It took me 2 weeks to set up, and another 4 weeks of testing with teachers to iron out all of the bugs, but now it is used every day by all of our teachers.
I've also used my ability to code to develop learning apps for my students. It's been incredibly valuable in my career.
"The key was combining knowledge of the business processes with some knowledge of programming."
Knowledge of programming wasn't required to save your company 2mm per year. All it would have taken is someone recognizing there was a problem that could be solved by programming. If you did the job with a couple of months of programming knowledge someone could have been easily hired to do this job, right? They just had to realize there was a problem to be solved.
It seems to me that someone who had any knowledge of what computers could do could have saved your company that money. Just like a person working in a commercial kitchen that wasn't a carpenter could have hired people to improve efficiency and save money.
Sorry you're wrong based on my many years experience with dealing with non-programmers and this exact situation.
Seeing what is already being done with computers on a daily basis gives people knowledge of what can be done without knowledge of programming. Knowing programming but not enough could also be an impediment as well. You may not realize there are simple ways of solving an issue that to you with your limited knowledge seems like it could take a tremendous amount of effort. There is an expression "a little knowledge can be dangerous".
And how many people are going to take the time to learn to code enough anyway to see all the possibilities?
I'd say they're right, based on my many years experience dealing with non-programmers and this exact situation.
Knowledge of programming and the business are both important and key here, but it's the slant towards business that can give someone the leg up on saving companies money. It isn't always about simple data entry or automation, it's going about your daily job with the insights and skills that basic programming provide that allow people to recognize where a new script or application could improve their business process in some way.
Business processes can be extremely complicated, and you can't easily impart business knowledge and processes upon a programmer in a manner sufficient to give them the ability to recognize where their skills can be best applied in a business.
In terms of capital + human capital multiplying your effort, programming is pretty hard to beat. Compare sales calls, meetings with important people, instructions delivered to staff, farming with tractor; even hands-free investing requires a lot of time.
I think the most similar skill to coding is writing. John Updike remarked, several decades ago, that fiction creates value without destroying anything (ok, a trivial fraction of the value). But it's clearly not just about being able to put some words on a page.
Sure, I think he's also underestimating what percent of average office workers actually do have some of the talents and inclination to become skilled professional programmers. Despite excelling at math and doing some basic programming (in qbasic in fact) as a kid, it didn't occur to me to major in CS until I was halfway through college. I think broader exposure can only help people realize that programming is something they actually are interested in.
Well said. I wholly agree with "learn to code" != "become a programmer".
Learning programming has helped me in many other walks of life. It has taught me that every problem can be tackled with a systematic approach, given enough time. I like to think that helps me to notice things that would have gone unnoticed without. More than anything else, it is this approach, enforced by programming, for which I hold gratitude. Critical thinking.
I am trying to say there is a distinction between those who are trained professionals and those who have basic knowledge. I am getting the feeling people are taking this issue personally. If you want to become a trained professional, please do so. As for me, I have paid my dues and consider myself one.
Well, it is your camp that is equating "learning programming" with "becoming a programmer."
I don't know why you should feel threatened or defensive about the fact that a lot of people want to understand your basic skill set. I don't know many mechanical engineers who discourage people from learning to fix their own cars.
>There is nothing wrong with Jeff's BASIC example, if that is where the mayor of NYC ends up.
Are you sure about it?
What if he suddenly starts thinking that he actually knows what goes into building software?
Democratization of programming is a lofty ideal, but in the reality anybody who wants to learn to code will do so if he has a computer. This latest fad is nothing more than a trivialization of a complex skill and an attempt by some non-technical hipsters to be even more hip. If plumbing was cool we would see the same people vowing to learn how to plumb this year.
I can't tell if you meant that in a pejorative way, but are you sure? BSEE, started a "big data" company a thousand years ago which is still the "Xerox" of its industry.
I doubt he solders today, but he has the background to understand the interplay of software, hardware, delivery, etc. He has been noted to be very big into prototyping technology with his company's platform. You might say agile.
> Programming is logical thinking in practise. Programming is breaking a problem set down, thinking step by step through it, thinking of edge cases, and making it work.
If the benefit of everyone learning programming is logical/critical thinking, breaking a problem down and thinking of edge cases, etc, then why not focus on teaching everyone how to do that instead?
A good way of doing that may very well be teaching some form of programming, but unless you explicitly state the goals up front a lot of people are very likely to miss the point completely and either teach just programming, or learn just how to code.
You could do that, but one of the best things with coding is that you get instant gratification and constant feedback.
"Hey look, my computer just said Hello to the world!"
The ability to play with scenarios while exercising your logical critical thinking and to get instant feedback is essential to learning.
I liken it to the difference between learning photography in the film days vs. digital. I bought an SLR in the late 80s but it was very expensive and time consuming to get good. I had to buy and use up a roll of film, take some notes about when, where and how I made the shot, then pay to get them developed. With digital, I see the shots I make instantly, and I can make mistakes and try again without incurring constant film and development costs.
I don't understand the distinction you raise in the first paragraph. Coding is programming. Just because everyone can divide doesn't mean everyone is trying to be a mathematician, but I think everyone should (at least have the opportunity to) learn long division. Programming may not be the fourth "R", but maybe "Research" is!
I think the important distinction would be how much additional knowledge you need to solve the problems you solve. I'm gonna call the "coding" "scripting" for now, and the "programming" "programming", because these are older and in my opinion better terms.
Scripting basically takes the problem and a language and directly transforms the problem into a working program. You don't need fancy algorithms, you don't need fancy background knowledge in programming topics, you need python, a python dictionary and directory access (for example). Or Excel and VB and a few arrays and a formula.
On the other hand, heavier programming would require more and more thought when actually implementing a solution to a problem. Efficiency might become a large concern earlier, you might need more complicated algorithms sooner and so on. Think about every occasion where you transformed a problem into a graph problem and applied some graph search, or graph coloring to this problem.
If I understand "coding" as "scripting" and "programming beyond coding" as "programming", the distinction makes sense, and it makes sense to call for more people with the ability to script simple things, because scripting is not too hard and saves a lot of time.
Being a programmer is really really really fun the first few years. Kinda like playing video game. However, it eventually become something that is can be unhealthy. It really undermine other sensory input from the body. And primarily focus on the mind and finger interaction.
However, given the current state of the world, where many things are in one way or another controlled by software. It would be a good idea to have a skill related to coding, just to know if something is possible with code. And understand that it is not just magic under the hood.
As opposed to a professional "coder"? (I also see "programmer" as a more distinguished title and I prefer it to "coder" (and even "software engineer"), but I don't understand any of these terms to have any generally-accepted definition; personally it is only a matter of taste.)
I'm not trying to be facetious, just misunderstanding whatever point original commenter is making. "Most people don't what programming even looks like"? I don't think that is true because most people can search for code samples if needed.
You seem to be a bit disconnected from reality. If I told any one of my friends who are not programmers by trade to look for code samples, they would either not understand what I'm talking about, or simply not know where to look.
Most people don't even have the slightest idea what kind of problems software can solve. Jeff Atwood seems to interpret "learn to code" as "learn to set the DYLD_LIBRARY_PATH variable". Others—myself included—think that having at least a bit of exposure to programming provides you with a better overall understanding of how computers operate.
I don't think it's necessary to have that understanding. But neither is speaking a second natural language. Apart from acquiring the skills themselves, learning any of those will teach you meaningful things about yourself and your environment, which seems to be worthwhile.
Most people don't even have the slightest idea what kind of problems software can solve.
I was once told by a good friend of mine in industry X that people in that industry have money but they don't know whats possible - they don't know what could be automated or calculated with computers and so they don't do it, even though it would provide a lot of value to them.
 In general, I think the industry is irrelevant and this applies to most industries that don't already directly employ programmers. There are often already some high tech firms that do and they have a huge advantage over the masses that don't. In this particular case, the industry was the betting (horses) industry and there are actually plenty of firms that are high tech and hire programmers and mathematicians and such to create complex software, but I think his point is that there are still a lot of smaller firms and people who spend a lot of money that still don't know what is actually possible. He since moved to a much more high tech company, but he still does most (if not all) of his complex risk assessment modeling in excel.
You are very wrong about this - people who know how to "search for code samples" know what programming looks like, but they are far from the majority.
I, for one, wish more people understood what programming "looks like", so that I could actually talk to people about what I do without them being completely confused. People can visualize what nearly every other profession does day-to-day, but what programmers do is a complete mystery to most people. I tell people that I'm a writer for a language with a very structured grammar, but that's only part of the story.
> People can visualize what nearly every other profession does day-to-day
No they don't. They know an architect draws pictures of buildings. An engineer draws pictures of a bridge and hammers away at a calculator (actually the first thing most people think of with engineer is probably either boats or trains or Star Trek). A banker sits and acts like a total dick. What architects, engineers and bankers really do is a complete mystery to people.
When someone asks what you do and they do not have any domain specific knowledge, you say you write applications, you're a programmer. That's all they want to know, they don't care what the details of what you write are. They don't want to know the differences between languages. They don't want to know what a structured grammar is and why you care about it. Those are details of your job, that's not what they were asking.
"I'm a system administrator. I keep computers working." That is the maximum extent people want to know about what I do. They're being polite in asking, they don't really want to know details. And at the end of the day they still think that all I do is sit on my ass and look at a computer screen. Just like the way they visualize a programmer, and a banker and a ...
I don't buy it. An architect designs structures - most people don't know what the actual work of designing a structure looks like, but they know what a design of a structure looks like. An engineer figures out how to make a structure stand - most people don't know what the process of making a structure stand is, but they know what a standing structure looks like. A banker moves money around, people don't know how that is accomplished, but they know what a loan looks like. Most people I've met don't have any idea what a computer program looks like, not even that it involves text. I didn't say anything about the differences between languages, and I think you misunderstood my comment about "structured grammar". I didn't mean it as a specific feature of what I do, but as a generic feature of what a computer program is. I only meant that the closest analogy I've found to programming that most people can relate to is writing.
"I keep computers working" and "I write computer programs" are on opposite sides of a conceptual understanding chasm - most people have tried keeping computers working, even if they hated it and failed miserably, but most people haven't tried programming, and don't really know what the concept means.
To be fair, all programs sort of get reduced to 1s and 0s. Given this fact, I don't consider the idea of coding only with the letter 's' that much of a stretch. You know, in lisp I code with parentheses!
I know you're joking and this isn't really too relevant to your comment at all, but the 1s and 0s thing that non-techies fixate on is just stupid.
Programming (and computers in general) have nothing to do with 1s and 0s and saying stuff like "at the end of the day, its all 1s and 0s" is like saying that at the end of the day banking just comes down to scrap pieces of pressed tree pulp or a bakers job is just about a bunch of grain or a teachers job reduces to sitting in a room for a few hours or whatever silly analogy you want to dream up.
All of these things are implementation details that, really, are irrelevant to pretty much everyone everywhere. If you are dealing with low level digital systems you will encounter 1s and 0s (and analog voltage and resistance and capacitance and a whole lot more besides), but usually (especially when building something complex like a computer) this gets abstracted away pretty quickly.
For the record, I was mostly serious. I was half-joking about the Lisp part. This is not really related to your comment, but just to clarify: I'm serious that coding using just 's' doesn't sound that unreasonable. If you're a professional programmer, sure, you know you need more characters than that to be productive. But I wouldn't fault a lay-person, even one who has some knowledge of coding, for believing someone who said they programmed using only 's'. Plenty of weird programming languages are possible. Take a look at http://rosettacode.org/wiki/Reverse_a_string#Brainf.2A.2A.2A.
I get that, I meant you're joking in that I don't think you believe that programming or computers really does just boil down to 1s and 0s in a way thats at all relevant to programming - there is, of course, a tiny grain of truth in that, but not one that is IMHO at all important, though most non-techies don't know that and they're told that computers are just 1s and 0s.
I did not at all think you were joking when you asserted this:
Given this fact, I don't consider the idea of coding only with the letter 's' that much of a stretch.
There's a usefulness to coming at a problem from a completely new direction, but it's orthogonal by virtue of being orthogonal. Why is the alphabet the best way? Couldn't we express ideas better? (And I actually keep an eye on the constructed language space, so I actually know people who say, "Yes.")
Even "programmer" is, in my opinion, too broad of a term. And the difference between "coder" and "programmer" is not really that clear.
Every time a good term, besides "coder" and "programmer", appears, it gets overused by the wrong people and losts it's power. I strongly believe that what Jeff is describing could be called an "Information Systems Designer", but the term "Information Systems" has such a baggage of bullshit consulting that it can't be used.
I couldn't agree more. If nothing else, learning to code is an incredibly useful thought experiment for anyone who enjoys using their brain in new and interesting ways. So what if you never make a cent? How many of us started coding simply because we were passionate about it and it got us excited?
I can't tell you how excited I was when I wrote a simple joystick driven paint program for my Atari 400 in Atari BASIC :)
I recently learned how to plumb a little. Now I can do minor household plumbing fixes without having to hire professional help. A very useful skill indeed. I know it's a demanding activity that requires more than reading a book and knowing how to hold a wrench, so I know to stay away from the serious pipes and stick to little fixes.
It's strange he made that point about plumbing, then later said you should learn how things work to solve real problems.
He seems to have confused an initiative among some people to learn a new skill in their spare time with a totalitarian injunction that we all become programmers.
To me it's no different to an initiative among people to learn a foreign language. It may be a somewhat qiuxotic spare-time hobby, but the prospect of acceptable failure is partly what part-time hobbies are for, right?
Learning a bit of coding will give one an insight into how hard it is to get right, which will make one appreciate which bits are easy and which bits are hard. What's wrong with that?
The little plumbing I've learned on my own initiative has taught me similar, and I'm less likely to get ripped off as a result.
He did say that everyone should learn some basic concepts of programming, which I think we could all agree with. Perhaps everyone shouldn't know how to create the next Gmail, but surely there's an advantage to us all knowing how for loops work and how to write a bit of simple code (perhaps just doing math and text basics in Ruby). Many schools already teach this as a standard part of their curriculum using Basic.
I don't think he means that learning plumbing is a bad idea.
I think his point is just that a big hype cluster around learning plumbing would seem silly. There are a lot of useful skills in the world. Programming is one. Plumbing is another. Let's not get crazy and over-emphasize programming.
But should it be mandatory for everybody to learn cooking on the same level as reading and writing? Is it such a basic requirement, that we're decreasing our children's chance of success, if we don't teach them cooking (edit: Again, on the same level as reading and writing)?
Apart from at least a fundamental ability to use a stove, it is naturally not that crucial of an ability. The argument of the blog post is that it is the same with programming, i.e. It is not a necessity to succeed in life to know how to code.
I don't think the point of the post is to discourage anybody from learning to code. Rather it is a counterpoint to the recently heavily promoted idea that programming is somehow a necessary life skill.
I can only add to this. Because one of the most important skills, after checking my finances, was being able to cook. And knowing, what healthy food is and how to make it, so it stays healthy and(!) tasty.
I might be able to learn a lot of math in school, reading/writing, research (in university), critical thinking (throughout life). But being able to care for my own food, to know, what not to buy (or what to buy) and so on, helped me stay sane and in good shape.
I think I might have worded the second paragraph wrong, as it seems a few people have taken it literally and misunderstood my point as being that cooking is a useless skill.
Cooking is of course a good skill to have. So is plumbing, car repair and a lot of other things. But this is entirely besides the point.
The point was this: Is it a necessity for children to be taught [cooking/car repair/plumbing] on the same level as math, reading and writing: From 1st to final grade in school, 10 hours every week? Of course not.
Atwood argues that it is the same with programming. No matter how much we and he love programming, it is not comparable to reading, writing, math, communication and similar.
Your initial statement doesn't make sense anymore in the new context you're trying to paint. You're building a strawman here. Absolutely nobody said that programming should be taught "from 1st to final grade in school, 10 hours every week".
And in school you're not learning just "reading, writing, math, communication and similar".
Other disciplines learned in school are biology and its branches, like botany or anatomy of the human body, chemistry, physics, history, foreign languages like French and Latin, psychology, philosophy and so on. Not all of these disciplines are taught 10 hours per week.
Also, reading and writing are only taught in the first years. After that they teach you grammar and literary analysis, but considering how illiterate today's teenagers are, many schools are clearly doing a poor job, so to save some taxpayer's money they should just make those optional.
And seriously, I could think of a couple of disciplines I learned in school that would be less important than cooking or programming.
I don't really know what your argument is, except that you somehow think I'm revising my comment "trying to paint a new context" and even "building a strawman" to boot. Yet you offer no explanations for these very rude remarks.
The parts in my comments about cooking, 10 hours pr week, and the short list of subjects, are all merely examples. Replace it with car repair, 2 hours a week and your informative list of school subjects, and the argument is untouched. It should be obvious that these details are entirely irrelevant.
Car repair, 2 hours a week for a quarter or so would be an excellent use of most students' time (with minor the exception of people who live in the biggest cities and never drive). You're missing the point of the people rebutting your argument, which is that cooking, programming, car repair, and many other day-to-day subjects are more important than many of the subjects that you take for granted as being necessary.
Please understand that my original comment is not about cooking. It's not about car repair either. And it's definitely not about whether cooking and car repair are valuable skills. Or even if they should be taught for 10 hours a week or 2 hours of week.
The argument was that a very high proficiency in reading, writing and maths has more value for the average student, than a very high proficiency in a niche subject. A nice subject being FOR EXAMPLE, cooking, car repair or programming.
Sure, our students might benefit from these subjects. But I doubt anyone would seriously suggest giving the same level of educational focus to those areas, rather than to basic life skills such as reading and writing.
And that is Atwood's point: Programming, like car repair, is an esoteric subject, and as such not equal in worth compared to more basic skills such as reading, writing and communication. By all means, subjects such as cooking, car repair and programming is good to know. But for the average student, a high level in reading will be considerably more important than a high proficiency in car repair.
This is the point (and that's actually Atwood's point, I haven't supplied mine), which I was merely explaining to the OP, as the OP interpreted the blog post as being against learning programming at all.
A couple of people countered by argumenting against irrelevant details, such as the use of cooking and car repairs as examples of esoteric subjects. They even started arguing the value of the specific examples compared to the basic skills, which of course is entirely irrelevant to the point I was making.
I don't think that being able to program is a necessary life skill. On the other hand, programming is not all about writing code. Fundamentally, it is about problem solving, usually by breaking a large problem down into smaller steps. That skill is necessary. While it is taught in math classes, there is not a chance for the creativity that programming brings.
On a personal note, I was not very good at math in high school and college. I learned Perl for my first job and developed better problem solving skills. I've noticed that the concepts that confused me in my math classes have become more clear.
If tomorrow you want to learn to cook, how would you feel if a master chef told you "No, don't. You'll never be as good as me. If you're hungry, come to my restaurant instead".
I think people who want to learn to program are learning already. The right analogy would be teaching everyone cooking in elementary school as a required subject, together with reading, writing and mathematics.
> The right analogy would be teaching everyone cooking in elementary school as a required subject, together with reading, writing and mathematics.
Would that be a bad thing? Many-many-many moons, sorry - summers, ago they did that. Along with maths/etc pupils were taught practical stuff, like woodwork, cookery, etc. Not that the goal was to make them all carpenters or cooks, but just to give an idea what it is like and teach to look after themselves.
So I think that coding is something along the woodwork lines. New generations should get at least an idea of what it's like, regardless whether they're going to use it professionally or not.
Cooking may not be the best analogy. What if everyone started learning to build bridges instead? Sure, the general population might benefit from knowing how bridges work and what loads they can take, but when a bunch of inexperienced, improperly educated bridge-builders start trying to create new ones because it pays well, we end up with dangerous bridges.
Jeff's article is trying to point out that while understanding code isn't a bad thing, coding isn't the most important part of writing software. Those who think it is end up writing code without purpose, something I consider as dangerous in the long term as shoddy bridges.
Building bridges may not be the best analogy. What if everyone started learning to dance the macarena instead?
Seriously, cooking as an analogy highlights a difference between private recreational practice and public for-pay professional practice. Building bridges, unless you live in a place where everyone has a backyard with a river in it, not so much.
Shoddy bridges aren't bad, relying on them is. The fact that Bloomberg will write some code doesn't mean we'll have to use it, just like I have plenty of code in my HD that I don't throw into the world, because it's absolute crap.
If we could all build bridges in the our own yard, I think we'd see some of new fantastic bridges which we could re-use. With coding, we can.
This is a great example. My brother in law is a chef. I asked for his scone recipe, and he said to throw in some sugar, flour and milk (or something like that, I'm not a chef). Mix it until it looks right. That's expertise.
I'm a lousy cook - but I can cook food if I follow instructions that have accurate measurements.
You're not a lousy cook, you're just not used to the process. All it is is following instructions with precise measurements, and then doing it over and over again with different instruction sets until you start to recognize patterns and you find yourself having to look at the instructions less and less. That's 99% of cooking.
That is not what being a professional cook is about though. My girlfriend is a pastry chef and it takes more than being able to follow a recipe. Part of being a professional means knowing why certain ingredients taste the way they do when mixed with other ingredients. It means knowing how the altitude and temperature of where you are cooking can affect the taste of an ingredient. And there are a lot more little details that go into it as well.
For most people, they are just going to follow a recipe and you are right, that is all they need. But to be on a professional level and to be able to reproduce those flavors it takes a lot more than that. Check out the book "Professional Baking", it shows a lot of the complex nature that goes into being a pro.
1. It is ridiculous to tell somebody not to learn something in his spare time.
2. Atwood says:
"at least high school level math are fundamental to performing the job of a politician. Or at any job"
Do you know what is high school level math? It is a seemingly randomly selected subset of mathematics in fact based on mostly the scientific and engineering needs of the 19th century. What is included in 'highschool-level math' should be evolving. For example basic programming knowledge is more fundamental in today's society than trigonometric equations, coordinate geometry, logarithmic equations, etc... (all of which is high-school math).
Very basic programming could (and should) be part of basic math education.
That article is so full of strawmen, it's not even funny.
The existence of individuals who wouldn't gain much from learning to code does not imply that no one will gain much from learning to code.
I have a hunch that the vast majority of regular office workers has at least some portion of their work which can be trivially automated. Knowing how to code maybe allows these workers to go and code up a script - but even if they can't, it might allow them to identify this and state their work in terms of programming, thus vastly lowering the barrier to getting someone else to do the actual programming.
A workforce that can accurately say "this is a computers work" opens floodgates of productivity increases.
I read half the article and just had to come here to make the same comment as you. This whole "how would Michael Bloomberg learning to code help him do is job?" is a strawman of the most epic proportions. Of course if you are an executive with a limitless staff to fulfill every possible mundane detail that needs to be taken care of then coding is of no use for you. Hell, even if it is you have people to take care of the coding.
Coding is for the rest of us who don't have our own personal staff. Coding allows anyone to magnify their own productivity. And this idea that non-professionals shouldn't write code is ludicrous. Of course they will write bad code, but it won't be any worse then them taking 100 times as long to do things by hand and probably make harder-to-trace mistakes in the process. It's pointlessly elitist to suggest that code should only be written by professionals; it's like saying you better hire an architect and structural engineer before you build your own doghouse.
The problem is that the amateur programmers are unlikely to be building doghouses. What is more likely is that you end up maintaining someone's Macro laden excel spreadsheet because it is now mission critical infrastructure.
What tends to work as a happy medium for me is that I implement a proper relational database on the backend but have it output spreadsheets which people can Macro till their hearts content on the understanding that the database is the definitive copy.
I also allow people to upload their spreadsheets back to the database where it will import only changes to certain fields and heavily sanitize everything.
It's difficult to think of a programming task that is equivalent to building a doghouse, perhaps building a personal website with PHP might fill this niche but there are still security aspects to consider.
That's true, but not necessarily something that office workers would actually want.
Many workers actually sort of enjoy mindless repetitive busy work since it makes you brain feel like your achieving something vs difficult work where you might spend weeks stuck on the same problem.
Case in point:
A fair number of years ago I worked a non tech office job for a few months.
Basically a large portion of the job was checking though a spreadsheet looking at figures and checking them against a corresponding row in another part of the sheet. Assuming the figures matched you would copy the figures elsewhere in the sheet, append some characters to them and mark ones that were wrong in red. The data I think came from some legacy database.
There were a few more steps that I don't quite recall but basically they provided a list of instructions on how to do this part of the job and I immediately recognized that this was basically psuedocode, there was nothing "human" required at all.
They expected a human error rate of around 1% with this and sheets were often checked twice.
A few days into the job I decided to try writing a Macro to do this job, so that night at home I wrote my macro and emailed it to myself. Next day I loaded it up, ran it and then checked the results by hand. I did this until I was satisfied that the error rate was 0.
Next few days I just started running my macro instead of working by hand, meaning I got about 3 hours work done in under a second and could spend the rest of the day doing other (marginally less monotonous) work.
Now in this office they tracked people's productivity levels as well as their error rate, so naturally I end up with obscene performance stats and no errors.
So the team manager of course asks me to explain myself and I show her the macro and offer to show her how to set it up on other computers and explain how well I tested it etc. The response I got surprised me somewhat.
"You are cheating your stats!" was what I was told. Of course I explained that it wouldn't be "unfair" if everyone had the software.
Now at the end of every month they had some (cheap) prize for the person with the highest productivity and lowest error rate and since other tasks were not so easily "scored" the spreadsheet task was a big part of the deal.
No matter how I tried to explain it was like hitting a brick wall, because in her eyes I was "cheating". They had been doing this monotonous work for so long and were so used to it that wasting probably hundreds of man months was preferable to questioning if there might be a better way.
Of course I offered to forfeit any "prize" I might win (despite potentially saving them thousands of pounds), but no we type figures and then somebody wins a prize at the end dammit!
I imagine this sort of brain damaged thinking is common in far more organizations than you might imagine.
If anything, your anecdote supports my hypothesis that simple programming can unlock large productivity increases.
Your team manager made a career out of incentivising busy-workers, then suddenly one of the workers come along and proves her, her work and her neat floor of busy-workers pointless? Of course she's going to push back. Nobody likes to be made pointless. That doesn't make her any less pointless, and it's for the better of everybody that she stops being pointless.
Unlike most of the top comments, I actually agree with Atwood's conclusion, if not all of the arguments he uses to get there.
I don't particularly care about the accumulation of bad code. I don't particularly think that summer of code people are going to be accumulating all that much of it that will be shared.
And I do agree that learning to program is a totally worthwhile and mind-expanding skill. But I can say that about a lot of the skills I've picked up. From driving a tractor(1), to the little bit of plumbing I've learned; to playing an instrument; they all involve problem solving; they all make you a better thinker; they're all fabulous to learn in and of themselves.
If forced to choose one of these skills, I'd say programming is in fact the deepest. But they all have enough plenty of depth for someone who's only going to be exploring them casually. And I don't feel like the summer of code mentality is over-hyping programming so much as its undervaluing all those other worthwhile skills.
There's plenty of worthwhile stuff to learn in this world. It's okay if you want to learn a few of the other things instead.
(1)Yes, operating a tractor and making use of its attachments does involve a lot of problem solving. I drove one as part of a job for a year and a half, and the guy I worked under could do so much more with it than I could that I was in awe.
100 years ago, Summer of Plumbing or Summer of Tractor Driving may have attracted a not insignificant participation. In present day, not so much, as coding has become the infrastructure of our society.
Level 0: (Many bosses I have had)
Level 1: "Hello World"
Level 2: Does something
Level 3: Updates a data base
Level 4: Solves a little problem
Level 5: Produces value
Level 6: Sidetracks other programmers to maintain
Level 7: Provides a platform for other value producers
Level 8: Solves big problems
Level 9: Still produces value years later
Everyone should get past Level 0.
If you're going to get to Level 6, I'd prefer you just stop at Level 5.
My first job in this field, without exaggeration: Oh, you can perform skills 1-4, great, welcome to the team and since you're a junior we can give you 35K a year. Sweet. First task, you'll need to level-up to about 8-9 as we need you to architect a Linux application server with a user panel for: hardware monitoring, firewall, application mgmt, network mgmt, license mgmt, application code obfuscation, etc.
I'm kind of the villain of this piece -- a relatively novice coder who expects to apply for programming-heavy jobs in the future.
Here's why I think I'm not actually a villain:
1. I'm not under any illusions that people should pay me mega-bucks because I can program at all. I haven't hit my 10,000 hours yet; closer to 1000. You should hire me because I'm a mathematician who can program, not because I'm a hacker genius. Often, being an "X who can program" is much more valuable than just an X. It means you can execute your ideas yourself; and it means you have a clear concept of which ideas can be executed computationally and which cannot.
2. I couldn't just "quit programming" any more than I could quit writing or quit reading. I could resolve to, but I wouldn't last long. I've found that when something makes my brain happy, but isn't technically "my job," I'm much better off following instinct and doing it anyway, rather than forcing myself never to have any side projects.
3. You're worried I'll contribute to the volume of bad code in the world? Well, just because there are more experienced programmers than me doesn't mean I'm dishonest or stupid. I make a point to be very frank about what I can and can't do at the moment. I've found that the stuff I can do is quite valuable to people. I don't try to bluff my way into projects I'm obviously not qualified to contribute to.
It's like trying to cut down on the amount of bad writing in the world. Sure, I guess aesthetically it'd be nice if I never had to look at any bad writing. But bad writing is part of the process of becoming a good writer, so there'd ultimately be less good writing out there.
Please learn to code. Also, learn to change your oil and maybe your spark plugs; learn to cook; learn to replace buttons on your shirts; learn to fix your leaky sink and plunge your toilet; learn to plant flowers and tomatoes; milk a cow; shovel some dirt; experience driving a tractor, both the kind in a field and the kind that pull tons of cargo down the expressway ...
Get out of your comfort zone, live for a minute in someone else's shoes and maybe, just maybe, you'll learn to respect the work that other people do and be willing to pay them for it - they deserve to be paid for their Work. Yes, sitting behind a desk all day bringing brainpower to bear on saving the company money is Work. Driving 11 hours a day is Work. Grilling that steak and walking it to your table is Work. It's all Work because it takes us away from our families, because it's so well regulated that it adds stress, because we'd rather be doing other things but the bills have to be paid (i.e. we have to pay other people for the Work they do keeping our lights on, our Internet connected and our water reasonably clean.)
So, please, learn to program. Then, when you need software built, you'll know why you hired me for "so much" and how much trouble I'm saving you.
I think the whole everyone should learn to code this is right, but a little ahead of its time. A little like saying that peasant farmers in the bronze age should learn to read and write. While 100% literacy is now acknowledge as a good thing it took a while to get here. A farmer these days absolutely needs to read and write. But a bronze age farmer? Not so much.
I personally think that one day it will be impossible to function in society without the ability to manipulate and query data. To use Jeff's example, as Mayor of a large city there must be mountains of data that might be relevant to every single decision that is made, and the mayors who can query and gain insight into that data quickly (without having to write a spec and get someone else to do it for them) will eventually be more successful, to the point where all mayors will be expected to be able to manipulate data.
There are a number of things that need to happen before that though:
Firstly, the tools need to get a LOT better. I put our current development tools somewhere a kin to Egyptian hieroglyphics. You can do basic things like record the births and deaths of kings, but could Shakespeare have written what he did in hieroglyphics? I'm guessing not. (Although I bet someone somewhere has done a translation!)
Next, this vision of the future is based on the amount of data in the world getting a LOT bigger. To the point where intuition or past experience simply can't compete with the people who are mining the data.
Politics will probably be one of the last professions to convert, the cultural change will take a while to work though. The first professions will be the kind of things where Excel is used heavily at the moment (you could argue that Excel is a programming environment). Professions like Marketing, Manufacturing (which will become predominately robot driven at some point) and Medicine (which will become heavily influenced by generic programming) will probably be early adopters. But one day, I think "programming" in the sense of giving a "machine" a series of logical instructions to follow, will be universal and it will simply be impossible to live a normal life without that skill.
> current development tools somewhere a kin to Egyptian heiroglyphics. You can do the basic things like...
Ah, no. Heiroglyphics is just somewhere between an alphabet and syllabary - there are 60 odd symbols and they match to sounds like 'a', 'ts', 'gh'.
The stuff you see in museums is the 'posh' stuff for best, there is a quick writing version of it (also known as heiratic) where the full pictures were made more abstract.
> Could Shakespeare have written what he did in hieroglyphics?
For 3,000 years everybody did. Oh, and don't forget little things like inventing hydrolic engineering in hieroglyphics.
Hieroglyphics is as good a writing system as this text I am typing.
> You could argue that Excel is a programming environment.
Actually Excel/spreadsheets are THE programming environment - used by millions of people every day to perform their daily work - loads more than use obscure programming specialist dialects/paradigms like Ruby, or Java or whatever.
I acknowledge you know a lot more about Hieroglyphics than me. But my comments were based on the understanding that it was really the development of an alphabet by the Phoenicians that took writing from an obscure system to something usable by every day people. Maybe this isn't the case?
Also English is widely acknowledged to be a very expressive language compared to, say, Swedish which has a sparser every day vocabulary. I'd be surprised if you told me that the nuance of the finer English texts could be adequately captured in Hieroglyphics.
I agree, Excel is a programming environment. Could do with better version control and debugging though.
I'm sorry there is no evidence that a particular language is 'better' than any other.
All human languages have very similar every day vocabularies - English happens (now) to have a very large specialist vocabulary (which wasn't available to Shakespeare) and which it actually shares with most other languages.
Shakespeare got his vocab up by generating a host of new English words from French, Latin and the other dominant languages of the time.
As we speak the Kiyuku Shakespeare is stealing words for his play.
> the nuance of the finer English texts could be adequately captured in Hieroglyphics
On a technical point you could copy Shakespeare into it now - it has (most) of the current English sounds and with a couple of conventions/accents you would be good to go. I wouldn't recommend switching writing systems anytime soon.
> All human languages have very similar every day vocabularies
I spent a lot of time working in Sweden and had many conversations with the locals (all of whom know English very well). Many of them remarked that English has more alternative words for something than Swedish and that each one has a subtly different meaning. For example, how you can use "grand" in place of "big" or "large", they all mean roughly the same thing but "grand" brings with it additional meaning. So, my personal experience appears to contradict this statement.
My point is really that languages and alphabets are tools and some tools make certain jobs easier. You could write a website in assembly, but its easier in Rails. However, I suspect our ancestors will look back at Rails and have similar feelings to us when we look back at ancient writing systems now.
I strongly agree with you that data manipulation is becoming the new essential literacy of the information revolution, as reading, writing, and 'rithmetic were to the industrial revolution. As the basis of economic value shifts from materials to information, the people who can best manipulate information will be best positioned to succeed.
An important point to note here is that this skill must come on top of industrial-age skills like the "3 Rs". You have to know reading, writing, and math so that you know what to code (which matters more than the code itself, really).
That said, I think you might be underestimating the speed at which data and coding is permeating various industries. The finance industry has almost totally converted...the head of JP Morgan has boasted, for instance, that they employ more programmers than Microsoft.
Even in politics, most significant campaigns now devote a lot of programming and IT resources to gathering and analyzing information about potential supporters and voters.
Almost all of these arguments can be applied to a large majority of our school curriculum. If you are arguing that people shouldn't learn to code for the sake of learning to code, you are correct. If, however, you don't actually think learning to code translates to solving problems, or has any real world benefit, you should also be insisting we remove all of Math from our school curriculum, because who uses anything beyond basic algebra? Hell, who uses anything beyond basic arithmetic now that we have calculators that can do algebra and calculus for us? Why teach kids anything?
I should also point out that, the more politicians know how to code, the less politicians treat computers as black boxes that "the nerds" need to perform magic with. It won't go away, certainly, but its a step in the right direction.
[...] you should also be insisting we remove all of Math from our school curriculum, because who uses anything beyond basic algebra? Hell, who uses anything beyond basic arithmetic now that we have calculators that can do algebra and calculus for us?
I think all of the jobs that you have listed involve using computers to automate, manage and solve problems.
Except rather than how we wield writing algebra or English pros, with advanced skill giving us the ability to express elaborate and abstract concepts, most people are computer illiterate.
Their use of the computer is analogous to knowing nothing about algebra or English, and choosing predetermined sentences to write pros, or choosing predetermined equations to do algebra. If what you want to express isn't supported, or what you have available isn't what you want, you're screwed.
People should be able to accomplish what they want with a powerful language. English and Maths are both powerful languages that are tools for modelling life and facts, coding models process and automation. It's not essential in the same way growing up in the Amazon rain forest where maths and arithmetic beyond "one, two and many" isn't essential. It's undoubtedly desirable and beneficial, however.
I'll leave the part of "coding is important because computers are everywhere and learning how to automatize everyday things is a great skill" to others, as there are lots of excellent comments about it in this thread. Let's talk about something different:
> But understanding variables and functions, pointers and recursion? I can't see it.
Hey, I'd argue that understanding exactly those things are what should be included in "everyone should learn to code". All of those are difficult mental constructs important for understanding how our complex world works. Let's look at it case-by-case:
variables - this is basic; the idea to take something (a concept) in your hand and manipulate it by a symbolic name. This is, in some way, taught in high-school math, but somehow many people don't seem to grasp the idea behind the concept of a variable.
functions - ability to take a set of instruction and name it. Possibly have it parametrized. That's simple. But naming several sets of concepts, and then using them to build another layer of concepts, which is then used to build another layer of concepts... I'd call this an essencial problem-solving skill.
pointers - concept of indirection; for people not accustomed to it, it's easy to get lost in different levels of indirection when discussing things
(like, a difference between 'belief' and 'belief in belief', or P, proof of P, proof that P is provable, etc.)
recursion - because not everything circular is invalid; sometimes things defined in the terms of themselves are the simplest way to go.
To all of this I'd also add one more, IMO essencial, thing - understanding of feedback loops. It could cut out a lot of discussions about whether X causes Y, or Y causes X. Surprise surprise, it might be a feedback loop, in which X and Y are interlocked, and are both to blame.
Bottomline, programming teaches us a lot of important skills and mental constructs useful for problem-solving and understanding how the world works. And those skills are hard to get elsewhere.
A silly example from high-school biology: what is genetic code if not opcodes for protein assembly machinery? DNA "data" is code that programs machines building proteins. Easy to understand and remember if you know even a little bit about how 'automation'/'computing' is done.
Bottomline, programming teaches us a lot of important skills and mental constructs useful for problem-solving and understanding how the world works. And those skills are hard to get elsewhere.
I definitely support the notion that everyone should learn problem solving skills, but people can take different paths than programming: mathematics, natural sciences, and even chess, for example.
As Richard Rusczyk, founder of Art of Problem Solving, says, “We use math to teach problem solving because it is the most fundamental logical discipline. Not only is it the foundation upon which sciences are built, it is the clearest way to learn and understand how to develop a rigorous logical argument. [...] This is not to say that those who cannot do math cannot solve problems. There are many paths to strong problem solving skills. Mathematics is the shortest.” 
And there have been many studies on the relationship between chess and problem solving, including this one by Ferreira and Palhares .
> I definitely support the notion that everyone should learn problem solving skills, but people can take different paths than programming: mathematics, natural sciences, and even chess, for example.
I agree, though you'd have to go far over the school level of maths to get such benefits. Also, given that CS is a part of math, you can't avoid it if you want to learn some mental structures - we actually DID invent a new way of thinking in the last 100 years. And CS should be, in my opinion, tangled with programming, for a mortal to understand it and have fun with it at the same time.
So, in other words, by all means study math, but catching a bit of CS knowledge and programming skills at some point should be a natural consequence of it.
[...] you'd have to go far over the school level of maths to get such benefits.
Not at all. Even deriving the formula for the sum of the first n positive integers is something that requires problem solving skills while not requiring more than school-level maths.
Also, given that CS is a part of math, you can't avoid it if you want to learn some mental structures [...] by all means study math, but catching a bit of CS knowledge and programming skills at some point should be a natural consequence of it.
Huh? Physics is more a part of mathematics than computer science is. And I don’t understand what you mean by “mental structures”.
we actually DID invent a new way of thinking in the last 100 years
Could you explain what you mean by that?
Anyway, my point was that you can’t argue that everyone should learn programming just because it’s a way to learn problem solving.
I don't think Jeff's piece undermines any of the reasons I put forward there.
Going through his points one by one.
It's easy to agree that you should ideally write no code - but of course the ideal assumes that all the provided interfaces in the world provide you with everything you desire, need. The point is that the world is such that most of the time this is not the case.
It does not assume that coding is the goal. It assumes that there are always various goals that have not been met by existing interfaces or infrastructure. (i.e. that the ideal in the first point can never be achieved in reality)
It doesn't necessarily put the method before the problem. It's just assuming that the many of the problems faced by a majority of people (or everyone) in western society can be solved with code.
His next point speak to professionalism in coding. In large software projects - you absolutely need professionalism. But many problems people face don't require large software projects to solve. I give an example in the linked piece above of a problem I solved with code that certainly didn't need a large software project.
His final point - it does not imply this thin membrane between professionalism and being an amateur coder. In fact - I advocate the complete opposite, yet still think everyone should code. I'm not sure why he thinks it does imply this - so its hard to argue against him here. To me it's prima facie not the case.
A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.
As much as I believe (and I do) in the importance of technical and mathematical literacy, it's no more important than the perspective that can be gained from, say, learning to knit or beatbox. There are very few skills that don't teach some sort of methodical problem solving, the rest is just domain.
I get what he is saying, not everyone can or should be a programmer. But if you take 'learn to code' as a euphemism for learning how to build an excel spreadsheet properly, how to write a macro to automate your job, something like that, then, well learning to write a bit of code isn't a bad thing at all.
We all benefit when we learn a little bit about another profession, whether it is painting or plumbing, bricklaying or baking. In that context demystifying coding for the average person isn't a bad goal. Just to clue people in that tough solutions they have might be easily solved is a good thing. Getting people to wrap their heads around logical thinking is definitely a good thing.
Whilst I agree to the extent that I would dread the monstrosities brought to birth by a huge programming populace, I can't agree with the overall article.
I think the comparison with plumbing is apt, but not in the way he intends.
Let's say I turn on my tap and no water comes out, now I know nothing about plumbing but at least I know that the water comes to the tap through pipes so perhaps one is blocked or leaking?
By the same token if my car engine won't start then I can hazard a guess that it's perhaps a failure in the ignition system or the starter motor. I can also reason that the engine works by combustion of fuel, so it is logical that if the fuel tank is empty I won't get very far.
Contrast this with computers, the average person has literally no conceptual model whatsoever of what is going on beyond the fact that they require electrical power.
Of course people learn the buzzwords from the media to make it sort of sound like they know what they are talking about. I remember years ago people bragging about their "64 bit" console despite not having the slightest clue about what a bit was or why it should matter.
This makes it easier for people to buy media scare stories about "hackers" etc as well as not really understanding what it means to protect themselves online (beyond installing some AV software and praying).
It might also make life a little easier for people who are not technical to specify software requirements.
For example many times I've been given a spec like "if X happens then do Y", of course X is never one thing, it is a combination of a large number of sub conditions that are dependent on various external variables etc.
When you try and get somebody to explain in detail all of these subconditions to you so that you can make the software correct people will often take you for being overly pedantic because they understand intuitively what they mean by X and can't quite get the fact that the computer doesn't.
I doubt Bloomberg uses eight grade chemistry, biology or physics in his day job either. We still teach the sciences -- if nothing else than as a way to entice kids to continue studying it and keeping a steady influx of engineers in to society. There is nothing different about computation, per se. Instead of a teacher droning on to kids about how to surf, let them learn how to do webpages, or robots. Get them excited about CS and try to disspel the notion that the machine they're sitting by is in any way, shape or form magical and archaic.
As for Bloomberg at this phase in his life picking up coding, probably not. On the other hand, he made his fortune in part via hardware and software, so I doubt he's completely clueless about it even now.
I don't think you truly believe that though. Most people who hack daily have at least a basic working model of the computer. There's a compiler parsing, generating code, there's possibly a VM executing bytecode, an operating system managing memory, scheduling, network and other services, below that there's a CPU executing some representation of assembly code, it's in turn composed of some sort of a logic array, etc. etc. I'm not saying you know the inner workings of everything.
It's more along the lines of, we teach physics with the aim that people finishing high school should have a vague notion about at least newtonian physics, some electromagnetism and the scientific model. For computers, we teach how to open Word, check your e-mail etc. Stuff kids know. What they don't know is how this all ticks, and I think there is certainly value in helping kids construct a vague mental model of it all, and how to apply certain parts of it to a screen they'll probably interact with 4-16 hours per day for the rest of their lives.
This largely misses the point. I agree that it's not "essential" and not everyone should do it, but it's still more valuable than I think Attwood gives credit for.
I'm perhaps in a unique position to comment, having recently taught my girlfriend to program. So I can talk about how that played out.
My girlfriend understands menus, she knows about links, she can install software, she can use word, she can type away like no other, and even fix some problems. If you watched her using a computer it'd seem like she had a pretty good affinity with this black box.
However, I don't think most programmers realize what a holistic approach the average person (even a relatively tech savvy one) takes to computers. They only understand them at the highest level. They develop fetishes and incantations to fix things. When something goes wrong my girlfriend will turn the computer on an off. She'll turn the router on and off. Etc. Or just click "ok" until it stops complaining. It often fixes the problem, but it's just something she's learned to do with little understanding. She goes to the store and can pick out a decent phone or laptop, but only because she's developed an intuitive semi-understanding of the lingo. This one has more gigs, that's better...etc.
The computer will do things they don't understand, except some vague notion that the computer is "dumb".
I asked her one time how a computer works because I was legitimately curious how people without any instruction in comp sci etc visualize it. She had absolutely no idea of even the most fundamental workings of a computer except that it had something vaguely to do with "ones and zeros".
I taught her binary. I taught her boolean logic. I showed her binary math. I gave a very basic example of how you can use circuits to do binary math. I made her sit at a desk and act as a processor. Then I explained the concept of bootstrapping.
Then I taught her a little bit of Python.
She understands garbage in - garbage out. She understands dependencies. She understands algorithmic complexity. She understands types and formatting...and much more. (at least generally, which is enough).
This mysterious box no longer seems capricious and opaque. She has a much better understanding of why her computer behaves the way it does and therefore feels more at ease. Sure she can't magically fix anything, but she's recognizing general patterns more and more.
She installed Ubuntu recently in fact, and has started writing Python scripts (and Bash!) to assist in assorted data processing tasks she used to do by hand. When my girlfriend needed to update batches of reports, she would up each one BY HAND and change them. Using a computer was frustrating and scary. Learning coding won't improve her life? Seriously?
Would it make him a better mayor? Not necessarily but it sure could help. I'm sure he uses a computer and I'm willing to bet the less time the mayor spends screwing around with a computer or waiting for tech support the better. Likewise, I'm sure he has all sorts of tedious tasks which don't warrant third party software but which could be tackled by a nice Perl script. That doesn't even take into account the boost in (general) analytical thinking that comes from programming. Ditto for potential refreshment in Math.
Who says it needs to make him a better Mayor anyway? What if he just wants to be a better person?
In addition to being a programmer, I happen to be a musician as well...which puts me into contact with a lot of artists. I'm always surprised by how much they could benefit learning programming because a lot of art involves hacking; creating weird one off contraptions...often requiring lots of tedious work. Many want to experiment with technology and art, but are unsure how. Processing could blow some minds. Ditto Overtone.
Using a computer is largely about software; and software is similar to arts and crafts in that it's a reflection of the creator and the tools they used.
Learning about an artist helps you interpret the meaning of their work. Learning about the techniques help you evaluate and appreciate their work.
Learning to code makes you sympathize with the people who wrote the software you use. It helps you understand how software is put together. Which is good, because the more you sympathize with the author and the more you understand how it fits together the easier time you will have using it.
To be fair there are a lot of things I feel everyone should learn. I think it's fair to say though that out of all the ones you could pick, learning to program will be more beneficial practically relative to most others.
> Research voraciously, and understand how the things around us work at a basic level.
Communicate effectively with other human beings.
I think this is the heart of the misunderstanding between sides. Learning to program is actually the first step in that. He mentions having "basic internet skills" as a necessary life skill. Learning some programming will greatly facilitate that.
Likewise programming will introduce concepts and develop skills that help you understand technology in general. It even helps in in non-technological areas. It facilitates communication because it forces you to confront and think about how difficult it is to communicate certain things clearly.
Interesting, I've always though that at a conceptual level computers are not especially complicated machines (for example a turing machine) and most reasonably intelligent people shouldn't have any problem understanding them.
It's also interesting that you mention the holistic approach because this is exactly how many people view computers, in the same way they might view a mechanical device. I have seen people reason "If a reboot doesn't fix it , maybe 2 or 3 reboots in quick succession will".
It's also scary how many professional IT people seem to have a cargo cult understanding of computers.
I've seen people do all kinds of crazy incantations , for example troubleshooting a network problem by re-installing OS software on multiple workstations and trying different combinations of firewall / AV and network driver software when in fact 5 minutes of methodical probing with wireshark would have made the issue obvious.
Indeed, the basics are all relatively simple...in fact a lot of the basics are things people do intuitively...it's just they've never really been told or thought about how it would work as a generalized computing machine.
I think the problem is that often when people attempt to explain "computers" they end up explaining things about the Windows operating system like the registry and the "C drive" etc.
Of course this stuff is massively complicated and the majority of HN readers probably don't really understand the whole thing so what hope would some random person have?
If people could understand a basic turing machine type system and possibly write simple assembler to run on it then they could be told "this is all your PC, your smartphone and your iPad are just they have lots and lots of window dressing".
One of the best explanations I've seen for the question 'how does my computer get from these zeros and ones to these windows' is 4 pages in Godel, Escher, Bach by Douglas Hofstadter. (Starts at 287, all editions pagination is the same)
She understands garbage in - garbage out. She understands dependencies. She understands algorithmic complexity. She understands types and formatting...and much more. (at least generally, which is enough).
This mysterious box no longer seems capricious and opaque. She has a much better understanding of why her computer behaves the way it does and therefore feels more at ease.
This is exactly the benefit from people learning to code:
People don't have to actualy code, they just have to have some understading of how a computer work and what problems is easy to automate (as her report updates) to get more productive in their own field. If they can code it on their own, it is only a plus.
> It often fixes the problem, but it's just something she's learned to do with little understanding.
This reminds me of a hacker koan:
A novice was trying to fix a broken Lisp machine by
turning the power off and on.
Knight, seeing what the student was doing, spoke
sternly: "You cannot fix a machine by just power-cycling
it with no understanding of what is going wrong."
Knight turned the machine off and on.
The machine worked.
That's really interesting, as I had a similar experience. However it has downsides: I now find it much harder than I used to to disengage from details and look at the big picture. Knowing how something might be implemented or could be taken apart really distracts me from thinking about whether it's important, or useful or beautiful. Perhaps it's just a temporary phase, but the whole Zen and the Art of Motorcycle Maintenance keeps coming back to me — I used to be like the friends who couldn't change a spark plug and were happy in their ignorance — now I'm changing spark plugs all the time.
Hate to say it, but that seems like a rather arrogant thing to say.
I'm great believer that anyone can get to be _reasonably_ good at something if they invest enough time and effort into it.
It's the classic logarithm curve; when you have no skills in a field, you can learn a few skills really easily (steap curve). Then, as you get better, your progress for effort-expended goes down until you're basically a domain expect (flat line; no matter what you do you basically dont get any better).
This applies to ANYONE on ANY field; the curves are just different; and I'd argue the steep part of the curve is pretty long for programming (compared to say, I dunno; learning differential equations).
Despite the great them-and-us divide that geeks (and here I generalize based on the geeks that _I_ know personally) seem to have to 'other people' who are 'dumb' ... people are, in my experience, generally smarter than you'd expect.
I'd rather encourage people to learn a little bit, than tell them to go away because they're probably not smart enough. <-- This is arrogant as f*, and if I see someone do it, it makes me angry... although, I realize you weren't directly saying that, so please, take this as a general comment, not as a criticism of you personally. :)
Sorry, but back at the university, I gave several semesters of tutorials in programming for beginners.
It's not that people are 'dumb' or 'smart'. It's just that some people have an easier time with some topics than others. I have seen people who really struggeled with the basic concepts after three courses (not my courses ;)). Others understood it far quicker and with much less work.
I'm not saying that these people were dumb. They usually excelled in other areas, just like I am seriously unable to keep a plant alive for more than a few months (believe me, I tried!).
As I said, to some people some topics are an exercise in frustration. It's not that hey can't learn it. It would just be really painful and boring to them.
That's a fair point. It's not so much that everyone will benefit from learning, but that they won't if they don't try. I also think that most people would get something out of it, though admittedly in some cases not much.
Really? I'm always sceptical when people use the phrase 'most people' to support their opinion, while presenting no other evidence to back up such an assertion. This seems to be a common rhetorical tactic in online discussions.
Those people who just generally don't like learning anything would likely be frustrated by learning about programming, but I've no idea if this amounts to most people or not.
I think programming is like an art where you have to do it to actually understand the creativity and effort that goes into creating something. In that sense, learning to program is really valuable because you start appreciating your computer, the Internet, software, and Web apps you use a whole lot more because you have a deeper understanding of how things work.
> the mayor of New York City will hopefully spend his time doing the job taxpayers paid him to do instead. According to the Office of the Mayor home page, that means working on absenteeism programs for schools, public transit improvements, the 2013 city budget, and … do I really need to go on?
Being a Mayor means it is his job, not his life, outside of work it's not our business to tell him he's wasting time regardless of whether he's learning to code or reading the first Harry Potter book over and over again.
Not really. I learned to code Pascal 16 years ago, because I wanted to make DOS computer games.
And here I am now: 10+ years of professional web-dev experience, spoke at local dev conferences, won awards for my work, etc..
What I learned during all these years is that methodologies and models help you after you learn how to build apps/plugins/games/whatever. And still they won't save you from wasted hours hunting an accidental typo.
I think the most profound lesson to be learned in programming is how complex everything is. Computers aren't "dumb" -- they just don't share our language, culture, biases, etc. You have to specify everything exactly. If anyone has to be dumb, it's going to have to be us. Evolution helped us make sense of the complexity with a bunch of highly complex and very leaky abstractions -- "person", "God", "love", "nature", "property", "fairness", "consent" etc. Only when you try to describe these concepts to a clean slate such as a computer do you realize how complex the world really is. Moreover, these allegedly meaningful things all boil down to meaningless physical states and interactions, so you also get to realize that everything is pointless and what was it again that we are doing here?
I respectfully disagree. Learning to read is a necessary skill where most of the world's information is written - but to be productive, to create, to contribute, you have to learn to write. Code is the same: whether that's a good thing or not, more and more of your surrounding, of your environment will depend on - code. Fortunately, a lot of services have made it very easy to contribute to this augmented world without coding yourself, but you will not be able to understand the basic mechanics of this augmented environment without basic code literacy.
Why should a mayor learn to code? Well, I don't expect him to be a Java nut, but I do expect leaders in politics to grasp the basics of privacy, security, productivity, cost and benefits of the coded world surrounding us.
> the mayor of New York City will hopefully spend his time doing the job taxpayers paid him to do instead. According to the Office of the Mayor home page, that means working on absenteeism programs for schools, public transit improvements, the 2013 city budget...
Given the context, this remark is so frivolous I honestly think it may have been made in jest. But just in case it wasn't:
1) Bloomberg has declined the $255,000 salary. He receives $1 per year. This certainly says something about where his priorities lie and how he views his position as the mayor of NYC.
2) Regardless of salary, I have a feeling Bloomberg wouldn't let programming overtake his life and prevent him from fulfilling his responsibilities.
I think most of you are taking the post too literally. He is going against the rising trend of post implying "EVERYONE SHOULD CODE, IT'S GREAT, YOU WOULD BE CRAZY NOT TO, ITS SO EASY". It almost sounds like an infomercial. Of course anyone who is interested should learn how to code. Anyone interested should learn a bit about plumbing. And about home wiring, and car repair, and...the list goes on. No matter what skill level you actually end up achieving if you are interested in coding go for it. But lets not pretend as if it is for everyone. And lets not pretend that a majority of the people would even be interested. Most people hate taking Math in school and they complain when they get older that they never use it. The same with a lot of other subjects in school as well.
Whats more important is that the computer stops becoming a black box for the average user. They should be taught the basics when it comes to how it works. It would not only help make it easier for the average person to use, it would help with security as well. If we teach basic programming skills to make that happen then I'm all for it. Coding is not the important part, understanding the machine is.
As many others have pointed out, I think there are two sides to non-professional* coders learning to code, one of which I agree with wholeheartedly, the other I disagree with, equally wholeheartedly:-
* As in paid to sling code - I don't mean to cast elitist aspersions with the term 'professional'.
Learning to harness the amazing realm of creativity that computers offer - unlike other fields of engineering, you aren't limited by the need for millions of pounds and a team of people to turn your idea into reality, nor are you constrained by the laws of physics or possibly killing people should your calculations turn out to be incorrect.
For example, I am slowly writing a chess engine, it's such a joy to explore that because I want to and it's interesting to me.
There is a core kick that many people get out of programming, which is when you actually get something working, knowing that you made the computer do that. I wouldn't want to take that away from people.
Another aspect is that, should somebody learn enough to make some aspect of their life easier, that could even be simply learning some vba to automate some process which used to take them several hours, that's worth a lot too.
People thinking that coding is easy and straight forward, simply because they've learnt to do something trivial or played around with code a little bit. I have met several professional programmers who have had the same opinion and then gone on to produce the most horrendous, unmaintainable, broken code imaginable and get paid a lot of money to do it all the while producing quite awful software.
I wholeheartedly agree with Jeff's point that this sort of attitude is not something we ought to encourage. If people more generally think of coding as something easy, then the kind of programmers who produce shitty code and think it's fine will be emboldened and we will be doomed to experience yet more broken software in the world. That's the last thing we need.
There's a element of pride in all of this, admittedly, but it's still a very real issue. Good programmers don't get enough respect, nor does good programming and we don't want to play with that.
The cooking example cited by shin_lao is a great analogy - you don't want to discourage people from coding, quite the opposite, but don't think what you do is the same as Pierre Gagnaire, or even the guy working in the kitchen of that cafe you like down the road.
I do want to add that yes, the good can lead to a good professional programmer, but it's critical that it be realised that, as Jeff says, you need to put in your hours, whether the Gladwellian 10k figure is accurate or not.
I wholeheartedly agree with Jeff's point that this sort of attitude is not something we ought to encourage. If people more generally think of coding as something easy, then the kind of programmers who produce shitty code and think it's fine will be emboldened and we will be doomed to experience yet more broken software in the world. That's the last thing we need.
I sort of agree with you, but this also strikes me as something of a vacuous truth. I mean, think about applying it to any other domain: Does the fear that homeowners will start thinking of plumbing as "easy" and start overreaching their abilities mean we should quit selling monkey wrenches at Home Depot? Does the fear that auto owners will experience delusions of grandeur and start thinking of themselves as professional mechanics mean that Sears should quit selling Craftsman wrenches and Chilton repair manuals? Etc., etc.
The point is, all fields have a range of knowledge and skills from total n00b, amateur, up to professional. And in every other field, amateurs and professionals co-exist peacefully, and no one seems to be arguing that we should prohibit minor home repairs by home owners, oil changes by car owners, etc. I don't see why programming should be any different. If business people learn to write a few Excel macros, or even some small Perl, Python or Groovy scripts, that's not going to hurt those of us who are working professionally in this field.
I was talking to a friend in HR and finance at a company. He has some processes they go through for placing bids with customers that are horrible and based on people copying and pasting lines from one word document into lines in another. That's the way their core business is done. Copy and pasting. Yes, it's inaccurate. Yes, the sales guys sometimes for get to update all the documents with copying and pasting causing large business problems. I have repeatedly tried to convince him: "Write an excel document with a few macros!" Their bottom line would profit from such a spreadsheet. He just doesn't have the minimal knowledge he needs to do it.
Best part: he works at a technology company, with a technical staff. That makes millions and millions of dollars a year.
I appreciate Jeff's sentiment, but he's missing the huge swath of people that could benefit from just a little (admittedly not great and half broken) programming knowledge.
I was hoping we'd see another fine article from Jeff Atwood on the important distinction between coding and programming, something that is sometimes derided as largely pedantic, yet never fails to arouse interesting discussion.
Unfortunately, this seems to be a more blunt, standoffish interpretation of Peter Norvig's classic article on the long road to programming competence "Teach Yourself Programming in Ten Years." Jeff Atwood even references the article in this post, which I find disheartening, as Peter Norvig never once says something like "Don't even bother." Self-improvement is hardly a fruitless endeavor, and while not everyone is capable of writing good code, much less making a living off of it, there are a lot of wonderful things you could learn about yourself through such an undertaking. Plus, there are far less productive/interesting ways for people to spend what precious little time they have.
"can you explain to me how Michael Bloomberg would be better at his day to day job of leading the largest city in the USA if he woke up one morning as a crack Java coder?"
I certainly can't, but the sample set of one doesn't make for a convincing body of evidence. Moreover he's chosen to cherry pick someone in a position as a figure head/leader who has to delegate nearly all of his work as a function of time constraints. Generally speaking, Michael Bloomberg shouldn't learn to code but it wouldn't hurt if one of his advisers did.
"You should be learning to write as little code as possible. Ideally none."
This conflates individual programming best practices with a desired limit on the total amount of software written across teams and programmers.
"It assumes that coding is the goal."
Wrong. Most proponents of software education want people to understand the domain enough to function and _maybe_ get things done.
I think the real sentiment needed is not "learn to code", but more "learn what coding is, how it might benefit you and also just what it entails".
I also can't help but think baby-steps are required. There are so many people who don't even think about how software is created - learning to code is about three layers away from where they are at to begin with. Simply learning the basics of how software comes to be and a basic underlying structure of a computer would be a good starting point.
Anyone can learn how to write a few lines of a computer programming language. Understanding more of the basic principles of software development and computer architecture would be much more beneficial. That is my personal opinion.
"On two occasions, I have been asked [by members of Parliament], 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able to rightly apprehend the kind of confusion of ideas that could provoke such a question." - Charles Babbage
Mr Attwood has a point, in that average Joe certainly doesn't need to program in order to understand their domain better. But I would ask rather then, how can one educate people on how machines work other than writing code ( I seem to remember what little was done in my education about computing, taught me little about the practicality of why in a machine )
The other day a friend of mine was playing Taboo. Her word was "network" and she'd been prompted with "what makes the Internet work" or something similar. Her initial guess was "magic".
This is why I believe the "learn to code" movement is fantastic and an obvious net benefit to society -- the more people we have who understand, even loosely, how integral pieces of our lives function, the better.
To me it has nothing to do with these people producing code or entering the programming profession. I devour books on psychology but I don't entertain the notion of becoming a psychologist. I read them to inform and improve my daily life in some small measure.
I'm going to quote Zed Shaw in response to this article.
"Programming as a profession is only moderately interesting. It can be a good job, but you could make about the same money and be happier running a fast food joint. You’re much better off using code as your secret weapon in another profession.
People who can code in the world of technology companies are a dime a dozen and get no respect. People who can code in biology, medicine, government, sociology, physics, history, and mathematics are respected and can do amazing things to advance those disciplines."
After reading Jeff's post plus the comments here, it seems we in the programming industry can certainly agree on: lots of assumptions.
Assumptions about how much value is involved for a programming neophyte. Assumptions about what one would do with a little knowledge. Assumptions about how valuable the study of programming is for an individual. Assumptions about what one can be empowered to do, once gaining a little knowledge. I'm sure there are more. Our assumptions may not be equal, but we sure have no problem making them.
No matter if you support Jeff or feel he's way off base, there's a lot of judgment involved this topic, and we should really just stop for a second. As professional developers/programmers/architects/etc., it's easy for us to have opinions on this subject and find any scenario to support any argument one way or the other. The exercise of positing an argument, one way or the other, is actually unnecessary.
For us to judge if something has value to someone else, a little or a lot, makes assumptions about how someone will discover, learn, expand, grow. In spite of our experience in the field, making such broad assumptions might be accurate in some cases, but the variability of outcomes shouldn't be underestimated. Should we encourage everyone to learn? Maybe, but I don't assume it's the best use of time for everyone. Should we encourage everyone to go deep, perhaps enter the profession? I'm not sure of that, either. But I do know that answering those questions with broad absolutes as outcomes requires quite a bit of hubris on my part.
If we attempt to look into the future, I think we see that computers are likely to permeate every aspect of our culture. If they continue to decrease in size as they have been doing, they may actually end up being embedded in much of the stuff we use.
We should also notice that programming itself has a huge gradient in terms of difficulty. Things like Scratch, and other block programming languages make the act of programming easier, where amateur developers can focus more time on trying to solve the problems they are working on, and less time figuring out which parenthesis they missed.
So we have two trends - that programming is becoming easier to do, and that computers are becoming more common. Both of these lead me to the conclusion that not being able to program will eventually be akin to being illiterate. You won't be able to use and modify many of the tools of the future without some programming skill.
Further, many people are developing some of the core programming skills in pieces. Look at http://ifttt.com/ for example. This is an example of using apps as procedure calls, and writing very short subroutines to handle tasks for you. It is a perfect example of how programming is beginning to permeate popular culture.
Soon, telling people not to learn how to program will be much like telling people not to write or not to do math - it will be a bit ridiculous. We will just need to be able to use better systems for keeping track of who is an amateur, and who is a professional, much like we do with writing and mathematics.
Most people shouldn't learn to program. However, this observation is a bit deceiving. I believe that everyone should learn to write scripts. I have seen way to many people waste time on a computer for tasks that should be clearly automated. Furthermore, these people usually have no idea that there is something better.
How much time would people save in aggregate if they knew a little bit about the tools they use? The average person shouldn't need to know about recursion, but why not a for-loop.
That's like a mathematician saying "people shouldn't learn maths!". Of course they should, it teaches you other skills on top of learning maths. Are most people going to go on to learn cryptography or crack one of the Unsolved Puzzles of Maths? Of course not, they'll leave it where they are and have new skills and new ways of solving problems.
Of course they could be one of the minority and go on to solve one of the big problems and create huge amounts of value. Which would be terrible.
It is obvious to me how being a skilled reader, a skilled writer, and at least high school level math are fundamental to performing the job of a politician. Or at any job, for that matter. But understanding variables and functions, pointers and recursion? I can't see it.
"Coding" is a simple practical skill, at first glance it seems people should learn it when they have a need for it (even if it is just automation of repetitive tasks) or when for some reason they have a deep interest in it. However, lets not forget that computers from the beginning were intended, among other things, to extend our limited human mental capabilities. There is plenty of very valuable general topics in Computer Science that can be learned well only once you know how to program, otherwise you lack a convenient vehicle for exploring those concepts.
People can keep too little in their heads at once to directly deal with complicated structures or processes, but at the same time enough to be able to write programs to deal with them. Algorithms, graphs, probability are ubiquitous concepts that cut through many fields and that can only be explored in full depth via computer programs, and the applications are broad enough that it is not possible to find a ready made program for each of them. For example, in experiments people repetitively make mistakes even in very simple probabilistic considerations, where coding a Monte Carlo simulation would take maybe 20 minutes for a moderately skilled programmer. Even the Mayor could find some benefit in learning algorithmic thinking, for example: http://en.wikipedia.org/wiki/Critical_path_method
I've run into multiple situations at work where someone I was working for knew how to code, even if it wasn't their job, and it made things so much easier. I probably shouldn't reveal the details, but in general they were able to identify situations where just writing a quick app would help a lot vs. not having one, even tried writing it themselves, after when I ended up writing it and sent the source code along (they didn't have source control access) they were able to modify it as needed to be much more usable without bouncing it back and forth to me over and over, etc..
In another situation the person again figured out when an app would deliver really awesome results over the bog standard 60's way of doing things, and during the meeting to see if we could help out and all the subsequent revision communication, they just knew a lot about how apps get written. They'd suggest things that made it 10 times easier to write, understood that throwing in an option for everything instead of having a set functionality makes testing and code branches and maintenance a real pain in the ass, approved slight changes that made things a lot easier to write ahead of time instead of demanding meeting the requirements exactly as they were written, etc..
It's sort of like when you hear about someone trained as a doctor and who can also code doing all this awesome stuff. Except in a large organization we already have a ridiculous amount of skilled people available, so it's closer to you just need to know about people's capabilities and how they work to get really close to a similar situation where you can take advantage of both fields. So anyway, even if it isn't someone's job to code, it can be very valuable for them to know how to, and it can make them a lot easier to work with for those of us who do code professionally.
Personally, I feel that the more people who learn to code, the better position we as members of society are placed in. While I certainly have no need for my local member of parliament to play perl golf in his/her spare time - I certainly do have a need, or at the very least, a want; for them to have some form of understanding about softare development. Informed people make informed decisions, and a higher number of people who are informed in matters that relate to things like software patents, the easier it is to garner a sympathetic ear when we say "Look - this isn't right, they shouldn't be able to do that."
I recall reading an article about the term 'programmer' and how it should be avoided when applying for jobs, rather, something like 'problem fixer' (I don't recall the actual example given, sorry) should be used, due to the negative, hermetic/wizardly air that supposedly hangs around those who program. I'm not a programmer, so I can't say if it is objectively true; but if it is, it seems logical making coding a more common skill would certainly remove some of the supposed semantics.
The problem is that coding is still too hard. It should be easier to automate things, and then even the major of NY could benefit. Coding should be as easy as using a computer.
In fact I have argued that installing apps is kind of like coding for noobs. It is modding their world in a very primitive way, by installing functions on their phone. If it was easier to fine tune those functions, it would be a net win.
I'm 50/50 on this one. I think Jeff has some great sentiments on why people shouldn't learn to code, however, I feel there needs to be a bit of separation.
I think what Jeff is trying to refer to are the people who want to learn how to code (or announce that they're going to learn) for vanity sake. I'm sure when CodeYear launched, there were a lot of people who said "I'm going to learn how to code!" as much as there were people saying "I'm going to start exercising!"
There's a dichotomy here. Some people are just doing it to chime in and feel a part of something, while on the other hand, I'm sure there are some that truly want to learn and improve themselves. The team at CodeYear most definitely were looking to service the latter.
Is it annoying to see your profession, hobby, whatever hawked as a mindless skill that anyone can learn? You bet. But there is certainly value in people learning to code and code well. It's up to those of us who already know how to lead and help focus those who are just getting started. Those that are full of themselves will fall by the wayside.
I would hope that someone who has tried their hand at creating a working program might appreciate, even in a very limited way, what kinds of issues face those of us who have to create these systems for a living: the difficulties of gathering requirements, the non-obvious relationship between the apparent complexity of a bug/feature and what it will take to implement/fix etc.
This is like saying you shouldn't learn to write unless you're going to be a writer; or that you shouldn't learn to do math unless you're going to be a mathematician; or that you shouldn't practice sports and athletics unless you're going to be a professional athlete.
In any case, you don't learn to code so you can code. You learn to code so you can solve problems in a repeatable way.
Familiarity with those concepts might help bureaucrats with organizational planning even if they never wrote a line of actual computer code. Programming is first about making things so clear and well-understood even a computer can handle them, and only second about actually making a computer do them.
I mostly agree with Jeff here, although I do think it's good for people to learn more about technology and the Internet. But it's more helpful to learn things at a higher level than code. I recently gave a talk to some Wharton entrepreneurs about web architecture, and I started with the "learn to code" movement. My slides are here:
To a lot of people (and in the context of my talk, everyone), "learn to code" doesn't mean starting a fun hobby; it means building an MVP. In my talk, I gave several reasons why programming is rewarding and fun, but I also said if you're a business person, doing it yourself might not be the best business decision. The third slide at that URL makes the point that to build the full stack of a Rails application actually requires mastering quite a lot of technologies (fewer if you deploy in a PaaS, of course).
Michael Bloomberg is a very bad example to pick as a prototypical person who would not benefit from learning to program. Bloomberg has something that most of us don't, a staff. The value proposition of learning to program is that it will allow you to learn how to ask your computer questions, and automatically take actions for you.
Bloomberg can ask his staff to call him if an email comes in from an important advisor, but only before midnight, except saturdays where he can be called between noon and 2:30. Bloomberg can ask his staff to compare his popularity vs days in office to that of previous mayors.
Learning to program is about harnessing the power of computers to process data and text for you, and about automating repetitive tasks. If you have a competent assistant and staff, you don't need to program, although you may have tasks that require someone in your employ to know how to program.
I just realized that the only way in which Jeff's argument has value is the context of a large organization with managers relating to programmers.
That is, managers should not take the view that their learning to code is going to make them better managers of programmers. It just makes them capable of second guessing their programmers, not really that useful. Even here, its not really that you shouldn't know how to code but that you shouldn't assume that some small or large acquaintance with coding lets you quibble with a structure someone else has taken months to work out. But even here, it might seem like the "skill" required is "not knowing how to program" but really it's not second guessing someone (with enough ego or desperation, a completely unskilled manager may second guess you too and then things get nasty).
So that's what might inspire this unfortunate rant. But the rant itself is just plain wrong.
Hmm, i think we need to understand one thing, programming is't for all of us. Some people don't have any predisposition to become a singer, and they won't learn how to sing, and learning singing won't be any good for him beside of wasting some time. Someone say's that learning programming learns logical thinking, sure, just like math or logic. So why not to study them ? I agree with Jeff that " Before you go rushing out to learn to code, figure out what your problem actually is. Do you even have a problem?" because learning to program just to boost up logic skill don't make sense to me. To be a good programer something more is needed than just willing to learn how to code. The more people will learn to code just to code, or for profit, the more shitty code will be out there to destroy, and we will pray not to be in situation we will have to rewrite it...
I see Jeff's point. Don't turn a bunch of people into coders that aren't ready for it. You'll just dilute the brand, and right now being a coder is valued today for whole host of reasons. As evidence of the faked resume scandal at yahoo. It's cool, but there will be a day when it goes back to being very uncool. And doing things like what Jeff is rallying against will help drive us there. On the other hand non-coders want to understand what we do and how we do it. Just like I find watching construction workers build things or a plumber fix things. Its fun.
When I was an undergrad the first lecture I had in CS was my favorite. Still is. It discussed how fundamental scientific discoveries and technology affect how humans view the world and solving problems. To quickly paraphrase as industrialization began to take shape we saw the world as a machine. And so we looked for problems that could be solved by viewing them as a machine. As electricity was discovered and commercialized we saw the world as a circuit. Our brain compared to a circuit, and our nerves were the wires. Is our brain an actual circuit well not entirely, but this idea helped us make other discoveries about the brain. As each of these technologies took root in the minds of humans we shifted our paradigms and began to solve problems differently than prior generations or prior paradigms. These paradigms tend to have long life cycles going on for decades, and that's why they are important to recognize.
The introduction of computers, and particularly computer programming, has changed our paradigm again. How we solve problems with programming is fundamentally different than how we solved it with physics, chemistry, etc. And I think that's the life skill we want to pass along to non-coders because it changes how you approach problems. As we take what was physical and turn it into a digital representation it changes how you use it to solve problems. And when I look at coding in that respect I do think its important to learn, but I wouldn't teach it the same way as most are learning it.
One thing in this article I do agree with is that you should try to write "as little code as possible". But it doesn't follow that if you don't know how to code, you'll write zero code, and do well by that metric! You'll be unable to identify people who can code well, and hire poor coders to solve your problem, ending up with lots of low-quality code, in situations where an experienced programmer could have come up with a better solution ("hmm, I've seen this before...").
Even the slightest familiarity with programming here will help someone understand that when an offshore development house says "oh, sure, we'll just throw 20 more people at the project", that will not necessarily make it done better or faster. This is a Good Thing. And this has nothing to do with whether or not Mr. Bloomberg is implementing his own Ruby or .NET scripts.
Jeff's irritation here comes as as ignorance. The PR value alone of the Mayor of NYC learning to program could potentially inspire thousands of new casual coders and hundreds of new programmers. There is nothing wrong with wanting to learn how to create something. Ultimately, many thousands of Americans learn a little bit of plumbing for home improvement projects and they're generally happy with it.
I couldn't agree with this more, especially the bit about how software developers are software addicts. A lot (not all) believe software is the cure for all ills and any endeavor that doesn't have software at its core is not worthwhile. Coding is a means to an end. You should learn to code if you have a problem that could be solved with code and you either don't want or can't afford to pay somebody to do it for you. Exactly the same way you should learn plumbing if you don't want or can't afford to pay a plumber to do the work for you. All that time you are spending learning to code may be better spent learning the law, or accounting, or statistics, or operations, or marketing, all of which are at least as important if not more important than coding in a business.
"It puts the method before the problem. Before you go rushing out to learn to code, figure out what your problem actually is. [...] Does coding solve that problem? Are you sure?"
Did we all learn to code, or program, as a reaction to having an idea that required learning to code or program? Or did some of us learn to code or program out of curiosity, or because we just wanted to, or as a hobby?
The quoted point discredits the latter in favour of the former (as well as applying all manner of extra requirements I decided to trim out).
The article as a whole doesn't respect the fact that people have extra-curricular activities, and hobbies. And side-projects. Should we all discard those things that aren't totally relevant to our full time job?
The problem with this article is that Jeff is confusing what would ideally be the case with how people should behave in the present reality. I bet no one would disagree that it would be fantastic if people didn't have to code to solve problems. However, in countless numbers of cases the solution to the problem is, with the absence an easier solution, to code it out. Therefore, if a person is in that position, it would be better if they knew how to code than not. Moreover, it would generally be good if more people were able to apply an engineering mindset to appropriate problems in order to find a solution (which programming helps you attain). Therefore, the more people who know how to code, the better.
Please, don't learn to code, learn how to model solutions to problems. Code and programming are just tools for solving these problems.
If somebody comes to you with a problem and the first thing you say is "Oh, yes, of course, just let me start coding." then something is probably going to go wrong with your project. Understand what the problem is, build a model, show it to the person asking, most of the time this person doesn't really know what he wants.
You are all misunderstanding Atwood's article. Think about this: a variable in a programming language isn't really a variable, it's a name for a certain space in memory. Variables exist only in mathematical logic. Mind blown.
My 2 cents are that coding is becoming more and more relevant with the times. Like reading, writing, and arithmatic, coding is a form of communication with the current technology of our time. Learning the foundations of coding should be a priority because it is a base platform for which we as humans conduct our lives.
Granted I think Jeff's "tone" might come out to some as harshe, but his thought process rings true. His two points at the bottom are the all encompasing truths that make learning coding relevant, but it also helps explane that it is important to learn about everything around us and to not focus too narrowly on one subject.
While I disagree because I can't see why anyone would deny anyone else knowledge, there IS a mainstream fad about programming that seems to be out of touch with the reality of the thing.
I read an article not too long ago in one of Quebec's most important newspaper about how programming was becoming an essential skill (up there with reading and basic arithmetic), which it clearly isn't. Of course the author didn't help her case by confusing programming with setting up a wordpress site and changing its CSS.
IMO learning to code can't be a wasted experience. It's just not the life-changing, essential skill that increasingly more people make it out to be.
I think most comments here are missing Jeff's point, or maybe I interpreted it in a different way. Most skills are somehow useful in the real world: programming, plumbing, economics, chemistry, logic, critical thinking, philosophy etc. Most people don't have the time and/or the will to learn most/all of these things. I agree a basic understanding of these would help but you have to make a compromise, you can't learn everything. We think programming is really important because we are programmers but it's not more important than most other areas. You should spend your time learning things you like/find really usefull.
I don't think anyone is saying that (I hope). Instead we're telling people to learn to code as a means to better understand technology, and then use technology to your favor to improve your life. And when that happens, coding will naturally become more common in your life, even if indirectly (managing others who write code, but this time actually knowing what you're doing). "Coding" is just a more common part of the problem, which has a much deeper meaning. I tell everyone they should learn to code, not because I think they should be writing hundreds or thousands of lines per day like I do. But because they should better understand the world we live in. And learning to code will get you there faster.
Thinking we're telling people they should learn to code just for the sake of coding is completely missing the point. I tell everyone they should learn to code for the exact same reason I tell everyone they should learn science, politics and law. Your life will be better if you're scientifically literate and technologically literate because you'll better understand the world around you.
> can you explain to me how Michael Bloomberg would be better at his day to day job of leading the largest city in the USA if he woke up one morning as a crack Java coder?
That's the wrong question. You should be asking how can be better at his day job if he was technologically literate. And I'm pretty sure anyone here can think of many different awesome ways anyone at all could be better at their job if they knew how to better use technology around them in their favor. Let alone a major of a metropolis.
> so please pardon my skepticism of the sentiment that "everyone can learn to code".
This is a separate problem. I think everyone should learn how to code, how science, politics and law works. For their own sake. Their life will be better if they do. Implying they shouldn't try because they're not good enough is analogous to saying most people shouldn't vote because they're not competent enough to choose the right candidates. The point is, it's in their interest to do so. Now is it in our interest that they do so? And that's a whole separate issue I would really rather not get into.
Really, it's more a matter of being able to deal with what you don't know. The worst kinds of miscommunication happen when people have misconceptions so severe, they don't even know the right questions to ask. (Raymond Smullyan has an excellent short story that deals with this, where ancient philosophers ask, "What's holding up the earth and the heavens?")
There is no analogy for programming. Most of the communication difficulties programmers have with non-programmers is due to this. The only thing to beware of, is how a little knowledge is also dangerous.
Basic programming is fundamentally formal logic in executable form. Learning it provides people with a basic understanding of how the machines around them work, what might go wrong when they break, and teaches them what is fast becoming the new global language (binary, sort of, this analogy is kind of being stretched). The point is not for everyone to enter the computer industry, the point is for everyone to have at least some level of awareness the same way we teach the scientific method in schools.
Reading and writing are outright useful. Math you can get by without but it's important indirectly.
Same way being able to code is important indirectly.
With computers you learn how to express what you want precisely and unambiguously.
You can't hand wave computer into doing what you want. Learning how to be precise and how to not rely on other people guessing what you want is important skill and best way to learn it is to learn to code. You will need this skill in any managerial role.
> I would no more urge everyone to learn programming than I would urge everyone to learn plumbing. That'd be ridiculous, right?
I would whole-heartedly disagree. I think that everybody should at be proficient in as many practical skills as possible - an in depth knowledge is not required, simply a level of competency and an understanding of good practices and standards.
This applies to coding, plumbing, cooking, construction/DIY, auto repair, soldering and practically any skill that may come in handy.
Well written piece. Completely true and misunderstood. Of course there was some hyperbole, but as a non-programmer learning to code for the reasons Mr. Atwood gave (problem solving, etc.) I think that while it is an important skill, that it's starting to be annoying how the thing is being sold, in my opinion, because coding is very, very hard for people who don't know how to do it, but it's being made out as life or death, and not that hard, which is not right!
What an idiot. If nothing else, learning basic coding skills allows you to have a grasp of what's possible, what's hard, what's easy and what's trivial. Even if Bloomberg never codes a line in his job, that background knowledge can manifest in 100 different ways, and will allow him to be a better manager of people and systems. We would all be much better off if every congressman took a 2 week course in programming.
What is wrong with acquiring a skill that is completely unlike what you normally do. It's enriching experience and challenges you mentally more than learning something that is very much like what you already know/do.
No one is saying that just because you learn to program you will be seeking to do it professionally. I think mayor of New York knows better than to quit his post and start seeking some janitorial programming position.
I really agree with this part: "You should be learning to write as little code as possible. Ideally none."
Less code is better than more code. Even less code probably means you are reusing someone else's code which is even better. And this is the one that programmers can't accept: composable/configurable tools are better than programming languages. Better as in plain better, and better software engineering.
The idea that you should learn X to "succeed at life" (whatever that means) is fallacious. We learn things to become better people as a whole, not necessarily to use those skills in our jobs. I bet Bloomberg is not using his math skills in his job and that's fine but he's probably thinking using logic (I hope) which is something you learn both from math and programming.
Thinking that everyone should learn to code is an absurd idea. Most folks can barely use their computer, let alone care to program. A good percentage of web designers can't write markup, do you think my mom is going to fire up a shell?
Perhaps teaching some basic digital fluency is a more realistic goal, e.g., the role of computers in society, a primer on hardware, basic security, etc.
Bloomberg didn't say anything about learning to code for professional reasons. If Atwood has forgotten that coding is a rewarding experience on its own, then he is no longer a voice worth listening to.
People who make and apply laws regarding software should understand how software works and is made. They could talk to experts instead, but to choose right experts they also need to understand how software works.
So maybe New York Mayor don't need to code, but IP lawyers that works on software cases, and politicians voting on software related law - yeah, I think they should.
I should probably disagree. The point of code being a life skill is not that we want more people to write code on a day-to-day basis. You should think about teaching kids to paint, rather than teaching them to read. It's not because we want more painters or because painting makes you better at the job you do, but painting helps you to see things from a different (artistic) perspective, to appreciate certain joys and certain other techniques.
Sussman has gone on record with a talk titled, "Why Programming is a Good Medium For Expressing Poorly Understood and Sloppily Formulated Ideas." That's probably an everyday use of programming which I've not seen, and it's part of what people learn as one of these "background skills" in college: how to think of things precisely.
I still get a lot of people who are shocked when I teach them relativity. You mean it's not a bunch of mysticism about "mass is squared light energy"? You mean you can prove that this Lorentz transformation doesn't lead to paradoxes? You mean you can derive it with high-school geometry plus some simple axioms that I can clearly understand? The only part which is hard to get across is the causal structure of "light cones", because people don't think in intersecting cones. (I have had some success with calling them "expanding light bubbles," with some reference to supernova explosions.)
Coming back to clarity, and finding it, programming is a good way to pick up that habit, even if you don't code on a day-to-day basis.
There is of course one well-known disadvantage which goes unmentioned in this Coding Horror post: coders are disproportionately more likely to think of legal systems as made of immutable and strict laws. The idea that a judge is supposed to, y'know, judge the human costs of competing legal priorities, and make a decision which is both fair and in keeping with the laws as written -- this discretion seems to be missing. You see this as well with how coders approach pharmacists: it's as if pharmacy was no longer a medical discipline and was somehow relegated to counting pills. No, that's what we code the robots for. Stop equating people with robots.
But if we remain sensitive to the humanity of others, then being able to code probably functions to a net benefit, much like Jeff's example of plumbing does. I mean, there are still occasions where you need a professional, but everyone should have disassembled the pipes to their sink at some point in their life, just for the experience.
There is a lot to be said for avoiding the temptation to write "one more line of code." I used to work with a guy who would pride himself with reducing (whenever possible) the amount of code with every modification and fix he made. He really had it down to an art, and it greatly clarified the core functionality of the software.
This makes me so sad. Why does Atwood mistake learning to program with becoming a programmer? I expect this kind of thing from naysayers and ignoramus, but Atwood is a hero in our community. I feel like he's forgetting a /s tag at the bottom or that he's trolling us all.
Next he should tell us to leave math to the mathematicians.
Two things about Bloomberg: The "taxpayers" pay him $1 a year (granted that doesn't mean he shouldn't do the job of Mayor, but just saying). And two: He OWNS a technology company. If I owned one and wasn't on the technical side, I'd be interested in picking it up as well
While I don't agree that everyone should learn to code/program, I do think that everyone should learn discrete and critical thinking. Just the ability to break down a large problem (whatever domain it is in) into manageable chunks has helped me immensely throughout life.
My main concern is that people learn a bit of the easy stuff, then extrapolate that coding is easy therefore inexperienced and cheap programmers are all that's needed to complete a project. Quality of code will drop, as will salaries (even for the experienced).
What a negative message- not unlike the, "Don't be an Entrepreneur" talk from last week. I don't understand these high profile, obviously successful people with public personas being all, "Don't try to do what I did," thinking that will resonate.
I feel the takeaway is that you already, deep down, know what you need to do - so do that.
If you have a burning desire to learn how to program, be an entrepreneur, or whatever else you need to do to make your life complete, you're not going to let a little article get in your way. It is, however, sage advice if you want to become a programmer only because you see dollar signs, despite every bone in your body telling you that you have no interest in the study. That was not going to end well anyway. You cannot duplicate success by copying the actions of someone successful.
The harm in learning how to program if you are only doing it because you want to be the next Jeff Atwood is that you are completely overlooking the qualities you are sitting on, that come with a much great chance of providing your own success.
I'm not looking for Jeff Atwood or Phil Libin's approval or permission and I don't think many folks reading HN are either. :) Although perhaps I am guilty of looking for validation on some sub conscious level, but who isn't? Ultimately I was just responding to the tone of the post - he makes many perfectly legitimate points. I just think he's missing the most important general one which is that it's not a bad thing for people to learn to program and become more technically/computationally literate.
Edit- tone isn't really the right word. It's the basic idea of the post that I dislike and not for reasons related to my own learning or business. I think it reflects a view of people, learning, etc, that's inconsistent with what's possible and all the opportunities that are open to everyone right now. I understand where you're coming about the sage advice, but think that's the risk/case with anything.
I think there's a knee-jerk reaction against the popularization of computer programming, and I think it's unfounded.
We have a sense that, because some 80 (possibly 90) percent of programmers write shitty code, that encouraging more people to program is going to flood the field with mediocre programmers and that we're personally going to have to maintain their legacy monstrosities. Somehow, I'm guessing that I'm not going to be maintaining Bloomberg's business-logic DSL any time soon.
I think it's good that we're making people more aware of computer science and that programming is becoming cool again. I'm not a fan of tech bubble "coolness" (where traditional business types move into tech startups, usually in executive positions, because of the trend, but have no real interest in technology) but if people develop a genuine interest in how computers and programs work, that's great. It'll have all kinds of ripple effects: better and more widespread CS education (even in grade school), increasing technical literacy in important organizations, increasing appreciation for technical talent in the world at large, and quite possibly a more rational approach to business, government, and politics.
The real problem we face, in terms of the "Why do we have to deal with so much shitty code?" question isn't that these bad programmers are untalented. It's not a low IQ problem. It's a problem of dysfunctional work environments (due to a low appreciation for what programmers do in many companies) and a lack of incentive to improve. These "bad programmers" stop growing, because the bulk of development jobs don't encourage people to grow, so a lot of people end up learning basic Java best practices and that's it. They never learn Unix and its philosophy, functional programming and recursion, architecture, or logic. They get to the 1.2-1.3 level (scale here: http://michaelochurch.wordpress.com/2012/01/26/the-trajector... ) and either go into management or plateau. That's because the typical JavaJob setup is designed to bring up the rear while holding back the best, so people get into a mentality where they lose faith in the capability of the individual developer and management appears like the only place where it's possible to have real accomplishments.
Actually, if anything's going to liberate the horde of 1.2 developers from their JavaJobs, it's going to be making programming fun and cool again-- reminding these people that coding isn't just something they do for one job, but that it's a valuable and extremely versatile skill, if they keep improving despite having no immediate economic pressure to do so.
There are few jobs I can think of where learning a TINY little bit of coding could help as much as when you're Mayor of New York (or a major CEO, etc). If the guy figures out nothing else than that he can make a program to keep tally counts as he discards emails, he just has to click which category they belong to, or that he can send form letters programmatically, he will be far more productive. Yes, aides do both of these things, but with code you don't have to communicate what you want someone to do, you can just do it and tweak it until it's most helpful for you - when you're the one in total control you are just so much more productive.
I basically completely disagree with this submission.
I have to say, I think everybody will learn to code in the future. It teaches logical thinking, which we just don't have enough of in today's society. And with the explosion of computers, it's going to be a handy skill; just like there are tons of amateur mechanics who can do a few things on their car but they can't do a complete overhaul.
i have been programming for almost seven years,and only three years as a programmer.i don't think it bad to learn to code,but don't take coding as a way of thinking,you just need to know one or two programming languages,and not more.