Cross-platform user experience

I hypothesize that outstanding experiences are single platform. Cross-platform development usually means writing something once and then being able to use it on many different platforms without (much) change. It’s been applied to programs for different operating systems, GUI frameworks, types of devices, gaming consoles, and so forth. Unfortunately for this vision most platforms have a culture of expectations among their users for applications and experiences on those platforms. For example, Windows apps have installers and Mac apps are copied to Applications.

“Web browsers” is not on this list because the “browser UI” is one platform with several implementations. At one time choice of browser may have reflected expectations but I suspect those days are over or nearly so.

There’s at least two main flavors of this sort of thing. The first is when the cross-platform vision is executed by separating “logic”, “backend”, or “model” code from the GUI, a cross-platform layer is inserted between that code and the filesystems and other subsystems of the target environment, and then different GUIs are written for each target environment. The second is when the GUI is virtualized along with things like filesystem and network access.

Unfortunately, both approaches tend to lead towards applications that use a lowest common denominator of capabilities across all of the target platforms (or the experience on one platform is better than the others). The latter approach also tends towards a user experience that is alien to all platforms. The former approach frequently results in a decent experience on one platform and an alien experiences on all the other platforms — the distinction being which platform was “native” to the developers.

I can’t think of any excellent user experiences on all target platforms that were developed this way. Once in a while there’s excellent software with the same name by the same company for more than one platform but I don’t know of any cases where they share anything beyond truly platform-agnostic code (e.g. math or physics libraries, perhaps filesystem or network access, never GUI) or assets (e.g. graphics, audio, etc).

Different platforms have different cultures — user expectations for how things will behave, base libraries with their spin on how things work, differing capabilities and how they integrate, use of inputs, other applications on the same platform for which interop is expected, and so forth. Even if the perils of lowest-common-denominator cross-platform development are avoided the best software is made by people that are interested in making an excellent experience and that means understanding the target platform and user expectations on it. That can’t start by trying to avoid it by writing a “cross-platform” experience.

Sometimes a software’s category is stronger than the underlying platform and because of that users may expect it to behave the same on every platform rather than conforming to platform standards. This is probably where the web browsers themselves land or maybe browsers are mostly a counter-example to this.