Being a specialist/senior dev you can get up to 120-160k/year for languages like ruby, rails, go, java, js, .NET, c++, etc. You can give speeches, write books, etc.
As a 'generalist' you'll be between 60-80k at most, because everyone will hire you as a entry level programmer in their stack since you're not expert.
A number of years ago, my team hired an experienced individual who was quite invaluable to our team despite the fact that their experience was in a different problem domain and a different technology stack. The reason they were still useful was because they had a good understanding of what we might call "systems management software". That is, if you need to write software to manage a set of heterogeneous systems distributed across a networked environment, this person had a lot to offer.
(Unfortunately management did not recognize this person's value to the rest of the team until they had already accepted a better job at another company, but that is a different story.)
It seems that there are three different ways one can "specialize": problem domain (e.g. business accounting), solution domain (e.g. "systems management software", "data science"), or tool-set (e.g. J2EE). Each form of specialization has its trade-offs, but it strikes me that tool-set specialization is particularly likely to get one stuck working on frustratingly complex legacy systems.
My attitude about specialization vs. generalization (that I think resonates with the OP) is not whether we should specialize, but when. To my mind, specialization is a necessity, and it does increase one's income, but it also incurs the risk that the specialization will become obsolete before you are ready to retire. When you look at risk-adjusted lifetime earnings[1], it seems to me that the most reasonable strategy is to delay specialization as long as possible.
As someone that specialized in Palm OS programming for a few years, I concur that there is a risk in picking the wrong specialty. But I did learn a lot in my days as a Palm OS dev. I earned the right to design and implement some really interesting solutions. I got to solve hard problems. I wouldn't have had those chances if I hadn't proven myself to be very good at what I was doing. On the other hand, my vast knowledge of the API of an obsolete OS isn't helping me much these days. I actually keep a copy of one of my Palm OS books as a reminder to never get to tied to one technology.
That's a good point. I might phrase it thusly: in order to build up expertise within a solution space (such as doing cool mobile device applications) you end up having to stick with a particular platform/tool-set long enough so that your knowledge of the platform isn't a barrier to solving complex problems.
It sounds to me like you more or less ended up doing the correct thing.
As a contractor or job hopper you're better off as a specialist for the reasons mentioned.
As a long term employee, a specialist gets stuck in one place and doesn't advance. A generalist moves around in the company, impressing people and getting raises, and helps with the valuable stuff like integrations and customer facing contacts.
The paradox is that if the specialist chooses correctly, they have a better shot at moving around outside their original company. No matter how my blog posts people write or discussions we have here, the vast majority of companies will still hire a one-trick pony over a generalist as long as that one trick is what they need at the moment. Hiring, like so much else in the corporate world, is far too short-sighted.
On the other hand, a "generalist" with a couple of really deep areas of expertise can be very valuable.
I like the T-shape model; able to help out in many areas, able to make significant contributions in a smaller number of areas. (I would add: And with a significant and continuing track record of growth in knowledge).
That's how I handle my contracting gigs. I'm not sure if generalist is the right term for what I do; polyglot might be more appropriate.
Every project I do, I'm typically brought in to accomplish something specific, which involves learning whatever that thing is down to the level where I can comfortably build and maintain a system. It's varied over the years: Django and Rails for web stuff (just recently Elixir and Phoenix), several different families of microcontrollers, C#, Java, C & C++, DSP work with software radios, OpenGL work (recently doing some intense linear algebra using shaders), etc, etc. I jokingly call myself a full-full-stack engineer: I can design circuit boards and write a web app to talk to them.
It's kind of a TTT model. I've got enough experience under my belt (and did both EE and CS in school) that there's a few areas that I'm quite excellent at, and I've written code in enough programming languages that picking up a new one for a project isn't really a big deal anymore.
Edit: Another thing that ends up happening when you get to a point like this is that ideas start inter-breeding. You have a client ask you about some mobile app that they've been thinking of, and you realize that there's a pretty straightforward image processing or DSP algorithm to do what they're asking about, as an example.
I agree that being a specialist is where the money is. What I was trying to show in the blog post was that the only way become a well-paid specialist is to improve your skills in the surrounding technologies. I doubt there are many developers making tons of money because they know Ruby really well. If there are making good money as a specialist, it is because the know a lot about a framework (probably rails), a communication protocol (HTTP), a design language (CSS), a plugin ecosystem (gems), and an editor. If you want to be a great specialist, you have to know the surrounding technologies as well.
Simply untrue. There are opportunities to join established teams of specialists looking for someone to bring it all together; perhaps to fill the role of someone senior who has moved on. Accomplished generalists are rare enough that one's starting salary should be more than competitive.
You'll definitely find specialists in python but they'll also be experts in specific frameworks or packages like Django/Pylons/Pyramid etc. I'd say the same thing goes for ruby...if you're a ruby expert it's almost explicit that you'll at least have an intermediate knowledge of rails.
Being a specialist/senior dev you can get up to 120-160k/year for languages like ruby, rails, go, java, js, .NET, c++, etc. You can give speeches, write books, etc.
As a 'generalist' you'll be between 60-80k at most, because everyone will hire you as a entry level programmer in their stack since you're not expert.