Sustainable Architecture
Topalov Alex 2017
@sharkzp
Who am I
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4137924/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4137930/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4137936/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4137941/pasted-from-clipboard.png)
Who am I
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183820/pasted-from-clipboard.png)
Wot r u talkin bout
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4137943/pasted-from-clipboard.png)
It's not about perfect plane
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183825/pasted-from-clipboard.png)
And not about flying chair
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183827/pasted-from-clipboard.png)
Not even about microservices
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183834/pasted-from-clipboard.png)
It's about all of that
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183837/pasted-from-clipboard.png)
Idea
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183844/pasted-from-clipboard.png)
Idea
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183845/pasted-from-clipboard.png)
How often you hear a phrase:
We are starting this project today and expecting to shut it down in 3 weeks
People want to solve a problem
Complexity
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183759/pasted-from-clipboard.png)
Dependencies
(internal and external)
Dependencies
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183856/pasted-from-clipboard.png)
Dependencies
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183765/pasted-from-clipboard.png)
Dependencies
One of the hardest things in software architecture is to draw a line in business logic
Dependencies
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183765/pasted-from-clipboard.png)
Dependencies
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183768/pasted-from-clipboard.png)
Dependencies
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183960/pasted-from-clipboard.png)
You get simplicity by finding slightly more sophisticated building block
— Alan Kay
DDD
Database Driven Development
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183837/pasted-from-clipboard.png)
When transaction completed transfer 10% of it amount from payee balance to payer balance
— Business
Example 1:
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187494/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187496/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187503/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187504/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187510/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187511/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187512/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187513/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187519/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187523/pasted-from-clipboard.png)
We need to track type of transactions, assuming all with positive balance are 'loan' with negative are 'credit'
— Business
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187537/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187541/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187543/pasted-from-clipboard.png)
Users should be able to name uploaded images
— Business
Example 2:
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4202706/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4202710/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4202774/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4202776/pasted-from-clipboard.png)
I really want to enter full description of this mysterious painting.
— User
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4202788/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187543/pasted-from-clipboard.png)
Datastore(s) just store artifacts of a business process
Separate Persistence from a Business logic
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187582/pasted-from-clipboard.png)
Users should be able to see their statistic when they view analytics
— Business
Example 3:
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4210062/pasted-from-clipboard.png)
oh BTW, we also need it in CSV and XML format
— Business
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4210079/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4215025/pasted-from-clipboard.png)
We also want to send this to our Marketing partners.
— Business
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4210092/pasted-from-clipboard.png)
Segregate interfaces from a Business logic
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4210117/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4187626/pasted-from-clipboard.png)
Simple != Easy
How
Ideal
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4211560/pasted-from-clipboard.png)
Usual
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4211548/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214053/209101_215553741795047_215532938463794_993548_8201099_o.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214026/pasted-from-clipboard.png)
Fat Controller, thin Model
Thin Controller, fat Model
Thin Controller, thin Model, Service Objects in between
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214056/pasted-from-clipboard.png)
High Cohesion
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214074/pasted-from-clipboard.png)
Low Coupling
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214102/pasted-from-clipboard.png)
Dependencies Direction
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214130/pasted-from-clipboard.png)
Business Contexts
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214147/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4214178/pasted-from-clipboard.png)
Metcalfe's law
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4215057/pasted-from-clipboard.png)
Solutions
LOC < 5000
- Goliath
- Plain ruby file
- eventmachine
- Rake app
5000 < LOC < 15000
- Sinatra
- Grape
15000 < LOC < 35000
- Rails
- Hanami
LOC > 35000
- It's not a Rails anymore
- But maybe still a Hanami
- Trailblazer
- DRY.rb
No-one has more context about your application than you are
Gems are dependecies
vs
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183757/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4183758/pasted-from-clipboard.png)
The only conditional that you should have is what object to use
The End
![](https://s3.amazonaws.com/media-p.slid.es/uploads/84449/images/4215088/pasted-from-clipboard.png)
Topalov Alex 2017
@sharkzp
Sustainable Architecture
By Alex Topalov
Sustainable Architecture
- 1,217