The real answer is just as much about our industry’s culture as it is about technology.
No, it's entirely about our industry's culture. Which is a shame. It's a fantastic framework that should and could supplant the JVM. It never will though, thanks to Microsoft's boneheaded choices and the blog posts like 'Why I don't hire .Net developers'.
But the culture is a direct result of the Microsoft brand.
Many of us have been at this long enough to at least dimly remember Microsoft's antics in the 90s. Others of us are still dealing with other aspects of the Microsoft technology stack, and hating it.
For instance, I've spent most of a full work-week with a client recently because their SBS 2008 AD server went haywire. We've been troubleshooting ridiculous network issues ever since. We've had to deal with cryptic error messages, software that takes forever to do simple things, software that doesn't do what it tells you it's doing.
And the thing is, this feels normal for anything that comes with the Microsoft brand.
I'm sure there are exceptions. .NET may well be one of them -- I'm totally unfamiliar with it. But, if I'm building a startup, and I already know PHP (or Ruby, or Python...), and I've got all of these bad experiences behind me with Microsoft products, why would I even consider learning .NET?
What would you think if I told you I had issues with Linux, drivers crashing, kernel panics, programs not integrating nicely, and for these reasons I choose not to use Ruby?
For one, I don't mind if you don't use Ruby -- I'm not out to evangelize, I'm just responding to one person's response to a simple question: why don't more startups use .NET? I barely care at all what language I use; I have absolutely no interest in what somebody else uses.
But, if I asked you why you don't use Ruby, and you said, "because I have to use Linux and I have all these issues with it", and Linux was developed and supported by the same people that developed and supported Ruby, I'd say, "Fair enough."
I was just pointing out that there's a certain guilt-by-association. I mean, this happens all the time in business. When someone talks about a brand, that brand can bring up certain positive or negative connotations in your mind. If someone were to ask me, "Why aren't you spending any time looking into buying a new GM car", I would say, "Well, for one, because my Honda works just fine, and besides, GM makes crap." Now, GM probably makes at least one really great car -- it's just that I can't be bothered to spend much effort trying to figure out which car that might be.
Branding is really something that all business owners should think about often. When people hear your name or see your brand, what do they associate with it? If you go out of your way to lie, cheat, steal, or screw over your customers now, and you put your brand behind that, what is that going to mean for your business tomorrow? Is anybody going to care if you do an about-face and produce a really great product once they get sick of your brand?
I think Microsoft's brand is irreparably tarnished among the exact crowd that's most likely to launch tech startups, and since most of that crowd already has a language and set of tools that they like, there's literally a negative incentive for most of them when it comes to considering building on the Microsoft platform.
The problem is Microsoft. .Net would be a perfect thing if it wasn't fully owned my MS, in which case it probably won't be far as perfect.
However, you have to use MS OS, MS development tools, MS deployment - and it's pretty painful especially because you can't use shiny macbooks any longer :)
If you try to replace any element of that chain, you're on your own entirely.
On other hand, MS ecosystem is smaller than non-MS. For example, what does it have for non-relational storages?
Stack Overflow started from pure-MS infrastructure and it's 50/50% already - redis, linux frontend proxies.
However, you have to use MS OS, MS development tools, MS deployment
You can use Mono tools if you'd like. For deployment, AppHarbor is just awesome.
...you can't use shiny macbooks any longer
I'm on a brand new Macbook Pro right now and I just pushed to AppHarbor. Bootcamp is great.
For example, what does it have for non-relational storages?
MongoDB works great with .NET. I'm actually about to switch my .NET-based startup[1] over to it from SQL Server.
Stack Overflow started from pure-MS infrastructure and it's 50/50% already - redis, linux frontend proxies.
Everything breaks at scale. This is the same kind of argument people used against Ruby on Rails regarding Twitter. No matter what technology you use, if you reach the massive scale that StackExchange has, you'll delve into optimization voodoo as well. It's one of those good problems.
I believe that if you would have a problem with some third-party library and mono, you have good chances to be replied with "just drop mono and use real .net"
I would glad to be wrong. But with Mono, you would always have slower, less reliable and less supported platform. Would not you?
It might be no big deal for some developers, but the difference between java and c# might be no big deal, too, for some developers.
At least when I have my Eclipse on kubuntu with clojure code inside, I know that
1) Eclipse on linux is a supported, solid configuration.
2) clojure is experimental, and it's experimental for everybody, not just me.
On other hand, mono is wonderful if you like tinkering (dotgnu probably is even funnier), but if you like tinkering you might as well take factor, common lisp or dozens of other fun platforms.
Eh, I was just pointing it out. Sometimes you need windows even if you prefer non-windows tech (I personally prefer the Mac ecosystem). For instance, my local iOS dev group has be atwitter about installing windows to do windows 7 phone development.
> It's a fantastic framework that should and could supplant the JVM.
What makes you feel that .NET is so superior to the JVM? The JVM itself seems like a solid, performant VM platform, and there is a broad selection of languages in Scala, Groovy, Clojure, JRuby, Jython and friends.
Disclaimer: I'm platform agnostic and don't currently develop on the JVM or the .NET CLR, so I have no horse in this race. I'm genuinely curious.
1. JVM cannot do unsafe code. In the CLR, you can create unverifiable IL and do pointer manipulation, etc. Raw memory can be free accessed however you like. That's a handy interop and performance feature.
2. JVM doesn't support structs. Again, performance difference. (Although, sometimes the CLR's JIT hasn't emitted the best code for structs.)
3. The CLR has generics. In Java, generics are implemented via erasure. This has an impact on performance and reflection.
In addition, the JVM is just that--a VM. The platforms that run .NET with a JIT compile the IL down to optimized native code. This is similary to the way many Lisps work. Although the JVM is highly optimized and runs faster than Mono in many tests, it will always have an inherent performance disadvantage.
Ah, things have obviously moved on since I left the Java world years ago. In any event, the VM is still specified at the bytecode level. The JITs are optimizations that are outside of the standard. The .NET ECMA standard specifies an IL that is designed to be JITed to native code.
To the parent question, the performance is very close on the two platforms. The point I was trying to make is that the .NET platform does have some things in it's favor at the IL/VM level.
Visual Studio .Net (huge), C# vs Java (C# has WAY more features), SQL Server integration (if you are using it), IIS is pretty much painless to configure and works really well with .Net, LINQ which is a pretty good ORM.
Funny, I'm currently in a mode of development where I switch daily between Eclipse/Java and Visual Studio / C#, and as far as I'm concerned Eclipse is the best thing Java has going for it. The refactoring and code navigation are miles ahead of what seems to come with Visual Studio. I find myself renaming methods and classes almost indulgently - just to see if I feel better about the name a different way. Having errors instantly highlighted across the whole build tree every time I save is awesome as well. Visual Studio seems quite primitive by comparison in a lot of respects.
My frustrations with Java are much more about the language and how it hasn't really progressed at all in 5 years.
NB: I am using Visual Studio 2008, perhaps 2010 advanced a lot.
It hasn't changed much. some syntactic sugar and influence from functional languages has helped C# but the IDE is not as good as eclipse IMO. You can however add a lot of the refactorings and features from eclipse by using jetbrains ReSharper. (I believe they also make a Java IDE too).
It's not about engaging and surpassing the capabilities of the JVM. The CLR has some very cool features. It's not quite as portable, but it's pretty neat.
It's currently lacking the community and corpus that Java, Ruby, Python, and almost everything else have. It surely has an active community, but it's just not as substantial. There's a Java library to do almost any esoteric equation, handle any ambiguous file formats, integrate with some bastardized SSO scheme...
I've worked at a lot a Microsoft shops. I'd bring in .Net any day to one of them. It's fantastic if you're already in the club. I've never started anything new, though. The article states that different platforms have equal tooling (I don't agree; VS is pretty slick and hard to beat, if you're into that kinda thing), so then cost certainly plays, and Microsoft's not making it compelling on the front.
Mono lets you run some .NET code on Linux/Mac OS X. Some of my favourite pieces of Microsoft technology are missing or too broken to use - for example WPF is an excellent tool for building desktop applications but it doesn't work on Mono, F# sort of works until you try doing recursion with abstract data types.
IMHO it's kind of silly to expect things like WPF to run on multiple platforms - and I'm actually glad it does not.
The world doesn't need more apps with lowest-common-denominator UI. Ugly, kludgy, doesn't work well on any of its platforms because it cannot leverage any platform-specific UI strengths. If anything, the last decade of desktop and mobile computing has shown beyond a doubt that a highly refined user experience is paramount for anything that faces general users. In fact, an app with fewer features, but a superb user experience, will trounce a more capable app with terrible UI (see: Apple).
This is also why I dislike apps that use the UI components from Java - they don't look, feel, or work like native UI widgets. Their layout is often confusing, since they are trying to appease the learned design patterns of multiple disparate OSes with a single design. They end up being awkward, frustrating, and a very poor experience. I have never met a Java-UI app that even reached an acceptable level of usability.
For me, having Mono run well with the obvious cross-platform bits (threading? file system access? etc etc) is enough. I for one really like C#, and would much rather write it than Java.
Eh, I'm going to disagree with you there. Qt on OS X still produces dramatically non-standard looking UIs.
I don't think papering over the significant differences in UI paradigms between Windows and OS X is something that is fundamentally solvable by a widget toolkit. You can make a toolbar full of buttons work on both platforms, but you can't solve the fact that cramming 40 buttons onto a toolbar feels completely non-native under OS X.
No, it's entirely about our industry's culture. Which is a shame. It's a fantastic framework that should and could supplant the JVM. It never will though, thanks to Microsoft's boneheaded choices and the blog posts like 'Why I don't hire .Net developers'.