emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
3.46K subscribers
110 photos
11 videos
20 files
1.1K links
Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, Extreme Programming, SDLC, Agile, etc.

Chat: https://t.me/emacsway_chat

Persistence: https://dckms.github.io/system-architecture/
Download Telegram
С поддержкой Generics в Golang открываются новые возможности в использовании приемов функционального программирования.

См. главу "Monadic Error Handling":
https://awalterschulze.github.io/blog/post/monads-for-goprogrammers/

Это вынуждает по новому взглянуть на широко известный среди функциональщиков Railway Oriented Programming:
- https://fsharpforfunandprofit.com/rop/
- https://fsharpforfunandprofit.com/posts/against-railway-oriented-programming/

Перевод на русский статьи "Railway Oriented Programming":
- https://habr.com/ru/post/339606/

Еще одна ссылка, на эту тему:
- https://medium.com/@naveenkumarmuguda/railway-oriented-programming-a-powerful-functional-programming-pattern-ab454e467f31

А здесь, на слайдах, показана трансформация UseCase of Robert Martin в Railway Oriented Programming:
- https://github.com/swlaschin/RailwayOrientedProgramming/blob/master/Railway_Oriented_Programming_Slideshare.pdf
- https://github.com/swlaschin/RailwayOrientedProgramming/blob/master/Railway_Oriented_Programming.pptx
- https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html#use-cases

Кстати, это является и ответом на вопрос, есть ли жизнь без синхронных Domain Events:

📝 "In an object-oriented design, it is common to have domain events raised internally within a bounded context. In that approach, a workflow object raises an OrderPlaced event, and then a handler listens for that and sends the order acknowledgement, and another handler generates a BillableOrderPlaced event, and so on.
<...>
In a functional design, we prefer not to use this approach, because it creates hidden dependencies. Instead, if we need a “listener” for an event, we just append it to the end of workflow...
<...>
This approach is more explicit – there are no global event managers with mutable state – and therefore it is easier to understand and maintain."
- "Domain Modeling Made Functional. Tackle Software Complexity with Domain-Driven Design and F#" by Scott Wlaschin
https://fsharpforfunandprofit.com/books/

Кстати, на github.com по этой теме в топе ребята из @drypython :
- https://github.com/topics/railway-oriented-programming

Одна из библиотек, облегчающих использование Railway Oriented Programming в Python: https://github.com/proofit404/stories

#FunctionalProgramming #DDD #Golang
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
С поддержкой Generics в Golang открываются новые возможности в использовании приемов функционального программирования. См. главу "Monadic Error Handling": https://awalterschulze.github.io/blog/post/monads-for-goprogrammers/ Это вынуждает по новому взглянуть…
Кстати, агрегаты вот этого DDD/Golang reference application https://github.com/AntonStoeckl/go-iddd выполнены в функциональной парадигме. Об этом автор пишет в сопроводительных статьях к приложению.

📝 "My Aggregate used to be implemented in OOP style with inline state in the past. My little project is event-sourced and I decided a while ago that I want to implement a functional core. Event-Sourcing is quite functional by nature, so I decided that my Aggregate will only consist of functions! My first functional version did not even have a state object. It simply projected all necessary properties into local variables. Not long ago I introduced a currentState object — which is unexposed — so only visible inside the Domain subpackage customer in which my Aggregate lives."
- "Implementing Domain-Driven Design and Hexagonal Architecture with Go (2). Part 2 — How I implement tactical DDD patterns — the Domain layer" by Anton Stöckl
https://medium.com/@TonyBologni/implementing-domain-driven-design-and-hexagonal-architecture-with-go-2-efd432505554

#DDD #Golang #FunctionalProgramming
Для тех, кто работает с Golang, - смотрел как-то я эту книгу: "Hands-On Software Architecture with Golang. Design and architect highly scalable and robust applications using Go." by Jyotiswarup Raiturkar
Copyright © 2018 Packt Publishing

Она прекрасна. Удивительное сочетание полноты информации и её краткости. Это скорее конспект, а не книга. Курс молодого бойца. Никакой воды - только все самое нужное. Вряд-ли есть другой способ получить такой колоссальный объем знаний из одной книги. Она, поистине, шедевральна в этом смысле.

Дано практически все, что нужно знать разработчику, на примере Golang. Виды согласованностей, в т.ч. Causal Consistency, Векторные Часы, CAP-теорема, способы достижения консенсуса, в т.ч. RAFT, Paxos, 2PC, основы ООП, композиция vs наследование (кстати, на примере зверушек - известный пример), Design Patterns, основы работы с БД, индексы, формы нормализации, виды транзакций (ACID, BACE), матрица уровней изоляции транзакций, брокеры сообщений, принципы масштабирования и многое другое.

Понятно, что все это впихнуть в одну книгу невозможно, поэтому она выполнена в виде конспекта, т.е. она дает обзор и приводит примеры.

