یادگیری طراحی دامنه‌محور: هم‌راستا کردن معماری نرم‌افزار و راهبرد کسب‌وکار | ترجمه Learning Domain-Driven Design

یادگیری طراحی دامنه‌محور: هم‌راستا کردن معماری نرم‌افزار و راهبرد کسب‌وکار

یادگیری طراحی دامنه‌محور: هم‌راستا کردن معماری نرم‌افزار و راهبرد کسب‌وکار

عنوان اصلی: Learning Domain-Driven Design: Aligning Software Architecture and Business Strategy
نویسنده: Vlad Khononov
پیشگفتار: Julie Lerman
ناشر: O’Reilly Media, Inc.
زبان اصلی: انگلیسی
ویرایش: ویرایش نخست، اکتبر ۲۰۲۱
ISBN: 978-1-098-10013-1
ترجمه: ترجمه با کمک هوش مصنوعی
تاریخ ترجمه: ۱۴۰۵/۰۵/۱۹ — 2026-08-10
بازهٔ این مقاله: صفحات PDF ۱ تا ۲۸

جلد و معرفی کتاب

جلد اصلی کتاب Learning Domain-Driven Designجلد اصلی کتاب نوشتهٔ Vlad Khononov با پیشگفتار Julie Lerman.
جلد اصلی کتاب.

متن معرفی پشت جلد

ساخت نرم‌افزار از همیشه دشوارتر شده است. به‌عنوان یک توسعه‌دهنده، نه‌تنها باید روندهای فناوری را که پیوسته تغییر می‌کنند دنبال کنید، بلکه باید دامنه‌های کسب‌وکاری را که نرم‌افزار برای آن‌ها ساخته می‌شود نیز درک کنید. این کتاب کاربردی مجموعه‌ای از الگوها، اصول و شیوه‌های بنیادی را برای تحلیل دامنه‌های کسب‌وکار، درک راهبرد کسب‌وکار و ـ مهم‌تر از همه ـ هم‌راستا کردن طراحی نرم‌افزار با نیازهای کسب‌وکار ارائه می‌کند.

نویسنده، Vlad Khononov، نشان می‌دهد این شیوه‌ها چگونه به پیاده‌سازی مستحکم منطق کسب‌وکار منجر می‌شوند و به آینده‌پذیر کردن طراحی و معماری نرم‌افزار کمک می‌کنند. رابطهٔ طراحی دامنه‌محور (Domain-Driven Design یا DDD) با روش‌شناسی‌های دیگر بررسی می‌شود تا تصمیم‌های معماری با نیازهای کسب‌وکار هماهنگ باشند. همچنین داستان واقعی به‌کارگیری DDD در یک شرکت نوپا بررسی می‌شود.

با این کتاب می‌آموزید چگونه:

  • دامنهٔ کسب‌وکار یک شرکت را تحلیل کنید تا بفهمید سامانه‌ای که می‌سازید چگونه در راهبرد رقابتی آن جای می‌گیرد.
  • از ابزارهای راهبردی و تاکتیکی DDD برای معماری راهکارهای نرم‌افزاری مؤثر و پاسخ‌گو به نیازهای کسب‌وکار استفاده کنید.
  • از دامنه‌های کسب‌وکاری که با آن‌ها روبه‌رو می‌شوید، درکی مشترک میان ذی‌نفعان بسازید.
  • یک سامانه را به زمینه‌های محدود (Bounded Contexts) تجزیه کنید.
  • کار چند تیم را هماهنگ کنید.
  • DDD را به‌تدریج به پروژه‌های موجود یا Brownfield وارد کنید.
«Vladik Khononov متفکری منحصربه‌فرد است که سال‌هاست DDD را برای حل مسائل واقعی کسب‌وکار به‌کار می‌گیرد. ایده‌های او پیوسته کل جامعهٔ DDD را به جلو می‌برند و این کتاب الهام‌بخش افرادی خواهد بود که تازه کار با DDD را آغاز می‌کنند.»— Nick Tune، مشاور فناوری

دربارهٔ نویسنده: Vlad (Vladik) Khononov مهندس نرم‌افزاری با بیش از ۲۰ سال سابقهٔ حرفه‌ای است. او در شرکت‌های بزرگ و کوچک و در نقش‌هایی از عضو تیم تا معمار ارشد فعالیت کرده است. Vlad از حامیان دیرینهٔ طراحی دامنه‌محور است و به شرکت‌ها کمک می‌کند دامنه‌های کسب‌وکار خود را بهتر درک کنند، سامانه‌های Legacy را سامان دهند و با چالش‌های پیچیدهٔ معماری روبه‌رو شوند.

قیمت درج‌شده روی نسخهٔ اصلی: ایالات متحده 59.99 دلار، کانادا 79.99 دلار. ISBN: 978-1-098-10013-1.

پشت جلد اصلی کتابپشت جلد نسخهٔ اصلی با معرفی کتاب، فهرست موضوعات، نقل‌قول Nick Tune و معرفی نویسنده.
پشت جلد نسخهٔ اصلی؛ ترجمهٔ متن آن در بالا آمده است.

ستایش‌ها دربارهٔ «Learning Domain-Driven Design»

«Vladik Khononov متفکری منحصربه‌فرد است که سال‌هاست DDD را برای حل مسائل واقعی کسب‌وکار به‌کار می‌گیرد. ایده‌های او پیوسته کل جامعهٔ DDD را به جلو می‌برند و این کتاب الهام‌بخش افراد تازه‌وارد به DDD خواهد بود.»— Nick Tune، مشاور فناوری
«وقتی به خواندن نسخه‌های پیش‌نویس این کتاب فکر می‌کنم، با خوشحالی فراوان چیزی که به ذهنم می‌آید این است که کتاب دقیقاً به وعدهٔ عنوانش عمل می‌کند! راهنمایی عملی، دعوت‌کننده و آموزنده است که دامنهٔ DDD را از راهبرد تا طراحی فنی پوشش می‌دهد. در حوزه‌هایی که تجربه داشتم بینش و درک تازه‌ای پیدا کردم و در مفاهیم و شیوه‌هایی که کمتر با آن‌ها در تماس بودم خلأهای دانشی‌ام پر شد. Vlad آموزگاری فوق‌العاده است.»— Ruth Malan، مشاور معماری در Bredemeyer Consulting
«Vlad به‌عنوان یک متخصص DDD که روی پروژه‌های بسیار پیچیده کار کرده، تجربهٔ سخت‌به‌دست‌آمدهٔ فراوانی دارد و در به‌اشتراک‌گذاری آن سخاوتمند بوده است. او در این کتاب داستان DDD را از زاویه‌ای منحصربه‌فرد روایت می‌کند و دیدگاهی عالی برای یادگیری می‌دهد. کتاب برای تازه‌واردان نوشته شده است، اما من هم که سال‌هاست DDD را به‌کار می‌برم و درباره‌اش می‌نویسم و سخنرانی می‌کنم، از دیدگاه او چیزهای زیادی آموختم.»— Julie Lerman، مربی نرم‌افزار، نویسندهٔ O’Reilly و حامی دیرینهٔ DDD

صفحهٔ عنوان و اطلاعات نشر

Vlad Khononov

Learning Domain-Driven Design
هم‌راستا کردن معماری نرم‌افزار و راهبرد کسب‌وکار

Beijing · Boston · Farnham · Sebastopol · Tokyo

«Learning Domain-Driven Design» نوشتهٔ Vlad Khononov. حق نشر © 2022 Vladislav Khononov. همهٔ حقوق محفوظ است. چاپ‌شده در ایالات متحدهٔ آمریکا. منتشرشده توسط O’Reilly Media, Inc.، نشانی: 1005 Gravenstein Highway North, Sebastopol, CA 95472.

