Specialist vs Generalist: why a broad base creates depth of knowledge over time, and specialism leads to cul de sacs
First off I feel many will be reticent about assigning any value to the opinion of an industry outsider, who makes his living on freelance jobs at the fringes of the industry. I haven't worked for Google, I didn't help create any frameworks and I probably wouldn't be let loose on an enterprise system...
So why would you be bothered about someone with maybe 3 years experience tops, who's never been in a high-cachet job with a big-boy tech firm, and never been a part of any significant blue-chip project? Why would I have any insight into this question?
Because I've been the perennial industry outsider I haven't been constrained by anyone else's vision. I've been allowed to make the mistakes people who've always worked for big companies have never, by necessity, been allowed to make.
What's more, when I've found clients I didn't have the luxury of talking tech concerns or getting a team to handle and explain to me the things I couldn't do. It was sink or swim and I've had to learn, and learn fast.
And one of the main things I've learned is that it's important, crucial in fact, to have a broad base of technology. That if you don't you end up as a one or two trick pony who does things by rote and adopts the opinions everyone else has without ever really understanding the complexities involved. That you need to push yourself outside the boundaries you yourself may be comfortable with, and to challenge every day, striking out in new directions with new forms of computing knowledge.
Because after a few years of jumping back and forth between Python and Node, Debian, OSX, Windows and Fedora, MongoDB and MySQL, Linux Mint, Ubuntu, Docker, Ruby on Rails, Angular, Express.js etc etc etc etc etc the one, critical thing I've learned is that while a specialist might advance quicker to start with, in the end if you begin with a passion for all of the most interesting and useful technologies, eventually you start to develop what I would term a "meta understanding": like Neo in the Matrix, you start to be able to "see the code".
And even though this ability for me is only currently protozoic, it's an exhilarating feeling and I can't see that I'd have ever been able to develop this meta understanding if I'd focused on a small number of technologies as some were advising me to do.
When you're working with a lambda function in Python and you start to see what its equivalent is in JavaScript, in your mind's eye, and why it has to be so within the confines of the language as written... When you look at a Ruby code block and you can feel instinctively how the Ruby translates to C++, and why, you're starting to understand the bare metal, the universals of computer systems, and the way the people who write them think: why they make the choices they do in each individual context, each strange thought-process of the coder who made a particular set of choices and what it tells you about them as a person: an insight which cuts through that much talked about technology/psychology divide.
So: I urge anyone to try, play, mess about with as many different operating systems, server technologies, frameworks, programming languages, cloud services etc as you possibly can. Always keep yourself as open as possible during the early stages of your development as a programmer, and then and only then begin to specialise in a particular area, or set of areas. This way you will develop not only a set of technical skills, but also an intuitive understanding of the underlying technologies that few, if any, specialists will ever truly attain.