Saturday, November 1, 2008

Yes. Windows is a ghetto.

This guy complains that developing for Windows is tough. No kidding. Ironic as it is, but his writing is mostly about an easy kind of Windows development. Web apps behind IIS? Not that hard, really.

Try building an installable desktop software for Windows. That's where real fun begins. It is quite common for teams doing Windows work to dedicate as much as 20% of available manpower to the installer alone (!). I've been coding Windows desktop in C++ since graduation in 98 and has always looked down on web programmers since they had it so easy. But once I got older I realized that all my Windows-fighting instincts and in-memory database of gotchas are nothing to be proud of: most of my career I was boxing against the platform I was working on, while some were having fun building an actual software.

Some may ask why on earth would someone spend 20% of time writing an installer, copying files shouldn't be hard, right?

Wrong. The problem isn't getting files in the right place, the problem lies in how inter-connected and "integrated" everything is on Windows. "Internet Settings" in the control panel, while they seem to be IE's settings, actually affect how some Windows Internet-family API functions behave. Then there is a big hairy mess called COM/ActiveX: you can't parse XML without it, yet there will be computers, be it one out of 100, with broken XML parser COM registration. Same applies to various shell-related COM servers which are essential to desktop integration. And yes, IE is the part of the OS despite of the illusion that you can uninstall it.

Then there are cases when other applications break your code: Symantec used to install their own version of MFC DLL right into System32. Then there are super-aggressive anti-spyare/anti-virus/anti-whatever packages that are basically hacks breaking all kinds of legit software. Windows encourages this style of development: when an application essentially becomes a collection of COM servers scattered across your hard drive, hooked into your system via complex mesh of registry settings. And there is no way around it: this is what MSDN tells you to do.

Then you'll have users complaining that when they launch your RSS reading software (or whatever you do), they get a popup that says "Windows Installer: configuring Microsoft Office" that disappears after about a minute of "collecting system information". And users will tell you that everything worked great for 2 months but then "computer did something" and this popup started appearing.

And they keep adding more shit on top of existing shit. Now, in addition to COM and MSI and registry you get this "side-by-side execution" bullshit, when you can't even tell which version of a DLL is being loaded and Windows Explorer essentially hides your own fucking files from you, so even locating a misbehaving DLL becomes a debugging session on its own, where you'll need to decode cryptic hidden directory names and extract a manifest from some executable's resources to see which DLL it actually wants. Having a DLL side by side with an executable isn't guaranteed to work anymore. When they rolled that out I felt sick for a while.

And finally, there is no such thing as "Windows API" anymore. XP machine connected to a domain controller/AD is a very different beast than XP home or Win2K. I'm not even mentioning Vista here.

For my last Windows project I went for "xcopy deployment" with one single fat executable statically linked to everything it needed to run with some help from open source libraries, essentially very similarly to how Firefox does it. But this style of development isn't really for "Windows Platform", this way you're targeting a "sane subset" of Windows platform.

There may be a few minor technical mistakes in what I've written. After all I haven't seen Visual Studio in a long time, but I know that largely I am correct. And I don't hold any excitement about upcoming Windows 7. Why would I? None of their initiatives is targeted towards developers. They're tweaking minor and irrelevant UI pieces, massaging services installed by default, but in the end it's exact same old lame turd. If Microsoft wants to impress me, release a version of Windows without system registry, without MSI and make c:\windows completely sealed: make it so after 3 years of installing Windows, there isn't a single new file sitting under that folder. Make everything, every little piece of next version of Windows fully scriptable and include JavaScript, Python, Perl and Ruby by default. Make the server edition completely free. Integrate with Xen and others, instead of competing with them. Implement every imaginable suggestion for future HTML/CSS in IE9 strictly according to the spec. Break backwards compatibility whenever you want and keep selling XP for those who need it. Finally, try to reinvent the desktop: the damn thing hasn't changed in decades and people still lose their own files without any help from a faulty hardware: they just forget where they are and how they're called.

Linux, and especially OSX, aren't prefect either – there are tons of areas for improvement. Innovate Microsoft, instead of competing with Google in a lame contest of being the most technologically inclined media company. It's very easy to compete with a media company: just make sure you focus on software and where do you think the best CS grads will want to work at?

The irony of it is that once upon a time Microsoft was kinda cool. I was a teenager but I still remember those "good&old" days of snobby IBM/Sun/Oracle salespeople with their super-expensive software, hardware, development tools and even documentation (I was told you could sell your car for a full copy of OS/2 SDK). And then there was Microsoft and Borland, with great, inexpensive and innovative products, driving PC revolution and attracting folks like me and my friends to CS.

No comments:

Post a Comment