Stop saying learning to code is easy.
(The photo above was taken at the Microsoft NYC office of three amazing young developers working on their apps.)
I saw this tweet after the Apple WWDC keynote and had thought the same thing. Hang on, programming is hard. Rewarding, sure. Interesting, totally. But "easy" sets folks up for failure and a lifetime of self-doubt.
Hearing the WWDC keynote say coding isn't hard frustrates me. It's extremely hard. You're setting beginners up for huge disappointments.
— Tyler McGinnis (@tylermcginnis33) June 13, 2016
When we tell folks - kids or otherwise - that programming is easy, what will they think when it gets difficult? And it will get difficult. That's where people find themselves saying "well, I guess I'm not wired for coding. It's just not for me."
Now, to be clear, that may be the case. I'm arguing that if we as an industry go around telling everyone that "coding is easy" we are just prepping folks for self-exclusion, rather than enabling a growing and inclusive community. That's the goal right? Let's get more folks into computers, but let's set their expectations.
Here, I'll try to level set. Hey you! People learning to code!
- Programming is hard.
- It's complicated.
- It's exhausting.
- It's exasperating.
- Some things will totally make sense to you and some won't. I'm looking at you, RegEx.
- The documentation usually sucks.
- Sometimes computers are stupid and crash.
But.
- You'll meet amazing people who will mentor you.
- You'll feel powerful and create things you never thought possible.
- You'll better understand the tech world around you.
- You'll try new tools and build your own personal toolkit.
- Sometimes you'll just wake up with the answer.
- You'll start to "see" how systems fit together.
- Over the years you'll learn about the history of computers and how we are all standing on the shoulders of giants.
It's rewarding. It's empowering. It's worthwhile.
And you can do it. Stick with it. Join positive communities. Read code. Watch videos about code.
Try new languages! Maybe the language you learned first isn't the "programming language of your soul."
Learning to programming is NOT easy but it's totally possible. You can do it.
More Reading
- Programming's not for you? How about thinking? Be empowered.
- Please Learn to Think about Abstractions
- Systems Thinking: Less Coding, More Thinking with Kishau Rogers
- CodeNewbies - A supportive community for learning to code!
- Stock photo from WoCinTech Chat used under CC
Sponsor: Big thanks to Redgate for sponsoring the feed this week. How do you find & fix your slowest .NET code? Boost the performance of your .NET application with ANTS Performance Profiler. Find your bottleneck fast with performance data for code & queries. Try it free!
About Scott
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
About Newsletter
We can go into the details too: Graphical User Interfaces, a networked workstation that offered object oriented programming, mobility with the iPod and iPhone. Of course, all of this would not be possible without writing a single line of code, but you can write code but not have a decent vision.
For me, I will stay on the side lines and watch in amazement. I might try out Swift just to see how attractive is.
I've been doing this for over 30 years and I STILL struggle at times - mainly with the politics, but it's still a struggle.
But an amazingly rewarding one... at times...:-)
- You'll meet amazing people who will mentor you.
I feel like I read code, I watch videos, I follow the step by step guides but I can't get past this beginner level of coding and knowledge of knowing exactly what is happening with the code, to take the next step.
I also agree that code itself is difficult. All of the things Jon Biddell mention above are challenging as well. However I do disagree with his point that the code part is easy. I am confronted with challenges on a daily basis:
- third party libraries failing to function as documented. If they're documented at all.
- Tooling/compilers literally failing due to compiler bugs or bugs in the IDE (you do have a functioning IDE for this tech, right?) How can a new person know the difference between a compiler bug and their own mistake?
- The infinite idiosyncrasies of browsers across the absolute MASSIVE field of devices people use the web on. If you do web development on any serious level and don't find yourself confronted with annoying issues once a week you're either a savant or not working enough. And the fixes here are never obvious.
- Memory management issues. You haven't had a good time until you've had to resolve a heap fragmentation issue.
- Threading. Need I say more?
I think, as engineers, we have a tendency to take for granted our ability to read and write code. It's a bit like your native spoken language. You intuitively understand how it works. It is basically impossible to externalize yourself from that bubble and truly grasp what it's like to learn from scratch. You don't remember. You can't.
If you don't like to code it will not be easy, like if you don't like math they won't be easy either.
On the other hand if teached correctly almost 95% of the students by their freshman year in college would be proficient coding and in computer science, in the same way that almost 95% would also be proficient in advanced calculus.
Would all 95% that are proficient in advanced calculus become Nobel Laureates in physics or pursue a Ph.D. in math, physics or engineering, no. Would all 95% who are proficient coding get a degree in electrical engineering and computer science, neither.
But no subject is that difficult that someone can not become proficient at it if taught correctly (on the other hand if not done properly many (most) students will most probably will simply end hating anything resembles that subject.
Maybe they won't code much ever after but will have a background that will allow them with further inquiry critically assess the quality work and productivity of "professional" developers or better computer scientists.
Most people who will be saying that learning to code is easy will have benefited from having gotten aboard the train that much earlier, and will be the sort of person for whom coding is indeed easy.
These days if you write a web app you would need to know for e.g. Html, Css, JavaScript, C#, Sql with all the frameworks,libraries & patterns like MVC, Entity Framework, Bootstrap etc. As fast as you master something it changes or is redundant.
Just learning your IDE, source management and staging/deployment environments etc. is a challenge in itself.
If I was having to start from "zero" today, I'm not sure I wouldn't be quickly overwhelmed and simply give up.
I do feel bad for those who are given the wrong impression around coding though. Setting them up with high expectations and then them hitting the real world can be quite demotivating. All I can add is, if you've hit this step, keep going. You started learning to code for a reason, it might be difficult but it's worth it!
For example, I have extreme OCD. That's a double edged sword. It gives me the ability and thought process to make amazing things - but it also frequently makes it very hard to keep going and solve problems, depending on very random and often uncontrollable factors.
A lot of older programmers became such because they had passion and a way of thinking that lends itself to the environment. There's absolutely a certain level of what could almost be called masochism required to really get deep into it.
So for me, coding is really easy now but I had the benefit of a comparable easy start. At that time, the difference between the learner and the advanced pro developer were not that big and the stack was similar for everyone. Now, you have different target platforms (small embedded IoT devices, smart phones, tablets, computers, gaming consoles, cloud applications), different stacks and frameworks, connected applications that consume APIs that run in the cloud, etc. It is also very difficult to stay up to date with all technologies, because every "direction" is constantly evolving at huge speed and the day has not enough hours to keep up with everything.
I see this problem every day at work, because currently I am mentoring two new developers on our team who came straight from university but do not have the technological background yet. They do not have problems with basic programming constructs or the syntax of the languages but do have problems with the structure of the code and the necessary frameworks. Solutions for their problems are easy most of the time (for an advanced developer) but they do not have the skill yet to see it immediately. So I am trying to guide them to the process without giving them the answer directly (so let them make the mistakes first and then discuss the problems with the code and get them on track for a working solution).
Add to that keeping up with languages and frameworks, and receiving specifications that need more work, and some of the other issues others have mentioned. No one will learn to do any significant kind of code unless they love and are gifted at problem-solving creativity, logic design, extreme attention to detail, and sitting quietly at a computer for hours every day.
I've been teaching myself Python/Django since January and Javascript since last month. It's very hard, but incredibly satisfying when I get something to work or fix a seemingly intractable bug. Every day I look at code or work on a new tutorial I learn something new. Very cool!
And you're right about trying other languages. Really starting to enjoy Javascript. Might be my missing glass slipper! Shh, don't tell Python...
Exactly.
When people say it's easy, I think that's what they're trying to say but are doing it wrong. Maybe communicating is hard too...
I have always had trouble shaking the feeling that you were supposed to be innately good at coding or something. My husband can be told to do some google-interview style puzzle question and he will write it right out with best possible run time, significantly faster than I could. He's good at these sorts of things, and by comparison I'm really not. So I have always thought to myself "I'm bad at code." As such, for years I assumed that I would never be good enough for one of the "cool tech companies." Because I was bad at code. Because it was hard for me and code is easy for people who are good at it.
But this: "You'll meet amazing people who will mentor you."
At CodeMash last January I met Matt Johnson (the guy who does the date time stuff, I think you know him Scott). And he looked at me and must have thought to himself "well, this one isn't terrible, she just needs to be pushed a bit." Or something like that. IDK. Anyways, he got me involved in OSS, so I'm a collaborator on Moment.js now. And I love it.
And about two months ago I went back to Matt and said "hey, can I come work at Microsoft like you do?" And he said "sure, you'll be good at that."
Long story short, next month my family is moving from Minnesota to Redmond so that I can go work in Open Source Programs at Microsoft. I was good enough for one of the cool tech companies, or so it would seem.
Someone just had to tell me that I was able to do that. Because coding is hard for everyone.
So for me, create code is not that hard and is approachable by anyone (as you said) but you should always know that is going to be has hard as your project expect it to be, even more I would like that the clients know this when they ask you to change something....
PD: sorry for the bad English, I'm not native for the language.
As far as I see it there are two challenges:
*First*: If you aren't interested you are not going to learn it. We are trying to push coding as the ultimate solution to everything but not everyone has an interest. If you don't like problem solving programming is probably not for you (although my experience is that most kids love problem solving if they can just try solving it THEIR way, and not the way grownups tell them to do it)
*Second* We teach that "easy" equals "without effort". It doesn't. Especially things like coding takes effort, effort and time. It doesn't necessarily mean it isn't easy, it just takes time and focus. Many things takes time however it doesn't mean it can't be easy if you know what you are doing. Pulled pork is not a dish you can cook in 15 minutes, it takes time, yet it is very uncomplicated to make it. Still, most people wouldn't dream about making it a weekday, not because it is difficult as such but because it takes time. Coding takes time and effort and a whole lot of other things - but it doesn't mean it is difficult - at least not to someone who has the time, the chance to switch off any other distraction, the interest and the will to solve problems.
When people hear "easy" and think "fast" or "without effort" they are going to be very disappointed, just like the article says. However if we stop thinking of "easy = quick" the attitude will change.
Yes, there are parts of the industry that require extreme programming skill. Security, highly distributed systems, NLP / AI. There are plenty of really complicated aspects to programming.
But if you looked at that list 10 years ago, it would also include: web programming, game engine development, etc. -- thanks to technology, we have easy to use web frameworks that abstract almost all of our work, and game engines like Unity that basically remove the engine as a programming concern for most games. Those things are now becoming much easier for developers to manage.
The reality is that not all programming involves AI (and the bar is getting lowered there too). You don't need a team of senior developers to build your typical social media site anymore, and there are plenty more positions that junior devs can fill and still be productive. Give a junior dev Unity and they can probably build you a working game. Give them Rails and they'll build you a reasonably well architected website (with all the bells and whistles). You would never see that kind of thing a decade ago. So when someone says "programming is easy", they don't mean we can solve P=NP, but they do mean that there are plenty more roles for developers to get involved.
And frankly, pretending that programming will be perpetually hard is an exclusionary mindset that makes industries old and stale. Software engineers are problem solvers, right? Well then, if programming is hard, it's only "hard" because you want it to be. Making programming easier is a solvable problem-- it's one that has slowly been solved over decades, and will continue to be as new tools and tech lower the bar even more.
To me, coding is like sitting in front of a jig-saw puzzle - spread out across the kitchen table.
Finding pieces that fit together is rewarding. Having that happen often can make it seem easy. But then you find out that you've just been sort of lucky. Then it's on to the harder pieces to put together. Then you find out that you've got some real challenges.
Over time, as I've gained experience, this dynamic hasn't changed much. My satisfaction comes from the fact that my projects have become much harder & complicated. And somehow, I still manage to code, test and deliver delight to my customers.
For the youngster's out there thinking of learning to code: Give it a try. You won't know if you like it unless you do.
Don't get me wrong: I agree with your post and it would be very good if we get more good programmers! We have good programmers here in Switerland but need way more.
What I have found much harder is understanding how everything fits together, when to use what tools etc.
After looking at quite a few books, I found one which really resonates: Automate the boring stuff with Python : practical programming for total beginners. The best thing about this book is that it allows you to do real life useful things and also things that are much more exciting than printing Hello World.
That is completely false, you always wake up with the answer...
The picture you chose to title this post has been associated with your post all over Facebook and Google+. The picture depicts 3 young women with router laptops, presumably coding. I'm concerned that the visualvisual, along with the title, might read that these women don't actually know how to code and are deluding themselves into thinking is "easy". I'm not a self-identified feminist, but I think it's important to see this as a non-gender issue, and that by using a more blended visual with a diverse demographic, it would send a more balanced message to new learners.
Taking a devil's advocate position, I would see that the message could possibly be seen as "women are naive about how difficult coding is", and a young woman might be discouraged after seeing that. For me I think it's important to send the best possible message without unintended messages, especially in this male-dominated field.
Coding is two things: (1) Problem-solving; AND (2) implementation. The hard part is the 1st and some commenters have pointed that out. This is also the case for all parts of life.
The 2nd part is easy, but unfortunately it is what this post actual spoke about and what everyone who is agreeing with the proposition that "coding is hard" is referring to. If you are going to bring up "poor documentation", or "buggy 3rd party libraries", then by analogy you are saying: What is hard about fixing your house is: "having/using the wrong/poor tool", "plastic parts", and "mismatching parts". Every time I go to change a light fixture, take off a door to paint, or replace a window's screen, nothing is easy. The reason is that the "environment" is not identical to the directions or just the act of adding/removing changes something. Generally, the new light fixture is of different width, or the new bolts are of different size/length or threading from the existing junction/electrical box, the wiring has some issue, or I simply mismeasured, etc.
So, I respect my electrician, plumber, handy man not because they have and know how to use the right tools and know the right parts and pieces, but because they know how to take my desired change, and make it happen, solving the inevitable issues one finds with actually building something.
It is very disappointing that this is rarely recognized. And this is why those of us who want to say "programing is for everybody/coding is easy" are disappointed in y'all: "Coding" to us -- what we mean to say -- is problem-solving, not tool usage, and we believe everyone can and ought to be (much) better problem-solvers. "Coding" seems hard when you dont know the mechanics because you cant get your ideas easily implemented. Learning how to use the tools just takes time. What is hard is solving the problem well and thats what we want to teach everyone.
Get on board.
For those who posted and are curious how to get better - seek out a Meetup/user group nearby. You can learn a lot from a book and/or online but nothing beats sitting with someone and having them help you 1:1.
Code is a lot more than just variables, loops and conditions. Saying that code is easy is like saying that just because anyone can learn to write basic sentences, they can also write a novel.
I gave a free coding workshop for non-programmers once and it went well. Most people were able to follow along and many completed the final assignment. The first steps are easy but it gets hard really quickly, just like in every field.
—
Sam Smith
Technology Evangelist and Aspiring Chef.
www.innorix.com/en/DS
Just did that, this morning (pesky XML namespaces!)
Everyone knows a little maths or physics, but there's a major difference between "knowing some maths" and being proficient maths. Also, people proficient in maths or physics will specialize at some point, because there's just too little time to suck it all in. Same goes for coding, you're either a jack of all trades or a master in your field of expertise, can't have it all sadly.
And contrary to what some posters said, implementation isn't easy either, all the time new frameworks appear and although you have a clear idea of what you need to build, you'll struggle with syntax and semantics of the new framework more often than not.
This coming from a guy who's got 35 years experience and is currently taking the Angular2 deep dive with a native client/server coding background.
- Know what the computer does.
- Know how to create a program.
- Know how to automate a task that you yourself can perform.
- Know how to think like a computer.
- Know how to structure and manage your solutions.
The first two levels can be very easy to do, particularly with modern tools. By "Know level three" you can take something you would be able to do yourself and write a program do perform that action. One example I use when teaching is deciding whether or not you can see a particular movie. If your age is lower than the rating for that movie, you can't go in. When you write the program you can imagine yourself selling tickets and deciding whether or not people can come in.
Level 4 is quite different. You have to let go of how you would do a task and try to think how you could make a computer do it. Sorting is a classic example of this. If you gave me 20 numbers to put in descending order I'd be able to do it, but I'd not really be able to tell you how I did it. To write a program to sort 20 numbers you would make it do the task in a way that a human never would (for example bubble sort). This is the hardest part of programming. Up until you hit level 4 you can think you are doing very well. Ifs and loops make sense, as do variables. And you've even written the odd program. And then wham, you suddenly find that you can't do it. And I mean really can't do it. This can be very painful and demoralising.
People who break through Level 4 and stop learning in danger of staying there and writing code that is very hard to maintain and manage. And some folks have talked about a level 6, where you can communicate with others about what you have built and what you want to build.
I've always sold computer programming as hard to do, and very hard to do well. It's something you should never stop learning how to do. But it is the most empowering thing you can learn.
Thanks Scott!
Thats why I'm a programmer and not a manager! :-)
Developing software is not easy.
Being able to understand and communicate the distinction between the two is also not easy.
Read non-fiction, specifically philosophy
All the "great" philosophers built large complex, (rather) self-consistent systems -- ethical and moral systems -- and that is ALL a program/system is and should be.
Want to design better large complex systems? Read Mill, Dewey, Chomsky.
Want to be able to implement such systems? Become an expert with tools, by using them everyday.
Both are effort: The 1st the mental effort required to learn, the 2nd the will-power to put in the time.
Looks like there's a typo here:
"Learning to programming is NOT easy but it's totally possible."
Maybe you meant "Learning to program"?
However, those who are claiming that "coding is easy" are more interested in selling you a course than they are actually producing valuable coders. Pretty much everyone who is legitimately claiming that it's "easy" is selling you some kind of online programming course that teaches you the absolute basics and then shoves you out the door into the wider world. It's disingenuous and dishonest, but we as a community are partially to blame by sometimes underselling the difficulty in an effort to engage more people.
I think the "coding is easy" camp is a dangerous one and serves to grossly undervalue the capabilities and impact of the craft. I personally don't want to see a skill like software engineering/development going the route of graphic design, whereby everyone hiring thinks it's something that any old monkey can do and therefore there is no value (and there is an over-abundance of people trying to get into the field).
I also often say that learning to code is not harder than learning a language or learning an instrument, it's even likely to be easier. I like to compare it to something that people might have already have experience in so that they get a realistic view of what they are getting into.
Try new languages! Maybe the language you learned first isn't the "programming language of your soul."
A particularly good piece of advice in a post filled with good advice. I'd add something to the effect of, "if it's really not working now, don't give it up forever - you might just need a few more years of mental development."
Things I didn't get at age 20 make more sense now in my mid-30s. How many other people failed to really learn how to program when they were younger but were able to a decade or two later?
I did ok as a CS undergrad, but would definitely not claim to have become a useful programmer in either C++ or Java. SQL worked out well enough, though.
I wound up as a sysadmin and years later, started using PowerShell a bit, then a LOT (get-stuff | where-object | select-object ... a bit like SQL). I'm sticking my toes into other things to support my PowerShell habit, like Ruby (GitLab and Jekyll are great)
What does it say about me that the programming language of my soul appears to be one built for Windows automation? :)
The best mentors tend to be really open about the fact that they don't know everything. They may even let you choose a route they wouldn't take, if they think you'll learn from the experience.
For my part, I learn by questioning everything. It's not that I don't trust my mentors, but I have to prove them to myself in order to learn.
I'm now at a point in my career where I mentor other developers. The good ones always question me, the really great ones make me question myself.
Comments are closed.