From 923a64d297bc0675dd67687c18385e3d429670db Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Sat, 21 Oct 2023 12:44:19 +0300 Subject: [PATCH 1/8] Gregor Hohpe about Agile --- emacsway/it/sdlc/models/agile/agile.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/emacsway/it/sdlc/models/agile/agile.rst b/emacsway/it/sdlc/models/agile/agile.rst index 0f204679..a54c7d10 100644 --- a/emacsway/it/sdlc/models/agile/agile.rst +++ b/emacsway/it/sdlc/models/agile/agile.rst @@ -468,6 +468,13 @@ Impossible. Точка. -- "Software Architecture in Practice" 3d edition by Len Bass, Paul Clements, Rick Kazman +.. + + 💬 So, agile and architecture are addressing the same problem from different angles: architecture gives you the options to sustain velocity when the unexpected happens. + And agile gives you the attitude to always be learning and to quickly adapt to changing circumstances. + + -- "`Agile and Architecture: Friend, not Foe: Agile methods and architecture both thrive in times of uncertainty. `__" by Gregor Hohpe + .. 💬 "After all software is supposed to be soft." From 1e2456cb926cdc146273607c17302821af25804f Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Mon, 4 Dec 2023 00:51:44 +0300 Subject: [PATCH 2/8] =?UTF-8?q?Johnson=E2=80=99s=20secondary=20definition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../balancing-prediction-adaptation.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/emacsway/it/sdlc/uncertainty-management/balancing-prediction-adaptation.rst b/emacsway/it/sdlc/uncertainty-management/balancing-prediction-adaptation.rst index 5c1f58b4..e62247d4 100644 --- a/emacsway/it/sdlc/uncertainty-management/balancing-prediction-adaptation.rst +++ b/emacsway/it/sdlc/uncertainty-management/balancing-prediction-adaptation.rst @@ -177,6 +177,14 @@ Simon Brown тоже обратил внимание на тот факт, чт 💬 "Architecture is the decisions that you wish you could get right early in a project, but that you are not necessarily more likely to get them right than any other." -- Ralph Johnson +.. + + Remember Johnson’s secondary definition: “Architecture is the decisions that you wish you could get right early in a project.” + Why do people feel the need to get some things right early in the project? + The answer, of course, is because they perceive those things as hard to change. + + -- "`Who Needs Architect `__" by Martin Fowler + на 💬 "A good architect pretends that the decision has not been made, and shapes the system such that those decisions can still be deferred or changed for as long as possible. From a72dc041de73077581653b4cfb445b5933908922 Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Sat, 16 Dec 2023 19:16:13 +0300 Subject: [PATCH 3/8] Add info about Shotgun Surgery --- emacsway/it/ddd/grade/domain/shotgun-surgery.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/emacsway/it/ddd/grade/domain/shotgun-surgery.rst b/emacsway/it/ddd/grade/domain/shotgun-surgery.rst index cd6700c7..4abfbcd8 100644 --- a/emacsway/it/ddd/grade/domain/shotgun-surgery.rst +++ b/emacsway/it/ddd/grade/domain/shotgun-surgery.rst @@ -9,6 +9,10 @@ Shotgun Surgery =============== Может показаться, что используя Raw-SQL мы обретаем классифицированный Code Smell, известный как Shotgun Surgery (Разлет Дроби), ибо добавление одного поля в Сущность требует правки многих файлов. + +Это не так страшно, т.к. :ref:`ввод символов с клавиатуры не оказывает существенного влияния на темпы разработки `, покольку занимает не более 10% от времени конструирования кода. +При этом вероятность возникновения ошибки тоже минимальна, т.к. легко отлавливается статическим анализатором кода. + Есть два способа решить эту проблему (и снизить Coupling), о которых писал Martin Fowler в главе "Metadata Mapping" книги "Patterns of Enterprise Application Architecture": "reflective program" и "code generation", причем, сам он лично предпочитает второй вариант: Generated code is more explicit so you can see what's going on in the debugger; From dcdcb9a743a6d841abe36249550c8f3976c05a47 Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Sat, 16 Dec 2023 19:18:32 +0300 Subject: [PATCH 4/8] Fix typo --- emacsway/it/ddd/grade/domain/shotgun-surgery.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emacsway/it/ddd/grade/domain/shotgun-surgery.rst b/emacsway/it/ddd/grade/domain/shotgun-surgery.rst index 4abfbcd8..78b56088 100644 --- a/emacsway/it/ddd/grade/domain/shotgun-surgery.rst +++ b/emacsway/it/ddd/grade/domain/shotgun-surgery.rst @@ -10,7 +10,7 @@ Shotgun Surgery Может показаться, что используя Raw-SQL мы обретаем классифицированный Code Smell, известный как Shotgun Surgery (Разлет Дроби), ибо добавление одного поля в Сущность требует правки многих файлов. -Это не так страшно, т.к. :ref:`ввод символов с клавиатуры не оказывает существенного влияния на темпы разработки `, покольку занимает не более 10% от времени конструирования кода. +Это не так страшно, т.к. :ref:`ввод символов с клавиатуры не оказывает существенного влияния на темпы разработки `, поскольку занимает не более 10% от времени конструирования кода. При этом вероятность возникновения ошибки тоже минимальна, т.к. легко отлавливается статическим анализатором кода. Есть два способа решить эту проблему (и снизить Coupling), о которых писал Martin Fowler в главе "Metadata Mapping" книги "Patterns of Enterprise Application Architecture": "reflective program" и "code generation", причем, сам он лично предпочитает второй вариант: From 51da8b15d90e5c8eeb69e823ddbd832ea3e97acf Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Thu, 21 Dec 2023 20:30:30 +0300 Subject: [PATCH 5/8] ddd/tactical-design/repository/causal-consistency --- .../it/ddd/tactical-design/repository/causal-consistency.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst b/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst index 9c0d3ec9..e498dbe7 100644 --- a/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst +++ b/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst @@ -52,6 +52,8 @@ Repository and Causal Consistency И здесь обнажается проблема, т.к. при инкрементировании версии агрегата единожды на транзакцию, возникает риск образования более одного публичного Доменного События с одной и той же версией Агрегата. А это означает, что версию Агрегата не получится использовать для восстановления очередности Событий. +Есть еще одна проблема. Если за один инкремент версии агрегат издал несколько событий, то при обновлении ReadModel по событиям её версия разъедется с версией агрегата, и будет утрачена возможность отслеживать, например, с frontend, докатились ли изменения до ReadModel. + Варианты решений ================ From b0a126a0958f2c3d55da5909f664c980d9e54704 Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Thu, 21 Dec 2023 20:48:56 +0300 Subject: [PATCH 6/8] ddd/tactical-design/repository/causal-consistency --- .../it/ddd/tactical-design/repository/causal-consistency.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst b/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst index e498dbe7..4dd9c048 100644 --- a/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst +++ b/emacsway/it/ddd/tactical-design/repository/causal-consistency.rst @@ -52,7 +52,9 @@ Repository and Causal Consistency И здесь обнажается проблема, т.к. при инкрементировании версии агрегата единожды на транзакцию, возникает риск образования более одного публичного Доменного События с одной и той же версией Агрегата. А это означает, что версию Агрегата не получится использовать для восстановления очередности Событий. -Есть еще одна проблема. Если за один инкремент версии агрегат издал несколько событий, то при обновлении ReadModel по событиям её версия разъедется с версией агрегата, и будет утрачена возможность отслеживать, например, с frontend, докатились ли изменения до ReadModel. +Есть еще одна проблема. +Если за один инкремент версии агрегат издал несколько событий, то при обновлении ReadModel по событиям её версия разъедется с версией агрегата, и будет утрачена возможность отслеживать, например, с frontend, докатились ли изменения до ReadModel. +Но это так же означает, что доменное событие должно производиться на абсолютно каждое изменение состояния агрегата. Варианты решений From 2f126a142ee900bd76412b39d6a00a90807a394a Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Mon, 25 Dec 2023 20:24:22 +0300 Subject: [PATCH 7/8] aggregate-encapsulation --- .../it/ddd/grade/domain/aggregate-encapsulation.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/emacsway/it/ddd/grade/domain/aggregate-encapsulation.rst b/emacsway/it/ddd/grade/domain/aggregate-encapsulation.rst index d542f29b..c432c0a2 100644 --- a/emacsway/it/ddd/grade/domain/aggregate-encapsulation.rst +++ b/emacsway/it/ddd/grade/domain/aggregate-encapsulation.rst @@ -419,3 +419,15 @@ Exporter Это еще один аргумент в пользу первого варианта с отдельными сеттерами для каждого атрибута Агрегата. Попробовав оба варианта, я остановился, все-таки, на первом, каноническом, даже несмотря на его многословность. + + +Импорт состояния +================ + +В Golang область видимости структуры доступна всему пакету, поэтому нет большой необходимости реализовывать Importer/Provider - достаточно положить Reconstitutor в тот же пакет. + +В других языках может потребоваться делать Importer/Provider, что образует брешь в инкапсуляции. +Поэтому импорт состояния делают либо посредством конструктора, если поддерживается множественная диспетчеризация (overloading), либо посредством статического метода класса - чтобы можно было создать, но невозможно было изменить. +Правда, при этом возникает сложность с синхронизацией состояния объектов в IdentityMap при фиксации изменений (commit), ведь состояние агрегата теперь недоступно для синхронизации. +В таком случае остается только очистить IdentityMap при фиксации изменений. + From ac86d22d7d6b21843a575dffba9eccc666394fe9 Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Wed, 3 Jan 2024 03:46:16 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=94=D0=B5=D0=BC=D0=B0=D0=B3=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=B5=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- emacsway/soft-skills/cognitive-biases.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/emacsway/soft-skills/cognitive-biases.rst b/emacsway/soft-skills/cognitive-biases.rst index ccc5e549..b5db8b6d 100644 --- a/emacsway/soft-skills/cognitive-biases.rst +++ b/emacsway/soft-skills/cognitive-biases.rst @@ -70,6 +70,7 @@ - "`Логическая ошибка `__" - "`Список когнитивных искажений `__" +- "`Демагогические приемы `__" - "`Decision-making `__" - "`5 cognitive bias examples and how to avoid them in decision-making `__" by Ben Crothers