آموزش Domain Driven Design - دانایی در برابر جهالت!

بیشتر برنامه نویسان تازه کار، فرض می کنند توسعه نرم افزار فقط تایپ کد است و زمانی که تجربه بیشتری در تایپ کردن کد بدست می آورند و با کلیدهای میانبر بیشتری از IDE آشنا می شوند و فریمورک ها و کتابخانه ها را بهتر درک می کنند، تصور می کنند تبدیل به توسعه دهندگان نینجا شده اند و می توانند نرم افزاری مانند اینستاگرام را در چندین روز بنویسند!

اما واقعیت کاملا متفاوت است. پس از کسب مقداری تجربه و بعد از گذران چندین ماه یا حتی سال که ددلاین های غیر ممکن و اهداف غیر واقع بینانه را می بینند، افراد شروع به کم کردن سرعتشان می کنند. افراد شروع به درک این موضوع می کنند که نوشتن سریع کد بعد از دریافت یک مساله جدید احتمالا بهترین ایده نیست. غرق شدن در راه حل بجای درک صحیح مساله، بی اعتنایی به پیچیدگی های ضروری و اعمال سوگیری های شناختی، همه این فاکتورها در زمان توسعه نرم افزار تاثیر می گذارند. به محض کسب تجربه بیشتر و فراگیری از اشتباهات گذشته خودمان یا دیگران، خواهیم آموخت که ضروری ترین بخش نوشتن کد مفید و نرم افزار سودمند، دانایی در مورد فضای مساله ای (problem space) است که برای آن در حال ایجاد یک راه حل هستیم.

دانایی در مورد دامین

همه دانش ها به یک اندازه در زمان ساخت یک فرایند نرم افزاری مهم و موثر نیستند. دانستن چگونگی کدنویسی با جاوا در دامین های مالی ممکن است تاثیر چندانی در نوشتن اپ iOS برای مدیریت بنگاه املاک نداشته باشد. البته قواعدی مانند clean code، DRY و ... با هر زبان برنامه نویسی که کار کنید، قطعا مفید خواهد بود. اما دانایی در مورد یک دامین ممکن است کاملا با نیازمندی های شما برای یک دامین دیگر متفاوت باشد.

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

تمام این موارد در فضای مساله هستند. اگر قادر نباشید تا حداقل اصطلاح فضای مساله را درک کنید، صحبت با کاربران آینده شما سخت یا غیرممکن خواهد بود. اگر مشکل عدم شناخت دامنه را داشته باشید، تنها منبع اطلاعاتی شما لیست خصوصیات سیستم (specification list) خواهد بود. اما در صورت شناخت دامین، یکی از اثرات، ایجاد اعتماد بین کاربر و برنامه نویس خواهد بود. وقتی این اعتماد ایجاد می شود، برنامه نویس بینش بهتری از مساله دریافت می کند و اشتباهاتش آسانتر بخشیده می گردد. با صحبت در مورد دامین با متخصصین دامین (domain experts) (کاربران سیستم یا مشتریان)، همچنین اعتبار دریافت می کنید و آنها به شما بعنوان همکار نگاه می کنند.

دستیابی به این دانش، کار آسانی نیست. افراد در دامین های خودشان با گذر زمان زیادی متخصص شده اند و آنها توسط این تخصص گذران زندگی می کنند. توسعه دهندگان نرم افزار یا آنالیزورهای کسب و کار، کار دیگری انجام می دهند و آن دامین مشخص ممکن است برای آنها کم شناخته شده باشد یا بطور کامل ناشناخته باشد.

هنر اصلی در دستیابی به دانش دامین از طریق همکاری موثر می باشد. متخصصین دامنه، منبع بی نهایت اعتماد در آن دامنه هستند. با این وجود، آنها ممکن است اینطور نباشند! برخی از سازمان ها، دانش را قطعه بندی می کنند و ممکن است تکه هایی از اطلاعات مورد انتظار شما در هر بخش از سازمان باشد که وظیفه شما دیدن همان تکه هاست.

