Wrapping Up
As we said in the beginning, solid cross-platform design and coding is not a simple task. Using the all-important technique of abstraction, you are forced to introduce layers of complexity that otherwise wouldn't exist, but with the tradeoffs that in the end you can achieve a variety of goals:
Compiling the same massive code base for different platforms
Separately updating platform-specific code and abstraction code (within limits)
Building software that's completely whiz-bang on more than one platform, without having to do it from scratch each time
And so on.
The heterogeneous environment is the future. Every platform has its own strengths and weaknesses. As each vendor and project tries to find a solid niche in the market, it's likely that they'll all focus more on those platform strengthsperhaps leaving weaker points to companies who are no longer competitors, but just links in the overall chain that will make the new server room, office gear, and so on. Learn how to implement code for multiple platforms now and you can save yourself immense headaches later.