03 September 2015

Voted

In many circles, Microsoft is a dirty word.  There has been a great deal of history of Redmond taking actions that were questionable.  It has been a long road to get to where Microsoft is now.  Even now, with all the change that has happened, they are still hated.  Let’s review in an extremely abbreviated fashion, shall we?

Bill Gates and Paul Allen had a dream in the 1970s and 1980s.  It was an impossible dream.  They had a vision of a personal computer in every home.  They had a vision of something that was unimaginable.  It has, for all practical purposes, become a reality.  They have not accomplished this on their own – there were many other players in this saga, but Microsoft has played a large part and the success of the Gates/Allen team and the legions of those who have worked under the blue banner can be measured not only in terms of the astronomical wealth they have accumulated, but also with a view on the incredible accomplishment of making computing accessible, affordable, and easy to use.

Microsoft’s operating systems and programming environments and tools were well-received and the garage startup became the largest and wealthiest company in the world.  At its height, Windows had over 90% market share on desktop computers.

This made Microsoft a target for several, mostly irrational, reasons.  Inexplicably, many individuals and governments decided that Microsoft was guilty of unfair competitive practices because they included a web browser in their operating system at no additional charge.  What should have been seen as an attempt at providing something of value to consumers was taken as trying to stifle competition.  Clearly, Internet Explorer was, until arguably version 10, junk and useless to those who understood that there were clearly superior alternatives.  This is why I say it was an attempt to provide something of value, rather than actually being something of value (though having a browser available without having to install anything is sometimes handy even if it’s not a good browser).

The indefensible position that including a browser with an operating system made Microsoft an evil company started a phenomenon.  There were already people who hated the software giant because of allegiance to other companies or because of their perception of the superiority of software products from other vendors.  Some of this perception is and was justified in some ways, and some is just religious fervor.

Microsoft didn’t become known as “the Evil Empire,” though, until governments started attacking them for the crime of giving away software.  As a result of being accused of being a predatory giant by bodies trusted by majorities of the populations of the world, Microsoft had its reputation destroyed.  Even now, with a completely different company with virtuous leaders like Satya Nadella and Scott Guthrie, a significant portion of the programmer population views Microsoft as the enemy of all that is open, just, good, and wholesome.

Evil Empire

The term “Evil Empire” is probably best known as applying to the galactic imperial government under Emperor Palpatine in the Star Wars stories and to the Soviet Union, as accused by then president of the United States of America, Ronald Reagan, in 1983.  It is against this backdrop, this association with a “wretched hive of scum and villainy,” that the name is often applied to Microsoft.  Many will agree that Microsoft is no longer an evil empire, but few will dissent on the accepted position that it was an appropriate name for some period of its history.  I disagree with this.  (I will not, here, address whether the term should be applied to the Soviet Union.)

There are some things, though, in Microsoft’s history of which I do not approve.

The problem with Internet Explorer was not that it was included with Windows and inextricably linked so as to be uninstallable and therefore unfair competition (though uninstallable is less than ideal and it would have been a better experience for customers with the choice of whether it remained installed).  The real problem was the way Microsoft ignored standards and used its position and lead in market share as a weapon, displaying an attitude and policy such that they behaved as though Internet Explorer was the standard.  Rather than adhere to standards, they just made up their own.  This made web development a lot more difficult than it ever had to be and set everyone back.

When vendors adhere to standards, everyone wins.  When they don’t, many lives are made more difficult.

Shame on Microsoft for this.  This is a really good reason not to use Internet Explorer (though it’s mostly not the case anymore in the latest versions and the worth of Edge remains to be seen).  It could be considered evil to behave this way.  I’ll stop short of going that far, but that is a matter of opinion.  I think it’s more a matter of not seeing the big picture and not understanding the consequences of what they were dong.  It would be natural to say “shame on consumers” for choosing to use IE when they were doing this and giving Microsoft the market position to be able to do it, but Joe Consumer didn’t have any idea what Microsoft was doing and how hard developing for browser compatibility was in an IE 6/7 and pre-JQuery world.

Also, they were not necessarily ever openly hostile to open source, but they were certainly not friendly to it.  This is my chief complaint about the company in their history, especially from the perspective of a software developer.  Historically, when a successful .NET open source project would display a significant interest from community members, Microsoft’s response would be to implement their own product in whatever niche was being addressed.  This was the birth of Entity Framework.  This was the reason for the Unity IoC container.  This is why Microsoft created PRISM (actually, I’m not completely sure about the history there and PRISM may have been motivated by something other than Caliburn, but I assume…).  In a majority of the cases of such re-implementation, the Microsoft output was clearly inferior.  Really, the .NET Common Language Runtime is just an implementation of the Java Virtual Machine (with, arguably, improvements).  I like C# as a language more than I like Java, but it’s really, in numerous ways, the same language.

