Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scaling an app 
to 175 million users

Scaling an app 
to 175 million users

CocoaHeads Ukrain, Kyiv, 4th of March 2017

SoundCloud's mobile apps fast became their primary listening platform. This talk will highlight the biggest challenges SoundCloud iOS team faced scaling their app and the team to where they are today and the biggest things they’ve gotten right and wrong in the process.

Matej will discuss what were the high level ideas that allowed the team to scale, but will also dive deep and share some practical examples that any growing team can adapt.

Matej Balantič

March 04, 2017
Tweet

More Decks by Matej Balantič

Other Decks in Technology

Transcript

  1. Matej Balantič Engineering Manager, Core Clients Coding professionally for 10

    years Started with backend / PHP 5 years ago —> mobile/iOS Experimenting with management for the last 6 months Core Clients = build tools & libraries to make client engineers more productive
  2. SoundCloud iOS app history Show project name and launch date

    2008 2009 2010 2011 2012 2013 2014 2016 2015 2016 2017 Milestone iPhone app released Agency Team of 6 Team of 15 1 MIO 175 
 MIO 10 MIO Release of rewrite
  3. Team 4 Team 3 Core Team 2 Team 1 Team

    1 Team 2 Core Team 3 Team 4 iOS collective 5 independent teams 15 iOS engineers 2 locations Plans for 2017: double the team
  4. Test & Build Clean build time =~ 15 minutes 13k

    unit tests that run ~5 minutes 400 acceptance tests that run ~15 minutes CI pipeline = 40 macOS nodes on 20 Mac Minis
  5. alwaysagileconsulting.com A version control strategy in which developers commit their

    changes to the shared trunk of a source code repository with minimal branching Trunk based development
  6. { "development": { "dev_important_task": { "enabled": true, "description": "Super new

    experimental feature" }, "dev_some_other_task": { "enabled": true, "description": "Some other not so experimental feature" } }, "production": { "dev_important_task": { "enabled": false
 } } } 1. Add feature to JSON
  7. public class ImportantService { public func importantTask() { guard FeatureFlagService.isDevImportantTaskEnabled()

    else { return } doImportantTask() } // MARK: Private private func doImportantTask() { // ... } } 3. Use in code
  8. public class ImportantService { public func importantTask() { guard FeatureFlagService.isDevImportantTaskEnabled()

    else { return } doImportantTask() } // MARK: Private private func doImportantTask() { // ... } } 3. Use in code