Top Banner
developers Prashant Sridharan and Bear Douglas github/coolasspuppy github/beardouglas @coolasspuppy @beardigsit Building Facebook’s Native Apps Tuesday, May 7, 13
52
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Building fb mobile

developers

Prashant Sridharan and Bear Douglasgithub/coolasspuppy

github/beardouglas@coolasspuppy

@beardigsit

Building Facebook’s Native Apps

Tuesday, May 7, 13

Page 2: Building fb mobile

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

Page 3: Building fb mobile

History

Tuesday, May 7, 13

Page 4: Building fb mobile

Facebook for Mobile

▪Web deeply engrained in Facebook’s DNA

▪Use HTML!/Javascript within “wrapper” native app

▪Developed our own framework for advanced integration(image uploads, photo browsers, mixing native/web elements)

Tuesday, May 7, 13

Page 5: Building fb mobile

HTML as an app platform

▪What does it bring us?

One CodebaseInstant Updates A/B Testing

Tuesday, May 7, 13

Page 6: Building fb mobile

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

Page 7: Building fb mobile

A few good engineers

▪Facebook for iOS !." 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

Page 8: Building fb mobile

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-#"$#

▪Reaction: we liked it…

Tuesday, May 7, 13

Page 9: Building fb mobile

Reaction

▪Press loved it

▪More importantly…

▪ Perceived Speed way up

▪ User Ratings way up

▪#x Speed increase!

Tuesday, May 7, 13

Page 10: Building fb mobile

Team

Tuesday, May 7, 13

Page 11: Building fb mobile

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

Page 12: Building fb mobile

Wake-up Call

▪News Feed team invented phenomenal new story type

▪ … but they weren’t thinking about !."

▪ … and we didn’t know about News Feed developments

▪Mad dash to port the story type to native code before !."

▪ 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

Page 13: Building fb mobile

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

Page 14: Building fb mobile

A multi-app ecosystem

Tuesday, May 7, 13

Page 15: Building fb mobile

The Team Sandwich

Release Team: Release & Stabilization ProcessRelease Team: Release & Stabilization ProcessRelease Team: Release & Stabilization ProcessRelease Team: Release & Stabilization ProcessRelease Team: Release & Stabilization Process

Photos Feed Search Places Messages

Core Team: Shared LibrariesCore Team: Shared LibrariesCore Team: Shared Libraries

Tuesday, May 7, 13

Page 16: Building fb mobile

Core Team: support and assist

▪Build core, shared libraries

▪ Infrastructure and integration

▪Keep the app fast and clean

Tuesday, May 7, 13

Page 17: Building fb mobile

Product Cycle

Tuesday, May 7, 13

Page 18: Building fb mobile

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

Page 19: Building fb mobile

Fixed Release Cycle

▪Ship an update every x weeks

▪ … no matter what

At Facebook we target a release every % weeks (approximately)

Tuesday, May 7, 13

Page 20: Building fb mobile

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

Page 21: Building fb mobile

Road to a new “Like Bar”

Tuesday, May 7, 13

Page 22: Building fb mobile

Development

Tuesday, May 7, 13

Page 23: Building fb mobile

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

Page 24: Building fb mobile

Source Control: Git

▪Distributed development

▪Designed for speed

▪Open source

▪Optimized for non-linear development

▪Allows local branching

Tuesday, May 7, 13

Page 25: Building fb mobile

Phabricator

Text

Tuesday, May 7, 13

Page 26: Building fb mobile

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

Page 27: Building fb mobile

Buildbot

Tuesday, May 7, 13

Page 28: Building fb mobile

Builds

Tuesday, May 7, 13

Page 29: Building fb mobile

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

Page 30: Building fb mobile

Tuesday, May 7, 13

Page 31: Building fb mobile

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

Page 32: Building fb mobile

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

Page 33: Building fb mobile

Testing

Tuesday, May 7, 13

Page 34: Building fb mobile

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

Page 35: Building fb mobile

http://github.com/facebook/xctool

xctool

Tuesday, May 7, 13

Page 36: Building fb mobile

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

Page 37: Building fb mobile

xctool

▪Replacement for ‘xcodebuild’

▪Runs Simulator tests

▪Structured output

▪ Phabricator support built-in

▪ Customizable to other build systems

Tuesday, May 7, 13

Page 38: Building fb mobile

Tuesday, May 7, 13

Page 39: Building fb mobile

Tuesday, May 7, 13

Page 40: Building fb mobile

http://github.com/facebook/buck

Buck

Tuesday, May 7, 13

Page 41: Building fb mobile

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

Page 42: Building fb mobile

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

Page 43: Building fb mobile

Build Target

//java/com/facebook/share:ui

Root of the repository

Directory where the build file can be found

Name of the build rule

Tuesday, May 7, 13

Page 44: Building fb mobile

Build Rule

android_library( name = 'ui', srcs = glob(['**/*.java']), deps = [ '//android_res/com/facebook/share:res', '//java/com/facebook/base:base', '//third-party/java/guava:guava', ], visibility = [ 'PUBLIC' ],)

Tuesday, May 7, 13

Page 45: Building fb mobile

Build File: Rules and Macros

Tuesday, May 7, 13

Page 46: Building fb mobile

Dependency Graph

AR AR

AR

ALAL AL

AL AL

AL

AB

GR

AB

GR

Tuesday, May 7, 13

Page 47: Building fb mobile

Dependency Graph

AR AR

AR

ALAL AL

AL AL

AL

AB

GR

AB

GR

Tuesday, May 7, 13

Page 48: Building fb mobile

How does IntelliJ feel about all of this?

buck project FTW!

Tuesday, May 7, 13

Page 49: Building fb mobile

Focus on Speed▪ Parallel builds

▪ Unit tests take ! minutes instead of "# by using $ threads

▪ Incremental

▪ Only rebuild what is necessary

Tuesday, May 7, 13

Page 50: Building fb mobile

Migration: August !"#!

AntBuck

!m"#s$m!#s

Tuesday, May 7, 13

Page 51: Building fb mobile

http://github.com/facebook/xctool

Now open source:xctool and Buck

http://github.com/facebook/buck

Tuesday, May 7, 13

Page 52: Building fb mobile

Future of Mobile @ Facebook

Tuesday, May 7, 13