I worked there in 1998 as an intern. Had many issues with management.
Yet, inspite of all the problems, it is a REALLY GREAT PLACE TO WORK. From a developer's perspective, you meet extremely smart people. And their suggestions potentially influence your development many years after.
The best thing that I saw was that Microsoft really values smart people and they will keep them at any cost not letting them leave. Very few companies do that. Most today's companies are just concerned with the rate per hour and all this crap which results in insane turnover and crappy productivity. Microsoft actually gives generous raises to those who really produce. And employee turnover in 90's was much lower than any other company.
The werst problem that seemed at the time was an insanely redundant chain of PMs. One would be responsible for the product, another for graphics, another for future localization and who knows what. The guy responsible for UI layout (in my particular case) was there for at least 10 years. Paid a lot and design stuff completely inconsistent with any other Microsoft product. Every time I would mention multiple examples from the most popular products like Windows itself or Office, I would be told that it's not my job. Yet his "design" looked like sh*t. Another really smart developer (who eventually became architect and evangeliest) told me he had the same issues with him. That PM always "worked from home" and never showed up.
It is very likely that such PMs were the ones who brought all this mess to the company that we see now. Yet, purely from software development perspective and learning from co-workers it was an amazing place.
You are probably doing much more involved things than I do. I still have a full time contract making money. The stuff I described were just short-term projects. usually in C#. Worth just couple of K each.
But from the same perspective of having "first steps" - I suggest a lot of people to start with Elance/Odesk when they are looking for a cheap way to do a project.
The idea is - if you are lucky - you get something done. If not, for just $1-2K you learn what not to do in the future. So it's still an inexpensive way to learn how not to waste more money later.
I find it very easy to compete against India.
They usually try to quote on a project at about $10-20/hr and say it takes several weeks. I usually offer a demo by the end of the day and then a discussion on the total project cost. Sometimes this does involve working a lot and really fast. However it really blasts India out of equation after the demo since the most important question that comes after the demo "why did they ask for several weeks when someone else did most of it in one day".
I only did it twice successfully, but if you feel like you are bidding on a small/medium project against India, keep in mind that the way they try to outsource is by extending the development time to bill more or account for slow developers.
Sadly critical thinking, reason, and adaptability are lower requirements then being a code monkey that spews code that "gets he job done".
My exact arguments with everyone copy-pasting sh*t all over just to get the job done 2-3 minutes faster.
That's what I thought because I was in an INSANELY SMALL NICHE on my full-time contract. It was a C++ COM Internet Explorer Plugin DLL programming. Guess what? My new contract is pure C#, not even a single line of P/Invoke, some minor reading of legacy C++ MFC app is needed. Pays more.
Although this goes along the lines of 3 other minor projects I was doing besides the main contract.
To me it looks like even if you are super specialized in some areas, but work on small projects in others - you are still super valuable.
do not necessarily have the exact skills needed for the job today.
Which, in turn, means taking less of a "Just In Time" attitude to hiring. Good workers are not items you can order off the shelf, along with a desk, a chair, and a PC.
There's a flaw in this logic. If everyone was trainable in the same way - it'd make sense. However, usually those who have more relevant experience and who want to be paid more because they have a lot of successful projects in the past are usually the ones that can train a lot faster. At my current contract, I was hired together with another guy at roughly the same rate (difference was only 10%). The project was speced for 3 months. Within the first week I already delivered an important component while the other guy couldn't even produce a demo of another part.
Eventually 3 weeks into the project we talked with the manager and he decided to get rid of the other guy because his lack of knowledge and learning abilities were quite bad. It took less than 2 days to do what he was trying to accomplish in 3 weeks.
I've seen the same before with a drastic difference in abilities between people paid similarly quite often. Usually those with more skills learned a lot faster or produced better code.
Software production is assumed to be a line function, but it is run like a staff function. -- Paul Licker