کتاب‌های O’Reilly را می‌توان برای استفادهٔ آموزشی، کسب‌وکاری یا تبلیغات فروش خریداری کرد. نسخه‌های آنلاین نیز برای بیشتر عناوین در دسترس هستند. برای اطلاعات بیشتر دربارهٔ فروش شرکتی/سازمانی: 800-998-9938 و corporate@oreilly.com.

  • ویراستار خرید (Acquisitions Editor): Melissa Duffield
  • ویراستار توسعه (Development Editor): Jill Leonard
  • ویراستار تولید (Production Editor): Katherine Tozer
  • ویراستار نسخه (Copyeditor): Audrey Doyle
  • نمونه‌خوان (Proofreader): James Fraleigh
  • نمایه‌ساز (Indexer): Sue Klefstad
  • طراح داخلی: David Futato
  • طراح جلد: Karen Montgomery
  • تصویرگر: Kate Dullea

اکتبر ۲۰۲۱: ویرایش نخست
تاریخچهٔ بازنگری ویرایش نخست: 2021-10-08 — نخستین انتشار.

نشانی صفحهٔ خطاهای کتاب در نسخهٔ اصلی: oreilly.com/catalog/errata.csp?isbn=9781098100131.

نشان O’Reilly علامت تجاری ثبت‌شدهٔ O’Reilly Media, Inc. است. عنوان «Learning Domain-Driven Design»، تصویر جلد و طرح تجاری مرتبط نیز علائم تجاری O’Reilly Media, Inc. هستند.

دیدگاه‌های بیان‌شده در این اثر متعلق به نویسنده‌اند و الزاماً دیدگاه ناشر نیستند. ناشر و نویسنده با حسن نیت برای دقت مطالب و دستورالعمل‌ها تلاش کرده‌اند، اما مسئولیتی در قبال خطاها یا حذف‌ها، از جمله خسارت‌های ناشی از استفاده یا اتکا به مطالب این اثر، نمی‌پذیرند. استفاده از اطلاعات و دستورالعمل‌های کتاب بر عهدهٔ خواننده است. اگر نمونه‌کد یا فناوری دیگری که در کتاب ارائه یا توصیف شده مشمول مجوزهای متن‌باز یا حقوق مالکیت فکری دیگران باشد، رعایت آن مجوزها و حقوق بر عهدهٔ استفاده‌کننده است.

ISBN: 978-1-098-10013-1

فهرست کامل کتاب

  • پیشگفتار — xiii
  • مقدمهٔ نویسنده — xv
  • درآمد — xxiii

بخش اول — طراحی راهبردی (Strategic Design)

  1. تحلیل دامنه‌های کسب‌وکار — صفحهٔ 3
    • دامنهٔ کسب‌وکار چیست؟ 3
    • زیردامنه چیست؟ 4
    • انواع زیردامنه‌ها 4
    • مقایسهٔ زیردامنه‌ها 7
    • شناسایی مرزهای زیردامنه 11
    • نمونه‌های تحلیل دامنه 14
    • Gigmaster 14
    • BusVNext 15
    • متخصصان دامنه چه کسانی هستند؟ 17
    • نتیجه‌گیری 18
    • تمرین‌ها 18
  2. کشف دانش دامنه — صفحهٔ 21
    • مسائل کسب‌وکار 21
    • کشف دانش 22
    • ارتباطات 22
    • زبان فراگیر چیست؟ 24
    • زبان کسب‌وکار 25
    • سناریوها 25
    • سازگاری 26
    • مدل دامنهٔ کسب‌وکار 27
    • مدل چیست؟ 27
    • مدل‌سازی مؤثر 28
    • مدل‌سازی دامنهٔ کسب‌وکار 28
    • تلاش مستمر 29
    • ابزارها 29
    • چالش‌ها 30
    • نتیجه‌گیری 31
    • تمرین‌ها 32
  3. مدیریت پیچیدگی دامنه — صفحهٔ 33
    • مدل‌های ناسازگار 33
    • زمینهٔ محدود چیست؟ 35
    • مرزهای مدل 36
    • پالایش زبان فراگیر 37
    • دامنهٔ یک Bounded Context 37
    • Bounded Contextها در برابر زیردامنه‌ها 38
    • زیردامنه‌ها 39
    • Bounded Contextها 39
    • تعامل زیردامنه‌ها و Bounded Contextها 39
    • مرزها 41
    • مرزهای فیزیکی 41
    • مرزهای مالکیت 42
    • Bounded Contextها در زندگی واقعی 42
    • دامنه‌های معنایی 43
    • علم 43
    • خرید یک یخچال 44
    • نتیجه‌گیری 46
    • تمرین‌ها 46
  4. یکپارچه‌سازی Bounded Contextها — صفحهٔ 49
    • همکاری 50
    • شراکت 50
    • هستهٔ مشترک (Shared Kernel) 50
    • مشتری–تأمین‌کننده 53
    • Conformist 53
    • لایهٔ ضدفساد (Anticorruption Layer) 54
    • Open-Host Service 55
    • Separate Ways 56
    • مسائل ارتباطی 56
    • زیردامنه‌های عمومی 56
    • تفاوت‌های مدل 56
    • نقشهٔ زمینه (Context Map) 57
    • نگهداشت 58
    • محدودیت‌ها 58
    • نتیجه‌گیری 59
    • تمرین‌ها 59

بخش دوم — طراحی تاکتیکی (Tactical Design)

  1. پیاده‌سازی منطق سادهٔ کسب‌وکار — صفحهٔ 63
    • Transaction Script 63
    • پیاده‌سازی 64
    • به این سادگی هم نیست! 64
    • زمان استفاده از Transaction Script 68
    • Active Record 69
    • پیاده‌سازی 70
    • زمان استفاده از Active Record 71
    • عمل‌گرا باشید 72
    • نتیجه‌گیری 72
    • تمرین‌ها 72
  2. مواجهه با منطق پیچیدهٔ کسب‌وکار — صفحهٔ 75
    • تاریخچه 75
    • Domain Model 76
    • پیاده‌سازی 77
    • بلوک‌های سازنده 77
    • مدیریت پیچیدگی 94
    • نتیجه‌گیری 95
    • تمرین‌ها 96
  3. مدل‌سازی بُعد زمان — صفحهٔ 99
    • Event Sourcing 99
    • جست‌وجو 104
    • تحلیل 105
    • منبع حقیقت 107
    • Event Store 107
    • Event-Sourced Domain Model 108
    • مزایا 110
    • معایب 111
    • پرسش‌های متداول 112
    • کارایی 112
    • حذف داده 114
    • چرا نمی‌توانم فقط...؟ 114
    • نتیجه‌گیری 115
    • تمرین‌ها 116
  4. الگوهای معماری — صفحهٔ 117
    • منطق کسب‌وکار در برابر الگوهای معماری 117
    • معماری لایه‌ای 118
    • لایهٔ ارائه 118
    • لایهٔ منطق کسب‌وکار 119
    • لایهٔ دسترسی به داده 119
    • ارتباط بین لایه‌ها 120
    • گونهٔ دیگر 121
    • زمان استفاده از معماری لایه‌ای 124
    • Ports & Adapters 125
    • اصطلاحات 126
    • اصل وارونگی وابستگی 126
    • یکپارچه‌سازی مؤلفه‌های زیرساختی 127
    • گونه‌ها 128
    • زمان استفاده از Ports & Adapters 128
    • CQRS 128
    • مدل‌سازی چندزبانه 129
    • پیاده‌سازی 129
    • ساخت Read Modelها 130
    • چالش‌ها 132
    • تفکیک مدل 133
    • زمان استفاده از CQRS 133
    • دامنه 134
    • نتیجه‌گیری 135
    • تمرین‌ها 135
  5. الگوهای ارتباطی — صفحهٔ 137
    • ترجمهٔ مدل 137
    • ترجمهٔ بدون‌حالت مدل 138
    • ترجمهٔ حالت‌دار مدل 141
    • یکپارچه‌سازی Aggregateها 143
    • Outbox 145
    • Saga 147
    • Process Manager 150
    • نتیجه‌گیری 154
    • تمرین‌ها 154

