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
Working effectively at scale
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Francisco Díaz
November 29, 2019
Programming
330
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
41
I hate public speaking. So why do I keep doing it?
fdiaz
0
170
Definiendo límites
fdiaz
1
160
Si odio hablar en público. ¿Por qué lo sigo haciendo?
fdiaz
2
190
Move fast and keep your code quality
fdiaz
1
430
De qué hablo cuando hablo de trabajo remoto
fdiaz
1
180
Setting Boundaries
fdiaz
1
200
Swift Values
fdiaz
0
180
Sisifo o Cómo empezar de nuevo - y otra vez.
fdiaz
0
170
Other Decks in Programming
See All in Programming
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
250
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
440
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
4.7k
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
550
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
800
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
290
5分で問診!Composer セキュリティ健康診断
codmoninc
0
830
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.4k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
190
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
580
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
150
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
200
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
Building Applications with DynamoDB
mza
96
7.2k
Music & Morning Musume
bryan
47
7.3k
Statistics for Hackers
jakevdp
799
230k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
920
WENDY [Excerpt]
tessaabrams
11
39k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
500
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
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