Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Learn to Code, It's Harder Than You Think (mikehadlow.blogspot.com)
171 points by mikehadlow on Dec 4, 2015 | hide | past | favorite | 191 comments


There's a big gulf between knowing how to code and working as a professional software developer.

I'm a writer for a marketing agency, but I write Google App Scripts, JavaScript, and PHP on a regular basis to automate tasks, try out ideas I have, etc.

There's no way I could work as a professional software developer, but I know how to code enough to help make my professional/personal life easier and more fun.

Isn't there something to be said for that? Not every skill needs to lead directly to a job. Can't it just be another skill to have when you need it?

I learned to code through Codecademy and trial and error with frequent Stack Overflow searches. If I can figure it out, anyone can.

Edit: For anyone saying they would hire me, I'm flattered but am very happy working as a writer who gets to program occasionally. If you're interested, here are two little projects I've put together: http://playRollo.com and http://WriteByNumbers.com. Feedback? Email me, paulcole@gmail.com.


As someone who is a software developer, I can assure you that this is enough coding skill to get a job as a software developer. Being able to learn how to code is the important bit. A lot of places will expect you to learn how to do most of what you're doing as you go.


...and significantly more than some developers I've worked with.


I agree.. I was talking with a CFO about one of his employees, who he called his secret weapon - an accountant with coding skills. The ability to do a regular job plus the ability to code is extremely valuable.

In architecture there is a trend of computational design - if you google for 'designed with grasshopper', you'll see some amazing shapes. The best designs don't come from the best programmers, they come from the best architects and designers who also know how to code.

Maybe it would be possible for them to become professional programmers, but I think it's much more valuable for them to be hybrids. Not every job can benefit from coding skills, but software is eating the world and learning how to code is becoming more and more widely applicable and useful.

That said, I think most people can learn to code, but I don't think _everyone_ can learn how to code. I have worked with a few people in menial jobs that I honestly don't believe could learn how to code. I realize that this is a pedantic assertion about corner cases, but I am a programmer. :)


In theory this is true, but in practice a common pattern is that Joe is a superstar accountant/lawyer because he can code and uses that to do his job better. This becomes known to his co-workers and boss. Six months down the road he's spending a huge portion of his week helping Mike with this one little excel macro or Mary with automatically generating contracts. He also gets called in when a message pops up on the screen about the virus scanner finding something because "you're good with computers and those IT guys always take forever". He does less and less legal or accounting work, and when he tries to get a raise or find another job it turns out that he's no longer a great hire as an accountant but he also can't compete with programmers that have had programming jobs. He's stuck in this weird hybrid spot that doesn't have even have a name and no one hires for it.

Maybe that'll change in the future, but for now the wiser course may be to keep your superpowers to yourself.


Yep, I find myself in a somewhat similar situation. I'm a business analyst who taught myself enough front-end skills to build a JS app that replaces an old legacy application we have. The result saved us dev resources(because it completely avoided the standard waterfall timeline), but has now given way to "if we don't have dev resources, let's give this task to him."

Which is fine, but the tasks that go down that path aren't really enough to point me toward a full-time dev gig. So I'm in a weird middle ground between being a PM/BA/Developer without acquiring full experience in any of the three roles right now.

That being said, if I had to do it again I'd do the same thing. Just not sure how to navigate out of it.


> There's no way I could work as a professional software developer

Actually given the way our economy is currently structured, it's easier to get a good job as a developer having never written a line of code than it is to get a good job as a marketer even with 5+ years of experience. It might take you a couple tries to pass the interviews, but that doesn't matter because getting interviews is relatively easy. (Albeit if you don't have a GitHub portfolio, getting each interview will probably require you doing some take home assignment that will take a couple days for each company.)


I think you are overstating how easy it is to get interviews for development positions. From what I have seen, someone without some demonstrated coding experience, professional or hobby, won't even get the time of day from companies looking to hire developers. They will never get to the take-home assignment phase.


It all depends... The question boils down to "how much of a shit job are you willing to go after"?

There's always a few programming jobs that no one wants because the pay is awful and the company/job description is crap (PHP web apps for 28k/year? ROFLOL). But then they act as proof of employability for slightly better companies and soon you have 12-24 months of "professional" experience and landing interviews at OK companies is not unreasonable.

That's how a lot of us, no degree type, got our first foot in the door.

IT systems type roles are also a good segue into programming roles. And IT admin roles are so much easier to land.


PHP is paradise compared to the bed of glass and nails some of us 30-somethings had to drag ourselves through man.

Lotus Domino. Never Forget.


I was lucky enough to start on the sys admin side and in smaller companies and just after the major switch away from Novell to NT4. I skipped a lot of the early/mid 90s stalwarths.

"client-server" VB6 apps with an MDB file on a NT4 fileshare passing as server is the lowest I've been lucky to have to deal with. Boy that was crap. That and actual cgi-bin script actually written in perl.


cgi-bin's seemingly incredible power made me accidentally learn pearl.

I suspect it broke me as a programmer for years!


Or learning to program in C on DOS, where a bad pointer could not only hose your program, but easily hose the OS too


I started with Lotus Notes baby!


I think you're correct for tech startups and large companies, but not for dev shops or family businesses.


I think it holds true for dev shops that are not simply body shops as well.

As for family businesses, they rarely if ever hire software developers. They hire someone for a different role who can code, such as the "help wanted" sign I saw last week in Santa Fe looking for a sales clerk who could also maintain a small website front to back.


I disagree slightly in that vast majority of tech startups don't have any money. They need people they don't have to pay. What better way than to give everyone who walks by a flyer? Comparatively, dev shops need to be able to get another customer, so they need to produce something that does at least work regardless of whether or not it scales. They need people who can build something right out of the gate or the clients don't pay the invoice. They don't have the time to spend training someone.


"Isn't there something to be said for that? Not every skill needs to lead directly to a job. Can't it just be another skill to have when you need it?"

Amen. I'm constantly writing little Ruby scripts to do some automated task, usually fixing CSVs or extracting data to load it in a database to compensate for crappy reporting in a tool I use. I suppose that this or my recreational Clojure programming is something I could turn into a job, but I prefer to have it be a tool that allows me to do my job better. Or to run better D&D campaigns...

There definitely is a divide between like software engineer, and say person who uses programming to make their job a bit more efficient. It seems as though everyone is representing it as a binary choice when as paulcole said it's more of a gradient.


The funny (not ha-ha, but funny-ridiculous) thing is that you'd no doubt be perfectly able to work as a professional software developer, but you'd never get past a software interview.

A lot of software interviews I've seen (and had to sit through) tended to be about tangential stuff like language minutiae, and whether you have memorized the Big-O complexity of the interviewer's favorite algorithm, and can you invert a binary tree without looking it up (because obviously we all code without internet access). Very computer-sciencey.


well, it's a gradient, and the only way to move up is years of practice.

i liken it to any skilled trade. you can probably fix your kitchen table or change the brake rotor on your car but you're probably not qualified to work at a bespoke furniture shop or the porsche dealership - but you could be, if you really tried, or if you got lucky. and if you did get lucky, you could probably figure it out with some help.

some people just can't do these things, no matter how hard they try. they simply don't possess the aptitude, or iq, or whatever you want to call it. maybe just plain old discipline.

the interesting thing about programming to me is it's easy to lose - i'm totally unqualified to do anything serious these days because for the past 5 years i've spent most of my time running a business and doing 'housekeeping' technical (sysadmin, very light dev, some ops stuff) tasks that i don't want my senior devs to do.


You don't need aptitude to practice.


Err, yeah, you could work as a professional programmer if you wanted to.

You can code. The whole point the article is trying to get across is that a lot of people are simply unable to learn how to code. You've learnt. You CAN become a professional.

You just don't realize it.

The step you've taken is the hard one. In fact, there's another big dirty secret in programming.

A load of professional programmers aren't able to do what you can do, they can't make new programs. They can only modify existing programs. Making new programs is beyond them (or at least takes them an inordinate amount of time). Automating scripts to make their job easier is something that they would take weeks to do.

EDIT: I'm not sure I agree with the article though, I've heard several arguments that we simply teach programming badly. Especially in universities.


There's a dirtier secret:

A load of professional programmers are not able to make new programs.

A load of professional programmers are not able to modify existing programs.

And a load of professional programmers are not able to finish programs.

Almost no-one is good at all 3. Most are extremely bad at least one of these.

Lots of people who are "good" at making new programs are actually pretty bad.


It's not a secret when you know how to code but you are an end user. Knowing how to code and knowing how to learn to code makes this widespread incompetence masquerading as competence and even "professionalism" radiate from every bit of software you ever come in contact with, as an end user. Seeing the source code just drives home the message even more. You become a more discerning end user.


> And a load of professional programmers are not able to finish programs.

I'm bad at this. I'm not sure if this is caused by a lack of programming skills or a lack of project management skills.


Does HR know this? I'm afraid not.


If HR is doing something other than providing expertise on managing relationships (particularly, the formal and compliance-related aspects of those relationships) for supervisory/management staff that are the domain experts providing knowledge related to the skill sets needed for the staff which are or will be reporting to them, then the organization has a fundamental (though, to be sure, distressingly common) design flaw.


Random dude who learns basic scripting says he's not good enough to be a software dev -> people chime in disagreement.

But, try to actually take them up on the offer and you'll probably find yourself jumping through programming interviews that will scoff at your basic skills.

Most of us got started writing little scripts. It's definitely a great start. To say that he could work as a professional programmer now is ridiculous. Could he have a career if he put in the time? Maybe. Can he get a job? Maybe. But, it's not the slam dunk these people are suggesting.

Note that I'm not even differentiating getting past interviews vs actually doing the work. I think either would be a stretch from writing a few scripts.


The software development market is giant and highly differentiated now. I have personally gone into client sites with plenty of people whose full-time job is doing nothing but scripting, and they're paid as software developers (for their locale) and their work is appreciated (as long as they have good bedside manners with the stakeholders). Granted, these clients are not hot startups, they're nowhere near the leading edge, it often involves tying together CRUD applications instead of more interesting problems, and often they're found in "flyover country" instead of hot metros, but for some people it's the right fit.

Starting and ending one's programming skills with scripting is not a programming sin. For some businesses, there is a real, constant need fulfilled by someone who glues together data and systems with scripts. Personally not my cup of tea, but I recognize it works for some people and organizations; if those circumstances work for you, then that kind of job is nearly a slam dunk.


'A job' is not necessarily a job at a large software firm. How about supporting your local medical offices (dentist, optometrist) by remote-monitoring their servers, installing updates etc? That's a job. Or updating web order forms for the local shops for the holiday specials?

There is an enormous spectrum of software to be done. And not enough people to do it, currently. So getting a job could be very easy.


Sure.

But, the point is a "professional software development job", not "something to do with computers"


The way it usually works is you get a job doing non-primarily coding stuff at a company that has also has programmers, and then get shifted to a development job when people figure out you can code.


Meh.

I've never seen that work for actual software development, but I guess it depends on where you work/what sort of job you do.

I've seen it work for sdets though so who knows.


Err, SDET _is_ a professional software developer. It's in the title!

Working in a non-development group doesn't somehow make you not a software developer.


They aren't the same job, regardless for how similiar the titles are.

My point was the skills required in architecting a solution vs testing a given specific solution differ. So, while you can more easily fall/move into a automated testing role, it's harder to do so into a core programming job. The bar for moving into the latter, rightly or not, very much higher.


Definitely. Maybe not a senior level dev at Google, but if you can do enough to automate tasks, you can almost certainly do enough to get hired as a junior dev somewhere.


There are people saying they will hire you. See how much they want to pay you and if the position sounds like a good stepping stone. See if you can talk yourself into giving it a try.

Personally, I think you probably aren't ready to actually interview and land a dev job. But, if people are saying they would hire you[0], this is a great chance to take them up on their word and in doing so, get your foot in the door.

[0] I don't believe them. You should take them up on it just to see what happens either way :)


Haha, yes, if I wasn't very happy in my current position, I'd take them up on it :)