بخش سوم — به‌کارگیری طراحی دامنه‌محور در عمل

  1. راهنماهای اکتشافی طراحی — 159
    • Heuristic 159
    • Bounded Contextها 160
    • الگوهای پیاده‌سازی منطق کسب‌وکار 161
    • الگوهای معماری 163
    • راهبرد آزمون 164
    • هرم آزمون 165
    • الماس آزمون 165
    • هرم آزمون وارونه 165
    • درخت تصمیم طراحی تاکتیکی 166
    • نتیجه‌گیری 167
    • تمرین‌ها 167
  2. تکامل تصمیم‌های طراحی — 169
    • تغییر در دامنه‌ها 169
    • Core به Generic 170
    • Generic به Core 170
    • Supporting به Generic 171
    • Supporting به Core 171
    • Core به Supporting 172
    • Generic به Supporting 172
    • ملاحظات طراحی راهبردی 172
    • ملاحظات طراحی تاکتیکی 173
    • Transaction Script به Active Record 174
    • Active Record به Domain Model 174
    • Domain Model به Event-Sourced Domain Model 176
    • تولید گذارهای گذشته 176
    • مدل‌سازی رویدادهای مهاجرت 177
    • تغییرات سازمانی 178
    • Partnership به Customer–Supplier 179
    • Customer–Supplier به Separate Ways 179
    • دانش دامنه 179
    • رشد 180
    • زیردامنه‌ها 180
    • Bounded Contextها 181
    • Aggregateها 182
    • نتیجه‌گیری 182
    • تمرین‌ها 183
  3. EventStorming — 185
    • EventStorming چیست؟ 185
    • چه کسانی باید شرکت کنند؟ 186
    • چه چیزهایی نیاز است؟ 186
    • فرایند EventStorming 187
    • گام ۱: اکتشاف بدون ساختار 187
    • گام ۲: خط‌های زمانی 188
    • گام ۳: نقاط درد 189
    • گام ۴: رویدادهای محوری 190
    • گام ۵: فرمان‌ها 190
    • گام ۶: سیاست‌ها 191
    • گام ۷: Read Modelها 192
    • گام ۸: سامانه‌های خارجی 193
    • گام ۹: Aggregateها 194
    • گام ۱۰: Bounded Contextها 194
    • گونه‌ها 195
    • زمان استفاده 196
    • نکات تسهیل‌گری 196
    • مراقب پویایی گروه باشید 197
    • EventStorming از راه دور 197
    • نتیجه‌گیری 198
    • تمرین‌ها 198
  4. DDD در دنیای واقعی — 201
    • تحلیل راهبردی 202
    • درک دامنهٔ کسب‌وکار 202
    • بررسی طراحی فعلی 203
    • راهبرد نوسازی 204
    • نوسازی راهبردی 205
    • نوسازی تاکتیکی 207
    • پرورش زبان فراگیر 207
    • DDD عمل‌گرا 210
    • فروختن ایدهٔ DDD 211
    • DDD پنهانی 211
    • نتیجه‌گیری 213
    • تمرین‌ها 214

بخش چهارم — رابطه با روش‌شناسی‌ها و الگوهای دیگر

  1. میکروسرویس‌ها — 217
    • سرویس چیست؟ 217
    • میکروسرویس چیست؟ 218
    • متد به‌عنوان سرویس: میکروسرویس کامل؟ 219
    • هدف طراحی 220
    • پیچیدگی سامانه 221
    • میکروسرویس‌ها به‌عنوان سرویس‌های عمیق 222
    • میکروسرویس‌ها به‌عنوان ماژول‌های عمیق 223
    • DDD و مرزهای میکروسرویس 225
    • Bounded Contextها 225
    • Aggregateها 227
    • زیردامنه‌ها 228
    • فشرده‌سازی واسط عمومی میکروسرویس 229
    • Open-Host Service 229
    • Anticorruption Layer 230
    • نتیجه‌گیری 231
    • تمرین‌ها 232
  2. معماری رویدادمحور — 233
    • معماری رویدادمحور 233
    • رویدادها 234
    • رویدادها، فرمان‌ها و پیام‌ها 234
    • ساختار 235
    • انواع رویداد 236
    • طراحی یکپارچه‌سازی رویدادمحور 241
    • Distributed Big Ball of Mud 241
    • کوپلینگ زمانی 242
    • کوپلینگ عملکردی 243
    • کوپلینگ پیاده‌سازی 243
    • بازآرایی یکپارچه‌سازی رویدادمحور 243
    • راهنماهای اکتشافی طراحی رویدادمحور 245
    • نتیجه‌گیری 246
    • تمرین‌ها 247
  3. Data Mesh — 249
    • مدل دادهٔ تحلیلی در برابر تراکنشی 249
    • Fact Table 250
    • Dimension Table 252
    • مدل‌های تحلیلی 253
    • سکوهای مدیریت دادهٔ تحلیلی 254
    • Data Warehouse 254
    • Data Lake 257
    • چالش‌های معماری Data Warehouse و Data Lake 258
    • Data Mesh 259
    • تجزیهٔ داده حول دامنه‌ها 259
    • داده به‌عنوان محصول 261
    • توانمندسازی خودمختاری 262
    • ساخت اکوسیستم 262
    • ترکیب Data Mesh و DDD 263
    • نتیجه‌گیری 264
    • تمرین‌ها 265
  • سخن پایانی — 267
  • ضمیمه A: به‌کارگیری DDD؛ یک مطالعهٔ موردی — 273
  • ضمیمه B: پاسخ پرسش‌های تمرینی — 289
  • منابع — 297
  • نمایه — 299

پیشگفتار — Julie Lerman

طراحی دامنه‌محور مجموعه‌ای از شیوه‌ها را برای رویکردی مشارکتی به ساخت نرم‌افزار از دید کسب‌وکار ـ یعنی دامنه و مسائلی که هدف حل آن‌هاست ـ ارائه می‌کند. این اصطلاح در سال ۲۰۰۳، هم‌زمان با انتشار کتابی از Eric Evans که در جامعهٔ DDD با محبت «کتاب آبی» (The Blue Book) نامیده می‌شود، مطرح شد. عنوان آن کتاب Domain-Driven Design: Tackling Complexity in the Heart of Software است.

هرچند هدف طراحی دامنه‌محور مقابله با پیچیدگی و فراهم کردن راهی برای رسیدن به وضوح است، ایده‌های ارزشمند فراوانی در آن وجود دارد که حتی برای پروژه‌های نرم‌افزاری کم‌پیچیده‌تر هم کاربرد دارند. DDD به ما یادآوری می‌کند که توسعه‌دهندگان نرم‌افزار تنها افراد دخیل در ساخت نرم‌افزار نیستند. متخصصان دامنه ـ کسانی که نرم‌افزار برای آن‌ها ساخته می‌شود ـ درکی حیاتی از مسائل در حال حل دارند.

