I've been making a living writing software for the past 12 years (and I am still not in management yet :-). I've worked for small startups and Fortune 500 companies with more than 2,000 people just in IT.
All together I have worked for 8 different companies which averages out at 1.5 year spent at each, the longest being 3 years at one place:
I interviewed with a small startup a couple of years ago and I still remember how disappointed the interviewer was when he learned about my job history. He asked me: "So can I expect you to work for me a year, or two if I am lucky?" What should I have said? We clearly were not a match.
Whenever I start a new job the most important thing for me is to be productive from day one. I am sure I won't understand all the business logic right away. It might take a few months to pick it up, but I strive to add value as soon as possible. If it's only by adding automated tests, it doesn't matter: I contributed.
I have clear goals of what I want to learn or practice in the future. But there were times when I picked up skills by chance.
I had to take courses on data warehousing and dimensional modeling when I worked for a large corporation. First I was not very interested in it, but as I learned more about the topic I realized that you can't use your OLTP database for data mining and reporting: you need to lay out data in a different format to make it efficient.
Of course I wouldn't consider progressive enhancement if I was building a one-page web app, like the excellent Trello.
It's been only four months since I started working for my current employer and look what we have accomplished already:
- We moved our source control repository to git and Github from Subversion, so it's easier for us to release code into different environments.
- We began carving out business logic and putting it in a business logic gem, so we can easily share logic between different Rails apps.
- We can drop, recreate and seed our development database in one, single script (yeah, I know, that did not work when I started), so our acceptance tests will have a set database state before they are executed.
- Introduced Gherkin to the team so we make sure we build the right thing.
- We are automating acceptance tests using Cucumber with capybara-webkit so our regression cycle is shorter.
- We set up a build process using Jenkins so we can run both unit- and acceptance tests after each push to Github.
Dear Employer: please don't be afraid of hiring those "job-hopping" individuals. Just make sure you are selecting the right person and let them produce value from the very beginning. They might have picked up skills - you will need - here and there. When they write tested and clean code they can leave the job any day knowing that somebody else should be able to jump in and continue the work they've started.