SlideShare a Scribd company logo
1 of 38
Download to read offline
Preparing For Growth 16.04.2021 1
Spotify
Preparing for Growth
Architecting Giant Apps for Scalability and Build Speed


Bruno Rocha - iOS Engineer @ Spotify
2
Preparing For Growth 16.04.2021
Spotify
How does an iOS app
evolve overtime?
Preparing For Growth 16.04.2021 3
Spotify
"Level 1" app


A monolith
All Classes All Resources
Features


- Single module


- MVC


- Simple features


- No testing


- Direct navigation
MyAppModule
Preparing For Growth 16.04.2021 4
Spotify
"Level 2" app


A larger (but better) monolith
MyAppModule
Feature1 Feature2
Feature3 Feature4
Feature5 Feature6
Feature7 Feature8
The app is now larger, but not
large enough to be a big issue
New Features


- Usage of protocols and composition


- A more testable architecture


- Features are slightly more complex


- Presence of unit testing


- Navigation with injection
Preparing For Growth 16.04.2021 5
Spotify
Feature
Feature
Feature
Feature
Feature
Feature
Feature
Feature
Feature
Feature
Feature Feature
MyAppModule
⚠ Slow build times!
Module cache invalidated!
Preparing For Growth 16.04.2021 6
Spotify
Onboarding
"Level 3" app


A modularized app
Home
FeatureFlags NetworkSDK
New Features


- More modules means less cache
misses


- Compilation of modules individually


- Better structure/division of concerns
in general
Preparing For Growth 16.04.2021 7
Spotify
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
New... features?


- ⚠ Slow build times! (...again?)


- ⚠ Awful launch times


- ⚠ Small changes are impossible


- ⚠ Navigation changes are almost
impossible


- ⚠ Architectural changes are
impossible


- ⚠ Isolated development compiles half
the app
Preparing For Growth 16.04.2021 8
Spotify
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Level 1 problems:


Quantity of code
Level 2 problems:


Testability of code
Level 3 problems:


Structure/Isolation of code
Level 4 problems:


Module architecture
Preparing For Growth 16.04.2021 9
Spotify
Dynamic Frameworks


.dylibs loading in runtime might cause launch
performance issues


Each additional framework that your app loads adds to the launch time.
Although dyld caches a lot of this work in a launch closure when the user
installs the app, the size of the launch closure and the amount of work done
after loading it still depend on the number and sizes of the libraries loaded.
Linking Static Libraries instead can improve launch time
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Preparing For Growth 16.04.2021 10
Spotify
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Preparing For Growth 16.04.2021 11
Spotify
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Preparing For Growth 16.04.2021 12
Spotify
Direct Dependencies


Directly depending on concrete
implementation modules makes cache
invalidation more common and makes the
app inflexible (harder to add new screens in
the middle of the flow)
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
Preparing For Growth 16.04.2021 13
Spotify
Module Module Module Module
Module Module Module Module
Module Module Module Module
Module Module Module Module
👑
Minions, destroy this
app.
Preparing For Growth 16.04.2021 14
Spotify
Module Module Module Module
Now: Horizontal Dependencies
Module Module
Previous:Vertical Dependencies
Module Module
Preparing For Growth 16.04.2021 15
Spotify
Module Module Module Module
"Level 4" app


Modules don’t depend on each other, navigation is dynamic
Module Module Module Module
Module Module Module Module
UI
Preparing For Growth 16.04.2021 16
Spotify
Classes / Structs
Protocols
Feature
Feature
Classes / Structs
Protocols
Feature2
❔
Preparing For Growth 16.04.2021 17
Spotify
Protocols
FeatureAPI
Classes/Structs
Feature (Concrete)
Protocols
Feature2API
Classes/Structs
Feature2 (Concrete)
Concrete modules shouldn’t
depend on other concrete modules!
API/Impl Module Pair


Incremental build time issues may still exist when making
changes directly in the API modules, but they are now a
much rarer occurrence.
Preparing For Growth 16.04.2021 18
Spotify
Protocols
FeatureAPI
Classes/Structs
Feature (Concrete)
Protocols
Feature2API
Classes/Structs
Feature2 (Concrete)
How to navigate