توصیه کلی در اینجا، صحبت با تعداد زیادی از افراد در داخل دامین است. از مدیریت کل مجموعه گرفته تا دامین های زیر مجموعه. در زیر تعدادی از راهها برای دستیابی به این دانش اشاره شده است:

  • صحبت کردن، محبوب ترین روش است که می تواند در قالب جلسات متعدد باشد. با این وجود، این صحبت ها ممکن است در صورتی که خروجی واضحی نداشته باشد، شما را به بیراهه ببرد. اما هنوز هم در همین صحبت ها ارزش هایی از دامین نهفته است. نیاز دارید تا به دقت گوش دهید و سوالات زیادی بپرسید تا این ارزش ها نمایان شوند.
  • مشاهده نیز یک تکنیک بسیار قدرتمند است. افراد حوزه نرم افزار نیاز دارند تا با درونگرایی خود مقابله کنند، از برج امنیت خود بیرون بیایند و به طبقه خرید و فروش، انبار، لابی هتل یا هرجایی که کسب و کار در آن فعال است وارد شوند. سپس با مردم صحبت کنند و ببینند آنها چگونه کار می کنند.
  • داستان سرایی در مورد دامین، تکنیکی است که توسط گرف ها، فلش ها و مقدار کمی متن همراه با شمارش به ترتیبت عملیات بوجود می آید تا تعاملات مختلف داخل دامین را تشریح کند. این روش، معمولا آسان بوده و نیاز به توضیح فراوانی برای افراد مختلف درگیر در پروژه ندارد.
  • طوفان فکری. طوفان فکری از یادداشت کن و یک رول کاغذ تشکیل می شود که تمام فعالیت های موجود در دامین را به شکلی متناسب مدل سازی می کند. این روش اجازه می دهد تا فعالیت ها، جریان های کاری، فرایندهای کسب و کار و... را کشف کنید. اغلب، این روش همچنین باعث در معرض قرار گرفتن ابهامات، فرضیات، اصطلاحات نامشهود، سردرگمی ها و بعضی وقت ها تداخلات و ناراحتی ها می گردد. به طور خلاصه، هر چیزی که در دانش دامین وجود دارد! در بخش های بعدی به طور مفصل در مورد این روش صحبت خواهیم کرد.


پرهیز از جهالت...

فیلیپ آرمور مقاله ای در سال 2000 با نام 5 سطح جهالت (five orders of ignorance) منتشر کرد. این مقاله نشان می دهد که افزایش دانش دامین و کاهش جهالت در مورد دامین، دو کلید اساسی برای ساخت نرم افزار سودمند است.

این مقاله بر روی جهالت از دامین صحبت می کند و 5 سطح از آن را معرفی می کند:

  • سطح صفر جهالت که عدم جهالت است. در این سطح شما هیچ جهالتی نسبت به دامین ندارید و بیشتر دانش در مورد آن چیزی که باید بدانید را دارا هستید.
  • اولین سطح جهالت، عدم دانش است. زمانی رخ می دهد که چیزی نمی دانید اما این ندانستن را قبول کردید و می دانید که نمی دانید. شما می خواهید که دانش بیشتری کسب کنید و جهالت خود را به سطح صفر برسانید، بنابراین کانال هایی برای دستیابی به این دانش در اختیار دارید.
  • دومین سطح، عدم آگاهی است. زمانی که نمی دانید که نمی دانید! غالبا زمانی رخ می دهد که یک لیست خصوصیات دریافت می کنید که راه حل را شرح داده است، بدون اینکه مشخص کند این راه حل تلاش می کند کدام مشکل را رفع کند. این سطح همچنین زمانی دیده می شود که افراد تظاهر به صلاحیت داشتن در مورد مساله ای می کنند که در واقع صلاحیت آن را ندارند، و حتی نسبت به آن بی اطلاع هستند. بسیاری از تصمیمات غلط در این سطح از جهالت رخ می دهد.
  • سطح سوم، عدم پردازش است. در این مرحله، حتی نمی دانید که چگونه باید نسبت به عدم آگاهی خود مطلع شوید. در واقع راهی برای اینکه تشخیص دهید نمی دانید که چه چیزی را نمی دانید، یافت نمی کنید. در این مرحله انجام هر چیزی بسیار مشکل است چرا که ظاهرا هیچ راهی برای دسترسی به کاربران نهایی وجود ندارد. حتی امکان اینکه از آنها بپرسید که درک شما از مساله آنها صحیح هست یا خیر تا بتوانید وارد مرحله عدم آگاهی بشوید نیز وجود ندارد. در این مرحله تقریبا فهم مساله ای که می خواهید آن را حل کنید نیز غیر ممکن است.
  • سطح چهارم، فرا جهالت است. این اتفاق زمانی رخ می دهد که شما چیزی در مورد 5 سطح جهالت نمی دانید!

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

جهالت در مراحل آغازین، در بالاترین سطح قرار می گیرد.
جهالت در مراحل آغازین، در بالاترین سطح قرار می گیرد.

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

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