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
Ivan Nemytchenko
July 17, 2020
Technology
0
490
Rails без боли и оверинжиниринга
Ivan Nemytchenko
July 17, 2020
Tweet
Share
More Decks by Ivan Nemytchenko
See All by Ivan Nemytchenko
Code Topology Notation
inem
0
110
The Shape of a Service Object
inem
0
1.1k
The Curse of Service Object
inem
0
310
Modern Make for modern (Rails) programmers
inem
0
87
Откуда берется сложность в Rails-проектах и куда бы её деть?
inem
0
280
Painless Rails: наводим порядок в контроллерах
inem
0
270
Less Abstract! Surprising effects of expressing OOP in pictures
inem
1
610
Pure functions and side effects
inem
0
50
Solving architectural problems with OOP in pictures
inem
1
6k
Other Decks in Technology
See All in Technology
SREからゼロイチプロダクト開発へ ー越境する打席の立ち方と期待への応え方ー / Product Engineering Night #8
itkq
2
1.1k
OPENLOGI Company Profile
hr01
0
63k
3D生成AIのための画像生成
kosukeito
2
600
グループ ポリシー再確認 (2)
murachiakira
0
220
250510 StepFunctionのテスト自動化始めました vol.1
east_takumi
1
140
白金鉱業Meetup_Vol.18_AIエージェント時代のUI/UX設計
brainpadpr
1
280
OPENLOGI Company Profile for engineer
hr01
1
26k
LLM アプリケーションのためのクラウドセキュリティ - CSPM の実装ポイント-
osakatechlab
0
270
Computer Use〜OpenAIとAnthropicの比較と将来の展望〜
pharma_x_tech
6
980
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
5.5k
クラウドネイティブ環境の脅威モデリング
kyohmizu
1
350
Aspire をカスタマイズしよう & Aspire 9.2
nenonaninu
0
380
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Bash Introduction
62gerente
612
210k
Why Our Code Smells
bkeepers
PRO
336
57k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
47
2.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
We Have a Design System, Now What?
morganepeng
52
7.6k
Building Applications with DynamoDB
mza
94
6.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.5k
Designing for Performance
lara
608
69k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Speed Design
sergeychernyshev
29
930
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