SlideShare a Scribd company logo
Breaking the Monolith
Microservice Extraction at SoundCloud
Soundcloud
● 11 hours uploaded every minute
● 150 million tracks
● 300 million users
2
History
● Rails 2.3
● MySQL
● S3
3
What happened then?
4
Success!
5
History
● Rails 2.3
● MySQL
● AWS
● Cassandra
● Hadoop
● SolR
● RabbitMQ
https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture
6
Still not enough
● More servers
● Add caching layer
● Defer long running tasks to workers
7
Still not enough
● Optimize database schema
● Introduce read slaves
● Dedicated databases for some models
8
Monolith
9
Major pain points
● Testing, building and deploying
● Dependency hell
● “I’d rather not touch this”
10
Rails problems I - No service layer
11
<% Category.all.each do |cat| %>
<li><%= cat.name %></li>
<% end %>
Rails problems I - No service layer
⇒ Tight coupling with storage layer!
12
<% Category.all.each do |cat| %>
<li><%= cat.name %></li>
<% end %>
Rails problems II - Active Record Magic
13
class User < ActiveRecord::Base
validates_length_of :username, :within => 2..64
before_save :encrypt_password, :accept_terms_of_use
has_many :comments, :dependent => :destroy
# ...
end
Rails problems II - Active Record Magic
⇒ Easy to write, hard to maintain
14
class User < ActiveRecord::Base
validates_length_of :username, :within => 2..64
before_save :encrypt_password, :accept_terms_of_use
has_many :comments, :dependent => :destroy
# ...
end
Ruby Problems
● GIL
● Native extensions
● Dependency management can be painful
15
Breaking the Monolith - Microservice Extraction at SoundCloud
Extract features as Services
● Less painful to maintain
● Easy to replace
● Fun to build
17
An Example: Messages
● 200 million messages
● MySQL database on shared host
● Features:
○ embedded sounds
○ email notifications
○ spam detection
18
Migration Requirements
● New schema to support upcoming features
● Dedicated database
● Zero downtime
19
Chapter 1
The Database
Migrating the Schema
21
Migrating the Schema
22
Migrating the Schema
Convenient Dependency Management with @Grapes
23
#!/usr/bin/env groovy
@Grapes([
@Grab(group='org.yaml', module='snakeyaml', version='1.12'),
@Grab(group='mysql', module='mysql-connector-java', version='5.1.24')
])
import groovy.sql.Sql
import org.yaml.snakeyaml.Yaml
Strategy
● Import all messages
● Setup cron job to get new messages
● Listen to events for updates
24
Chapter 2
The Application
Creating a new service
26
Convo
● Scala
● Twitter Finagle
● Scalatra Framework
27
Convo architecture
28
Scala
● Functional
● OOP
● Static but inferred typing
29
Scala Joy = Options I
Good bye NullPointerException
30
val opt: Option[String] = params.get("id")
val id: Int = opt.map(id => id.toInt).getOrElse(10)
Scala Joy = Options II
Safe chaining with for comprehensions
31
for {
id <- params.get("id")
user <- users.lookup(id)
count <- counts.forUser(user)
} yield count
Scala Joy = Pattern Matching
Expressive code with decomposition
32
Urn("soundcloud:users:20") match {
case Urn(_, "tracks", _) => None,
case Urn(_, "messages", "20") => None,
case Urn(_, "users", id) => Some(id)
}
Scala Joy = Functional Goodness
Function arguments and references
33
delete("/playlist/:urn/likes")(destroy)
def destroy(request: Request) =
write(request, 200)(repo.deleteLike)
def write
(request: Request, statusCode: Int)
(f: (UserSession, Urn) => Future[Like]) = {
// ...
}
Futures!
Finagle
● Twitter rpc library on top of Netty
● Support for multiple protocols
● Future composition
35
Futures
Instance API (excerpt)
36
class Future[A] {
def get(): A
def map[B](f: A => B): Future[B]
def flatMap[B](f: A => Future[B]]): Future[B]
def onSuccess(f : A => Unit): Future[A]
}
Futures
Object API (excerpt)
37
object Future {
def value[A](a: A): Future[A]
def exception[A](e: Throwable): Future[A]
def collect[A](fs : Seq[Future[A]]): Future[Seq[A]]
}
Futures - Examples
Multiple transformations - The ugly way
38
service.getUsers().flatMap { users =>
service.tracksFor(users).flatMap { tracks =>
asJson(tracks)
}
}.onSuccess(json => log(s"found $json"))
Futures - Example
Multiple transformations - The nice way
39
val response = for {
users <- service.getUsers()
tracks <- service.tracksFor(users)
json <- asJson(tracks)
} yield json
response.onSuccess(json => log(s"found $json"))
Scala Problems
● Implicit conversions
● Binary compatibility of libraries
● Tooling still not perfect
40
SBT
IntelliJ
● Code inspection
● Debugging
● SBT support
42
Chapter 3
The Cutover
Integrate Service
44
Integration Risks
● Service failure
● Data loss after rolling back
● Data loss caused by stale clients
45
Integration Risks
● Service failure → load testing, A/B testing
● Data loss after rolling back
● Data loss caused by stale clients
46
Integration Risks
● Service failure → load testing, A/B testing
● Data loss after rolling back → prepare scripts, practice
● Data loss caused by stale clients
47
Integration Risks
● Service failure → load testing, A/B testing
● Data loss after rolling back → prepare scripts, practice
● Data loss caused by stale clients → keep migration running
48
Enable Feature
49
Retire Old Database
50
Convo
● 500 million requests per day
● 1000 qps during peak time
● 5 instances
51
Microservice Problems
● Event bus dependency
● Maintenance overhead
● Distributed tracing
52
Microservices
→ Not a silver bullet
53
Breaking the Monolith - Microservice Extraction at SoundCloud
Questions?
Images
● Slide 4,7 - Rails Logo http://en.wikipedia.org/wiki/File:Ruby_on_Rails.svg
● Slide 6,51 - Party Cat http://ghostexist.deviantart.com/art/Party-Cat-logo-287986071
● Silde 7 - MySQL Logo http://blogwifi.fr/?p=9990
● Slide 7 - Hadoop Cop https://svn.apache.org/repos/asf/hadoop/logos/out_rgb/hadoop-security-logo.
jpg
● Slide 10 - Hello, My Name Is: http://commons.wikimedia.org/wiki/File:Hello_my_name_is_sticker.
svg
● Slide 14 - Sad Panda: http://www.whatsupyasieve.com/2012/09/17/lockout-blues/sad-panda-2/
● Slide 16 - Exit Sign: http://logo-kid.com/emergency-exit-sign-left.htm
● Slide 22 - Groovy Logo: http://groovy.codehaus.org/images/groovy-logo-medium.png
● Slide 20, 25, 44 - Book Page: http://daviddiazolivares.deviantart.com/art/Old-Book-Page-
345869530
● Slide 34 - Back to the future: http://i.huffpost.com/gen/1369403/thumbs/o-BACK-TO-THE-FUTURE-
facebook.jpg
● Slide 42 - Tommy Lee Jones: http://persephonemagazine.com/2014/04/friday-news-bites-airline-
pranks-gabriel-garcia-marquez-pulitzers-more/film-title-no-country-for-old-men/
● Slide 55 - That’s all folks: http://www.hd2wallpapers.com/view/thats_all_folks-1280x800.php
56

