The Impostors Guide to Software Development 12/12/16

What it's all about

The goal of this series is to explain computer science and software development concepts that are second nature to CS majors but can be challenging for those of us that learned to code without formal training.

My hope is that it'll help other self-taught engineers overcome (or at least repress) impostor syndrome. This article is an introduction to the series and touches on my background as well as the events that helped me get over my fear of being found out.

From Form VS Function to Functional Programming

I'm an impostor. I didn't study computer science at all during undergrad. In fact, I barely used computers at the time. I earned a Bachelor of Fine Art degree with a major in Furniture Making and a minor in Book Arts from the Oregon College of Art & Craft. I learned how to cut dovetail joints by hand and type set, print and bind my own books. It was awesome and I wouldn't change a thing if I could.

Spiral Table

For grad school I decided to learn about 3D animation and Visual Effects. It was there that I had my first series of computer programming classes. They were very introductory and we never had a chance to take algorithm design, let alone any advanced maths. While I enjoyed animation and effects, I fell in love with shader writing, pipeline scripting, and procedural modeling.

CG Tree

My thesis work involved rendering point cloud data for an archeology firm. They wound up hiring me as a GIS Programmer. I started off writing geospatial python scripts, then some C# desktop apps for internal use, then Objective C for an iOS app, and finally python web apps for the National Park Service, Aramark, and a few of our other large clients.

World At Night

I spent nearly all my free time building all sorts of applications. Some I sold commercially, most were just for fun or practice. I watched videos, followed blogs, did tutorials, and read all manner of technical books. Eventually I wanted to learn more about the non-technical aspects of software development and studied The Pragmatic Programmer, Clean Code, the gang of four's Design Patterns, etc. Maybe it was my undergrad degree, but I wanted to write well crafted software, not just software that worked.

After almost 5 years of writing software in a bubble, I decided to find a genuine Software Developer job. To my surprise, the first place I applied to made me an offer...and I almost turned them down. When the reality of my situation hit me, I was terrified that I'd walk in my first day and they'd instantly suspect I'd somehow tricked them into hiring the worst developer they'd ever seen. I was going to be working along side actual professionals and apart from my intro to programming classes in grad school, I'd never had any sort of code review. I was an impostor, and bound to let them down.

Wolf In Sheeps Clothing

You're not alone

Despite an impending sense of doom I took the job; and to my near constant surprise, they haven't fired me yet. This isn't to say that there wasn't a ton of stuff I didn't know. I'd used mostly ORMs and needed to better understand query languages and databases in general. I didn't know about source control branching strategies, I had never actually paid attention to style guides (pep8 for example), I had never worked with a large legacy code base, etc.

xkcd code quality
But the truth is, it wasn't what I didn't know that hurt me most in the beginning, it was my lack of self-confidence. For the first few months I constantly downplayed my experience and skill level. I assumed I was doing everything wrong and was quick to remind my co-workers that was the case. I never volunteered to review other peoples code. I'd ask so many questions that I rarely wrote anything without getting 3 different people's opinion about it first. I was paralyzed by the fear of being found out.

One day I grabbed lunch with one of the senior engineers that I'd become good friends with. I started telling him about one of the side projects I was building for an old client of mine. A little while into the conversation he leaned back in his chair and asked me:

"If you're able to build these complicated full-stack applications outside of work. Why do you keep telling everyone you don't know what you're doing?"

I felt like a kid who'd been caught cheating on a test. I decided to just own up and replied:

"Honestly, I feel like a total hack on a team of professionals and that any real developer would be shocked and appalled if they had to work on code I'd written on my own."

To set the stage here, the engineer I was with is without a doubt one of the most brilliant people I've ever met. His code is elegant, maintainable, and idiomatic. He has solved some of the most complicated problems our company has faced in ways that we've submitted patent applications for. So what he said next simply floored me:

"Oh, yeah, that's called impostor syndrome. You're not alone. We all have it to some degree, at least I certainly do, try not to let it hold you back."

Eraserhead Mind Blown

It took a while for that to sink in. But, that one conversation was the catalyst that led me to start sticking my neck out more, to trust that I did have something to offer the team, and accept that while I still had a lot to learn about programming I gained nothing by holding back.

The myth of perfect code

The take away from all this is that no matter how much you learn or practice, it's hard to stop feeling like an impostor; and while it's important to always be learning and working to improve your craft, it's easy to convince yourself that you're still not ready.

Looking back at all the code I've written, all I see are the problems, issues, and bad practices. The bad news is that's never going to change. The good news is that's a good thing. I'll never write perfect code, but as long as I keep practicing and learning, each project will be a little bit better than the last.

The goal of this series is to help fill in the knowledge gaps that fellow impostors might have. But unless you accept that your code is never going to be perfect, you'll never feel confident enough to release it. Everyone feels like an impostor to some extent, but the important part is to just trust your team and put your best work out there. What's the worst that could happen, right?

xkcd code quality