In Praise of Native Apps

There is an ongoing debate, dating back to the early days of the Web, over whether it is better to write applications using native technologies or web technologies.

Like Richard Gabriel’s opinion of Lisp vs C, my opinion on native vs web has flip-flopped several times over the years. Currently, I’m in favor of native apps.

Before mobile, web apps were king

Before mobile, when apps were just a desktop thing, web apps made a lot of sense compared to native apps:

  • They were cross platform (PC, Mac, Linux)
  • They were much easier to distribute than physical media native desktop apps.

Mobile changed the balance between native and web apps

Mobile reduced the utility of web apps in several ways

  • Mobile devices have app stores, which put native apps on the same ease-of-distribution level as web apps.
  • Mobile apps need to work while not connected to the Internet.
  • Mobile devices have relatively slow hardware.
  • Mobile web browsers provide relatively few features.

Compared to web apps, native apps offer:

  • More stable platforms.
  • Languages more suitable for writing large programs.
  • Better IDEs.
  • Higher performance.
  • More access to hardware.
  • Better offline and background support.
  • Access to markets and payment systems (for initial purchase and IAP) that customers already trust and use.

Native apps are not necessarily more expensive to develop

Currently, outside of China, there are 3 major app platforms: desktop web, Android, and iOS. At first glance it seems this would make native apps three times more expensive to write than web apps. But the actual overhead is probably closer to less than two times more expensive,

Multi-platform native application development teams tend to organize into four sub teams: a cross-platform “back end” team, plus three “front end” teams that write the native code for each client.

A web app can be developed with two teams: a back-end team and a front-end team, and a few platform-specific specialists.

Therefore, multi-platform native development tends to require 4x people while web app development tend to require slightly more than 2x people, which means that multi-platform native development ends up costing slightly less than twice as much as web app development.

Often it makes sense to start developing for just one native platform, and only expand to the other platforms later, once the concept has been proven. In that case, single-platform native development costs roughly the same as web app development during the risky pre-product-market-fit stage of development.

Native apps can learn some things from web apps

I’ve noticed that many large native apps tend to develop their own ad-hoc web-app-like features. For example, it is common for large native apps to use some form of downloadable UI configuration data. This enables rapid UI iteration and A/B testing. Oftentimes this configuration data ends up looking a lot like a buggy, informally specified implementation of half of HTML/CSS/JavaScript. Call it Greenspun’s 11th rule.

For games, cross-platform development makes more sense

Many game developers use the cross-platform Unity and Unreal Engine platforms. They are used partly because they are excellent game engines, and partly because there are so many different video game platforms that write-once becomes more economically attractive.

The success of cross-platform game engines shows that one way web apps could gain a competitive advantage over native apps is by providing a superior development experience.