Intro to Backbone.js by Azat Mardanov for General Assembly
Building fb mobile
1. developers
Prashant Sridharan and Bear Douglas
github/coolasspuppy
github/beardouglas
@coolasspuppy
@beardigsit
Building Facebook’s 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 Facebook’s 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
▪ Difficult memory management (<img>)
▪ Debugging and getting stack traces are extremely difficult
▪ 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 Facebook’s mobile UI!
▪ Couldn’t 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 won’t cut it
▪ Making Facebook a “mobile first” company
Tuesday, May 7, 13
12. Wake-up Call
▪ News Feed team invented phenomenal new story type
▪ … but they weren’t thinking about 5.0
▪ … and we didn’t 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 it’s “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 isn’t
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 profile
▪ 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 files 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 first
▪ …including bug fixes for Releases
▪ Release
▪ Once verified in Master…
▪ …“Release team” pulls them into Release branch
Tuesday, May 7, 13
34. Testing is important to Facebook
▪ Not in Facebook’s culture:
▪ SDEs “in Test”
▪ Large QA departments
▪ Definitely 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
▪ Doesn’t understand “Test” action in your Schemes
▪ Can’t 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 files from input files
▪ build file file (named BUCK) where build rules are declared
▪ build target string identifier 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