Good post. It's funny, because C# has been ubiquitous for a long, long time - just not in cool areas like the startup scene. I was a C# web dev for years before moving onto using Node or Ruby as a backend in order to be able to work on more interesting projects.
I look forward to a future where C# is more ubiquitous, because, as the post states, this will largely come at the expense of Java, which has always felt like C# Only Not Quite So Good. Cross-platform these days means a lot of mobile work, and if we can write our server backends, iOS Apps and Android apps in one language that's a big win.
I used C# for a long time before moving on as well. Mostly web stuff, but also desktop software and services (Windows equivalent of a daemon). I always really liked the language, and the libraries are mostly pretty good, but it being tied to Windows and especially IIS was always a real problem.
But I think .NET has also long suffered from a more anemic ecosystem than other platforms have. Things like a package manager have just recently come around. Things like tooling and educational resources seem more spotty than for other platforms. (Although some of the for-pay .NET tools are really, really nice.)
So, I too would like to see it used in more interesting ways than line-of-business desktop/web apps. But I wonder how the above things will play out. I'm really glad it's not so tied down to Windows anymore. But maybe there are other issues to resolve, now.
I'm just hoping that the stability and ease of deployment approaches what it is on windows for server-side apps. Also, I wonder where VS will wind up with all of this. If I could use VS on OSX or Linux that would be my preference at this point.
I'd looked into mono (mod-mono/fcgi) a number of times, and it was always painful, with some performance/stability issues, and in the end worth the server license to just not deal with it.
For the past few years, I've been doing more node work than .Net and loving it. That said, I wouldn't mind doing some pieces in C#/.Net because it has a lot of niceties as well. It's generally the "enterprise" tooling, and excessive use of design patterns that has made it more painful in practice.
I'm not sure about this statement: "Of these platforms, Linux is clearly the most important. Today, Microsoft earns much of its (record) profits from enterprise software packages (SQL Server, SharePoint, Exchange, etc.). By running .NET on Linux, it now has the ability to run those apps on a significant majority of server platforms."
Are significant portions of SQL Server, SharePoint, and Exchange written in .NET managed code? I would have thought most of the code base for that stuff would still be in non-managed C++. Will having .NET on Linux make it significantly easier for them to release SQL Server on Linux?
I don't think so and I don't think that's the reason behind this move.
I'm pretty sure this is about gaining back some developers. All the cool things happening these days on mobiles and on the web are not happening with Microsoft's platforms.
It's important to remember from where .NET comes from. It was part of a larger vision of Microsoft that included Windows Longhorn, .NET Passport, project Greenwich and Trusted Computed. Of course this vision screamed "Lock-In" and it was about just that (too bad that it is happening anyway, yet people aren't paying attention anymore). So .NET wasn't opened because it was seen as a way to keep people on Windows. Sure there was an ECMA standard, but that was just like putting lipstick on a pig (though ironically that ECMA standard is much stronger and useful than Java's JCP, which is a complete farce).
Unfortunately they missed the forest from the trees. The web developed outside of their walls, mobiles developed outside of their walls. All the cool things happening right now are happening outside of their walls. And now all of a sudden, a Windows-specific platform becomes a liability, a way to keep people out of Windows or whatever Microsoft wants to do.
Personally I'm happy about it. It's a pretty solid platform and a good alternative to the JVM. Given the dickish moves by Sun against Apache Harmony and by Oracle against Android's Dalvik, I think it's about time the JVM had some competition. .NET is still missing a healthy ecosystem though. For Java / the JVM the ecosystem is intimidating at first (e.g. so many choices, so much open-source, multiple IDEs, multiple languages, WTF), but it's actually its biggest strength. On the other hand if there's enough interest, then .NET can catch up as the basics are taken care of.
I think what's meant is that it will be easier to create software on Linux that uses MS enterprise packages, like SQL Server, Sharepoint, etc.. So devs can make use of the MS ecosystem without being totally locked into it. Especially since cloud-based services like Azure means never having to buy/host/maintain any Windows boxes at all, if you don't want to.
I know that a lot of SQL is likely still C/C++, but MS does put a bit of effort into being able to be cross-platform. I don't know how much of SQL is tightly coupled to windows, but it wouldn't surprise me if MS wanted to they could do a linux, or OSX release.
Just look at SQL's installer for tools, it really seems to be a gui on top of some cli tools. Its' origins are in Sybase, which IIRC supported a few platforms early on. MS-SQL is a pretty good value compared to say Oracle. The management interface as well as scaling (replication) support is very well integrated. I've wished PostgreSQL could get to this level in the box for years now.
I think this has more to do with developer mindshare than anything, especially with Azure as a platform. If you can write .Net apps and run wherever it's very appealing. Even with Mono it was a nice story to have. Integration with system libraries to .Net is much easier than Java's JNI and the like. If I can write C# in VS and deploy to Linux as easily as with windows, it will likely return as my back-end of choice.
" .NET has a key advantage over Java in its support for clients. Despite the significant improvement JavaFX delivers over Swing, Java is no one's first choice for writing desktop UIs, whereas .NET is standard for business applications. "
This will be interesting. Obviously, .NET is the best way to make desktop GUI in Windows; I wonder what they will do to support GUI creation on Linux and OSX.
A WPF like framework for each platform would be very nice. Code the interface three times and share back end code between them.
I also like Xamarin.Forms' way. Describe, in general terms, what you want the interface to look like, and it generates native GUIs for Windows Phone, Android, and iOS that follow each of their different UI conventions (tabs at the top, tabs at the bottom, menu button, etc. depending on the OS).
"Java is no one's first choice for writing desktop UIs, whereas .NET is standard for business applications"
From my PoV neither Java nor .NET is the first choice for UI. HTML and JS is. Especially for large multi-million dollar software. I know what I'm talking about here. Yes, HTML&JS are bad and crap, but may times better than applets or desktop apps. Nobody likes vendor lock-in.
When it comes to server side .NET is much worse than JVM.
So now, you got the picture why Mincro$oft made this desperate move. Developers, developers, developers...
I'll add something here. The CLR is a PITA when it goes wrong. Its a total bastard to debug. JVM on the other hand has wonderful instrumentation capabilities at runtime.
At best you get a minidump out of a CLR process that is misbehaving and take it to bits inside VS. You may or may not catch it doing bad things. Most likely you'll find yourself with half the threads inside win32 and an 20 mins wait for symbol server to snag the symbols.
100000x this. While trying to track down a memory leak I discovered that while pretty much any guide out there on the internet points to using WinDg and referencing a Microsoft site for the symbol files, the .pdb doesn't actually exist.
That's of absolutely no use when the box is under heavy load. Perf counters just stop working.
We had a system wide thrashing problem with ReaderWriterLockSlim which doesn't work properly under load. Took 15 mins to log into the box to blast the process. Couldn't even get any performance info out of it. Happens on a JVM on Unix; no problem.
For ref the concurrent collections should not be trusted under heavy load in processes with more threads than CPUs. Its to be honest piss poor quality.
JVM runs on wider range of hardware. JVM compiler is faster than .NET equivalent. JVM has more programming languages tagetting it. these languages have much more mature libraries. Some of them run on .NET, but almost none of the languages from .NET runs on JVM. JVM has many many more man years spent on libraries, so Java libraries are much more trustworthy. And so on...
JVM and Java are much more reliable. Java backwards compatibility beats .NET every time. How many .NET frameworks do you need to install if you need software written in different versions of .NET? Answer: all of them. And Java?: only one.
I've got 3 or 4 versions of .NET on my system because of this.
That's interesting, because my experience has mostly been the opposite.
On the server side, you can install whichever .NET versions you need and they will live together quite nicely. But you can only install one Java version, and updates randomly break things (that's probably not true in general, but that's how it seemed to me). And I can only remember a handful of issues that were caused by the .NET framework, we had constant reliability issues with Java.
Having lots of languages available is nice, but it's not a core requirement for a platform in my opinion. .NET has C# and F#, and they complement each other very well.
I haven't had any library issues with Java or .NET, so I can't comment on that.
My guess is that my problems with Java stem from lack of experience with it, and my success with .NET is because of my deep experience with it. So it seems likely that your perspective is for similar reasons.
.NET's C# and F# are actually the only choice. C# is old and at most slightly better than Java 8. F# is somewhat better (much more concise) but still behind Clojure, Scala, Frege, etc... I'll also want to mention here that IMO Clojure is now on the forefront of innovations actually implemented and widely used in enterprise class software. STM, async, channels, static types, transducers, etc... and all these things are so easy to use for a newcomer. Every other language have already copied something from it or is in the progress of doing it. When I'm programming in Clojure I can feel I can work miracles - things that are hard or almost impossible in other languages I can write in a few lines of CLojure. Brilliant language. I'd discovered it couple of years ago and I'm still shocked by its power.
You can install as many java versions as you need (I have everything from 1.4 to 1.8 and multiple versions of each major version all on same machine). And they all live side by side. You use which ever one you need.
I agree, but what can I do. If you want larger client platforms coverage this "worse" becomes actually better.
I don't like WEB stack also, but HTML is the best x-platform GUI technology right now. Evey system has a web browser, but not everyone runs JVM, .NET or similar (or runs none of these - Android, BB, iPhone...).
No. Because making anything complex that works on many platforms is very hard work. Take a look at WhatsApp (recently bought by Apple for $19 billion).
But the quote specifically calls out desktop UIs. HTML&JS might be standard for UIs, but what about specifically desktop UIs? Not everyone has the option of putting their UI on the web.
I look forward to a future where C# is more ubiquitous, because, as the post states, this will largely come at the expense of Java, which has always felt like C# Only Not Quite So Good. Cross-platform these days means a lot of mobile work, and if we can write our server backends, iOS Apps and Android apps in one language that's a big win.