I've gotten a bit of a reputation at Fivable for being the guy who loves to introduce new technologies to the group. And my coworkers aren't wrong--I get so excited when there are shiny, new programming frameworks, languages, and paradigms that get pushed into the spotlight. New things are cool; they kick-start my creative brain and make me wonder how to use that new framework to make what I'm currently doing better, faster, easier, etc.
And it's not just me (thankfully)! In 2006, a study was published in the Neuron scientific journal that found that the brain's "reward system" would show high levels of activity when a person was experiencing something brand new. The article I've linked goes into a lot more detail if you're interested in learning more.
Put in more human terms, experiencing or discovering new things is addictingly satisfying. It produces that same kind of dopamine rush that we get when we see a new notification on our phone or get retweeted on Twitter. And that's a good thing; I'm no expert, but I imagine that if we as humans didn't have that "feel-good" reaction to exploring new things, we wouldn't be nearly as advanced as we are now.
But for the love of all that is good in this world, stop learning so many programming languages.
Let's be clear: this piece of advice is as much for me as anyone else, if not more so. There are plenty of times where learning something new is a net positive, but, in my experience, I convince myself to learn new things even when I clearly don't need to. There are two tried-and-true reasons that I always use to convince myself to get that dopamine hit, and maybe you experience the same mental battle that I do, so let's go through them.
i need to learn ____ because i need my app to do ____.
I'm a firm believer that, in 99% of cases, it doesn't matter what programming language you use. There's another spicy post coming down the pipes about why your programming language choice doesn't matter, so I'll save my convincing for that. But in the meantime, I had this exact dilemma the other day. I was scoping a project in a group that involved building a "real-time" web application, and we were getting hung up on the idea of having to take time to learn Node.js to write a socket server. None of us have done much with Node except for a few pet projects with Socket.io, so we weren't even remotely prepared to write something for production use. As we were diving deeper and deeper into this idea of learning Node, we were getting more excited, but seeing the time estimate creep higher and higher definitely dampened the mood.
Eventually, as if someone had walked up and slapped us, it hit us: was our requirement for the application to be "real-time" actually real-time? Or did the app just have the be fast enough? Turns out, fast enough was PLENTY. For us, that revelation meant that we didn't have to spend time learning something completely new just to satisfy a single requirement. Were we bummed that we weren't going to get to learn something new and exciting? Yeah, for sure. But were we more excited that we now had a solution that reduced the amount of time it would take for us to complete the project? Hell yes.
So what's the takeaway here? Instead of saying something like "I need to learn Node because my app needs to be real-time," try changing perspective. Sometimes our desire to be mentally rewarded for learning something new can cloud our judgment and make us think that there's only one possible solution. But if I've learned nothing else from being in the software industry, it's that there's never only one solution for something.
i need to learn as many languages as possible because that's what companies are looking for.
I hear this one a lot.
I'm in charge of Fivable's Apprenticeship program, so I talk with and interview a lot of new and aspiring programmers. More often than not, when I ask them a general question about their programming skills, instead of talking about the depth of knowledge that they have on one or two programming languages, they instantly launch into a laundry list of all of the programming languages that they "know." And I don't blame programmers for thinking like this--as I said, I find myself in this trap all the time. Somewhere during my programming education (and theirs), I was told or somehow made to believe that a breadth of programming knowledge somehow was vastly superior to an in-depth understanding of one or two things. I won't pretend that I know where this ideology comes from, but I will say that it needs to stop.
Never have I ever wanted to hire someone who has a shallow knowledge of every programming language or framework in existence. Typically, when I'm talking with a new programmer in an interview, my goal is to figure out their depth of understanding of programming and software development as a whole. When I get a laundry list of the different languages they know, my brain starts looking for the language they know the best. Once I find that information, I base my overall judgment on their understanding of programming based on their knowledge of that specific language.
To make that idea a little more concrete, say I'm looking at two candidates for a full-stack Laravel apprenticeship. Let's also assume both candidates have been able to rate their understanding of specific programming languages on a scale of 1 to 10 (with ten being the most in-depth understanding).
- HTML/CSS: 3
- PHP: 3
- MySQL: 3
- Node: 4
- Python: 3
- Java: 3
- C++: 4
- PHP: 6
- MySQL: 7
I'm much more likely to pick the second candidate.
A depth of understanding tells me that not only have you taken the time to GAIN that depth of knowledge, but you are also capable of gaining that knowledge at all. If you've done it once, you can do it again.
Now, I'm not naive or cocky enough to think that I do interviews for our Apprenticeship program the same way that other companies do their interviews, but I don't believe that we're far off the norm.
So what's the takeaway? Go deep on one or two languages or frameworks! As you go deeper and deeper into a language or framework, you'll gain invaluable skills and insights into those technologies that can then transfer over to the next thing you want to learn. I can't speak on behalf of all companies and businesses, but I can certainly say that having a deep understanding of a technology is much more impressive than having a passing knowledge of lots of technologies.
Here's what I think: saying to "not learn anything new" is a dangerous and completely unhelpful piece of advice. Of course we all need to keep learning and growing--we would never improve if we didn't! However, I think that our time is better spent diving deep into one or two specific things at a time instead of trying to ingest every new technology that hits the market.
That's a lot easier said than done, since, like the study I mentioned earlier says, our brain is wired to like new and novel things. We're fighting an uphill battle against our very own mind. Well, maybe. I can't claim to be an expert on this, because I'm still struggling with it myself, but I've had a lot of success trying to train my brain to get those same sorts of dopamine hits from learning new things about PHP and Laravel, the technologies where I'm placing most of my focus. That's not to say that I don't venture out when I'm required to for work, for example, but I make my best effort to find solutions to existing problems within the toolset that I already have available.
Truth be told, I'm not sure how I'm going to know that I've gone deep enough into PHP and Laravel. I'm still working at figuring out how to measure that metric. But once I figure that out, I have a massive backlog of things that I want to learn, so I'll start picking them off one at a time.
Functional programming with Elixir sounds like an excellent place to start.
What do you think? Are you someone who prefers learning a little about a lot, or learning a lot about a little? Hit me up on Twitter and let's talk about it!