to Feature2?
Dependency Engine
Preparing For Growth 16.04.2021 19
Spotify
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
AppDelegateModule (.app)
🗒 ClassList
🗒 APIRequest
ConcreteClass
Preparing For Growth 16.04.2021 20
Spotify
SPTServiceSystem


Manages a graph of SPTServices, working as a runtime
dependency injector that handles the lifecycle of every
Spotify feature.
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
Feature
FeatureAPI
MainModule (.app)
🗒 ClassList
Preparing For Growth 16.04.2021 21
Spotify
Networking (Concrete)
NetworkService: NetworkAPI
AppDelegateModule (.app)
(SPTServiceSystem)
Hey! I have a service that
implements "NetworkAPI".
👍
HomeModule
Hey! Can you provide me the impl of
"NetworkAPI"?
👍


(Inject "NetworkService")
Preparing For Growth 16.04.2021 22
Spotify
Service Scopes


A group of services, allowing fine-grained service access control.
1 2 3 4
LoggedInScope
5 6 7 8 9 10 11 12
13 14 15 16
17 18 19 20
LaunchScope
CarPlayScope
SiriScope
HomeScope
Preparing For Growth 16.04.2021 23
Spotify
final class SiriIntentsService: SPTService, SiriIntentsAPI {







}
func load() {


print(”SiriService loaded”)


}
func unload() {


print(”SiriService unloading”)


}
static let serviceIdentifier= SiriIntentsAPI.self
@Dependencyvar connectivity: ConnectivityAPI
@Dependencyvar keychain: KeychainAPI
import ConnectivityFeatureAPI
import KeychainFeatureAPI
Preparing For Growth 16.04.2021 24
Spotify
features/siriintents/services.yaml
- SiriIntentsService (SiriScope)


- MyService (MyScope)


- MyOtherService (MyScope)


- MySuperSecretFeatureSerice (MyScope)
Preparing For Growth 16.04.2021 25
Spotify
let serviceList = SPTServiceList()


let serviceOrchestrator = ServiceOrchestrator(services: serviceList)
1
2
3
4
5
6
7
8
Directed Acyclic Graph (DAG)
[8, 7, 6, 4, 2, 5, 3, 1]
Load/Notify Order
Unload Order
(Topologically Sorted)
Preparing For Growth 16.04.2021 26
Spotify
let serviceList = SPTServiceList()


let serviceOrchestrator = ServiceOrchestrator(services: serviceList)
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
Not in memory
Lazy reference injected
Loaded in memory
serviceOrchestrator.activate(scope: "LaunchScope")
serviceOrchestrator.load(NavigationService.self, fromScope: "LaunchScope")
serviceOrchestrator.load(CrashReporterService.self, fromScope: "LaunchScope")
Preparing For Growth 16.04.2021 27
Spotify
serviceOrchestrator.deactivate(scope: ”CarPlayScope”)
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
LaunchScope
LoggedInScope
CarPlayScope
1
2
3
4
5
6
7
8
28
Preparing For Growth 16.04.2021
Spotify
Isolated Development


(Mini apps)
Preparing For Growth 16.04.2021 29
Spotify
FeatureA
FeatureAAPI
FeatureBAPI
FeatureB
FeatureC
FeatureCAPI
FeatureD
FeatureDAPI
FakeFeatureB
MyApp
Preparing For Growth 16.04.2021 30
Spotify
FeatureA
FeatureAAPI
FeatureBAPI
FakeFeatureB
FeatureADemoApp
Preparing For Growth 16.04.2021 31
Spotify
Mini Apps


Horizontal dependencies allow the creation
of minified example apps. Huge productivity
boost!
FeatureA
FeatureAAPI
FeatureBAPI
FakeFeatureB
FeatureADemoApp
32
Preparing For Growth 16.04.2021
Spotify
Dynamic Navigation
Preparing For Growth 16.04.2021 33
Spotify
Module Module Module Module
Dynamic Navigation