در سراسر مراحل ساخت، با متخصصان دامنه شراکت ایجاد می‌کنیم. ابتدا «طراحی راهبردی» (Strategic Design) را به‌کار می‌بریم تا مسئلهٔ کسب‌وکار، یعنی دامنه، را بفهمیم و آن را به مسائل کوچک‌تر، حل‌شدنی و به‌هم‌پیوسته تقسیم کنیم. این شراکت همچنین ما را وادار می‌کند به زبان خود دامنه ارتباط برقرار کنیم، نه اینکه افراد سمت کسب‌وکار را مجبور کنیم زبان فنی نرم‌افزار را بیاموزند.

مرحلهٔ دوم یک پروژهٔ مبتنی بر DDD «طراحی تاکتیکی» (Tactical Design) است؛ جایی که یافته‌های طراحی راهبردی را به معماری و پیاده‌سازی نرم‌افزار تبدیل می‌کنیم. در اینجا نیز DDD راهنمایی و الگوهایی برای سازمان‌دهی دامنه‌ها و جلوگیری از پیچیدگی بیشتر ارائه می‌کند. طراحی تاکتیکی شراکت با متخصصان دامنه را ادامه می‌دهد؛ به‌گونه‌ای که آن‌ها حتی هنگام نگاه کردن به کدی که تیم‌های نرم‌افزاری ساخته‌اند، زبان دامنهٔ خود را تشخیص می‌دهند.

در سال‌های پس از انتشار «کتاب آبی»، نه‌تنها سازمان‌های زیادی از این ایده‌ها بهره برده‌اند، بلکه جامعه‌ای از متخصصان باتجربهٔ DDD نیز شکل گرفته است. ماهیت مشارکتی DDD باعث شده این جامعه تجربه‌ها و دیدگاه‌های خود را به اشتراک بگذارد و ابزارهایی بسازد که به تیم‌ها برای پذیرش و بهره‌گیری از این ایده‌ها کمک کند. Eric Evans در سخنرانی اصلی Explore DDD در سال ۲۰۱۹ جامعه را تشویق کرد که DDD را همچنان تکامل دهد؛ نه فقط شیوه‌های آن را، بلکه روش‌های مؤثرتر برای انتقال ایده‌هایش را نیز.

و همین موضوع مرا به دلیل علاقه‌ام به Learning Domain-Driven Design می‌رساند. من پیش‌تر از طریق سخنرانی‌های کنفرانسی و نوشته‌های دیگر Vlad طرفدار او بودم. او تجربهٔ سخت‌به‌دست‌آمدهٔ فراوانی به‌عنوان متخصص DDD در پروژه‌های عمیقاً پیچیده دارد و این دانش را سخاوتمندانه به اشتراک گذاشته است. در این کتاب، «داستان» DDD ـ نه تاریخچه‌اش، بلکه مفاهیمش ـ را از زاویه‌ای منحصربه‌فرد روایت می‌کند و دیدگاهی عالی برای یادگیری به دست می‌دهد.

کتاب برای تازه‌واردان نوشته شده، اما من با وجود سال‌ها کار با DDD و نوشتن و سخن گفتن دربارهٔ آن، از دیدگاه Vlad چیزهای زیادی یاد گرفتم. حتی پیش از انتشار کتاب مشتاق بودم در دورهٔ DDD Fundamentals خود در Pluralsight به آن ارجاع دهم و بخشی از این دیدگاه را در گفتگوهایم با مشتریان به‌کار گرفته بودم.

شروع کار با DDD می‌تواند گیج‌کننده باشد. همان‌طور که از DDD برای کاهش پیچیدگی پروژه‌ها استفاده می‌کنیم، Vlad موضوع خود DDD را نیز به شکلی ارائه می‌کند که پیچیدگی آن را کاهش می‌دهد. او فقط اصول DDD را توضیح نمی‌دهد. بخش‌های پایانی کتاب برخی شیوه‌های مهمی را که از دل DDD رشد کرده‌اند ـ مانند EventStorming ـ معرفی می‌کنند، مسئلهٔ تغییر تمرکز کسب‌وکار یا سازمان و اثر احتمالی آن بر نرم‌افزار را بررسی می‌کنند، و توضیح می‌دهند DDD چگونه با میکروسرویس‌ها هم‌راستا می‌شود و چگونه می‌توان آن را با مجموعه‌ای از الگوهای شناخته‌شدهٔ نرم‌افزار ترکیب کرد.

به باور من، Learning Domain-Driven Design مقدمه‌ای عالی برای تازه‌واردان به DDD و مطالعه‌ای بسیار ارزشمند برای متخصصان باتجربه نیز خواهد بود.

— Julie Lerman
مربی نرم‌افزار، نویسندهٔ O’Reilly و حامی دیرینهٔ DDD

مقدمهٔ نویسنده

روز شروع نخستین شغل واقعی‌ام در مهندسی نرم‌افزار را به‌وضوح به یاد دارم. هم سرخوش بودم و هم وحشت‌زده. پس از سال‌های دبیرستان که برای کسب‌وکارهای محلی نرم‌افزار می‌ساختم، مشتاق بودم یک «برنامه‌نویس واقعی» شوم و برای یکی از بزرگ‌ترین شرکت‌های برون‌سپاری کشور کد بنویسم.

در روزهای اول، همکاران جدیدم راه‌وچاه را نشانم می‌دادند. بعد از راه‌اندازی ایمیل سازمانی و کار با سامانهٔ ثبت زمان، بالاخره به بخش جالب رسیدیم: سبک و استانداردهای کدنویسی شرکت. به من گفته شد: «اینجا همیشه کد خوب‌طراحی‌شده می‌نویسیم و از معماری لایه‌ای استفاده می‌کنیم.» تعریف هر سه لایه ـ دسترسی به داده، منطق کسب‌وکار و ارائه ـ را مرور کردیم و سپس دربارهٔ فناوری‌ها و چارچوب‌های مناسب نیازهای هر لایه صحبت کردیم.

آن زمان، راهکار پذیرفته‌شده برای ذخیرهٔ داده Microsoft SQL Server 2000 بود و در لایهٔ دسترسی به داده با ADO.NET یکپارچه می‌شد. لایهٔ ارائه هم برای برنامه‌های دسکتاپ WinForms و برای وب ASP.NET WebForms را به‌کار می‌گرفت. زمان زیادی صرف این دو لایه کردیم، بنابراین وقتی لایهٔ منطق کسب‌وکار تقریباً هیچ توجهی نگرفت، سردرگم شدم:

«پس لایهٔ منطق کسب‌وکار چه؟»
«آن یکی ساده است. اینجا منطق کسب‌وکار را پیاده‌سازی می‌کنی.»
«اما منطق کسب‌وکار چیست؟»
«خب، منطق کسب‌وکار همان حلقه‌ها و دستورهای if-else است که برای پیاده‌سازی نیازمندی‌ها لازم داری.»

همان روز سفر من برای فهمیدن این‌که منطق کسب‌وکار دقیقاً چیست و چگونه باید در کدی با طراحی مناسب پیاده شود آغاز شد. بیش از سه سال طول کشید تا بالاخره پاسخ را پیدا کنم.

پاسخ در کتاب بنیادین Eric Evans، یعنی Domain-Driven Design: Tackling Complexity in the Heart of Software بود. معلوم شد اشتباه نمی‌کردم: منطق کسب‌وکار واقعاً مهم است؛ قلب نرم‌افزار است! با این حال، سه سال دیگر زمان برد تا خردی را که Eric به اشتراک گذاشته بود بفهمم. کتاب بسیار پیشرفته است و این‌که انگلیسی زبان سوم من بود هم کمکی نمی‌کرد.

