emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Два новых перевода от хабраюзера ArkadiyXIII на статьи Vladik Khononov (@vladik_kh): "Преодоление сложности в CQRS" - https://habr.com/ru/post/588803/ "Распутывание микросервисов или балансировка сложности в распределенных системах" - https://habr.com/ru/post/590165/…
Новый перевод от ArkadiyXIII:
- "Mapper Contexts и Supercontexts: Разделение domain-specific и domain-generic ограниченных контекстов"
#DDD #SoftwareArchitecture #SoftwareDesign #Microservices
- "Mapper Contexts и Supercontexts: Разделение domain-specific и domain-generic ограниченных контекстов"
#DDD #SoftwareArchitecture #SoftwareDesign #Microservices
Хабр
Mapper Contexts и Supercontexts: Разделение domain-specific и domain-generic ограниченных контекстов
Эта статья является переводом материала «Mapper Contexts & Supercontexts: Decoupling Domain-Specific and Domain-Generic Bounded Contexts». Далее не будут переводится следующие фразы: Notifications...
🔥6👍3👎2
"Software Design: Tidy First?" - новая книга, над которой работает Kent Beck. Читать главы можно уже сейчас:
- https://tidyfirst.substack.com/archive?sort=new
#SoftwareDesign
- https://tidyfirst.substack.com/archive?sort=new
#SoftwareDesign
Substack
Archive - Software Design: Tidy First?
Full archive of all the posts from Software Design: Tidy First?.
👍7🔥2👎1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Володя осветил один из частых вопросов: "Collections and Primitive Obsession" by Vladimir Khorikov - https://enterprisecraftsmanship.com/posts/collections-primitive-obsession/ #DDD #SoftwareDesign
"Modeling Relationships in a DDD Way" by Vladimir Khorikov
- https://enterprisecraftsmanship.com/posts/modeling-relationships-in-ddd-way/?__s=dqpdv6io8bhfhi1pm82y
Хорошая статья, но самый интересный вопрос остался неосвещенным:
> The problem is that it’s hard to decide which side of a many-to-many relation is the owner of that relation.
#DDD #SoftwareDesign
- https://enterprisecraftsmanship.com/posts/modeling-relationships-in-ddd-way/?__s=dqpdv6io8bhfhi1pm82y
Хорошая статья, но самый интересный вопрос остался неосвещенным:
> The problem is that it’s hard to decide which side of a many-to-many relation is the owner of that relation.
#DDD #SoftwareDesign
Enterprise Craftsmanship
Modeling Relationships in a DDD Way
Let’s talk about modeling of relationships, including the dreaded many-to-many relationships, in a DDD way.
👍4🤔1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
📝 "A Bounded Context is not a purely logical (language consistency, unity of purpose) or physical (code separation, deployment unit) concept. It's an obligation to maintain integrity between those views." -- Alberto Brandolini https://twitter.com/ziobran…
Возвращаясь к определению Bounded Context от Alberto Brandolini:
"A Bounded Context is not a purely logical (language consistency, unity of purpose) or physical (code separation, deployment unit) concept. It's an obligation to maintain integrity between those views."
, невольно начинаю думать, что перевод "Ограниченный" полисемантического слова "Bounded" , возможно, был выбран не совсем удачно. Есть предположение, что термин "Связанный" контекст лучше передает смысл.
На такую же мысль меня наводят и фразы:
"Bounded context means different models of the same thing (e.g., books, customers, etc.) and is represented by models and software that implement those models."
Иными словами, Bounded Context образует связанность между программируемой моделью и её сущностью реального мира.
Следующие две фразы трактуют термин "bounded" именно как "связанный":
"How to minimize inter-bounded context dependencies?"
"The components of complex systems are bounded sub-systems or agents that adapt or learn when they interact."
А следующая фраза говорит о том, чем именно "связаны" (т. е. скованы) команды. Кстати, слово "скованный" - один из вариантов перевода термина "bounded".
"The scope of each team was bounded by their business line and their products."
Следующие две фразы говорят о том, каким именно образом происходит "сковывание":
"Bounded contexts aligned with data source domains, such as fixed-income trading or consumer lending"
"Bounded contexts aligned with consumption domains, such as accounting or liquidity"
Эта идея немного рушится фразой:
"A bounded context is the boundary for the meaning of a model."
Но тут можно вспомнить, что термин "boundary" полисемантический, и означает также "межу" или "грань". Обратите внимание на фразу "boundary for the meaning". Не "boundary of subsystem", а "boundary for the meaning", что привязывает реализацию (solution space) к её "предметному смыслу" (meaning of a model). Т.е. главное не ограничить абы как подсистему, а привязать её к доменному толкованию. Именно это Alberto Brandolini и назвал "obligation to maintain integrity".
"bounded contexts delimit the applicability of domain models. As such, the bounded context is within the solution space."
Все цитаты из AO-S.
Что думаете? Какие мысли по этому поводу?
"A Bounded Context is not a purely logical (language consistency, unity of purpose) or physical (code separation, deployment unit) concept. It's an obligation to maintain integrity between those views."
, невольно начинаю думать, что перевод "Ограниченный" полисемантического слова "Bounded" , возможно, был выбран не совсем удачно. Есть предположение, что термин "Связанный" контекст лучше передает смысл.
На такую же мысль меня наводят и фразы:
"Bounded context means different models of the same thing (e.g., books, customers, etc.) and is represented by models and software that implement those models."
Иными словами, Bounded Context образует связанность между программируемой моделью и её сущностью реального мира.
Следующие две фразы трактуют термин "bounded" именно как "связанный":
"How to minimize inter-bounded context dependencies?"
"The components of complex systems are bounded sub-systems or agents that adapt or learn when they interact."
А следующая фраза говорит о том, чем именно "связаны" (т. е. скованы) команды. Кстати, слово "скованный" - один из вариантов перевода термина "bounded".
"The scope of each team was bounded by their business line and their products."
Следующие две фразы говорят о том, каким именно образом происходит "сковывание":
"Bounded contexts aligned with data source domains, such as fixed-income trading or consumer lending"
"Bounded contexts aligned with consumption domains, such as accounting or liquidity"
Эта идея немного рушится фразой:
"A bounded context is the boundary for the meaning of a model."
Но тут можно вспомнить, что термин "boundary" полисемантический, и означает также "межу" или "грань". Обратите внимание на фразу "boundary for the meaning". Не "boundary of subsystem", а "boundary for the meaning", что привязывает реализацию (solution space) к её "предметному смыслу" (meaning of a model). Т.е. главное не ограничить абы как подсистему, а привязать её к доменному толкованию. Именно это Alberto Brandolini и назвал "obligation to maintain integrity".
"bounded contexts delimit the applicability of domain models. As such, the bounded context is within the solution space."
Все цитаты из AO-S.
Что думаете? Какие мысли по этому поводу?
Telegram
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
📝 "A Bounded Context is not a purely logical (language consistency, unity of purpose) or physical (code separation, deployment unit) concept. It's an obligation to maintain integrity between those views."
-- Alberto Brandolini https://twitter.com/ziobra…
-- Alberto Brandolini https://twitter.com/ziobra…
👍9
Forwarded from Russian Association of Software Architects (Ivan)
На Snowbird meeting обсуждались принципы "Bill of Rights", один из которых гласит:
📝 "You [programmer] have the right to produce quality work at all times."
Причем:
📝 "During the Snowbird meeting, Kent Beck said that the goal of Agile was to heal the divide between business and development."
-- "Clean Agile: Back to Basics" by Robert C. Martin - организатор той встречи.
Недавно состоялся опрос, по результатам которого выяснилось, что 20% участников опроса демотивированы загниванием кода по причине отсутствия понимания со стороны Product Owner (Project Manager). Эту проблему хорошо освещали многие известные авторы: Kent Beck, Robert Martin, Jeff Sutherland, Martin Fowler, Craig Larman, Henrik Kniberg, Dean Leffingwell, Kenneth Rubin, Ward Cunningham и другие.
Как могло получиться, что, используя Agile, разработчики, вместо "produce quality work at all times", вынуждены копаться в коде, который по своей консистенции не сильно отличается от свалки? Терпения на такие "условия работы" хватает не у всех, что является одной из распространенных причин текучки кадров.
На эту тему было много написано, да мало делается. Недостаточная информированность технических специалистов делает из них легкую добычу психологических манипуляций, вынужденную принимать всю вину на свой счет, и непонимающую, как выйти из замкнутого круга. Отличительным симптомом такой ситуации являются постоянно "горящие" и вечно "сорванные" сроки, отсутствие взаимовыручки и перекладывание вины.
Это только одна из многих проблем, которые мы наблюдаем в отрасли, и для решения которых мы и решили объединить усилия в этом канале.
Знакома ли вам эта проблема? Удалось ли её решить? Каким образом?
#SoftwareDesign #SDLC
📝 "You [programmer] have the right to produce quality work at all times."
Причем:
📝 "During the Snowbird meeting, Kent Beck said that the goal of Agile was to heal the divide between business and development."
-- "Clean Agile: Back to Basics" by Robert C. Martin - организатор той встречи.
Недавно состоялся опрос, по результатам которого выяснилось, что 20% участников опроса демотивированы загниванием кода по причине отсутствия понимания со стороны Product Owner (Project Manager). Эту проблему хорошо освещали многие известные авторы: Kent Beck, Robert Martin, Jeff Sutherland, Martin Fowler, Craig Larman, Henrik Kniberg, Dean Leffingwell, Kenneth Rubin, Ward Cunningham и другие.
Как могло получиться, что, используя Agile, разработчики, вместо "produce quality work at all times", вынуждены копаться в коде, который по своей консистенции не сильно отличается от свалки? Терпения на такие "условия работы" хватает не у всех, что является одной из распространенных причин текучки кадров.
На эту тему было много написано, да мало делается. Недостаточная информированность технических специалистов делает из них легкую добычу психологических манипуляций, вынужденную принимать всю вину на свой счет, и непонимающую, как выйти из замкнутого круга. Отличительным симптомом такой ситуации являются постоянно "горящие" и вечно "сорванные" сроки, отсутствие взаимовыручки и перекладывание вины.
Это только одна из многих проблем, которые мы наблюдаем в отрасли, и для решения которых мы и решили объединить усилия в этом канале.
Знакома ли вам эта проблема? Удалось ли её решить? Каким образом?
#SoftwareDesign #SDLC
martinfowler.com
Writing The Agile Manifesto
A long-form article entitled: "Writing The Agile Manifesto"
🔥7👍4
Старина Kent Beck написал очередную бомбовую статью про качественный код:
"Tune Software Development for Rate of Change, not Rate of Progress"
https://medium.com/@kentbeck_7670/tune-software-development-for-rate-of-change-not-rate-of-progress-56f93c15a769
Очередной бесценный аргумент для тех, кто вынужден спегетти-кодить не по своему желанию.
#SoftwareDesign
"Tune Software Development for Rate of Change, not Rate of Progress"
https://medium.com/@kentbeck_7670/tune-software-development-for-rate-of-change-not-rate-of-progress-56f93c15a769
Очередной бесценный аргумент для тех, кто вынужден спегетти-кодить не по своему желанию.
#SoftwareDesign
Medium
Tune Software Development for Rate of Change, not Rate of Progress
Folks seem to tune software development for a desired output rate. That’s a disaster. Here’s why, what to do instead, and (at the end) a…
🔥8
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Существуют некоторые вещи, которые являются ключевыми. Профессиональная задача архитектора - эти вещи выявлять. 📝 “Architecture is about the important stuff. Whatever that is” - Ralph Johnson [Здесь шла речь о принципе, который со времен Гераклита используется…
Самое долгожданное событие в архитектурном мире наступило - материалы монументального многолетнего труда в области управления сложностью, одного из лучших авторов современности Vladik Khononov ( @vladik_kh ) начали выходить в публичность:
- https://youtu.be/d6BeLhm3a0s
Предыдущая его книга стала самой понятной и популярной в области DDD. До появления его книги разобраться с трудами Эванса и Вернона можно было только ценой титанических усилий, что сдерживало распространение DDD.
Новая его книга консолидирует труды Larry Constantine, Tom DeMarco, Meilir Page-Jones, David L. Parnas, Robert C. Martin, и вооружает нас принципом, способным легко отыскивать победные решения в задачах любого уровня сложности.
[UPDATE]: Ждем вторую часть этого keynote с ddd europe - "fractal geometry of software design". Через пару месяцев должны опубликовать.
#SoftwareDesign #MSA #DDD #SoftwareArchitecture
- https://youtu.be/d6BeLhm3a0s
Предыдущая его книга стала самой понятной и популярной в области DDD. До появления его книги разобраться с трудами Эванса и Вернона можно было только ценой титанических усилий, что сдерживало распространение DDD.
Новая его книга консолидирует труды Larry Constantine, Tom DeMarco, Meilir Page-Jones, David L. Parnas, Robert C. Martin, и вооружает нас принципом, способным легко отыскивать победные решения в задачах любого уровня сложности.
[UPDATE]: Ждем вторую часть этого keynote с ddd europe - "fractal geometry of software design". Через пару месяцев должны опубликовать.
#SoftwareDesign #MSA #DDD #SoftwareArchitecture
YouTube
Balancing Coupling in Software Design - Vladik Khononov, DOIT International | Craft Conference 2022
This talk was recorded at Craft Conference 2022. Vladik Khononov from DOIT International spoke about Architecture, Coupling, Design, Microservices and DDD. We are used to treating coupling as the necessary evil. Hence, we aim to break systems apart into the…
🔥21👍9
Forwarded from Russian Association of Software Architects (Eugene Lukianov)
С чего начинается качественный код? Как говорил профессор Преображенский, разруха начинается с головы. И он был прав. Вернее, с «Закона Миллера»:
💬 «Магическое число семь плюс-минус два» («кошелёк Миллера», «закон Миллера») — закономерность, обнаруженная американским учёным-психологом Джорджем Миллером, согласно которой кратковременная человеческая память, как правило, не может запомнить и повторить более 7 ± 2 элементов.
Конечно, всегда найдутся желающие поспорить с Миллером, но только не Dijkstra:
💬 "The competent programmer is fully aware of the strictly limited size of his own skull; therefore, he approaches the programming task in full humility"
("хороший специалист всегда осознает строго ограниченные размеры своего черепа, поэтому подходит к задачам с максимальной скромностью.")
—Edsger W. Dijkstra, 1972
И авторы KISS Principle с ним охотно согласились бы:
💬 "Be Humble, don't think of yourself as a super genius, this is your first mistake. By being humble, you will eventually achieve super genius status =), and even if you don't, who cares! your code is stupid simple, so you don't have to be a genius to work with it."
("Будьте скромны, не считайте себя супергением — это ваша первая ошибка. Оставаясь скромным, вы в конечном итоге достигнете уровня супергения, и даже если нет, какая разница. Ваш код должен быть прост настолько, что вам не нужно быть гением, чтобы работать с ним.")
—"KISS principle"
В принципе, «Закона Миллера» предопределяет потребность не только в качественном коде, но и в ставшей популярной в наши дни Team First Architecture.
#SoftwareDesign
💬 «Магическое число семь плюс-минус два» («кошелёк Миллера», «закон Миллера») — закономерность, обнаруженная американским учёным-психологом Джорджем Миллером, согласно которой кратковременная человеческая память, как правило, не может запомнить и повторить более 7 ± 2 элементов.
Конечно, всегда найдутся желающие поспорить с Миллером, но только не Dijkstra:
💬 "The competent programmer is fully aware of the strictly limited size of his own skull; therefore, he approaches the programming task in full humility"
("хороший специалист всегда осознает строго ограниченные размеры своего черепа, поэтому подходит к задачам с максимальной скромностью.")
—Edsger W. Dijkstra, 1972
И авторы KISS Principle с ним охотно согласились бы:
💬 "Be Humble, don't think of yourself as a super genius, this is your first mistake. By being humble, you will eventually achieve super genius status =), and even if you don't, who cares! your code is stupid simple, so you don't have to be a genius to work with it."
("Будьте скромны, не считайте себя супергением — это ваша первая ошибка. Оставаясь скромным, вы в конечном итоге достигнете уровня супергения, и даже если нет, какая разница. Ваш код должен быть прост настолько, что вам не нужно быть гением, чтобы работать с ним.")
—"KISS principle"
В принципе, «Закона Миллера» предопределяет потребность не только в качественном коде, но и в ставшей популярной в наши дни Team First Architecture.
#SoftwareDesign
Wikipedia
Магическое число семь плюс-минус два
правило и психологическая статья 1956 года
❤1
Forwarded from Russian Association of Software Architects (Eugene Lukianov)
Проще всего пояснить "Закон магического числа 7 ± 2" этой картинкой☝️(кликните для увеличения). Как говорится, лучше один раз увидеть. Такой же процесс происходит, когда уровень сложности рассматриваемого фрагмента кода превышает возможности краткосрочной памяти человека.
Просто ваши глаза не могут увидеть все 12 точек одновременно. Ninio's extinction illusion. Twelve black dots cannot be seen at once. Ninio, J. and Stevens, K. A. (2000) Variations on the Hermann grid: an extinction illusion. Perception, 29, 1209-1217.
#SoftwareDesign
Просто ваши глаза не могут увидеть все 12 точек одновременно. Ninio's extinction illusion. Twelve black dots cannot be seen at once. Ninio, J. and Stevens, K. A. (2000) Variations on the Hermann grid: an extinction illusion. Perception, 29, 1209-1217.
#SoftwareDesign
🔥10👍5
Forwarded from Russian Association of Software Architects (Eugene Lukianov)
Какую же задачу решает качественный код?
💬 "Nothing kills speed more effectively than poor internal quality."
—"Planning Extreme Programming" by Kent Beck, Martin Fowler
💬 "... the activity of design is not an option. It must be given serious thought for software development to be effective."
—"Extreme Programming Explained" by Kent Beck
💬 "The only way to make the deadline — the only way to go fast — is to keep the code as clean as possible at all times."
—"Clean Code: A Handbook of Agile Software Craftsmanship" by Robert C. Martin
💬 "In most contexts higher quality ⇒ expensive. But high internal quality of software allows us to develop features faster and cheaper."
—"Tradable Quality Hypothesis" by Martin Fowler
💬 "The value of good software design is economic: you can continue to add new functionality quickly even as the code-base grows in size."
—"Design Stamina Hypothesis" by Martin Fowler
💬 "The fundamental role of internal quality is that it lowers the cost of future change. But there is some extra effort required to write good software, which does impose some cost in the short term."
—"Is High Quality Software Worth the Cost?" by Martin Fowler
💬 "The whole point of good design and clean code is to make you go faster - if it didn't people like Uncle Bob, Kent Beck, and Ward Cunningham wouldn't be spending time talking about it."
—"Technical Debt Quadrant" by Martin Fowler
💬 "If you're a manager or customer how can you tell if the software is well designed? It matters to you because poorly designed software will be more expensive to modify in the future."
—"Is Design Dead?" by Martin Fowler
Сама по себе скорость разработки - это еще не цель. Это только задача в достижении цели.
Да, темпы разработки имеют имеют очевидные цели, такие как:
- экономический эффект за счет удешевления разработки,
- уменьшение ущерба упущенной выгоды от задержки выхода на рынок (time-to-market) новых бизнес-фич,
- повышение конкурентоспособности за счет ускорения адаптируемости к скороточно меняющимся условиям рынка...
Но есть еще одна цель, часто упускаемая из виду, та самая, которая имеет фундаментальное значение для анализа и архитектуры. И непонимание этой цели часто приводит к тому, что либо качество кода жертвуется в угоду краткосрочным бизнес-интересам, либо наоборот, качество делается ради качества где надо и не надо, выстраивая тем самым против себя глухую стену непонимания и обороны со стороны представителей бизнеса. Но об этом уже в другой раз.
#SoftwareDesign
💬 "Nothing kills speed more effectively than poor internal quality."
—"Planning Extreme Programming" by Kent Beck, Martin Fowler
💬 "... the activity of design is not an option. It must be given serious thought for software development to be effective."
—"Extreme Programming Explained" by Kent Beck
💬 "The only way to make the deadline — the only way to go fast — is to keep the code as clean as possible at all times."
—"Clean Code: A Handbook of Agile Software Craftsmanship" by Robert C. Martin
💬 "In most contexts higher quality ⇒ expensive. But high internal quality of software allows us to develop features faster and cheaper."
—"Tradable Quality Hypothesis" by Martin Fowler
💬 "The value of good software design is economic: you can continue to add new functionality quickly even as the code-base grows in size."
—"Design Stamina Hypothesis" by Martin Fowler
💬 "The fundamental role of internal quality is that it lowers the cost of future change. But there is some extra effort required to write good software, which does impose some cost in the short term."
—"Is High Quality Software Worth the Cost?" by Martin Fowler
💬 "The whole point of good design and clean code is to make you go faster - if it didn't people like Uncle Bob, Kent Beck, and Ward Cunningham wouldn't be spending time talking about it."
—"Technical Debt Quadrant" by Martin Fowler
💬 "If you're a manager or customer how can you tell if the software is well designed? It matters to you because poorly designed software will be more expensive to modify in the future."
—"Is Design Dead?" by Martin Fowler
Сама по себе скорость разработки - это еще не цель. Это только задача в достижении цели.
Да, темпы разработки имеют имеют очевидные цели, такие как:
- экономический эффект за счет удешевления разработки,
- уменьшение ущерба упущенной выгоды от задержки выхода на рынок (time-to-market) новых бизнес-фич,
- повышение конкурентоспособности за счет ускорения адаптируемости к скороточно меняющимся условиям рынка...
Но есть еще одна цель, часто упускаемая из виду, та самая, которая имеет фундаментальное значение для анализа и архитектуры. И непонимание этой цели часто приводит к тому, что либо качество кода жертвуется в угоду краткосрочным бизнес-интересам, либо наоборот, качество делается ради качества где надо и не надо, выстраивая тем самым против себя глухую стену непонимания и обороны со стороны представителей бизнеса. Но об этом уже в другой раз.
#SoftwareDesign
martinfowler.com
bliki: Tradable Quality Hypothesis
In most contexts higher quality ⇒ expensive. But high internal quality of software allows us to develop features faster and cheaper.
👍4🔥3
💬 "The Single Responsibility Principle (SRP):
Gather together those things that change for the same reasons and at the same times. Separate those things that change for different reasons or at different times."
-- Robert C. Martin. Самая последняя редакция от 2022-07-06.
P.S.: Если вдруг кто еще считает, что SRP - это делать одну вещь...
#SoftwareDesign
Gather together those things that change for the same reasons and at the same times. Separate those things that change for different reasons or at different times."
-- Robert C. Martin. Самая последняя редакция от 2022-07-06.
P.S.: Если вдруг кто еще считает, что SRP - это делать одну вещь...
#SoftwareDesign
👍7🔥2
Eric Evens в своей синей книге пишет, что, в общем-то не очень хорошо, когда Specification Pattern осведомлен об SQL
💬 "Now this design has some problems. Most important, the details of the table structure have leaked into the DOMAIN LAYER ; they should be isolated in a mapping layer that relates the domain objects to the relational tables. Implicitly duplicating that information here could hurt the modifiability and maintainability of the Invoice and Customer objects, because any change to their mappings now have to be tracked in more than one place. But this example is a simple illustration of how to keep the rule in just one place. Some object-relational mapping frameworks provide the means to express such a query in terms of the model objects and attributes, generating the actual SQL in the infrastructure layer. This would let us have our cake and eat it too."
— "Domain-Driven Design: Tackling Complexity in the Heart of Software" by Eric Evans
В C# для этого есть мощный механизм Expression Tree, что значительно упрощает дело. Примеры хорошо демонстрирует Vladimir Khorikov:
- https://enterprisecraftsmanship.com/posts/specification-pattern-c-implementation/
- https://enterprisecraftsmanship.com/posts/specification-pattern-always-valid-domain-model/
- https://github.com/vkhorikov/SpecificationPattern
- https://github.com/vkhorikov/SpecPattern
В Golang дело немного усложняется отсутствием нативной поддержки Expression Tree, и поддержку этих функций приходится брать на себя.
В общем, как получилась первая итерация (пока еще не финал), можно посмотреть здесь:
Абстрактная реализация + inMemory evaluator:
- https://github.com/emacsway/grade/blob/main/grade/internal/domain/seedwork/specification/
Конкретная реализация inMemory evaluator без использования рефлекции:
- https://github.com/emacsway/grade/blob/main/grade/internal/domain/endorser/specifications.go
Абстрактная реализация строителя PostgreSQL-запроса с учетом приоритетов операторов для исключения лишних скобочек:
- https://github.com/emacsway/grade/blob/main/grade/internal/infrastructure/specification/
Конкретная реализация строителя PostgreSQL-запроса с гибкой возможностью маппинга атрибутов:
- https://github.com/emacsway/grade/blob/main/grade/internal/infrastructure/repositories/endorser/endorser_specifications.go
Заложена (но до конца не раскрыта) возможность просмотра коллекций сущностей внутри агрегата и поиск удовлетворения условия хотя бы одним из элементов коллекции.
#DDD #SoftwareDesign
💬 "Now this design has some problems. Most important, the details of the table structure have leaked into the DOMAIN LAYER ; they should be isolated in a mapping layer that relates the domain objects to the relational tables. Implicitly duplicating that information here could hurt the modifiability and maintainability of the Invoice and Customer objects, because any change to their mappings now have to be tracked in more than one place. But this example is a simple illustration of how to keep the rule in just one place. Some object-relational mapping frameworks provide the means to express such a query in terms of the model objects and attributes, generating the actual SQL in the infrastructure layer. This would let us have our cake and eat it too."
— "Domain-Driven Design: Tackling Complexity in the Heart of Software" by Eric Evans
В C# для этого есть мощный механизм Expression Tree, что значительно упрощает дело. Примеры хорошо демонстрирует Vladimir Khorikov:
- https://enterprisecraftsmanship.com/posts/specification-pattern-c-implementation/
- https://enterprisecraftsmanship.com/posts/specification-pattern-always-valid-domain-model/
- https://github.com/vkhorikov/SpecificationPattern
- https://github.com/vkhorikov/SpecPattern
В Golang дело немного усложняется отсутствием нативной поддержки Expression Tree, и поддержку этих функций приходится брать на себя.
В общем, как получилась первая итерация (пока еще не финал), можно посмотреть здесь:
Абстрактная реализация + inMemory evaluator:
- https://github.com/emacsway/grade/blob/main/grade/internal/domain/seedwork/specification/
Конкретная реализация inMemory evaluator без использования рефлекции:
- https://github.com/emacsway/grade/blob/main/grade/internal/domain/endorser/specifications.go
Абстрактная реализация строителя PostgreSQL-запроса с учетом приоритетов операторов для исключения лишних скобочек:
- https://github.com/emacsway/grade/blob/main/grade/internal/infrastructure/specification/
Конкретная реализация строителя PostgreSQL-запроса с гибкой возможностью маппинга атрибутов:
- https://github.com/emacsway/grade/blob/main/grade/internal/infrastructure/repositories/endorser/endorser_specifications.go
Заложена (но до конца не раскрыта) возможность просмотра коллекций сущностей внутри агрегата и поиск удовлетворения условия хотя бы одним из элементов коллекции.
#DDD #SoftwareDesign
Docs
Деревья выражений - C#
Узнайте о деревьях выражений. Узнайте, как компилировать и запускать код, представленный этими структурами данных, где каждый узел является выражением.
🔥8👍2
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Eric Evens в своей синей книге пишет, что, в общем-то не очень хорошо, когда Specification Pattern осведомлен об SQL 💬 "Now this design has some problems. Most important, the details of the table structure have leaked into the DOMAIN LAYER ; they should…
Идея экспортера, предложенная by Allen Holub:
- https://www.infoworld.com/article/2072302/more-on-getters-and-setters.html
удачно ложится на полностью искапсулированный объект построения SQL-запроса:
- https://github.com/emacsway/grade/blob/main/grade/internal/infrastructure/repositories/recognizer/insert_query.go
#DDD #OOP #SoftwareDesign
- https://www.infoworld.com/article/2072302/more-on-getters-and-setters.html
удачно ложится на полностью искапсулированный объект построения SQL-запроса:
- https://github.com/emacsway/grade/blob/main/grade/internal/infrastructure/repositories/recognizer/insert_query.go
#DDD #OOP #SoftwareDesign
InfoWorld
More on getters and setters
Allen Holub's past Java Toolbox column, " Why Getter and Setter Methods Are Evil," discussed the downside of the getter/setter idiom. That article presented a design-level solution. (By keeping your design in the problem domain as long as possible and using…
🔥3👍1
💬 "Sometimes, to improve performance, or more likely to tighten security, queries may be implemented on the server as stored procedures. In that case, the SPECIFICATION could carry only the parameters allowed by the stored procedure. For all that, there is no difference in the model between these various implementations. The choice of implementation is free except where specifically constrained by the model. The price comes in a more cumbersome way of writing and maintaining queries.
This discussion barely scratches the surface of the challenges of combining SPECIFICATIONS with databases, and I'll make no attempt to cover all the considerations that may arise. I just want to give a taste of the kind of choices that have to be made."
— "Domain-Driven Design: Tackling Complexity in the Heart of Software" by Eric Evans
Вот так примерно отвечает интеллигентный человек на нечто подобное тому, что в свое время сделала компания LinguaLeo.
#DDD #SoftwareDesign
This discussion barely scratches the surface of the challenges of combining SPECIFICATIONS with databases, and I'll make no attempt to cover all the considerations that may arise. I just want to give a taste of the kind of choices that have to be made."
— "Domain-Driven Design: Tackling Complexity in the Heart of Software" by Eric Evans
Вот так примерно отвечает интеллигентный человек на нечто подобное тому, что в свое время сделала компания LinguaLeo.
#DDD #SoftwareDesign
👍3😁2
Программист тратит на написание кода не более 5% времени.
I Know What You Did Last Summer
An Investigation of How Developers Spend Their Time
Roberto Minelli, Andrea Mocci and Michele Lanza
REVEAL @ Faculty of Informatics — University of Lugano, Switzerland
https://www.inf.usi.ch/faculty/lanza/Downloads/Mine2015b.pdf
#SoftwareDesign
I Know What You Did Last Summer
An Investigation of How Developers Spend Their Time
Roberto Minelli, Andrea Mocci and Michele Lanza
REVEAL @ Faculty of Informatics — University of Lugano, Switzerland
https://www.inf.usi.ch/faculty/lanza/Downloads/Mine2015b.pdf
#SoftwareDesign
👍9🤔4
Коллеги, в архитекторских кругах в свое время активно обсуждалась статья https://ebanoe.it/2016/07/20/shitcoders/ , и я недавно в очередной раз имел возможность убедиться в её достоверности.
Именно по этой причине я всегда избегал заказную разработку (под этим термином я не разделяю outsource и outstaff) и предпочитал работать на продуктах.
Когда я начинал свой путь в ИТ, я избегал работать в legacy-проектах, т.к. они сопровождались низкой скоростью разработки и высоким уровнем морально-психологических издержек. По мере моего архитектурного становления я, наоборот, начал предпочитать такие проекты, т.к. они становились благодатной почвой для проявления моей квалификации. Поэтому, моим негласным профессиональным символом стал белый медведь - он выживает в условиях Заполярья, где выжить могут далеко не все.
Но заказная разработка отличается от обычного legacy-проекта двумя критериями:
1. Подрядчик кровно заинтересован в поддержании низкого качества и в переусложнении, т.е. это позволяет ему продавать больше часов. Еще Edsger W. Dijkstra говорил: "Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.". А это уже проблема не архитектурная, и я не знал, как её решить.
2. Малоразмерные проекты (основная ниша заказной разработки) никогда не обладали карьерной привлекательностью для высококвалифицированных специалистов, поэтому они всегда испытывали квалификационный голод. Эта проблема тоже не архитектурная.
Не зная, как решить проблему, я предпочитал обходить её стороной.
Но случилось так, что в силу жизненных обстоятельств я соприкоснулся с заказной разработкой. Подискутировав с Владиком Хононовым и с девушкой по имени Марина, у меня родилось понимание того, как эту проблему можно решить. И не просто решить её, а превратить решение этой проблемы в коммерческий проект.
Не берусь судить хватит ли у меня средств и упорства осуществить это решение на практике, но эта цель меня заинтересовала и я серьезно задумался о её осуществлении.
#Management #SoftwareDesign #Goal
Именно по этой причине я всегда избегал заказную разработку (под этим термином я не разделяю outsource и outstaff) и предпочитал работать на продуктах.
Когда я начинал свой путь в ИТ, я избегал работать в legacy-проектах, т.к. они сопровождались низкой скоростью разработки и высоким уровнем морально-психологических издержек. По мере моего архитектурного становления я, наоборот, начал предпочитать такие проекты, т.к. они становились благодатной почвой для проявления моей квалификации. Поэтому, моим негласным профессиональным символом стал белый медведь - он выживает в условиях Заполярья, где выжить могут далеко не все.
Но заказная разработка отличается от обычного legacy-проекта двумя критериями:
1. Подрядчик кровно заинтересован в поддержании низкого качества и в переусложнении, т.е. это позволяет ему продавать больше часов. Еще Edsger W. Dijkstra говорил: "Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.". А это уже проблема не архитектурная, и я не знал, как её решить.
2. Малоразмерные проекты (основная ниша заказной разработки) никогда не обладали карьерной привлекательностью для высококвалифицированных специалистов, поэтому они всегда испытывали квалификационный голод. Эта проблема тоже не архитектурная.
Не зная, как решить проблему, я предпочитал обходить её стороной.
Но случилось так, что в силу жизненных обстоятельств я соприкоснулся с заказной разработкой. Подискутировав с Владиком Хононовым и с девушкой по имени Марина, у меня родилось понимание того, как эту проблему можно решить. И не просто решить её, а превратить решение этой проблемы в коммерческий проект.
Не берусь судить хватит ли у меня средств и упорства осуществить это решение на практике, но эта цель меня заинтересовала и я серьезно задумался о её осуществлении.
#Management #SoftwareDesign #Goal
ebanoe.it
О говнокодерах
Наша печальная реальность такова: хорошее программирование, как правило, не нужно ни самим программерам, ни их бесполезным погонщикам и хозяевам.Потому что оно экономически НЕ-ВЫ-ГОД-НО: чем хуже программный код и прочее, тем больше программеров необходимо…
👍13❤3👎1🔥1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
💬 "Every org I talked to that relies heavily on outsourcing mentioned similar problems of lack of alignment of purpose, lack of trust, time to onboard, and (consultant/contractor) turnaround time as blockers to fast flow, ownership, performance, etc." -- Manuel…
Бесподобная статья о legacy от Mathias Verraes "Software design is just theory".
Знакомы фразы?
- “Software design is just theory.”
- “Design patterns are too academic.”
- “Writing code is the only way to become a better programmer.”
- “Just ship it.”
- “That’s over-designed.”
Меткое выражение проблемы (даже Matthew Skelton оценил):
💬 "We have created outsourcing farms, that produce legacy at the speed of typing. It’s legacy as a service (LaaS) [Quote by Pieter Hintjens]"
💬 "Software design has a slow feedback cycle. It takes a long time before your design starts biting you in the butt."
Теория - это обобщенная практика:
💬 "Their ideas are not “just theory”. It’s years of accumulated practice and insights. They work — often in many different contexts. We’re lucky: we can build on top of their ideas."
💬 "Learning is the bottleneck [Ashley Johnson]"
Статью распечатать бы красными буквами да на стену в каждом офисе. Архитектура - как политика, если вы не занимаетесь ею, тогда она займется вами.
#SoftwareDesign #Legacy
Знакомы фразы?
- “Software design is just theory.”
- “Design patterns are too academic.”
- “Writing code is the only way to become a better programmer.”
- “Just ship it.”
- “That’s over-designed.”
Меткое выражение проблемы (даже Matthew Skelton оценил):
💬 "We have created outsourcing farms, that produce legacy at the speed of typing. It’s legacy as a service (LaaS) [Quote by Pieter Hintjens]"
💬 "Software design has a slow feedback cycle. It takes a long time before your design starts biting you in the butt."
Теория - это обобщенная практика:
💬 "Their ideas are not “just theory”. It’s years of accumulated practice and insights. They work — often in many different contexts. We’re lucky: we can build on top of their ideas."
💬 "Learning is the bottleneck [Ashley Johnson]"
Статью распечатать бы красными буквами да на стену в каждом офисе. Архитектура - как политика, если вы не занимаетесь ею, тогда она займется вами.
#SoftwareDesign #Legacy
Mathias Verraes' Blog
“Software design is just theory”
Is writing code all day all you need to do to become a better programmer?
🔥10👍5🤣2🤩1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Об инструментах управления процессами гибридной SDLC-модели разработки небольших проектов. Почему меня интересует гибридная модель? По двум причинам: 1. Небольшие проекты имеют, как правило, низкий уровень неопределенности, а значит баланс Prediction/Adaptation…
Можно ли по этой таблице, которая, к слову, единственная и состоит всего из двух колонок, сказать, что система распределения прав может объединять пользователей в группы и реализует множественное наследование прав неограниченного уровня вложенности?
Trac не перестает удивлять. Если бы не документация, то вряд ли догадался бы. Простота, с которой авторы Trac решают сложные задачи, шедевральна. Нечасто можно встретить, когда так мало кода делает так много. Гораздо чаще приходится наблюдать гораздо большее количество таблиц, которые не реализуют вообще никакого наследования, не говоря уже о множественном наследовании.
💬 "Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better."
—Edsger W. Dijkstra, 1984 On the nature of Computing Science (EWD896)
#Management #SoftwareDesign
# \d permission
Table "trac.permission"
Column | Type | Collation | Nullable | Default
----------+------+-----------+----------+---------
username | text | | not null |
action | text | | not null |
Indexes:
"permission_pk" PRIMARY KEY, btree (username, action)
Trac не перестает удивлять. Если бы не документация, то вряд ли догадался бы. Простота, с которой авторы Trac решают сложные задачи, шедевральна. Нечасто можно встретить, когда так мало кода делает так много. Гораздо чаще приходится наблюдать гораздо большее количество таблиц, которые не реализуют вообще никакого наследования, не говоря уже о множественном наследовании.
💬 "Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better."
—Edsger W. Dijkstra, 1984 On the nature of Computing Science (EWD896)
#Management #SoftwareDesign
GitHub
trac/trac/perm.py at ccc8fd0e1fddc85c21f9316418bfe1f84db66c77 · edgewall/trac
Trac is an enhanced wiki and issue tracking system for software development projects (mirror) - edgewall/trac
👍3🔥2👀1
🔷 "Architecture vs. Design" by George Fairbanks. Интересные размышления.
#SoftwareArchitecture #SoftwareDesign
#SoftwareArchitecture #SoftwareDesign
Forwarded from Russian Association of Software Architects (Ivan Zakrevsky)
Eric Evans дает интересное определение Constantine's Law нетехническим языком:
💬 "МОДУЛИ дают возможность посмотреть на модель с разных сторон:
во-первых, можно изучить подробности устройства модуля, не вникая в сложное целое;
во-вторых, удобно рассматривать взаимоотношения между модулями, не вдаваясь в детали их внутреннего устройства.
<...>
То, что при делении на модули должна соблюдаться низкая внешняя зависимость
(low coupling) при высокой внутренней связности (high cohesion)- это общие слова. Определения зависимости и связности грешат уклоном в чисто технические, количественные критерии, по которым их якобы можно измерить, подсчитав количество ассоциаций и взаимодействий. Но это не просто механические характеристики подразделения кода на модули, а идейные концепции. Человек не может одновременно удерживать в уме слишком много предметов (отсюда низкая внешняя зависимость). А плохо связанные между собой фрагменты информации так же трудно понять, как неструктурированную "кашу" из идей (отсюда высокая внутренняя связность).
MODULES give people two views of the model:
They can look at detail within a MODULE without being overwhelmed by the whole, or they can look at relationships between MODULES in views that exclude interior detail.
<...>
It is a truism that there should be low coupling between MODULES and high cohesion
within them. Explanations of coupling and cohesion tend to make them sound like technical metrics, to be judged mechanically based on the distributions of associations and interactions. Yet it isn't just code being divided into MODULES, but concepts. There is a limit to how many things a person can think about at once (hence low coupling). Incoherent fragments of ideas are as hard to understand as an undifferentiated soup of ideas (hence high cohesion)."
-- "Domain-Driven Design: Tackling Complexity in the Heart of Software" by Eric Evans, перевод В.Л. Бродового
#SoftwareDesign
💬 "МОДУЛИ дают возможность посмотреть на модель с разных сторон:
во-первых, можно изучить подробности устройства модуля, не вникая в сложное целое;
во-вторых, удобно рассматривать взаимоотношения между модулями, не вдаваясь в детали их внутреннего устройства.
<...>
То, что при делении на модули должна соблюдаться низкая внешняя зависимость
(low coupling) при высокой внутренней связности (high cohesion)- это общие слова. Определения зависимости и связности грешат уклоном в чисто технические, количественные критерии, по которым их якобы можно измерить, подсчитав количество ассоциаций и взаимодействий. Но это не просто механические характеристики подразделения кода на модули, а идейные концепции. Человек не может одновременно удерживать в уме слишком много предметов (отсюда низкая внешняя зависимость). А плохо связанные между собой фрагменты информации так же трудно понять, как неструктурированную "кашу" из идей (отсюда высокая внутренняя связность).
MODULES give people two views of the model:
They can look at detail within a MODULE without being overwhelmed by the whole, or they can look at relationships between MODULES in views that exclude interior detail.
<...>
It is a truism that there should be low coupling between MODULES and high cohesion
within them. Explanations of coupling and cohesion tend to make them sound like technical metrics, to be judged mechanically based on the distributions of associations and interactions. Yet it isn't just code being divided into MODULES, but concepts. There is a limit to how many things a person can think about at once (hence low coupling). Incoherent fragments of ideas are as hard to understand as an undifferentiated soup of ideas (hence high cohesion)."
-- "Domain-Driven Design: Tackling Complexity in the Heart of Software" by Eric Evans, перевод В.Л. Бродового
#SoftwareDesign
👍1