Not having explicit dependencies mean we can go anywhere from anywhere
Module Module Module Module
Module Module Module Module
UI
Preparing For Growth 16.04.2021 34
Spotify
final class ProfilePage: SPTService, ProfilePageAPI {






}
func load() {


navigation.register(”page-profile”) { _ in


return ProfileViewController()


}


}
static let serviceIdentifier= ProfilePageAPI.self
@Dependencyvar navigation: NavigationAPI
import NavigationFeatureAPI
Preparing For Growth 16.04.2021 35
Spotify
func navigateToProfile() {


navigation.push(”page-profile”)


}
Preparing For Growth 16.04.2021 36
Spotify
Backend-Driven UI
page-playlist?id=f8sn03k page-playlist?id=v92kalp
page-charts
page-new
page-videos
page-podcasts
(HubsRenderer)
Preparing For Growth 16.04.2021 37
Spotify
iOS App Evolution


Amount of issues when evolving
Level 1 Level 2 Level 3 Level 4 Level 5
No issues!
Some
issues.
Some bigger
issues.
TONS of
issues.
????
Preparing For Growth 16.04.2021 38
Spotify
@rockbruno_

More Related Content

What's hot

Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? 정민 안
 
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー! すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー! dcubeio
 
Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!Animesh Singh
 
Gerrit Code Review with GitHub plugin
Gerrit Code Review with GitHub pluginGerrit Code Review with GitHub plugin
Gerrit Code Review with GitHub pluginLuca Milanesio
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptWojciech Dzikowski
 
Polygot Java EE on the GraalVM
Polygot Java EE on the GraalVMPolygot Java EE on the GraalVM
Polygot Java EE on the GraalVMRyan Cuprak
 
Minimal Viable Architecture - Silicon Slopes 2020
Minimal Viable Architecture - Silicon Slopes 2020Minimal Viable Architecture - Silicon Slopes 2020
Minimal Viable Architecture - Silicon Slopes 2020Randy Shoup
 
Web assembly - Future of the Web
Web assembly - Future of the WebWeb assembly - Future of the Web
Web assembly - Future of the WebCodeValue
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Norito Agetsuma
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Steve Pember
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Kenjiro Kubota
 
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること 【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること 日本マイクロソフト株式会社
 
RESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web APIRESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web API💻 Spencer Schneidenbach
 
DI Container를 이용하여 레거시와 모듈화를 동시에 잡기
DI Container를 이용하여 레거시와 모듈화를 동시에 잡기DI Container를 이용하여 레거시와 모듈화를 동시에 잡기
DI Container를 이용하여 레거시와 모듈화를 동시에 잡기정민 안
 
Web Assembly Big Picture
Web Assembly Big PictureWeb Assembly Big Picture
Web Assembly Big PictureYousif Shalaby
 

What's hot (20)

Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
 
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー! すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
すごーい!APIドキュメントを更新するだけでAPIが自動テストできちゃう!たのしー!
 
Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!
 
Gerrit Code Review with GitHub plugin
Gerrit Code Review with GitHub pluginGerrit Code Review with GitHub plugin
Gerrit Code Review with GitHub plugin
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to Microservices
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern Javascript
 
Springboot Microservices
Springboot MicroservicesSpringboot Microservices
Springboot Microservices
 
Polygot Java EE on the GraalVM
Polygot Java EE on the GraalVMPolygot Java EE on the GraalVM
Polygot Java EE on the GraalVM
 
Source control
Source controlSource control
Source control
 
Minimal Viable Architecture - Silicon Slopes 2020
Minimal Viable Architecture - Silicon Slopes 2020Minimal Viable Architecture - Silicon Slopes 2020
Minimal Viable Architecture - Silicon Slopes 2020
 
Web assembly - Future of the Web
Web assembly - Future of the WebWeb assembly - Future of the Web
Web assembly - Future of the Web
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
 
Gitlab CI/CD
Gitlab CI/CDGitlab CI/CD
Gitlab CI/CD
 
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること 【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
 
RESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web APIRESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web API
 
DI Container를 이용하여 레거시와 모듈화를 동시에 잡기
DI Container를 이용하여 레거시와 모듈화를 동시에 잡기DI Container를 이용하여 레거시와 모듈화를 동시에 잡기
DI Container를 이용하여 레거시와 모듈화를 동시에 잡기
 
Gitlab ci-cd
Gitlab ci-cdGitlab ci-cd
Gitlab ci-cd
 
Web Assembly Big Picture
Web Assembly Big PictureWeb Assembly Big Picture
Web Assembly Big Picture
 

Similar to Preparing For Growth: Architecting Giant Apps for Scalability and Build Speed

Christopher Allen’s Presentation at eComm 2009
Christopher Allen’s Presentation at eComm 2009Christopher Allen’s Presentation at eComm 2009
Christopher Allen’s Presentation at eComm 2009eCommConf
 
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay ScreensLiferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay ScreensDenis Signoretto
 
Spring Boot with Kotlin, Kofu and Coroutines
 Spring Boot with Kotlin, Kofu and Coroutines Spring Boot with Kotlin, Kofu and Coroutines
Spring Boot with Kotlin, Kofu and CoroutinesVMware Tanzu
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019UA Mobile
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Eugene Kurko
 
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-systemZ sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-systemNagendra Babu
 
Christopher Allen's Presentation at eComm 2009
Christopher Allen's Presentation at eComm 2009Christopher Allen's Presentation at eComm 2009
Christopher Allen's Presentation at eComm 2009eCommConf
 
.NET Application Modernization with PAS and Azure DevOps
.NET Application Modernization with PAS and Azure DevOps.NET Application Modernization with PAS and Azure DevOps
.NET Application Modernization with PAS and Azure DevOpsVMware Tanzu
 
Microsoft silverlight : top 10 features
Microsoft silverlight : top 10 features Microsoft silverlight : top 10 features
Microsoft silverlight : top 10 features Diya Singh
 
MOCA iBeacons SDK for iOS 7
MOCA iBeacons SDK for iOS 7MOCA iBeacons SDK for iOS 7
MOCA iBeacons SDK for iOS 7MOCA Platform
 
Top Cordova Challenges and How to Tackle Them
Top Cordova Challenges and How to Tackle ThemTop Cordova Challenges and How to Tackle Them
Top Cordova Challenges and How to Tackle ThemIonic Framework
 
Mobilefirst - Build Enterprise Class Apps for Mobile First
Mobilefirst - Build Enterprise Class Apps for Mobile First Mobilefirst - Build Enterprise Class Apps for Mobile First
Mobilefirst - Build Enterprise Class Apps for Mobile First Sanjeev Kumar
 
Claromentis Tech RoadMap 2015
Claromentis Tech RoadMap 2015Claromentis Tech RoadMap 2015
Claromentis Tech RoadMap 2015claromentis
 
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the FutureEclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the FutureTonny Madsen
 
Build PWA with Ionic Toolkit
Build PWA with Ionic ToolkitBuild PWA with Ionic Toolkit
Build PWA with Ionic ToolkitPavel Kurnosov
 

Similar to Preparing For Growth: Architecting Giant Apps for Scalability and Build Speed (20)

Christopher Allen’s Presentation at eComm 2009
Christopher Allen’s Presentation at eComm 2009Christopher Allen’s Presentation at eComm 2009
Christopher Allen’s Presentation at eComm 2009
 
Codename one
Codename oneCodename one
Codename one
 
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay ScreensLiferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
 
Spring Boot with Kotlin, Kofu and Coroutines
 Spring Boot with Kotlin, Kofu and Coroutines Spring Boot with Kotlin, Kofu and Coroutines
Spring Boot with Kotlin, Kofu and Coroutines
 
Ionic2 First Lesson of Four
Ionic2 First Lesson of FourIonic2 First Lesson of Four
Ionic2 First Lesson of Four
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-systemZ sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
 
