The first issue is security. Security is the new black. Unfortunately security is something that most organisations only pay lip-service too, mostly having no real understanding of the issues or risks involved (although there are exceptions to this).
Personally I wouldn’t trust my belly button fluff to Microsoft’s security. I know Mr Gates has instigated a huge push to make things better, but right now, and for the foreseeable future, they won’t get to guard the contents of my navel, let alone my business.
The next issue is to do with the long-known cost of maintaining and evolving a bespoke software system, which can reach up to 10 times the cost of development. Developers at least generally try to reduce the cost of maintenance, but the old exponential cost of change curve keeps hitting us in the back of the head, and when we recover from the concussion we’ve forgotten all about it.
Those of us who do recall the exponential cost of change curve, and its devastating effects, choose to use extreme programming, either in full or part. Using test-driven development and refactoring engineering techniques it is possible to massively reduce the cost of maintenance and evolution.
The major problem with .Net is that there are very few refactoring tools available for it. If you want to refactor .Net you’re basically going to have to do it by hand (or hire a graduate).
Last weekend I downloaded an open source tool from the Apache Jakarta Commons project, called HttpClient. It’s still in alpha, so I had to make changes to make it suitable for my work. It consists of around 350 classes. The first thing I needed to do was rename a number of core classes. My development environment, IntelliJ IDEA, has over 40 refactoring tools built in. Using it I was able to rename 10 classes in less than 30 seconds, without breaking the code. While I was doing that I noticed that the signatures of a few methods I needed were inconsistent with each other, so again I used my refactoring tool to fix the problem, again in under 30 seconds. I estimate that without the tools the changes would have taken me at least a day.
If we assume that the changes would have taken a day, and actually took me a minute, then that means my tool made me 480 times more productive for those tasks.
I’m not suggesting that a refactoring tool will make all of your tasks that much faster -- that would be ridiculous. These tasks were particularly suited to my toolset. However, we have anecdotal evidence that refactoring with tool support can increase a developer’s productivity significantly and refactoring itself can significantly reduce the cost of a project. The more important point, though, is that well refactored code is considerably simpler to change than smelly code (code that hasn’t been refactored), and simpler means less expensive.
Right now, .Net will make me considerably less productive than Sun's One. (To test this assertion we’re running a "bake-off" at the Software Development Conference in Wellington next week. There will be two teams of two people. I’ll lead one and Stuart Baird, another fanatic XPer, will lead the other.)
All in all I think the technology is technically sound, but if the cost of ownership of bespoke .Net systems is that much higher then I can’t afford to use it, and recommending it to my clients would be doing them a disservice. If, despite my best efforts, I can’t build secure software, then recommending it to my clients would be doing them a disservice. If I don’t have a choice of XML parser, of http client, or TCP/IP stack, or anything else, or where a choice does exist can’t make an informed decision based on something other than marketing materials, then I can’t, in all conscience, recommend it to my clients.