>There's no way I could work as a professional software developer,

I'll hire you.


Here's what made me say that (and it wasn't humblebragging):

I've worked in a marketing role in a software company and realize that I don't have the understanding of how to contribute in a meaningful way to a team-based professional programming project.

My workflow isn't ideal: bang my head against a wall, Google my way out, copy/paste/edit until things work, and move on.

Because I'm generally on a mission to get something done, I don't have the patience to name variables in a meaningful way or write clean code. I'm basically programming to accomplish something in the moment and it works for me.

To paraphrase the Woody Allen quote, "I'm not sure I'd want to work anywhere that would hire me as a programmer." :)


Your workflow is pretty much the same as 90% of the other professional programmers out there. The walls change as you get more experienced and you copy paste less as you're toolbox grows but unless you are in university working on a CS PhD or the senior dev/fellow at a Google or Facebook working on something no one else has already solved then that workflow is 90% of every programmers workflow.

You might start as a junior dev but within a year you'll be talking the lingo, your toolbox will have exploded, and you'll be well on your way.

You have already demonstrated that you have the one quality necessary to be a good programmer. The ability to think abstractly and manipulate and express those thoughts in a concrete manner. Everything else is just practice and hard work.


"I'm not sure I'd want to work anywhere that would hire me as a programmer."

To be fair, I am a programmer and I've had exactly the same thought over the years! ;)


bang my head against a wall, Google my way out, copy/paste/edit until things work, and move on.

I guess I finally have to get started with my work day... ;)


The difference between that and the step up is if you don't spend some time understanding why the cut-and-paste code worked and learning the how and why of things.

I've friends who are in the same boat and invariably the excuse is "I don't have the time to learn the theory, I have other things to do." Because of that, their workflow never really gets any easier. That's fine if coding is that side thing you do to make your job easier. That fails when it's what you want or need to do as an end to itself.

Also, I don't mean theory in the sense of the MIT "Introductions to Algorithms" book, I mean in the sense of the standard library, idioms, syntax and common usage of the languages and libraries you use.


> To paraphrase the Woody Allen quote, "I'm not sure I'd want to work anywhere that would hire me as a programmer." :)

I understand and almost echo that sentiment myself, but bear in mind that it may be an instance of impostor syndrome :).


Agreed. If you figured out how to automate your job on your own, you would definitely be able to work as a software developer. I'd hire you as well.


Of course he knows he could work as a developer. It is just good old humblebragging.


It's possibly more the case that he'd rather just dip in and out as and when it pleases him. No harm in that of course, I know plenty of people in the same situation who are perfectly capable but wouldn't dream of doing it full time.


Excatly. There's a huge difference between "everybody needs to learn to become a professional software developer" and "everyone needs a higher level of software literacy, including basic coding skills"

Lots and lots of office jobs involve stuff like updating content on a Django app or shoestringing together Excel VBA and Access stuff. There's all kinds of tasks where scripts and low-level automation would be useful.

Now the tools for this tend to be awful and workers tend to be locked out of trying it, but that's another story.


I would argue that neither of those statements is true.

I think this idea that coding is some sort of silver bullet is ridiculous.


> I think this idea that coding is some sort of silver bullet is ridiculous.

Its not a silver bullet, but it is as a core component of developing of computer literacy, a broadly applicable foundational skill for non-menial jobs in the modern world, even if programming itself isn't a central duty of the job.

(In the right context -- though its possible to learn programming without developing much of this -- its also a valuable way, and perhaps the most accessible in terms of providing concrete feedback, to develop technology-neutral systems literacy, which is an even more broadly applicable, foundational skill.)


It's not a silver bullet, but it is a bullet. Coding can't solve every problem, but it can help solve some of them, including some that would be very tedious to solve otherwise.


Adding to the chorus. You sound like a good self-teacher, and that's a big part of being a regular developer. Don't sell yourself short.


I feel like the discussion around this post will suffer from a lack of specificity over what a 'software developer' is.

Someone who works primarily on small javascript web applications has a really different job from someone who works on a large application built on a LAMP stack, or someone who writes complex iOS applications, or someone designs self-driving car software for Google, or someone who works on embedded software for pacemakers, or someone who writes operating systems or designs programming languages.

Each of these jobs probably have a particular set of paths that lead to them. Two people who are both 'software developers' don't necessarily have similar skills, training or education.


Yet all of those jobs have one thing in common: you have to know how to code. Being able to code is the baseline for all of them. If you can't code on some level, you can't do any of those jobs. The article is about coding, not engineering, the software process, reliability, etc. All of that just further raises the bar.


I think gabemart threw in "small javascript web application" as an example of a job where you don't need to know how to code, where you can get by copying & pasting from Stack Overflow.

A more interesting example is his "pacemaker embedded software" example. There's actually not very much software in a pacemaker. So that's an example of a field where engineering, process, testing & reliability skills are much more important than the ability to actually code. The coding in something like a pacemaker is usually done by an electrical engineer. A good EE may not be a good coder, but they should have the other skills you mentioned.


Someone who works primarily on small javascript web applications has a really different job from someone who works on a large application built on a LAMP stack, or someone who writes complex iOS applications, or someone designs self-driving car software for Google, or someone who works on embedded software for pacemakers, or someone who writes operating systems or designs programming languages.

Do they?

If your job is primarily about taking other people's work and writing code based on it then, in my opinion, you don't really build software. You write code. There's nothing whatsoever wrong with that, but it's definitely different. Building software is much more than writing code.

Software development is working out what a problem is, what the solution to the problem is, and how to implement that solution on a computer. There should be time spent talking to users, gathering requirements, writing specifications, designing a user experience, developing a test strategy, thinking about stuff, writing documentation, and, at the end, a bit of coding. The non-coding side of software development isn't especially different between specialisms. So, really, software development in the sense of everything necessary to make a piece of software does require approximately the same set of skills.

That said though, the knowledge required in any given part of the software industry is very different. A web developer needs to know very different things to someone doing graphics or embedded development.


The software development aspect that you describe cannot be taught at a boot camp. I think the people claiming you can learn to code in a day mean (or think they mean) the coding part, and probably don't realise there's all that other stuff on top of it.

I would like to emphasise the last point you made. The coding skills, while broadly similar, are still different in each of those specialisms. Learning how to write effective code for a pacemaker is very different from writing a Ruby on Rails web app. They're both "coding" and you need the same kind of abstract thought, but you need to understand very different things to be good at them.


> Each of these jobs probably have a particular set of paths that lead to them.

I think the commonality is that at the minimum you need to be able to read English at a proficient level, which weeds out the vast majority of American adults.


That's not true. The vast majority of adult Americans can read at an adequate level. Further, given time and incentive, most can write well enough to be understood, if not exactly to high grammatical standards. These facts are triumphs of the modern educational system.

However large numbers of adult Americans when faced with:

  3x - 7/3 = 4
could not solve exactly for x, no matter the time and incentives. It is hard to imagine how such a person would be able to learn to code, at least as long as programming languages look anything at all like those of today.


While I hate to be THAT cynical... my father is a doctor, and they've had issues with patients not understanding their paperwork. They had done studies to figure out the median reading level of their patients. It turned out to be an 8th grade level, so they adapted their paperwork. The patients still didn't understand it. It turned out that they were capable of reading at an 8th grade level, but their reading COMPREHENSION level was that of a 6th grader.


"More than 300 studies indicate that health-related materials far exceed the average reading ability of U.S. adults."

"90 million adults with limited health literacy cannot fully benefit from much that the health and health-care system have to offer."

"A two-year-old is diagnosed with an inner ear infection and prescribed an antibiotic. Her mother understands that her daughter should take the prescribed medication twice a day. After carefully studying the label on the bottle and deciding that it doesn't tell how to take the medicine, she fills a teaspoon and pours the antibiotic into her daughter's painful ear."

http://hospitals.unm.edu/health_literacy/pdfs/HealthLiteracy...


Did you seriously just suggest that the majority of American adults are illiterate? I'd love to see the source you base that claim on.


> I'd love to see the source you base that claim on.

Like the government's official data on adult literacy?

http://nces.ed.gov/NAAL/PDF/2006470.PDF

After 1994 they got rid of the 'advanced' literacy ability category, corresponding to roughly the level academic journal articles are written at, because not enough Americans qualified. So currently the top literacy level is 'proficient', which is roughly the minimum level you'd need in order to teach yourself to become a competent developer. (That's basically the level you need to read a newspaper and compare and contrast the information presented in two different articles.)