Раз уж речь зашла про Packt Publishing, то еще было бы уместно упомянуть "Learning Functional Programming in Go. Change the way you approach your applications using functional programming in Go." by Lex Sheehan
Copyright © 2017 Packt Publishing

И "Hands-On High Performance with Go. Boost and optimize the performance of your Golang applications at scale with resilience" by Bob Strecansky
Copyright © 2020 Packt Publishing

#Golang #SoftwareDesign #SoftwareArchitecture #FunctionalProgramming
Rob Pike, оказывается, кроме Golang, любит покодить интерпретатор функционального языка программирования... на Golang... Так что, теперь уже никто не скажет, что FP и Golang несовместимы 🙂))

📝 "This program was a joy to put together. Its purpose was fun and education, and in no way to create a modern or even realistic Lisp implementation."
- https://github.com/robpike/lisp

#FunctionalProgramming #Golang
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Современное определение OOP: 📝 "Объектно-ориентированное программирование — это метод программирования, основанный на представлении программы в виде совокупности взаимодействующих объектов, каждый из которых является экземпляром определенного класса, а классы…
Ранее в этом треде приводилось выссказывание Niklaus Wirt об обстоятельствах, при которых внедрялось OOP. Он писал о модных поветриях и причинах коммерческого порядка.

О коммерческих причинах пишет и основатель языка программирования Erlang - Joe Armstrong:

📝 "At this point I am reminded of the keynote speech of the then boss of IBM in France who addressed the audience at the 7th IEEE Logic programming conference in Paris. IBM Prolog had added a lot of OO extensions. When asked why he replied:

Our customers wanted OO Prolog so we made OO Prolog

I remember thinking “How simple, no qualms of conscience, no soul-searching, no asking ‘Is this the right thing to do’ …”"
- "Why OO Sucks" by Joe Armstrong
https://www.cs.otago.ac.nz/staffpriv/ok/Joe-Hates-OO.htm

#OOP #FunctionalProgramming #SoftwareDesign
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Ранее в этом треде приводилось выссказывание Niklaus Wirt об обстоятельствах, при которых внедрялось OOP. Он писал о модных поветриях и причинах коммерческого порядка. О коммерческих причинах пишет и основатель языка программирования Erlang - Joe Armstrong:…
Это наверное, лучшее объяснение, которое я встречал, о том, чем отличается FP от OOP, и что у них общего:

📝 "OO makes code understandable by encapsulating moving parts. FP makes code understandable by minimizing moving parts."
- Michael Feathers
https://twitter.com/mfeathers/status/29581296216

Это высказывание так же поясняет, почему Functional Programming не равно Anemic Domain Model. Все дело в том, что в Functional Programming обеспечивается ссылочная прозрачность, т.е. накладывается ограничение на изменяемость данных. А между тем, основной недостаток утраты инкапсуляции в Anaemic Domain Model заключается именно в утрате контроля за изменением состояния и обеспечением инвариантов.

#OOP #FunctionalProgramming #SoftwareDesign
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Ответ Jimmy Bogard по поводу того, может ли CQRS-Команда возвращать результат: 📝 "It might seem rather strange that commands always have a result, but it’s much, much easier to deal with side effects of commands through return parameters than through some…
Скомпилировал все сообщения на тему "Может ли CQRS-команда возвращать результат" в отдельную статью: https://emacsway.github.io/ru/cqrs-command-and-result/

Статья получилась достаточно тяжелой, и для подавляющего большинства специалистов такая детализация рассмотрения этого вопроса вряд ли требуется (всегда можно сослаться, например, на мнение Jimmy Bogard, чтобы аргументировать свою позицию в процессе работы).

Но если кто-то хочет получить глубокое понимание этого вопроса, то статья будет полезной.

#DDD #Microservices #SoftwareDesign #SoftwareArchitecture #FunctionalProgramming #OOP #CQRS #CQS
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Еще одно исследование на тему может ли CQRS-команда возвращать результат: - "Can command return a value?" by Oskar Dudycz https://event-driven.io/en/can_command_return_a_value/ - "CQRS facts and myths explained" by Oskar Dudycz https://event-driven.io/e…
Еще несколько исследований на тему может ли CQRS-команда возвращать результат:

"CQRS. Факты и заблуждения" / Максим Аршинов
- https://habr.com/ru/post/347908/

"CQS versus server generated IDs" by Mark Seemann
- https://blog.ploeh.dk/2014/08/11/cqs-versus-server-generated-ids/

"Returning data from command handlers" by Steven van Deursen
- https://blogs.cuttingedge.it/steven/posts/2012/returning-data-from-command-handlers/

Предыдущее обсуждение:
- https://t.me/emacsway_log/522

#DDD #Microservices #SoftwareDesign #SoftwareArchitecture #FunctionalProgramming #OOP #CQRS #CQS