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
0
600
Rails без боли и оверинжиниринга
Ivan Nemytchenko
July 17, 2020
Tweet
Share
More Decks by Ivan Nemytchenko
See All by Ivan Nemytchenko
Code Topology Notation
inem
0
170
The Shape of a Service Object
inem
0
1.5k
The Curse of Service Object
inem
0
350
Modern Make for modern (Rails) programmers
inem
0
130
Откуда берется сложность в Rails-проектах и куда бы её деть?
inem
0
320
Painless Rails: наводим порядок в контроллерах
inem
0
320
Less Abstract! Surprising effects of expressing OOP in pictures
inem
1
650
Pure functions and side effects
inem
0
76
Solving architectural problems with OOP in pictures
inem
1
6.2k
Other Decks in Technology
See All in Technology
LINE Messengerの次世代ストレージ選定
lycorptech_jp
PRO
19
7.4k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
72k
大規模サービスにおける レガシーコードからReactへの移行
magicpod
1
140
白金鉱業Meetup_Vol.22_Orbital Senseを支える衛星画像のマルチモーダルエンベディングと地理空間のあいまい検索技術
brainpadpr
2
220
AIエンジニア Devin と歩む、自律型運用プロセスの構築
a2ito
0
700
Exadata Fleet Update
oracle4engineer
PRO
0
1.3k
GitLab Duo Agent Platform + Local LLMサービングで幸せになりたい
jyoshise
0
140
開発組織の課題解決を加速するための権限委譲 -する側、される側としての向き合い方-
daitasu
5
270
8万デプロイ
iwamot
PRO
2
100
vLLM Community Meetup Tokyo #3 オープニングトーク
jpishikawa
0
150
技術的負債の泥沼から組織を救う3つの転換点
nwiizo
8
2.6k
組織のSREを推進するためのPlatform EngineeringとEKS / Platform Engineering and EKS to drive SRE in your organization
chmikata
0
180
Featured
See All Featured
We Are The Robots
honzajavorek
0
190
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
270
The World Runs on Bad Software
bkeepers
PRO
72
12k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
140
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
760
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
850
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.7k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
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