In my last post, Building a mobile app: Understanding the problem space, I introduced us to the problem space of building a mobile app. In this post I'd like to talk about some of the unique challenges that we face when developing mobile applications. These challenges apply to mobile in general and aren't really specific to any particular platform. It's important to understand these challenges before you start to build a mobile architecture or add mobile into your existing architecture.
Data is one of the most precious parts of any mobile application. Whether your application is a game, a productivity tool, a utility or something else, it's going to be consuming data of some sort from somewhere. You really have three options when it comes to data. First is to bake all necessary data into the app. The second is to download all necessary data from the internet. And the third is to use a hybrid approach and have some data baked into the app and some downloaded.
The first approach is the easiest as the app becomes self contained. Most platforms have even made it easy to bake certain types of data into our apps like localized strings or images. Structured data is more difficult to bake into the app as it tends to increase the apps size and can cause lag in the app as it's read from disk to memory. Using this approach requires an app update anytime the data needs to change.
The second approach solves the app update problem by storing all data outside of the app. Thus, every user always has the most up to date data available. But this decreases the apps usefulness. It means that at a minimum the user must be connected to the internet when they first run the app. It also means that the app needs to be built with a (sometimes complex) caching strategy in order to make the app usable in an offline or disconnected state. Finally, while the application package size will be smaller it means that users will have higher data usage as they use the app because they'll be downloading content for the app at the rate in which the data changes.
The last approach is probably the most common. It allows the app to be designed to work offline while also allowing the app creators to update content without having to provide an over the air update to the app. But this too comes with some challenges. It means having to create a caching and update strategy for your content. If you get that wrong it means that your users may get old or incorrect data while disconnected. This strategy requires more diligence in responding to the connection state. It also means being diligent about making your over the air content backwards compatible to any version of the app that may still be in the wild.
App updates are another unique challenge that mobile developers face. Not only does the app creator not control whether the user will install an app update, they don't control whether the user will install a system update either. What this means is that applications must be feature aware. Being feature aware means being able to update the app to take advantage of new system functionality or new data that is needed by system changes without breaking the existing apps out in the ecosystem. Even in a world where everyone updates to the latest version of your app they don't do it all at once. So there's always going to be a period, however brief, where you will have multiple versions of your app in the wild at any given time.
Interaction is another challenge that, while not unique to mobile, is more difficult on mobile. Each different mobile platform (FireOS, Android, iOS, Windows Phone, and etc..) comes with its own set of interactions, workflows, and user expectations. Your app should feel natural on whatever platform it's running on. Which means either slightly or dramatically tailoring the user experience and interaction design for each platform.
The last mobile challenge I'd like to mention is hardware. There are some types of hardware that are common on most mobile devices like an accelerometer, camera, or WiFi. But then there are some like dynamic perspective, external storage, or gyrascopes which are not going to be available on all devices. And lastly there are some that are going to be common on all devices like GPS or memory whose quality, size, or accuracy may vary greatly.