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
350
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
680
Android Engineering for Scale
jdamcd
13
2.2k
Other Decks in Programming
See All in Programming
Flutterで分数(Fraction)を表示する方法
koukimiura
0
130
AIと人間の共創開発!OSSで試行錯誤した開発スタイル
mae616
2
730
What's new in Spring Modulith?
olivergierke
1
160
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
470
Go言語はstack overflowの夢を見るか?
logica0419
0
480
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
6
3.1k
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
1
320
実践Claude Code:20の失敗から学ぶAIペアプログラミング
takedatakashi
15
6.1k
「ちょっと古いから」って避けてた技術書、今だからこそ読もう
mottyzzz
11
6.9k
Swift Concurrency - 状態監視の罠
objectiveaudio
2
550
エンジニアインターン「Treasure」とHonoの2年、そして未来へ / Our Journey with Hono Two Years at Treasure and Beyond
carta_engineering
0
350
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
470
Featured
See All Featured
Designing for Performance
lara
610
69k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Site-Speed That Sticks
csswizardry
13
910
Raft: Consensus for Rubyists
vanstee
140
7.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
Facilitating Awesome Meetings
lara
56
6.6k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Code Review Best Practice
trishagee
72
19k
Rails Girls Zürich Keynote
gr2m
95
14k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
22k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
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