Adam Nash, a very smart friend of mine from college who writes the great blog Psychohistory, recently mentioned that he thinks it's a great sign when a developer goes cross-platform almost immediately, citing the Joost beta for Mac OS X.
I started writing a comment in reply, but it started getting long enough to warrant a post and trackback.
As usual, Adam's reasoning is sound, especially considering his background in VC. He's right that a company that can build great cross platform apps simultaneously probably has a great development team. However, I'd argue that cross platform development rarely produces the best products.
First, the product often winds up representing the lowest common denominator of the capabilities of the OS' they serve. They are often not as polished or well-integrated as native apps. Firefox is a good example of this from a UI perspective. While it's certainly a pretty well-written app, it's not as native-looking on the Mac as Safari or on Windows Vista as IE7. In both cases, Firefox is a bit out of place. (Read this post on Coding Horror for a similar opinion.)
Also, in order to ease development, cross platform apps often have intermediate layers to factor out the underlying OS. These layers can impede performance and may prevent the app from taking advantage of native services like DirectX or Quartz. The resulting apps aren't usually as fast as their native counterparts. Microsoft's Mac apps certainly ran into this problem when writing cross platform "core code" apps on our Windows Layers for Macintosh (WLM) back in the mid '90s (anyone remember Mac Word 6?)
Finally, developing cross platform reduces the overall innovation a developer can provide. Building for multiple operating systems (or browsers) is never less work than building for one. The time spent architecting, coding, testing, and debugging for multiple platforms is time not spent adding new features, making the product more reliable or secure, or satisfying other user demands (or saving investors' money).
There are certainly no guarantees of a gorgeous, OS-exploitive, fast application when you target only one OS, but its's way harder when you are trying to serve multiple masters.
There's no doubt that teams that can execute cross platform consistently well over time are probably great, but just think what they could accomplish if they chose to focus all that talent and energy on one platform.
Anyway, go read Adam's blog. Lots of good stuff there, especially his financial posts.
Adam Nash Reply
Hi Tony! I'm flattered that my topic warranted a post on your blog. :)
I don't disagree with the points about, but then again, when I think about really great software houses like Blizzard, you can see that cross-platform does not have to mean lowest common denominator.
I may follow up with an additional post on this topic. The best software engineers are phenomenally more productive than the average. What I have noticed is that the top 10% seem to take cross-platform challenges in stride, and still produce best-in-class software. So when you see a shop, like Joost, handle cross-platform so elegantly, it's a good indicator of their prowess.
Ironically, I don't think that if they focused on one platform their efforts would be better. In fact, I think developing for multiple platforms is like learning multiple languages - it develops a level of skill and fluency that results in better architecture and better code.
Thanks for the post!
Adam
Tony Reply
Blizzard and other game makers are in a bit of a different spot. Games are a bit different than productivity apps since they create their own UI by design; there isn't a "OS X look" or "Vista look" for full screen games.
I also think we're coming at this idea from different perspectives. You're absolutely right that a great cross platform product is probably a good indicator of a great product team. I'm just saying that a broader requirement set is never satisfied for free; even great product teams need to give up something or pay extra to build great cross platform products.
Mitch 74 Reply
Hello,
Well, errr... I don't really know about this 'cross-platform' stuff - except maybe, that the way an application deals with a different platform when it's being ported indicates how modular, and by extension, how focused it is on its core functionalities?
This is something that is quite apparent on UNIX/Linux applications, even more now that you may have a Gtk application open along with a Qt one, and then throw a wxWidget-based one...
I mean, look: in GNOME, many (if not all) icons are based on vector graphics, with various sizes - as such, creating an application layout requires careful placement, or clever logics to be sure that the application's layout won't be borked on a different language setting or with a different icon size. Now, ok, it's not always the case.
Let's take Firefox; I agree, version 2 feels out of place whatever OS you run it on. Version 3, though... Why? It's not because of its GUI (although it got specific native themes for Vista and OS X and one for Linux), it's because of its use of a cross-platform display engine: Cairo.
Gecko itself was indeed modified to make better use of Cairo, but Cairo is basically a cross-platform tool that allows fast rendering, either on software or on hardware-accelerated UIs. For that very reason, Firefox 3 is faster on Windows, faster on OS X, and faster under X, than firefox 2 ever was.
Firefox was already modular; if you take a look at the ultimate monolith out there, you'll look at OpenOffice.org.
Remember StarOffice 5? It was a desktop on the desktop. Compared with OOo, which is being progressively re-engineered so as to be modular, progress is staggering: GNOME integration, KDE integration, Win32 integration, let's not talk about the Aqua OS X port... Latest developer builds are impressive in their speed and increasingly high quality integration.
On the other hand, do you think Microsoft Office for PC and for Mac have the same code base? No, they are different products programmed by different teams. Are they really that much better? When you consider OOo's ability to do real time 3d rendering using hardware accelerated OpenGL on whatever platform it runs on, while at the same time providing special effects for Direct3D accelerated presentations through plugins, is cross-platform really an impediment from using a patform's specific advantages?
Leaving the Free/Open Source camp, just look at Google Earth: a bit of Qt, some OpenGL, a specific Direct3D render path for those pesky D3D-only adapters under Windows, and there! A single code base, a single development tree, a single application released simultaneously under all three platforms (and I wonder if it wouldn't work under PC-BSD, too).
Most portable applications today either capture the whole system (Blizzard's Warcraft 3 works very well under Linux, especially when using their OpenGL render path), or are designed from the ground up to be portable - thus modular.
You do remember what object-oriented programming was about, right? Use an object for a specific function, don't care about what's inside it; good news, doing this right means that, porting an app is no harder than actually porting those parts that are absolutely required to interact with the system - IF the rest is well programmed, it should just Run As-Is (tm).
If it doesn't, then there was some problem in your object declaration and application structure.
I think that's the point where great programmers create great portable applications.