Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rails без боли и оверинжиниринга
Search
Ivan Nemytchenko
July 17, 2020
Technology
0
580
Rails без боли и оверинжиниринга
Ivan Nemytchenko
July 17, 2020
Tweet
Share
More Decks by Ivan Nemytchenko
See All by Ivan Nemytchenko
Code Topology Notation
inem
0
150
The Shape of a Service Object
inem
0
1.4k
The Curse of Service Object
inem
0
350
Modern Make for modern (Rails) programmers
inem
0
110
Откуда берется сложность в Rails-проектах и куда бы её деть?
inem
0
310
Painless Rails: наводим порядок в контроллерах
inem
0
310
Less Abstract! Surprising effects of expressing OOP in pictures
inem
1
640
Pure functions and side effects
inem
0
66
Solving architectural problems with OOP in pictures
inem
1
6.2k
Other Decks in Technology
See All in Technology
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
260
日本Rubyの会: これまでとこれから
snoozer05
PRO
4
160
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
250
WordPress は終わったのか ~今のWordPress の制作手法ってなにがあんねん?~ / Is WordPress Over? How We Build with WordPress Today
tbshiki
2
840
チーリンについて
hirotomotaguchi
6
2.1k
Jakarta Agentic AI Specification - Status and Future
reza_rahman
0
110
ハッカソンから社内プロダクトへ AIエージェント「ko☆shi」開発で学んだ4つの重要要素
sonoda_mj
5
480
Amazon Quick Suite で始める手軽な AI エージェント
shimy
0
550
プロンプトやエージェントを自動的に作る方法
shibuiwilliam
13
13k
まだ間に合う! Agentic AI on AWSの現在地をやさしく一挙おさらい
minorun365
13
960
Identity Management for Agentic AI 解説
fujie
0
110
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.5k
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
83
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
140
Embracing the Ebb and Flow
colly
88
4.9k
How STYLIGHT went responsive
nonsquared
100
6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
75
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
60
Rebuilding a faster, lazier Slack
samanthasiow
85
9.3k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
2
2.7k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
120
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
20
Into the Great Unknown - MozCon
thekraken
40
2.2k
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