Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
6 lessons learned scaling mobile
Search
Jamie McDonald
March 17, 2016
Programming
1
330
6 lessons learned scaling mobile
Mobile @ Scale London, March 2016
Jamie McDonald
March 17, 2016
Tweet
Share
More Decks by Jamie McDonald
See All by Jamie McDonald
Async Android
jdamcd
10
650
Android Engineering for Scale
jdamcd
13
2.1k
Other Decks in Programming
See All in Programming
最新TCAキャッチアップ
0si43
0
200
flutterkaigi_2024.pdf
kyoheig3
0
150
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.3k
Macとオーディオ再生 2024/11/02
yusukeito
0
380
ヤプリ新卒SREの オンボーディング
masaki12
0
130
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
350
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.2k
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
110
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.3k
NSOutlineView何もわからん:( 前編 / I Don't Understand About NSOutlineView :( Pt. 1
usagimaru
0
340
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Why Our Code Smells
bkeepers
PRO
334
57k
The Invisible Side of Design
smashingmag
298
50k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Designing Experiences People Love
moore
138
23k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Rails Girls Zürich Keynote
gr2m
94
13k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Transcript
None
6 lessons learned scaling mobile Jamie McDonald & Matej Balantič
175M+ monthly unique listeners ~20 mobile engineers
1 Product over platform
SoundCloud Pulse
Aligned experience
None
2 Find opportunities to share
BFFs
Android iOS Mobile API Skippy Skippy Through the stack
More • Values • Practices • Knowledge
3 Confront technical debt
Brand new app Alternate approaches Modernise by vertical
Android • Legacy code • Small, incremental improvements • Re-build
vertical slices
Successive, well intentioned, changes to architecture throughout the lifetime of
a project can lead to a fragmented and hard-to-maintain code base Lava layers
Rewrite by abstraction
Rewrite by abstraction
None
• Legacy project by an external agency • Decision to
start from scratch • Big bang release* * except iPad which got delayed iOS
None
• Fresh start with code architecture • Away with legacy
code once and for all • Innovation on hold for a while • Might need to sacrifice existing features → angry users Rewrite aftermath
Positive side effect User complaints about iOS app crashes
4 Avoid premature reorganisation
The challenge Scaling the team
How we thought we’ll solve it Scaling the team
How it was in practice Scaling the team
Expectations Path to feature teams
Reality Path to feature teams
Current transitional structure Scaling the team
5 Empower teams
iOS/Android team Search Stations Sign-in Creators ... Traditional release model
Search Stations Sign-in Creators ... Relase train model
Empower teams • Everyone can ship to master* • Put
the code behind a feature flag • Enable the feature once ready to ship * Pairing required. When working alone you need 2x on your pull request.
Release train Feature development & QA Review / Public Beta
Feature freeze Feature freeze Feature freeze
Build time configuration "release": { "inherits_from": "adhoc", "dev_always_skippy": { "enabled":
false } } "release": { "inherits_from": "adhoc", "dev_always_skippy": { "enabled": true } }
Run time configuration
Behind the feature flag - (void)registerAppShortcuts { if ([FTSFlipTheSwitch isDevAppShortcutsEnabled])
{ [self registerInitialActions]; } }
“You break it, you buy fix it” • Continuous integration
allows us to trust that we’re not breaking features • Good unit and acceptance tests as an insurance policy
6 Invest in solid patterns and tools
Android • Reactive programming (RxJava) • Release pipeline • Architecture
& testability
LightCycle @Inject @LightCycle ActionBarUtil actionBarUtil; @Inject @LightCycle PlayerController playerController; public
MainActivity() { [...] }
iOS • Reactive programming (ReactiveCoca) • Stable CoreData stack •
Dependency inversion
None
Thank you, London! soundcloud.com/jobs Jamie McDonald -- @jdamcd Matej Balantič
-- @skavt
Mobile BFF: https://www.thoughtworks.com/insights/blog/bff-soundcloud Lava layer anti-pattern: http://mikehadlow.blogspot.de/2014/12/the-lava-layer-anti-pattern.html Branch by abstraction:
http://martinfowler.com/bliki/BranchByAbstraction.html Android architecture: https://realm.io/news/gotocph-mattias-kappler-reactive-architecture-android Mobile CI @ SoundCloud: https://www.youtube.com/watch?v=Rq721qtKKNk Dependency Inversion principle: http://martinfowler.com/articles/dipInTheWild.html References