📖 آموزش Event Sourcing | بخش دوازدهم
💡مقدمهای بر الگوی Inbox-Outbox
در شماره دوازدهم از سری آموزشهای ایونتسورسینگ به معرفی الگوی Inbox-Outbox پرداختم:
https://domaindrivendesign.ir/event-sourcing-12-inbox-outbox-pattern-intro/
EventSourcing | Part 12
هشتگ:
#EventSourcing #ایونت_سورسینگ #آموزش_event_sourcing
@DomainDrivenDesign_ir
💡مقدمهای بر الگوی Inbox-Outbox
الگوی Inbox-Outbox به توسعهدهندگان یک سرویس کمک میکند تا بتوانند eventها را به صورت قابل اطمینان به دنیای بیرون از سرویس خود ارسال کنند. به بیان دیگر مهمترین مزیت و البته دلیل وجودی الگوی Inbox-Outbox تضمین at-least-once-delivery است. Inbox-Outbox الگویی است که برای مدیریت ارتباطات بین سرویسها در معماری مبتنی بر Event Sourcing به کار میرود.
در این الگو، هر سرویس یک صندوق ورودی (Inbox) و یک صندوق خروجی (Outbox) دارد. پیاده سازی این صندوقها میتواند به طرق مختلفی انجام شود. هر سرویس رویدادهایی قصد دارد به دنیای بیرون مخابره کند را ابتدا درون صندوق خروجی(outbox) خود قرار میدهد. این صندوق غالبا بصورت یک صف(Queue) ساده بدون اولویت پیادهسازی میشود. همچنین رویدادهایی که هر سرویس به آنها علاقمند است نیز درون صندوق ورودی آن سرویس نگهداری میشود. این صندوق هم بصورت پیشفرض یک صف(Queue) ساده بدون اولویت پیادهسازی است.
در شماره دوازدهم از سری آموزشهای ایونتسورسینگ به معرفی الگوی Inbox-Outbox پرداختم:
https://domaindrivendesign.ir/event-sourcing-12-inbox-outbox-pattern-intro/
EventSourcing | Part 12
هشتگ:
#EventSourcing #ایونت_سورسینگ #آموزش_event_sourcing
@DomainDrivenDesign_ir
مکتبخانه DDD
آموزش Event Sourcing قسمت 12 | مقدمهای بر الگوی Inbox-Outbox | مکتبخانه DDD
در بخش دوازدهم از سری آموزشهای event sourcing به معرفی الگوی Inbox-Outbox پرداختیم. این الگو در سیستمهای توزیع شده جهت اطمینان از دریافت پیامها توسط طرف مقابل نقش اساسیای را بازی میکند...
❤4👍2
Forwarded from انجمن DDD ایران
با سلام و احترام
با سپاس از استقبال بینظیر شما همراهان گرامی، انجمن DDD ایران مفتخر است که سومین جلسه از سری کارگاههای Exploratory Domain Discovery را برگزار نماید.
به منظور برنامهریزی هرچه بهتر و پاسخگویی به نیازهای شما، خواهشمندیم فرم زیر را جهت نیازسنجی اولیه این کارگاه تکمیل فرمایید.
🔵 مدرس: مسعود بهرامی
🔵 برگزارکننده: انجمن DDD ایران
🔵 محل برگزاری: تهران (حضوری)
برای کسب اطلاعات بیشتر میتوانید از طریق اکانت تلگرام @masodbahrami با ما در ارتباط باشید.
لینک پیش ثبتنام:
https://docs.google.com/forms/d/e/1FAIpQLScaOq56nhLe6-e5ZbeVwwOl3NX7taJ-A72kgVKzY15XqCm72g/viewform?usp=header
با سپاس از استقبال بینظیر شما همراهان گرامی، انجمن DDD ایران مفتخر است که سومین جلسه از سری کارگاههای Exploratory Domain Discovery را برگزار نماید.
به منظور برنامهریزی هرچه بهتر و پاسخگویی به نیازهای شما، خواهشمندیم فرم زیر را جهت نیازسنجی اولیه این کارگاه تکمیل فرمایید.
🔵 مدرس: مسعود بهرامی
🔵 برگزارکننده: انجمن DDD ایران
🔵 محل برگزاری: تهران (حضوری)
برای کسب اطلاعات بیشتر میتوانید از طریق اکانت تلگرام @masodbahrami با ما در ارتباط باشید.
لینک پیش ثبتنام:
https://docs.google.com/forms/d/e/1FAIpQLScaOq56nhLe6-e5ZbeVwwOl3NX7taJ-A72kgVKzY15XqCm72g/viewform?usp=header
❤6
Are consciousness and intelligence the same?
Why does it matter to distinguish them?
https://www.youtube.com/watch?v=1rtS2OEV6bM
Why does it matter to distinguish them?
https://www.youtube.com/watch?v=1rtS2OEV6bM
YouTube
The Politics of Consciousness | video lecture with Yuval Noah Harari
What is consciousness? Who has consciousness? And why is it so dangerous to confuse it with intelligence? How does our understanding of consciousness impact the ethical, political and legal debates about abortion, animal rights and the legal status of AI?…
❤2👎1
I Hate Value Objects
Value Objects: A Barrier to DDD. 🔵⚡Descriptor Data to the Rescue
Part 1
I wrote a new article. I revealed my thoughts on one of the most confusing issues in the tactical world of DDD. Read it 👇
https://masoudbahrami.substack.com/p/i-hate-value-objects
Value Objects: A Barrier to DDD. 🔵⚡Descriptor Data to the Rescue
Part 1
I wrote a new article. I revealed my thoughts on one of the most confusing issues in the tactical world of DDD. Read it 👇
https://masoudbahrami.substack.com/p/i-hate-value-objects
Masoud’s Substack
I Hate Value Objects
Value Objects: A Barrier to DDD. Descriptor Data to the Rescue - Part 1
❤2👍1
“Specification by Example” by Example
ابیات بالا منتسب به حضرت مولانا و از مجموعه داستان طوطی و بقال برگزیده شده.
اگر به اعجاز ابیات بالا نگاه کنیم میبینیم که کلمات شیر در دو مصرع اول، و بادیه(معنای کاسه) در دو مصرع دوم، چگونه به زیبایی بکار گرفته شده اند.
شاعر در اینجا به زیبایی از صنایع ادبی استفاده کرده و شاهکاری ادبی خلق کرده.
از زاویهای دیگر اما، با نگاهی دقیقتر به شعر بالا، این شعر بهمون نشون میده که برای جلوگیری از اشتباه و ابهام، باید مفاهیم رو دقیق و واضح تعریف کنیم. همونطور که "شیر" در این شعر دو معنی کاملاً متفاوت داره، ایضا “بادیه”، در تعریف ویژگیهای محصول باید از بکار بردن عمدی یا سهوی این صنایع ادبی جدا خودداری کنیم.
رویکرد Specification by Example با همین هدف به وجود اومده: به جای تعریفهای انتزاعی، با مثالهای ملموس و قابل فهم، رفتار سیستم رو مشخص میکنیم و نشون میدیم که دقیقاً چطور باید کار کنه تا از هرگونه ابهامی جلوگیری بشه. ما از با کمک ارائه مثالهای ملموس، ساده، و مشخص، ویژگی(specification) و بصورت کلی چیزی که در ذهن داریم رو مشخص میکنیم.
فرض کنید میخوایم یک ماشین حساب ساده را طراحی کنیم. اسم این ماشین حساب را "حسابچی" میذاریم. "حسابچی" باید عملیات اصلی ریاضی مثل جمع، تفریق، ضرب و تقسیم رو انجام بده.
برای تعریف دقیق نحوه عملکرد جمع در "حسابچی"، از رویکرد Specification by Example استفاده میکنیم. به این ترتیب، با ارائه مثالهای مشخص، انتظاراتمون رو از ویژگی جمع بیان میکنیم. این کار رو به صورت یک مکالمه بین دو نفر، تقی و نقی، نشون میدم:
مکالمه بین تقی و نقی:
همانطور که مشاهده کردید، در این روش با ارائه مثالهای ملموس و گام به گام، ویژگیهای سیستم را مشخص کردیم.
هر مثال، بر پایه مثال قبلی بنا شده و جنبه جدیدی از رفتار سیستم رو آشکار کرد. همین کار باعث شد که که همگی ذینفعان درک مشترکی از چیزی که قرار تولید کنند داشته باشند. این مثالها همینطور حکم proof-of-work کار نهایی رو هم دارند.
یعنی قبل از پیادهسازی هر خط کدی ما مکانیزم نهایی اعتبار سنجی سیستم رو بهش دست پیدا کردیم.
آن یکی شیر است که آدم میخورد
آن یکی شیر است که آدم میخورد
کان یکی شیر است اندر بادیه
کان یکی شیر است اندر بادیه
ابیات بالا منتسب به حضرت مولانا و از مجموعه داستان طوطی و بقال برگزیده شده.
اگر به اعجاز ابیات بالا نگاه کنیم میبینیم که کلمات شیر در دو مصرع اول، و بادیه(معنای کاسه) در دو مصرع دوم، چگونه به زیبایی بکار گرفته شده اند.
شاعر در اینجا به زیبایی از صنایع ادبی استفاده کرده و شاهکاری ادبی خلق کرده.
از زاویهای دیگر اما، با نگاهی دقیقتر به شعر بالا، این شعر بهمون نشون میده که برای جلوگیری از اشتباه و ابهام، باید مفاهیم رو دقیق و واضح تعریف کنیم. همونطور که "شیر" در این شعر دو معنی کاملاً متفاوت داره، ایضا “بادیه”، در تعریف ویژگیهای محصول باید از بکار بردن عمدی یا سهوی این صنایع ادبی جدا خودداری کنیم.
رویکرد Specification by Example با همین هدف به وجود اومده: به جای تعریفهای انتزاعی، با مثالهای ملموس و قابل فهم، رفتار سیستم رو مشخص میکنیم و نشون میدیم که دقیقاً چطور باید کار کنه تا از هرگونه ابهامی جلوگیری بشه. ما از با کمک ارائه مثالهای ملموس، ساده، و مشخص، ویژگی(specification) و بصورت کلی چیزی که در ذهن داریم رو مشخص میکنیم.
فرض کنید میخوایم یک ماشین حساب ساده را طراحی کنیم. اسم این ماشین حساب را "حسابچی" میذاریم. "حسابچی" باید عملیات اصلی ریاضی مثل جمع، تفریق، ضرب و تقسیم رو انجام بده.
برای تعریف دقیق نحوه عملکرد جمع در "حسابچی"، از رویکرد Specification by Example استفاده میکنیم. به این ترتیب، با ارائه مثالهای مشخص، انتظاراتمون رو از ویژگی جمع بیان میکنیم. این کار رو به صورت یک مکالمه بین دو نفر، تقی و نقی، نشون میدم:
مکالمه بین تقی و نقی:
تقی: خب، برای جمع تو "حسابچی" اول از یه چیز خیلی ساده شروع کنیم: ۲ + ۲، جوابش میشه ۴، درسته؟
نقی: آره، این که خیلی واضحه. جمع دو تا عدد صحیح و مثبت.
تقی: حالا یه کم بزرگترش کنیم: ۲ + ۱۰، میشه ۱۲.
نقی: اوکی، اینم مثل قبلیه. فقط اعداد بزرگتر شدن.
تقی: حالا ۲ + ۱۲۵۰ رو امتحان کن.
نقی: خب، اینم میشه ۱۲۵۲. پس "حسابچی" باید از اعداد صحیح بزرگ هم پشتیبانی کنه.
تقی: دقیقاً. حالا فرض کن بخوایم اعداد اعشاری رو هم جمع کنیم. مثلاً ۲ + ۱۰.۲.
نقی: خب، این میشه ۱۲.۲. پس "حسابچی" باید اعداد اعشاری رو هم در نظر بگیره.
تقی: عالیه. حالا یه کم پیچیدهترش کنیم. ۲ + ۱۰.۲ + ۲۵ چی؟ یعنی سه تا عدد رو با هم جمع کنیم.
نقی: این میشه ۳۷.۲. پس "حسابچی" باید بتونه چند تا عدد رو هم با هم جمع کنه، حتی اگه اعشاری باشن.
تقی: آفرین. حالا یه چیز دیگه. ۲ + ۲ + (۲ * ۲) رو حساب کن. اینجا یه عبارت ریاضی داریم که هم جمع داره و هم ضرب.
نقی: خب، طبق قواعد ریاضی، اولویت با ضربه، پس ۲ ضربدر ۲ میشه ۴، بعدش با ۲ و ۲ جمع میشه که میشه ۸. پس "حسابچی" باید از عبارات ریاضی (expressions) و تقدم عملگرها هم پشتیبانی کنه. یعنی بدونه اول ضرب رو حساب کنه بعد جمع رو.
تقی: دقیقاً همینطوره.
همانطور که مشاهده کردید، در این روش با ارائه مثالهای ملموس و گام به گام، ویژگیهای سیستم را مشخص کردیم.
هر مثال، بر پایه مثال قبلی بنا شده و جنبه جدیدی از رفتار سیستم رو آشکار کرد. همین کار باعث شد که که همگی ذینفعان درک مشترکی از چیزی که قرار تولید کنند داشته باشند. این مثالها همینطور حکم proof-of-work کار نهایی رو هم دارند.
یعنی قبل از پیادهسازی هر خط کدی ما مکانیزم نهایی اعتبار سنجی سیستم رو بهش دست پیدا کردیم.
❤6👍1
📍Domain Driven Design Roadmap 🗺 🗾 📖
As a DDD instructor, I’ve often been asked to provide a roadmap for learning Domain Driven Design. Despite attempts, the vast scope of DDD, combined with the diverse backgrounds of people—such as product managers, developers, architects—means many roadmaps don’t cover its complexities. DDD spans both strategic and technical aspects, making it challenging to create a comprehensive roadmap for everyone.
To address this, I’ve created an initial version (0.0.1)! This roadmap guides learners through all levels of DDD, from concepts to advanced practices. Whether you’re starting with DDD or deepening your expertise, it offers structured paths for different stages of learning.
Link to the repo:👇
https://github.com/masoud-bahrami/domain-driven-design-roadmap
As a DDD instructor, I’ve often been asked to provide a roadmap for learning Domain Driven Design. Despite attempts, the vast scope of DDD, combined with the diverse backgrounds of people—such as product managers, developers, architects—means many roadmaps don’t cover its complexities. DDD spans both strategic and technical aspects, making it challenging to create a comprehensive roadmap for everyone.
To address this, I’ve created an initial version (0.0.1)! This roadmap guides learners through all levels of DDD, from concepts to advanced practices. Whether you’re starting with DDD or deepening your expertise, it offers structured paths for different stages of learning.
Link to the repo:👇
https://github.com/masoud-bahrami/domain-driven-design-roadmap
👍6👌1
کانال مکتبخانه DDD
📍Domain Driven Design Roadmap 🗺 🗾 📖 As a DDD instructor, I’ve often been asked to provide a roadmap for learning Domain Driven Design. Despite attempts, the vast scope of DDD, combined with the diverse backgrounds of people—such as product managers, developers…
Domain Driven Design Roadmap 🗺
A guided journey through DDD, covering essential concepts and advanced topics.
Here’s a brief overview of the roadmap's structure:
-------------------------------------------------------
A guided journey through DDD, covering essential concepts and advanced topics.
Here’s a brief overview of the roadmap's structure:
-------------------------------------------------------
Why Domain-Driven Design?🤔
I. Pre-DDD Context for Different Roles 🧩
II. Glossary of Terms 📖🔤 Domain Jargon Demystified
III. Level 1: DDD Fundamentals 🌱
IV. Level 2: Collaborative Modeling and Designing 🤝
V. Level 3: Strategic Design ♟️
VI. Level 4: Tactical Design and Implementation🏗️
VII. Level 5: Architecture and DDD 🏛️🧩🏗️
XIII. Level 6: Domain-Driven Design with Event Sourcing and CQRS🌊💾
XXX. Measuring Success with DDD ✅📈
IX. Level 8: DDD and Programming Paradigms 💻⚙️🧩
X. Level 9: Advanced and Emerging Topics 🔮
XI. Level 10: Team Topologies and DDD 🧑🤝🧑🏢🤝
XII. Level 11: Strategic Analysis with Wardley Mapping and Related Techniques 🗺️📈🧭
XIII. Level 12: Visualizing DDD: Canvases for Collaboration and Clarity 🖼️🤝
XIV. Level 13: Supple Design: Techniques for Evolving Domain Models 🌿🌊🔄
XIV. Level 14: Breakthrough Refactoring: Refactoring Towards Deeper Insight 🚀💡
XV. Level 15: Scaling DDD 🚀🏢
XVI. Level 16: Dealing with Legacy Systems in DDD 🏛️➡️🔄
XVII. Level 17: Anti-Patterns in DDD 🚫🚧 Common Mistakes to Avoid
XVIII. Level 18: Practical Tools and Checklists for DDD 🛠️✅📝
XIX. Tools (Optional 🧰🛠️)
👍3
Software Architecture vs. Design Patterns
Simply put, both software architecture and design patterns are essential for good software. Architecture is the big picture, the overall structure. Design patterns are solutions to smaller, local problems. Understanding the difference is key for any software developer.
https://masoudbahrami.medium.com/software-architecture-vs-design-patterns-6ceb535cf9c9
Simply put, both software architecture and design patterns are essential for good software. Architecture is the big picture, the overall structure. Design patterns are solutions to smaller, local problems. Understanding the difference is key for any software developer.
https://masoudbahrami.medium.com/software-architecture-vs-design-patterns-6ceb535cf9c9
Medium
Software Architecture vs. Design Patterns
Software architecture is not about local optimization techniques or patterns. Design patterns on the other hand, focus more on design…
👍3
What if you could treat dates and times as data in C# and Java?🤨
Are you looking for a better way to handle dates and times?
I'm exploring a homoiconic approach and developing a library to simplify date and time handling
https://medium.com/p/homoiconicity-inspired-date-time-handling-in-c-sharp-f38c7cf8704e
Are you looking for a better way to handle dates and times?
I'm exploring a homoiconic approach and developing a library to simplify date and time handling
https://medium.com/p/homoiconicity-inspired-date-time-handling-in-c-sharp-f38c7cf8704e
Medium
Homoiconicity-Inspired Date/Time Handling in C#
Homoiconicity is a fascinating concept in programming languages where a program’s code and its data share the same structure. This means…
❤2👌1
چالشهای معماری نرمافزار و تصمیمات سخت 🚀
معماران و بصورت کلی تصمیم گیران در حوزه تولید نرمافزار، نرمافزار اغلب نگران و مضطرب به نظر میرسند چون هیچ تصمیم ساده و واضحی ندارند: همه چیز یک تعویض سخت است. معماری نرمافزار یک حوزه پر از پیچیدگیها و انتخابهای دشوار است که در آن، هر تصمیم بهنوعی با چالشهای خاص خود همراه است. در این سخنرانی، نیل فورد به بررسی این مشکلات و دلایلی میپردازد که معماری نرمافزار را به چنین عرصهای پر از دشواری تبدیل کردهاند. او با کاوش در مفهوم "دقت مناسب" و چگونگی رسیدن به آن، مفاهیم پیچیدهای چون معماریهای مبتنی بر رویداد، تیمها، اجزا و حتی "کوانتوم معماری" را مورد بحث قرار میدهد تا روشن کند که چرا معماری همواره چنین چالشبرانگیز است.
یکی از مسائل کلیدی که در این سخنرانی مورد توجه قرار میگیرد، مسئله بازاستفاده است. نیل فورد با ارائه مثالهایی از سطح برنامهها، دپارتمانها و حتی سازمانها، توضیح میدهد که چرا بازاستفاده بهظاهر مفهومی ساده است، اما در عمل به یکی از بزرگترین چالشها تبدیل میشود. به عنوان مثال، در یک پروژه بزرگ نرمافزاری، اگر بخواهید یک ماژول مشترک برای پردازش دادهها در بخشهای مختلف استفاده کنید، ممکن است در ابتدا به نظر برسد که این تصمیم باعث کاهش کدهای تکراری و افزایش بهرهوری میشود. اما پس از مدتی متوجه میشوید که این ماژول نیاز به تغییرات زیادی دارد تا با نیازهای هر بخش تطابق پیدا کند. این مشکلات شامل همگامسازی تغییرات در بخشهای مختلف، افزایش وابستگیها و پیچیدگی در نگهداری سیستم خواهد بود. در نتیجه، تصمیم به بازاستفاده نه تنها هزینههای پنهانی دارد بلکه میتواند باعث کاهش انعطافپذیری سیستم شود.
او همچنین به تشریح نحوهی تحلیلهای تعویض در معماری، ابزارهایی چون لیستهای MECE (Mutually Exclusive, Collectively Exhaustive) و روشهایی برای تفکیک سرویسها به منظور دستیابی به دقت مناسب خواهد پرداخت.
به عنوان مثال، در یک معماری میکروسرویسها، شما باید تصمیم بگیرید که هر سرویس را به چه اندازهای تفکیک کنید. اگر سرویسها خیلی ریز تقسیم شوند، مدیریت و نگهداری آنها دشوار میشود، اما اگر بیش از حد کلی باشند، ممکن است در عملکرد و مقیاسپذیری سیستم مشکلاتی ایجاد کند.
علاوه بر این، نیل فورد توضیح میدهد که چگونه میتوان از این ابزارها و رویکردها برای حل مشکلات معماری استفاده کرد و همچنین چرا تصمیمگیریهای معماری به ندرت ساده هستند❓ او به بررسی مشکلات معمولی که در معماری نرمافزار با آنها مواجه میشویم، پرداخته و راهحلهایی برای کاهش پیچیدگیها و تسهیل این فرآیندها ارائه میدهد. از طریق شناسایی دلایل مشترک این چالشها و اعمال درسهایی که میتوانند به طور کلی در معماری نرمافزار موثر واقع شوند، نیل فورد راههایی برای تبدیل معماری سخت و پیچیده به فرآیندی نرمتر و قابلمدیریتتر معرفی خواهد کرد.
این سخنرانی به شما کمک خواهد کرد تا نه تنها دید بهتری از چالشهای معماری نرمافزار پیدا کنید، بلکه توانایی تحلیل و تصمیمگیریهای پیچیدهتر را در این حوزه تقویت کنید. پس با ما همراه باشید تا با درک عمیقتری از معماری نرمافزار و چالشهای آن روبهرو شوید.
https://www.youtube.com/watch?v=Q6RfMmMwhvM
معماران و بصورت کلی تصمیم گیران در حوزه تولید نرمافزار، نرمافزار اغلب نگران و مضطرب به نظر میرسند چون هیچ تصمیم ساده و واضحی ندارند: همه چیز یک تعویض سخت است. معماری نرمافزار یک حوزه پر از پیچیدگیها و انتخابهای دشوار است که در آن، هر تصمیم بهنوعی با چالشهای خاص خود همراه است. در این سخنرانی، نیل فورد به بررسی این مشکلات و دلایلی میپردازد که معماری نرمافزار را به چنین عرصهای پر از دشواری تبدیل کردهاند. او با کاوش در مفهوم "دقت مناسب" و چگونگی رسیدن به آن، مفاهیم پیچیدهای چون معماریهای مبتنی بر رویداد، تیمها، اجزا و حتی "کوانتوم معماری" را مورد بحث قرار میدهد تا روشن کند که چرا معماری همواره چنین چالشبرانگیز است.
یکی از مسائل کلیدی که در این سخنرانی مورد توجه قرار میگیرد، مسئله بازاستفاده است. نیل فورد با ارائه مثالهایی از سطح برنامهها، دپارتمانها و حتی سازمانها، توضیح میدهد که چرا بازاستفاده بهظاهر مفهومی ساده است، اما در عمل به یکی از بزرگترین چالشها تبدیل میشود. به عنوان مثال، در یک پروژه بزرگ نرمافزاری، اگر بخواهید یک ماژول مشترک برای پردازش دادهها در بخشهای مختلف استفاده کنید، ممکن است در ابتدا به نظر برسد که این تصمیم باعث کاهش کدهای تکراری و افزایش بهرهوری میشود. اما پس از مدتی متوجه میشوید که این ماژول نیاز به تغییرات زیادی دارد تا با نیازهای هر بخش تطابق پیدا کند. این مشکلات شامل همگامسازی تغییرات در بخشهای مختلف، افزایش وابستگیها و پیچیدگی در نگهداری سیستم خواهد بود. در نتیجه، تصمیم به بازاستفاده نه تنها هزینههای پنهانی دارد بلکه میتواند باعث کاهش انعطافپذیری سیستم شود.
او همچنین به تشریح نحوهی تحلیلهای تعویض در معماری، ابزارهایی چون لیستهای MECE (Mutually Exclusive, Collectively Exhaustive) و روشهایی برای تفکیک سرویسها به منظور دستیابی به دقت مناسب خواهد پرداخت.
به عنوان مثال، در یک معماری میکروسرویسها، شما باید تصمیم بگیرید که هر سرویس را به چه اندازهای تفکیک کنید. اگر سرویسها خیلی ریز تقسیم شوند، مدیریت و نگهداری آنها دشوار میشود، اما اگر بیش از حد کلی باشند، ممکن است در عملکرد و مقیاسپذیری سیستم مشکلاتی ایجاد کند.
علاوه بر این، نیل فورد توضیح میدهد که چگونه میتوان از این ابزارها و رویکردها برای حل مشکلات معماری استفاده کرد و همچنین چرا تصمیمگیریهای معماری به ندرت ساده هستند❓ او به بررسی مشکلات معمولی که در معماری نرمافزار با آنها مواجه میشویم، پرداخته و راهحلهایی برای کاهش پیچیدگیها و تسهیل این فرآیندها ارائه میدهد. از طریق شناسایی دلایل مشترک این چالشها و اعمال درسهایی که میتوانند به طور کلی در معماری نرمافزار موثر واقع شوند، نیل فورد راههایی برای تبدیل معماری سخت و پیچیده به فرآیندی نرمتر و قابلمدیریتتر معرفی خواهد کرد.
این سخنرانی به شما کمک خواهد کرد تا نه تنها دید بهتری از چالشهای معماری نرمافزار پیدا کنید، بلکه توانایی تحلیل و تصمیمگیریهای پیچیدهتر را در این حوزه تقویت کنید. پس با ما همراه باشید تا با درک عمیقتری از معماری نرمافزار و چالشهای آن روبهرو شوید.
https://www.youtube.com/watch?v=Q6RfMmMwhvM
YouTube
Software Architecture: The Hard Parts - Neal Ford
Architects often look harried and worried because they have no clean, easy decisions: everything is an awful tradeoff. Architecture has lots of difficult problems, which this talk highlights by investigating what makes architecture so hard. At the of core…
❤2
Forwarded from Masoud Bahrami
Language-Driven Design
In the realm of software development, we assert that software systems are fundamentally rooted in language. The Language-Driven Design (LDD) approach emphasizes that:
🧠 Clarity over Complexity
We prioritize simplicity in communication, which leads to greater understanding among team members and stakeholders. By avoiding jargon and convoluted terminology, we make our systems more accessible and reduce the possibility of misunderstandings that can hinder progress.
💬 Language Unites Teams
A common vocabulary fosters collaboration and strengthens team dynamics. When teams speak the same language, they can collaborate more efficiently, share knowledge effectively, and align their efforts towards common goals, resulting in improved productivity and innovation.
🧱 Architecture Reflects Language
The structure of our systems should mirror the language we use to describe them. A well-designed architecture based on a shared language not only enhances comprehension but also facilitates maintenance and future development. This alignment enables developers to iterate quickly and respond to changing requirements with confidence.
🔁 Language Evolves with Reality
We acknowledge that both language and systems are dynamic and must evolve as our understanding and needs change. By fostering a culture of continuous learning and adaptation, we can ensure that our language and designs remain relevant and effective in addressing real-world challenges.
In the realm of software development, we assert that software systems are fundamentally rooted in language. The Language-Driven Design (LDD) approach emphasizes that:
a clear and shared language is paramount for creating systems that are not only effective but also easily understandable and adaptable to change.
🧠 Clarity over Complexity
We prioritize simplicity in communication, which leads to greater understanding among team members and stakeholders. By avoiding jargon and convoluted terminology, we make our systems more accessible and reduce the possibility of misunderstandings that can hinder progress.
💬 Language Unites Teams
A common vocabulary fosters collaboration and strengthens team dynamics. When teams speak the same language, they can collaborate more efficiently, share knowledge effectively, and align their efforts towards common goals, resulting in improved productivity and innovation.
🧱 Architecture Reflects Language
The structure of our systems should mirror the language we use to describe them. A well-designed architecture based on a shared language not only enhances comprehension but also facilitates maintenance and future development. This alignment enables developers to iterate quickly and respond to changing requirements with confidence.
🔁 Language Evolves with Reality
We acknowledge that both language and systems are dynamic and must evolve as our understanding and needs change. By fostering a culture of continuous learning and adaptation, we can ensure that our language and designs remain relevant and effective in addressing real-world challenges.
Forwarded from Masoud Bahrami
Introducing (Domain)Language-First Architecture
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture. As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture. As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
👍2
Masoud Bahrami
Introducing (Domain)Language-First Architecture Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture. As you can see in the diagrams,…
📌Introducing (Domain)Language-First Architecture
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture.
✅ As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
✅ Surrounding the Language core is the Model. Here, the domain language is transformed into concrete data structures and business rules, directly reflecting the language's vocabulary and grammar.
✅ Expanding further, we have the Context. This layer represents the environment in which the system operates, encompassing user interactions and external dependencies. It's where the language's meaning is understood within the system's real-world application.
✅ Finally, the Logic layer is the outermost shell. It's where the magic happens – where the domain language is processed and executed, driving the system's behavior.
The small squares you see represent the interaction points with the outside world – APIs, databases, user interfaces – all communicating with the system in the language it understands best.
Start with words: Use the same words your business uses every day.
Words make the rules: These words decide how the software works.
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture.
✅ As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
✅ Surrounding the Language core is the Model. Here, the domain language is transformed into concrete data structures and business rules, directly reflecting the language's vocabulary and grammar.
✅ Expanding further, we have the Context. This layer represents the environment in which the system operates, encompassing user interactions and external dependencies. It's where the language's meaning is understood within the system's real-world application.
✅ Finally, the Logic layer is the outermost shell. It's where the magic happens – where the domain language is processed and executed, driving the system's behavior.
The small squares you see represent the interaction points with the outside world – APIs, databases, user interfaces – all communicating with the system in the language it understands best.
Start with words: Use the same words your business uses every day.
Words make the rules: These words decide how the software works.
👍3
📌 چهار ضلع طراحی نرمافزار: زبان، مدل، متخصصان دامنه، و کد
وقتی از طراحی نرمافزار حرف میزنیم، خیلیها سریع میرن سراغ معماری، فریمورک، یا ساختارهای کدی. ولی اصل ماجرا از یه جای دیگه شروع میشه: مدل. مدلی که قراره بین آدمها و کد یه پل بزنه، و ریشهش توی دنیای واقعی باشه.
تو رویکرد DDD، مدل فقط یه دیاگرام نیست؛ یه گفتوگوی زندهست، یه ابزار برای درک و بازنمایی مسئله — نه صرفاً راهحل.
👥 یکی از ضلعهای مهم طراحی، متخصصان دامنهان. آدمهایی که از نزدیک با مسئله سر و کار دارن. اگه باهاشون گفتوگو نکنیم، مدلمون تبدیل میشه به یه سری حدس و گمان. ولی اگه زبان مشترک بسازیم و مفاهیم رو دقیق ازشون بگیریم، مدل ما هم واقعیتر و هم قابل استفادهتر میشه.
💬 مدلسازی یه فرایند لحظهای نیست، یه مسیر تدریجیه. وسط گفتوگوها شکل میگیره، توی برخورد با واقعیتها اصلاح میشه، و دائم در حال تغییره. یک فرآیند Just-In-Time
💻 از طرف دیگه، کد هم ساکت نیست. وقتی مدل رو پیادهسازی میکنیم، کد بهمون میگه کجای مدل سادهسازی بیش از حد داشتیم یا کجا درکمون اشتباه بوده. حتی ممکنه راهحلهای دیروزمون، الان خودشون مشکلزا شده باشن. در واقع، کد تبدیل میشه به آیینهی مدل — همونقدر که مدل راهنمای کده، کد هم راهنمای مدل میشه.
♻️ این تعامل بین چهار ضلع طراحی نرمافزار — زبان، مدل، متخصصان دامنه و کد — یه چرخهی بازخورد دائمی میسازه. چرخهای که باعث میشه نرمافزار هم دقیقتر بشه، هم قابل نگهداریتر، و هم واقعاً به درد بخور.
مدل، فقط یه ابزار طراحی نیست. قلب فهم مشترک تیمه. اونجاست که مسئله شفاف میشه، و راهحل معنا پیدا میکنه.
https://domaindrivendesign.ir/the-four-angles-of-software-design/
وقتی از طراحی نرمافزار حرف میزنیم، خیلیها سریع میرن سراغ معماری، فریمورک، یا ساختارهای کدی. ولی اصل ماجرا از یه جای دیگه شروع میشه: مدل. مدلی که قراره بین آدمها و کد یه پل بزنه، و ریشهش توی دنیای واقعی باشه.
تو رویکرد DDD، مدل فقط یه دیاگرام نیست؛ یه گفتوگوی زندهست، یه ابزار برای درک و بازنمایی مسئله — نه صرفاً راهحل.
👥 یکی از ضلعهای مهم طراحی، متخصصان دامنهان. آدمهایی که از نزدیک با مسئله سر و کار دارن. اگه باهاشون گفتوگو نکنیم، مدلمون تبدیل میشه به یه سری حدس و گمان. ولی اگه زبان مشترک بسازیم و مفاهیم رو دقیق ازشون بگیریم، مدل ما هم واقعیتر و هم قابل استفادهتر میشه.
💬 مدلسازی یه فرایند لحظهای نیست، یه مسیر تدریجیه. وسط گفتوگوها شکل میگیره، توی برخورد با واقعیتها اصلاح میشه، و دائم در حال تغییره. یک فرآیند Just-In-Time
💻 از طرف دیگه، کد هم ساکت نیست. وقتی مدل رو پیادهسازی میکنیم، کد بهمون میگه کجای مدل سادهسازی بیش از حد داشتیم یا کجا درکمون اشتباه بوده. حتی ممکنه راهحلهای دیروزمون، الان خودشون مشکلزا شده باشن. در واقع، کد تبدیل میشه به آیینهی مدل — همونقدر که مدل راهنمای کده، کد هم راهنمای مدل میشه.
♻️ این تعامل بین چهار ضلع طراحی نرمافزار — زبان، مدل، متخصصان دامنه و کد — یه چرخهی بازخورد دائمی میسازه. چرخهای که باعث میشه نرمافزار هم دقیقتر بشه، هم قابل نگهداریتر، و هم واقعاً به درد بخور.
مدل، فقط یه ابزار طراحی نیست. قلب فهم مشترک تیمه. اونجاست که مسئله شفاف میشه، و راهحل معنا پیدا میکنه.
https://domaindrivendesign.ir/the-four-angles-of-software-design/
مکتبخانه DDD
چهار ضلع طراحی نرمافزار – زبان، مدل، متخصصان دامنه و کد | مکتبخانه DDD
مدل نرمافزار یه گفتوگوی دائمیه، هم با آدمای متخصص حوزه (خبرگان دامنه) و هم با خود کد طراحی نرمافزار بر پایهی مدل، قلب ماجرای DDD محسوب میشه. مدل صرفاً یه نقشه یا دیاگرام نیست؛ بلکه عنصری زنده و فعال در کل فرایند طراحی و توسعهست. مهمتر از همه، ما فقط…
👍3👏1
🚀مقایسه Exploratory Domain Discovery با EventStorming و Domain Story Telling
از چت جیپیتی پرسیدم که Exploratory Domain Discovery رو با دو رویکرد متداول و شناخته شدهی دیگر یعنی EventStorming و Domain Story Telling مقایسه کند.
https://exploratorydomaindiscovery.com/
از چت جیپیتی پرسیدم که Exploratory Domain Discovery رو با دو رویکرد متداول و شناخته شدهی دیگر یعنی EventStorming و Domain Story Telling مقایسه کند.
https://exploratorydomaindiscovery.com/
❤1
کانال مکتبخانه DDD
🚀مقایسه Exploratory Domain Discovery با EventStorming و Domain Story Telling از چت جیپیتی پرسیدم که Exploratory Domain Discovery رو با دو رویکرد متداول و شناخته شدهی دیگر یعنی EventStorming و Domain Story Telling مقایسه کند. https://exploratorydom…
تصور کنید میخواهید بفهمید یک سیستم حقوق و دستمزد آنلاین چطور کار میکند.
🟡 ایونت استورمینگ: چه اتفاقی چه زمانی میافتد؟ ⏰
مثل این است که یک جدول زمانی از تمام اتفاقات مهم در سیستم حقوق و دستمزد درست کنید.
⬅ تمرکز: ترتیب رویدادها.
⬅ شروع: اولین رویداد مهم چیست؟ شاید «اطلاعات کارمند ثبت شد». بعدش چی؟ «ساعتهای کاری وارد شد». بعد چی؟ «حقوق محاسبه شد». بعد «پرداخت انجام شد».
⬅ شبیه: کشیدن یک نمودار جریان ساده از تمام مراحل کلیدی در پرداخت حقوق.
🔴 دومین استوری تلینگ: چه کسی چه کاری میکند؟ 👤⚙️
مثل این است که داستانهای سادهای درباره افرادی که با سیستم حقوق و دستمزد کار میکنند تعریف کنید.
⬅ تمرکز: چه کسی چه عملی انجام میدهد.
⬅ شروع: تصور کنید یک «مدیر منابع انسانی» «اطلاعات کارمند جدید» را «وارد سیستم میکند». این یک داستان است. تصور کنید «سیستم» به صورت خودکار «مالیات» را از «حقوق» «کسر میکند». این یک داستان دیگر است.
⬅ شبیه : درست کردن یک نوار خیلی ساده از داستانهای فرآیندهای مختلف در سیستم است، که نشان میدهد افراد مختلف (مدیر منابع انسانی، کارمند، سیستم) چه کارهایی انجام میدهند.
🟢 Exploratory Domain Discovery:
نقطه کانونی و مرکزی و هستهی اصلی در مسئله حقوق و دستمزد چیست؟ 🎯
مثل این است که بفهمید هدف اصلی این سیستم حقوق و دستمزد چیست.
⬅ تمرکز: هدف اصلی و مهمترین چیز.
⬅ شروع: چرا این سیستم حقوق و دستمزد وجود دارد؟ شاید هدف اصلی «پرداخت دقیق و به موقع حقوق به کارمندان» باشد. بعد به این فکر میکنید که برای رسیدن به این هدف چه چیزهایی واقعاً ضروری است (اطلاعات کارمندان، اطلاعات مربوط به حقوق و دستمزد، محاسبات حقوق، فرایند پرداخت).
⬅ شبیه: کشیدن یک دایره ساده با ایده اصلی «پرداخت دقیق و به موقع حقوق»، و بعد کشیدن دایرههای دیگر دور آن برای تمام مفاهیم مهم مرتبط (اطلاعات کارمند، قوانین مالیاتی، گزارشهای حقوقی). هر زمان نیاز باشد میتوانیم زوم را در هر جای این دایره را بیشتر یا کمتر کنیم.
----------------------------
💡 در مجموع:
• ایونت استورمینگ: نشان میدهد مراحل پرداخت حقوق به چه ترتیبی انجام میشود.
• دامین استوری تلینگ: نشان میدهد چه کسی در فرایند پرداخت حقوق چه کاری انجام میدهد.
• EDD: کمک میکند بفهمید هدف اصلی سیستم حقوق و دستمزد چیست و مهمترین بخشهایی که باید روی آنها تمرکز کنید کدامند.
در نهایت اینکه EDD به شما کمک میکند قبل از اینکه به جزئیات فرایندها یا تعاملات بپردازید، درک کنید که هدف اصلی سیستم چیست و چه اجزایی برای دستیابی به آن حیاتی هستند.
🟡 ایونت استورمینگ: چه اتفاقی چه زمانی میافتد؟ ⏰
مثل این است که یک جدول زمانی از تمام اتفاقات مهم در سیستم حقوق و دستمزد درست کنید.
⬅ تمرکز: ترتیب رویدادها.
⬅ شروع: اولین رویداد مهم چیست؟ شاید «اطلاعات کارمند ثبت شد». بعدش چی؟ «ساعتهای کاری وارد شد». بعد چی؟ «حقوق محاسبه شد». بعد «پرداخت انجام شد».
⬅ شبیه: کشیدن یک نمودار جریان ساده از تمام مراحل کلیدی در پرداخت حقوق.
🔴 دومین استوری تلینگ: چه کسی چه کاری میکند؟ 👤⚙️
مثل این است که داستانهای سادهای درباره افرادی که با سیستم حقوق و دستمزد کار میکنند تعریف کنید.
⬅ تمرکز: چه کسی چه عملی انجام میدهد.
⬅ شروع: تصور کنید یک «مدیر منابع انسانی» «اطلاعات کارمند جدید» را «وارد سیستم میکند». این یک داستان است. تصور کنید «سیستم» به صورت خودکار «مالیات» را از «حقوق» «کسر میکند». این یک داستان دیگر است.
⬅ شبیه : درست کردن یک نوار خیلی ساده از داستانهای فرآیندهای مختلف در سیستم است، که نشان میدهد افراد مختلف (مدیر منابع انسانی، کارمند، سیستم) چه کارهایی انجام میدهند.
🟢 Exploratory Domain Discovery:
نقطه کانونی و مرکزی و هستهی اصلی در مسئله حقوق و دستمزد چیست؟ 🎯
مثل این است که بفهمید هدف اصلی این سیستم حقوق و دستمزد چیست.
⬅ تمرکز: هدف اصلی و مهمترین چیز.
⬅ شروع: چرا این سیستم حقوق و دستمزد وجود دارد؟ شاید هدف اصلی «پرداخت دقیق و به موقع حقوق به کارمندان» باشد. بعد به این فکر میکنید که برای رسیدن به این هدف چه چیزهایی واقعاً ضروری است (اطلاعات کارمندان، اطلاعات مربوط به حقوق و دستمزد، محاسبات حقوق، فرایند پرداخت).
⬅ شبیه: کشیدن یک دایره ساده با ایده اصلی «پرداخت دقیق و به موقع حقوق»، و بعد کشیدن دایرههای دیگر دور آن برای تمام مفاهیم مهم مرتبط (اطلاعات کارمند، قوانین مالیاتی، گزارشهای حقوقی). هر زمان نیاز باشد میتوانیم زوم را در هر جای این دایره را بیشتر یا کمتر کنیم.
----------------------------
💡 در مجموع:
• ایونت استورمینگ: نشان میدهد مراحل پرداخت حقوق به چه ترتیبی انجام میشود.
• دامین استوری تلینگ: نشان میدهد چه کسی در فرایند پرداخت حقوق چه کاری انجام میدهد.
• EDD: کمک میکند بفهمید هدف اصلی سیستم حقوق و دستمزد چیست و مهمترین بخشهایی که باید روی آنها تمرکز کنید کدامند.
در نهایت اینکه EDD به شما کمک میکند قبل از اینکه به جزئیات فرایندها یا تعاملات بپردازید، درک کنید که هدف اصلی سیستم چیست و چه اجزایی برای دستیابی به آن حیاتی هستند.
👍4👌1