Christopher Allen's Presentation at eComm 2009
Christopher Allen's Presentation at eComm 2009Christopher Allen's Presentation at eComm 2009
Christopher Allen's Presentation at eComm 2009
 
.NET Application Modernization with PAS and Azure DevOps
.NET Application Modernization with PAS and Azure DevOps.NET Application Modernization with PAS and Azure DevOps
.NET Application Modernization with PAS and Azure DevOps
 
Microsoft silverlight : top 10 features
Microsoft silverlight : top 10 features Microsoft silverlight : top 10 features
Microsoft silverlight : top 10 features
 
Sap mobility training
Sap mobility trainingSap mobility training
Sap mobility training
 
Sap mobility training
Sap mobility trainingSap mobility training
Sap mobility training
 
MOCA iBeacons SDK for iOS 7
MOCA iBeacons SDK for iOS 7MOCA iBeacons SDK for iOS 7
MOCA iBeacons SDK for iOS 7
 
Testing soap UI
Testing soap UITesting soap UI
Testing soap UI
 
Top Cordova Challenges and How to Tackle Them
Top Cordova Challenges and How to Tackle ThemTop Cordova Challenges and How to Tackle Them
Top Cordova Challenges and How to Tackle Them
 
Mobilefirst - Build Enterprise Class Apps for Mobile First
Mobilefirst - Build Enterprise Class Apps for Mobile First Mobilefirst - Build Enterprise Class Apps for Mobile First
Mobilefirst - Build Enterprise Class Apps for Mobile First
 
Claromentis Tech RoadMap 2015
Claromentis Tech RoadMap 2015Claromentis Tech RoadMap 2015
Claromentis Tech RoadMap 2015
 
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the FutureEclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
Eclipse Demo Camp 2010 - Eclipse e4 – The Status and the Future
 
Build PWA with Ionic Toolkit
Build PWA with Ionic ToolkitBuild PWA with Ionic Toolkit
Build PWA with Ionic Toolkit
 

Recently uploaded

Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Dr.Costas Sachpazis
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...Soham Mondal
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130Suhani Kapoor
 
Microscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxMicroscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxpurnimasatapathy1234
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Dr.Costas Sachpazis
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVRajaP95
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escortsranjana rawat
 
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICSHARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICSRajkumarAkumalla
 
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)Suman Mia
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...ranjana rawat
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...ranjana rawat
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingrakeshbaidya232001
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxupamatechverse
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )Tsuyoshi Horigome
 
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptxthe ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptxhumanexperienceaaa
 

Recently uploaded (20)

Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
 
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCRCall Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
Call Us -/9953056974- Call Girls In Vikaspuri-/- Delhi NCR
 
Microscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxMicroscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptx
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
 
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
 
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICSHARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
HARDNESS, FRACTURE TOUGHNESS AND STRENGTH OF CERAMICS
 
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINEDJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
 
Roadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and RoutesRoadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and Routes
 
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writing
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptx
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )
 
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptxthe ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
 

