Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Working effectively at scale
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Francisco Díaz
November 29, 2019
Programming
340
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Working effectively at scale
Presented at BA:Swiftable in November, 2019.
Francisco Díaz
November 29, 2019
More Decks by Francisco Díaz
See All by Francisco Díaz
Inteligencia Artificial en PedidosYa - Una mirada pragmática
fdiaz
0
58
I hate public speaking. So why do I keep doing it?
fdiaz
0
180
Definiendo límites
fdiaz
1
170
Si odio hablar en público. ¿Por qué lo sigo haciendo?
fdiaz
2
200
Move fast and keep your code quality
fdiaz
1
450
De qué hablo cuando hablo de trabajo remoto
fdiaz
1
190
Setting Boundaries
fdiaz
1
220
Swift Values
fdiaz
0
190
Sisifo o Cómo empezar de nuevo - y otra vez.
fdiaz
0
180
Other Decks in Programming
See All in Programming
Java 27新機能 / Java 27 new features
kishida
2
190
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
150
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
230
SREの越境 / SRE Collaboration
y0hgi
2
290
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
33
15k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.4k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
290
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.8k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
480
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
470
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
380
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
How to make the Groovebox
asonas
2
2.5k
Practical Orchestrator
shlominoach
192
12k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
510
Git: the NoSQL Database
bkeepers
PRO
433
67k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
350
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
It's Worth the Effort
3n
188
29k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Transcript
Working e!ectively at scale
Francisco Díaz franciscodiaz.cl - @fco_diaz
Startups 2011 - 2017
Airbnb 2017 - today
None
None
None
None
None
None
None
None
None
organizations ... are constrained to produce designs which are copies
of the communication structures of these organizations — Conway's law
How do you divide your codebase?
Architectural layer
User Flow
What about Airbnb?
None
1 million lines of Swift
~80 commits to master on any given day to the
repo (Android + iOS)
Bigger buckets
None
A user should be able to wishlist a listing from
the booking flow
How do they relate with each other?
None
None
None
50 min local clean builds
~30 min !
Buck HTTP Cache https://github.com/airbnb/BuckSample
None
~5 min !
None
None
Dependency inversion
‣High-level modules should not depend on low- level modules. Both
should depend on abstractions. ‣Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.
None
A user should be able to wishlist a listing from
the booking flow
None
Easy! WishListDataSource + interface!
None
WishListDataSource is still visible
None
Socializing best practices
!
+60 iOS developers
Automating best practices
Groups Modules
Groups Modules Module Types
Module Types Feature + Interface Service + Interface
Feature A screen or a flow in the app
Service Manage shared state or resources
None
None
How do we enforce these best practices?
/services /service_interfaces /features /feature_interfaces
def service_interface( name, deps): max_visibility = [ "//ios/feature_interfaces/...", "//ios/features/...", "//ios/service_interfaces/...",
"//ios/services/...", ]
service_interface( name = "Networking", deps = [ "//ios/service_interfaces/Logging", ], )
feature( name = "Booking", deps = [ "//ios/service_interfaces/Networking", "//ios/service_interfaces/WishListService", ],
)
iOS Platform
Module creation needs to be easy
None
None
rake make:module
> Provide the type of module you want to create:
1: Non Platform 2: Feature 3: Feature Interface 4: Service 5: Service Interface 4 > New module name: Swiftable > Provide a high level description of this module: This is a module to present at Swiftable
Buck Human readable dependencies https://github.com/airbnb/BuckSample
feature( name = "Booking", deps = [ "//ios/service_interfaces/Networking", "//ios/service_interfaces/WishListService", "//ios/feature_interfaces/HelpCenter",
], )
None
Feature A screen or a flow in the app
None
None
None
Dev Apps
~1 min Dev Apps
Big buckets Small playgrounds
None
How do we get there?
~100 modules One module type: /libraries
libraries/AirbnbBooking libraries/AirbnbBusinessTravel libraries/AirbnbHelpCenter libraries/AirbnbListings libraries/AirbnbNetworking libraries/AirbnbWishLists ...
Before iOS Platform /libraries
On the iOS Platform /services /service_interfaces /features /feature_interfaces
How to get everybody on the iOS Platform?
Remove libraries/ and start over
!
Progressively migrate
Let's migrate WishLists Data Source
libraries/WishLists
None
None
None
What are the dependency rules for libraries/?
None
Inbound dependencies Outbound dependencies
Inbound dependencies Outbound dependencies
None
The interface module has stricter rules
Migrate all the call sites
As the owner of WishLists We don't control these
None
Calculated tech debt
Inbound dependencies Outbound dependencies
None
we know our usage of Networking
We control our dependencies
Allow inbound dependencies from libraries/ Don't allow outbound dependencies to
libraries/
libraries/ has access to the iOS Platform
The iOS Platform doesn't have access to libraries/
Code on the iOS Platform has good boundaries
while we allow for easier migration
def service_interface( name, visibility = []): max_visibility = [ "//ios/feature_interfaces/...",
"//ios/features/...", "//ios/service_interfaces/...", "//ios/services/...", ] add_visibility_for_legacy_module_structure(max_visibility)
def add_visibility_for_legacy_module_structure(visibility): visibility.extend([ "//ios/libraries/...", ])
We started migrating from the bottom up
Try it ourselves !rst
Pilot with others teams
Should I implement this?
Most likely NO
There's no silver bullet
Adapt
Summary 1. Figure out where you're struggling 2.Create and document
best practices 3.Automate best practices where needed
¡Gracias! franciscodiaz.cl/talks