در نهایت همه‌چیز سر جای خود قرار گرفت و با روش‌شناسی طراحی دامنه‌محور (DDD) کنار آمدم. اصول و الگوهای DDD، ظرافت‌های مدل‌سازی و پیاده‌سازی منطق کسب‌وکار و شیوهٔ مقابله با پیچیدگی در قلب نرم‌افزاری که می‌ساختم را آموختم. با وجود موانع، کاملاً ارزشش را داشت. ورود به DDD برای من تجربه‌ای بود که مسیر حرفه‌ای‌ام را تغییر داد.

چرا این کتاب را نوشتم

در ۱۰ سال گذشته، طراحی دامنه‌محور را در شرکت‌های مختلف به همکارانم معرفی کرده‌ام، کلاس‌های حضوری برگزار کرده‌ام و دوره‌های آنلاین تدریس کرده‌ام. نگاه آموزشی نه‌تنها دانش خودم را عمیق‌تر کرد، بلکه کمک کرد شیوهٔ توضیح دادن اصول و الگوهای DDD را بهینه کنم.

همان‌طور که معمولاً رخ می‌دهد، آموزش حتی از یادگیری هم دشوارتر است. من از طرفداران بزرگ آثار و آموزه‌های Eliyahu M. Goldratt هستم. Eliyahu می‌گفت حتی پیچیده‌ترین سامانه‌ها، اگر از زاویهٔ درست دیده شوند، ذاتاً ساده‌اند. در سال‌های تدریس DDD به‌دنبال مدلی از این روش‌شناسی بودم که سادگی ذاتی طراحی دامنه‌محور را آشکار کند.

این کتاب حاصل آن تلاش‌هاست. هدف آن دموکراتیک کردن طراحی دامنه‌محور است؛ یعنی آسان‌تر کردن فهم آن و دسترس‌پذیرتر کردن استفاده از آن. باور دارم روش‌شناسی DDD، به‌ویژه هنگام طراحی سامانه‌های نرم‌افزاری مدرن، ارزشی بسیار زیاد دارد. این کتاب ابزارهای کافی در اختیارتان می‌گذارد تا DDD را در کار روزمرهٔ خود به‌کار بگیرید.

چه کسانی باید این کتاب را بخوانند

به باور من، شناخت اصول و الگوهای طراحی دامنه‌محور برای مهندسان نرم‌افزار در همهٔ سطوح ـ junior، senior، staff و principal ـ مفید است. DDD فقط ابزارها و تکنیک‌هایی برای مدل‌سازی و پیاده‌سازی مؤثر نرم‌افزار ارائه نمی‌کند؛ بلکه جنبه‌ای از مهندسی نرم‌افزار را که اغلب نادیده گرفته می‌شود روشن می‌کند: «زمینه» (Context).

وقتی مسئلهٔ کسب‌وکاری سامانه را می‌شناسید، در انتخاب راهکار مناسب بسیار مؤثرتر خواهید بود؛ راهکاری که نه کمتر از نیاز مهندسی شده باشد و نه بیش از حد، بلکه نیازها و اهداف کسب‌وکار را پاسخ دهد.

طراحی دامنه‌محور برای معماران نرم‌افزار اهمیت بیشتری دارد و برای کسانی که می‌خواهند معمار نرم‌افزار شوند حتی مهم‌تر است. ابزارهای تصمیم‌گیری طراحی راهبردی آن کمک می‌کند یک سامانهٔ بزرگ را به مؤلفه‌ها ـ سرویس‌ها، میکروسرویس‌ها یا زیرسامانه‌ها ـ تجزیه کنید و نحوهٔ یکپارچه شدن این مؤلفه‌ها برای تشکیل کل سامانه را طراحی کنید.

در نهایت، در این کتاب نه‌فقط دربارهٔ طراحی نرم‌افزار، بلکه دربارهٔ هم‌تکامل دادن طراحی با تغییرات زمینهٔ کسب‌وکار صحبت خواهیم کرد. این جنبهٔ حیاتی مهندسی نرم‌افزار کمک می‌کند طراحی سامانه در گذر زمان «سرحال» بماند و به یک Big Ball of Mud تبدیل نشود.

راهنمای حرکت در کتاب

کتاب به چهار بخش تقسیم شده است: طراحی راهبردی، طراحی تاکتیکی، DDD در عمل، و رابطهٔ DDD با روش‌شناسی‌ها و الگوهای دیگر. در بخش اول، ابزارها و تکنیک‌های تصمیم‌گیری طراحی در مقیاس بزرگ را بررسی می‌کنیم. در بخش دوم، تمرکز روی کد و روش‌های مختلف پیاده‌سازی منطق کسب‌وکار است. بخش سوم تکنیک‌ها و راهبردهای به‌کارگیری DDD در پروژه‌های واقعی را بررسی می‌کند. بخش چهارم بحث طراحی دامنه‌محور را در زمینهٔ روش‌شناسی‌ها و الگوهای دیگر ادامه می‌دهد.

خلاصهٔ فصل‌ها:

  • فصل ۱ زمینهٔ یک پروژهٔ مهندسی نرم‌افزار ـ دامنهٔ کسب‌وکار، اهداف آن و نحوهٔ پشتیبانی نرم‌افزار از آن‌ها ـ را بنا می‌کند.
  • فصل ۲ مفهوم «زبان فراگیر» (Ubiquitous Language)، شیوهٔ DDD برای ارتباط و اشتراک دانش مؤثر، را معرفی می‌کند.
  • فصل ۳ نحوهٔ مقابله با پیچیدگی دامنه‌های کسب‌وکار و طراحی مؤلفه‌های معماری سطح‌بالای سامانه، یعنی Bounded Contextها، را بررسی می‌کند.
  • فصل ۴ الگوهای مختلف سازمان‌دهی ارتباط و یکپارچه‌سازی میان Bounded Contextها را بررسی می‌کند.
  • فصل ۵ بحث الگوهای پیاده‌سازی منطق کسب‌وکار را با دو الگوی مناسب منطق ساده آغاز می‌کند.
  • فصل ۶ از منطق ساده به منطق پیچیده می‌رود و الگوی Domain Model را برای مقابله با پیچیدگی معرفی می‌کند.
  • فصل ۷ بُعد زمان را اضافه می‌کند و روش پیشرفته‌تری برای مدل‌سازی و پیاده‌سازی منطق کسب‌وکار، یعنی Event-Sourced Domain Model، معرفی می‌کند.
  • فصل ۸ سطح نگاه را بالاتر می‌برد و سه الگوی معماری برای ساختاربندی مؤلفه‌ها را شرح می‌دهد.
  • فصل ۹ الگوهای لازم برای هماهنگ‌سازی کار مؤلفه‌های سامانه را ارائه می‌کند.
  • فصل ۱۰ الگوهای فصل‌های قبل را به مجموعه‌ای از قواعد سادهٔ راهنما تبدیل می‌کند که تصمیم‌گیری طراحی را روان‌تر می‌کنند.
  • فصل ۱۱ طراحی نرم‌افزار را از منظر زمان و چگونگی تغییر و تکامل آن در طول عمر بررسی می‌کند.
  • فصل ۱۲ EventStorming را معرفی می‌کند؛ کارگاهی کم‌فناوری برای اشتراک مؤثر دانش، ساخت درک مشترک و طراحی نرم‌افزار.
  • فصل ۱۳ دشواری‌های معرفی DDD به پروژه‌های Brownfield را بررسی می‌کند.
  • فصل ۱۴ رابطهٔ سبک معماری میکروسرویس با DDD را توضیح می‌دهد: تفاوت‌ها و نقاط مکمل.
  • فصل ۱۵ الگوها و ابزارهای DDD را در زمینهٔ معماری رویدادمحور بررسی می‌کند.
  • فصل ۱۶ بحث را از سامانه‌های عملیاتی به سامانه‌های مدیریت دادهٔ تحلیلی می‌برد و تعامل DDD با معماری Data Mesh را بررسی می‌کند.

