Friday, December 04, 2015

Learn To Code, It’s Harder Than You Think

TL;DR: All the evidence shows that programming requires a high level of aptitude that only a small percentage of the population possess. The current fad for short learn-to-code courses is selling people a lie and will do nothing to help the skills shortage for professional programmers.

This post is written from a UK perspective. I recognise that things may be very different elsewhere, especially concerning the social standing of software developers.

It’s a common theme in the media that there is a shortage of skilled programmers (‘programmers’, ‘coders’, ‘software developers’, all these terms mean the same thing and I shall use them interchangeably). There is much hand-wringing over this coding skills gap. The narrative is that we are failing to produce candidates for the “high quality jobs of tomorrow”. For example, this from The Telegraph:

“Estimates from the Science Council suggest that the ICT workforce will grow by 39 per cent by 2030, and a 2013 report from O2 stated that around 745,000 additional workers with digital skills would be needed to meet demand between now and 2017.

Furthermore, research by City & Guilds conducted last year revealed that three quarters of employers in the IT, Digital and Information Services Sector said that their industry was facing a skills gap, while 47 per cent of employers surveyed said that the education system wasn’t meeting the needs of business.”

Most commentators see the problem as being a lack of suitable training. Not enough programmers are being produced from our educational institutions. For example, here is Yvette Cooper, a senior Labour party politician, in The Guardian:

“The sons and daughters of miners should all be learning coding. We have such huge advantages because of the world wide web being invented as a result of British ingenuity. We also have the English language but what are we doing as a country to make sure we are at the heart of the next technology revolution? Why are we not doing more to have coding colleges and technical, vocational education alongside university education?”

There is also a common belief in the media that there are high barriers to entry to learning to code. This from the Guardian is typical:

“It’s the must-have skill-set of the 21st century, yet unless you’re rich enough to afford the training, or fortunate enough to be attending the right school, the barriers to learning can be high.”

So the consensus seems to be that high barriers to entry and a lack of accessible training mean that only a rich and well educated elite have access to these highly paid jobs. The implication is that there is a large population of people for whom programming would be a suitable career if only they could access the education and training that is currently closed to them.

In response, there are now a number of initiatives to encourage people to take up programming. The UK government created ‘Year of Code’ in 2014:

year-of-code

The message is “start coding this year, it’s easier than you think.” Indeed the executive director of Year of Code, Lottie Dexter, said in a Newsnight interview that people can “pick it up in a day”. Code.org, a “non-profit dedicated to expanding participation in computer science education”, says on its website, “Code.org aims to help demystify that coding is difficult”.

hour-of-code

So is it really that easy to learn how to code and get these high paying jobs? Is it really true that anyone can learn to code? Is it possible to take people off the streets, give them a quick course, and produce professional programmers?

What about more traditional formal education? Can we learn anything about training programmers from universities?

Given the skills shortage one would expect graduates from computer science courses to have very high employment rates. However, it seems that is not the case. The Higher Education Statistics Agency found that computer science graduates have “the unwelcome honour of the lowest employment rate of all graduates.” Why is this? Anecdotally there seems to be a mismatch between the skills the students graduate with and those that employers expect them to have. Or more bluntly, after three years of computer science education they can’t code. A comment on this article by an anonymous university lecturer has some interesting insights:

“Every year it's the same - no more than a third of them [CS students] are showing the sort of ability I would want in anyone doing a coding job. One-third of them are so poor at programming that one would be surprised to hear they had spent more than a couple of weeks supposedly learning about it, never mind half-way through a degree in it. If you really test them on decent programming skills, you get a huge failure rate. In this country it's thought bad to fail students, so mostly we find ways of getting them through even though they don't really have the skills.”

Other research points to similar results. There seems to be a ‘double hump’ in the outcome of any programming course between those who can code and those who can’t.

“In particular, most people can't learn to program: between 30% and 60% of every university computer science department's intake fail the first programming course.”

Remember we are talking about degree level computing courses. These are students who have been accepted by universities to study computer science. They must be self selecting to a certain extent. If the failure rate for programming courses is so high amongst undergraduates it would surely be even higher amongst the general population - the kinds of candidates that the short ‘learn to code’ courses are attempting to attract.

Let’s look at the problem from the other end of the pipeline. Let’s take successful professional software developers and ask them how they learnt to code. One would expect from the headlines above that they had all been to expensive, exclusive coding schools. But here again that seems not to be the case. Here are the results of the 2015 Stack Overflow developers survey. Note that this was a global survey, but I think the results are relevant to the UK too:

SO-dev-survey

Only a third have a computer science or related degree and nearly 42%, the largest group, are self taught. I have done my own small and highly unscientific research on this matter. I run a monthly meet-up for .NET developers here in Brighton, and a quick run around the table produced an even more pronounced majority for the self-taught. For fun, I also did a quick Twitter poll:

mh-self-taught-twitter-pol

76% say they are self taught. Also interesting were the comments around the poll. This was typical:

self-taught-tweet

Even programmers with CS degrees insist that they are largely self taught. Others complained that it was a hard question to answer since the rate of change in the industry means that you never stop learning. So even if you did at some point have formal training, you can’t rely on that for a successful career. Any formal course will be just a small element of the continual learning that defines the career of a programmer.

We are left with a very strange and unexpected situation. Formal education for programmers seems not to work very well and yet the majority of those who are successful programmers are mostly self taught. On the one hand we seem to have people who don’t need any guided education to give them a successful career; they are perfectly capable of learning their trade from the vast sea of online resources available to anyone who wants to use it. On the other hand we have people who seem unable to learn to code even with years of formal training.

This rather puts the lie to the barriers to entry argument. If the majority of current professional software developers are self taught, how can there be barriers to entry? Anyone with access to the internet can learn to code if they have the aptitude for it.

The evidence points to a very obvious conclusion: there are two populations: one that finds programming a relatively painless and indeed enjoyable thing to learn and another that can’t learn no matter how good the teaching. The elephant in the room, the thing that Yvette Cooper, the ‘year of code’ or ‘hour of code’ people seem unwilling to admit is that programming is a very high aptitude task. It is not one that ‘anyone can learn’, and it is not easy, or rather it is easy, but only if you have the aptitude for it. The harsh fact is that most people will find it impossible to get to any significant standard.

If we accept that programming requires a high level of aptitude, it’s fun to compare some of the hype around the ‘learn to code’ movement with more established high-aptitude professions. Just replace ‘coder’ or ‘coding’ with ‘doctor’,  ‘engineer’,  ‘architect’ or ‘mathematician’.

  • “You can pick up Maths in a day.”
  • Start surgery this year, it’s easier than you think!
  • skyscraper.org aims to help demystify that architecture is difficult.
  • “The sons and daughters of miners should all be learning to be lawyers.”

My friend Andrew Cherry put it very well:

free-training-ac

Answer:  only one: software development. You want to be a doctor? Go to medical school for seven years.

Accepting that aptitude is important for a successful career in programming, we can approach the ‘shortage’ problem from a different angle. We can ask how we can persuade talented people to choose programming rather than other high-aptitude professions. The problem is that these individuals have a great deal of choice in their career path and, as I’m going to explain, programming has a number of negative social and career attributes which make them unlikely to choose it.

There’s no doubt that software development is a very attractive career. It’s well paid, mobile, and the work itself is challenging and rewarding. But it has an image problem. I first encountered this at university in the 1990’s. I did a social science degree (yes I’m one of those self taught programmers). Socially, us arts students looked down on people studying computer science, they were the least cool students on the campus - mostly guys, with poor dress sense. If anyone considered them at all it was with a sense of pity and loathing. When towards the end of my degree, I told my then girlfriend, another social science student, that I might choose a career in programming, she exclaimed, “oh no, what a waste. Why would you want to do that?” If you did a pop-quiz at any middle-class gathering in the UK and asked people to compare, say, medicine, law, architecture or even something like accountancy, with software development, I can guarantee that they would rate it as having a lower social status. Even within business, or at least more traditional businesses, software development is seen as a relatively menial middle-brow occupation suitable for juniors and those ill-qualified for middle management. Perversely, all these courses saying ‘learn to code, it’s easy’ just reinforce the perception that software development is not a serious career.

There’s another problem with software development that’s the flip side of the low barriers to entry mentioned above, and that is there is no well established entry route into the profession. Try Googling for ‘how to become a doctor’, or ‘how to become a lawyer’ for example:

how-to-become-a-doctor

There are a well established series of steps to a recognised professional qualification. If you complete the steps, you become a recognised member of one of these professions. I’m not saying it’s easy to qualify as a doctor, but there’s little doubt about how to go about it. Now Google for ‘how to become a software developer’, the results, like this one for example, are full of vague platitudes like ‘learn a programming language’, ‘contribute to an open source project’, ‘go to a local programming group’. No clear career path, no guarantees about when and if you will be considered a professional and get access to those high-paying jobs of the future.

Yes, I made this up, but it makes the point. :)

Now take a high-aptitude individual who has done well at school and finds demanding intellectual tasks relatively straightforward, and offer them a choice: on the one hand, here is a career, let’s take medicine for example, you follow these clearly enumerated steps, which are demanding but you are good at passing exams, and at the end you will have a high-status, high paying job. Or, how about this career: go away, learn some stuff by yourself, we’re not sure exactly what; try and get a junior, low status job, and just learn more stuff – which you can work out somehow – and work your way up. No guarantees that there’s a well paying job at the end of it. Oh, and, by the way, the whole world will think you are a bit of a social pariah while you are about it. Which would you choose?

So could software development follow the example of older professions and establish a professional qualification with high barriers to entry? There are attempts to do this. The British Computer Society (BCS) calls itself ‘the chartered institute for IT’ and seeks establish professional qualifications and standards. The problem is that it’s comprehensively ignored by the software industry. Even if you could get the industry to take a professional body seriously, how would you test people to see if they qualified? What would be on the exam? There are very few established practices in programming and as soon as one seems to gain some traction it gets undermined by the incredibly rapid pace of change. Take Object Oriented programming for example. In the 2000’s, it seemed to be establishing itself as the default technique for enterprise programming, but now many people, including myself, see it as a twenty year diversion and largely a mistake. How quickly would programming standards and qualifications stay up to date with current practice? Not quickly enough I suspect.

However, my main point in this post has been to establish that programming is a high-aptitude task, one than only some people are capable of doing with any degree of success. If the main point of a professional qualification is filter out people who can’t code, does it really matter if what is being tested for is out of date, or irrelevant to current industry practices? Maybe our tentative qualification would involve the completion of a reasonably serious program in LISP? A kind of Glass Bead Game for programmers? The point would be to find out if they can code. They can learn what the current fads are later. The problem still remains how to get industry to recognise the qualification.

In the meantime we should stop selling people a lie. Programming is not easy, it is hard. You can’t learn to code, certainly not to a standard to get a well-paid-job-of-the-future, in just a few weeks. The majority of the population can not learn to code at all, no matter how much training they receive. I doubt very much if the plethora of quick learn-to-code courses will have any impact at all on the skills shortage, or the problem of unskilled low pay and unemployment. Let’s stop pretending that there are artificial barriers to entry and accept that the main barrier to anyone taking it up is their natural aptitude for it. Instead let’s work on improving the social status of the software industry – I think this is in any case happening slowly – and also work on encouraging talented young people to consider it as a viable alternative to some of the other top professions.

