from rails legacy to ddd - pivorak, lviv
TRANSCRIPT
Agenda
• What is legacy
• Why and when Rails becomes legacy
• What is DDD
• Why it’s worth learning
• How to gradually go DDD - lessons learnt
Andrzej Krzywda• 11 years with Rails
• running Arkency (Ruby agency)
• writing Ruby-related books
• RailsRefactoring.com
• blogging
• teaching Rails at University of Wroclaw (for the last 5 years)
• organising wroc_love.rb
• DRUG meetups in Wrocław
Andrzej Krzywda
• reviewed hundreds of Rails apps
• helped several Rails teams
• dealing with bigger Rails apps
• “code written yesterday”
• “code written by someone else”
• “not my code”
• “not in my favourite architecture”
• slow tests
• the test setup is long and complicated
• critical bugs more often
• slower development progress
• conflicts in the team, related to the code
• complicated codebase
• infinite API
• New techniques • new tools • Solutions to complicated business
logic • solutions in non-Ruby worlds • shared language with other
programmers • microservices!
DDD-lite• app service
• calls 1 or more domain services
• domain service
• takes repo as input
• load aggregate from the repo
• do sth cool
• may use some value objects
• may trigger some domain events
• save aggregate (repo)
UpdateCustomer ==
MoveToNewAddress ChangeEmail
IntroduceNewContactPerson
In one of our projects one request was about 15 domain services
“Update” is always hiding a lot
optionally as microservices partially available
different persistencedata duplication
Context MapHR Project Management Finances
Invoicing
CRUD
DDD-lite
external SaaS
Communication
developer project client
DDD-lite
Draw the Context Mapaka what are the boxes in your application
aka you have more appsThey are potential microservices
Decide which contexts are CRUD and which ones
need more logic (DDD-lite)the ones with CRUD ideally need to publish events anyway
Peopleware the human factor
http://andrzejonsoftware.blogspot.com/2014/01/refactoring-human-factor.html
Mutation testing is the real test coverage!
http://blog.arkency.com/2015/04/why-i-want-to-introduce-mutation-testing-to-the-rails-event-store-gem/
http://blog.arkency.com/2015/06/how-good-are-your-ruby-tests-testing-your-tests-with-mutant/
Test units, not classes!http://andrzejonsoftware.blogspot.com/2015/02/tdding-unit-not-class.html
http://andrzejonsoftware.blogspot.com/2014/04/tdd-and-rails-what-makes-good-unit.html
http://blog.arkency.com/2014/09/unit-tests-vs-class-tests/
Escape from the framework ASAP
http://blog.arkency.com/2015/03/extract-a-service-object-in-any-framework/
Call application services from the framework
let Rails deal only with HTTP
Don’t just pass the params/hash everywherehttp://andrzejonsoftware.blogspot.com/2011/12/args-opts-params.html
Use events to communicate between
bounded contextsrails_event_store
https://github.com/arkency/rails_event_store
Roles in DDD
http://andrzejonsoftware.blogspot.com/2015/09/dci-ddd-and-concept-of-roles.html
Easier setup of the project when it’s a smaller
pieceUseful when you’re maintaining many projects and need to bugfix them from time to time
Legacy -> DDD books
• red book, Vaughn Vernon
• Implementing DDD
• blue book, Eric Evans
• Refactoring, Fowler
• Legacy code, Feathers