More Related Content

PDF
Breaking the Monolith: Organizing Your Team to Embrace Microservices
PDF
Lukáš Malý - Log management ELISA controlled by Zabbix | ZabConf2016
PDF
"In love with Open Source : Past, Present and Future" : Keynote OSDConf 2014
PPTX
Meetup #3: Migrating an Oracle Application from on-premise to AWS
PPTX
Cloudsolutionday 2016: Getting Started with Severless Architecture
PDF
Pushing AI to the Client with WebAssembly and Blazor
PPTX
Meetup #3: Migrate a fast scale system to AWS
PDF
Microservices architecture pitfalls
Breaking the Monolith: Organizing Your Team to Embrace Microservices
Lukáš Malý - Log management ELISA controlled by Zabbix | ZabConf2016
"In love with Open Source : Past, Present and Future" : Keynote OSDConf 2014
Meetup #3: Migrating an Oracle Application from on-premise to AWS
Cloudsolutionday 2016: Getting Started with Severless Architecture
Pushing AI to the Client with WebAssembly and Blazor
Meetup #3: Migrate a fast scale system to AWS
Microservices architecture pitfalls

What's hot (20)

PDF
Reporting Large Environment Zabbix Database
PDF
Bitsy graph database
PDF
Alexander Naydenko - Nagios to Zabbix Migration | ZabConf2016
PPTX
Importance of ‘Centralized Event collection’ and BigData platform for Analysis !
PPTX
Introducing Venice
PDF
Filipe paternot - Case Study: Zabbix Deployment at Globo.com
PDF
Kafka meetup seattle 2019 mirus reliable, high performance replication for ap...
PDF
Ryan Armstrong - Monitoring More Than 6000 Devices in Zabbix | ZabConf2016
PPTX
Apache Kafka at LinkedIn
PPTX
Ambry : Linkedin's Scalable Geo-Distributed Object Store
PPTX
Lessons Learned from Building and Operating Scuba
PPT
Scaling MySQL using Fabric
PDF
MySQL Query Optimization (Basics)
PDF
E2E Data Pipeline - Apache Spark/Airflow/Livy
PDF
Dev309 from asgard to zuul - netflix oss-final
PDF
Microservices with Spring Cloud
PDF
Kafka for begginer
PDF
How Kafka and MemSQL Became the Dynamic Duo (Sarung Tripathi, MemSQL) Kafka S...
PPTX
Евгений Напрягло ".NET Framework Hosting API Overview"
PPT
Mistral Hong Kong Unconference track
Reporting Large Environment Zabbix Database
Bitsy graph database
Alexander Naydenko - Nagios to Zabbix Migration | ZabConf2016
Importance of ‘Centralized Event collection’ and BigData platform for Analysis !
Introducing Venice
Filipe paternot - Case Study: Zabbix Deployment at Globo.com
Kafka meetup seattle 2019 mirus reliable, high performance replication for ap...
Ryan Armstrong - Monitoring More Than 6000 Devices in Zabbix | ZabConf2016
Apache Kafka at LinkedIn
Ambry : Linkedin's Scalable Geo-Distributed Object Store
Lessons Learned from Building and Operating Scuba
Scaling MySQL using Fabric
MySQL Query Optimization (Basics)
E2E Data Pipeline - Apache Spark/Airflow/Livy
Dev309 from asgard to zuul - netflix oss-final
Microservices with Spring Cloud
Kafka for begginer
How Kafka and MemSQL Became the Dynamic Duo (Sarung Tripathi, MemSQL) Kafka S...
Евгений Напрягло ".NET Framework Hosting API Overview"
Mistral Hong Kong Unconference track
Ad