124 comments:

George H said...

Stating that "anyone can learn to program" is like saying that anyone can draw or compose music. While you may be able to learn "how to draw" by taking classes and/or training, at the end of the day, if you don't have the aptitude and skill to draw you're simply never going to be good at it. Knowing "how"... doesn't mean that you "can". I believe the same applies to development.

Matt F said...

I think that it's true that "anyone" can draw, compose music, or write software. I don't think there's some special talent or aptitude needed, but fully agree that there is no such thing as a 2-week course where you can "learn to program." That makes no sense, of course. Like painting or composing or surgery, *practice* is paramount. No-one, no matter the aptitude, gets to become a "good" composer, painter, surgeon, or programmer without practicing.

I think lack of practice is being mistaken for lack of aptitude, or that "high rate of improvement from practice" is what is being referred to when the word "aptitude" is used. Which, I admit is a good enough definition, but from context it seems the author prefers a stricter definition of "aptitude," more like "capability." But I would not use it to exclude a large swathe of people who are having some difficulty learning from the field. They may be capable, but slower than you or I.

AreSee said...

I agree with George. But I think it still makes sense to learn how to do something even if you don't pursue the skill professionally. I'm a programmer, but I'd love to draw well or write expressively or play a musical instrument with style. But I'd never seek a career with those skills. They add considerable value to my life by enhancing my self expression and my appreciation of art.

Learning to program provides several valuable lessons. To accomplish any software task you need to specify a complete unambiguous set of instructions, and before doing that, you need to decide what the task should accomplish and how it should fail. Programming is a gentle introduction to the value of formal models and abstract thought. It's clear that most people in the world lack this awareness, just like they misunderstand the tenets of math and science.

Acquiring skill in programming also provides valuable insight into how much of the world works, now that so much of it is directed by computers. And of course, since everyone now uses personal computers (and smartphones) almost constantly, knowing more about how they operate, and how data flows, and how to better bend them to your will -- this wisdom is empowering and often quite useful.

Matthew H. said...

Nice post. I've been wanting to write something similar for a while now but never spent the time collecting the statistics. The "hour of code" and such sites have always bothered me and I have used the surgery analogy as well. IMO, the number of programmers in the world has not changed since the 1980's, computers have just become more popular. Back in the early 80's when I started (I'm self-taught), anyone who had a home computer was probably a geek, and you could use your computer to play crappy games or code. Most learned to code.

I like to use the car analogy. Just because everyone has a car does not mean they can/should be a mechanic. And of those drivers that are mechanics, not all of them can/should engineer and build a car.

The biggest problem is that programming in a young discipline and there is little respect for it. Also, people have a hard time understanding and relating to programming since they can't see it or touch it like you can a house, a car, or whatever.

Anyway, thanks for writing this article.

Glen said...

In Cornwall, they're trying address the difference between employer requirements and graduate skillsets with things like http://dbscode.co.uk/the-agile-code-huddle/ This is something we've benefitted from as a company as we have employed 2 of the alumni from this course. The other interesting thing about the course is that not everyone was a fresh graduate. Some were people with a strong interest in programming who had previously followed other paths, one person had just done their GCSE's.

I feel that there are a number of issues:

People hiring / interviewing are often programmers and as programming is all about right and wrong, it's difficult to see the grey areas in the skillset of the interviewee.

Lack of "apprentice" type training, so the requirement is always for graduates.

Many seem to be fixated on the idea that programming and computers are an isolated subject, but realistically as we see more use of this technology in everyday life, the job title of "computer programmer" becomes so broad, it's an unrealistic expectation to assess someone's skillset against this benchmark.

I've interviewed a large number of people for quite specific roles at our company. I'm not the decision maker when it comes to hiring, but the most important things to me have been personality, curiosity and self-motivation to learn more about the craft. We can't expect someone to walk into a role on day 1 and be amazing, so we have to identify the potential.

The attitudes of many people in the industry is often arrogant and off-putting, this is the double-edged sword of having an industry that's fairly "open" in terms of it's interaction with other people. There's probably arrogant people in all jobs, but I guess when you're dealing with the technology that underpins the internet, etc. It's easier for someone tech-savvy to encounter that.

For my own sins, I hope to continue to improve, retain my imposter syndrome which motivates that improvement and try to share some of my learnings with other people along the way.

Eric Scrivner said...

