Today, web developers are probably not mobile developers, and inverse might be true as well.

I remember when I first started writing software professionally, this was just after smartphones were really getting popular and everyone was making iOS and Android apps. Up until that point I had been doing LAMP stack - Linux, Apache, MySQL, and PHP (and of course, JavaScript on the UI), which is plain old web development.

When I started working I was being asked to work on Mobile Apps, specifically an iPad application. As I soon found out, mobile applications are a whole different ballgame and many of the challenges are unique.

What are the fundamental differences with Mobile Dev work?

The differences between mobile development and web development are huge when you really think about it. You are designing an application for a tiny computer that is only interacted with via a touch screen. This tiny computer frequently runs out of battery, loses internet connection (or has an impossibly slow connection), may have very little processing power, little disk space, and can sleep and switch off your application at any moment.

You also have access to a camera on the device, a set of photos recently captured, a contact book, alerts and notifications that can really be intrusive, GPS location and the functions of a phone (SMS and Voice calling). All of these can be overused and abused by developers.

Even just designing to handle touch events vs mouse click events can take some getting used to. You have the ability to touch and press with differing lengths of time (and now pressure), as well as gestures like swipes and slides.

Native vs Non-Native code

Native apps are applications written using the official development systems and languages for the platform. So for example in iOS, you will use XCode and Objective-C (or swift), or with Android you will use Android Studio and write in Kotlin (or Java).

Non-native apps are not written in these official languages or built using the official tools (these are also called "hyrbid" apps, or non-native apps).

The issue with this is most large organizations are going to need to make mobile apps that run on both Android and iOS devices. So you probably need completely separate development teams, and developers with different skill sets. Not a big deal for very large organizations with big budgets but this is a huge issue for startups and small companies.

The alternative to this is to use a cross-platform development framework like Cordova (used to be PhoneGap), Ionic, React Native, or Flutter. There are many more cross-platforms development frameworks than I just listed here, I will talk about it later. But for now let me just mention that using these frameworks comes with its own set of issues and trade-offs.

Languages and Technology used in iOS work

The apple ecosystem of app development is unique both in the languages used and tooling used. Everything from the development environment (using XCode, which only works on a Mac), to the programming languages, to understanding how to deal with the Apple app store and their review process is unique to Apple.

The original language for iOS app development used was Objective-C. This is a language that differs in syntax from basically every other popular development language. When you look for an Objective-C developer, you are really looking for somebody specialized in it. It has a learning curve and people know this. Most shops are picky about hiring iOS developers.

A newer language for iOS development has been released called Swift which has a lot of similarities to JavaScript. This language has a smaller learning curve, but you still need to understand all of the UI controls to make apps.

What is a UI Control? Well, these are the components like Buttons, and Lists, and Navigation Views. Understanding how these work is unique to iOS apps, so to be productive there is a learning curve of understanding the libraries of UI components you build and app with.

I mentioned the app review process for Apple, but that really is a huge issue. There are dozens of rules you need comply with to successfully publish an iOS app to the Apple App Store.

So again if you are asking random people with little or no iOS development experience if they want to apply for a job doing iOS app development, that is going to be hard to make work just in terms of getting people through an interview process.

Languages and Tech used in Android

Android is a very different ecosystem from iOS development. In general Android Studio is a little easier to work with than XCode (just my personal opinion) and Java is an extremely popular language so it is easier to find Java developers. You can also use Android studio on Windows, Linux, or OSX, so you that makes things easier too.

Google has an automated review process for the Google Play Store, and the rules are a bit less stringent than what you have to comply with for the Apple store.

Still, nonetheless there is a huge learning curve around using the UI components. Android in particular has had many versions and API changes over the years and dealing with compatibility issues with various API levels and versions of Android can be an issue. The android world is notorious for having to support really old versions of android, and really old versions of hardware.