First, thank you for providing a credible source.

However, linguistic constructs in most programming languages are not what I'd consider advanced English. A C++ program is hardly written in Shakespearean style, for example. And many words in programming languages do not exist in English per se; e.g., "def" from Python is not a word.

So, programming requires a more basic understanding of written English than you seem to imply.


> However, linguistic constructs in most programming languages are not what I'd consider advanced English.

Linguistic constructs in most programming languages can be at least as complex as anything in English, and aren't even English at all. You know how many experienced programmers have trouble dealing with programming languages with, to them, unfamiliar syntax? To someone who hasn't programmed, all programming languages have unfamiliar syntax.

> So, programming requires a more basic understanding of written English than you seem to imply.

That doesn't follow from the premise that "linguistic constructs in most programming languages are not what I'd consider advanced English."

"Proficient" literacy (the current highest level) for each area of literacy is defined as follows (from the document provided upthread):

Prose literacy: reading lengthy, complex, abstract prose texts as well as synthesizing information and making complex inferences

Document literacy: integrating, synthesizing, and analyzing multiple pieces of information located in complex documents

Quantitative literacy: locating more abstract quantitative information and using it to solve multistep problems when the arithmetic operations are not easily inferred and the problems are more complex

I would argue that programming tends to require literacy at that level in each category of literacy in that least one natural language (the language in which information about the programming language, etc., and the problem domain is available), as well as the ability to develop the equivalent degree of literacy in the programming language. (This isn't necessarily a prerequisite to learning programming, and especially in the case of early programming exposure, I think programming is a useful context for achieving a proficient level of literacy in a natural language.)


Sure. But the most advanced level of literacy they're measuring is just being able to read a newspaper written at an 8th-grade reading level. And that's actually below the level of most programming tutorials. E.g. even reading the Django documentation, which is known for being unusually clear and well written, is still much more difficult than reading an NYT editorial.


I have to seize the opportunity:

http://stanford.edu/~mkagen/codepoetryslam/


How is that paragraph evidence of illiteracy?


> at the minimum you need to be able to read English at a proficient level


The vast majority of adults can't read English well? Let's get real here, that's not even close to the truth.


Out of curiosity, what makes you believe that? I live in America, and your claim sounds somewhat bizarre.


You meant to reply to the parent right? Just look at the published studies on the topic. One can argue for roughly 20% functionally illiterate easily, any higher and its really just speculation. Certainly far from a "vast majority"


You say tomato, I say t0m47oLoL


> 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.”

Argh, I knew when I opened the article that its evidence would end up pointing to the "camel has two humps" study.

That study has been retracted, and the author regrets the damage it may have caused to computer science education:

http://retractionwatch.com/2014/07/18/the-camel-doesnt-have-...

> Though it’s embarrassing, I feel it’s necessary to explain how and why I came to write “The camel has two humps” and its part-retraction in (Bornat et al., 2008). It’s in part a mental health story. In autumn 2005 I became clinically depressed. My physician put me on the then-standard treatment for depression, an SSRI. But she wasn’t aware that for some people an SSRI doesn’t gently treat depression, it puts them on the ceiling. I took the SSRI for three months, by which time I was grandiose, extremely self-righteous and very combative – myself turned up to one hundred and eleven. I did a number of very silly things whilst on the SSRI and some more in the immediate aftermath, amongst them writing “The camel has two humps”. I’m fairly sure that I believed, at the time, that there were people who couldn’t learn to program and that Dehnadi had proved it. Perhaps I wanted to believe it because it would explain why I’d so often failed to teach them. The paper doesn’t exactly make that claim, but it comes pretty close. It was an absurd claim because I didn’t have the extraordinary evidence needed to support it. I no longer believe it’s true.


I liken coding to playing a musical instrument.

Some people are musically inclined, they can learn easily and fast and they tend to the best. But most people require some level of training complimented by the dedication of what amounts to mostly self-practice. So in a way, you're self taught.

The vast majority of people are willing to buy an instrument, just to see if they are musically inclined, but when they find out they aren't they don't have the dedication to do it the hard way.


> I liken coding to playing a musical instrument.

Except with a musical instrument, anybody can judge whether you are good at it. Not so with programming. Everybody who ever wrote one line of HTML can call themself a programmer, but only trained people can tell whether you are a good one.

You might say at this point: so what? But I think the distinction is important, because it may be the reason the "driving force" is missing for a lot of people. If programming really had "rock stars" we might have had a lot more good programmers.


Pop music is quite capable of working with "stars" who can't play their instrument or sing, especially since the invention of Autotune.


Counterpoint, I can knock out a first class "Stairway to Heaven" in the local electric guitar shop simply by remembering where my fingers should be but not having any clue about what chords and notes they are.

Can I be judged to be an accomplished musician upon that sole rendition?


Of course not. There isn't really a programming equivalent though. I guess you could memorise the syntax for one specific, complicated program and you're right, that wouldn't make you a programmer.


No, definitely not. But you could certainly get a few others together, start a band, play some gigs, maybe even make a little bit of money.


This is a pretty fair comparison. Music has a pretty standardized format, relatively speaking, in what 'sounds good' and what sounds 'bad' based on one's cultural upbringing. As in, certain tonalities are pleasing to the ear. From basic understanding and competency comes the ability, in theory, to 'compose' pieces. My experience with coding is similar in that there are good ways to structure a composition, and not-so good ways. In coding, a compiler or testing the program is what reveals if something works or not, much in the same way that playing back a recorded version of a composition can reveal what's good or not good about a musical piece.


I've always used this comparison too. Of course this same explanation can be used for many fields and career choices, but for technical fields I think it's easy to make this comparison. It's important to point out exactly what you just said though - "the hard way".

It's the whole nature vs nuture argument. I wish I could have told myself many years ago to focus more on my "nuture" side. It's amazing how far you can go when you previously wrote it off as being not naturally inclined.


Quoted in SICP:

A computer is like a violin. You can imagine a novice trying first a phonograph and then a violin. The latter, he says, sounds terrible. That is the argument we have heard from our humanists and most of our computer scientists. Computer programs are good, they say, for particular purposes, but they aren't flexible. Neither is a violin, or a typewriter, until you learn how to use it.

Marvin Minsky, ``Why Programming Is a Good


Although I try to be careful with analogies, I do think this is an excellent one, largely because it can help explain why coding can be seen as simultaneously easy and extremely difficult.

I remember reading an interview with Andre 3000 a while back about how he composed "Hey Ya!". It turned out (this is all from memory) that the reason he used the chord pattern he chose was because he was relatively new to the guitar and those were the chords he knew. So in short, Andre 3000 was able to take very limited knowledge of a new instrument and produce something very compelling and interesting. However, this was certainly after a lifetime of building an interest in and understanding of music.

Shortly after reading that interview, I was hanging out in a music store, and a guy was amazing everyone with his acoustic guitar ability. He did some very cool stuff with his fingers while hitting a harmonic and going back down the neck, at a rapid pace, without faltering even slightly. He was available for lessons and corporate events.

Truth is, it actually is possible to do something very interesting with programming with relatively little experience, though you do need to be a creative and technically minded person. At the same time, you know, nobody would have hired Andre 3000 as a session musician. Sometimes I think that those coding tests, where you have to find the least common ancestor of two nodes in a binary tree, handle tricky threading issues while avoiding deadlock or race conditions, or doing complex outer joins, are really done by companies looking for the equivalent of a session musician. They're not saying you aren't creative or incapable of writing novel and useful software if you don't pass. They just can't add you to a band, at least not yet.

Lastly, I am increasingly in agreement with the last paragraph, which is that our "profession" does need to take initiative in determining how basic competence is established.

"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?"

This is insightful. I've been very ambivalent about it, because I am scared of what happens through regulatory capture. But at this point, I do sometimes wish there were an industry-wide, well recognized exam that covered the paces that you go through when you interview at google, amazon, and small companies that are copying them. I've read/heard people say that they'd happily take such an exam formally if it meant they wouldn't have to re-take this exam, in a more capricious way, every time they apply for a new job.


>This is insightful. I've been very ambivalent about it, because I am scared of what happens through regulatory capture. But at this point, I do sometimes wish there were an industry-wide, well recognized exam that covered the paces that you go through when you interview at google, amazon, and small companies that are copying them.

I'm just as worried about regulatory capture as you are, but it might be possible to create a de facto standard exam in this vein just by making a good one and then relying on its merit to make it well known. I mean, fizzbuzz has already reached this status as an easy flunk-out interview question and lots of people take it as a positive test of programming ability. (Which it obviously isn't.)

The basic problem with an 'open exam' in this vein is that it is very easy to copy the work of others. So whatever problems you pick need to be things that are objective enough to be verifiable that someone has solved them but general enough that it won't be something where we all need to worry about whether you pasted your solution in from someones blog.


This is a great comment that I'll be saving.


Learning anything will result in a similar process. "Talent" gives you reasons ("wow, i'm good at this") to persist in learning, without it you either persist, or not.


[I made a similar reply down below, but I think this belongs here, too.]

I've made my living by teaching beginners to code. I have been doing it for the better part of two decades, and I specialize in teaching students that have little aptitude for it.

In my experience, many students can learn how to code, but it takes a very long time!

For example, I make my students code FizzBuzz. It is literally the 106th project I make them do. That is, they have completed 105 complete computer programs before getting to FizzBuzz. And many of them still struggle with it. The nuance of else/if needing to be ordered in a certain way is something they still don't have a good grip on.

Programming a computer is very very hard for most people, but that doesn't mean they can't do it.


Why do you do it, my guess is most people here would never knowingly hire someone who struggled with such a basic concept.


Because my kids keep practicing for ten years after my class before getting jobs.

All my students are aged 14-18.


Also, shoveling bootcampers into the industry is bad for real engineers and the quality of their software. Management everywhere is lowering the bar so they can hit their hiring goals and pretending the consequences are natural.


It really hurts new CS grads too. They usually go for similar jobs as Bootcamp grads, but may get rejected because they don't have the "practical" experience (i.e. latest frameworks) Bootcamps grads may have. So instead of grooming and training students with a four year foundation in Computer Science, they go for the cheap route and hire someone who just knows APIs.

