[quote]…this was the other 50% of the point I was alluding to (i.e. not making clear ;)): because of underlying network problems, you cannot fully virtualize the application, because it HAS to change functions depending on knowledge of what transport it’s going to be using. In the example you describe, it may well have wanted to do that anyway (for gameplay reasons), but you cannot just fire-and-forget; you have to make a decision in advance “what method am I going to call” based upon the transport that’s going to be used.
[/quote]
Even if you do decide to put all your app code everywhere and then pick which parts will be used by which device, this can still be done without obviating the value of a clean network abstraction. In the previous example, I can test the line at startup (ping the server, or whatever) and based on the results, enable or disable certain functionality. If network performance suddenly improves, (maybe you’ve got a WiFi enabled phone?) the same app now runs with more functionality enabled, and your slow-phone only functionality now runs faster.
How is this any different from abstracting away the graphics hardware through a common interface like OpenGL? or further abstracting it away through a high-level graphics API like Java3D? You may still need to check the capabilities of the local platform in order to determine what functionality to enable, but that doesn’t eliminate the value of providing a common programming model and functionality across a wide variety of platforms.
