Why is mobile application development important, what are the opportunities and challenges when building mobile apps, and how do you get started?
These are some of the questions I cover in this presentation which serves as an introduction to developers or stakeholders who are new to mobile app development.
Why Mobile App Development is Important (transcript)
This transcript is an attempt to recreate the presentation I gave based on my notes. I hope they will help give clarity to the slides and speaker notes.
I’ve been an engineer for roughly 17 years. Started with web development, then learned backend, becoming a full-stack developer. About eight years ago I found native mobile development and just fell in love with it. I also held some CTO roles a long the way.
Highlighted merits include:
- Building a top 10 ranked photo app around 2013 (a very competitive market).
- Co-founded and was CTO for a startup where I built an app from start to over $30k/mo in revenue.
- Worked on Instacart’s Logistics team. With over 200 000 shoppers earning their income via the app. When I started we were only two iOS developers and I helped build the team to 12 before I left.
- Currently I’m a consultant at Spotify, who has hundreds of app developers. Working on car mode which has millions of users.
Why should you build native mobile apps?
- On average we spend over four hours on our mobile phones every day.
- About two of those hours are spent in social media apps.
- More than 80% of mobile minutes are spent in apps.
- Digital media consumption on mobile passed TV this year.
- 1/3 of video consumption is on mobile.
- Over 70% of digital media consumption spent on mobile (growing 7-9% year-over-year)
- Editors at Aftonbladet (one of Swedens leading newspapers) only use mobile previews. Media companies with 50+ year old audiences do the same.
How much does a mobile engineer earn?
According to a 2017 indeed.com report companies have increased demand for mobile developers but fewer people are searching for mobile roles.
This may lead to an increase in salaries for mobile developers. Some reports like payscale.com and glassdoor.com indicate that mobile engineers make more money than general software engineers. I have not been able to verify this and anecdotally I haven’t noticed much difference. Some numbers indicate $72,000 a year on average for mobile engineers compared to $58,000 for a web developer.
Why native apps over web apps?
They have generally better performance and more responsive user experience. They are installed on the customers phone, giving easy and quick access. This also has the downside that native apps actually need to be installed to be used. It’s easier to create more immersive experiences, like Augmented Reality. You can utilize full usage of platform technologies, like camera, notifications and location services (GPS). It’s easy to integrate with other apps or system provided features, like push notifications, calendar and contacts.
Native apps can be offline
Native apps can be and should have offline support! Apps that act like online-only web apps are bad for the user experience.
Mobile devices are almost as powerful as laptop computers today, allowing us to perform advanced tasks like processing images with Machine Learning (ML) models or play desktop-quality games. A 2019 iPhone 11 Pro has comparable performance to a 2017 MacBook Pro, and ML accelerators can perform 1 trillion operations per second on that iPhone.
More device capabilities
- Powerful platform features such as Artifical Reality (AR), integrate with speach through Siri or Google Assistant, ML, camera/photo library access, GPS, 2D and 3D games, and HealthKit integrations are all possible.
- Can send push notifications.
- Integrate with Calendar and Contacts.
- Charge money through subscriptions or wallet integrations (Google Wallet/Apple Pay).
Native mobile development is fun!
I really enjoy building native apps! You possess so much power in tiny format. It’s a strange and fantastic feeling having your users interact with your work by touch of hand. You have unique and interesting limitations compared to backend and web development. Finally, nerding out, native, statically typed and compiled languages are fun to work in.
Challenges when building native mobile apps
Long-lasting battery is important to users. I’m sure you’ve pulled your phone out of your pocked and realized it’s dead. You don’t want to be the app who drains peoples battery.
This means you need to be aware of a few things in particular:
- Excessive CPU/GPU processing
- Screen activity
- Antenna usage, network requests and GPS usage
In fact this is a classic interview question asked for mobile engineering roles.
To avoid these issues offload heavy tasks to a backend; avoid unnecessary network activity (use caching/batching); do you need the highest fidelity GPS position or is “within 100 meters” enough?
Short attention span and User Experience on mobile
Important to consider user attention when designing for mobile and wearable apps. Statistics reveal longer user sessions on media apps, social media apps and games. Other apps see mostly short, task-oriented sessions, which means we have a challenge with short attention span. It’s even more true on wearables where sessions are measured in seconds, not minutes.
Another concern to keep in mind is that apps can, and commonly do, get killed by the OS. Make it easy for users to recover a task they had started. Background tasks are complicated with limited time to complete.
Dealing with bad connectivity
Just like offline is an opportunity, it’s also a challenge where you can often be in areas with bad connectivity. Cell phone signals are actually pretty bad outside of urban areas, and even in urban areas we can have areas of spotty connection, like inside large grocery stores. Something we worked hard on to workaround at Instacart.
Offline support isn’t just an opportunity, it’s a necessity.
Since it’s a common problem, we have a few tools at our disposal; use request caching or a local database (SQLite is common choice). Synchronize data to local storage to ensure you provide some value even when the user has a bad connection.
Mobile App Distribution challenges
Since you install apps directly on peoples devices, distribution and update cycles are very different from what you might be used to from the web and backend world.
People control their own devices making it harder to force them to upgrade, and upgrade cycles typically can take days or weeks. Dormant versions can stay on a device for months or years. Have a plan on how to to force upgrade and drop legacy support, remember to include your backend endpoints, as they will serve for a long time.
Releasing a new version of your app can be slow due to platform processes. You might need to wait several days to get an update out to your users. Today this mostly happens within a few hours on Android, and within a day on iOS, but don’t depend on it.
Another problem when releasing are platform rules. You’re at the mercy of platform providers to approve your app and they have strict and ever updating rules.
Make sure you have good crash handling and reporting. Since you can’t access the device like a server you need to have a tool for reporting and monitoring your crash rates and stack traces.
Since upgrade cycles are slow, you can’t fix a crash right away. Therefore it’s common to release new functionality behind feature flags. Feature flags are controlled by your backend and mobile apps check with the backend to see what functionality should be enabled. Using these can help you disable a new feature causing a crash, or synchronize the rollout of a new feature across platforms. Remember you can be punished by platform providers if you hide functionality from the app reviews.
At smaller companies it’s common to release new features as they are ready, but larger companies typically stick to a scheduled release cadence, weekly or bi-weekly are common.
Slower development speed for mobile apps
Due to all these challenges it’s typical to see somewhat slower development speed for mobile apps compared to web or backend services.
- Avoid taking too much risk with each update.
- It’s takes longer to release and distribute crash fixes.
- Attention to detail and rigorous testing and code reviews are strongly recommended.
- Use feature flags as much as possible!
Should you develop for Android or iOS first?
The answer might depend on the market you are trying to reach.
These global stats might help you make a choice:
|Number of app downloads||30%||70%|
|App or subscription purchases||65%||35%|
|Monthly spend on tech purchases||$101||$51|
These are global stats, if you are targeting a specific geographic area you should look up those specific numbers, for example in North America the share of iPhone sales is over 50%!
A couple of conclusion we can draw from this data:
- Android reaches a much larger audience.
- iOS users spend or are more prepared to pay for apps and services they use on the phones.
iOS development introduction
- Apps were originally written in Objective-C.
- Swift is the recommended language today, Apple is pushing developers in this direction.
- Xcode is the standard IDE, and in my opinion the best, but there are alternatives.
- iOS provides good privacy as a platform default, Apple works hard for their users in this area.
- Unfortunately, in part for privacy reasons, apps are very locked down, or contained in silos, this adds some development challenges.
- Heavily controlled App Store, tougher requirements and rules to get in. Apple uses manual review process heavily.
- If you want to build apps for Mac OS, Apple Watch or iPad, you get it without very little extra effort.
Android development introduction
- Apps originally written in Java, due to legal battles Java on Android was frozen several versions back.
- Kotlin is the new, recommended language. Preferred in most cases.
- Android Studio, based on IntelliJ IDEA is the standard IDE but others exist.
- Android has bad privacy. Google’s business is built around gathering all of your data, for better or worse.
- Easy to integrate with other apps and operating system.
- Uncomplicated marketplace, allows for faster app reviews and easier ruleset, both good and bad - many more copycats.
Cross-platform native apps
So why not develop your apps with a cross-platform ecosystem?
First let’s cover some common cross-platform ecosystems.
Developing apps with Xamarin
Xamarin is more established and has been around the longest, but less popular. Built by Microsoft, apps are written in C# .NET on top of a framework called Mono.
Developing apps with Flutter
Flutter is the new kid on the block. Developed by Google, apps are written in Dart and uses a C++ engine called SKIA. Flutter promises good testing & native integrations. Seems very interesting if you know, or are prepared to learn Dart.
Developing apps with React-Native
Pros and cons of cross-platform native apps
- “Write once, deploy everywhere” (in theory).
- Tooling is more open making it easier to setup your own systems.
- If you already know the language it will be faster to get started.
- Great for simpler apps like social media or apps originating from a web app.
- Typically provides hot-reloading capabilities.
- Even though code is shared, platforms require native UI and exceptions.
- Native support can be flaky, leading to user experience being negatively impacted.
- Might lack support for platform technology, like Machine Learning or Augmented Reality.
- Limited by community, when platform providers release new features you have to help out or wait for community to support these new features.
- Typically you still need some native development or people on your team with native skills.
- Some larger companies like AirBnB and LinkedIn report that it’s harder to find enough qualified developers.
How do you start developing native apps?
If you have an idea for a mobile app, before you jump into developement phase. Test a prototype with wireframes, or mockups. Due to the challenges of mobile app developement, it’s valuable to verify your ideas on paper before coding.
Some tools to use are:
- Balsamiq Mockups, great for low-fidelity mockups.
- InVision, great for turning existing designs into clickable prototypes.
- Figma, allows you to both design and create prototypes.
- Framer, another tool for creating prototypes with building blocks.
- Principle, makes it easy to work with animations and interactive prototypes.
Learning to code
There are tons of resources for learning how to develop for Android and iOS, for example Udemy or Coursera, two of my favorites are:
Resources for native development
You can’t really manage without the default native tools provided by Apple and Google, visit them to download Xcode or Android Studio and find platform documentation.
References to data provided in the slide notes.