I admit my post has a lot of generalizations and I know Bootcamp people that are great engineers and CS grads that are not, but I think you get my point. I see a lot of frustration over this in /r/cscareerquestions.


I would argue that CS grads who do not spend some time learning practical skills on the side are idiots and completely misunderstand the industry they are trying to enter.

Bootcamps claim that they can help people who lack the proper foundations or the discipline to learn on their own, these are assets that CS students should have, they should therefore apply their knowledge and training to learn on their own the tools that are used in the industry.


> I would argue that CS grads who do not spend some time learning practical skills on the side are idiots and completely misunderstand the industry they are trying to enter.

I agree, but then I realize I live in a bubble.

Here and in /r/cscareerquestions, everyone knows to do side projects. In my school, most people don't. Neither do my friends in other schools. They may get one internship but that's the only "practical" thing they do (usually good enough to get a job though). A lot of my friends are much busier than me and don't have time to teach themselves stuff on top of school and life, at least not well enough to get a job.

Perhaps we need to stress a bit more practicality in CS curriculum?


Perhaps we need to stress a bit more practicality in CS curriculum?

No, we need to stop telling people who want a career in web development to get a degree in Computer Science. And universities should stop convincing people who really want to be software engineers to study computer science. If you want to work as a structural engineer you'll probably get a degree in structural or mechanical engineering. You don't get a degree in theoretical physics and complain that since structural engineering is just a practical application of theoretical physics your physics curriculum really should be more focused on practical engineering.


> You don't get a degree in theoretical physics and complain that since structural engineering is just a practical application of theoretical physics your physics curriculum really should be more focused on practical engineering.

I sometimes feel like we should just call Computer Science what it really is, Applied Computational Mathematics. Because, you're exactly right, there is a disconnect between the teachings and expectations of most CS programs.

Then again, my CS program offered lots of 'practical' courses, like iOS and web development. They even created a BA program that removed most of the math requirements and replaced them with those vocationally related classes.


Then again, my CS program offered lots of 'practical' courses, like iOS and web development. They even created a BA program that removed most of the math requirements and replaced them with those vocationally related classes.

That sounds like great programs that all universities should offer. They just shouldn't call it a CS program.


> No, we need to stop telling people who want a career in web development to get a degree in Computer Science.

Also agree, but we tell people to do it because employers ask for it. I guess it's a cycle, but someone's gotta stop it one day.


I think that the Universities could and should be ones to solve this problem. They first of all need to start offering 2 year largely vocation degrees for people who just want to learn the basics of getting a programming job and in addition offer 4 year Software Design/Development/Engineering degrees in addition to Computer Science degrees and really differentiate between the two. Make it clear to the students (and by extension employers) that if you go for a software degree you'll mainly learn X but not so much Y and if you go for a CS degree you'll mainly learn Y but not so much X. Most people currently getting CS degrees should probably be getting a Software Design/Development/Engineering degree.


> more practicality in CS curriculum

Rename it to SE first and stop pretending it's a "science". Or, alternatively, accept that it's really a science and stop moaning about the careers in the industry. There'll be a lot to moan around the grants, post-doc positions, publish or perish and all the other funny parts of an academic career.


I feel like this should be true, but in my experience it hasn't been. We've hired interns who become full-time at some point, both CS grads and bootcampers.

As a note, the bootcampers we've hired have been people with a little bit of programming experience (not a ton, generally they did it as part of a previous job) that wanted to switch careers. The ones we've hired have been around 24/25, with about a year of experience in a different field like chemistry or geology.

The CS interns were college kids, so it could just be a function of maturity. I think of the ones we've brought in for internships, 2 were hirable (we've brought in maybe a dozen or so over the last couple of years). One of the 2 hirables is someone who I think will have a great career over the long run.

The bootcampers we've hired (thus far two) have been a measure above the CS kids. The CS kids have had a level of entitlement that I think is hindering them. It feels like because they've gotten a job they're set and they don't really need to learn more, when they have a long road to go down. This has been a pretty typical pattern and it didn't feel like they had the will to push themselves despite the fact that many seemed like they were very intelligent.

The bootcampers were older so they seemed to have that will and curiosity, none of them took the job for granted. One of them seemed to be falling behind, he was told that, and spent a lot of time outside of work learning the things he didn't know and has been great.

I understand anecdotes can only be taken so far, but just a couple of observations I felt like sharing.


>The CS interns were college kids, so it could just be a function of maturity.

I'd wager that almost every difference you've noticed is down to maturity.

The average 25 year old who's been working for several years is a light years ahead of the average 20 year old college kid when it comes to attitude.

If you were hiring 25 year old CS grads, they'd likely have the same work ethic, and an understanding of the formal methods underpinning their experience.


I agree. Which is what could be happening with companies like zenfit. http://uk.businessinsider.com/zenefits-ceo-refutes-the-naysa...

I can't possibly believe that with so many new hires the quality doesn't go down. And with the quality of the hires, also the product quality will inevitably go down.


Is it bad? Should we have "real" engineers working on software that a bootcamper could do? It seems like a waste of resources. Some problems only need a solution that your nephew can hack together in a week.

That said, the problem is that many people looking to get software built can't properly identify what should actually be engineered. In the physical world it's a bit more obvious.


>Some problems only need a solution that your nephew can hack together in a week.

There's also huge subset of problems that look like something your nephew can hack together, until he does and there's a huge security flaw that leaks all your customer data.


This "learn to code" stuff is about labor costs, not employing people. Developers are expensive, having more of them lowers the cost per.


The article's main point is solid: Learning to code is hard mostly because coding is hard -- not just because there aren't enough learning opportunities and not just because we aren't welcoming enough. And learn-to-code merchants who say "Coding is easy!" are a bit untruthful in the infomercial kind of way. As those of us who do it professionally know, coding is often tear-your-hair-out difficult. Misery loves company! :-)

That said, I have two problems with the article.

#1 - I don't like the idea of qualifications. Sure, the lack of career-path guarantees sucks, but that anarchy also benefits us. If I can get my hands on a computer, I can learn to code on my own (with lots of hard work, yes), build what I dream of, change my life. I can sidestep red tape, bias, prejudice, and credentialism that might work against me elsewhere.

#2 - I dislike the vague word 'aptitude', which the author uses many times. The idea of 'aptitude' may help distinguish Mozart from Salieri, but not Salieri from his cousin Fred. What I mean is, at the level most of us operate at, mightn't factors like motivation, persistence, and health affect us more than 'aptitude'? If the article replaced the word 'aptitude' with 'motivation' I'd like it better.


Hard programming is harder than you think. Coding schools are mostly teaching CRUD web development and a watered-down version of data science aimed at business analysts, which isn't that hard. You're not going to get folks lining up to take an embedded systems, graphics, or compiler bootcamp.


Web development (it's more than just CRUD) is hard. Even with the best web development framework, the state of the art in tooling, you're looking at at least a year of focused study before really being able to take a job.

It doesn't require hard math, but it's still hard in that the sheer number of languages, tools, best practices, technologies is daunting.

And they keep changing. My father is an electrician, after learning the ropes from him, I went into low voltage, which he wouldn't learn how to do because it "keeps changing", meaning you had to take a little bit of time every year to learn some new things. Full stack web developers have to take significant amounts of time every day to learn new things.

I've seen devs who were perfectly comfortable with all the math and "real dev" practically break down when presented with a web project. More than one of them admitted to me after beating their heads against it for a few weeks that it was harder than it looked.

I can understand if you can't appreciate the difficulty. But try taking on a significant project before calling it easy.


I agree, strongly. Lately, I've been involved in the shift from server-side MVC with a sprinkling of javascript to web services API with javascript based front end. I'm inclined to to with rails-api, and probably Ember on the front end, but it's a moving target, and I tend to agree with people who say this has led to a very complicated stack with too much duplication (routing on front and back end, and so forth). But should I use React, Angular? Should I write the backend in node? My current guess that the trend toward "isomorphic" systems will probably resolve this, but again, that's just a guess.

What can I say? There is a tremendous amount of reading, trying, cursing, debugging, evaluating, forecasting what will be valuable later. Some of it is churn, true, and it is unnecessarily complex, but what isn't? (tax law, anyone?) Simplifying things is in itself a huge organizational, social, and mental challenge. All in all, it's pushed me past the edge of my abilities, and I constantly feel very ordinary in this field.


> I've seen devs who were perfectly comfortable with all the math and "real dev" practically break down when presented with a web project. More than one of them admitted to me after beating their heads against it for a few weeks that it was harder than it looked.

Because they haven't done it before.

Hard because you have to learn the framework of the week, deal with shitty tooling, and leverage design skills you haven't ever really had to develop is a very different thing than hard because you have to design and build a complex system with strict requirements and intractable problems.


> hard because you have to design and build a complex system with strict requirements and intractable problems.

That sounds like web dev. The intractability of the problems comes from the fashion-like nature of how often things change and the speed at which they have to change. The more you learn, the more you can do, but also the requirements will change as a function of your abilities. Maintaining an business advantage demands it.

The framework doesn't have to change, the tooling can be self-designed, the design skills can be learned, and web dev remains hard and interesting. I understand that lots of devs don't appreciate it, but I still find it interesting after 5 years, and expect it to remain so after 20.

I liken it to a craft, take woodworking as an example. Sure, anybody can learn to bang nails into wood. But the way you hit a nail into a piece of wood the first time is going to be way different than the way you bang it in after 5 years, and it's going to be a totally different experience to the way you bang it in after 40 years.

There's a definite craft to choosing frameworks, growing tooling, and fashioning design to solve interface problems.

Is it as hard as hard math? No. Is it harder than 99% of people can do at all, and harder than 80% of software developers can do well? I fully believe so.


It's a different kind of hard. The kind of hard that can be learned if you keep doing it. Yes, there are many technologies involved, but most of them are pretty straight-forward and documented. There is also a huge number of 3rd party resources and tutorials. I'm not saying it's easy, but if you read for long enough, you can understand it.


I can appreciate the difficulty - I'm a full stack web developer by trade, and I've built multiple full stack web app side projects (everything from setting up and deploying S3 on CloudFlare, issuing IAM Amazon permissions, to writing React, all the way to Elixir modules calling C scripts). As @lukaslalinsky pointed out, it's a different kind of hard.

And still, given all of that, my head spins about the idea of building a compiler from scratch or writing MIPS.


God yes, the orgy of tooling and frameworks to do web development... I farking hate it, and I do this for a living :) That hamster threadmill of web development is pure self inflicted torture.


