Every so often I see articles and news blurbs about yet another product that allows people to create a mobile app once and automagically publish it on all of the major smartphone platforms. Recently, I've seen lots of buzz around PhoneGap becoming fully-featured in regards to Windows Phone. And just today I saw an article on Slashdot about Yahoo! getting into this space. Although, as a developer and a techy, I love the idea of being able to write an app and quickly have it available on multiple platforms, I must say I do not approve of actually doing it.
I have two simple reasons for my opinion, one minor and one major. They are, respectively, performance and user experience. Let's start with the minor one, performance. In order to write cross-platform code, virtually all of the current solutions require such code to be written in JavaScript. Simply put, that makes apps run slowly. JS engines are improving at an impressive rate, yes, but there is just too much overhead when using such tactics as opposed to running native (or as close to native as possible) code. In other words, less overhead yields faster code execution. However, most of the time, this point tends to be moot. Rich visuals, combined with ever-improving JavaScript execution speeds, tend to cancel out any user-detectible delay. Obviously, when apps have to do intensive processing on their own their performance will suffer, but most apps don't actually do that. They're either simple enough to not need to perform such tasks, or they offload processing to a much more powerful server somewhere in the cloud. And let's not forget Mono. While the Android and iOS versions certainly aren't cheap, they allow the exact same backend code to run on both of those platforms as well as Windows Phone.
Now let's discuss the real issue. Arguably the most important aspect of a mobile app is the user experience. If the app is slow or unresponsive or crashes a lot, that will be a major detriment to a user's enjoyment of said app. Depending on the severity of the issues, a user's response could range from opening the app less frequently to actively avoiding opening the app unless really necessary to just uninstalling the damned app. Of course, all of that is likely to be combined with negative reviews.
So why does user experience suffer when using "write once, run everywhere" tools? Performance, as discussed above, is certainly a factor. But another factor is how well the app meshes with the rest of the platform. I don't just mean taking advantage of the appropriate platform APIs, which is itself problematic when they are so disparate among the different platforms. I mean the look and feel of apps. That's right, the stuff that so many of us developers hate dealing with, the interface and user interaction. Take a look at how the majority of iPhone apps look. The common buttons, the common paradigms. Now look at Windows Phone apps. (Android UX is sort of all over the place, especially with the radical transition Ice Cream Sandwich brings, so it doesn't make for a good example.) How can an app appear beautiful on Windows Phone when it looks like an iPhone app? All that unnecessary chrome, the radically different tab interface instead of pivots, and of course the back button on the screen, all seriously detract from the overall app experience.
But why do so many of these tools pop up? Because they sound like an incredibly attractive proposition. Lazy developers (and I do not use the term lazy in a negative light here) love it because they can concentrate on making more apps in less time. Companies with tight finances can afford to release apps without spending a fortune on development. These are valid reasons, but if you have the option to make proper native apps, you should absolutely make that choice. Your users will thank you.