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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ivan Nemytchenko
July 17, 2020
Technology
610
0
Share
Rails без боли и оверинжиниринга
Ivan Nemytchenko
July 17, 2020
More Decks by Ivan Nemytchenko
See All by Ivan Nemytchenko
Semantic_AI_knowledge.pdf
inem
0
30
Code Topology Notation
inem
0
190
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
670
Pure functions and side effects
inem
0
88
Other Decks in Technology
See All in Technology
基礎から解説!Icebergで紐解くSnowflake×Databricks連携の現在地
cm_yasuhara
0
200
続 運用改善、不都合な真実 〜 物理制約のない運用改善はほとんど無価値 / 20260518-ssmjp-kaizen-no-value-without-physical-constraints
opelab
3
330
Copilot CLI・IDE・Web・スマホで途切れない開発フローを目指して / One Copilot flow - CLI IDE Web Mobile
aeonpeople
1
540
AsyncStreamでマルチブロードキャストを実装する
1mash0
1
210
パーソルキャリア IT/テクノロジー職向け 会社紹介資料|Company Introduction Deck
techtekt
PRO
0
500
TSKaigi 2026 - Auth.jsからBetter Authへの 移行に見る「型とランタイム」の 設計思想の変化
teamlab
PRO
1
190
データ基盤構築・運用の現場から 〜 Snowflake Intelligence 導入で変わった、データ活用の未来 〜
wonohe
0
150
GitHub Copilot CLI で考える複数エージェント設計
tomokusaba
0
150
CARTA HOLDINGS エンジニア向け 採用ピッチ資料 / CARTA-GUIDE-for-Engineers
carta_engineering
0
47k
Loadbalancing exporter internals
ymotongpoo
1
120
なぜ、IAMロールのプリンシパルに*による部分マッチングが使えないのか? / 20260518-ssmjp-iam-role-principal
opelab
3
150
A Harness for Behaviour: how to get AI to generate code that does what we intend, or "TDD in the age of AI"
xpmatteo
0
230
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
37
7.3k
The Invisible Side of Design
smashingmag
302
52k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
270
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Speed Design
sergeychernyshev
33
1.7k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
570
We Have a Design System, Now What?
morganepeng
55
8.1k
Producing Creativity
orderedlist
PRO
348
40k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Between Models and Reality
mayunak
4
290
Amusing Abliteration
ianozsvald
1
170
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