diff --git a/docs/talks.md b/docs/talks.md index 863f28df..ff5f96ff 100644 --- a/docs/talks.md +++ b/docs/talks.md @@ -10,24 +10,24 @@ [Video](https://www.youtube.com/watch?v=AlE-JKp9bIA) -[Slides](https://dry-python.org/static/slides/ddd-toolkit-2.html) +[Slides](/static/slides/ddd-toolkit-2.html) ## Keeping software soft [Video](https://www.youtube.com/watch?v=yokuWjeZqfs) -[Slides](https://dry-python.org/static/slides/keeping-software-soft.html) +[Slides](/static/slides/keeping-software-soft.html) ## Domain Driven Design Toolkit [Video](https://www.youtube.com/watch?v=LqTPRCLZffE) -[Slides](https://dry-python.org/static/slides/ddd-toolkit.html) +[Slides](/static/slides/ddd-toolkit.html) ## Introducing dry-python [Video](https://www.youtube.com/watch?v=vdh-GYXmv8o) -[Slides](https://dry-python.org/static/slides/introducing-dry-python.html) +[Slides](/static/slides/introducing-dry-python.html) Drylabs maintains dry-python and helps those who want to use it inside their organizations. Read more at drylabs.io diff --git a/slides/ddd-toolkit-2.pug b/slides/ddd-toolkit-2.pug index 4a057f79..70a71a2b 100644 --- a/slides/ddd-toolkit-2.pug +++ b/slides/ddd-toolkit-2.pug @@ -24,8 +24,8 @@ html li #[a(href="https://dry-python.org/") dry-python.org] li Django Channels 1.0 li 5 years of experience in Python - section(data-background-image=require("./pics/startup-process.png") data-background-size="contain" data-background-color="#2E677B") - section(data-background-image=require("./pics/long-function.jpg") data-background-size="contain") + section(data-background-image=require("./pics/startup-process.png").default data-background-size="contain" data-background-color="#2E677B") + section(data-background-image=require("./pics/long-function.jpg").default data-background-size="contain") section h2 pros ol @@ -34,7 +34,7 @@ html ol li.fragment Really hard to change li.fragment We can not see the whole picture - section(data-background-image=require("./pics/trello-issue.png") data-background-size="contain" data-background-color="#002B45") + section(data-background-image=require("./pics/trello-issue.png").default data-background-size="contain" data-background-color="#002B45") section h2 Implicit API pre @@ -72,17 +72,17 @@ html li.fragment Python vs. Go li.fragment Emacs vs. Vim li.fragment Tabs vs. Spaces - section(data-background-image=require("./pics/eric-evans.jpg") data-background-size="contain" data-background-position="left" data-background-color="#000000") + section(data-background-image=require("./pics/eric-evans.jpg").default data-background-size="contain" data-background-position="left" data-background-color="#000000") section - img(src=require("./pics/domain-driven-design.jpg")).plain + img(src=require("./pics/domain-driven-design.jpg").default).plain section h2 What is the domain-driven design? p.fragment Focus on the core complexity and opportunity in the domain p.fragment Explore models in a collaboration of domain experts and software experts p.fragment Write software that expresses those models explicitly p.fragment Speak #[b ubiquitous language] within a #[b bounded context] - section(data-background-image=require("./pics/ddd-schema.jpg") data-background-size="contain") - section(data-background-image=require("./pics/ddd-schema-models-selected.jpg") data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-models-selected.jpg").default data-background-size="contain") section h2 What is a model? p.fragment #[b HINT:] Not a UML diagram @@ -92,7 +92,7 @@ html a(href="https://dry-python.org/") dry-python p A set of libraries for pluggable business logic components. img(src="https://raw.githubusercontent.com/dry-python/brand/master/logo/dry-python.png").plain - section(data-background-image=require("./pics/ddd-schema-services-selected.jpg") data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-services-selected.jpg").default data-background-size="contain") section img(src="https://raw.githubusercontent.com/dry-python/brand/master/logo/stories.png").plain p Define a user story in the business transaction DSL. @@ -170,7 +170,7 @@ html li.fragment Each step knows nothing about a neighbor li.fragment Easy reuse of code li.fragment Allows to instrument code easily - section(data-background-image=require("./pics/debug-toolbar.png") data-background-size="contain") + section(data-background-image=require("./pics/debug-toolbar.png").default data-background-size="contain") h2 DEBUG TOOLBAR br br @@ -182,21 +182,21 @@ html br br br - section(data-background-image=require("./pics/pytest.png") data-background-size="contain") + section(data-background-image=require("./pics/pytest.png").default data-background-size="contain") h2(style="color: white") py.test - section(data-background-image=require("./pics/sentry.png") data-background-size="contain") + section(data-background-image=require("./pics/sentry.png").default data-background-size="contain") h2 Sentry - section(data-background-image=require("./pics/elk-logs-ui.gif") data-background-size="contain") + section(data-background-image=require("./pics/elk-logs-ui.gif").default data-background-size="contain") h2 ELK - section(data-background-image=require("./pics/ddd-schema-entities-selected.jpg") data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-entities-selected.jpg").default data-background-size="contain") section - img(src=require("./pics/postgresql.png") height="150" style=" padding-right: 70px;").plain - img(src=require("./pics/firebase.png") height="150" style=" padding-right: 70px;").plain + img(src=require("./pics/postgresql.png").default height="150" style=" padding-right: 70px;").plain + img(src=require("./pics/firebase.png").default height="150" style=" padding-right: 70px;").plain ul li.fragment We do not have the tooling to work with data li.fragment There are no data contracts written in code section - img(src=require("./pics/attrs.png")).plain + img(src=require("./pics/attrs.png").default).plain section h2 Layout pre @@ -253,7 +253,7 @@ html h2.fragment cons ol li.fragment Working with data sources manually - section(data-background-image=require("./pics/ddd-schema-repositories-selected.jpg") data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-repositories-selected.jpg").default data-background-size="contain") section img(src="https://raw.githubusercontent.com/dry-python/brand/master/logo/mappers.png").plain p Declarative mappers from ORM models to domain entities. And back again! @@ -320,7 +320,7 @@ html } """, {"id": id})) section - img(src=require("./pics/pusher.png")).plain + img(src=require("./pics/pusher.png").default).plain section h2 How we use third-party libraries pre @@ -339,7 +339,7 @@ html "private-user-1" ) section - img(src=require("./pics/ably.png")).plain + img(src=require("./pics/ably.png").default).plain section h2 How to use it with DI pre @@ -392,7 +392,7 @@ html load_profile = app.repositories.load_profile MakePurchase.make_purchase(category_id=1, price_id=1) - section(data-background-image=require("./pics/keep-calm-and-ddd.png") data-background-size="contain" data-background-color="#C10C06") + section(data-background-image=require("./pics/keep-calm-and-ddd.png").default data-background-size="contain" data-background-color="#C10C06") section h2 Get in touch ul diff --git a/slides/ddd-toolkit.pug b/slides/ddd-toolkit.pug index 1df62aa4..b37982e1 100644 --- a/slides/ddd-toolkit.pug +++ b/slides/ddd-toolkit.pug @@ -28,8 +28,8 @@ html h2 Complexity p.fragment #[b Accidental complexity] refers to challenges that developers unintentionally make for themselves as a result of trying to solve a problem. p.fragment #[b Essential complexity] is just the nature of the beast you're trying to tame. - section(data-background-image=require("./pics/interrupted-programmer.jpg") data-background-size="contain") - section(data-background-image=require("./pics/callback-hell.jpg") data-background-size="contain") + section(data-background-image=require("./pics/interrupted-programmer.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/callback-hell.jpg").default data-background-size="contain") section h2 Accidental complexity ul @@ -39,7 +39,7 @@ html li.fragment Emacs vs. Vim li.fragment Tabs vs. Spaces section - img(src=require("./pics/domain-driven-design.jpg")).plain + img(src=require("./pics/domain-driven-design.jpg").default).plain section h2 What is the domain-driven design? p.fragment Focus on the core complexity and opportunity in the domain @@ -51,9 +51,9 @@ html p.fragment You have to master the tool first then you can focus on #[b DDD]. p.fragment In most domain models, most design patterns are technical noise. section - img(src=require("./pics/implementing-domain-driven-design.jpg")).plain - section(data-background-image=require("./pics/ddd-schema.jpg") data-background-size="contain") - section(data-background-image=require("./pics/ddd-schema-models-selected.jpg") data-background-size="contain") + img(src=require("./pics/implementing-domain-driven-design.jpg").default).plain + section(data-background-image=require("./pics/ddd-schema.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-models-selected.jpg").default data-background-size="contain") section h2 What is a model? p.fragment #[b HINT:] Not a UML diagram @@ -63,7 +63,7 @@ html a(href="https://dry-python.org/") dry-python p A set of libraries for pluggable business logic components. img(src="https://raw.githubusercontent.com/dry-python/brand/master/logo/dry-python.png").plain - section(data-background-image=require("./pics/ddd-schema-services-selected.jpg") data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-services-selected.jpg").default data-background-size="contain") section img(src="https://raw.githubusercontent.com/dry-python/brand/master/logo/stories.png").plain p Define a user story in the business transaction DSL. @@ -148,7 +148,7 @@ html user = #{"<"}User: 3292#{">"} # Story argument category = #{"<"}Category: 1318#{">"} # Set by Subscription.find_category - section(data-background-image=require("./pics/debug-toolbar.png") data-background-size="contain") + section(data-background-image=require("./pics/debug-toolbar.png").default data-background-size="contain") h2 DEBUG TOOLBAR br br @@ -160,18 +160,18 @@ html br br br - section(data-background-image=require("./pics/pytest.png") data-background-size="contain") + section(data-background-image=require("./pics/pytest.png").default data-background-size="contain") h2(style="color: white") py.test - section(data-background-image=require("./pics/sentry.png") data-background-size="contain") + section(data-background-image=require("./pics/sentry.png").default data-background-size="contain") h2 Sentry - section(data-background-image=require("./pics/elk-logs-ui.gif") data-background-size="contain") + section(data-background-image=require("./pics/elk-logs-ui.gif").default data-background-size="contain") h2 ELK - section(data-background-image=require("./pics/ddd-schema-entities-selected.jpg") data-background-size="contain") - section(data-background-image=require("./pics/aggregate-root-1.jpg") data-background-size="contain") - section(data-background-image=require("./pics/aggregate-root-2.jpg") data-background-size="contain") - section(data-background-image=require("./pics/aggregate-root-3.jpg") data-background-size="contain") - section(data-background-image=require("./pics/aggregate-root-4.jpg") data-background-size="contain") - section(data-background-image=require("./pics/aggregate-root-5.jpg") data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-entities-selected.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/aggregate-root-1.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/aggregate-root-2.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/aggregate-root-3.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/aggregate-root-4.jpg").default data-background-size="contain") + section(data-background-image=require("./pics/aggregate-root-5.jpg").default data-background-size="contain") section h2 Layout pre @@ -202,7 +202,7 @@ html class Order: primary_key: OrderId items: List[LineItem] - section(data-background-image=require("./pics/ddd-schema-repositories-selected.jpg") data-background-size="contain") + section(data-background-image=require("./pics/ddd-schema-repositories-selected.jpg").default data-background-size="contain") section img(src="https://raw.githubusercontent.com/dry-python/brand/master/logo/mappers.png").plain p Declarative mappers from ORM models to domain entities. And back again! @@ -268,7 +268,7 @@ html loadInvoice(id: %(id)d) } """, {"id": id})) - section(data-background-image=require("./pics/pusher-to-ably.png") data-background-size="contain") + section(data-background-image=require("./pics/pusher-to-ably.png").default data-background-size="contain") section h2 Tests & Mocks pre @@ -313,6 +313,6 @@ html li.fragment Contracts and aggregates li.fragment Mappers li.fragment Dependency injection - section(data-background-image=require("./pics/drylabs-io.png") data-background-size="contain") + section(data-background-image=require("./pics/drylabs-io.png").default data-background-size="contain") section h2 Questions? diff --git a/slides/introducing-dry-python.pug b/slides/introducing-dry-python.pug index e52c8ab8..471793cd 100644 --- a/slides/introducing-dry-python.pug +++ b/slides/introducing-dry-python.pug @@ -31,7 +31,7 @@ html p.fragment b and frustrating p.fragment Let's consider we're developing subscription button for a web service - section(data-background-image=require("./pics/startup.jpg") data-background-size="contain") + section(data-background-image=require("./pics/startup.jpg").default data-background-size="contain") h2(style="color: white; background-color: black") Startup br br @@ -61,7 +61,7 @@ html Traceback (most recent call last): File "views.py", line 1027, in buy_subscription ZeroDivisionError: division by zero - section(data-background-image=require("./pics/enterprise.jpg") data-background-size="contain") + section(data-background-image=require("./pics/enterprise.jpg").default data-background-size="contain") h2(style="color: white; background-color: black") Enterprise br br @@ -89,7 +89,7 @@ html ol li.fragment What exactly does this class do? li.fragment How to use it? - section(data-background-image=require("./pics/method-flowchart.png") data-background-size="contain") + section(data-background-image=require("./pics/method-flowchart.png").default data-background-size="contain") br section h2 Framework internals leak @@ -115,13 +115,13 @@ html li.fragment Hard to reason about li.fragment Time-consuming section - img(src=require("./pics/crazy-telephone-wires.png")) + img(src=require("./pics/crazy-telephone-wires.png").default) section blockquote p If your code is crap, stickies on the wall won't help. a(href="https://twitter.com/henrikkniberg"). @HenrikKniberg - img(src=require("./pics/stickers-on-the-wall.jpg")) + img(src=require("./pics/stickers-on-the-wall.jpg").default) section h2 Service layer p Defines an application's boundary with a layer of services that establishes a set of available operations and coordinates the application's response in each operation. @@ -194,7 +194,7 @@ html user = #{"<"}User: 3292#{">"} # Story argument category = #{"<"}Category: 1318#{">"} # Set by Subscription.find_category - section(data-background-image=require("./pics/debug-toolbar.png") data-background-size="contain") + section(data-background-image=require("./pics/debug-toolbar.png").default data-background-size="contain") h2 DEBUG TOOLBAR br br @@ -206,9 +206,9 @@ html br br br - section(data-background-image=require("./pics/pytest.png") data-background-size="contain") + section(data-background-image=require("./pics/pytest.png").default data-background-size="contain") h2(style="color: white") py.test - section(data-background-image=require("./pics/sentry.png") data-background-size="contain") + section(data-background-image=require("./pics/sentry.png").default data-background-size="contain") h2 Sentry section h2 Usage diff --git a/slides/keeping-software-soft.pug b/slides/keeping-software-soft.pug index aef01f03..880dafd0 100644 --- a/slides/keeping-software-soft.pug +++ b/slides/keeping-software-soft.pug @@ -17,7 +17,7 @@ html a(href="https://github.com/proofit404") Artem Malyshev h6 a(href="https://twitter.com/proofit404") @proofit404 - section(data-background-image=require("./pics/martin-fowler.jpg") data-background-size="contain" data-background-position="right" data-background-color="#000000") + section(data-background-image=require("./pics/martin-fowler.jpg").default data-background-size="contain" data-background-position="right" data-background-color="#000000") br section h2 BIO @@ -26,17 +26,17 @@ html li #[a(href="https://dry-python.org/") dry-python.org] li Django Channels 1.0 li 5 years of experience in Python - section(data-background-image=require("./pics/startup-process.png") data-background-size="contain" data-background-color="#2E677B") + section(data-background-image=require("./pics/startup-process.png").default data-background-size="contain" data-background-color="#2E677B") br - section(data-background-image=require("./pics/reading-other-peoples-code.png") data-background-size="contain") + section(data-background-image=require("./pics/reading-other-peoples-code.png").default data-background-size="contain") br section - img(src=require("./pics/flask.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/express.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/sinatra.png") height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/flask.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/express.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/sinatra.png").default height="100" style=" padding-right: 70px;").plain aside.notes p несторуктурированный проект на фласке синатре - section(data-background-image=require("./pics/long-function.jpg") data-background-size="contain") + section(data-background-image=require("./pics/long-function.jpg").default data-background-size="contain") br aside.notes p тут мы json валидируем @@ -57,14 +57,14 @@ html p тяжело менять p чтобы добавить какую-нибудь фигню надо перелопатить весь проект section - img(src=require("./pics/django.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/ruby-on-rails.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/spring.png") height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/django.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/ruby-on-rails.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/spring.png").default height="100" style=" padding-right: 70px;").plain aside.notes p eсть стартапы с django rails nestjs spring p там за людей уже подумали как структурировать код p казалось бы решение проблемы - section(data-background-image=require("./pics/trello-issue.png") data-background-size="contain" data-background-color="#002B45") + section(data-background-image=require("./pics/trello-issue.png").default data-background-size="contain" data-background-color="#002B45") br aside.notes p вот приходишь ты в такой стартап, получаешь таску @@ -84,7 +84,7 @@ html ol li.fragment What exactly does this class do? li.fragment How to use it? - section(data-background-image=require("./pics/method-flowchart.png") data-background-size="contain") + section(data-background-image=require("./pics/method-flowchart.png").default data-background-size="contain") br section h2 Function to change @@ -96,7 +96,7 @@ html def send_sms(event): text = 'You purchase something!' on_commit(lambda: send_message(text)) - img(src=require("./pics/grep-test.png")).fragment.plain + img(src=require("./pics/grep-test.png").default).fragment.plain aside.notes p В документации нет ни слова про вызов нашей функции p Не ясно как передать в неё нужные нам аргументы @@ -114,7 +114,7 @@ html p тяжело читать p проще править p надо держать в голове полную картину работы фреймворка - section(data-background-image=require("./pics/lost-in-translation.jpg") data-background-size="contain") + section(data-background-image=require("./pics/lost-in-translation.jpg").default data-background-size="contain") br aside.notes p в каждом примере мы понятия не имеем что вообще делает наше приложение @@ -158,15 +158,15 @@ html p реализация каждого шага ничего не знает про соседний p соответственно шаги легко переиспользовать в любом порядке p их легко менять - section(data-background-image=require("./pics/eric-evans.jpg") data-background-size="contain" data-background-position="left" data-background-color="#000000") + section(data-background-image=require("./pics/eric-evans.jpg").default data-background-size="contain" data-background-position="left" data-background-color="#000000") br aside.notes p что такое ddd p ддд есть а инструментов не так много section - img(src=require("./pics/trailblazer.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/dry-rb.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/hanami.png") height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/trailblazer.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/dry-rb.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/hanami.png").default height="100" style=" padding-right: 70px;").plain img(src="https://raw.githubusercontent.com/dry-python/brand/master/logo/dry-python.png" height="100" style=" padding-right: 70px;").plain section h2 @@ -227,8 +227,8 @@ html p мы так же получили раздельные шаги с хорошым переиспользованием p DDD - тот самый ясный язык section - img(src=require("./pics/postgresql.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/firebase.png") height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/postgresql.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/firebase.png").default height="100" style=" padding-right: 70px;").plain aside.notes p жили не тужили всё было хорошо p всё было в постгресе @@ -245,9 +245,9 @@ html p проблема: нет явно прописанных правил о данных, которыми живёт проект p DDD: нет модели section - img(src=require("./pics/attrs.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/dry-rb.png") height="100" style=" padding-right: 70px;").plain - img(src=require("./pics/lombok.png") height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/attrs.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/dry-rb.png").default height="100" style=" padding-right: 70px;").plain + img(src=require("./pics/lombok.png").default height="100" style=" padding-right: 70px;").plain aside.notes p attrs/dataclasses dry-structures lombok section @@ -356,7 +356,7 @@ html } """, {"id": id})) section - img(src=require("./pics/pusher.png")).plain + img(src=require("./pics/pusher.png").default).plain aside.notes p жили не тужили p был у нас пушер @@ -383,7 +383,7 @@ html p импортируем на прямую пихаем им данные так как они того хотят p в тестах stubим библиотеку и ассертим данные которые им скормили section - img(src=require("./pics/ably.png")).plain + img(src=require("./pics/ably.png").default).plain aside.notes p пришёл бизнес p хотим горантию доставки сообщений @@ -421,7 +421,7 @@ html p была проблема - внутри шагов всё привязано конкретным сторонним библиотекам p решение - интерфейсы нас спасут p предотвратят от протекания ограничений конкретной тулзы в бизнес логики - section(data-background-image=require("./pics/debug-toolbar.png") data-background-size="contain") + section(data-background-image=require("./pics/debug-toolbar.png").default data-background-size="contain") h2 DEBUG TOOLBAR br br @@ -437,22 +437,22 @@ html p жили не тужили p но чего-то не хватало p запилили интеграцию с debug toolbar потомучто сценарий падал на шаге без описания по какой бизнес логике прошёл - section(data-background-image=require("./pics/pytest.png") data-background-size="contain") + section(data-background-image=require("./pics/pytest.png").default data-background-size="contain") h2(style="color: white") py.test aside.notes p кто ломал сиай? p отычно тесты падают assertion error true is not false p спасибо помог! p мы напилили интеграцию с test frameworks чтобы показыват какая строчка теста чего выполняла - section(data-background-image=require("./pics/sentry.png") data-background-size="contain") + section(data-background-image=require("./pics/sentry.png").default data-background-size="contain") h2 Sentry aside.notes p напилили интеграцию с sentry - section(data-background-image=require("./pics/elk-logs-ui.gif") data-background-size="contain") + section(data-background-image=require("./pics/elk-logs-ui.gif").default data-background-size="contain") h2 ELK aside.notes p напилим интеграцию с elk - section(data-background-image=require("./pics/keep-calm-and-ddd.png") data-background-size="contain" data-background-color="#C10C06") + section(data-background-image=require("./pics/keep-calm-and-ddd.png").default data-background-size="contain" data-background-color="#C10C06") br aside.notes p подитожим