Viewers also liked (20)

PPTX
Dismantling the Monolith: Scaling with Microservices
PDF
Rubyslava beyond the_monolith
PDF
Disassembling the Monolith: Taming Large Software Projects with Node.js
PDF
Monolith vs Microservices vs Teams
PPTX
JFokus 2015 - Hacking the-monolith
PDF
Splitting the Monolith
PDF
Breaking Down the Monolith - Peter Marton, RisingStack
PDF
Breaking the monolith at jobandtalent - AWS Summit Barcelona 2015
PPTX
My Monolith is Melting - PIPELINE CONF 2015
PDF
Monolith to Microservices - O’Reilly Oscon
PDF
Evolving toward Microservices - O’Reilly SACON Keynote
PPTX
DPM UK: Stealing Project Management Lessons from Artificial Intelligence
PDF
I-Tier: Breaking Up the Monolith @ Philly ETE
PDF
Embracing the Monolith in Small Teams: Doubling down on python to move fast w...
PPTX
Surviving as a Monolith in a Microservices World - by Blair Olynyk, Hyperwallet
PPTX
From the Monolith to Microservices - CraftConf 2015
PPTX
MicroserviceArchitecture in detail over Monolith.
PPTX
Pragmatic Microservices
PDF
The Journey from Monolith to Microservices: a Guided Adventure
PDF
Releasing the Monolith On a Daily Basis
Dismantling the Monolith: Scaling with Microservices
Rubyslava beyond the_monolith
Disassembling the Monolith: Taming Large Software Projects with Node.js
Monolith vs Microservices vs Teams
JFokus 2015 - Hacking the-monolith
Splitting the Monolith
Breaking Down the Monolith - Peter Marton, RisingStack
Breaking the monolith at jobandtalent - AWS Summit Barcelona 2015
My Monolith is Melting - PIPELINE CONF 2015
Monolith to Microservices - O’Reilly Oscon
Evolving toward Microservices - O’Reilly SACON Keynote
DPM UK: Stealing Project Management Lessons from Artificial Intelligence
I-Tier: Breaking Up the Monolith @ Philly ETE
Embracing the Monolith in Small Teams: Doubling down on python to move fast w...
Surviving as a Monolith in a Microservices World - by Blair Olynyk, Hyperwallet
From the Monolith to Microservices - CraftConf 2015
MicroserviceArchitecture in detail over Monolith.
Pragmatic Microservices
The Journey from Monolith to Microservices: a Guided Adventure
Releasing the Monolith On a Daily Basis
Ad

