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
Smash the Monolith: Refactoring Rails Apps with...
Search
Coraline Ada Ehmke
July 21, 2013
Technology
1.2k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Smash the Monolith: Refactoring Rails Apps with Services and APIs
Coraline Ada Ehmke
July 21, 2013
More Decks by Coraline Ada Ehmke
See All by Coraline Ada Ehmke
Scaling the Artisan
bantik
0
190
Your First Legacy Codebase
bantik
1
480
Alchemy and the Art of Software Development
bantik
0
380
Artisans and Apprentices
bantik
1
580
Lightweight BI with Ruby, Rails, and MongoDB
bantik
6
2.8k
Better Living Through Open Source
bantik
2
200
Lightweight Business Intelligence in Ruby
bantik
3
1.2k
Beautiful APIs with Faceted
bantik
3
390
Other Decks in Technology
See All in Technology
プロダクトが成長すると、 プロダクトマネージャーの仕事はどう変わるのか - 「まず作る」から「小さく学び、確かめながら進む」へ
sansantech
PRO
0
340
野良MCPサーバーを排除せよ!MCPサーバーのガバナンス
yukiogawa
1
240
演劇と私とスクラム
chinmo
0
160
macOS Golden Gate 時代のMac管理
tategami
0
150
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
1.1k
LLM Content Moderationを支える評価・改善ループの実践
suikabar
2
350
AI時代、つくる力を自分たちの手に。 ──電通×KAG、アジャイルとAI駆動開発で挑む開発の変革
yuukiyo
3
360
2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot
masasuzu
0
170
DevelopersIO 2026 Tokyo 現時点の衛星通信サービスの現状を整理してみる
maroon1st
0
300
LLM-as-a-Judgeは本当に信頼できるのか――評価器を評価する話
taka_aki
3
1.1k
外国人エンジニアがVueプロトタイプで仕様を合わせている話 / Vue Fes Japan 2026 LT
eluwing
0
160
クラウドエージェントの先駆け Devin。今も最先端を走る、他との違い
kinopeee
0
310
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
280
Why Our Code Smells
bkeepers
PRO
340
58k
Statistics for Hackers
jakevdp
799
230k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Testing 201, or: Great Expectations
jmmastey
46
8.4k
How to Talk to Developers About Accessibility
jct
2
590
Prompt Engineering for Job Search
mfonobong
0
540
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Agile that works and the tools we love
rasmusluckow
331
22k
Transcript
Smash the Monolith Refactoring Rails Applications
The ‘A’ Word
The definition, composition, and interactions of parts of a system.
Software architecture is...
A compromise between viability and perfection. Software architecture is...
Tempered by the need to deliver a solution. Software architecture
is...
Some science. Lots of aesthetics. Software architecture is...
Software architecture is...
vs. An age-old conflict... Big Up-Front Design Cowboy Coding
Then: Big Up-Front Design
Advantages Long-term product roadmaps Rich design artifacts Guided evolution Predictability
Disadvantages Slow implementation Resistance to change New feature friction No
room for mistakes
Now: Ad-Hoc Architecture
Guiding Principles Convention over configuration Discrete MVC layers Good separation
of concerns RESTful and resourceful
The Best Intentions Test-driven development + pair programming + pull
requests + code reviews = emergent design
The Best Intentions
Non-CRUD controller methods. The Road to Hell
Logic leaking into controllers and views. The Road to Hell
Complex object graphs. The Road to Hell
/lib/ becomes a junk drawer. The Road to Hell
Undocumented gem dependencies. The Road to Hell
Bloated user model. The Road to Hell
Signs of a Degraded Design Rigidity
Signs of a Degraded Design Fragility
Signs of a Degraded Design Immobility
Signs of a Degraded Design Feature friction
Change Gets Harder Over Time Relatively Easy Delegate If Possible
Take a Sick Day KILL IT WITH FIRE Difficulty of Change Time
How did we get here?
How did we get here? Dozens of hands on the
code.
How did we get here? Classes naturally attract new methods.
How did we get here? Increasingly slow test suite.
How did we get here? Entropy.
How did we get here? One line of code at
a time.
“Most software eventually degrades to the point where someone will
declare the design to be unsound.” Uncle Bob Martin
Values-Driven Development
Things We Value Fresh ideas combined with best practices.
Things We Value Solid design principles applied in novel ways.
A Values-Based Approach Culture of innovation + best practices +
solid design principles = better architecture?
Hexagonal Design
Theoretical Backing Layered architectures break down in practice.
Domain Objects HTTP Command Line Testing Messaging Persistence Monitoring Sinatra
Cron Test Unit Beanstalkd Postgres Honey Badger Rails Rake RSpec Rabbit MongoDB New Relic
Design Considerations Design for all of your users, not just
the obvious ones.
Design Considerations Give every class its own distinct API.
Design Considerations Write your application in pure Ruby.
Theoretical Backing Achieve framework independence.
Using APIs & Messages
Write programs that do one thing and do it well.
Write programs to work together. Write programs to handle text streams, because that is a universal interface. Doug McIlroy, Bell Labs CSRC HTTP
Design Considerations Implement an ecosystem of small applications.
Design Considerations Divide models between the applications.
Design Considerations Persistence is a service.
Design Considerations Bind applications together using APIs and messaging.
Design Considerations Determine a caching strategy.
Design Considerations Pick a messaging solution.
Rethinking Architecture
Roots Rock.
A Sudden Revelation What if we think of an application...
...as just another object?
Object-Oriented Architecture
Theoretical Backing Apply OO design principles to the architecture itself.
Classes communicating via messages Applications communicating via APIs & queues
! Theoretical Backing
Applying OO Principles An application is a group of components
that perform tasks on the same data.
Applying OO Principles An application should do one well-defined thing.
Applying OO Principles APIs allow us to easily extend our
interfaces.
Applying OO Principles It doesn’t matter what application sends, receives
or processes our messages.
Applying OO Principles APIs and presenters allow us to easily
create client-specific interfaces.
Legacy Applications
What is a legacy app? Age is not measured in
months or years or versions.
What is a legacy app? Legacy code is not broken.
What is a legacy app? Don’t git blame.
What is a legacy app? A storehouse of information about
a problem space.
Refactoring Tactics Dismantle god classes.
Refactoring Tactics Extract behaviors into modules.
Refactoring Tactics Extract models and business logic into engines.
Refactoring Tactics Migrate engines into discrete applications.
Refactoring Tactics Implement observers using a messaging service.
Refactoring Tactics Provide persistence through asynchronous services.
Refactoring Tactics Direct calls between applications rely on a good
set of APIs.
Refactoring Tactics Use your API as a guide to refactoring
your models.
Synchronous Calls via APIs Credentials Auth Token Auth Service Client
App
Asynchronous Calls via Message Queues Prefs Update Client App Attr
Change Persistence Service
Refactoring Tactics Find functional edges and refactor them into services.
Refactoring Tactics Make liberal use of the presenter pattern.
A declarative framework useful for building APIs. faceted.rb
On the Other Side of Refactoring
A Small App Ecosystem Consumer App Internal App 1 Internal
App 2 Persistence API Messaging API Reporting API Dashboard App
Reap the Benefits Reduced cost of change.
Reap the Benefits Support for unexpected and novel use cases.
Reap the Benefits Reduction of ceremony around releases.
Reap the Benefits Low-impact downtime.
Reap the Benefits Short ramp-up time for new developers.
Reap the Benefits Increased performance of test suites.
Reap the Benefits A/B testing on applications and infrastructure.
Reap the Benefits Greater flexibility.
Reap the Benefits Democratization of application architecture.
Go smash your monolith.
smashthemonolith.com Corey Ehmke @bantik