Stick with Microsoft WPF (et al.) or jump ship?
reddit.com
reddit.com
Firstly some background: I'm a solution architect in the UK who deals with .Net 90% of the time and has done for the last 10 years i.e. since day one. It was a bad decision to go down this route for me. I'd have been better off with Java/J2EE. Why?
Confidence. MS has pretty much no direction with respect to their development tools roadmap and ideals. They seem to put feelers out in every direction, then cut a few directions off randomly based on how people react. That's bad if you've bet your business or career on it. They only do this because they have the cash. Examples of their current creepy tentacles which are at risk: PHP, Silverlight, Hadoop, even Java on Azure, Entity Framework, Metro.
Complexity. Everything is utterly overcomplicated. I am referring to the W products. WCF covers most of the "virtually impossibly overspecced" WS-* specifications which are pretty much never used in the real world (most companies use hack jobs for integration TBH). WPF and WWF are simply slow to build software with, induce horrid levels of coupling and untestability and have an extremely high learning curve for even simple tasks. I won't even mention Win32 if you have to go that low - it's an utter minefield.
High rate of crap employees. Seriously, I have interviewed at least 200 already employed people over the last 10 years in this sector. I've hired about 10. That's how low the bar is for getting in. It's damn hard to get rid of people once you've hired them in the UK as well so you have to be careful.
Churn rate. Utterly obsolete and expensive training (some of which is just completely wrong), no reliable roadmap, new platforms every 5 minutes to tie you into their product ecosystem and proprietary and illogical ways of doing things. Once you're in, it's hard to get out. People don't treat you with respect if you want to switch out of that side of the industry as they know about the "high rate of crap employees" as mentioned above. Also .Net software houses are usually a monoculture so it's hard to prove experience in something else, even if half your kit is Linux.
Lack of out of box solutions or free solutions. Everything is pay pay pay or build build build. If you want to integrate with Word documents, pay. If you want to integrate SVN with your IDE, pay. That is pay per server, per seat, per user, per atom if they could. If you want to wire X up with Y then you'll have to write your own shims. With the Java/Ruby/Python ecosystems, everything you need is out there for nothing - it just needs assembling.
Patterns and practices team. They are a joke. Utter mess. Nothing coherent, cohesive or useful come out of them. They don't even compare to the J2EE blueprints layed out back in 2002 which are pretty darn obsolete. Most of their own products ignore the P&P team's advice as it's shit.
Now this may sound like bitterness or diatribe but this is how it really is.
I carefully avoid mentioning the language above which is irrelevant - it's the ecosystem that's fucked.
I've noticed hat some programmers become so obsessed with not being left behind, that they spend every year learning some new flavor of the month. Of course MS promotes it, that's their job.
But great software takes time to do right. Programs that matter, programs that will last will take longer than the hype-cycle for any one language. MS Office is still written in C++, the Linux kernel is still in C, Google uses Python, Facebook favors Php. I bet there are great Java apps, and countless other worthwhile projects in more languages than you care to guess.
The permanent generalist flits from language to language, going with the flow, but misses the satisfaction of building something special. Something that took 10 years to perfect, and then 10 more to make even better. They happily guess that an iPhone app takes 200 hours (when it's more like 2000) - they cannot imagine the sheer boredom of working on one project for 10 years. They don't even know programs last 10 years.
Today I worked on on of my projects, which started in 1996. It is more satisfying today than before because we're solving a complicated problem, which makes an enormous difference to our customers. We measure our users in thousands, not millions, but for those thousands, we make lives better.
I write with a language you've probably never heard of. We use the WIN32 API as our main OS framework. If we abandoned the job tomorrow I'd pick up a book and learn something else. I trained in C, and have so far skipped over Java, and C#. When we needed web stuff I learned JavaScript et al. It's not so hard.
My advice, worry less about the language, less about whether your skills are in the latest fashionable language or framework, and a lot more about what significant problem you intent to solve over the next 10 years. Language and frameworks will always be changing, but end-users don't give a toss what language you use. They only care about the problems you solve.
That said, I agree with your basic premise, but you need to keep your skills sharp. If you work with a single language and a couple of frameworks for several years, you may lose the ability to quickly learn a new language if the need arises, especially if it requires a change in the way you approach the problem.
I think complaints like this reveal what some people really want: to learn the "one true tech", stick with it and squeeze 10 or 15 years use out of it. That's a recipe for stagnancy be it from MS or an open source stack. People in tech just need to get used to abandoning their hard learned skills to stay relevant.
I realize there are real world employability fears that influence these choices, but for people like that being a generalist is probably a better choice.
To answer the question more directly however, WPF or any desktop stack is only a stop gap till web apps are more capable. It's definately on a downword trend.
My two .NET gigs have been enterprisey, line-of-business-type apps. What the whole Metro thing is going to mean for line of business apps is hard to say. WPF might continue to be the choice for things like that. I have a hard time picturing a Metro-style data entry screen, but I haven't really looked that closely at Metro. I've been figuring that it's kind of like PhoneGap for the desktop, which may be a completely mistaken assumption. Even if Metro replaces WPF universally as the preferred way of creating Windows desktop apps, I agree that the need for desktop apps in the first place is diminishing.
Prior to the big Windows 8 announcement, it was pretty clear that WPF was a high priority for Microsoft and, a pretty safe bet in terms of skills to learn. That's not the case anymore, and even if Windows 8 and/or Metro fail with consumers, the shift in resources for things like Visual Studio, etc. will could really hurt WPF (which needs better development tools pretty badly, based on my experience). That could hasten its demise and possibly .NET's as well.
The web will always be playing catch up to native desktop/mobile apps. And when web apps catch up to the desktop, there will be something else new that web apps can't do that desktop apps can better. (It might take 7 yrs to catch up -- like being able to play DOOM on the web).
NHibernate is (again, imo) arguably as good as or better than EntityFramework, yet (again, in my experience) no one tends to even be aware it exists.
I've seen this as a small part of the larger disappointment I have with "the" .NET community. Despite my love for .NET/C#, I have no love for IIS, web.config files or the broken Debug/Release configuration management in Visual Studio (1). Since I've worked with the .NET web stack, I've gone back to python, ruby and now golang and I missed them and the community (IRC, mailing lists, IRC, forums [that weren't written in 1995], IRC, etc) so, so much.
(1) (for a regular MVC project it's not awful, but for an Azure project it's very inconsistent, hard to control, and easy to screw up which is annoying with 45 minute deploy times, using something other than MVC or EF helps a bit as you can do more in the configuration either in code or XML rather than having to flex opaque VS options)
I think you can do amazing things with the .NET platform, but it mostly requires a certain amount of, for lack of a better term, fearlessness when it comes to what you build your system on. Using anything that isn't blessed is often an uphill battle where you are met with suspicion and derision.
That's the scary part. Microsoft is in charge of its development ecosystem, but it seems to be lying to its developers. They've become much more closed off about releases in the last few years, and it's worrying people.
It really doesn't have much to do with wanting to learn "one true tech." It's more about feeling misled.
The efforts by WebKit, Chrome, iOS and others simply changed the entire game, and in this game it is pointless to attack flash (silverlight 1.0) or flex (silverlight 2+)
That's what's worrying. The "best and brightest" just played follow the leader to nowhere.
Flash requires you to write it in Actionscript, whereas Sliverlight can be written in any .NET language and ported across. Just because they try to accomplish the same task (getting rich content in your browser) doesn't mean Silverlight is a knock-off.
And at the time Silverlight was developed, there was no major support for the kinds of things Flash/Silverlight did (and for some important things like DRM (think Netflix), there still isn't). It's not always possible to see the things the market is going to grab hold of.
Silverlight, WPF, Windows Phone, Windows 8 Metro -- a programmer can comfortably move between these with a lot of code reuse.
This has come up numerous times on HN in the past year alone. I would hope the facts I stated above are stupidly apparent to Microsoft developers, so I'm left wondering if this is FUD from another camp or the situational awareness is really that poor.
They can ship whatever they want, but how many were bought?
Metro just allows some other ways of also building the UI component (with HTML5 and JS).
His fears are baseless...
Some of the reasons I've seen quite a few devs not adopt WPF: - XAML a.k.a. super wordy xml? Why not just drag-and-drop-click-events - MVVM Template, Caliburn, Prism, or just do things how we did in WinForms? - Expression Blend makes sense in Microsoft's vision but how many small shops have dedicated UI designers? - We are moving everything to the web already why would we do another desktop app?
Of course I say that as someone who actually quite enjoyed doing WPF development for three years.
The reason is MS needs to kill technologies in order for their new ones to gain critical mass. This has been done multiple times since VFP, VB6. The problem is no one has the money to redevelop the same app multiple times. Sometimes, developers are just fodder in the scheme of things.
Of course people will argue that the stacks themselves are still going to be around, but the ecosystem dies. No one produces new components for VB6 anymore. It used to be a thriving one. Another is the absence of performance fixes for WPF (search for Scott Barnes' (ex-MS Silverlight PM) rants on WPF). I've hit one with a Silverlight Grid which freezes with 1000 rows on MSIE due to assistive technology kicking in. These are never going to be addressed when a stack is put on ice.