Beginners and experts

Saturday 23 September 2017

I gave a talk at Boston Python the other night. It started as an exposition of the point matching algorithm I’ve previously written about on this blog. But as I thought about my side project more, I was interested to talk about the challenges I faced while building it. Not because the specifics were so interesting, but because they were typical problems that all software projects face.

And in particular, I wanted to underscore this point: software is hard, even for experts. Experts have the same struggles that beginners do.

I used this tweet as an illustration:

The two states of being a developer

I love the raw emotion on the two boys’ faces. They perfectly illustrate both the frustration and exhilaration of writing software.

But here’s what beginners might not understand: beginners think beginners feel the frustration, and experts feel the exhilaration. As any expert will tell you, experts feel plenty of frustration. They feel like that left-hand kid a lot.

The difference between beginners and experts is that experts are familiar with that frustration. They encounter it all the time, as they deal with new unfamiliar technologies, or a thorny bug, or just when they are too tired to tackle the problem before them. They know the frustration is because they are facing a challenging problem. They know it isn’t a reflection of their self-worth or abilities. Experts know the feeling will pass, and they have techniques for dealing with the frustration.

When beginners get frustrated, they can start to worry that they are not cut out for software, or they are dumb, or that everyone else gets it and they don’t.

The good news for beginners is: this isn’t about you. Software is difficult. We build layer upon layer of leaky abstractions, of higher and higher realms of virtualization and complexity. There’s no natural limit to how high our towers of complexity can go, so we are forced to try to understand them, or tame them, and it’s very hard. Our languages and tools are obscure and different and new ones are invented all the time. Frustration is inevitable.

The bad news for beginners is: this feeling won’t stop. If you do your software career right, then you will always be a newb at something. Sure, you can master a specialty, and stick with it, but that can get boring. And that specialty might dwindle away leaving you stranded.

You will be learning new things forever. That feeling of frustration is you learning a new thing. Get used to it.


As a beginner myself just now taking a break from a particularly thorny problem this is a very good article to read. I think I'm gonna go give it another shot!
"When beginners get frustrated, they can start to worry that they are not cut out for software, or they are dumb, or that everyone else gets it and they don't."

That's exactly how dealing with Python packaging makes me feel.
Thanks, Ned. I feel the same recognition of both those boys's emotions.

A pity, then, that these boys are learning software development on a platform deeply locked down, where they can never be in control: the Apple-controlled silo where they will always be outsiders, the platform that will only ever see Apple as its master.

Though they have a powerful general-purpose computing device, and they may get some way down the path of learning software development, the device's nominal owner is fundamentally locked out from actions that the true owner, Apple, has sole control over. I want these boys to learn software development on a platform that doesn't treat them so contemptuously.

That doesn't take away from the well-expressed point of your article. I'll keep searching for a better image to illustrate it though :-)
@Ben: my guess is that in fact, these boys are not learning software development at all, but are playing a game of some sort :)
I enjoyed reading this post. It emphasized the double-sided nature of how it feels to be a developer in a field as big as software development. On the one hand, we're lucky because we always have more to learn; on the other hand, we're unlucky because learning those things can be difficult and frustrating.

I've been practicing two ways of dealing with this frustration:

1) accepting the frustration and coping with it however I can. This includes not blaming myself for feeling frustrated, taking a break, asking for help, etc.

2) transforming my frustration into excitement. If you learn to look at a problem the right way, debugging it becomes like a treasure hunt: every new step you make towards fixing the problem brings that you much closer to the treasure! So much fun!

I just think it's useful to keep in mind #2, because if we get in the habit of seeing problems as fun challenges, then our work will be fun and we'll be happier :)

Thanks for sharing your thoughts!

Add a comment:

Ignore this:
Leave this empty:
Name is required. Either email or web are required. Email won't be displayed and I won't spam you. Your web site won't be indexed by search engines.
Don't put anything here:
Leave this empty:
Comment text is Markdown.