Preparing For Growth: Architecting Giant Apps for Scalability and Build Speed

  • 1. Preparing For Growth 16.04.2021 1 Spotify Preparing for Growth Architecting Giant Apps for Scalability and Build Speed Bruno Rocha - iOS Engineer @ Spotify
  • 2. 2 Preparing For Growth 16.04.2021 Spotify How does an iOS app evolve overtime?
  • 3. Preparing For Growth 16.04.2021 3 Spotify "Level 1" app A monolith All Classes All Resources Features - Single module - MVC - Simple features - No testing - Direct navigation MyAppModule
  • 4. Preparing For Growth 16.04.2021 4 Spotify "Level 2" app A larger (but better) monolith MyAppModule Feature1 Feature2 Feature3 Feature4 Feature5 Feature6 Feature7 Feature8 The app is now larger, but not large enough to be a big issue New Features - Usage of protocols and composition - A more testable architecture - Features are slightly more complex - Presence of unit testing - Navigation with injection
  • 5. Preparing For Growth 16.04.2021 5 Spotify Feature Feature Feature Feature Feature Feature Feature Feature Feature Feature Feature Feature MyAppModule ⚠ Slow build times! Module cache invalidated!
  • 6. Preparing For Growth 16.04.2021 6 Spotify Onboarding "Level 3" app A modularized app Home FeatureFlags NetworkSDK New Features - More modules means less cache misses - Compilation of modules individually - Better structure/division of concerns in general
  • 7. Preparing For Growth 16.04.2021 7 Spotify Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module New... features? - ⚠ Slow build times! (...again?) - ⚠ Awful launch times - ⚠ Small changes are impossible - ⚠ Navigation changes are almost impossible - ⚠ Architectural changes are impossible - ⚠ Isolated development compiles half the app
  • 8. Preparing For Growth 16.04.2021 8 Spotify Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Level 1 problems: Quantity of code Level 2 problems: Testability of code Level 3 problems: Structure/Isolation of code Level 4 problems: Module architecture
  • 9. Preparing For Growth 16.04.2021 9 Spotify Dynamic Frameworks .dylibs loading in runtime might cause launch performance issues Each additional framework that your app loads adds to the launch time. Although dyld caches a lot of this work in a launch closure when the user installs the app, the size of the launch closure and the amount of work done after loading it still depend on the number and sizes of the libraries loaded. Linking Static Libraries instead can improve launch time Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module
  • 10. Preparing For Growth 16.04.2021 10 Spotify Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module
  • 11. Preparing For Growth 16.04.2021 11 Spotify Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module
  • 12. Preparing For Growth 16.04.2021 12 Spotify Direct Dependencies Directly depending on concrete implementation modules makes cache invalidation more common and makes the app inflexible (harder to add new screens in the middle of the flow) Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module
  • 13. Preparing For Growth 16.04.2021 13 Spotify Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module Module 👑 Minions, destroy this app.
  • 14. Preparing For Growth 16.04.2021 14 Spotify Module Module Module Module Now: Horizontal Dependencies Module Module Previous:Vertical Dependencies Module Module
  • 15. Preparing For Growth 16.04.2021 15 Spotify Module Module Module Module "Level 4" app Modules don’t depend on each other, navigation is dynamic Module Module Module Module Module Module Module Module UI
  • 16. Preparing For Growth 16.04.2021 16 Spotify Classes / Structs Protocols Feature Feature Classes / Structs Protocols Feature2 ❔
  • 17. Preparing For Growth 16.04.2021 17 Spotify Protocols FeatureAPI Classes/Structs Feature (Concrete) Protocols Feature2API Classes/Structs Feature2 (Concrete) Concrete modules shouldn’t depend on other concrete modules! API/Impl Module Pair Incremental build time issues may still exist when making changes directly in the API modules, but they are now a much rarer occurrence.
  • 18. Preparing For Growth 16.04.2021 18 Spotify Protocols FeatureAPI Classes/Structs Feature (Concrete) Protocols Feature2API Classes/Structs Feature2 (Concrete) How to navigate to Feature2? Dependency Engine
  • 19. Preparing For Growth 16.04.2021 19 Spotify Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI AppDelegateModule (.app) 🗒 ClassList 🗒 APIRequest ConcreteClass
  • 20. Preparing For Growth 16.04.2021 20 Spotify SPTServiceSystem Manages a graph of SPTServices, working as a runtime dependency injector that handles the lifecycle of every Spotify feature. Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI Feature FeatureAPI MainModule (.app) 🗒 ClassList
  • 21. Preparing For Growth 16.04.2021 21 Spotify Networking (Concrete) NetworkService: NetworkAPI AppDelegateModule (.app) (SPTServiceSystem) Hey! I have a service that implements "NetworkAPI". 👍 HomeModule Hey! Can you provide me the impl of "NetworkAPI"? 👍 
 (Inject "NetworkService")
  • 22. Preparing For Growth 16.04.2021 22 Spotify Service Scopes A group of services, allowing fine-grained service access control. 1 2 3 4 LoggedInScope 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 LaunchScope CarPlayScope SiriScope HomeScope
  • 23. Preparing For Growth 16.04.2021 23 Spotify final class SiriIntentsService: SPTService, SiriIntentsAPI { 
 



 } func load() { print(”SiriService loaded”) } func unload() { 
 print(”SiriService unloading”) } static let serviceIdentifier= SiriIntentsAPI.self @Dependencyvar connectivity: ConnectivityAPI @Dependencyvar keychain: KeychainAPI import ConnectivityFeatureAPI import KeychainFeatureAPI
  • 24. Preparing For Growth 16.04.2021 24 Spotify features/siriintents/services.yaml - SiriIntentsService (SiriScope) - MyService (MyScope) - MyOtherService (MyScope) - MySuperSecretFeatureSerice (MyScope)
  • 25. Preparing For Growth 16.04.2021 25 Spotify let serviceList = SPTServiceList() 
 let serviceOrchestrator = ServiceOrchestrator(services: serviceList) 1 2 3 4 5 6 7 8 Directed Acyclic Graph (DAG) [8, 7, 6, 4, 2, 5, 3, 1] Load/Notify Order Unload Order (Topologically Sorted)
  • 26. Preparing For Growth 16.04.2021 26 Spotify let serviceList = SPTServiceList() 
 let serviceOrchestrator = ServiceOrchestrator(services: serviceList) 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 Not in memory Lazy reference injected Loaded in memory serviceOrchestrator.activate(scope: "LaunchScope") serviceOrchestrator.load(NavigationService.self, fromScope: "LaunchScope") serviceOrchestrator.load(CrashReporterService.self, fromScope: "LaunchScope")
  • 27. Preparing For Growth 16.04.2021 27 Spotify serviceOrchestrator.deactivate(scope: ”CarPlayScope”) 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 LaunchScope LoggedInScope CarPlayScope 1 2 3 4 5 6 7 8
  • 28. 28 Preparing For Growth 16.04.2021 Spotify Isolated Development 
 (Mini apps)
  • 29. Preparing For Growth 16.04.2021 29 Spotify FeatureA FeatureAAPI FeatureBAPI FeatureB FeatureC FeatureCAPI FeatureD FeatureDAPI FakeFeatureB MyApp
  • 30. Preparing For Growth 16.04.2021 30 Spotify FeatureA FeatureAAPI FeatureBAPI FakeFeatureB FeatureADemoApp
  • 31. Preparing For Growth 16.04.2021 31 Spotify Mini Apps Horizontal dependencies allow the creation of minified example apps. Huge productivity boost! FeatureA FeatureAAPI FeatureBAPI FakeFeatureB FeatureADemoApp
  • 32. 32 Preparing For Growth 16.04.2021 Spotify Dynamic Navigation
  • 33. Preparing For Growth 16.04.2021 33 Spotify Module Module Module Module Dynamic Navigation Not having explicit dependencies mean we can go anywhere from anywhere Module Module Module Module Module Module Module Module UI
  • 34. Preparing For Growth 16.04.2021 34 Spotify final class ProfilePage: SPTService, ProfilePageAPI { 
 


 } func load() { navigation.register(”page-profile”) { _ in 
 return ProfileViewController() 
 } } static let serviceIdentifier= ProfilePageAPI.self @Dependencyvar navigation: NavigationAPI import NavigationFeatureAPI
  • 35. Preparing For Growth 16.04.2021 35 Spotify func navigateToProfile() { navigation.push(”page-profile”) }
  • 36. Preparing For Growth 16.04.2021 36 Spotify Backend-Driven UI page-playlist?id=f8sn03k page-playlist?id=v92kalp page-charts page-new page-videos page-podcasts (HubsRenderer)
  • 37. Preparing For Growth 16.04.2021 37 Spotify iOS App Evolution Amount of issues when evolving Level 1 Level 2 Level 3 Level 4 Level 5 No issues! Some issues. Some bigger issues. TONS of issues. ????
  • 38. Preparing For Growth 16.04.2021 38 Spotify @rockbruno_