همهٔ این فصل‌ها با تعدادی سؤال تمرینی پایان می‌یابند تا یادگیری تقویت شود. برخی پرسش‌ها از شرکت خیالی «WolfDesk» برای نمایش جنبه‌های مختلف DDD استفاده می‌کنند. توضیح زیر را بخوانید و هنگام پاسخ به تمرین‌های مرتبط به آن بازگردید.

دامنهٔ نمونه: WolfDesk

WolfDesk یک سامانهٔ مدیریت تیکت‌های میز خدمت را به‌صورت سرویس ارائه می‌کند. اگر شرکت نوپای شما نیاز دارد به مشتریانش پشتیبانی ارائه دهد، با راهکار WolfDesk می‌توانید در زمان کوتاهی کار را آغاز کنید.

مدل پرداخت WolfDesk با رقبا متفاوت است. به‌جای دریافت هزینه به‌ازای هر کاربر، به مستأجران (Tenants) اجازه می‌دهد هر تعداد کاربر که نیاز دارند ایجاد کنند و هزینه بر اساس تعداد تیکت‌های پشتیبانی بازشده در هر دورهٔ صورتحساب محاسبه می‌شود. حداقل هزینه‌ای وجود ندارد و برای آستانه‌های مشخصی از حجم تیکت ماهانه تخفیف خودکار اعمال می‌شود: ۱۰٪ برای بیش از ۵۰۰ تیکت، ۲۰٪ برای بیش از ۷۵۰ تیکت و ۳۰٪ برای بیش از ۱۰۰۰ تیکت در ماه.

برای جلوگیری از سوءاستفادهٔ مستأجران از مدل کسب‌وکار، الگوریتم چرخهٔ عمر تیکت WolfDesk تضمین می‌کند تیکت‌های غیرفعال به‌صورت خودکار بسته شوند؛ در نتیجه مشتریان تشویق می‌شوند برای نیازهای بعدی تیکت جدید باز کنند. افزون بر این، WolfDesk سامانهٔ تشخیص تقلبی دارد که پیام‌ها را تحلیل می‌کند و مواردی را که موضوعات نامرتبط در یک تیکت واحد مطرح شده‌اند تشخیص می‌دهد.

برای روان‌تر کردن کارهای پشتیبانی مستأجران، WolfDesk قابلیت «خلبان خودکار پشتیبانی» (Support Autopilot) را پیاده‌سازی کرده است. خلبان خودکار تیکت‌های جدید را تحلیل می‌کند و می‌کوشد از تاریخچهٔ تیکت‌های همان مستأجر راه‌حل سازگار پیدا کند. این قابلیت طول عمر تیکت‌ها را باز هم کاهش می‌دهد و مشتریان را به باز کردن تیکت تازه برای سؤال‌های بعدی تشویق می‌کند.

WolfDesk همهٔ استانداردها و تدابیر امنیتی لازم برای احراز هویت و مجوزدهی کاربران مستأجران را در خود دارد و همچنین به مستأجران اجازه می‌دهد ورود یکپارچه (Single Sign-On یا SSO) را با سامانه‌های مدیریت کاربر موجود خود پیکربندی کنند.

رابط مدیریتی به مستأجران اجازه می‌دهد مقادیر ممکن برای دسته‌بندی تیکت‌ها و نیز فهرست محصولاتی را که آن مستأجر پشتیبانی می‌کند تنظیم کنند.

برای آن‌که تیکت‌های جدید فقط در ساعات کاری عاملان پشتیبانی به آن‌ها مسیریابی شوند، WolfDesk امکان ثبت برنامهٔ شیفت هر عامل را فراهم می‌کند.

از آنجا که WolfDesk سرویس خود را بدون حداقل هزینه ارائه می‌کند، باید زیرساختش را طوری بهینه کند که هزینهٔ وارد کردن یک مستأجر جدید کمینه شود. برای این کار از رایانش بدون‌سرور (Serverless Computing) استفاده می‌کند تا منابع محاسباتی بر اساس عملیات انجام‌شده روی تیکت‌های فعال به‌صورت کشسان مقیاس پیدا کنند.

قراردادهای نگارشی استفاده‌شده در کتاب

کتاب از قراردادهای تایپوگرافی زیر استفاده می‌کند:

  • Italic: نشان‌دهندهٔ اصطلاحات جدید، URLها، نشانی‌های ایمیل، نام فایل‌ها و پسوند فایل‌هاست.
  • Constant width: برای فهرست‌های کد و نیز اشارهٔ درون‌پاراگرافی به عناصر برنامه مانند نام متغیر یا تابع، پایگاه داده، نوع داده، متغیر محیطی، عبارت‌ها و کلیدواژه‌ها استفاده می‌شود.

استفاده از نمونه‌کدها

مطالب تکمیلی، شامل نمونه‌کدها، تمرین‌ها و موارد مشابه، در وب‌سایت کتاب ارائه شده‌اند: learning-ddd.com. تمام نمونه‌کدهای ارائه‌شده در کتاب با زبان C# پیاده‌سازی شده‌اند. به‌طور معمول نمونه‌کدهای فصل‌ها گزیده‌هایی هستند که برای نمایش مفاهیم مورد بحث انتخاب شده‌اند.

البته مفاهیم و تکنیک‌های کتاب به زبان C# یا رویکرد برنامه‌نویسی شیءگرا محدود نیستند. همهٔ آن‌ها برای زبان‌ها و پارادایم‌های برنامه‌نویسی دیگر نیز مرتبط‌اند. بنابراین می‌توانید نمونه‌های کتاب را در زبان دلخواه خود پیاده‌سازی کنید و با نویسنده به اشتراک بگذارید؛ او از افزودن آن‌ها به وب‌سایت کتاب استقبال می‌کند.

اگر دربارهٔ نمونه‌کدها پرسش فنی یا مشکلی دارید، می‌توانید با bookquestions@oreilly.com تماس بگیرید.

هدف کتاب کمک به انجام کار شماست. در حالت کلی، اگر نمونه‌کدی همراه کتاب ارائه شده باشد، می‌توانید آن را در برنامه‌ها و مستندات خود استفاده کنید و مگر در حال بازتولید بخش قابل‌توجهی از کد باشید نیازی به درخواست اجازه ندارید. برای مثال، نوشتن برنامه‌ای که از چند قطعهٔ کد کتاب استفاده می‌کند به مجوز جداگانه نیاز ندارد. اما فروش یا توزیع نمونه‌های کتاب‌های O’Reilly نیازمند مجوز است. پاسخ دادن به یک سؤال با استناد به کتاب و نقل نمونه‌کد نیازمند مجوز نیست. وارد کردن مقدار قابل‌توجهی از کد کتاب در مستندات محصول، نیاز به مجوز دارد.

ذکر منبع مورد قدردانی است، هرچند معمولاً الزامی نیست. یک نمونهٔ انتساب: «Learning Domain-Driven Design by Vlad Khononov (O’Reilly). Copyright 2022 Vladislav Khononov, 978-1-098-10013-1.» اگر استفاده از نمونه‌کدها خارج از Fair Use یا مجوز ارائه‌شده باشد، نشانی تماس ناشر: permissions@oreilly.com.

O’Reilly Online Learning

بیش از ۴۰ سال است که O’Reilly Media آموزش، دانش و بینش در حوزه‌های فناوری و کسب‌وکار ارائه می‌کند تا به موفقیت شرکت‌ها کمک کند.