I agree with the author that boot-camps and the learn-to-code attitude teaches people generally that they could easily "do it if they wanted". This is slightly different to the intended message which is "you should do it, we can help".

Historically for me, I'm sure that kind of attitude pushed my clueless bosses into thinking I'm some kind of semi-skilled lackey that can readily be replaced with outsourced staff or graduate hires. It's kind of a self feeding one, because if they do outsource it works for a while, until a kind of critical mass happens and it starts falling apart. The confirmation bias after making this call also makes it almost impossible to undo.

I'd disagree on one point - and that is that programmer is a synonym for software developer. It's one thing coding yourself up some scripts at home, another thing altogether building a reliable, scalable technical solution within a (possibly large) team. All software developers are programmers, but not all programmers are software developers.


I loathe these type articles.

They're complex arguments to justify the attitude that "only we chosen few (men) with serious tech degrees are gifted enough to do important work in code."

Tech is a big, prosperous industry and will be bigger if we act welcoming rather than creating complex arguments to protect our turf.

Disclaimer: Am a white male with a CS degree who runs a coding bootcamp.


Actually the article very clearly says that the majority of professional developers don't have 'serious tech degrees', and that a large number of those that graduate from such degrees can't code. it makes the argument that there aren't any artificial barriers to entry, it's purely about aptitude.


From the article:

> 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.

I'd say he's arguing about getting more of the right type of people into the field, rather than pretending it's something anyone can do, and getting the wrong type of people into it.

If we (as in software developers) were trying to "protect our turf", all we had to do was to continue with what we're doing. The new candidates will be terrible, the potential good candidates will be somewhere else, and we'll be "safe" atop the knowledge tower we built.


The article arguments for the very opposite. Did your bias prevented you from reading it till the end before commenting? :)


No. The last paragraph of the article: "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." This is very clearly another (tasteless) "we chosen few" type article.


When I was a young man, I dreamed of being a center for the Boston Celtics. Unfortunately, my growth spurt stopped at 6'3", rather than the 6'8" or 7' that I'd need to have a chance to even attempt it. I practiced my skyhook for at least 10000 hours in high school, but I'd still get destroyed trying to post up on Brian Scalabrine or Brian Cardinal.

Sometimes, you either have the capabilities to do the job, or you don't.


Where are you getting the gender and race aspects from?

It's considerably easier to get a top-tier CS degree if you're a female or a minority.


Did you even read the article? It makes while not directly opposite pretty close argument to that. It literally says that software development is a less respected industry than it should be and that aptitude can be anywhere not just the few well off privileged elite.


This article reflects my experience at University very well. I'm a self taught programmer that ended up pursuing a CompSci degree. I'm in the last semester of my BSc, and in hindsight I should have studied something else, like Physics or Electrical Engineering.

The standards are ridiculously low. Most of my coursemates (final year CS students) are literally unable to write software. They can write a single-file cpp file in Code::Blocks on a good day. In my experience (and having talked to plenty of other CompSci students, their experiences are similar to mine), formal education in programming is generally reduced to teaching students all about recursive functions, bubble sort and those kinds of things. There has been a grand total of 0 lectures or labs about unit testing, version control, API design, interoperability, etc. Let alone trying to communicate the idea of "clear, maintainable" code. Only a very small minority of people can write code, yet most of us will graduate.

I have a module called "Software Quality and Process Management" (formerly known as "Large Scale Software Engineering". Good thing they changed the name, at least now it's not such a blatant lie). In this module, we learn all about COCOMO, and how we should estimate the number of lines of code a project will use, and use that to figure out how many man-hours are required to complete it. WTF. I'm preaching to the choir here, but that's like estimating the amount of effort it will take to design an airplane based on the number of grams of aluminium in it. When someone raises their hand and disagrees about the relationship between SLOC and person-hours (or even about whether person-hours is a reasonable unit - it's not), the lecturer responds with a blanket "you're entitled to your own opinion", but draws blanks when asked about whether they know anyone who actually uses these methods in real world software engineering and finds them useful. It's the same story when they teach about the waterfall development process and other similar outdated practices that are known to be detrimental to healthy software.

The vast majority of what I know about software engineering didn't come from my time at University, and almost all of the software engineers I know have had a similar experience. I know correlation does not imply causation, but it's definitely food for thought.


This matches my experience. I was trying to hire a junior programmer, and got someone in for interview who ostensibly had a first-class CS degree from a Russell Group university, yet could not explain to me what Functional Programming involved. He didn't even recognise the term.

(Incidentally, the university refused to corroborate his degree, on the grounds that it would be a breach of the Data Protection Act, which boggled my mind).


> junior programmer

> could not explain to me what Functional Programming involved

See that first term, give him/her a break.

I've worked with experienced devs with many year's experience who couldn't explain the term functional programming, yet practice it every day. Just because you don't know the fancy programming term du jour, doesn't mean you aren't capable or competent.

Turns out I've been using the functional programming paradigm since 2001. It wasn't until six years later I discovered there was a name for it.


From a non-CS degree perspective (on the hiring side), it seems that CS undergrad is meant to produce CS professors. Most (yes, MOST) have never touched anything higher than C++. While fundamentals are great, teaching them to the exclusion of immediately tangible skills does a disservice to people who are effectively paying $200k for a ticket into the working world. The reason we consider boot campers is because they typically have a work background demonstrating an ability to be useful as well as a recent educational background demonstrating an ability and willingness to pick up foreign tasks.


I went to back to University after working after working as a professional programmer for about 5 years.

What I learned in Automata, Discrete Math, Algorithms, and the other more theoretical classes has been worth it's weight in gold.

The things I learned in "Software Engineering" on the other hand, not so much.


>What I learned in Automata, Discrete Math, Algorithms, and the other more theoretical classes has been worth it's weight in gold.

That was my intention when I signed up for University too. However, I've only had two maths modules, and they haven't been particularly challenging.

One of the things I was looking forward to learn at University was hardcore cryptography, since I believe that's one of the few things for which getting formal, structured education is the best way to go. Sure, you can learn the fundamentals on your own fairly easily (even more so today - Stanford's online course in cryptography is very good), but you need to learn about attacks or you'll write code vulnerable to known problems like hash length extension attacks, ciphertext modification...

However, the only time cryptography was mentioned - at all - in my entire BSc was in first year, where we had a few lectures explaining the rudiments of RSA. Interesting, for sure, but pretty much useless without the remaining 80% of knowledge required to have a full picture of what's going on.


You might want to look at switching to applied math or computational mathematics if the CS program is lacking.


I have to go to a vocational college as part of my apprenticeship in germany and I am learning exactly what you described.

Guess what todays topic was? Software Estimates! (that includes COCOMO)

The teachers even acknowledge that the waterfall process is bad.

I don't really see the point of the vocational college. I am learning all the practical skills at the company already.


> The vast majority of what I know about software engineering didn't come from my time at University

I think this describes almost all undergraduate degrees. The only ones I can think of that go against this are the 5 year engineering programs, and I liken those more towards a masters than undergrad.


The unasked question is whether learning to code is only useful if you intend to be a software developer. I believe that the logic and analytic skills acquired from learning to code are useful throughout your life no matter what job you take.

The analogy people in my company like to use is that everyone learns to write, but not everyone becomes a novelist. Everyone learns arithmetic, not everyone is a professional mathematician. Everyone takes science classes in school, whether or not they intend to be a scientist.

Coding is pervasive enough that is is worth at least learning the basics. If you turn out to like it and be good at it, go ahead and pursue it as a job. Otherwise, those basics are just a part of modern literacy.


If a only a small portion of the population will be adept at programming, and training is less important, then it's likely that most of the potential talent does not have formal training incompetent science. Therefore, coding schools should give a second opportunity for those tho did not study computer science in a formal university setting. Learning to code may help reveal those very people.


I was a Math/Econ double major with a minor in applied statistics. I did the finance path for 6 years before choosing to go back and do a boot camp. I've done very well since then, although it's likely due to my educational background. None of this describes the average student, but I think my case reinforces your point about opportunities. If the program didn't exist, I'd still be trading equities and contributing very little to society.


I assume you meant, "formal training in computer science," not "formal training incompetent science". Autocorrect!!


Autocorrect has real AI now, complete with topic-relevant opinions!


On the one hand, I wish to concede defeat in this argument, that indeed this is a very British argument being made, one that is, essentially, "an excuse for class", whereby a subject requiring high-order adept facilities is available only to "a select few", 'because class system'.

On the other hand, beyond the borders of the colonial-imperial mindset, we have kids in the slums who - precisely because they were not given the 'golden ticket' of opportunity presented to a select few - had to actually .. you know .. do the work of becoming a very good developer.

Good developers are not limited by class.

(disclaimer; have lived and worked with many good developers around the world, and it has nothing to do with education and everything to do with spirit..)


I suspect that you have had very similar experiences to the author. The author is quite clear that education is no indicator of ability to program.

I think the author would be very happy admit your hard working very good developer friends into the set of 'good programmers'.


I think a large number of your 'self-taught' results come from the fact that developing software is a profession where you always have to be learning, or you won't be good. I have not met any programmer who has said competently (and who actually are) I know everything about X. There is always learning to do in this world, and in most cases, you are either learning as a group, on the job training, or self taught. To an extent, being self taught will fall into all of those categories. The people who show up to meet ups to learn are the ones who want to go home and experiment with new things and practice their craft. The programmers who expect to just learn something then shut off and treat their day job as a 9-5 gig are the ones who fall behind quickly and become 'bad'. This is not the industry that allows for that. For example, the Web right now is the wild west, 6 months ago you built something yet now, that's no longer the best way to do it.

Many other professions are the same way, even the doctor example. They constantly have to be learning to be great and the ones who stop 'learning' and teaching themselves are the doctors I wouldn't want to treat me.

