This document summarizes a presentation about building Facebook's native mobile apps. It discusses:
1. The history of moving from a HTML/web-based mobile app to native iOS and Android apps in order to improve performance and the user experience.
2. The organizational structure that was developed, including product teams, a core team, and a release team to coordinate updates across many apps.
3. The development processes used, including source control with Git, code review with Phabricator, continuous integration with Buildbot, and a focus on unit testing with tools like xctool and Buck.
1 of 52
Downloaded 15 times
More Related Content
Building fb mobile
1. developers
Prashant Sridharan and Bear Douglas
github/coolasspuppy
github/beardouglas
@coolasspuppy
@beardigsit
Building Facebooks Native Apps
Tuesday, May 7, 13
2. Agenda
Over the wall: some history
Product Teams and the Core Team
Scheduling and Stabilizing Releases
How We Develop
Eating the Dogfood: Builds
A Culture of Unit Testing
Future of iOS at Facebook
Tuesday, May 7, 13
4. Facebook for Mobile
Web deeply engrained in Facebooks DNA
Use HTML5/Javascript within wrapper native app
Developed our own framework for advanced integration
(image uploads, photo browsers, mixing native/web elements)
Tuesday, May 7, 13
5. HTML as an app platform
What does it bring us?
One CodebaseInstant Updates A/B Testing
Tuesday, May 7, 13
6. HTML as an app platform
Frequent performance problems
No coherent multithreading strategy in web apps
DOM manipulations and layout can spin out of control, lots of hacks
Dif鍖cult memory management (<img>)
Debugging and getting stack traces are extremely dif鍖cult
Limited animations and effects
Tuesday, May 7, 13
7. A few good engineers
Facebook for iOS 5.0 began as an experiment
Could we achieve better results with native code?
High barrier: rewrite all of Facebooks mobile UI!
Couldnt disrupt company
Move this to a war room!
Tuesday, May 7, 13
8. Winding Road
Lots of changes along the way:
Led to a rethink about how our APIs fetch data
Experimented with advanced rendering to make feed smooth
Sprinkle in some design changes
Plenty of wrangling with Core Data and Core Animation
Shipped internally starting in mid-2012
Reaction: we liked it
Tuesday, May 7, 13
9. Reaction
Press loved it
More importantly
Perceived Speed way up
User Ratings way up
2x Speed increase!
Tuesday, May 7, 13
11. Scaling it Up
We got it out the door, but
A few iOS engineers in a room wont cut it
Making Facebook a mobile 鍖rst company
Tuesday, May 7, 13
12. Wake-up Call
News Feed team invented phenomenal new story type
but they werent thinking about 5.0
and we didnt know about News Feed developments
Mad dash to port the story type to native code before 5.0
Not an experience we wanted to repeat!
Lots of cooperation required to keep abreast of product developments:
news feed, timeline, comments, photos, pages, places, events,
Tuesday, May 7, 13
13. Prioritization and resources
Every product wanted their features in the new native app
Overwhelmed by prioritizing so many requests
iOS Team still had very limited resources
Tuesday, May 7, 13
18. Timing Releases
Simple model: Release X will have features A, B, C
Next release at mercy of the slowest product team
No choice but to wait until its done
This slowed us down, and we want to move fast
Tuesday, May 7, 13
19. Fixed Release Cycle
Ship an update every x weeks
no matter what
At Facebook we target a release every
4 weeks (approximately)
Tuesday, May 7, 13
20. Building features with an off switch
Every feature must be built with a way to
turn it off
If a feature destabilizes the build or isnt
complete, turn it off and try again next
time
#defines or runtime switches
(preferred)
Tuesday, May 7, 13
23. Process
Engineers make changes locally
Submit changes for review
Changes are automatically checked for build and unit test failures
Team members review & suggest changes
Once approved, submit to master
Tuesday, May 7, 13
24. Source Control: Git
Distributed development
Designed for speed
Open source
Optimized for non-linear development
Allows local branching
Tuesday, May 7, 13
26. Arcanist
The command line counterpart to Phabricator
arc lint
Checks for common errors:
Null pointers
Syntax errors and style guideline violations
Using APIs unavailable in all supported Android versions
arc land
Pushes code into the tree
Tuesday, May 7, 13
29. Downloading builds
Deployed to entire company
Signed with Enterprise Distribution pro鍖le
Daily builds posted to internal web site
Installed directly on device
Use different Bundle IDs for different builds
Tuesday, May 7, 13
31. Rage Shake
Take out your stress on the device
Captures:
Screen shot (with annotations!)
Network logs
Last crash log
Last x-seconds of logging
Dumps the view hierarchy
Automatically 鍖les a bug and sends it to Facebook
Tuesday, May 7, 13
32. Branching
Two concurrent branches:
Master
Engineers make progress on future features
All changes checked in here 鍖rst
including bug 鍖xes for Releases
Release
Once veri鍖ed in Master
Release team pulls them into Release branch
Tuesday, May 7, 13
34. Testing is important to Facebook
Not in Facebooks culture:
SDEs in Test
Large QA departments
De鍖nitely in Facebook culture:
High quality, reliable user experience
We believe in developer-authored unit tests
Tuesday, May 7, 13
36. Unit Testing on iOS
Some built-in Xcode support:
OCMock & SenTestingKit
Uses dynamic nature of Objective-C
Easy to set-up, and well documented
BUT
Many iOS engineers unfamiliar with testing
Frameworks are immature
Incomplete support in xcodebuild
Doesnt understand Test action in your Schemes
Cant run tests that require Simulator
Tuesday, May 7, 13
37. xctool
Replacement for xcodebuild
Runs Simulator tests
Structured output
Phabricator support built-in
Customizable to other build systems
Tuesday, May 7, 13
41. We needed a better tool
Minimal overhead in creating a module
Keep boilerplate out of the codebase
IDE friendly
Faster clean builds
Faster incremental builds
Support ad-hoc build steps
Tuesday, May 7, 13
42. Buck: an Android build system
build rule procedure for producing output 鍖les from input 鍖les
build 鍖le 鍖le (named BUCK) where build rules are declared
build target string identi鍖er for a build rule
Tuesday, May 7, 13
48. How does IntelliJ feel about all of this?
buck project FTW!
Tuesday, May 7, 13
49. Focus on Speed
Parallel builds
Unit tests take 4 minutes instead of 20 by using 8 threads
Incremental
Only rebuild what is necessary
Tuesday, May 7, 13