شبکهٔ منحصربه‌فرد متخصصان و نوآوران O’Reilly دانش و تجربهٔ خود را از طریق کتاب‌ها، مقاله‌ها و سکوی یادگیری آنلاین این شرکت به اشتراک می‌گذارند. سکوی یادگیری آنلاین O’Reilly دسترسی درخواستی به دوره‌های آموزشی زنده، مسیرهای یادگیری عمیق، محیط‌های تعاملی برنامه‌نویسی و مجموعهٔ گسترده‌ای از متن و ویدئو از O’Reilly و بیش از ۲۰۰ ناشر دیگر می‌دهد. نشانی مرجع در نسخهٔ اصلی: oreilly.com.

نحوهٔ تماس

دیدگاه‌ها و پرسش‌های مربوط به کتاب را می‌توان برای ناشر ارسال کرد:

O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 (United States or Canada)
707-829-0515 (international or local)
707-829-0104 (fax)

صفحهٔ کتاب در نسخهٔ اصلی برای خطاها، مثال‌ها و اطلاعات تکمیلی: oreil.ly/lddd. ایمیل پرسش‌های فنی و نظرها: bookquestions@oreilly.com. منابع اجتماعی درج‌شده در کتاب: Facebook: facebook.com/oreilly، Twitter: twitter.com/oreillymedia، YouTube: youtube.com/oreillymedia.

۱ هرگاه نویسنده از یک گروه افراد نام می‌برد، فهرست بر اساس ترتیب الفبایی نام خانوادگی تنظیم شده است.

سپاسگزاری‌ها

این کتاب در ابتدا با عنوان «What Is Domain-Driven Design?» منتشر شده بود و در سال ۲۰۱۹ به‌صورت یک گزارش انتشار یافت. بدون آن گزارش، Learning Domain-Driven Design شکل نمی‌گرفت؛ بنابراین نویسنده از Chris Guzikowski، Ryan Shaw و Alicia Young که شکل‌گیری آن گزارش را ممکن کردند تشکر می‌کند.

این کتاب بدون Melissa Duffield، مدیر محتوا و مسئول Diversity Talent در O’Reilly، نیز ممکن نبود؛ او از پروژه حمایت کرد و باعث شد به نتیجه برسد. نویسنده از Melissa برای همهٔ کمک‌هایش تشکر می‌کند.

Jill Leonard ویراستار توسعه، مدیر پروژه و مربی اصلی کتاب بود. نقش او در این اثر بسیار بزرگ بود. نویسنده از Jill بابت تلاش و کمک فراوانش ـ و به‌ویژه حفظ انگیزهٔ او حتی در زمانی که به تغییر نام و پنهان شدن در کشوری دیگر فکر می‌کرد ـ تشکر می‌کند.

سپاس فراوان از تیم تولید که کتاب را نه‌فقط قابل‌نوشتن بلکه خواندنی کرد: Kristen Brown، Audrey Doyle، Kate Dullea، Robert Romano و Katherine Tozer. نویسنده همچنین از تمام تیم O’Reilly برای کار عالی‌شان تشکر می‌کند و همکاری با آن‌ها را تحقق یک رؤیا می‌داند.

از همهٔ افرادی که نویسنده با آن‌ها مصاحبه یا مشورت کرده نیز تشکر شده است: Zsofia Herendi، Scott Hirleman، Trond Hjorteland، Mark Lisker، Chris Richardson، Vaughn Vernon و Ivan Zakrevsky؛ برای خردشان و حضورشان در زمان نیاز.

تشکر ویژه از تیم بازبینان که پیش‌نویس‌های اولیه را خواندند و به شکل‌گیری نسخهٔ نهایی کمک کردند: Julie Lerman، Ruth Malan، Diana Montalion، Andrew Padilla، Rodion Promyshlennikov، Viktor Pshenitsyn، Alexei Torunov، Nick Tune، Vasiliy Vasilyuk و Rebecca Wirfs-Brock. حمایت، بازخورد و نقد آن‌ها بسیار مؤثر بود.

همچنین از Kenny Baas-Schwegler، Alberto Brandolini، Eric Evans، Marco Heimeshoff، Paul Rayner، Mathias Verraes و باقی جامعهٔ شگفت‌انگیز طراحی دامنه‌محور تشکر شده است. نویسنده آن‌ها را معلمان و مربیان خود می‌داند و از اشتراک دانش در شبکه‌های اجتماعی، وبلاگ‌ها و کنفرانس‌ها سپاسگزاری می‌کند.

بیشترین دین نویسنده به همسر عزیزش Vera است که همیشه از پروژه‌های عجیب او حمایت کرده و تلاش کرده عوامل حواس‌پرتی را از مسیر نوشتن دور کند. نویسنده قول می‌دهد بالاخره زیرزمین را مرتب کند و می‌گوید این اتفاق به‌زودی خواهد افتاد.

در پایان، کتاب به Galina Ivanovna Tyumentseva تقدیم شده است؛ کسی که در این پروژه حمایت فراوانی از نویسنده کرد و متأسفانه در هنگام نگارش کتاب از دنیا رفت. نویسنده می‌گوید همیشه او را به یاد خواهند داشت.

#AdoptDontShop

درآمد (Introduction)

مهندسی نرم‌افزار دشوار است. برای موفقیت در آن باید پیوسته یاد بگیریم؛ چه امتحان کردن زبان‌های جدید باشد، چه بررسی فناوری‌های تازه یا همراه ماندن با چارچوب‌های محبوب جدید. با این حال، یاد گرفتن یک چارچوب JavaScript تازه در هر هفته سخت‌ترین بخش کار ما نیست. فهمیدن دامنه‌های کسب‌وکار جدید می‌تواند بسیار چالش‌برانگیزتر باشد.

در طول مسیر حرفه‌ای، عجیب نیست که مجبور شویم برای طیف متنوعی از دامنه‌های کسب‌وکار نرم‌افزار بسازیم: سامانه‌های مالی، نرم‌افزار پزشکی، خرده‌فروشی آنلاین، بازاریابی و بسیاری حوزه‌های دیگر. از یک جهت، همین موضوع شغل ما را از بسیاری حرفه‌های دیگر متمایز می‌کند. افرادی که در حوزه‌های دیگر کار می‌کنند اغلب وقتی می‌فهمند مهندسی نرم‌افزار ـ به‌ویژه هنگام تغییر محل کار ـ تا چه اندازه یادگیری می‌طلبد، شگفت‌زده می‌شوند.

نفهمیدن دامنهٔ کسب‌وکار به پیاده‌سازی کم‌بهینهٔ نرم‌افزار کسب‌وکاری منجر می‌شود. متأسفانه این مسئله بسیار رایج است. طبق پژوهش‌ها، حدود ۷۰٪ پروژه‌های نرم‌افزاری در زمان مقرر، در بودجهٔ مقرر یا مطابق نیازمندی‌های مشتری تحویل نمی‌شوند. به بیان دیگر، اکثریت بزرگ پروژه‌های نرم‌افزاری شکست می‌خورند.

این مسئله آن‌قدر عمیق و فراگیر است که اصطلاحی برای آن داریم: «بحران نرم‌افزار» (Software Crisis). اصطلاح بحران نرم‌افزار در سال ۱۹۶۸ مطرح شد. طبیعی است تصور کنیم در بیش از ۵۰ سال پس از آن اوضاع بهتر شده باشد. در این سال‌ها رویکردها، روش‌شناسی‌ها و رشته‌های گوناگونی برای مؤثرتر کردن مهندسی نرم‌افزار معرفی شدند: Agile Manifesto، Extreme Programming، Test-Driven Development، زبان‌های سطح‌بالا، DevOps و موارد دیگر. با این حال، وضعیت آن‌قدرها تغییر نکرده است. پروژه‌ها هنوز هم زیاد شکست می‌خورند و بحران نرم‌افزار همچنان وجود دارد.