I also see, across many professions, the ones who are at the top of their profession are the ones who have the ability to teach themselves. In college, you learn very quickly how you learn. Some students have a very hard time learning new concepts on their own, they must attend a lecture and have interaction with the professor. However, on the other side of it, some students get very little benefit from lecture. I would know, I was that way. In a lecture I would always be doing something else, that's if I even went to the lecture. I much preferred to teach myself, and when I run into something I didn't understand, I found the resources that made sense to me to understand something. This is what you have to do in the real world. Every student needs to have the ability to do this in any profession. There is no, 'I finished school, I'm done learning...'. You will be mediocre at your job at best if you have that mentality.

So yes, programming is hard, being a doctor is hard, being the top percent of ANY profession is hard.


Many "professional" educations require continued learning to maintain your license. While I don't think a "programmer license" is a good thing, a voluntary way of demonstrating this would be good


Coding requires a mindset that some people just don't have, or haven't developed yet. Ask any TA who has taught the basic "intro to CS" courses, and you'll hear lots of anecdotes which show that some people just don't get it.

Here's an example:

    Q: write a program that reads 2 numbers from standard input, 
    and outputs their sum. For example:
    First number: 3
    Second number: 7
    Sum is: 10

Here's a solution someone submitted:

    print "First number: 3"
    print "Second number: 7"
    print "Sum is: 10"


There was a paper published about exactly this, summarized by Jeff Atwood [1]. Essentially, there appears, according to the authors, that there is a mindset that people either have or don't have that allows them to understand the very basics (variable assignment, iteration, etc) before they've had any training at all. Students were tested before 3 weeks of education and after and the results were essentially the same: the ones that got it in the beginning were the same ones that got it at the end.

This supports the original article in one way by saying that it's not for everyone and bootcamps for the general public are not going to help much, but it contradicts the secondary point which is that we should be convincing potential doctors and lawyers to start learning CS. Programming aptitude doesn't start with intelligence or background, rather from something innate.

[1] http://blog.codinghorror.com/separating-programming-sheep-fr...


I really wish people wouldn't link to ten-year-old drafts without checking on current research. The article Atwood links to makes some totally bombastic claims - here's the retraction and clarification of them:

http://www.eis.mdx.ac.uk/staffpages/r_bornat/papers/camel_hu...

While a consistent mental model for things like assignment is a good sign, not initially having it doesn't mean you can't learn how to code. Lately, researchers have found that certain pedagogical techniques (especially pair programming) are pretty effective at overcoming these deficiencies.

I wish I could understand why so many programmers are eager to assume their skills are due to something 'innate'.


> Lately, researchers have found that certain pedagogical techniques (especially pair programming) are pretty effective at overcoming these deficiencies.

That's interesting. Its interesting to me, because -- while I may or may have developed the aptitude independently later without this -- I actually spent a lot of time when I was first learning programming, in elementary/middle school in the 1980s, pair programming (though, you know, the name wouldn't be coined for quite a while) with my dad.

> I wish I could understand why so many programmers are eager to assume their skills are due to something 'innate'.

One reason might be because if anyone could learn it, programmers wouldn't be able to view themselves as special.

Another might be because if people realized everyone could learn it, programmer salaries would fall from increased competition, so programmers have financial self-interest in people not believing that most people can learn to code if they try, especially if its true.


Everybody can learn plumbing too. Doesn't mean the prices are going to fall. Programming can be very fiddly, and most people hate that. I think our jobs are safe.


> Everybody can learn plumbing too. Doesn't mean the prices are going to fall.

Well, no, because "everyone can learning plumbing" is pretty widely accepted (and has been for quite some time), so the effect of that belief being accepted is already reflected in the current market price. (OTOH, the price is lower than it would be if it were widespread belief that becoming even modestly competent at plumbing required unusual innate gifts that most people lacked, and that attempting to learn plumbing was a complete waste of time for people lacking those gifts.)


I appreciate the update you posted, I'll definitely read it. The paper mentioned just stuck in my head and it didn't occur to me to research it in-depth before posting.

> I wish I could understand why so many programmers are eager to assume their skills are due to something 'innate'.

I'm not eager to assume that but it lines up with my experience over the years learning how to program and helping others do the same. It seems like it comes easily to some and harder or not at all to others. When I first read summaries of that study, it sounded correct based on my experience.

Going a little further ... I will say there's something enticing about thinking that you have a special skill that others do not and that you've found purpose for that skill. It's a bit like "finding your soulmate" in a way. I think a lot of us, myself absolutely, want to find that thing that we're good at and were made to do.

Might also be good old fashioned ego :)


Well, maybe I won't read it ... requires a login


I'm currently in an undergraduate program for Computer Science at the University of Wyoming.

At my level (third year Computer Science classes), I've had the following class composition:

- 2 classes dedicated to learning C++ (COSC 1010 was skipped, but included here for numbers, and COSC 1020)

- 2 classes dedicated to algorithms in C++ (COSC 2030, 3020)

- 1 class dedicated to math (COSC 2300, discrete structures)

- 1 class dedicated to functional programming (3015) (mostly proofs related to recurrence relations)

In the future, it looks like my courses will be filled with networking, operating systems, compilers, and a couple other math topics.

The problem is that most students only get a very foundational introduction to programming in this program. Students are tasked with writing code, but only limited quantities in very specific areas. That's algorithm development and implementation.

The answer might be that students should be taking software development or some other degree, but right now CS is the route most students try to take to become developers. This isn't a good approach, because at the end they have very little development experience -- only some algorithms and knowledge of computers.

I too would answer with "self taught" for how I learned to program -- definitely not from this program thus far.


In my opinion, it is very easy to teach the basic principles of software development and design. Algorithmic thinking is much harder to teach. A CS background sets you up to contribute ideas and produce efficient solutions to challenging problems. A software development background sets you up to implement ideas and solve problems quickly.

Obviously these are generalizations, but that's what I have seen in my experience.


" The majority of the population can not learn to code at all, no matter how much training they receive."

What an arrogant, false, and self-aggrandizing fiction. Stop over-valuing yourself -- coding isn't some ultra-difficult natural selection process equivalent to winning an NBA Championship.

Designing complex services, scaling and maintaining them on a server stack is hard. Developing, training, and shipping a useful deep-learning network and making it into a useful product is hard. Coding is not hard.

I get sad when engineers, especially ones who's tone seems vaguely threatened, start writing up these discouraging blog posts belittling 'noobs'. Its a pleasing fiction that software engineers are just 'naturally better' and therefor their jobs are ensured. I think that anyone who says this has likely not been in the industry for very long -- because they would have seen scores and scores of devs left behind due to not training up and getting beaten out by upstarts who teach themselves and do well.


First, I agree that the statement presumes a lot without offering any evidence. Second, I essentially agree with it; I believe most people cannot code and can't be taught it.

Coding requires a turn of mind that at least half of the population lacks: abstraction. You must be able to map a problem space into a form that is amenable to decomposition and solution using data and instructions. I think most technically inclined folks would be surprised how many smart people lack this ability (like doing basic high school math). Many others lack basic skills in logic, or the ability to define a reliable procedure. (I say this after 60 years of life, working in both white collar and blue collar settings). It's not that these people are stupid. Their minds just don't welcome abstract thought and the hierarchy of formal sequential models that is code.

In my experience, the set of skills peculiar to writing software well is surprisingly uncommon.


Coding is, in fact, quite hard.

But that doesn't mean no one can learn it.

Playing the saxophone is quite hard but a lot of students learn how every year, to varying degrees of skill.


You're right -- the finer point seems to be that coding is not a binary state. Its a lot of things along a spectrum and a lot of people make money at all points.


I agree that the statement "The majority of the population can not learn to code at all" is very questionable: what is the basis of that assumption ?

Are there studies that took n people from different backgrounds, completely unfamiliar with coding, and tried to teach programming over the course of several weeks/months, and found that the majority were not able to get to an acceptable level ?


Coding stuff that works 100% of the time in a budget constraint is not solely about being up to date in useless new technologies.

Using the world "stack" in your assertion is just showing a belief in the idea there is a silver bullet that can help you do 90% of the job in 10% of the time. And following that idea the 10% remaining I guess maybe shot dead with some agile process.

However, it is not the case when the specifications are clearly having ambiguous non resolvable issues.

Your stack sux big: the cloud, the OS the internet itself have design flaws. Each of this layers in the stack is adding coupling (requirements), costs, surface of vulnerabilities uncertainties (thus diminishing SLA).

Building a complicated architecture by taping a stack is easy. You just hire 23 yo coders saying they can solve any NP problems because o notation are old, thus boring, thus deprecated. And then you have your never ending shiping date coming until your "new feature of death that is based on an un solvable problems" will not ship.

Thus, a cost matrix for True,False/positive,negative like in signal processing used for assessing costs of software is still a freaking good idea. But it is hardly self taught.

Related to this is QA. Measuring non conformities and their costs. This part is the most overlooked. It is where business is done. Non conformities are non predictable by nature, but my experience is that during the lifecycle of an application that is where most of the money is spent. It is hardly self taught. Part of a boring curicurlum.

Petri diagram (State-transition diagram): I met no coders able to read or write them, especially in asynch programming. And they love to add states (for each new states there is n + 1 new transitions possibles added to the diagram). Part of the education in electronics.

Documentation: new developers don't know how to write or read. A craftsman provides words with definitions. Coders don't care to properly put down definitions: it is too waterfall/ISO/ITIL heavy processes. Believe I had to fix a code where a developer confused a shit of paper with a page increasing costs by 2 for customers. Reading and writing in french and english where mandatory in my university. And it was boring.

Legal: IP does not say copy pasting code from internet to put it in your code is OK. For instance code on stackoverflow is not open source. You cannot do free sofware on your work time and claim it belongs solely to you without any explicit agreement from employers. IP requires teaching.

Actual coders jumping from one technological sect to the others (RDMS, node, GO, nosql, async, OOP, functional, POSIX, unikernel, container) are nothing else than monkeys or mechanical turks.

I refer to Feynman what is science essay regarding the monkeys. Being able to make a 100$/month web server make a nice hello world in angular JS is not what makes economy better. Building is a thought process that must encompass the investment, the costs of operations, the time to market, the legal and financial risks, the control of defects and the measure of the conformity with the requirements.