Android in particular has another big complication: there are literally thousands of devices made by hundreds of companies that run Android. This is different from Apple devices where you generally know what the screen sizes are and the versions of hardware and operating system you are working against. This means every app needs to handle a large array of screen sizes, resolutions and aspect ratios, and it takes an experiences Android developer to know what works well.

Cross Platform Languages and Technologies

As mentioned earlier, cross platform development systems are used to save time maintaining two code bases. There are a lot of these so I am only going to mention a few. But the big thing to understand here is that if you see "cross platform" you need to understand it is technology that allows developers to write code in one language and use it multiple platforms (and in the case of mobile this means iOS and Android). So you are looking for proficiency in the language of the cross platform development framework.

A big player in cross-platform development is Cordova (well, not as much anymore). Cordova is essentially a framework that lets you wrap a website in a mobile application and be able to call APIs to use the camera, GPS, and special things like that. Cordova is more an underlying technology and people write frameworks on top of it like Ionic, and Framework 7.

This means a web developer can write a mobile application using cordova based technology without learning a new programming language and UI layout system. Generally in a cordova app you use HTML, JavaScript and CSS just like a normal web page so web developers can pick this up quickly.

However, cordova apps basically just open a mobile "web view" and run your website code inside of it so this causes two issues: one it almost always noticeably slower or "laggy" feeling. And two: you don't get to use the native UI components. So e.g. buttons in your app will not look like buttons are supposed to on an iPhone, or an Android device.

A cross platform app is also the same code based so e.g. on an iPhone you need back buttons, whereas back buttons are build into the android menu so you don't need them. Well now you need to do deal with this. Do you show an extra back button to your Android users? It is just another gotcha.

Another issue with Cordova apps is communicating between the underlying OS and the web view layer. You might have to write "native plugins" to do this and sometimes things like transferring large amounts of data (when you take a photo on a phone with a really nice camera) can be problematic. On older android phones the web view component can be very very old and slow and make your application barely functional. Again, these are all tradeoffs.

Xamarin is another very popular cross-platform that allows you to write cross platform code using .NET, so you might be able to find a strong .NET developer for Xamarin jobs.

How about newer systems like React Native?

React Native instantly gained popularity when it was released because it was a hybrid between native code and web based cross-platform tooling. Yes, you do write JavaScript for your application logic, but when you write React code to do UI layout, these components will correspond to native UI components in either Android or iOS. So your iPhone buttons look like iPhone buttons should, and the same thing happens on android, automatically.

In general, performance is also a lot better than Cordova. However, it is still a wrapper around a non-native runtime. Your JavaScript code is going to call plugins to work the Camera, GPS, Notification System, and Contact book (just to name a few things).

Another downside of React Native is that the components are totally different. So there is no such thing as a "div" in React Native code, and you need to use "View" components. This means once again you need to learn a UI component system different from the web so there is still a learning curve here.

I once tried to use React Native to write a component for a larger application that was UI heavy for a company that I worked for. Well, after about two or three months of trying we just had to give up eventually because we just could not get the UI to be responsive enough on both iOS and Android. We went back to using the native code for both platforms and scrapped the entire React Native project.

The Takeaway When Searching Candidates

The main takeaway here is this: Mobile Development is a specific skill set and not every developer will have it. Generally speaking there are a lot of mobile developers that can do some web development but the other way around is not always true. And what does tend to be true is that iOS developers are more specialized and the ecosystem is more complicated than android.

I will give you an example with my own background - I am a web developer and very experienced in both Java and React. I have dabbled a lot with mobile apps over the years. But I would not call myself an expert and not seek out work even as an Android developer (even though I am an experienced Java developer and that is the language used for Android work). I'm not sure I would seek out work as a React Native developer either, even though again, I have been doing React a long time and I have React Native experience. Mobile development work is just a different world in a lot of ways.

The other thing that seems to be true (in late 2019 as I write this) is that demand is very high for mobile developers and the rates they can charge are very high.