Despite this regrettable attitude toward open source, Microsoft brought a lot of good to the table for developers.  It was enough that I feel the term “Evil Empire” is misplaced.  Yes, Darth Sidious’s clandestine coup of the Galactic Republic and slaughter of his opponents constitutes evil empire.  Giving away a browser and a lack of embrace for open source does not.  Thumbing their nose at standards bodies comes close, but it’s not all the way there.

The only things Microsoft does that I consider evil are those things it does just like all the other giants whose products we use everyday – Google, Apple, Facebook, etc. – they spy on their users and aren’t open about what information they gather and how they use it and for what purposes.  They share this information in ways of which users are not aware, including divulging it to governments.  This is evil and having this in common with other evil corporations does not excuse it.

The relative degree of evil among Microsoft and other companies is unknown (which is an indication of how insidious this evil truly is).  Of this I am certain, though: avoiding Microsoft for being evil while continuing to use Apple, Google, etc. doesn’t really make sense.

Much of the hate for Microsoft that exists in the world today is motivated by the idea Scott Hanselman articulated very nicely as “Microsoft Killed My Pappy.

.NET – the Bad

Before I go into the things that still draw me to Microsoft, Visual Studio, and .NET, I want to share what I have seen as the downsides of living in the .NET world.  Especially as compared to how others live.

Slow Feedback Cycles with Server-Side Web Development
The biggest problem with ASP.NET development is that it’s slow to test your web application.  This is mitigated a bit by being able to do unit testing to get fast feedback without the website.  Still, running an ASP.NET application has always involved a webserver startup time that is painful during a development cycle with a desire for rapid feedback.  Eventually, you need to run your web application on a web server and when you do, you’ll need to make changes.  Changing server code in an ASP.NET application means a compile step and rewriting of binaries that causes the application to restart.  The first request to the application the incurs the startup penalty inherent in running ASP.NET applications, especially on Internet Information Services.  The performance of these applications is fine any time other than that first request which is fine for applications running in real environments.  It’s a bane, though, for development when the entire point is making changes and seeing the results of those changes.  It does not apply to changing interpreted/layout/style resources like markup, styles, and script.  It’s painful, though, for changing server code.  This is my single largest complaint with .NET.

Windows Lock-In
Another problem with using .NET is it’s lack of cross-platform usability.  Historically, building your application with .NET meant Windows.  Windows for development, Windows for deployment, Windows for breakfast, lunch, and dinner.  Miguel de Icazza has done a lot to change this with the Mono project.  Even with Mono, though, a subset of the .NET framework is supported and it’s not straightforward to run in places other than Windows.  Developing on Windows is not a problem for me because I like Windows and prefer it to anything else.  Options for using other server operating systems would be welcome, though, especially for cost savings.  There was a time when server stability and scalability would have been an argument for this as well, but I’d argue Windows servers have come far enough that this is not a huge part of the diference.

The ire of other developers
Perception is also a problem for .NET.  I’ve been in places and interacted with developers where conversations would be warm and open and everyone would enjoy interaction until the topic turned to specifics of technology stacks in use.  When I say that I like building things with .NET, the tenor of the conversation can sometimes change.  Many developers think a .NET coder is not a real programmer.  In reality the problem is a person who would ever denounce someone else as “not a real programmer” but that doesn’t change that this perception is harmful to the reputation of those who use the Microsoft stack.  There are ways in which the view of those who use .NET as drag-and-droppers instead of programmers is justified, but it’s mostly wrong.  It’s still a very real perception and something negative about using .NET.

.NET – the Good

There are many reasons to be happy with using .NET.  Chief among them are Windows Powershell and Microsoft’s amazing development environment product, Visual Studio.  Knowing how to use Visual Studio and use it really well is great for productivity and a joyful development experience.  C# is, in my opinion, a wonderful language.

PowerShell
Windows PowerShell is the command line shell and scripting language that was missing from Windows.  The DOS-based command prompt in Windows is lacking and critics were correct in citing that as a reason Windows was unusable to serious command line enthusiasts.  This was a serious deficiency and it has been addressed in Powershell.  It is my position that the command line is the greatest user interface ever created and the keyboard is the greatest input device ever created and neither of those things are going to change for a long time.  Windows now has an experience comparable with, and even arguably better than, any other environment.  The ultimate point in it’s favor, in my opinion, is that it has the full power of the .NET Framework and you can interact with .NET objects in scripts and from the command line.  This is power.  Microsoft has worked hard at making sure that administration of things like Internet Information Services, SQL Server, and Windows Azure can be done from PowerShell.

