Stream the Latest Episode
Available now on Spotify, YouTube and Apple. See the episode transcript at the top of this page.
Brought to You By
DX → DX is an engineering intelligence platform designed by leading researchers
—
In This Episode
In today’s exciting episode of The Pragmatic Engineer, I am joined by two founding native mobile engineers from Notion: Austin Louden and Karn Saheb. Austin and Karn joined Notion in 2019 when Notion started to revamp its iOS and Android apps. Today, Notion's mobile apps are used by tens of millions of users.
In our conversation today, we take a deep dive into how the Notion mobile team operates and discuss:
The engineering culture at Notion
Why the mobile team focuses so much on app performance
How the mobile team rewrote the mobile app from webviews and Cordova to a native implementation
Notion’s tech stack and frameworks they rely on
Details on the development process, including four types of environments, approaches to using modules, and practices around feature flags
How the mobile team maintains consistency across iOS and Android
… and much more!
Takeaways
My biggest takeaways from this fascinating conversation:
1. Notion’s underlying data model is both flexible, but also tricky to work with. It was interesting to hear how much work Notion’s underlying data model created for the mobile engineering team. Notion chose a flexible data model that makes it easy to change parts of a document. However, this flexibility means a lot of added engineering complexity for all clients – including on mobile!
2. Notion’s native mobile team is surprisingly small. Notion employs about 600 staff, but the mobile team is only 11 people – including iOS and Android. This team size is very small, especially considering how Notion serves more than 10M users on both iOS and Android. We’re likely talking about one engineer for every ~2M or more users!
While the team is small, it is very senior. It would be hard to see such a small team operate efficiently any other way. How Notion’s mobile team operates – preferring a small and senior team – fits into the trend we discussed previously in Is there a drop in native iOS and Android hiring at startups?
3. Moving from web-based to native was an incremental process by necessity. Thanks to a small native team, and the need to keep the mobile apps up-to-date with the latest Notion features, the native mobile engineering team didn’t have the luxury of doing a large mobile app rewrite.
Instead, they did the sensible thing of slowly migrating parts of the app. Today, most of Notion’s apps are fully native, save for the editor. The editor remains one of the most complex parts of Notion.
4. Notion releases their app on a weekly cadence. Native mobile apps need to go through an app review flow from Apple and Google, and so many native apps are released less frequently, to account for this overhead. Notion doing a weekly release cycle is impressive – and it can serve as inspiration for other native mobile teams.
If Notion, with 10M+ native users and a small team, does this, other native teams can as well!
5. Feature flags are a must-have for native mobile apps at the scale of Notion. The Notion team uses feature flags extensively as a way to roll out new features and roll back code that could cause issues. With native mobile apps where code is shipped as binary, feature flags become especially important – as this example also shows.
The Pragmatic Engineer deepdives relevant for this episode
Timestamps
(00:00) Intro
(02:03) The RFC process at Notion
(06:00) How Notion uses internal channels to share RFCs
(07:57) Some of the unique ways the mobile team works
(11:07) Why they don’t do sprint planning at Notion—and what they do instead
(12:57) An overview of the size of Notion and teams at Notion
(13:15) The beginning of mobile at Notion
(14:40) A simple explanation of Cordova
(15:40) Why Notion decided to revamp mobile in 2019 and shift to Native
(18:30) How the mobile team evaluated performance as they made the shift to Native
(22:00) Scaling mobile and iterations of moving to Native
(26:04) Why the home tab project was so complex
(30:59) Why the mobile team saved the editor for last and other future problems
(34:35) How mobile works with other teams
(36:50) How iOS and Android teams work together
(38:28) The tech stack at Notion
(39:30) How frameworks are used
(41:57) Pros and cons of different frameworks and why Swift was the right choice
(45:16) How code reviews work at Notion
(48:23) Notion’s mobile team’s testing philosophy
(50:18) How the mobile team keeps compile time so fast
(52:36) Modules in the iOS app
(54:50) Modules in the Android app
(56:44) Behind the scenes of an app release and the public beta
(1:00:34) Practices around feature flags
(1:03:00) The four dev environments at Notion
(1:04:48) How development apps work
(1:07:40) How and why you can work offline in Notion mobile
(1:10:24) Austin and Karn’s thoughts on the future of mobile engineering
(1:12:47) Advice for junior engineers
(1:16:29) Rapid fire round
Resources & Mentions
The Pragmatic Engineer deepdives relevant for this episode:
•
Where to find Austin Louden:
• GitHub: https://github.com/austinlouden
• LinkedIn: https://www.linkedin.com/in/austinlouden
• Website: https://austinlouden.com/
Where to find Karn Saheb:
• GitHub: https://github.com/Karn
• LinkedIn: https://github.com/Karn
• Website: https://karn.io
Mentions during the episode:
• How Notion Uses Notion: https://www.notion.com/blog/how-notion-uses-notion
• Cordova: https://cordova.apache.org
• React Native: https://reactnative.dev
• Coinbase: https://www.coinbase.com
• SQLite: https://www.sqlite.org
• Swift: https://www.swift.org
• Webview: https://developer.microsoft.com/en-us/microsoft-edge/webview2
• Combine: https://developer.apple.com/documentation/combine
• Compose: https://www.jetbrains.com/compose-multiplatform
• Stacked Diffs (and why you should know about them): https://newsletter.pragmaticengineer.com/p/stacked-diffs
• Graphite: https://graphite.dev
• Bazel: https://bazel.build
• Buck: https://buck.build
• Point Free: https://www.pointfree.co
• Cursor: https://www.cursor.com
• Objective-C: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html
• Skunk Works: A Personal Memoir of My Year at Lockheed: https://www.amazon.com/Skunk-Works-Personal-Memoir-Lockheed/dp/0316743305
• Lockheed SR-71 Blackbird: https://en.wikipedia.org/wiki/Lockheed_SR-71_Blackbird
• A Philosophy of Software Design: https://www.amazon.com/Philosophy-Software-Design-2nd/dp/173210221X
• Building Mobile Apps at Scale: 39 Engineering Challenges: https://www.amazon.com/Building-Mobile-Apps-Scale-Engineering/dp/1638778868
Production and marketing by https://penname.co/. For inquiries about sponsoring the podcast, email podcast@pragmaticengineer.com.
Share this post