It's usually anathema in the industry to express an opinion like yours, and you'll no doubt get criticism for your "elitist" or "bigoted" opinions. Yet the longer I've been a professional programmer (15+ years now), the more it becomes clear this the way to think about it whether we like it or not. The reality is the current flippant attitude towards programming results in a lot of incompetent work being farmed out to incapable or low-aptitude programmers. I and others I know have been paid an accumulated few million dollars over the course of our careers so far just to clean up messes made by other programmers. I've seen multiple businesses tanked by bad programming work early on. I can only imagine the scale of the real problem, even making conservative estimates, from this small sample. I think the real issue is that since our work is largely incorporeal (we don't perform surgery or build giant structures), it's easy for failings that would be considered fraud or professional incompetence in other industries to simply be ignored in programming - poorly constructed accounting systems that lose their businesses money, major security holes that allow anyone on the internet to delete data from your businesses website, completely manufactured analytics clients are charged for, credit cards sent through email etc. These are all real examples btw. It's also easy for bad programmers to exaggerate or mislead their non-technical managers.

Lowering the bar even more just doesn't seem like the right answer to me.

Anonymous said...

Dont become a programmer, become a doctor. The economics of offer and demand says that the more doctors, the lower the cost for us to pay for health. Today the doctors earn way too much, for solving your problems. Yes, programmers solve problems as well, but it is the managers who take their money, and as it is very easy to outsource the jobs to Asia for a low cost, the income of programmers in the western countries is reduced even more. Solving problem it is hard and it will always be. Thanks the author for telling us that this job is seen like a blue collar work.

Anonymous said...

Why is "most people can't learn it" such a popular excuse for terrible teaching?

Anonymous said...

You leave out an important related issue.

There are inept, unqualified programmers attempting to acquire the title "software engineer" so as to achieve higher incomes, indifferent to the fact that their lousy programming skills result in crappy, dis-functional products.

They stay with one organization long enough to 'finish' enough projects to pad their resume and then leave to the next job where they will once again cut-and-paste their way well enough to get by.

The people I'm talking about know all the buzzwords, and they know enough about the latest fad languages to get hired but they are incapable of quality work.

The web is full of their shitty dis-functional work and the people who pay for it, the end customer, has no idea that it's possible to get good work done because rather than taking the time to understand the problem they simply start over with another vendor selling empty promises and using another team of bad programmers.

Why do all the vendors employ bad programmers?

Because they won't pay for good programmers.

Anonymous said...

This post is garbage.

Conflating learning basic programming, which would help many people, with becoming a professional which programmer, which many people don't even want to do, is pointless.

Saying that people don't have "aptitude" based on pass rates of awful introductory programming courses is awful.

You're also conflating computer science, which is what universities teach, with programming, which they don't, really.

This post is harmful to people who want to try something new but are having trouble.

The other comment talking about "aptitude" for drawing hasn't seen what happens to art students who are properly instructed -- their work dramatically improves in a matter of days or weeks.

We teach reading and writing even though most people will never become novelists. Programming is no different. Stop saying discouraging, stupid shit like this.

Laurent Bossavit said...

The "double hump" study has been retracted. http://retractionwatch.com/2014/07/18/the-camel-doesnt-have-two-humps-programming-aptitude-test-canned-for-overzealous-conclusion/

Steve Castle said...

I never bought the argument that the problem is a lack of training or accessibility. Because it's kind of obviously demonstrably wrong. For 50 bucks a month I can take about a billion excellent courses taught by the best professors and professionals, there's pluralsight, codeschool, codeacademy, coursera, udacity... The available material ranges from project oriented, to live coding, to quizzed material. There is practical learning, theoretical, architecture, and specific tool based learning out there for virtually everything. It seems to me software developers have 100 times more high quality cheap learning material available than ANY other profession.

George Mauer said...

Sorry if this is untrue as I am unfamiliar with your blog but this reads to me like armchair philosophy from someone who hasn't spent a ton of time teaching programming.

Here's something else with a ton of research behind it - you can attain expert ability at any skill with 10,000 hours of careful, intentional practice. (Yes, the 10K number is more rhetorical than literal but the point is the same.) I can barely draw, and I might never be one of the greats, with a lot of practice even I can be a professional artist. Now you might note that 10,000 hours of coding is a lot more than an Hour of Code, or "learn to code in a day" but the point of most of those (that are honest at least), is not to teach programming, but to spark interest by showing how programming can be used to create.

The programming gap hasn't been around all that long and...well...we still suck at teaching programming. So much of our curricula is based on "the way that I learned it" and every developer out there will admit their own self-education was incredibly meandering and sub-optimal.

This article on Viking Code School describes a phenomena I've seen plenty, where someone finishes the online tutorials (which just about anyone can do) and has trouble transitioning to their own project. This "desert of despair" isn't something that is inhertently easy for some to handle and insurmountable to others, it is simply a part of the curriculum that nobody has really flushed out yet in a great way. That's where *intensive* bootcamps such as Hack Reactor step in and are really great. They help you get the hours in and do so in a structured, not-too-bad-but-could-be-better way. And yeah, those grads tend to be fairly top notch.

We're additionally hampered by the fact that programming education hasn't been around that long. The low end of the skill curve is overloaded and yes, companies who had novices make a mess previously want experts. (The novices have since moved on and are now greatly improved experts.) This is all something that is both natural and can be fixed with more refined education.

Of course learning to code is not dirt simple, but its not an inherent ability either. Heck, playing *professional sports* is more subject to practice than physique. Thinking that programming is somehow tilted in the other direction is kind of the height of vanity.

Marko Plahuta said...

I'm also a self-taught programmer, whose hobby has slowly become a career. I'm speaking for myself only, but I learned to code because I realized that nobody is going to try out the many ideas I had, if I don't. I learned these skills because I was highly motivated to do so. But I'm not motivated for drawing, for example. I'm sure I'd lear it if I saw some value in it.

Maybe all these people that "don't have aptitude" simply don't enjoy toying with data and concepts, or they don't see much value in that. Maybe their other interests would well benefit with programming skills, if someone showed them how thay could help themselves. Learning a dry skill without idea what to do with it is just pointless, and I'm afraid all these code schools are doing exactly that.

Matosawitko said...

Note that the StackOverflow numbers don't sum to 100%, so you can't use them to show % of population. As I recall (since it's been a while since I took the survey), you could pick multiple answers based on what applied to you. I have a degree, but I also have quite a bit of on-the-job and self-taught training, for example. Likewise, people who have a Masters or PhD might have also ticked the boxes for lower-level degrees.

Nathan Reiber said...

This is some cry-baby classist bullshit. More should be done to elevate the status of all laborers, not making training for decent paying work less available. You literally make statements that suggest you're against social mobility for the low wage-earners. Why? The best thing about this industry is that it is open. While most people are struggling to afford rent and utilities you're whining because you don't have the social status and recognition of a surgeon, without pausing to question whether those people are deserving of their class status, or if it's right for anyone to have an inferior class status. just shut up.

Paul Tiseo said...

I think there's an oversimplification going on in this article, a type of false dichotomy.

Mike, I am supposing you are a practiced coder who thinks that people who've spent a short amount of time in a boot camp won't really be able to perform like you. And, in some ways, you are right. They won't be able to code... like YOU.

But, there's a lot of different kind of programming going on out there. There's work of all levels and types, just like in art, in sciences or even in accounting/finance, often thought as the most conservative-to-change profession out there.

The majority of coding being conducted in the industry is very teachable, and in a short period of time. (Maybe not hours or days, as some book/video titles suggest, but most people understand the difference between "picking up" from those materials vs. being an expert at something.) At the other extreme, the first person(s) to have scaled Facebook in ways no one before had done not only required lots of knowledge, but wide-ranging, relevant experiences AND a certain kind of obsessive personality too.

As for some idea that there a mystic or genetic "It Factor" for all kinds of programming, is just preposterous or a gross simplifcation.

Melissa said...

I think it's important to make a distinction between what you learn over the course of a CS degree vs. what you learn as a self-taught programmer. I got my CS degree in the US: my experience is that programming at the university level tends to be abstract and not at all relevant to a day job programming. For instance, all my classes besides the intro class were pseudocode-only algorithm and theory classes up until the end of my third year when I took a class that used Grails. When you're teaching yourself (whether from scratch or on the job) you're usually trying to learn whatever is most immediately useful to you. So I'm probably not going to waste my time learning computational theory when I could be learning how to get my website up and running in a few hours with whatever framework.

Ideally, universities could make their programs more relevant to the industry or open new tracks that are less computer science and more practical software engineering. Making "learn computational theory" as easy and abundant as the flood of "learn to code" courses would be useful for anyone not going the university route.

Anonymous said...

Respectfully, this is absolutely incorrect. Just take a look at the trending "anyonecanimproveatdrawing" on twitter or Facebook. Visual art is rudimentary mechanical skill + memorization and internalization of information about rules such as perspective/lighting & rendering + building of visual library. It can easily be learned by absolutely anyone. However, like coding, those who show aptitude at 20 started their journey at 5 or 6 - in art, by drawing with crayons and observing the world around them with interest and an analytical eye; with coding, by gravitating towards pursuits and hobbies that provided exercise in analytical problem solving and logic. In any case, the idea that art requires any sort of innate skill is ludicrous and potentially discouraging to those who wish to pick it up, and I would lean towards the same stance on coding.

Anonymous said...

The notion that there's some some innate aptitude that only some very minor fraction of the population possess for fields of human endeavor is mostly nonsense. We could paraphrase Churchill's "Continuous effort - not strength or intelligence - is the key to unlocking our potential" to include mysterious God-given code-fu.

The premise of https://en.wikipedia.org/wiki/Geoffrey_Colvin#Talent_is_Overrated is that it is "deliberate practice" is the key to ultimate success. Both Mozart and Tiger Woods benefitted from both favorable genetics as well as fathers who created the conditions in which they were able to accumulate Colvin's 10,000 hours of deliberate practice at an early age.

While our genetics determine whether we can possibly run as fast as Usain Bolt or develop musculature like Schwarzenegger's, these don't determine whether we can maximize our own potential to optimize our running form or to dedicate ourselves to spending a lot of time lifting weights.

Fortunately, there's so much computer programming that needs to be done in the world that almost anyone who makes a concerted effort to become proficient at coding can be successful, even if they don't have the same potential as James Gosling.

Anonymous said...

Imo, programming requires a lot of effort to get good at. It takes time to accumulate enough knowledge to get with the industry, and it takes a lot of effort to keep up with the advancements.

Universities aren't making enough effort to keep up with the industry, thus all they can teach is a vast variety of age old concepts that apply indirectly with the meta.

bob ama said...

Percentages in the "how did you learn" bar chart add up to more than 100

Dan Nguyen said...

Hard to take you seriously when you link ("Other research points to similar results") to an academic paper that has now been retracted (and its author suspended from his university):

http://retractionwatch.com/2014/07/18/the-camel-doesnt-have-two-humps-programming-aptitude-test-canned-for-overzealous-conclusion/

But maybe that underscores your point: if a developer can't even follow URLs and read the research he links to, perhaps it's not just programming that is hard to learn, but literacy as well.

Anonymous said...

not to be ablest, there are disabilities that do prevent people from mastering these skills. For example, graphical disabilities may hinder one's ability to draw, lexical disabilities may hinder one's ability to write and read. I have an extremely difficult writing neatly, and though I can write legibly, it's not without extreme levels of direct concentration that I accomplish that, and still without precision.

Anonymous said...

coding:software developer
using stethoscope:doctor
arguing:lawyer

Coding is necessary but incomplete part of being a professional software developer. Whole bunch of other skills needed.

Anonymous said...

Most professions need assistants. Civil Engineers need draftsmen and laborers (they maybe CAD draftsmen and Machinery operators but still needed). Programming is the same as being a draftsman or a laborer. Both are needed to build a house but you really need the Civil Engineer to build it. We need a large number of programmers, designers and a few real Software Engineers to build software. Its a mistake to expect everyone who designs software to be able to code - most Civil Engineers dont know how to lay bricks - and also a mistake to expect Programmers to build entire systems. We do need programmers but we also need to reduce the number of Computer Engineers being spitted out by Engineering schools. We need a 1 year/2 year programming certification to be used by programmers working under the direction of Software Engineers who do the 4 year course which teaches about computer theory. We also need to start requiring third party damage insurance on all software deployed publicly and have the insurance companies refuse to insure anything unless it was built under the guidance of certified Software Engineers. Only then will be bring respect back to the Software Engineering profession and get rid of all the quacks who go around pretending to know how to build software when all they can do is code.

Anonymous said...

If there is a programmer shortage, I would lay the blame on employers who operate their HR function like factories. They look for inputs - certifications of one sort or another that they can quantify which allows HR people with no software development background screen out candidates. The 2 best programmers I've ever worked with had High School diplomas and thats it. Most HR groups will reject such people out of hand unless they can circumvent HR by word-of-mouth and contacts. I would also blame employers who are working hard to turn software development into a factory environment. I would say that I would never want to work in most large software houses, but that is me.

My advice is to find a problem area that interests you outside of software development and become an expert on that subject. Then learn some software skills - self teaching with a mentor is probably the best path. If you aren't motivated enough to self teach, you probably aren't interested enough in programming to be successful at it. Then apply your software skills to the problem are you know and love.

Anonymous said...

We are definitely due for a serious debunking of coding bootcamps but this article is not that.

Honeyboy Wilson said...

"Take Object Oriented programming for example. In the 2000’s, it seemed to be establishing itself as the default technique for enterprise programming, but now many people, including myself, see it as a twenty year diversion and largely a mistake."

Well, I guess you and one other would technically define many.

C Harwick said...

Replace "programming" with "most high-value skills" and you've pretty much nailed why the marginal return to education spending is zero now. http://www.downsizinggovernment.org/sites/downsizinggovernment.org/files/posts/Fed-Spend-Ach-Pct-Chg-Cato-Andrew-Coulson1.jpg

Christine said...

I've been a programmer for quite a while now. And I still think it's hard. What keeps me going is that it's a lot of fun.

PaulStoffregen said...

Programming isn't hard. It's the easiest job in the world. All you have to do is sit in a comfortable chair and press little buttons!

I'm mostly self taught...

Lawrence Bottorff said...

I'm of two minds. Yes, these mass learn-to-code initiatives are just the latest far-fetched attempts to "Vulcanize your population", i.e., turn your masses into Star Trek Vulcans, all of whom seemed to have PhDs in mathematics. On the other hand, I wasn't really meant to be a programmer, but I've done it. And I can say it's not easy, mainly due to the very poor documentation (a hangover from the mathematics world). Some "geniuses" don't seem to need good docs. They can read "reference dumps," man pages, study production code, etc. and just intuit what to do. But the masses can't win at that sort of high-wire, anaerobic leaning. Sure, there are some languages that might seem to have tons of documentation. (Who will forget those 1k-plus-page tomes?) But it's usually just chapter after chapter of examples shoveled out for cut-and-paste. Those books aren't really teaching programming. And of course what language to use? Looks like Python is winning in academia -- although that's a shame since the future is looking more and more functional. But I still think many more people can be taught programming. Maybe just not everyone like on Planet Vulcan. . . .

Edmond Woychowsky said...

Programming is not a function of how intelligent one is, rather it relates to how one looks at the world.

Javin said...

No doubt programming is tough and becoming a good programmer is a journey. Here are 10 things you can do to improve your programming skill and become a better programmer.

Anonymous said...

Wow; amazing what reaction people are having to the idea that not everyone can be great at something! I've been a professional software engineer (getting paid for my work) for 15+ years... and been coding for 10+ years before that, starting on my parent's Apple //c.

Yes, some people "get" programming naturally, and some do not.
The BEST programmers are those who get it naturally, AND put in hard work to improve themselves (this is true of any skilled profession)
There are also plenty of people who put in a lot of effort and can learn it.
And there are even more who will never be good at it, no matter how much they try, or try to learn.

I like the "hour of code" idea, because programming is something everyone should be encouraged to try, and find out if they have the interest/aptitude for it. As mentioned above, our profession is one of the few where you can easily teach yourself... That doesn't mean everyone will (or can) succeed.

Nor can everyone succeed at being a doctor, artist, musician, or any other skill-based profession. Some succeed no matter what; others can succeed with effort; others just don't have the aptitude.

We are not all equal (and that's a good thing)!

Anonymous said...

I took dancing lessons and learned I was a horrible dancer - on the other hand, when I watch dancers now, I truly appreciate the skill involved rather than just think it was just arms and feet flapping about, so an hour of code might also cause a lot more people to appreciate programmers and programming in the same way.

Stephen Warren said...

I take issue with the assertion that there's no clear path to become a professional software developer. The vast majority of programming jobs require a computer science degree (or similar subject). Just like pretty much any profession, the steps are: (1) take a degree course (2) [attempt to!] get a job.

While it's certainly true that there are avenues for self-taught people, that's more the exception than the rule. The existence of those avenues doesn't mean that there's not a clear default path.

Anonymous said...

gawd, it annoys me when people parrot the business cry "The Universities don't produce people we can use!"

Of course they don't, that's not their job. Their job is to teach you to be able to think, to learn, to critically approach a problem. People understood this in the past, when people actually stayed with a company long enough for it to be worth teaching them the specific things they needed to be useful in that industry, but since (for whichever of the many possible reasons) businesses now have no loyalty to their staff, and staff have no loyalty to their employers, the idea of bringing new graduates up to speed on company time seems to have been completely forgotten.

As to the substance of the article - I reckon it's pretty much spot-on. Programming, in the sense of getting a program to run, is easy enough; solving a difficult problem however, with some degree of if not elegance, at least competence, is not something that everyone can do, and those who can rarely manage it within a short period of learning to program. Given that these days all the big-name companies that cry to high heavens about skill shortages also go on and on and on about only accepting truly exceptional people, I'm wondering just who they think is going to employ all the people that they're encouraging to learn to code.

and on the 10000 hours of deliberate practice - all those people bringing it up, have you considered how long that will actually take? The average year of full employment is usually less than 2000hrs. Someone would need to practice programming, in a deliberate manner, for more than 5 years before they would be regarded as expert. And if they don't have the aptitude (and yes, I believe there is an aptitude for this craft - at the very least you need to have some degree of nimbleness of mind) then no matter how hard they try, they'll only ever get to journeyman status. Still, I guess that's enough to have a satisfying career, so to those willing to put in the 5+ years of hard yakka, good luck to them.

Simon Weijgers said...

I would imagine that countries where e.g. football is very popular produce more talented football players (aptitude). In that sense I believe that efforts such as year of code, short coding courses, and anything that gets more people to try out coding will ultimately filter out more people with coding aptitude than would have otherwise been the case, and therefore a good thing.

I played at my local football club when I was young, because football, as in the UK, is very popular in Holland. Football can be enjoyable even with my mostly non existent aptitude for it, and because me & large numbers of my Dutch contemporaries gave it a good go, a handful of very high aptitude players make it out the other end of the talent pipeline.

I believe the same holds for coding.

Anonymous said...

I think this misses the point about coding. The world is run by algorithms and hence without a basic
understanding of how to code you cannot fully participate in civil society. That is very different to being a
professional programmer. Medicine is very different - you do not need a basic understanding of anatomy
to be a informed citizen.

DaGoon said...

This article is the sober reality that I need to move on. I've felt the same way about learn sites that day you can have the skills that are in demand while you're really just one of the sheeple drinking the kool-aid of false belief.

Coding is a scientific art that many can't learn through sheer hard work, your either have a natural ability for low level complex thinking or not. I and many others fall in the latter.

Anonymous said...

I agree. But we simply can't know the future; currently, at least 90% of computer calculating power is just used to solve problems which wouldn't even exist in a world without computer!

In future we will probably live fine just without electronic devices, as there have been, more than thousand years ago, already analog "computers" (read: calculating machines) for several tasks, fulfilling perfectly the *real* requirements of daily human life (like the ancient device found for perfectly showing the stellar positions for navigation).

Electronics is simply too far away from concrete reality, and has gone abstract years ago; this process will probably kill itself shortly, because currently we are in a mere process to already serve computers more than they serve us! It's really crazy, if you think about it.

thequickbrownfox said...

Research seems to increasingly suggest that almost anyone can learn almost anything as long as they are not held back by their own self-limiting beliefs. So if this article suggests that some people can never learn to become good professional programmers, then I disagree with that. But I concede that it will take some people much longer than others, and this may be related to some innate aptitude.

Another important factor is interest and enthusiasm, and actually a lot of what you group under aptitude may consist of these. It feels like the most successful programmers generally love to program and to think/read/write about it. The effect of this is that they expend far more time and effort on their craft than someone who only thinks about or practices coding during formal training and paid work.

Over time these interested and enthusiastic people are obviously going to have a huge advantage that came from hard work, but it didn't really feel like hard work because they were having fun at the same time.

This suggests that the way to increase the level of skilled workers available to the industry is to get more people interested in and enthusiastic about programming. To some degree this can come simply from exposure, so getting everyone to try out programming is probably a great thing, but it has to be enough time for them to get into it enough to really solve a problem, since that's where the enjoyment kicks in. An hour might not be enough. A year of weekly lessons at school should probably be enough. I didn't realise I loved programming until the age of around 27. Perhaps more early exposure would've helped. Actually in my case, I didn't enjoy imperative/OO programming nearly as much as functional, so early exposure to FP may have been what I really needed.

I do agree with the idea that we shouldn't encourage people to become professional developers because it's easy. That would be a big lie. I don't think it's easy for anyone. But as I said, when you're having fun then you don't notice the hours of hard work.

Wladston Viana said...

I completely agree with you, and I think a way to improve the current state would be to develop more high-quality material to help more people learn about the hard parts of software development. That's why I'm writing a book that is called "Coding is Awesome" (not coding is easy). It tries to cover the important parts from CS education, and also things CS students do not learn while in college.

Anonymous said...

I'm not sure I agree with George here above (that coding is like drawing or composing music), although I sympathise with the thrust of the idea. The fact is that you can write software that looks good and gets the job done with really horrible code. The user might not perceive any difference, but other coders reading the code will. Not so with drawing or music.

bitcuration said...

No worries. The near term AI/DL development has paved the way to create a programmer being who has the aptitude to at least suffice the enterprise side of programming needs, which are bloatware anyway.

The current obstacles on this path include analogical reasoning (what we call creativity), natural language processing (to understand human software requirement), etc. This will not be your grandma's rule based decision tree, a whole new endeavor.

Neil Mayhew said...

Over the years, I've given several very smart and motivated people the chance to join my programming team and learn on the job, but very few of those have worked out well.

I believe there is an aptitude needed for programming, and especially for becoming an expert who creates architecture and mentors others. You have to be able to think in abstractions, and have a strong eye for detail. Many people have one or the other, but rarely both together.

Many professions can be mastered without such specific characteristics, and general intelligence and a good memory are mostly sufficient (along with a great deal of hard work). On the other hand, there are professions such as sports and music where a certain amount of innate ability is essential.

I think programming falls somewhere between the extremes. You need a basic level of aptitude and you can also improve a lot with hard work. However, a person's willingness to put in the necessary hours depends a lot on how much they enjoy the type of work. I've seen many programmers who put in the required hours at the office and never think about programming outside that time. It's not a passion for them, and they don't have the intellectual curiosity needed to take them to the next level of skill. It's not about working slavishly long hours, more what you think about in idle moments, and what you choose to read when you have some time for it.

So what about the Learn to Code movement? I think it's still very worthwhile, for two reasons. First, I believe that the kind of thinking required for programming needs to be fostered at a very young age and reinforced throughout a school career. In my case, this happened because I loved mathematics, but many children who could develop an aptitude for programming aren't stimulated by mathematics. They need to explore that mental capacity through activities that do interest them, such as making games and animations. Our educational systems have not provided training in this kind of thinking and so children develop other kinds of thinking skills and ultimately end up in other professions.

Second, I think that there are many people of all ages and at all levels of society who have the potential to be good at programming who just don't know it yet. Encouraging them to give coding a try might help them to discover that and open up a new career opportunity. Many who try it will decide it's not for them, but a minority will be drawn to programming who otherwise wouldn't have thought of it. I don't suppose many will think they're ready to go out and get a job as a professional programmer — they're more likely to be overwhelmed by just how much they still don't know — but it will have sparked a passion for programming and a desire to pursue it professionally.

"Luck is a matter of preparation meeting opportunity" (Seneca). The best programmers combine aptitude, education and hard work. I've met many many CS graduates who don't have the aptitude or the passion to do well as a programmer, and I think these should have been weeded out early in their degree programme and encouraged to switch to a different major. I've also met entirely self-taught programmers who would have benefitted greatly from a good CS education in data structures and algorithms, but who now have too much ad-hoc experience to want to go back and learn all that. I've also met people who have the aptitude and the education but who don't want to put in the hard work to continue the learning process after they graduate.

Coding is "harder than you think", and it definitely takes aptitude, but there are people out there with great potential who haven't been drawn into the profession. I hope the Learn to Code movement is about to change all that, for all age groups and backgrounds.

Fernando Cordeiro said...

You fail to acknowledge the possibility that self-teaching can be acquired as a skill.

Ask any musician, illustrator, writer or whatever, they will tell you there is no such thing as talent. They have been through hell and they persevered. That's the way to mastery in any area: it's gonna be a shitstorm and you have to overcome it. Most people just give up.

Nos the question goes around to how to help people persevere when learning to code.

John Eldredge said...

Good point. I have been working as a programmer/analyst for nearly 30 years, starting out with an Associate (two-year) degree in programming, a type of training this survey didn't include. I learned the initial skills in college, but much of the skill of analyzing a problem, breaking it down into steps, and implementing those steps, came later, with practice. I have seen a lot of programmers who lack the ability to analyze and generalize, rather than using cookie-cutter techniques.

Anonymous said...

35ish years ago I had a professor who said:

"I used to think that you could teach anyone to program, but there are some people who just can't think algorithmically." - Robert L. Snyder Ph.D.

Bob was actually an X-Ray Cryptographer rather than a Computer Scientist, and computers where tools for him to automate equipment and analyze data but he was still one of the best practical programming teachers I ever met.

Having done a lot of teaching and tutoring myself over the years since then, I've seen that it can make a big difference. Like anything else, there's a lot of middle between the ones who will pick things up more or less on their own, and the ones who will never get it. Even with the self teaching students, good instruction can make the difference between a wild west hacker who produces piles of unmaintainable spaghetti code, and ones who produce beautifully engineered solutions.

As a CS tutor I encountered many cases where pupils were failing simply because no one had ever shown them how to work through a problem, how to think about it, how to approach it, how to see the parts and break it down into manageable chunks, and how to make the pieces work together. It's rather like the difference between written directions for cutting up a chicken and actually having someone show you how to do it.

Good teaching really does matter, and is worth doing.

Anonymous said...

Your website doesn't display correctly in portrait on android. By your logic, it never will.

mike3 said...

"and also work on encouraging talented young people to consider it as a viable alternative to some of the other top professions."

However, this seems to contain an assumption that talent is 1-dimensional. What if those people are going into the other professions because they are talented at them but not at programming?

Nicholas Otee said...
This comment has been removed by the author.
Nicholas Otee said...

Yes I do agree that programming is not an easy task but it can be learned even with the persons with “low aptitude” as long as the approach is refined for these individuals (all individuals) The brain is remarkable with great potential of which programming is just a small fraction, we just need to realise this potential differently in different people.

Computer Science is a relatively a new discipline compared to others thus we are still in the trial and error stage of finding what teaching approach works just like other disciplines had to do in the past. The path of becoming a software developer isn’t rigid yet and therefore we still have to self teach ourselves in order to succeed. Medicine is hard but a medical student’s path is simplified into steps that are manageable and tested to be able to produce doctors. Med students also begin with prior knowledge of Biology and Chemistry thus having the fundamentals down.

The sad reality is that a lot of CS students begin with no prior CS knowledge and you start learning a programming language without knowing what’s happening behind the scenes. Some students are aware and thus try to bridge this gap, others trust the specialised course materials hoping things will click and end up finishing CS with no programming skills. The problem here is lack of FUNDAMENTALS. I can’t imagine learning chemical reactions without knowledge of the periodic table or the properties of elements. To use another analogy: It’s like learning the english language but rather than beginning with the alphabets, punctuation marks e.t.c. You begin with sentences and paragraphs and expected to write a very good essay at the end of your studies ( a little far fetched but you get me).

Your post is spot-on on a lot of issues but I still think it is harmful to people who just begun their CS journey. Yes it is true, the way is not smooth yet and a lot of self learning need to be done. It is our job to find better ways in order make this remarkable field attractive and interesting to the supposedly low aptitude individuals. I myself have realised ways to better my understanding of Computer Science. One way is by going back to get an overview of the fundamentals and removing each layer of abstraction from logic gates to the high level programming languages and another is to ‘learn to learn’ and realize that we learn differently depending on our ‘aptitudes’ and therefore if we properly tailor our learning anything can be digested by the brain.

Zach said...

I decided to tweet this out and got a very similar response https://twitter.com/ReactJSNews/status/673560433190662145

Craig said...

I think it's true that anyone can learn to program. Unfortunately programming is only part of the package. Being able to write a "for" loop isn't the same thing as knowing when to use a "for" loop. Programming is easy, engineering is hard.

Steve Gilham said...

So many points brought up so far...

>“oh no, what a waste. Why would you want to do that?”
The status of software engineering as a profession seems to have been subject to fashion, certainly in the UK -- there was a gap following the era of the kids who learned on a BBC micro in their bedrooms and went on to make fortunes where most of the junior candidates I interviewed were foreign nationals of a most cosmopolitan variety. It does seem to have picked up again in recent years.

> CS degree
Seriously, would you hire a physics graduate to build a bridge for you? The relationship between computer science and software engineering is about that between physics and civil engineering. Yes, the civil engineer needs to know some physics, but there's a lot more focus on what parts of physics are relevant -- and a lot of practical, even rule-of-thumb material that dives into application rather than theory that doesn't fall into a physics syllabus.

In the software world, I'd be far happier with newly minted graduates who know about writing automated tests (and do it as second nature) and how numbers are represented (binary arithmetic used to be 'O' level material, but few junior engineers seem to be fluent these days) than can do things with the lambda calculus.

>(Not) everybody can learn to program
Where we are today, there are plenty of people in the industry who can program, but not so many who can program well -- or even with an eye to "I'm going to have to maintain this shit once it goes out the door" -- and that's even in an environment where I know there has been pretty ruthless selection. Much of the necessary skill is just a matter of acquiring good judgement, which comes with experience (and experience itself is born out of bad judgement), rather than the instant coder fad of the day.

Mike Hook said...

Its interesting to look at how more traditional professions such Medicine or Law have tackled these issues. While the rate of change may be somewhat slower in these fields they both have significant 'on the job' training aspects. Similar to computer science, law and medicine graduates are not ready to step into real world jobs and need years extra training. Also they have compulsory continual training throughout their careers. I think we could learn a lot from other knowledge worker industries if we looked beyond our keyboards and monitors once in a while.

Sverrir Sigmundarson said...

I think the confusion here is the same that lies at the heart of the the movie Ratatouille (http://www.imdb.com/title/tt0382932/).

"I have made no secret of my disdain for Chef Gusteau's famous motto: 'Anyone can cook.' But I realize, only now do I truly understand what he meant. Not everyone can become a great artist, but a great artist can come from anywhere."
-- Anton Ego

Chris Marisic said...

The immense value in teaching people to "code" even if they aren't planning to be what is currently a software developer is the future. In our lifetime, if not this decade, the workforce en masse will transition to all being "programmers". Software systems will continue to evolve to allow massive control by business users themselves. Computer algorithms and AI analysis will start to replace one of the most core actions of a developer mapping/ reshaping data to align across boundaries. The cloud also provides the capacity to reduce the need for efficient code at the application level because what does it matter if individual request time slightly increases but you can process "infinite" requests concurrently?

TLDR; what we do as software developers is in the sunset era, soon everyone will be a programmer.

Siderite said...

Great article: full of ideas, but also concise and to the point. And I agree with almost everything you said.

The difference for someone who goes to a technical university (and not that liberal arts "you wanna have fries with that" crap you went to :D ) is that students around you are all geeks and you don't get to feel the stigma until you actually want to have physical contact with a real human that is not part of that caste. Like a female human. One of those. Or if you want to get a job later on and you need to convince an HR person (also one of those, usually) that you are good for their company.

But probably the problem stems from the things a university focuses on compared to what a company focuses on. You are NOT trained for what is being asked at job interviews. And if you get hired out of university, that is probably because you are young and cheap and was capable of finishing a technical degree without giving up. That is all that the school system tests for anyway.

Alan said...

Glen said: "People hiring / interviewing are often programmers", and as a Senior Software Engineering, staring another job and finishing a round of interviewing I'd like to say mention that interviewing is not a skill most programmers have.

I was only asked to write code in one interview (which was for one of "the big 4", and they got me to write code for 4 hours!), most of the interviews were more like Computer Science degree second year exams, eccept with "multiple choce"-level questions instead of being asked essays.

At first I started to get pissed off at them ("I've got 20 years experience! If I don't know the answer to any of these questions I'll find out"), but then I realised - they've never had any training in how to assess programmers, except University exams.

Still - the vast majority of offers were easily dismissed with "well, I don't want to work with the guys you're hiring".

malleus bardorum said...

I'm not going to write a long rant, so I'll try and be concise.

I agree of much of what was said. "Coding" is the latest buzzword picked up upon by people who don't understand what ti involves. It is evangelised by those who do (and i'm talking about righteous people like Ebon Upton here), but listened to by people from Dilbert's PHB school: if I don't understand something it must be easy.

Programming is NOT easy. Anyone can learn it given enough time, practice and patience, but that doesn't mean everyone will be good at it. Just look at driving skills to see that in action.

Programming is science, art and craft all in one. It needs creative spark to solve problems, rigour to apply them in the right ways, and practice to hone. Not everyone has the will or the time to master it.

Many people who have been through CS programmes are self-taught. This is mostly because if they came into CS they are likely to have done some programming already. The quality or level of understanding that prior learning holds is hugely dependent on a whole variety of variables. For instance, I have taught people web development using HTML/PHP/PgSQL, and they have claimed to know how to do this already. But their understanding techniques like normalisation and abstraction are incomplete. They can write stuff that sort of "works", but its a bit ramshackle.

I think of it a bit like the difference between an artisan and a bricoleur. In the former case, you select the right tools and techniques to build something right, designed for the job. In the latter case you manage to kludge something from what you have around you and hope it does something like what you need. They are quite different things.

Not everyone CAN be a programmer (I dislike "coder", as it feels too mechanical, and seems to me to forget the thinking bit of the process, which is, in many ways, the most important), but I don't dislike the idea of everyone being given the chance to see if they could. That's kind of what bothers me about the current thinking in the UK schools' IT curriculum. It doesn't feel to me to be the kind of "suck it and see" approach that might help kids, more a coercion, which will probably do more to alienate them for getting involved.

Chris Estes said...

It's like checkers, man. Learn in 10 minutes, spend a lifetime mastering. It isn't just a language, it's structure, solving problems, combining languages to work together (PHP, Javascript, HTML, CSS) using frameworks or not, just like anything else.

Damo said...

"Lies, dam lies and statistics".
The referenced stackoverflow survey is a little misleading in that as you point out 41.8% are self taught, but also the combined stats of Bachelors+Masters+PhD ~ 57%. Also to further confuse i quote said survey: "There are many ways to learn how to code. 48% of respondents never received a degree in computer science". This does imply 52% did have a degree, therefor according to this international survey the majority of 'programmers' got to their current positions having sat through a degree.
Don't get me wrong though I agree with a lot of what you say, but do be careful of the stats\articles you quote and the weight you attribute to them. I have a masters of CS but also regard the vast amount of my knowledge as self taught.

Anonymous said...

I’ve thought a lot about this because I've interviewed a lot of CS students and at most 50% of the people coming out of computer science programs even at elite universities understand how to develop software. I’ve come to the conclusion that, fundamentally, you have to love it. just doing your schoolwork will not make you a competent developer.

Aaron Ray said...

This type of post is the type of stuff that is just ignorant. So... the BEST programmers in the WORLD are just sitting around kidding themselves. Code.org was started by Hadi Partovi. I suppose re-building Internet Explorer and the X Box operating systems don't qualify him to decide what makes a great prrammer? Or Bill Gates, Max Levchin, Drew Houton, the CEOs of Twitter/Square, Facebook, PayPal, YouYube and academics like the Head of Stanford's PhD CS program? Collectively about 20 people involved with CODE.org represent almost 1/2 of the world's publicly traded wealth. Apple doesn't change their homepage to hold the code.org sessions in every store in the world for PR. Star Wars and Disney have enough buzz as well. It seems you would want to use them to support your premise and offer a SOLUTION.

A simple minute to look at the site and their initiatives would do a much better job describing the realities of your premise. The initiative is to get TEACHERS and CHILDREN to learn basic coding techniques. In other words- 20 years before you state them as ineffective. Additionally, there is no "hand wringing" about a shortage. It is about creating opportunity for minorities that will never have access to college most likely. They are already at a disadvantage to gain any skills to lift them out of poverty.

Coding for someone today is "hard"? Compared to what? Being a Quarterback in the NFL? Digging ditches? Raising children? Being a Dentist? What part of adult life is "easy"? History and English degrees are not easy, but they are attractive to people. They get you where? It is about integrating coding into the STEM required public school system, not designing a new OX for Oracle. I cannot verify a single part of your opening premise, based off of some individual's guesstimation. Google's Head of Education seems more reliable, as they run the Center for Disease Control and much of the world's big data collection for the World Bank and UN. Not close to agreeing with each other. What is your point- to quit? And then what?

Reid Hoffman seems to have access to the marketplace as CO-Founder of Linkedin. All of them put their resources into Code.org. I can't understand your point as a logical person, though. The stats you quote show "self taught" as the way to go. That IS the message of Code.org. Don't think ANY college or degree will be around in 20 years. Get in early and get support. I can't speak for the UK, but since the West Coast of CA, USA seems to be leading the world into the future, I wouldn't be so quick to challenge the "scam" they must be committing. Although it is free and offers resources, it doesn't say things are "easy". I think the idea to make it "fun" isn't so insane. You are entitled to your opinion, but representing yourself as a coder seems like you are on the wrong side of history.

Anonymous said...

The company I work for volunteers time to go into grammar schools to facilitate the hour of code. For many kids this is their first taste of how to develop something by writing code. Many schools don't have the funds or overhead to teach full-on courses, especially schools in lower income areas. It's a good thing and has the potential to open doors.

Anonymous said...

I think the article goes more in the sense that "not everyone CAN be hi level profesional programmer". Which is fine, but the fact that im not a profesional artist doesnt mean that i cannot or should not attempt to draw or paint, and even enjoy It.

Michael Wales said...

I think this post ignores the fact that most college Computer Science programs do not prepare you to do a job. Technology moves fast, regulated education moves slow. A college CS course teachers you theoretical concepts you may or may not apply in the first X years of your career. Most companies don't care if you can explain algorithm BLAH - they need a form on a page that inserts a record in a database, based on whatever the new hot stack of the year is.

Colleges can't keep up with that.

Anonymous said...

I am a self taught programmer, but I have a standard college education and no degree which shows that I can code. And that is my barrier when applying for jobs. Look at job adverts and what they would like the person to have and I am no where near, I dont get an interview but I do have the skills, but not the bits of paper employers like to see.

The otherside of the coin, I cant afford to start as a junior. I have a life, family and bills and most roles for a person starting in the business are less than half of what I earn. I would have to move back in with my parents to survive on the money offered.

I know the path I need to take, but £15K minimum for a degree and the additional study time on top of a full time job, family just isnt an option I and many others would have.

The comments in the article about self taught, free options etc. is all well and good, but you have to be able to get through the employers door and someone with a CS degree that has no programming ability will always get an interview over a person with no degree, because employers have a blinkered view that a degree etc. means a better employee.

Ty Maxey said...

I agree. As someone who's just starting out I understand that I may not be able to reach a professional level, either because I lack the altitude or simply don't enjoy it enough to do it everyday for a paycheck. I'm approaching it like I would any new skill--as something life-enhancing. After only a few months of study, the world looks new and different. And that's reward enough.

Ty Maxey said...

I agree. As someone who's just starting out I understand that I may not be able to reach a professional level, either because I lack the altitude or simply don't enjoy it enough to do it everyday for a paycheck. I'm approaching it like I would any new skill--as something life-enhancing. After only a few months of study, the world looks new and different. And that's reward enough.

Archetype said...

Personally for me it mostly comes down to personality.

I'm very sure there are a variety of lucrative careers I could have followed. I just couldn't do something that requires me to do work that is very repetitive. That would kill me. While developing just about any solution or part of a solution you generally have to solve some problem or other (why it's called a solution doh). The components and libraries you use will only rarely have the exact functionality dictated by the requirement. And it can get stressful, but generally finding solutions is interesting, gratifying and rewarding.

So that's the allure.

Aptitude?..


quality

|
|
|
delivery -----------+-----------
|
|
|

.. I think the proof is in the pudding. How you meet your deadlines. There are hugely talented developers out there who do nothing but tinker around all day. Kudus to them if they can afford to do that of course. But if you need to still make your money then you have to decide where on that graph you want/can be.


Anechidna said...

There are many flavours of programming all requiring slightly different variations in capability. Being able to think in the abstract and visualize the whole as one builds the necessary assembly of code, whether objects or created entities is a key requirement, syntax etc is important.

I read one post where the comment was that we teach people to read and write but not all go on to be novelists indicates a yawning chasm between literacy and end use of that knowledge. Programming is the same. The big call for programming skills is actually in the legacy systems which will hang around for another 50 years and that requires real skill and ability.

Albert3801 said...

One thing that jumped at me from this article is that the author mentions "high aptitude" individuals having a choice to learn surgery, law, architecture, mathematician or software development, and implies they could be equally successful at any of these careers. I disagree. Different people have aptitudes in different areas, and an aptitude for programming is very different to an aptitude for surgery. Surgery requires manual dexterity. Coding does not. Surgery is not a precise science in that do the same procedure in two different patients with the same ailment, one dies, one does not. But write the exact bit of code and it will work the same on on two similar computers.

Given an aptitude to learning to code the remaining barrier is mainly time. Learning to code and develop some worthwhile projects takes time. A lot of it. Someone who has to work full time and maybe take care of a family has no time to devote to leaning to code well, regardless of aptitude and regardless of training opportunities. We are a time-poor society and unless the skills are gained while still living at home with parents and while being at school (lots of free time) then no amount of aptitude is going to get anyone coding.

Greg said...

I don't know about programming,* but journalists really should learn critical thinking** and some basic economics.

Here's how to tell there's a shortage of workers in some occupation:

- wages are high and rising;
- many workers in that occupation are job-hopping frequently, and sign-on bonuses are common;
- employers are offering, at their own expense, to hire people with no experience but perhaps some aptitude and put them through real training courses.

Do all three of those apply to programming? Do any of them?

* Used to be a developer for twenty-odd years, got sick of seeing the same mistakes being made over and over by know-nothing, want-to-learn-nothing management. We have regressed a lot since the 1980s.

** A naive person (me) might think that critical thinking was a core skill for journalists. Obviously not.

jdb said...
This comment has been removed by the author.
Jeroen De Dauw said...

Thanks for the great post. I had not really thought about this much, and this certainly changed how I look at the mentioned "programming for the commons" initiatives.

I wrote some of my thoughts on the topic down at http://www.bn2vs.com/blog/2015/12/10/only-smart-people-can-learn-to-code/

jdb said...

"Take Object Oriented programming for example. In the 2000’s, it seemed to be establishing itself as the default technique for enterprise programming, but now many people, including myself, see it as a twenty year diversion and largely a mistake."

Wait what? Who are these many others? Do you have another article justifying this viewpoint somewhere or can you justify it here? I'm honestly curious, not spoiling for a fight.

Anonymous said...

I'm a self-taught programmer - not a great one, but a hobbyist. I went from zero to writing simple computer games (unfinished but with several highly varied conceptually different aspects fully implemented) in a few weeks. I wrote code representing strategic hex grids, square-grid inventories containing rotating items in arbitrary shapes, line-of-sight, and (poor) procedural generation of landscapes and dungeons, among other things.

I have done a lot of natural language study, and I think there is a similar principle in play in both disciplines: benefits of studying at the outset come fast, but returns diminish quickly. With natural languages, learning basic syntax and tenses and your first hundred vocabulary words will yield far greater rewards than any similarly-sized cluster that you learn afterward. In programming, you might say the same for if statements, for loops, function definitions, object definitions (for OO languages), basics of debugging, etc.

Is there more to learn after the first few exciting weeks? Yes, but can you program after learning for a week? Also yes, and the little bit that you learn will be used in nearly every day of your life in which you do programming.

Can you learn to play the piano in a week? You could be reading music and hitting the corresponding keys, sure! Would you be a master? Lord, no! Would you be greatly encouraged by having broken past your anxiety that learning the piano is difficult? I would think so.

By the way, your profession is not the only one that sometimes gives free lessons on entering the profession. Surely you can brainstorm a little better than that.

I don't think aptitude is the barrier to programming so much as curiosity and desire to get better at it. So people scrape by doing a crappy job. Guess what: that's true of every profession. I don't think I've ever known anyone who worked hard at any pursuit and just couldn't get decent at it - just legions of people who idly thought, "that'd be cool to learn," and then gave up at the first sign that it was going to be mentally demanding or time-consuming.

Tim said...

There's another angle to the whole university/self-taught thing. I've always been a geek; knew C before I started Uni. The younger me didn't particularly want to be a "mere" programmer when other roles (systems analyst) sounded more sexy. They threw ML at me and I barfed, loudly. Did Not Compute.

20 years later, well into an IT career, I find myself happy to be hacking on SQL/PL and XSLT all day and ideologically I prefer some aspects of FP to OO by *miles*.

I think it's simply that I've matured and gained experience. I've grown into my keyboard, so to speak.

Courses can only give you the tools. Careers are ongoing practical experience and require deep familiarity with several tools (notably git-blame). I'm deeply skeptical that any 1-{day,month,year} course can realistically equip someone with enough tools, OR awaken an innate ability, to the same extent.

PhotoWalkthrough said...

Great article even though there is much of it I disagree with. You make a very strong case for saying that to be a good, useful programmer you have to have the aptitude. But I would argue that much of that comes from having a strong *interest*. Sure you have to have a good brain but more than that you have to be interested enough to self-teach. That's another point that comes out strongly from your post. So the question is, how do we encourage people who wouldn't naturally think of programming as fun to try it and discover that they enjoy it? I think the code.org and Code Club initiatives are very much the right approach to that. They expose coding to kids that would otherwise never have a clue what programming is. Some of those kids will enjoy it and some of those will go on to self teach and become great, useful coders. So by that mechanism we WILL increase the quantity of useful coders in the job market. And the others that try and and don't end up going into programming as a profession might still learn some useful mental algorithmic processes. They might even develop a little extra respect for the true coders.

Your second point about social status is being dealt with, I think, by the likes of Google and also by the proliferation of independently written successful apps. The app stores are providing a huge market of opportunity for talented coders and there are many getting rich doing it. That makes them rock stars. And Google and Silicon Valley does the same by putting their engineers on pedestals and promoting them as superstars.

I do *not* think that the BCS has anything at all to offer in this regard. I've worked in IT my whole life and recruited programmers and the one thing I would never put any store in was a professional qualification. I look for a person that enjoys what they do. Someone that will self teach. And someone that does it for fun in their free time.

Mike Hadlow said...

Hi Jdb. I've written about equivalent functional and OO code here: http://mikehadlow.blogspot.dk/2015/08/c-program-entirely-with-static-methods.html

Anonymous said...

I agree with the basic premise of this, namely that you most likely cannot learn to program on these "learn to code" sites with no prior background in programming. First of all you need a Logical, Analytical mind to do a good job of programming. Second (at least some of ) these sites rely on people who ask "I know how to do 'xyz' in FORTRAN, How do I do it in C?" In other words, just learning the commands and syntax of a new language.

Yes, choice of languages dates me. I learned to program in machine language, assembler, BASIC, FORTRAN, PL/1 all on an IBM Sys 360 Mainframe, also had time on a mini (PDP), and of course micros (PCs). My actual Degree is Chemical Engineering.

I have met people with the proper mind-set who have been self taught, but the successful self taught ones I can count on my fingers.

Anonymous said...

I disagree with the statement that coder = programmer = software developer. I am a front-end web developer and have many friends who are software devs and engineers. They have (very continuously) reminded me that coding is not the same as programming. XML and HTML for example ARE quite easy to learn. Java, not so much. Claiming that all coding and programming languages are equally difficult to learn is untrue. Most of these hour/day workshops are teaching HTML, not object oriented programming languages.

I'm a volunteer instructor with an not-for-profit organization that teaches adult students (ranging from 18 to 60+) HTML & CSS in 6 hour workshops. Some get very frustrated and will never pursue it any further. Some get that spark of interest and end up developing long-term relationships with the organization to build upon their skills, years after their first workshop. That interest to dedicate themselves to the world of self-learning, as any successful developer does, begins with that first sense of pride when one sees what they can build on their own. For some (like myself), that happens very early in life. For others it happens in their 30s.

I don't think anyone has a 'natural aptitude' for programming, or any other skill for that matter. This implies that some people are born with some abilities or would be innately inclined to develop certain skills, when these are really skills that develop from environmental factors, adult influences, fellow peers, and personal interests at early stages in life. If students were introduced to algebra earlier on for example, they would be able to develop the abstract-type thinking that will benefit them in the future if they choose to continue to study computer science.

Richard Eng said...

I like the reader comment that...

Stating that "anyone can learn to program" is like saying that anyone can draw or compose music. While you may be able to learn "how to draw" by taking classes and/or training, at the end of the day, if you don't have the aptitude and skill to draw you're simply never going to be good at it. Knowing "how"... doesn't mean that you "can".
-----

Then some imbecile replied...

Just take a look at the trending "anyonecanimproveatdrawing" on twitter or Facebook. Visual art is rudimentary mechanical skill + memorization and internalization of information about rules such as perspective/lighting & rendering + building of visual library. It can easily be learned by absolutely anyone. However, like coding, those who show aptitude at 20 started their journey at 5 or 6 - in art, by drawing with crayons and observing the world around them with interest and an analytical eye;
-----

That's absurd. The imbecile implies that ANYONE can learn to be a good artist. No, anybody can learn to draw–he may not draw very well, his artwork may suck dick, but at least he can draw.

What about carpentry or plumbing? Are all carpenters and plumbers good at their job? I guess we don't need references when we hire tradespeople; they're all interchangeable.

APTITUDE. Learn that word. It's very important. Not everyone has the aptitude to do EVERYTHING. Each of us is good at something, but none of us is good at everything, regardless of how much training we get.

Being a software developer is rather like being a mathematician. You need some basic aptitude and inclination. How many people do you know who sucked at math and science in school? Could they ever be programmers?

Being a software developer is about applying logic to solve problems. Not everyone is, or can be, good at that. This is not about learning JavaScript syntax. It's not about completing some relatively simple tutorial exercises. It's about technical problem-solving. You need to have the aptitude and inclination to do this. Wishful thinking won't cut it.

Having said that, I support the many initiatives on the web to help people learn to code. At least, they will draw in the people with an aptitude for technical problem-solving who would otherwise not enter the field and continue doing what they were doing before (e.g., restaurant server, car salesman, unemployed fine arts student, etc.). The job marketplace will filter out those who aren't any good at it.

Anonymous said...

This hits the nail on the head!

Jayanthdn said...

Very correct not everybody can become good programmers , but good programmers can from anywhere. finally you cant learn programming by taking short cuts!

Mario T. Lanza said...

Perhaps this drive for the masses to learn to code was initiated by big business as a means reconciling supply with demand to drive down costs?

Owen said...

I was a music major in college, and am a professional software engineer. I took a couple of CS courses in college and they did in fact prepare me for an entry-level programming job, which I parlayed into a career. So there's one anecdatum against you.

However, computer science in my university at my time was a theoretical discipline closely related to mathematics, and focused on research and analysis, not necessarily practical skills. This is not necessarily a bad thing, unless you have a strong opinion that college is purely for supplying a workforce (an opinion BTW that I do not share). I believe this theoretical focus of computer science also applies at many other universities. So it's not fair to assume that someone who is trained in theoretical computer science at a university will necessarily be good in programming practice, or vice versa. They are different disciplines with some overlapping skills. Again, this is not necessarily a bad thing, and I think it's not necessarily because programming is so much more difficult.

Here's where I stand, based on my experience and the experience of those I've interviewed and mentored:
- You do not need to have a brilliant aptitude for programming to be a successful software engineer in the industry.
- Programming is not the only skill you need to have to be a successful software engineer.
- Programming skills are worth more than just getting you a career in software engineering. You can use them as a side skill to automate tasks in other disciplines like science and management. Programming also can teach you how to be precise in the way you solve and troubleshoot problems, it can teach you how to manage complex systems through decomposition and abstraction, and it can give you confidence that you are really in control of a computer system, rather than being purely at the mercy of software that other people write for you.
- Ultimately, rather than fret over who can do what before they even try, I believe that we should simply expose as many people as are interested in programming, and let motivation and encouragement drive the rest. My work with TEALS and Udacity derives from this.

Anonymous said...

I disagree with Anonymous. While no analogy is absolute, this one between the art of programming and art of drawing was a pretty good one. You can certainly learn the mechanics of drawing, but you won't be able to produce real art if you don't have talent. One can learn all the commands of a particular programming language, but without the right aptitude they won't be able to produce elegant, smart, efficient, bug-free code. It would be a waste to ask someone like that to write the code - it would cause more damage and it would be more expensive for someone else to correct the program after them rather that develop it from scratch.

Denis Shestakov said...

I think I've made a good point that it is rather disrespectful towards the whole profession of software engineering to claim that several months-long codecamp could convert to a SE/IT professional (junior one but still).
Regarding the formal qualification requirements for a IT/SE professional. Well, coming up with this sort of requirements is not that hard, imo: to pass a bar a se person should know fundamentals (data structures, algorithms, networking, computer architectures, programming languages design?, se development aspects/practices, etc.) and more specific areas (that would vary on depending on a chosen specialization, be it like web, multimedia, embedded, databases, gaming, etc.). There should be two parts in such qualification: theoretical and practical (which might involve a fully-fledged (and easily reproducible and runnable) se project done fully by an entrant).

DS said...

In my prev. comment it should be _you_: "I think I've made a ..." --> "I think you've made a ..." :)

Anonymous said...

This article ignores the fact that people can grow to be more critical, analytical, and strategic, building an aptitude for higher level thinking. It certainly isn't an easy process, but with focus and hard work, it is something that any person without serious mental issues can overcome. I was a C and D student growing up. I went into art school not only because I enjoyed illustration more than most school studies, but because I didn't have confidence I could do anything else. When I graduated, I couldn't find employment anywhere but temporary agencies. Over two years of not being able to find a good job, and literally being stuck in my parents basement, I taught myself programming. Another year and a half later, I'm working as an iOS developer. And it's because I spent a couple years working hard and building the necessary skills to be a developer. I don't believe I have some nature given aptitude for programming. It was very much due to hard work, over coming lots of struggle, and finding other developers to lean on for learning. With focus and determination, any non-handicap person can become a programmer. The question is how willing are they to make it happen? The journey to becoming a programmer isn't easy, but it's not much harder than learning any other skill either.

Anonymous said...

"I didn't find anything for 'How to do I become a software developer.'", said Siri.

Jon Archer said...

I used to be a software developer about 14 years ago in the UK (near Brighton in fact) and had the opportunity to relocate to Boulder, CO, USA. I would never move back to the UK as an employee. The recognition, job opportunities, social status and indeed pay I received here for this far, far outstrips what almost anyone in the UK is prepared to offer.

DMcCunney said...

I'm all in favor of people learning to code. It's always useful to stretch yourself and learn new skills and new ways of thinking.

I am utterly opposed to the notion that if you just learn to code, you can get a high paying job. You won't. There simply aren't enough programming jobs to accommodate everyone who might learn to code. The bar to entry is high. You must be able to write code in a currently used language. You must have knowledge of the problem domain the code is intended to address. You must be very good indeed at coding.

Like anything else, programming jobs are supply and demand. If there is high demand and low supply, the programmer can get a high rate of pay. As supply increases, there is more competition for jobs, and employers can offer less. If another candidate is as good as you are and willing to charge half of what you want, guess who gets the job?

The fundamental question isn't "Should people learn to code?" It's "Can they get a well paying job once they have?" The answer to that questions is "Probably not", and those pushing learning to code as a way to get employed are either sadly deluded about the prospects or lying. The more people who learn to code, the less will actually get paid to do it.

There is no magic panacea for unemployment, and many folks simply won't get jobs, even if they do learn to code. There just won't be enough jobs to go around.

Anonymous said...

There are very different levels of software development, programming, whatever you want to call it. In fact there are tens of thousands of people graduating from programming bootcamps now that do get jobs as developers right after those courses. And no - those are not only low paid front end jobs with clueless startups. Maybe these programs draw in people who had this magical and mysterious 'aptitude' to become a programmer all along - I don't know. Fact is - these people exist and they are many and they apply themselves in the job market successfully all the time and often that is only after a three months course! Interestingly enough those individuals usually come from all sorts of backgrounds and include a much higher percentage of females than you would usually find in the IT sector.

So what are those people? Are they lacking the aptitude or do they just get lucky? Company's certainly don't seem to think so. So what is your proposal to make access to becoming a programmer harder supposed do? Who is supposed to benefit from this? Elitist's ego's? Tech company's and diversity won't benefit that's for sure. Not even code quality. I really don't understand the purpose of this article.

Alex Rondon said...

I disagree because if someone learns the basic steps of something and continue to learn more about it, they can become better at it. Anyone can be able to learn because everyone has the ability to gain aptitude.

Alex Rondon said...

If someone wants to become a programmer they can be. They don't have to choose something in the medical field just because it helps us pay less for health care. There are people who want to become doctors so don't worry about it. Anyways, the author didn't make it seem like a blue collar work, it's already seen as one to many and he just made it known to us that that is what people think. It's just facts. Many people do not take it seriously as you can tell by his resources.

Mario T. Lanza said...

Learning to code is not actually that hard and I'm fairly confident I could teach a reasonably logical person the basics of solving problems in some language like JavaScript. The hard part in software development exists at the seams; the environments and platforms and libraries and workflows and figuring out how to fit them all together and make something useful.

Learning a programming language is doable in a few weeks, but getting from there to building a real application that is hosted on the web is more of a leap. In my two decades of programming almost every difficulty that eats hours of my day is environmental. I rarely have serious difficulty with writing and debugging programs where I control the environment and IO. An environment, however, written by a third-party usually buries the particulars in an out-of-sight place and this is source of most programming grief. That's why programmers often find it easier to build in-house solutions. The inner workings at each layer of abstraction are less mysterious because we understand them more intimately. That is, until there's been enough employee turn over and maintenance for even our in-house products to devolve into legacy, pseudo third-party software.

Roneil Sivanandan said...

this article is trash. the author should read mindset by carol dweck or bounce by matthew sayed. or check out the tons of scientific studies. most skills I can think of that allow a good living to be made require time and practice like everything else.

Thomas Levesque said...

I think anyone can learn the basics ("hello world" level stuff), but to actually become a programmer, it requires the right mindset. I know lots of very smart people who are effectively unable to write even a very simple program. Sometimes it's just because they don't find it interesting, sometimes because they don't have the right mindset.

However, I still think initiatives like "hour of code" are useful. Not because they really teach programming to anyone, but because they can spark off vocations. There are many people who could be good programmers, but who never had a chance to try.

Anonymous said...

Having an aptitude doesn't mean that someone will seek out self-education in a field, especially if there are discouraging stereotypes. I teach computer science and programming to primary school students and, inevitably, I have a lot girls who don't want to study programming. They think programming is only for boys who are good at math and want to make video games. However, inevitably, once they actually start programming, one or two of the girls in each class excel at it (roughly on par with the boys, modulo previous experience). Once exposed, those with aptitude do tend to seek out chances to practice and study. I believe we will see an greater number of skilled programmers emerge from universal basic CS training, if only because the talented female and minority students will actually pursue programming.

John Lewis said...

the problem are also companies, at least here in Spain. I remember one of my first jobs as a programmer I found a philosopher. when asked him why was he working as a programmer, he told me he could not find any work as a philosopher. Why companies do not ask to have a career as a computer science? obviously this also affects our salary that is the cheapest in Europe.

Ian Frantz said...

I've worked in technology for 15 years and my first job that required programming was running an online store. I've since come a long way since then. It took me awhile to craft a response but here it is: https://youtu.be/thIsknw-4Bs?t=1000

Please look a the counter-points here: http://www.ianfrantz.com/philosophy/2015/12/5/seneca-letter-88-on-education

Jonathan Nicol said...

It feels like you are starting from the position that there is a singular skill set and mental approach that leads to quality software. This is something I could not disagree with more. Every successful project that I have been a part of has included people with vastly differentiated skill sets. Some software engineers excel at system design, others at understanding the problem domain, others at implementation details, and still others at being user experience advocates.You need each of these skill sets to be successful.

The Green Bar said...

Excellent post. I would liken coding to cooking. Anyone can and should learn to cook their breakfast. Doing that will not qualify you to be a chef in a big restaurant, though.

I think the "learn to code" movement is good in that some people will come away from their introduction to coding with a better understanding of the world we live in, and some may even discover that they have the aptitude and go on to become professionals.

Nothing, though, will stop industry from proclaiming a shortage of the kind of workers they want. Employers of software developers have a hard time evaluating the true value of a particular developer over time, so there is a desire to commodify developers or, conversely, to pamper developers to the point where they don't want to leave the office.

Unknown said...

I'm one of those "self-taught" programmers, over 30 years from BASIC to c#, who will probably never be an outstanding programmer. The drive to continuously pursue excellence in any field is part innate ability which encourages you to push because you are making progress, and the need for excellence in your craft which drives you to continuously study to not just complete assignments but to master them. To say that intelligence, attitude, and drive are given equally to all just doesn't match reality. The idea that we can all do anything as well as the masters is also nonsense. I will be the first to admit that there are many others that know more about any programming concept than I ever will. I am content to stand on their shoulders and use what they have crafted even though I many not completely grasp the concepts involved.

Not everyone can learn to code at a level that will be useful in the commercial market place. Even fewer can reach the level of master. If you are at a point where you believe you are the master and no one can do what you do better...you are already falling behind.

John Ludlow said...

Prospective employers have created the so-called shortage by being incapable of writing good job specs and selecting appropriate candidates.

Almost all my experience is on back-end components and local/desktop UIs like WPF. However, the number of positions I've interviewed for which were labelled as "C# Developer" but turned out to be "Web Developer".

Employers: Development != Web Development. Learn the difference!

William said...

As others have noted, computer science and programming are two different subjects which happen to have some overlap.

I have three degrees in computer science, and I did minimal coding while completing them, because I was focused on theory (at the time I intended to go into academia). After I finished the classwork for my PhD, I got a job as a software developer; I knew the concepts from school (and enough C++ to pass the programming interview), so I just had to pick up the new languages. I've been a developer ever since.

But if my goal had been to become a programmer from the beginning, well, that's what technical colleges are for - learning a trade. University is for giving you a well-rounded education (undergrad) or helping you become an expert in a particular area (grad school), not for teaching you job skills.

Christopher said...

I'm learning two languages almost at the same time, I begun one before the other so it's a little easier, as I'm able to read code, I'm not the best at writing it but I can read it; I guess it's a step in the right direction.

Coding isn't easy, you have to re-write your brains so to speak.

Anonymous said...

Wow, this has been a very informative article and comment section.
I started to learn html and css like five days ago. Started with about four hours of study the initial day and now learn in pockets of 3-4 hours with 2-3 hour breaks. At first (8 hours in) it was all "greek" to me because my mind had dificulty grasping the virtual abstractness of the creation proccess.
I am a RISD trained fine artist and hands on samplemaker/designer for the fashion accessory industry.

The next 8 hours were spend learning & researching more about coding and getting an outside [of free the online class] text editor and learning to save my html & css file so that I could "see" what I was coding in different browsers. I was concerned because all the research said I should have a goal or an app I wanted to build...my goal was to not to be obselete in today's job market and the idea of building an application sounded so tremendous I felt my brain run away.
Then I got the idea to try to envision the code it would take to build my current pride & joy...my [Weebly] website from scratch ( yeah you can laugh) and that "project" set me on fire.
More hours of study and research brought me to discover code validators and the realization that coding is like art in that there is a toolbox of tools, some basic rules and increasingly better toolboxes (Javascript, php Rails)...Yay!

As I practice my code writing & styling I see my coding is getting the job done, but could probably be more concise ...and it dawns on me that perhaps the better way to code is to write economical, precise and concise code rather than the long strings of html and css I am writing. Yes, the artist in me wants my code to be attractive. Is this thought correct? I wonder.

I Google this question and found this article, which answered a myriad of the other thoughts and ideas my brain has been buzzing with, as on this day five, I finally start to grasp the amazing and wonderful world of coding.

In three days I start my "formal" online classes on html, css, Jquery, Ruby and some other programs...formal because I spent a little money so that I have access to a"live" instructor who will probably get tired of me fairly quickly because I have like 3 pages of questions and suppositions I want to ask.

Do I have an aptitude for coding? I don't know... I only know I have a passion for learning. Oh, did I forget to mention I am almost sixty? So I think that if this old brain can learn, given the opportunity and interest anyone can.

Unknown said...

I think that some sort of "programming" can be useful for most anyone these days, even if it just being able to come up with some simple "script" in IFTTT to automate things around the house.
I also think that programming boot camps can be very useful for people who may have domain knowledge, but need enough coding skills to be able to help automate their own jobs, but who are not really looking to be able to design the next highly distributed database.
There are also so many different types of programming, with very different aptitudes coming into play.
What makes a good QA engineer is not the same as what makes a good Web designer, and that is also different from what makes a good software architect for systems software, for language design, for API design, etc.
The issues with universities not producing people who are actually able to program well after a 4-year CS program, that's the fault of the universities in question. I was lucky enough to go to a university that tried to teach me ways of thinking, and concepts that are still valid and have been instrumental in my success for over 35 years, instead of just trying to teach some few computer languages (I had that during middle school and high school, when I took all of the CS courses at the local state university where I grew up).

Jeremy Gamet said...

This opinion of yours is complete ballocks. First of all...if your main source is Stack Overflow, that show's me what kind of a data collection ability you have. Secondly, none of your so called "evidence" mentioned anything about how competent these people are. I'm sure there's as many shitty PHD programmers percentage wise as there are shitty self taught programmers.

Also, things like "the hour of code" in case you didn't know, are what many people out there consider to be part of their "self taught" educations. In fact, as I'm sure you are no doubt aware as you seem to be among their ranks, many programmers have quite a high opinion of themselves. I wouldn't put it past most of them to make a checkbox as "self taught" even if that's a bald faced and outright lie.

"Oh sure, I went to MIT, and I was forced by my CTO to undergo hours and hours of developer conferences, and certification courses...but my 1337 hacker skillz are all MINE I tell you!!! I actually just ignored everything they said and picked up all my experience through watching episodes of the Simpsons and by sheer act of my own intellect!"

Also, I'm sure you're aware of this as well...but not everyone needs to have the same level of programming skill. There are plenty of low level solutions out there that need to be done, some of which are actually just as if not more important than many high caliber software engineering feats that need accomplished. I know plenty of software companies that would be thrilled to have 100 new lower level code monkeys on hand who maybe don't want to progress past a certain point, and everyone is all the happier about the mutual benefit.

Our profession is filled with a bunch of negative and nastily entitled brats as it is, we don't need you to be showing the people who maybe just want to get their feet wet the door, when maybe a little bit of encouragement from one of these spoon fed introductions to programming is all the next AI wiz or Datascience genius needed to finally decide to dump their pipe dream of solving the riemann zeta function problem, and switch to a more practical computer science degree.

Basil said...

Some random comments from me then...

Why would you want to waste three or four years of your life studying computer science when you could enrich yourself with something else that is probably less likely to be out of date within half a decade and appeals to you ? I remember the days when British Gas or Boots or BT used to hire language or maths or physics grads and just train them in whatever programming language they needed, on the job. Apparently one of the effective tests was whether you could follow a knitting pattern... or a cooking recipe... you know, step-by-step sequence of instructions... aka a 'program code'.

There's no great financial barrier to learning to program - all it takes is the motivation to learn and a low speed internet connection and a cheap second hand computer. You don't even need to buy any books - all you need is downloadable - the documentation, the training tutorials and the software development kits (or editors, compilers etc). That's why India became an IT superpower, for example.

(Before the internet, you could borrow books about programming from public libraries, and a home computer like a Sinclair Spectrum or a Commodore would not break the bank.)

But other barriers certainly exist - how many people have the willingness to ditch or delay other forms of gratification in favour of tinkering with a programming environment? In the UK when I was doing that, most of my peers would be spending their evenings at the pub.

As for the perennial clamour about not enough programmers to go around - well, if you take a look at the programming jobs market over the last half century you might notice the perennial drop in the (inflation-adjusted ie real) average earnings of the profession... so call me cynical but my take on it is the employers and the bureaucrats keep grinding this axe to lower industry's staffing costs...

DMcCunney said...

@WBasil: "As for the perennial clamour about not enough programmers to go around - well, if you take a look at the programming jobs market over the last half century you might notice the perennial drop in the (inflation-adjusted ie real) average earnings of the profession... so call me cynical but my take on it is the employers and the bureaucrats keep grinding this axe to lower industry's staffing costs..."

I'm cynical about the whole learn to code movement, but not because I don't think you should. It can be a useful skill, and be fun as well. But the notion that having learned to code you can make a comfortable living henceforth is starry eyed wishful thinking.

So you are a top expert in whatever the current hotness is. (Oh, Big Data and Hadoop or the like.) Everyone wants to do that, and you are one of a small number of folks who can. There is competition for your skills. You can write your own ticket...for a while. But it won't be long before other people say "Hey! There's good money doing that!" and jump in the pool with you. Now you have competition. The newer folks may not be as good as you, but they're good enough, and they'll do it for half of what you charge. Guess who gets the contract?

Like everything else, it's a supply and demand function. Value is relative. Something is worth what someone else is willing to pay.

If you're lucky, you have perhaps 5 years of salad days before competition drives down your rates, and it's time to learn a new skill set. Sock it away while you're making it, because you won't keep making it very long. Programmer salaries are dropping because employers don't have to pay more. As more and more people jump in, the supply increases faster than the demand, and plenty of folks are lined up for any opportunity. They merely have to be good enough, and charge a lower price or expect a lower salary than you do.

It's the Red Queen's Race from Alice in Wonderland, where you must run as fast as possible simply to stay in the same place, and to actually get anywhere you must run twice as fast as that.

If I were looking at current CS grads, I'd be interested less in what they knew than in how they had demonstrated they could learn. Had they been taught to learn? Could they pick up a new language in short order? Could they grasp what was needed by my enterprise, and what they would need to do to contribute? That might have nothing to do with anything they'd been taught in CS classes.

Learning to code at best demonstrates ability to learn, and to grasp and apply new concepts. The concepts you may new to grasp and how you may have to apply them may have nothing to do with CS or coding. If you can't continuously drop old skills and learn new ones, you're screwed pretty much regardless of what you do.
______
Dennis

Amyloid said...

Yes you do. If you want to be healthy you do.

Terry said...

@Richard Eng, you are talking absolute drivel. Talent and 'aptitude' are complete myths, with the correct level of practice anyone can become an excellent at drawing, plumbing, coding etc. It's no god-given talent.

DMcCunney said...

@Terry: "Talent and 'aptitude' are complete myths,"

ROTFL! In some ways, I wish "with the correct level of practice anyone can become an excellent at drawing, plumbing, coding etc." was true. Unfortunately, it's not.

I've met plenty of people who are poor at what they do, even with loads of practice, and that has included drawing and plumbing as well as coding. You must have aptitude for what you attempt, and have the capacity to do it well. Some folks simply can't do whatever it is, and no amount of practice will help. This is true for anything people might do for money.
______
Dennis

Jeff Lowery said...

I think programming for most people is BORING. Even if they could develop the ability, would it maintain their interest for an entire career? I think many management jobs in IT are filled by people who just weren't driven to code. You have to be introverted, problem-oriented, bullheaded-stubborn, and take pride in hard-won knowledge. Frankly, I see a lot of people spend most their time in meetings and calling that "work".

Unknown said...

Hmm, that sounds just like me! I'm known as a PITA because I can be "bullheaded-stubborn", and I definitely take pride in hard-won knowledge. Spending time in meetings (except for architectural design meetings with other smart creative technical people), usually had me climbing the walls after 15 minutes - I'd never want to be "management". Technical team leader, with a smart team, that's the ticket!