Visual Studio
It is possible to dislike Visual Studio.  It can be used as a crutch for developers to do less than their best work.  It is filled with graphical tools that can help developers forget they are developers and instead behave as drag-and-droppers.  Seeing these things can lead to a distaste.  Visual studio can certainly be misused.  Used properly, though, it is a wonderful tool.  Becoming a power user of Visual Studio is one of the best things a developer can do for herself/himself.  In addition, the parts of Visual Studio that can be problematic in keeping developers locked in using tools and workflows not optimal for professional programmers also make programming somewhat approachable to hobbyists and those less serious about the endeavor.  Visual Studio is a power tool for those who know how to wield it mightily, but also an accessible path for beginners.  This does make it overly complex and finding something in the configuration options is daunting and overwhelming, but when you are in the know and know how to use it, there’s nothing else like it.

ASP.NET 5
The most exciting thing in the .NET space today is what was at one time called ASP.NET vNext.  It is a complete revamping of the infrastructure on which ASP.NET is built.  It does away with a lot of the constraints imposed by backward compatibility and gets rid of some ancient dependencies that have hamstrung ASP.NET moving forward.  It also talks to a webserver abstraction, rather than Microsoft’s Internet Information Services webserver, which has some astounding impacts.  First among them is the opening of possibilities for shorter start times for applications, meaning an addressing of the greatest complaint I have about .NET development.  It also enables using ASP.NET on webserver running on operating systems other than Windows, addressing the cross-platform problem that is my second-greatest complaint about .NET development.  ASP.NET 5 also fully represents Microsoft’s commitment to open source and open tools.  It embraces tools like npm, Gulp, and Grunt and brings them into an easy workflow for building software running on both the server and in the browser.

Open Source
Microsoft is no longer the same organization it used to be.  It has transformed completely form a company with something bordering on hostility to open source to one that has embraced it.  In fact, they have open sourced a great deal of their own work.  ASP.NET is open source software.  The .NET Framework itself is open source software.  They accept pull requests.  It would be more than a stretch to say that Bible prophesies are being fulfilled by the new Microsoft and their embrace, commitment, and dedication to open source.  Nonetheless, these are exciting times indeed.  I spoke with Phil Haack on my podcast about his role in this phenomenon and the outstanding leadership and work of Scott Guthrie in making this seemingly impossible metamorphosis happen.  It’s worth a listen.

Instead of trying to crush open source projects by implementing their own alternatives and using the mind-control they have over a great many developers to use theirs instead of the open source one, they now hire open source developers to continue work on their awesome products.  This is not your granddad’s Microsoft.

Windows 10
Like ASP.NET 5, Windows 10 is a complete shift in the world of Windows.  It’s a fresh start – a reboot, if you will.  Windows 10 is a reflection of the rethinking of the meaning of life, the Universe, and everything that has gone on at Microsoft.  Instead of a mentality where backward compatibility with things decades old that are no longer relevant, Windows 10 is a move into the future for Microsoft.  It’s a welcome change.  Windows 10 introduces new and simpler programming models and an exciting and stable operating environment for daily operation.  It presents abstractions and common underpinnings for the many different types of devices on which it runs.  It is also a shift into better delivery of updates.  Windows 10 is great and shipping it on schedule was an amazing feat.

Xamarin
It’s funny and strange that .NET would be the bridge to building things in a cross-platform way, given that cross-platform is one of its traditional weaknesses.  I have only done a little playing around with Xamarin and haven’t built anything serious, but I’ve seen enough to know that it works and the promise of building mobile applications for multiple platforms is a reality.

NServiceBus
It’s no secret that I am fond of Udi Dahan and what he teaches regarding architecture, distributed systems, and life in general.  Using .NET is not a prerequisite for learning from his blog, talks, and his fantastic Advanced Distributed Systems Design course.  It is, though, for using the products of his business, Particular Software.  Particular makes and supports NServiceBus and the Particular platform that surrounds it, which is an infrastructure component on which to build Service-Oriented systems.  It embeds Udi’s ideas about reliability and maintainability of systems into a product.  Moving away from .NET would mean needing to implement many things NServiceBus just provides.

There are many ways and many tools

When building of software, we have many choices of platforms, tools, and methods.  My endorsement here of Microsoft and .NET does not mean I am exclusively a .NET developer.

I like JavaScript a lot (didn’t always, but do now) and working with Node is a nice experience.  I have had success using Cordova for building mobile applications.  Ruby and Ruby on Rails have a lot of appeal, especially with Cucumber and I really dig Capybara.  Python is a language easy to learn and productive.  PHP runs anywhere without having jump through hoops to get things installed.

There are ways of doing object-oriented and functional programming pretty much any platform.  You can be productive and do well for yourself and your employers/clients/customers/users with most modern tools.  Some choices are better in some ways than others and some platforms and tools are better fits for some problems than others.  There are always tradeoffs and it’s extremely rare that one choice is obviously better than another in every way.

Choosing good tools is important.  More important, though, than your choice of tools is that you know how to use the tools you have chosen.



blog comments powered by Disqus