IT has became a religion where consensus prevails on the technological tools being the solution. Forbidding an in depth analysis that would be conflictual about the adequation between what people wish (being coder to pay the bills because we are lacking of jobs and it is well paid) and what the economy needs (stuff that works better for less bucks).

Yes being a programmer is either being born by luck in an aristocracy that need no excuse or a fraud that needs to secure is paycheck by pretending to have an added value.

Remember people are having student loans. They have an incentive to perseverate in a way they constantly fail.

People are not altruistic by nature when it comes to their own beefsteak (or tofu). Education bubble is creating a toxic situation for which corporations are not the answer (who will watch the watchmen?).

We have over instructed (in technology) under educated (in humanity and science) masses of students that sux because their abilities to speak, write, reason and communicate is hindered by a deficient education that forget to make them think and argue like grown ups.

It is not an IT bubble we are facing, it is an education bubble that takes its roots in the 1980s and for which the future of yet 3 generations is engulfed both in debt (public in Europe, private in the USA) and in failures (high unemployment rates because organisational structures did not adapt to the qualification like toyota did).

Education is not a good. It is a necessity for a sane society. And modern education fails at delivering adequate citizens. However it delivers numerous cheap incompetent interchangeable obedient workers preventing a power struggle inside the structures.

Saying NO to bullshits is the first added value of a coder. And saying NO when everybody says yes is disruption, it can lead to innovation and progress.

At least hire me, it leads to less costs (KPEX and OPEX) :)

PS I do have too much time.


I could not disagree more on the notion that software developers are looked down upon. In my experience, all those developers are treated as omnipotent. Having intelligence on another level. These are the people who wear hoodies in the elevators, and carry around a Macbook, while everyone else is forced to wear business attire (along with faces of misery and non-excitement). These developers are the people that created Facebook, Twitter, Netflix, etc and are known to have lots of cash, but never flaunt it. The same people that are seen headed to the bars with their team, and enjoy the freedom to code from anywhere that has Wi-Fi. Maybe it's just the fact that I've only ever worked at startup companies, but other professions are seen as simple, and clear cut as to how to go about it. "Oh, you're an accountant? Anyone can do that, just go to school, follow the steps, and a degree awaits at the finish line".


> In my experience, all those developers are treated as omnipotent. Having intelligence on another level. These are the people who wear hoodies in the elevators, and carry around a Macbook, while everyone else is forced to wear business attire (along with faces of misery and non-excitement). These developers are the people that created Facebook, Twitter, Netflix, etc and are known to have lots of cash, but never flaunt it

Not being rude, but I'm trying hard to figure out if this comment is parody/sarcasm or if you genuinely believe this fantasy?


I'm a bit torn on this one. Some languages and concepts are harder than others. Some people are more visual than others. Some people would excel in low level languages where others would excel doing front end web dev where things are a bit more visual and often a bit less abstract.

The biggest thing with coding is finding something you like... Passion is the key here. Some things will come easier than others but if you're passionate, even if you're not a bloody genius and it takes you many times before you get something, you'll spend enough time and eventually get it. And over time you'll get better and better.

In 12 years working in the field I can say I've worked with a fair amount of devs. I've worked in very small software companies, medium sized companies and fortune 500 companies. I've worked with self taught devs and people with degrees. The biggest difference between someone who's great at their job and not is not the education but the passion. Its not even the book smarts. Some people are smart as hell but just aren't passionate and don't enjoy what they do at all. Every year your job feels a bit different. Languages evolve, technologies evolve, libraries and frameworks evolve. You're constantly working with new things. Some don't feel 100% different, others do. Once you've learned a bunch, some new concepts are very easy to grasp. But at the end of the day, if you hate it, you probably won't keep up and will quickly be obsolete. Most new jobs will require a lot of learning. If not new languages then new processes, infrastructure, code bases, etc. If you're passionate enough to keep learning and patient enough to spend the time it personally takes you to grasp concepts, then you can learn.

Its not for everyone. True. But not everyone will be developing physics engines for games or deep learning algorithms.. Some coding skills are easier to grasp than others and most people can, given time, become decent at some of it.


> 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:

... and it only takes 10 years to become a doctor.


Like scotty79 says, at least you know what you're doing in those ten years. Perhaps an easier analogy would be a lawyer or engineer (ABET degree + coop)? For programming, you get the following "advice":

* Get a degree

* Don't get a degree, go to a bootcamp/teach yourself

* Do side projects

* Get an internship

* Network and go to meet ups

* Learn algorithms and data structures

* Practice brain teaser questions

* Learn these languages

* Learn these languages' frameworks

I'm exaggerating and people can get hired by not know all (or any!) of these, but you get my point. It can be a confusing and overwhelming path both for people who want a career change or are graduating from university.

For some, the path to being a doctor is "easier".


So you basically are set up for next 10 years. No more doubt. No more decisions. Probably good choice for smart people who have trouble with answering the question "what do you want to do with your life?".


On the contrary, evidence suggests that people naturally learn to code when faced with operating a programmable device (even if they don't know what they're doing is coding). Everyone pretty much had to be able code to operate a computer in the 80s. And they did, even lowly secretaries with no fancy degrees. Now that people have to deal with closed-down computer systems that come prepackaged with everything the user is supposed to need, the coding is not necessary to be able to operate them. And then of course you get a generation of people who aren't motivated to learn to code, because they don't have to.

"Can't code" is the new "can't do math". What it really means is that the person doesn't want to code (or to do math), not that they cannot do it.


The article makes good points but is a little harsh... of course mastery takes aptitude and practice and it is ridiculous to think that you could learn anything even remotely complex in an hour or a day.

But the "learn to code" efforts that are referenced serve the important purpose of exposing people who might have aptitude to the idea that they can realize that aptitude. I imagine that people without the prerequisite aptitude would just quit because it wouldn't interest them, and those who can cut it would continue on auto-didactically. I'm not trying to be too critical, but criticising those efforts with the idea that "it is hard, you probably can't do it" is unhelpful at best.


Does anybody else think that Software Engineers might benefit from a master/apprentice learning style?

Experienced devs could take on an apprentice for a year, kind of like an internship, and the apprentice moves does 3-5 of these before moving into a dev role themselves.


Yes, Robert "uncle bob" Martin is a fan

https://8thlight.com/apprenticeship/


> 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 my humble opinion, this is because the pedagogy sucks. Intro CS classes tend to teach in a very weird way, with very conflicting goals. Is the point to teach your way around a linux shell? Tooling? Basic programming? Algorithmic thinking? Good engineering practices? To teach automata theory? Complexity theory? Most courses answer "ALLLLLL OF IIIIIIITTT!"

Further down the article, you see that there is a large percentage of self-taught programmers. I suspect that this ratio goes through the roof if you ask "have you done a lot of CS / software learning on your own".

This is because self teaching lends itself better to learning and practicing over and over the diverse variety of skills required to be a successful programmer. Intro classes go very quick and fail to instill any of that. So those who are successful are a lot of times those people who are already long exposed to computers, algorithms, programming or the ideas accompanying those in some shape or form. Or those who find it immediately fascinating and put in much larger amounts of time than a course would normally require.

Those folks who simply haven't had a lot of time programming struggle, and eventually they drop out. And nothing changes to improve this because part of the class succeeds, and thus the conclusion made is that the part that dropped out must have been "bad".

There's a false dichotomy here. Yes, programming is difficult. Yes, being successful in the real world requires a lot of work. And yes, like any craft, the rabbit hole only goes deeper. But the conclusion here isn't that most people just "don't have the aptitude necessary". Most people, given the same time and guidance, can succeed.

The most important part is that getting somewhere immediately /useful/ can be quite quick. That's where programming shines - reasonably low investment costs for a moderate benefit for a lot of people, which eventually rolls into a high investment cost for a massive benefit.


>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.

Outside the obvious lack of definition as to what a "programmer" actually is, this is a non sequitur (the conclusion doe not follow). There's an assumption built in that those who do possess a high level of aptitude already have CS degrees or are self-taught because it comes to them naturally. What if there are people who possess that high level of aptitude and they want something to help them learn in a structured way?

Extrapolated, the author's argument could be seen as, "Sorry, there's no point in teaching programming, because everyone with the aptitude to program already knows how to program," and I think that is a recognizable falsehood, if only anecdotally.

In other words, even given the assumption that programming does require a higher aptitude than some subset of the population does possess, there is no surefire way to determine who that subset is based on credentialing.


The lie they are selling is that anyone can learn to code in 10 weeks. While this maybe true if you are targeting the correct subset of the population (those who do have a natural aptitude), it's not true of a random sample of the entire population. Since these schools sample from the entire population, their chances of producing large numbers of skilled software developers are low, and therefore they will do little to help with the shortages of those developers.

Sounds like a reasonable argument to me.


I don't think anyone pretends like you can "learn to code" in 10 weeks any more than I "learned to speak Russian" in my three-month intensive Russian course. Of course I didn't speak fluently by the time I left.

But I learned enough that when I lived in Ukraine I understood a bit of what people were saying, I could communicate somewhat, and a couple of years later I was reading Tolstoy.

People think about bootcamps all wrong. You don't leave like "holy shit I'm a master programmer." You leave knowing, "OK, it'll take a while longer, but I can contribute a bit now, and I'll pick up more as I go."


There's a lot of back-and-forth over whether it is easy or not or whether one comparison or another works best.

I think it's fine to compare learning to write code with learning to write human language. The best of us will still make mistakes; plenty of us will always be incapable of writing well. Once upon a time the idea that everyone needed to know how to write was laughable. These days, it's arguable how well everyone needs to be able to write, but there's a general agreement that it's worth giving people the opportunity to reach at least a basic level of competency, even if their daily lives require little writing.

I had a miserable time learning to write (i.e., failed many assignments) until a few things fell into place, and I saw how writing could be an important part of thinking, learning, feeling, expressing, etc. I had a miserable time learning to code through coursework in highschool and college until a few things fell into place and I saw how code could be an important part of thinking, learning, feeling, expressing, etc.

How did/do we sell everyone on trying to learn to write human language? AFAIK, with some superlative rhetoric about how useful/necessary writing can be without much dithering over what portion of the population will ever be good enough to make a living at it.