Similar to Breaking the Monolith - Microservice Extraction at SoundCloud (20)

PDF
Applying profilers to my sql (fosdem 2017)
PDF
MySQL for Oracle DBAs
PDF
Micheal Pershyn "Coljure 4 Big Data"
PDF
High-Availability using MySQL Fabric
PDF
MySQL 5.6 Replication Webinar
PPTX
Eko10 Workshop Opensource Database Auditing
PPTX
Automating using Ansible
PDF
Percona Live '18 Tutorial: The Accidental DBA
PDF
OSDC 2018 | Highly Available Cloud Foundry on Kubernetes by Cornelius Schumacher
PDF
MySQL Scalability and Reliability for Replicated Environment
PDF
From swarm to swam-mode in the CERN container service
PDF
Varnish - PLNOG 4
PPTX
How Opera Syncs Tens of Millions of Browsers and Sleeps Well at Night
PPT
2010 12 mysql_clusteroverview
PDF
Full Automated Continuous Integration and Testing Infrastructure for Maxscale...
PPTX
Eko10 workshop - OPEN SOURCE DATABASE MONITORING
PDF
Session 3 - CloudStack Test Automation and CI
PPTX
Massaging the Pony: Message Queues and You
PDF
Midwest PHP Presentation - New MSQL Features
ODP
Spring cloud for microservices architecture
Applying profilers to my sql (fosdem 2017)
MySQL for Oracle DBAs
Micheal Pershyn "Coljure 4 Big Data"
High-Availability using MySQL Fabric
MySQL 5.6 Replication Webinar
Eko10 Workshop Opensource Database Auditing
Automating using Ansible
Percona Live '18 Tutorial: The Accidental DBA
OSDC 2018 | Highly Available Cloud Foundry on Kubernetes by Cornelius Schumacher
MySQL Scalability and Reliability for Replicated Environment
From swarm to swam-mode in the CERN container service
Varnish - PLNOG 4
How Opera Syncs Tens of Millions of Browsers and Sleeps Well at Night
2010 12 mysql_clusteroverview
Full Automated Continuous Integration and Testing Infrastructure for Maxscale...
Eko10 workshop - OPEN SOURCE DATABASE MONITORING
Session 3 - CloudStack Test Automation and CI
Massaging the Pony: Message Queues and You
Midwest PHP Presentation - New MSQL Features
Spring cloud for microservices architecture

Recently uploaded (20)

PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
Transform Your Business with a Software ERP System
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
history of c programming in notes for students .pptx
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PPTX
ISO 45001 Occupational Health and Safety Management System
PDF
top salesforce developer skills in 2025.pdf
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PPTX
Online Work Permit System for Fast Permit Processing
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
L1 - Introduction to python Backend.pptx
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Design an Analysis of Algorithms I-SECS-1021-03
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
Transform Your Business with a Software ERP System
VVF-Customer-Presentation2025-Ver1.9.pptx
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
history of c programming in notes for students .pptx
Softaken Excel to vCard Converter Software.pdf
How Creative Agencies Leverage Project Management Software.pdf
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
ISO 45001 Occupational Health and Safety Management System
top salesforce developer skills in 2025.pdf
How to Migrate SBCGlobal Email to Yahoo Easily
Online Work Permit System for Fast Permit Processing
ManageIQ - Sprint 268 Review - Slide Deck
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
L1 - Introduction to python Backend.pptx
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Design an Analysis of Algorithms I-SECS-1021-03

Breaking the Monolith - Microservice Extraction at SoundCloud

  • 1. Breaking the Monolith Microservice Extraction at SoundCloud
  • 2. Soundcloud ● 11 hours uploaded every minute ● 150 million tracks ● 300 million users 2
  • 3. History ● Rails 2.3 ● MySQL ● S3 3
  • 6. History ● Rails 2.3 ● MySQL ● AWS ● Cassandra ● Hadoop ● SolR ● RabbitMQ https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture 6
  • 7. Still not enough ● More servers ● Add caching layer ● Defer long running tasks to workers 7
  • 8. Still not enough ● Optimize database schema ● Introduce read slaves ● Dedicated databases for some models 8
  • 10. Major pain points ● Testing, building and deploying ● Dependency hell ● “I’d rather not touch this” 10
  • 11. Rails problems I - No service layer 11 <% Category.all.each do |cat| %> <li><%= cat.name %></li> <% end %>
  • 12. Rails problems I - No service layer ⇒ Tight coupling with storage layer! 12 <% Category.all.each do |cat| %> <li><%= cat.name %></li> <% end %>
  • 13. Rails problems II - Active Record Magic 13 class User < ActiveRecord::Base validates_length_of :username, :within => 2..64 before_save :encrypt_password, :accept_terms_of_use has_many :comments, :dependent => :destroy # ... end
  • 14. Rails problems II - Active Record Magic ⇒ Easy to write, hard to maintain 14 class User < ActiveRecord::Base validates_length_of :username, :within => 2..64 before_save :encrypt_password, :accept_terms_of_use has_many :comments, :dependent => :destroy # ... end
  • 15. Ruby Problems ● GIL ● Native extensions ● Dependency management can be painful 15
  • 17. Extract features as Services ● Less painful to maintain ● Easy to replace ● Fun to build 17
  • 18. An Example: Messages ● 200 million messages ● MySQL database on shared host ● Features: ○ embedded sounds ○ email notifications ○ spam detection 18
  • 19. Migration Requirements ● New schema to support upcoming features ● Dedicated database ● Zero downtime 19
  • 23. Migrating the Schema Convenient Dependency Management with @Grapes 23 #!/usr/bin/env groovy @Grapes([ @Grab(group='org.yaml', module='snakeyaml', version='1.12'), @Grab(group='mysql', module='mysql-connector-java', version='5.1.24') ]) import groovy.sql.Sql import org.yaml.snakeyaml.Yaml
  • 24. Strategy ● Import all messages ● Setup cron job to get new messages ● Listen to events for updates 24
  • 26. Creating a new service 26
  • 27. Convo ● Scala ● Twitter Finagle ● Scalatra Framework 27
  • 29. Scala ● Functional ● OOP ● Static but inferred typing 29
  • 30. Scala Joy = Options I Good bye NullPointerException 30 val opt: Option[String] = params.get("id") val id: Int = opt.map(id => id.toInt).getOrElse(10)
  • 31. Scala Joy = Options II Safe chaining with for comprehensions 31 for { id <- params.get("id") user <- users.lookup(id) count <- counts.forUser(user) } yield count
  • 32. Scala Joy = Pattern Matching Expressive code with decomposition 32 Urn("soundcloud:users:20") match { case Urn(_, "tracks", _) => None, case Urn(_, "messages", "20") => None, case Urn(_, "users", id) => Some(id) }
  • 33. Scala Joy = Functional Goodness Function arguments and references 33 delete("/playlist/:urn/likes")(destroy) def destroy(request: Request) = write(request, 200)(repo.deleteLike) def write (request: Request, statusCode: Int) (f: (UserSession, Urn) => Future[Like]) = { // ... }
  • 35. Finagle ● Twitter rpc library on top of Netty ● Support for multiple protocols ● Future composition 35
  • 36. Futures Instance API (excerpt) 36 class Future[A] { def get(): A def map[B](f: A => B): Future[B] def flatMap[B](f: A => Future[B]]): Future[B] def onSuccess(f : A => Unit): Future[A] }
  • 37. Futures Object API (excerpt) 37 object Future { def value[A](a: A): Future[A] def exception[A](e: Throwable): Future[A] def collect[A](fs : Seq[Future[A]]): Future[Seq[A]] }
  • 38. Futures - Examples Multiple transformations - The ugly way 38 service.getUsers().flatMap { users => service.tracksFor(users).flatMap { tracks => asJson(tracks) } }.onSuccess(json => log(s"found $json"))
  • 39. Futures - Example Multiple transformations - The nice way 39 val response = for { users <- service.getUsers() tracks <- service.tracksFor(users) json <- asJson(tracks) } yield json response.onSuccess(json => log(s"found $json"))
  • 40. Scala Problems ● Implicit conversions ● Binary compatibility of libraries ● Tooling still not perfect 40
  • 41. SBT
  • 42. IntelliJ ● Code inspection ● Debugging ● SBT support 42
  • 45. Integration Risks ● Service failure ● Data loss after rolling back ● Data loss caused by stale clients 45
  • 46. Integration Risks ● Service failure → load testing, A/B testing ● Data loss after rolling back ● Data loss caused by stale clients 46
  • 47. Integration Risks ● Service failure → load testing, A/B testing ● Data loss after rolling back → prepare scripts, practice ● Data loss caused by stale clients 47
  • 48. Integration Risks ● Service failure → load testing, A/B testing ● Data loss after rolling back → prepare scripts, practice ● Data loss caused by stale clients → keep migration running 48
  • 51. Convo ● 500 million requests per day ● 1000 qps during peak time ● 5 instances 51
  • 52. Microservice Problems ● Event bus dependency ● Maintenance overhead ● Distributed tracing 52
  • 53. Microservices → Not a silver bullet 53
  • 56. Images ● Slide 4,7 - Rails Logo http://en.wikipedia.org/wiki/File:Ruby_on_Rails.svg ● Slide 6,51 - Party Cat http://ghostexist.deviantart.com/art/Party-Cat-logo-287986071 ● Silde 7 - MySQL Logo http://blogwifi.fr/?p=9990 ● Slide 7 - Hadoop Cop https://svn.apache.org/repos/asf/hadoop/logos/out_rgb/hadoop-security-logo. jpg ● Slide 10 - Hello, My Name Is: http://commons.wikimedia.org/wiki/File:Hello_my_name_is_sticker. svg ● Slide 14 - Sad Panda: http://www.whatsupyasieve.com/2012/09/17/lockout-blues/sad-panda-2/ ● Slide 16 - Exit Sign: http://logo-kid.com/emergency-exit-sign-left.htm ● Slide 22 - Groovy Logo: http://groovy.codehaus.org/images/groovy-logo-medium.png ● Slide 20, 25, 44 - Book Page: http://daviddiazolivares.deviantart.com/art/Old-Book-Page- 345869530 ● Slide 34 - Back to the future: http://i.huffpost.com/gen/1369403/thumbs/o-BACK-TO-THE-FUTURE- facebook.jpg ● Slide 42 - Tommy Lee Jones: http://persephonemagazine.com/2014/04/friday-news-bites-airline- pranks-gabriel-garcia-marquez-pulitzers-more/film-title-no-country-for-old-men/ ● Slide 55 - That’s all folks: http://www.hd2wallpapers.com/view/thats_all_folks-1280x800.php 56