The thing about Java developer is that they're getting easier to be replaced (outsource or offshore).
That might not be the case if you're specialized in SAP (ABAP, FICO, ERP), Oracle (PeopleSoft, CRM, Financial). Sometime it is due to the nature of the information you're dealing with.
I decided to quit pursuing technical excellence and heavily thinking to switch career to either DBA (I've been taking database courses at a local polytechnic college) or Sys/Net-Admin. More of the "Ops" kind of career for many good reasons.
I realized that what I like is to build software from a non-programming perspective (architect, designer, owner). So I decided to look for a lucrative yet stable career, save my money for the long run, and outsource programming jobs.
I know people have distaste with the word "outsource". But outsource doesn't necessarily mean to India. It could also mean to contract out part of the programming jobs to a local talent. I also have the advantage of being born on the other side of the world (somewhere in SE Asia) so I have 2 talent pools to choose from.
I viewed my moves as a series of problem solving steps. Perhaps you should too.
I think this is the biggest difference between programming language and OS/RBDMS. The changes happening around programming languages are much faster than that of the OS/RDBMS world.
People who know UNIX concepts are most likely employable whether the business is using HP-UX, Solaris, Linux, or BSD. You're a DBA? doesn't matter much how many years of experience you have between Oracle and SQL-Server (as long as each have at least 1 year).
Compare that to a developer who know OOP in Java and JEE is less likely employable in shops that use the equivalent technology in C#.NET (even if the concept and the language is the same).
My point here is that the changes in programming language/development tools are in a very unhealthy situation. People don't even have time to stabilize and learn other skills (communication, organization, networking, understanding business needs).
I think the term 'generalist' here is a bit unknown.
If you're a developer working on web-based software, you are known as the web-developer guy (specialist).
If you're a developer working on transactional, security, concurrency, you are known as the back-end guy (specialist).
If you're a developer working on business-app, you are known as the enterprise developer (specialist).
If you're working on product-based company developing virtualization, you're specializing.
Developer who work at Google, while they might not used the varieties of framework out there, are specializing in Algorithms, Data Structure, Concurrency, and Large Scale development.
If you're looking for work as an internal business-app developer writing JEE components, your recruiter might not want to accept Algorithm geniuses who used to work at Google.
A Rails guy will look down on someone who has 7 years of Java experience whom tries to escape Java at the same time but wouldn't say something bad about his work experiences (not burning bridges).
These days people shaped their mind and view pretty quick.
Silicon Valley wants the best and brightest. This filter is opinionated based on the company.
If you're looking for work at VMWare, your Rails and MongoDB experience won't be needed. They want C/C++ guy who can hack Linux kernel or write device driver.
If you're looking for work at Facebook, they want someone who knows PHP and C/C++ and probably have provided patches to MySQL or memcached. Or they grab "idea" people like Lars (from Google).
You should also "own" that domain (compiler, AI, optimization, OS/Kernel, Networking, DB/Data-Mining, business-app, ERP/CRM/Enterprise).
This is scary because it forces you to:
1) Put your eggs in one basket: domain
2) And put more eggs in another basket: technology
3) Stay up with the latest in (1) and (2)
This left you no room to breathe. To break this cycle you probably have to get out there and do something on your own (meaning: your own business/company)
While I do enjoy programming, I don't think software development is a good industry to have a career in. The market is so fragmented right now with different choices of programming languages and different technology requirements. And you are expected to be the expert on those technologies.
I like what I do and it's good to be paid at what you do. But these days corporations want their people to work extra hard and dedicate themselves for the company. Once the company is done with you, they'll spit you out.
I've had my first-hand experience seeing someone who helped built the company, loved his job, work harder than anyone else in the company, was being let-go when the company didn't do well. Probably because he has a high salary than anyone else. The least the company could do is to negotiate his salary and let go someone else (still not ideal, but then..).
Long gone is the day of "employee growth", "personal advancement", or "continuous improvement". Enter the day of "you should already know that", "study this on your free time".
With the rise of Scrum and XP, developers are becoming interchangeable (outsource, offshore, or between colleagues).
Agile is such a generalization. There are many practices below Agile such as Scrum, XP, Lean, Kanban, DSDM, FDD, etc.
Agile itself is just a set of principles. The actual implementation still require some processes.
I don't think people should attack Agile as a whole, but they should focus on which practices they chose. For example: Scrum is an agile practice for Project Management. But in order for a shop to use Scrum, they must implement certain practices from XP. XP more of an agile practice for Software Developers.
There are shops which implement only SCRUM but not the XP part. That is to say that they implement the whole Sprint, Retrospectives, Backlog, Stand-up meeting, but they did not refactor bad code, they did not try their best to have an automation in place. At the end of each sprint, they never test the whole app, they only test whatever the sprint accomplished. This is even worse than the previous practice.
I wholeheartedly agree with those who have been burned by management who thinks that SCRUM or XP will make things better in a short time. I hate to say this but it takes a very long time for a company to change their culture and mindset (depending on the size of the company and what the company does: product vs service).
If your company is switching to something new, make sure they know that methodology inside out. Make sure they met the pre-requisite. Make sure they are willing to sacrifice their time and money for a while.
Otherwise, get your resume ready cause the ship will sink faster than before.
On the other hand, some people might not agree with this but when you have one of these processes in place and everything in your engineering department runs well, that doesn't mean life is good. When the company is not doing well, your senior engineers who receive a big-fat check every month might be a good candidate to be let go. The reason is because your intermediate and junior engineers have already known everything inside out (cause one of the practice in Agile is to share knowledge, cross-functional team, or whatever).
I don't mind occasional OT (with compensation). Fact is, in where I live, companies can get away with lots of OT and not compensating them. I don't mind to go to management position late in my career. Not now, but maybe later.
Interesting things can have different means. To me, Google architecture (GFS, BigTable, MapReduce) are all interesting, but I have no desire to learn them for the sake of learning. Rails is interesting in the sense that I'd like to learn it, make a website using it, and take a poke at running a small business.
I'm also interested at the business of iPhone apps. I'd rather pay someone else to write the app than writing it myself. I prefer to focus on the operational side: making sure we have a website with good SEO and graphics design. Promote the iPhone apps and start making money (even with a low profitability margin).
But at the same time, I'm not a big gambler or a risk taker. Steady fixed income and experimental on the side is my sweet spot.
In short, I'd like to be able to run my own side business, be it iPhone apps or selling stuff online. That excites me more vs toying with various programming languages or solving hard algorithm problems. I prefer to talk with people than with machines. I don't mind to do occasional programming cause I like to build stuff. I just don't want them to dominate my whole life. I prefer not to be 40 or 50 and still hacking C, UNIX, Java, C# or Ruby for a living.
There's some amount of problem solving and planning involved. But not as challenging as to implement the next distributed storage mechanism. I'm probably closer to done for that world. I'm not a research scientist.
I'm looking at the specific area: financial services (not trading, but more traditional than that: transactions, accounting, etc). I'd love to learn about finances more in conjunction with doing IT related work.
I understand and well aware of that. Having said that, I also often see companies purchase Oracle for technical and business reason. I went and saw myself first hand experience a multi-financial company that opted for Oracle (as opposed to SQL-Server, which they benchmarked) to build their financial system and they are pleased with that.
No argument between TDD, BDD, DDD, C# vs Java, Linux vs Windows, Commercial vs FOSS and all that crap. Just Oracle, PL/SQL, Forms, and Oracle Financial. There's no Java code at all around there. Pure "module" based. Testing is a lot easier vs to test your own "financial" module written in JEE.
I see it as more practical and suits the business well.
Of course if the business requires infinite customization (in the case of that crazy idea called Business Process Redesign), then maybe hiring a team of software developer is better than buying Oracle.
Thank you for your response and to share your experience as well. Greatly appreciate it. It would be great if I could have some stability in my career and yet still able to work on something else (be it RoR or LISP or something else).
<rant>
I've been working in a few, of what people would call "software product", companies. The one that Joel mentioned a lot in his essay.
First of all, if I were in Silicon Valley, I wouldn't probably even think of Oracle. I would hone my CS skill so bad that I could hack my own compiler. Alas, I don't live there. Even if I do, I have an expiration date stamped on my head: good only for 10 years after graduation. Silicon Valley wants hot-shot, young, energetic, red-bull-drinker, all-nighters type of programmer. So if I can't be a "product manager" or "CTO" or management material by the time I'm 32-35 years old, time to get out from SV.
Product based company tend to be unstable in where I live. I also noticed this trend isn't particular to where I live, it's everywhere else too. When the product is not selling well, lay-off happens. The first to go are usually the QAs.
Once the QAs are gone, the next one to go are the "internal" tools developers: these are the ITs and the tool developers. The last one to go are the junior developers and weak performers. The ones who left must work super hard to prove that their worth of their salary.
Product based company is cool during their first 3 years. After that, it's all maintenance of legacy and hacked-up code. I don't know which one is worse: maintaining half-ass, hacked-up, badly designed product with tight-deadline (that usually leads to OTs) or writing PL/SQL or customizing Oracle modules.
Here's another problem: standards, scrum, xp. These are great things to have in a software product house for quality and longevity of the company. But at the same time, they are a double-edged sword.
Let me explain why: once the standards are in place, most people are replaceable. Take Scrum/XP for example. One of their important points is that we all should share knowledge (via Pair Programming, or something else).
They want to make the unknown to become lesser unknown or to be known. Once it is repeatable and known, you have no value anymore to the company. Intermediate becomes Senior, Junior becomes Intermediate, and you're being let-go and they will start to hire new people.
The choice is either to move up to management or not to do scrum/xp (which is equally horrific). Not doing scrum/xp would lead to bad result, bad quality, unhealthy working environment, and the need of a hero-like effort to fix some bugs.
I have seen my friends keep changing job within 2-3 years. That might be okay with them but not with me. I don't like to waste my time preparing for interviews, cleaning up my resume, every 2-3 years. I don't mind learning and improving myself, but not for the sake of that kind of cycle.
Here's another problem with software development: programming languages. Too freaking many of them. People have too many opinions. Some like LISP, some like Java, some swear by .NET, some would invent a company based on F#, some deal with Struts1/2, some would want PHP/Drupal/Wordpress. This leads to a very fragmented field.
I rarely see a company that is looking for the bare minimum (say, Java, or C#, or Ruby) but with X-years of experience. I often see companies looking for specifics (must know Java, Struts, XML, XQuery, XPath, XSLT with 7 years of experience).
I thought about doing Rails and iPhone for a while until a couple days ago where it hits me that you can actually outsource iPhone app development. Those 2 guys that were being interviewed by Mixergy did exactly that.
I also see a few consulting offers lingering in a local job-board looking for an iPhone/Android developer. But most of them are unstable due to the nature of consulting. I don't think they're willing to pay the premium ($100-$125) anyway.
Some consultants might be able to charge premium during the first few years of a new technology (like iPhone), but they need to find the next big-thing again every 2 years.
The point is this: low entry barrier sucks.
When I look at Oracle, the barrier to enter is a bit higher (or so it seems) than being a developer and not too many people want to do the job. It's a niche. Just like what one of the HN-ers mentioned about how he did quite well with his freelancing/consulting gig (he's doing PHP, Drupal, and Wordpress)
</rant>
I have to agree with you though, knowing English and Mandarin are better (at least for me) than knowing programming languages.