So there are varying levels of irresponsibility when it comes to saying everyone should code. There's probably a big potential social upside to fudging things a little to suggest everyone should learn some programming throughout school; it's much more negligent to tell someone with a boring but stable job to quit and blow a few grand on a coding bootcamp without an inkling that they're prepared.


> All the evidence shows that programming requires a high level of aptitude that only a small percentage of the population possess.

No such evidence, at least not in any respectful sources.

> will do nothing to help the skills shortage

Who said that this is the immediate goal of teaching as many people as possible to code?

> Given the skills shortage one would expect graduates from computer science courses to have very high employment rates.

This logic is broken on so many levels that it's even embarrassing to comment. Let's start with a trivial nitpicking that Computer Science education got nothing to do with the Software Engineering.

> 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

It is really embarrassing that the guy who wrote it calls himself a programmer - i.e., someone who is supposed to be logical and rigorous.

There are far more categories that these two. And the most important category, targeted by all the programmes he's mocking, is the people who do no even know if they'll find programming enjoyable, because they never tried.


Where was the proof presented for this? That idea doesn't sit well with me at all. Maybe they meant to say that it's hard for most people to want to sit still and stare at text all day. It's hard to ignore urges to go out rather than stay inside and read tutorials on the web.

I don't think programming itself is hard. Most people program. It's just that they do it without thinking about the steps they're programming, and they do it without a computer. Parents program all the time, "If you don't finish your homework before 7 PM, then you will not get dessert!"

I think this is an article, and one with votes on here, because it's flattering the audience. Maybe say complicated mathematics is hard. But not "coding". That's what dumb people like me do who prefer to stay inside and play around with text on a computer. Of all the possible jobs I can think of, coding is near the bottom of the list in terms of difficulty. Anything involving a jackhammer is much rougher.


Your perspective is incorrect.

I've made my living by teaching beginners to code. I have been doing it for the better part of two decades, and I specialize in teaching students that have little aptitude for it.

I make my students code FizzBuzz. It is literally the 106th project I make them do. That is, they have completed 105 complete computer programs before getting to FizzBuzz.

And many of them still struggle with it. The nuance of else/if needing to be ordered in a certain way is something they still don't have a good grip on.

Programming a computer is very very hard for most people.


The ill-conceived notion that parents giving children procedural instructions is somehow like programming brings me to a question for you as a teacher.

I've noticed that the industry really prides itself on algorithms and this is commonly reflected in interviews.

However, it seems to me that merely discussing algorithms, however clever they might be, is actually an intuitive human activity not unlike the example of the parent verbalizing procedural instructions to their child. Therefore, I would argue that algorithm design, though clearly an intellectual challenge in its own right, does not target the essential part that makes programming hard and inaccessible to so many people. (Disclaimer: a high-level algorithm discussion is usually followed by whiteboard coding, which I'm ignoring in this critique as a separate kind of activity).

Do you agree with this claim that algorithm design is not actually the thing that makes programming so difficult for laypeople? Can you give your take on what does make programming hard or what students struggle with the most?


I think algorithm design is hard. Most students/people can't break down a problem into small enough steps for the computer to do them.

Are you familiar with the concept of "chunking" in memory research? Well, computers don't chunk but humans do. Humans tend to think about their algorithms in terms of the chunks they already know, but for computers sometimes each chunk has to be broken down into much smaller sub-steps.

And that's non-intuitive and hard. When explaining stuff to a human you get immediate non-verbal or sometimes verbal feedback if they don't understand the chunks, but computers just give a syntax error.

SECONDLY. Students have trouble making an accurate mental model of what the computer is doing at each step, so they can't trace through the code, much less create new code.

Those are the two biggies, in my experience.


It sounds like what you're describing is not figuring out at a high level what to do, but formalizing that into low-level instructions for a computer. This goes exactly to my point. What I meant by "algorithm design" is strategy selection, which I want to be careful to separate from strategy formalization for a computer. It is the latter that I think laypeople struggle with the most, however, the fascination with algorithms often drives attention to the former. For example, it's easy to be impressed by the cleverness of binary search, but it's actually relatively straightforward to understand as a high-level concept. The harder thing for a layperson is to formalize binary search into a working set of computer steps. I think there is a certain cognitive bias at play, where the formality of fine detail seems lowly and menial, so we want to skip over it, in spite of the fact that it's actually the biggest hurdle for most people to overcome.


> Where was the proof presented for this?

The evidence presented is fairly poor, and consists of:

(1) failure rates of university first courses in programming for majors (which could indicate how hard it is to learn programming -- or how poorly designed university first courses for majors in the field are for the audience they attract.)

> I don't think programming itself is hard.

Actual coding isn't all that hard, once you have the foundations. But structured problem solving is a key foundation, and isn't all too often deliberately and effectively taught outside the context of programming (and, unfortunately, often isn't effectively and deliberately taught with programming, either, but programming seems to be the most common context where it is taught.)

> Most people program.

I don't think that's even approximately true. Most people do not plan out detailed step-by-step process from inputs to desired outputs that are expected to be successfully implemented by an execution agent that is perfectly literal and exact and exercises no independent judgment and has no ability to fill in the blanks and do what you probably meant given their understanding of the desired outcome even though you failed to specify it.

Even preparing step-by-step procedures for human agents is hard, not done a lot by most people, and done poorly by most people who do it, because most of them do so without good training.

System/process analysis skills that underlie both programming and procedure development may not be hard, but they are not skills that most people are taught effectively.


Many politicians and policy makers think that anyone can become an engineer of any kind with just a course of a couple months. Good example is the politicians who argue that a high influx of Syrian refugees can solve the lack of available IT and mechanical engineers in the Netherlands. It doesn't matter that they don't speak the language, it doesn't matter that they have no engineering education, it doesn't matter that they don't have any experience. Anyone can do it right?

Being an electrical engineer is just connecting 2 wires, right? Being a programmer is just booting up your text editor, right?

Becoming a good programmer doesn't require a degree but it helps to set a good base for your knowledge. On top of that you need thousands of hours of self teaching.


In this matter, I'm not with the "everybody should know to code" camp. I believe people, ordinary do not need to do any task with computers or even if they do, they need not to teach it to the computers.

This movement will create a few good coders from children, but also make more haters against the profession.


Driving is hard. Or not. Driving an F1 car is hard. Driving an 18 wheeler is hard. Driving a Fiat is not. You can probably learn to "move" an 18 wheeler or an F1 car but bets are off whether or not you're going to go on to win any races. Have I run this analogy into the ground yet?


For the most part I agree. However, part of the reason why other professions like "doctor" or "architect" don't permit crash course bootcamp-style training for its entrants is because, for the most part, the stakes are much higher. Sure, there are lots of high-stakes programming jobs, but for the most part, being a bad programmer won't kill anyone.


I developed a website for anyone to practice their HTML, CSS, Javascript coding skills. It is a quick, user-friendly single webpage creation platform without having to deal with hosting or registration. Feel free to practice or make permanent pages. Feedback welcome! http://mypost.io/


TLDR:

I'm a self taught coder, due in part to the recession of 08. I would encourage anybody that has a desire an passion to learn, don't let anybody discourage you as there are a lot of "negative nellies" floating around out there.

If your long term career goal is to be CTO at a big company, then you should probably go school. Other wise there is plenty of room in the market for all types of developers/codes.

http://www.businessinsider.com/jack-dorsey-on-programmers-20...


I hate the hype about coding. It's not for everybody. I only code when i need to solve complex problems or design a product for money or my use.


I am really entertained by the note that there are high barriers to entry to learning to code. Almost all coders I know are self thought or chose a school as an afterthought because they were experimenting with coding from early age.


So large percentage of programmes are self thought (including me) yet I had to lie on my applications to companies that unanimously asked for a CS degree.


A lot of the observations in this article are very interesting, but personally, I drew different conclusions.

The first one is the main thesis of the post which is that some people have an innate ability to program that others do not possess, and that this is a thing that cannot be learnt. As a result, telling people that it is "easy to code" is a lie.

Firstly, it is actually not clear to me that this ability to pick up programming principles cannot be taught. All we know is that our current methods of teaching yield a double hump distribution for programming ability.

Secondly, if people were actually saying "you will find coding easy" to anyone and everyone then I agree that they are probably concealing the truth. But actually, if you read the tagline on the example given (The Year of Code initiative) it says:

> Start coding this year, it's easier than you think.

"It's easier than you think" (emphasis mine). This is quite a different statement to a flat out "it's easy", and it's one I agree with. To most people, coding appears difficult because they simply don't know the answers to a few key questions (E.g. Where do I write the code? What do I do to run my code? How does the computer understand what I've written?). The (basic) answers to these questions are comprehensible to most people, and furnish them with the ability to write code (maybe not well, but that's a whole other story).

Next observation:

> Folks, which industries/professions give up their own free time to provide free/open training to people wishing to enter the sector? Curious

The fact that only the software development industry seems to do this is painted as a negative thing in the article. Why is that? I ask because this is a fact I think we should be proud of. I personally enjoy what I do so much, that I happily spend time out of my week, teaching it to others for free. I don't do this because I think all the people I teach will go on to become successful software engineers, but rather because I want to widen the net, and expose more people to what we do, because for some of them (maybe even just one of them) this might be their "true calling".

I got into programming originally from watching a cousin of mine editing the themes of his Wordpress blog. He went on to study English Literature and Psychology; To him, coding was just this tool that allowed him to publish his views, but to my 9 year old self, watching him, it really struck a chord and I was hooked. Now, there is not a thing in the world I could imagine myself doing rather than writing code and loving every minute of it (And no amount of "social status" is going to turn me to a life of law, medicine or architecture). What an opportunity I would have lost if I had not seen my cousin working on his blog... Every week-long learn to code course, and every "hour of code" initiative works towards bringing such opportunities to the wider public.

Finally, on the role of Computer Science degrees: I am currently in my final year of a Masters in CS, which I have also enjoyed studying immensely. I would not say that it has contributed directly to my skills as a software engineer, but the things I have learnt have changed the ways in which I approach problems. Very few people write structural induction proofs, loop invariants or abstract specifications to prove the correctness of their programs, but I have found them to be great ways to think about how to write better code. These skills, however, are complementary to those that make a good software engineer, not a substitute. There's no way to prove yourself out of a rat's nest of class hierarchies and control structures.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: