Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rails без боли и оверинжиниринга
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ivan Nemytchenko
July 17, 2020
Technology
600
0
Share
Rails без боли и оверинжиниринга
Ivan Nemytchenko
July 17, 2020
More Decks by Ivan Nemytchenko
See All by Ivan Nemytchenko
Semantic_AI_knowledge.pdf
inem
0
25
Code Topology Notation
inem
0
180
The Shape of a Service Object
inem
0
1.5k
The Curse of Service Object
inem
0
360
Modern Make for modern (Rails) programmers
inem
0
130
Откуда берется сложность в Rails-проектах и куда бы её деть?
inem
0
330
Painless Rails: наводим порядок в контроллерах
inem
0
330
Less Abstract! Surprising effects of expressing OOP in pictures
inem
1
660
Pure functions and side effects
inem
0
82
Other Decks in Technology
See All in Technology
AI時代における技術的負債への取り組み
codenote
0
1.2k
60分で学ぶ最新Webフロントエンド
mizdra
PRO
33
18k
ぼくがかんがえたさいきょうのあうとぷっと
yama3133
0
180
AI時代 に増える データ活用先
takahal
0
170
生成AI時代のエンジニア育成 変わる時代と変わらないコト
starfish719
0
9.4k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
74k
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
23k
え!?初参加で 300冊以上 も頒布!? これは大成功!そのはずなのに わいの財布は 赤字 の件
hellohazime
0
160
ARIA Notifyについて
ryokatsuse
1
120
ハーネスエンジニアリングをやりすぎた話 ~そのハーネスは解体された~
gotalab555
2
1k
明日からドヤれる!超マニアックなAWSセキュリティTips10連発 / 10 Ultra-Niche AWS Security Tips
yuj1osm
0
540
"SQLは書けません"から始まる データドリブン
kubell_hr
2
470
Featured
See All Featured
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
130
Measuring & Analyzing Core Web Vitals
bluesmoon
9
810
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
A better future with KSS
kneath
240
18k
Evolving SEO for Evolving Search Engines
ryanjones
0
180
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
890
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
130
We Are The Robots
honzajavorek
0
210
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
KATA
mclloyd
PRO
35
15k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Design in an AI World
tapps
0
190
Transcript
bit.ly/pain-overengineering PAINLESS RAILS «Рельсы без боли и оверинжиниринга»
bit.ly/pain-overengineering PAINLESS RAILS «Рельсы без боли и оверинжиниринга»
bit.ly/pain-overengineering PAINLESS RAILS «Рельсы без боли и оверинжиниринга»
bit.ly/pain-overengineering
bit.ly/pain-overengineering ПЛАН 1. Боль ↭ Оверинжиниринг 2. Теория (Логики и
SLA) 3. Сравнение (Rails, DDD, Dry-rb подходы) 4. Доп. материалы, что изучать, куда копать.
• Омск • Рубист с 2006 • Фриланс • Агенства
• …
bit.ly/pain-overengineering
bit.ly/pain-overengineering
• Омск • Рубист с 2006 • Фриланс • Два
агенства • Happydev • Спикер • Белград • Гитлаб • goodrpogrammer.ru
bit.ly/pain-overengineering Боль → ОВЕРИНЖИНИРИНГ Доверились рельсам
bit.ly/pain-overengineering Боль → ОВЕРИНЖИНИРИНГ Доверились рельсам Потеряли контроль
ПОП-КУЛЬТУРА Роберт Мартин
ПОП-КУЛЬТУРА Роберт Мартин Мартин Фаулер
ПОП-КУЛЬТУРА Роберт Мартин Мартин Фаулер Фаулер Роберт
ПОП-КУЛЬТУРА Роберт Мартин Мартин Фаулер Фаулер Роберт Эрик Эванс
ПОП-КУЛЬТУРА SOLID Design Patterns Domain Driven Design
bit.ly/pain-overengineering Боль → ОВЕРИНЖИНИРИНГ Доверились рельсам Потеряли контроль Нарулили контроль
bit.ly/pain-overengineering Боль → ОВЕРИНЖИНИРИНГ Доверились рельсам Потеряли контроль Нарулили контроль
Потеряли удовольствие от разработки
railshurts.com/posts inem.at
bit.ly/pain-overengineering ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ ПРОГРАММИСТА ООП ООП
bit.ly/pain-overengineering ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ ПРОГРАММИСТА SOLID SOLID
bit.ly/pain-overengineering ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ ПРОГРАММИСТА DDD DDD
• Object oriented approach • Functional approach • DDD •
CQRS • Event sourcing • Microservices Название идеологии ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ ПРОГРАММИСТА
В СРЕДНЕМ БИЗНЕСУ НУЖНО ОДНО и то же
КОДИНГ - это обслуживающая функция
Случайная сложность vs НЕОБХОДИМАЯ сложность
Презентер Команда Адаптер Джоба Маппер JSONB Полиси Хэндлер Случайная vs
НЕОБХОДИМАЯ
Случайная vs НЕОБХОДИМАЯ ?
Application-логика Мысленный эксперимент
Application-логика Джобы Мэйлеры Current user Авторизация
bit.ly/pain-overengineering Бизнес логика не зависит • ни от фрэймворка •
ни от языка • ни от платформы
OSI (Open Systems Interconnection) model
Layered Architecture
Layered Architecture Модели предметной области Бизнес логика Application логика
bit.ly/pain-overengineering ЕСТЬ ТРИ Стула…
VANILLA Rails
class User < ApplicationRecord validates :email, confirmation: true validates :password,
confirmation: true validates :terms_of_service, acceptance: true before_create do self.request_id = Current.request_id self.user_agent = Current.user_agent self.ip_address = Current.ip_address end end VANILLA Rails
VANILLA Rails
VANILLA Rails
В ЧЕМ проблема
VANILLA Rails • Два уровня • Без жестких границ •
Логика вперемешку • Рельсы активно поощряют не думать об этом
Ммм, Рельсы? А скажи что-нибудь по рельсовому! «А щас просто
колбэк фиганем», консерны, валидации, Current.user Да Класс!
Василий, тут это, надо фичу запилить
Василий, тут это, надо фичу запилить Возьмем Рельсы?
Василий, тут это, надо фичу запилить Возьмем Рельсы?
Название идеологии ПСИХОЛОГИЯ ОБУЧАЮЩЕГОСЯ ПРОГРАММИСТА
bit.ly/pain-overengineering Режим «мамкин архитектор»
ИДЕАЛОГИЧЕСКИ ЗАРЯЖЕННЫЙ КОД Боль
А у вас правда ООП? А скажи что-нибудь по ООП-шному!
Dependenсy Injection, SOLID, Sandi Metz, Service Object, Адаптер, Интерактор! Да Класс!
ИДЕАЛОГИЧЕСКИ ЗАРЯЖЕННЫЙ КОД DDD
А у вас правда DDD? А скажи что-нибудь по DDD-шному!
Bounded Context, Aggregate, Event Sourcing, Command Query Responsibility Segregation! Да Класс!
bit.ly/pain-overengineering DOMAIN DRIVEN DESIGN
DDD1 - идейная часть
DDD2 - «Практическая» часть
НаС зАВОРАЖИВАЮТ КРАСИВЫЕ СЛОЖНЫЕ ШТУКИ
НаС зАВОРАЖИВАЮТ КРАСИВЫЕ СЛОЖНЫЕ ШТУКИ
DDD2 На практике
DDD2 На практике
DDD2 На практике
ИДЕАЛОГИЧЕСКИ ЗАРЯЖЕННЫЙ КОД Dry-rb
А у вас правда Dry-rb? А скажи что-нибудь по dryrb-шному!
Монады, Operation, Entity, Repository Да Класс! Success! include Import[ 'organisations.libs.token_generator', repo: 'repositories.organisation' ] optional(:tags).maybe(:array?) optional(:status).value(!::Core!::Types!::ServiceStatus)
Dry-rb
ЛЕГКО vs ПРОСТО
Легкость - субъективна ЛЕгко vs Просто
Простота - объективна ЛЕгко vs Просто
bit.ly/pain-overengineering В поисках идеальной архитектуры
bit.ly/pain-overengineering Оверинжиниринг What you think is what you get
bit.ly/pain-overengineering РЕАЛЬНАЯ ЖИЗНЬ Пуристам тут не место
Рельсоболь Оверинжиниринг ↭ ЕСТЬ ТРИ Стула
Рельсоболь Оверинжиниринг ? ЕСТЬ ТРИ Стула
НЕДОИНЖИНИРИНГ
bit.ly/pain-overengineering
НЕДОИНЖИНИРИНГ • Слишком большие классы • Слишком большие методы •
Недостаточно ООП-код • Дублирование кода • Применили мало паттернов • Нужны жесткие границы • Надо следовать принципам из поп-культуры Решает не те проблемы
ЕСТЬ ТРИ Стула Рельсоболь Оверинжиниринг Недоинжиниринг
bit.ly/pain-overengineering Just enough engineering
1. ударить молотком - 10 коп. 2. знать, где -
9.90 руб. Just enough engineering
bit.ly/pain-overengineering Just enough engineering
bit.ly/pain-overengineering Презентер Адаптер Полиморфизм Dependency Inversion Dependency Injection Функция Класс
Наследование Side effects Null Objects Exceptions Declarative Imperative Functional Object Oriented Factory Repository Value object Entity Монады BPMN Railway programming CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM Background Jobs Domain events Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy Just enough engineering
bit.ly/pain-overengineering Презентер Адаптер Полиморфизм Dependency Inversion Dependency Injection Функция Класс
Наследование Side effects Null Objects Exceptions Declarative Imperative Functional Object Oriented Factory Repository Value object Entity Монады BPMN Railway programming CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM Background Jobs Domain events Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy Just enough engineering
bit.ly/pain-overengineering Презентер Адаптер Полиморфизм Dependency Inversion Dependency Injection Функция Класс
Наследование Side effects Null Objects Exceptions Declarative Imperative Functional Object Oriented Factory Repository Value object Entity Монады BPMN Railway programming CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM Background Jobs Domain events Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy 2 руб. 40 коп. = Just enough engineering
bit.ly/pain-overengineering Презентер Адаптер Полиморфизм Dependency Inversion Dependency Injection Функция Класс
Наследование Side effects Null Objects Exceptions Declarative Imperative Functional Object Oriented Factory Repository Value object Entity Монады BPMN Railway programming CQRS Event Sourcing Service Layer Aggreagte Bounded Context ORM Background Jobs Domain events Callbacks Concerns Form Object Chaining Pattern Matching Миграции Rake-таски Авторизация TDD Policy Just enough engineering
bit.ly/pain-overengineering Айда учиться вместе
bit.ly/pain-overengineering НЕ доделывай
bit.ly/pain-overengineering Айда учиться вместе
bit.ly/pain-overengineering КАК СРАВНИВАТЬ РАЗНЫЕ ПОДХОДЫ ?
bit.ly/pain-overengineering PAINLESS RAILS «Наводим порядок в моделях» bit.ly/pain-overengineering