A friend of mine has always been a huge fan of the Eclipse IDE. Until one day, someone he respected for their coding chops told him:
Real programmers don't use swanky IDE's, they code in emacs and write their own extensions!
Ouch! That hurt. Now my friend's not the world's best developer (and he wouldn't be able to code a social network over a weekend, his wits sharpened with five glasses of Vodka), but he's a good programmer; someone you can trust to write code that works. He's also conscientious, hard working and always striving to improve his skills. Somehow that line -- about being a real programmer -- got to him in a strange sort of way. Suddenly he felt like he had to learn emacs to prove that he too is a real programmer.
Having spend about a decade and a half in software development, I have seen many variations of this theme: real programmers only use Linux; Every programmer worth his salt has written his own programming language; You aren't a programmer if you can't write a device driver; real programmers don't work with less than three displays; The list of what real programmers should be like goes on ad infinitum, sometimes also tongue-in-cheek, which is wonderful because it's a bit of a reality check.
I think this sort of bullying (and I won't use any other word for it) is very widespread on the Internet and has an undesirable impact on many developers - especially developers who genuinely want to excel. Very often, they unwittingly begin holding themselves to these standards and fall for the Imposter Syndrome. They start seeing every other programmer as smarter than themselves and feel like imposters in a world of brilliant real programmers. They pass judgments on themselves and become convicts of their own making. Now the only way left for them to redeem their sense of competence, is to learn everything about everything - about operating systems, device drivers, security, at least 10 programming languages, UI, usability, scalability, database, cloud computing, devops, mobile, and what have you.
We are living in an age where high achievers feel like next door neighbors (thanks to certain social networks :-)) and we are constantly told that anything is possible with sufficient dedication and hard work. Absolutely anything! Now I am not denying the virtue of hard work. Hard work and diligence is extremely important to be competent in whatever we choose to do. I have even written about the importance of deliberate practice for programmers. But this post is about the wisdom of enough, and the list I just gave, is honestly, nothing short of a death march. The real programmer story line has burned many a good soul. Here's a blog post I recently read of a really good human being describing his tryst with becoming a real programmer.
I eventually concluded that these people were right about me. I wasn't a real programmer. I had deceived myself this entire time. I was a phony - an imposter.
What struck me the blog post as particularly astute, was his observation, that the moment you fall for the real programmer trap, you start learning out of fear, not fun.
Armed with impulsive spending habits and a sense of urgency, I went to Amazon and purchased just about every programming book not related to web development I could find. Cryptographic protocol implementations in C, Embedded Systems development, Linux Kernel Development, etc. I wanted to learn things that real programmers knew. I wanted to learn the hard things. I bought an Arduino, started hanging out in ##c on freenode, began reading through implementations of the C standard library.
It all felt very much at home. I've been there too. I suddenly realized that I too have bitten that bait - the bait of wanting to become a real programmer. Maybe all of us have, at some point in our careers. But not everyone calls it out. I think we should, if we want to prevent future programmers from stepping into these dangerous byways and burning themselves with their own good intentions. We need to create a cult of sensibility, not a cult of macho.
Now I am not saying you shouldn't be good at what you do. You absolutely should be good. Very good. But out of a sense of joy and pride; not out of fear. And it's important to know where to stop. It's the wisdom of enough - of stopping when you know you are biting more than you can chew. You'll know when it happens. I knew it (although I kept going on due the momentum that I had build up). It's when learning becomes a chore, something you are doing almost out of compulsion. As Joe mentioned in his blog post - out of fear.
So what then is a real programmer? I think a real programmer is mostly a real human. She is sensible, conscientious, writes code that fulfills the requirements, works as expected, and is mostly bug free. It's well thought of and not a result of copy-paste from uncle Google. She understands how the code fits into the rest of the system and knows all major interactions, and layers, and boundaries, that comprise the system. She has a good grasp of the basics of software development and computer science. Bear in mind, I'm talking of fundamentals and not expert knowledge, because she knows how to learn on demand. She is very competent with the programming language and stack she works with, and is fairly competent at using development tools (but that does not mean, she knows each and every Eclipse shortcut, and she may even dislike emacs. Gasp!). She also knows how to communicate her ideas without becoming aggressive, has empathy for her co-workers, and doesn't curse at the drop of a hat. She loves learning and keeping up with technology, but knows her limits. She knows it's time to stop when her brain starts trashing like a hard disk/ She is also interested in stuff other than coding, and has a life outside the virtual world. Remember, we are talking of real programmers and not virtual ones.
Finally, allow me to leave you this week, with this undoubtedly brilliant, funny, classical masterpiece - The story of Mel, A Real Programmer.