Please don't learn to code
codinghorror.com
codinghorror.com
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.
edit: grammar
I agree totally, not only would it be good for him but it sets a good example for his constituency (because as a basic competence it is good for anyone).
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.
I was once told by a good friend of mine in industry X[1] 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.
[1] 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.
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.
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 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.
One refers to picking up some skills for any of a variety of reasons. The other refers to embarking on a career.
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.
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.
Should everyone have an understanding- probably. Should everyone build a public bit of code - probably not.
Coding as a hobby is great but making strategic decisions still requires experts.
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 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.
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'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.
But learn to code anyway :-)
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.
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.
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.
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.
Let us not forget the difference between scripting and software. Shell scripts or bookmarklets or greasemonkey/browser plugins - These can be useful to the majority of workers.
Many have a specific problem that could be made much easier by coding but never will be address by professional coders.
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.
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?
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.
Not true at all, people can use computers every day of their life in their job and still not even understand where a window goes when they minimise it.
I've also used my ability to code to develop learning apps for my students. It's been incredibly valuable in my career.
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.
For me it was like reading: "Writing is not a basic skill; we have plenty of books out there. Most people, when they learn to write, start writing books that are of awful quality!"
It's like novelists novelists being afraid of people learning to write because then they'd take their jobs or scientists being afraid that people learnt physics, mathematics, cosmology...
One case I can think of... religious priests are sometimes afraid of people actually reading their religious books aren't they? :-P
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.
"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 can't tell you how excited I was when I wrote a simple joystick driven paint program for my Atari 400 in Atari BASIC :)
My mom recently (2012) just asked me if when I'm programming, the screen is full of symbols, kind of like the matrix.
Many people I know consider computers "illogical". We could do a lot to help people understand how a computer works, and the best way is through programming.
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.
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.
Which I completely agree with.
http://rosettacode.org/wiki/Pascal%27s_triangle#APL
I'm beginning to think your mom is smarter for not knowing how to code, because she hasn't been biased yet by exposure to mainstream tools.
Perhaps there is value in a blank slate, but that is definitely not being smart.
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.
[0]: https://twitter.com/#!/Sniffnoy/status/201187266197065729
Are you sure about it?
What if he suddenly starts thinking that he actually knows what goes into building software?
I have this horror scene in my mind where Bloombergs of this world are terrorizing their developers, with their "deep knowledge" of computers that they picked up by doing an online JavaScript course, I mean "code year".
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 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.
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.
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.
Traversing those learning curves is more rewarding the longer you keep at it. Also, it's rare that one field of knowledge doesn't benefit many more.
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 there's nothing wrong with learning a new skill, whoever you are, whatever you do.
Learning new skills is what makes us human.
I'm a lousy cook - but I can cook food if I follow instructions that have accurate measurements.
That doesn't mean I shouldn't learn to cook.
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.
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.
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.
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.
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.
Yes. Knowing cooking is paramount to feeding yourself and your family cheap, healthy meals.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
In the blog post, Atwood actually writes the following:
"Look, I love programming. I also believe programming is important … in the right context, for some people."
His actual argument is that the "everyone should learn programming" camp is wrong, it is not an opinion that no one can gain much from learning programming.
I agree with you that this was the point of the post. I respect Mr. Atwood tremendously, but I think that you and he overshoot the goals of Codecademy and its ilk by a long shot.
As others have stated, the goal is to have a bit more about how the computer works and a bit more about what computer programmers do at work.
Anything beyond that is gravy.
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.
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.
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.
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.
If you get to Levels 7,8, or 9, thank you.
There are plenty of level 3 cheesy little Access and VB apps that any "serious" programmer would laugh that that are level 5 or 9 on your scale.
Indeed, when domain experts reach some arbitrary level of programming expertise, many good things may happen.
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.
The straw man about reducing the amount of bad code in the world is garbage. Just code. If you're getting a benefit from it - or hell, if you just enjoy it - do it. You have nothing to apologize for.
The whole elitist concept of only sanctioned programmers coding is just arrogant. Even the best programmers wrote awful code before they were great. Doesn't mean they shouldn't have kept it up.
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 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.
EDIT: Fixed ironic typo ;)
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.
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.
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.
Oh, the irony. :)
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.
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.
Mathematicians, physicists, astronomers, chemists, economists, statisticians, engineers, meteorologists, actuaries, biologists, accountants, etc.
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.
> 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.
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.” [1]
And there have been many studies on the relationship between chess and problem solving, including this one by Ferreira and Palhares [2].
[1] http://www.artofproblemsolving.com/Resources/Papers/ProblemS... [2] http://www.math.umt.edu/tmme/vol5no2and3/TMME_vol5nos2and3_a...
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.
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.
http://reviewsindepth.com/2011/04/why-everyone-should-learn-...
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.
-Robert Heinlein
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.
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.
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.
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.
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.
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.
Enlightenment.
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.
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.
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".
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'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. :)
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.
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.
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.A basic grasp of computational thinking has never been more important. It's become a prerequisite for making informed decisions about the world we live in.
The world may or may not need more working programmers (or mathematicians, novelists or plumbers), but why wouldn't we want to teach these elementary skills to as many people as possible?
Came here to post something along these lines and to link to this 2006 article by Jeanette Wing, head of the Carnegie Mellon computer science department:
http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing0...
(incidentally given Michael Bloomberg has a degree in electrical engineering and he founded a multi-billion dollar tech company in the 80s I'm pretty sure he can code already; even if only in fortran)
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.
* taking problems and reducing them to a sequence of repeatable instructions and decision points (branches)
.
I think 'LtC' is irrelevant if defined as:
* I wanna make iPhone apps / Facebook plugins / Instagram ... Where do I get the Magic Handshake for the Mega $$$ ?
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.
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.
If anything should trickle down, it would be the joy and satisfaction of acquiring a basic competence.
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.
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.
"I wish I'd thought of [this]... The need for people who can read and write has never been greater. This is a fabulous product at the right time" -- Tim O'Reilly, Founder and CEO, O'Reilly Media
"A young man asked me for advice for 'those who aren't people who can read and write'. I said he should try to become a person who can read and write" -- Fred Wilson, Partner, Union Square Ventures
* As in paid to sling code - I don't mean to cast elitist aspersions with the term 'professional'.
The Good
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.
The Bad
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 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.
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.
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.
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 stopped reading at this point.
I mean, even learning Excel and it's various functions is a form of programming and undoubtedly a valuable skills even for a politician.
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.
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 )
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.
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.
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.
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.
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.
"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
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.
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.
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 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.
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.
Atwood might have a point in that if someone just goes off to learn to code using a cookie-cutter course, they might not really learn to work with the more important first part, but might end up like a JavaScript programmer who has no idea about Turing-completeness instead: http://reddragdiva.dreamwidth.org/579047.html
http://wharton-vip-webapps-talk.heroku.com/slides/1
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).
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.
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.
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.
It's no different to learn a little bit of coding for building a dynamic website for your community group, even if it's as simple as using HTML, CSS, and Javascript to customize a Drupal or Wordpress site, for example. In fact, you couldn't pick a more appropriate language than Javascript and markup languages for beginners looking to make something useful. We're not asking them to write linked lists or handle correct use of object inheritance.
"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?
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.
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.
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 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.
While professional guitarists take years to master it, anyone can get an acoustic guitar and play 'Hotel California' as hobby.
What the hell is wrong here?
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.
* He is one of the great technological innovators of our time.
* I may be wrong, but he doesn't draw a significant salary from the city, being a billionaire and all.
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 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.
Coding is like being a baker, or a plumber, a mechanic or a school teacher. It's a useful job in society and no more or less laudable than anything else.
Anyone can love their job - and they ought to. If they do, it doesn't mean everyone should feel the same.
I say, better to affirm how ordinary coding is, rather than how extra-ordinary.
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.
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.
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.
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.
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.
Next he should tell us to leave math to the mathematicians.
How about learning to distinguish bad code from good code?
How about learning to look at Atwood's code with a view to answering some questions: 1. How does this guy's mind work? 2. Can he think clearly or does he add needless complexity to everything?
Then making a decision whether you want to use his work or not.
There are innumerably unpredictable circumstances that may arise in which it will prove useful.
Bureaucrats in general could all profit from some minimal understanding of programming if only to stop them saying things like: 'the computer says: no!'
(But I disagree with the post, teaching people to program would be a net gain I think but I'm sure most people won't bother so no danger of ever finding out.)
Once they figure out again that's it's usually tedious and unglamorous work that doesn't pay particularly well on average they'll lose interest again.
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.
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.
http://accidentalhacker.com/post/16116466587/please-dont-lea...
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.
I basically completely disagree with this submission.
Become a programmer, by all means.
But please do not become another Jeff Atwood.