۱ «Software Engineering.» گزارشی از کنفرانسی با حمایت NATO Science Committee، در Garmisch آلمان، 7–11 اکتبر 1968.

پژوهش‌های زیادی برای بررسی علت شکست‌های رایج پروژه‌ها انجام شده است. پژوهشگران نتوانسته‌اند یک علت واحد را مشخص کنند، اما بیشتر یافته‌ها موضوع مشترکی دارند: ارتباطات (Communication).

مشکلات ارتباطی که پروژه‌ها را از مسیر خارج می‌کنند می‌توانند به شکل‌های مختلف ظاهر شوند؛ برای نمونه، نیازمندی‌های مبهم، اهداف نامشخص پروژه یا هماهنگی ناکارآمد تلاش‌ها میان تیم‌ها. با این حال، در طول سال‌ها تلاش کرده‌ایم ارتباطات درون‌تیمی و بین‌تیمی را با ایجاد فرصت‌ها، فرایندها و رسانه‌های ارتباطی تازه بهبود دهیم. متأسفانه نرخ موفقیت پروژه‌ها هنوز تغییر چشمگیری نکرده است.

طراحی دامنه‌محور (DDD) پیشنهاد می‌کند ریشهٔ شکست پروژه‌های نرم‌افزاری از زاویه‌ای متفاوت هدف قرار گیرد. ارتباط مؤثر موضوع مرکزی ابزارها و شیوه‌های DDD است که در این کتاب خواهید آموخت. DDD را می‌توان به دو بخش تقسیم کرد: راهبردی و تاکتیکی.

ابزارهای راهبردی DDD برای تحلیل دامنه‌ها و راهبرد کسب‌وکار و نیز ساخت یک درک مشترک از کسب‌وکار میان ذی‌نفعان مختلف استفاده می‌شوند. همچنین از این دانش دامنه برای هدایت تصمیم‌های طراحی سطح‌بالا استفاده خواهیم کرد: تجزیهٔ سامانه‌ها به مؤلفه‌ها و تعریف الگوهای یکپارچه‌سازی آن‌ها.

ابزارهای تاکتیکی DDD جنبهٔ دیگری از مشکلات ارتباطی را هدف می‌گیرند. الگوهای تاکتیکی DDD به ما امکان می‌دهند کد را به شکلی بنویسیم که دامنهٔ کسب‌وکار را بازتاب دهد، اهداف آن را پاسخ دهد و به زبان کسب‌وکار سخن بگوید.

الگوها و شیوه‌های راهبردی و تاکتیکی DDD هر دو طراحی نرم‌افزار را با دامنهٔ کسب‌وکار آن هم‌راستا می‌کنند. نام روش هم از همین‌جا می‌آید: طراحی نرم‌افزار که از دامنهٔ کسب‌وکار هدایت می‌شود.

طراحی دامنه‌محور نمی‌تواند دانش کتابخانه‌های جدید JavaScript را مانند فیلم The Matrix مستقیماً در مغز شما نصب کند. اما با آسان‌تر کردن فرایند فهم دامنه‌های کسب‌وکار و هدایت تصمیم‌های طراحی بر اساس راهبرد کسب‌وکار، شما را به مهندس نرم‌افزار مؤثرتری تبدیل می‌کند. همان‌طور که در فصل‌های بعد می‌آموزید، هرچه ارتباط طراحی نرم‌افزار با راهبرد کسب‌وکار محکم‌تر باشد، نگهداری و تکامل سامانه برای پاسخ به نیازهای آیندهٔ کسب‌وکار آسان‌تر خواهد شد و در نهایت پروژه‌های نرم‌افزاری موفق‌تری به دست می‌آید.

سفر DDD را با بررسی الگوها و شیوه‌های طراحی راهبردی آغاز کنیم.

۲ منابع نمونهٔ اشاره‌شده در متن اصلی: Kaur, Rupinder & Dr. Jyotsna Sengupta (2013), “Software Process Models and Analysis on Failure of Software Development Projects”; و Sudhakar, Goparaju Purna (2012), “A Model of Critical Success Factors for Software Projects,” Journal of Enterprise Information Management 25(6), 537–558.

بخش اول — طراحی راهبردی (Strategic Design)

«صحبت کردن دربارهٔ راه‌حل، پیش از آن‌که بر سر مسئله توافق کرده باشیم، معنایی ندارد؛ و صحبت کردن دربارهٔ گام‌های پیاده‌سازی پیش از آن‌که بر سر راه‌حل توافق کرده باشیم نیز بی‌معناست.»— Efrat Goldratt-Ashlag

روش‌شناسی طراحی دامنه‌محور (DDD) را می‌توان به دو بخش اصلی تقسیم کرد: طراحی راهبردی و طراحی تاکتیکی. جنبهٔ راهبردی DDD به پاسخ دادن به سؤال‌های «چه؟» و «چرا؟» می‌پردازد: چه نرم‌افزاری می‌سازیم و چرا آن را می‌سازیم. بخش تاکتیکی دربارهٔ «چگونه؟» است: هر مؤلفه چگونه پیاده‌سازی می‌شود.

سفر را با بررسی الگوها و اصول طراحی راهبردی در DDD آغاز می‌کنیم:

  • فصل ۱: تحلیل راهبرد کسب‌وکار شرکت؛ این‌که چه ارزشی به مصرف‌کنندگان ارائه می‌دهد و چگونه با شرکت‌های دیگر صنعت رقابت می‌کند. بلوک‌های کسب‌وکاری ریزدانه‌تر را شناسایی می‌کنیم، ارزش راهبردی آن‌ها را ارزیابی می‌کنیم و اثر آن‌ها بر تصمیم‌های مختلف طراحی نرم‌افزار را تحلیل خواهیم کرد.
  • فصل ۲: شیوهٔ اساسی DDD برای به‌دست آوردن درک از دامنهٔ کسب‌وکار، یعنی زبان فراگیر (Ubiquitous Language)، معرفی می‌شود. می‌آموزید چگونه زبان فراگیر را پرورش دهید و برای ایجاد درکی مشترک میان تمام ذی‌نفعان پروژه از آن استفاده کنید.
  • فصل ۳: ابزار بنیادی دیگری از DDD، یعنی الگوی Bounded Context، بررسی می‌شود. می‌آموزید چرا این ابزار برای پرورش زبان فراگیر ضروری است و چگونه دانش کشف‌شده را با آن به مدلی از دامنهٔ کسب‌وکار تبدیل کنید. در نهایت از Bounded Contextها برای طراحی مؤلفه‌های درشت‌دانهٔ سامانهٔ نرم‌افزاری استفاده می‌کنیم.
  • فصل ۴: محدودیت‌های فنی و اجتماعی مؤثر بر یکپارچه‌سازی مؤلفه‌های سامانه و الگوهای یکپارچه‌سازی متناسب با موقعیت‌ها و محدودیت‌های مختلف بررسی می‌شوند. همچنین اثر هر الگو بر همکاری میان تیم‌های توسعه و طراحی API مؤلفه‌ها تحلیل می‌شود. فصل با معرفی Context Map پایان می‌یابد؛ نشانه‌گذاری گرافیکی‌ای که ارتباط میان Bounded Contextهای سامانه را ترسیم می‌کند و نمایی از بالا از چشم‌انداز یکپارچه‌سازی و همکاری پروژه ارائه می‌دهد.

۱ Goldratt-Ashlag, E. (2010). “The Layers of Resistance—The Buy-In Process According to TOC.”

امتیاز کاربران به این مقاله

☆☆☆☆☆

0 نفر امتیاز داده اند. میانگین: 0.0 از 5

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

0 / 500