تاملات گاه گاه یک توسعه دهنده نرم افزار

مجمع الجزایر تحلیل، توسعه، تست!

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

 

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

 

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

 

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

 

اگر هوای یک جزیره طوفانی شود از آسمان سیل ببارد و به شرایط طاقت‌فرسایی گرفتار شوند، کسی از جزایر بغلی، محلی به آنها نخواهد گذاشت و اینطور نیست که به قول سعدی «دگر عضوها را نماند قرار»!

 

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

 

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

 

اما چطور می‌توان محصول مشترکی ساخت وقتی که ذهنمان درگیر جنگ سرد بین جزایر است و به این فکر می‌کنیم که پرچم جزیره خودمان را بالا نگه داریم؟

 

آیا بهتر نیست همه ما خودمان را ساکن یک جزیره بدانیم و به فکر بالا نگه داشتن یک پرچم باشیم؟ پرچم تیم!

 

- روح‌الله دلپاک

 

۱ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک

آیا «طراحی دامنه محور» ترجمه مناسبی برای Domain-Driven Design است؟

جستجوی عبارت «طراحی دامنه محور» در گوگل، بیش از ۲۰۰۰ نتیجه در بر دارد که می‌تواند نشانه‌ای از این باشد که عبارت «طراحی دامنه محور» به ترجمه‌ای متداول برای عبارت Domain-Driven Design تبدیل شده است. اما آیا چنین ترجمه‌ای، می‌تواند ایده اصلیِ رویکرد Domain-Driven Design را به مخاطب فارسی زبان بفهماند؟

 

هدف از این نوشته پیشنهاد یک ترجمه بهتر نیست (هر چند که از تلاش برای ارایه یک ترجمه بهتر استقبال می‌کنم) و صرفا به بررسی مناسب بودن عبارت «طراحی دامنه محور» برای ترجمه Domain-Driven Design بسنده می‌کنم.

 

از جمله موضوعاتی که در رویکرد DDD مورد تاکید فراوان قرار گرفته موضوع زبان فراگیر (Ubiquitous Language) است. منظور از زبان فراگیر، زبانی است که در هر نوع فعالیت مرتبط با توسعه محصول اعم از تحلیل، طراحی، پیاده‌سازی، تست و حتی مکاتبات رسمی و غیر رسمی مورد استفاده قرار می‌گیرد.

 

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

 

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

 

یافته‌های جدید ما از فضای مساله، مانند نیروی پنهانی هستند که به مدل وارد می‌شوند و مدل را بالغ‌تر می‌کنند و آن را به مدل مناسبتری برای حل مساله بدل می‌کنند.

اما منشا نیرویی که به کامل‌تر شدن مدل ما می‌انجامد چیست؟ منشاء این نیرو، حوزه مسایل کسب و کار یا به عبارت دیگر، همان Domain است. می‌توان گفت آنچه که طراحی ما را حالت می‌دهد (مانند خمیر بازی) و خوش فرم‌تر می‌کند، یافته‌های جدید و درک جدید ما از Domain است.

 

عبارت Domain-Driven Design هم بر همین موضوع دلالت دارد. سبکی از طراحی که کاملا تحت اثر نیرویی است که از Domain به آن وارد می‌شود و آن را وَرز می‌دهد. اگر در دامین مفهومی نو پدیدار شود یا مفهومی بسط پیدا کند و شفاف‌ شود، لاجرم باید آن تغییرات را در مدل منعکس کنیم.

 

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

 

اگر با این تعبیر از رویکرد #DDD موافق باشید، به نظر می‌رسد که عبارت «طراحی دامنه محور» ترجمه وفاداری به رویکرد DDD نیست. به این دلیل که اشاره‌ واضحی به این نکته‌ی مهم ندارد که طراحی «تحت تاثیر» نیرویی است که به دلیل تغییر و تحولات دامین به آن وارد می‌شود و آن را سر و شکل می‌دهد.

 

شاید مهمترین ضعف این ترجمه، انتخاب واژه «محور» به جای Driven- باشد که خب انتخاب دقیقی نیست. با رجوع به واژه‌نامه کمبریج می‌بینیم که در توضیح معنای -Driven (در شکل پسوندی)‌ گفته شده:

• Caused or influenced by something or someone.

- آنچه که تحت تاثیر چیزی یا کسی بوجود می‌آید و یا اتفاق می‌افتد.

 

لذا پسوند Driven- معنای «محور» یا «مرکز» ندارد و عبارت «طراحی دامنه محور» در ترجمه تحت الفظی نیز با اشکال همراه است.

 

جمع‌بندی:


عبارت «طراحی دامنه محور» به دو دلیل ترجمه مناسبی برای Domain-Driven Design نیست:

۱- ایده اصلی این رویکرد را به مخاطب منتقل نمی‌کند.

۲- در ترجمه تحت الفظی، «محور» ترجمه صحیحی از «-Driven» نیست.

 

۰ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک

چرا Continues بودن بعضی فعالیت‌ها در متدهای چابک مورد تاکید جدی قرار گرفته است؟

اصطلاحاتی مانند Continues Delivery, Continues Deployment, Continues Refactoring, Continues Exploration, Continues Integration مدتهاست که به نقل محافل توسعه‌دهندگان نرم‌افزار به خصوص آنهایی که برای چابک‌تر شدن تلاش می‌کنند، تبدیل شده است. اما منظور از Continues بودن کاری چیست و چرا اینقدر بر ویژگی Continues بودن چنین کارهایی تاکید می‌شود؟

 

برای انتخاب ترجمه مناسب واژه Continues با مشکل چندانی روبرو نیستیم. می‌توانید از بین این واژگان یکی را انتخاب کنید: پیوسته، مستمر، مداوم، بی‌وقفه، متوالی، همیشگی، پی در پی.
(در ادامه، از واژه «همیشگی» به جای Continues استفاده می‌کنم.)

 

اگر کاری ارزشمند است چرا آن را به صورت «همیشگی» انجام ندهیم؟ اگر کنکاش در نیازمندی مشتریان، بازسازی کدها (Code Refactoring)، یکپارچه‌سازی اجزای محصول و تحویل ارزش به دست مشتری کارهایی ارزشمندند، چرا آنها را به صورت همیشگی انجام ندهیم؟ 

 

نکته مهم اینست وقتی می‌توانیم کاری را به صورت «همیشگی» انجام دهیم که برای آن کار تمرین کرده باشیم، در آن چیره ‌دست شده باشیم و بتوانیم آن را به «راحتی» انجام دهیم. اگر می‌خواهیم کاری را همیشگی کنیم، باید آن را آسان کنیم. کاری را که سخت و پر دردسر باشد، نمی‌توان به صورت «همیشگی» انجام داد. در واقع تاکید بر انجام همیشگی چنین کارهایی به این دلیل است که تیم‌ها بتوانند به چنان مهارتی در انجام آن کار برسند که آن کار برای آنها به روالی عادی و عادت مرسوم تبدیل شود. 

 

از سوی دیگر، انجام «همیشگی» یک کار منجر به این می‌شود که برای آن کار یک «جریان» (Flow) ایجاد شود. وقتی کاری به صورت یک «جریان» در می‌آید، نشانه این است که موانعی که سر راه آن کار وجود داشته‌اند به مرور حذف شده‌اند. این همان وضعیتی است که تیم‌های چابک برای رسیدن به آن تلاش می‌کنند؛ یعنی برداشتن موانع بر سر راه خلق ارزش برای مشتری.

 

اما ایجاد «جریان» مزیت دیگری هم دارد. این مزیت را با ذکر مثالی بیان می‌کنم: 

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

 

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

 

شما دوست دارید ساکن کدام روستا باشید؟ مشتریان شما هم همین را دوست دارند. اگر بتوانید «جریان» تحویل ارزش به مشتری را مانند جریان آب آرام یک رودخانه برای مشتری فراهم کنید، آنها بهتر می‌توانند به توسعه کسب و کار خود بپردازند. مشتریان و ذینفعان خود را با این جریان همیشگی وفق خواهند داد و به شما اعتماد می‌کنند و دیگر از بابت نسخه جدید محصول (Big-Bang Release) که ممکن است برای آنها حکم همان سیل را داشته باشد، حیران و سرگردان نخواهند شد. 

جمع‌بندی:
تاکید بر ویژگی انجام دادن کارهای ارزشمند به صورت «همیشگی» باعث می‌شود تا تیم به تکاپوی انجام راحت‌تر آن کار بیفتد و از این راه در انجام آن کار به چیره‌دستی و تبحر برسد. همچنین انجام یک کار ارزشمند به صورت «همیشگی» باعث ایجاد جریان پایدار برای آن کار می‌شود. جریانی که می‌توان به آن اعتماد کرد و از احتمال وقوع اتفاقات غیر قابل پیش‌بینی (نظیر آن سیلاب) کاست.

۰ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک

آیا شما هم در موقعیت سیزیفیک قرار گرفته‌اید؟

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

 

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

 

اما نکته اینجا بود که مدیر آن واحد از تغییر برنامه انتشار زودتر از دیگران باخبر می‌شد ولی تغییر برنامه را به تیم اطلاع نمی‌داد و تصور می‌کرد که با این کار، سطح آمادگی، همدلی و توان مواجهه با شرایط سخت را در تیم بالا نگه می‌دارد و تیم اصطلاحاً «آبدیده» می‌شود.

 

مسلماً قرار گرفتن در موقعیت سیزیفیک، نه تنها تیم را به هیچ‌کدام از دستاوردهایی که آن مدیر تصور می‌کرد نرسانده بود، بلکه باعث شده بود تا انگیزه و اعتماد اعضای تیم از بین برود و رابطه‌ی تیم و آن مدیر، سرد و تیره شود.

 

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

- روح‌الله دلپاک

مطالعه بیشتر: Work and Meaning

 

۰ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک

وقتی یک قصاب به ما درس ریفکتور می‌دهد!

تصور کنید وارد مغازه قصابی شده‌اید و به آقای قصاب سفارش یک شقه ران گوسفندی داده‌اید! حالا به ابتدای جمله برگردید! بله عرض کردم که «تصور» کنید!

 

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

 

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

 

قصاب داستان ما، به دلیل اینکه همیشه حواسش به تیز بودن چاقویش بوده و آن را مرتب تیز کرده است، دیگر نیازی ندارد که برای تیز کردن چاقویش وقت زیادی صرف کند. سه چهار بار که چاقو را به سوهان بکشد، تیز می‌شود. کاری که چند ثانیه بیشتر وقت نمی‌گیرد!

 

اگر این کار را به صورت مرتب انجام ندهد، آن‌وقت به مشتری چهارم و پنجم نرسیده، «مجبور» می‌شود که مشتری را «معطل» کند تا چاقوی جدیدی تهیه کند و یا با چاقوی کند و کهنه شده، با زور و تقلا کارش را پیش ببرد.

 

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

 

ریفکتور (Refactor)، بخوانید تیز کردن چاقو باید جزیی از فعالیت‌های روزانه‌ی ما باشد. جوری که هیچ‌وقت نخواهیم که برای تیز کردن چاقوی توسعه، از مشتری فرصت بگیریم و وقتش را تلف کنیم. پس مثل آقای قصاب ریفکتور کنیم، هر روز، روزی چند بار. 

 

راستی آبگوشت‌تان نوش جان!

۰ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک

بیانیه‌ی توسعه چابک نرم‌افزار و ارزش‌های مطرح در آن

1. Individuals and interactions over processes and tools.


در بیانیه‌ی توسعه‌ی چابک نرم‌افزار گفته شده روشی که چابک‌کاران در توسعه‌ی نرم‌افزار پیش می‌گیرند، روشی است که در آن به «افراد و تعاملات آنها» نسبت به «فرآیندها و ابزارها» ارزش و اهمیت بیشتری داده می‌شود.
به بیانی دیگر اگر در سازمان یا تیمی ناهنجاری‌ و مشکلاتی در رفتار افراد و تعاملات آنها وجود داشته باشد، تاکید و پافشاری در اجرای فرآیند یا استفاده از ابزاری خاص (هر چند مدرن) کمکی به چابک‌تر شدن نمی‌کند. برعکس، از میان تیمی که حال خوب و تعاملات مناسب دارند، ابزار و فرآیندهای مناسب هم پدیدار می‌شوند.
لذا ابزارها و فرآیندها بایستی در خدمت بهبود و بهینگی تعاملات افراد باشند.

2. Working software over comprehensive documentation


در بیانیه‌ی توسعه‌ی چابک نرم‌افزار گفته شده روشی که چابک‌کاران در توسعه‌ی نرم‌افزار پیش می‌گیرند، روشی است که در آن به «نرم‌افزار در حال کار» نسبت به «مستندات مبسوط و جامع» ارزش و اهمیت بیشتری داده می‌شود.
به بیانی دیگر اگر سازمان یا تیمی در تحویل مرتب و منظم نرم‌افزار کاربردی، دچار مشکل باشد، تلاش برای تهیه مستندات جامع و مبسوط هم احتمالا کمکی به چابک‌تر شدن آنها نمی‌کند. مستنداتی ارزشمندند که بتوانند تحویل منظم و زود به زود نرم‌افزارِ در حال کار را تسهیل کنند.

3. Customer collaboration over contract negotiation

در بیانیه‌ی توسعه‌ی چابک نرم‌افزار گفته شده روشی که چابک‌کاران در توسعه‌ی نرم‌افزار پیش می‌گیرند، روشی است که در آن به «مشارکت مشتریان» به نسبت «مذاکرات قراردادی» ارزش و بهای بیشتری داده می‌شود.
به بیانی دیگر اگر سازمان یا تیمی، سازوکار مناسبی برای جلب مشارکت فعالانه‌ی مشتری در فرآیند تولید محصول نداشته باشد، تلاش برای تنظیم یک قرارداد دقیق هم فایده‌ای نخواهد داشت.
لذا مذاکرات قراردادی باید به نحوی دنبال شوند که مشارکت فعالانه‌ی مشتری در فرآیند تولید محصول را ممکن و بلکه الزامی کنند. مذاکرات و توافقات حاصله، نباید باعث تضعیف این رکن اساسی از قرارداد گردند.

4. Responding to change over following a plan

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

۰ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک

معرفی کتاب Understanding Agile Values & Principles

agile-values-principles



سازمان‌هایی که تلاش می‌کنند تا واجد صفت «چابک» شوند، اگر از ارزش‌ها و اصول چابکی غفلت کنند یا دانش محدودی درباره نگرش (Mindset) چابک داشته باشند، اغلب به وضعیتی دچار می‌شوند که از چابکی تنها پوسته‌ای بر تن می‌کنند و چون به مغز و هسته‌ی چابکی توجه کافی ندارند، دور از انتظار نیست که همان روش‌های سنتی را با ظاهر چابک اجرا کنند.


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

اما ارزش‌ها و اصول چابکی چیستند؟ و چرا اهمیت آنها را دست‌کم می‌گیریم؟
نکته‌ این است که سادگی این ارزش‌ها باعث شده که آنها را بدیهی، دم‌دستی و سهل‌الوصول بدانیم. در حالی که اینگونه نیست و می‌توان گفت که:
که «چابک» آسان نمود اول، ولی افتاده مشکل‌ها.

اگر مایلید شرحی دقیق و صحیح از ارزشهای چابکی و اصول مربوطه بدانید، پیشنهاد می‌کنم این کتاب جمع و جور را که به تازگی توسط Scott Duncan نوشته شده و مورد تایید بزرگانی چون Ben Linders, Ken Robin, Mike Cohn و Ron Jeffries است را مطالعه کنید.

https://www.infoq.com/minibooks/agile-values-principles

دانلوددریافت فایل PDF

عنوان: Understanding-Agile-Values-Principals-Agile-Manifesto
حجم: 1.19 مگابایت
توضیحات: Understanding-Agile-Values-Principals-Agile-Manifesto
۰ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک

یافتن Bounded Context ها، چالشی همیشگی در Domain-Driven Design

تشخیص مناسب Bounded Context ها، کاری دشوار و پرچالش است. صاحب‌نظران این حوزه، بر پیچیدگی این کار مهر تایید زده‌اند و هر چند که با در میان گذاشتن تجربیات خود راهنمایی‌های ارزشمندی ارایه کرده‌اند اما جدال‌ها در این‌باره کم نشده و اتفاقا در سال‌های اخیر با مطرح شدن معماری Microservice، این بحث‌ها جدی‌‌تر هم شده‌اند. می‌شود گفت که هر جا که صحبت از Microservice است، رد پای Bounded Context هم دیده می‌شود و آن تفاوت نظرهایی که درباره مرزبندی سرویس‌ها وجود داشته، حالا دامن Bounded Context را هم گرفته است. با هم برخی نظرات را مرور کنیم:

Finding service boundaries is really damn hard... There is no flowchart!
- Udi Dahan

Microservices should cleanly align to bounded contexts.
- Sam Newman

Microservices is loosely-coupled, service oriented architecture with bounded context.
- Adrian Cockroft

One microservice should cover one bounded context
- Vaughen Vernon

Why is every one so eager to establish  a 1:1 mapping between microservices and bounded contexts?
- Alberto Brandolini

فارغ از این جدالها، در این نوشتار سعی می‌کنم تا به این پرسش پاسخ دهم که برای یافتن BC ها به چه نشانه‌هایی باید توجه کرد؟

از بوم مدل کسب و کار  شروع کنید!

بوم مدل کسب و کار (Business Model Canvas) یکی از شیوه‌های ساده و کاربردی در مدل‌سازی کسب و کار است. این بوم، می‌تواند نقطه شروع خوبی برای شناسایی BC ها و ارتباط آنها با یکدیگر (Context Map) قرار بگیرد. این بوم مشتمل بر ۹ بخش به شرح زیر است:

  •     مشتریان
  •     ارزش پیشنهادی (محصولات و خدمات)
  •     کانال توزیع
  •     ارتباط با مشتریان
  •     جریان درآمد
  •     منابع اصلی و دارایی‌ها
  •     فعالیت‌های اصلی برای خلق ارزش پیشنهادی
  •     شرکای کلیدی کسب و کار
  •     ساختار هزینه‌ها

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

اطلاعات بیشتر: بوم مدل کسب و کار چیست؟

سرنخ‌ها را دنبال کنید!

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

۱- مرزهای معنایی واژگان را شفاف کنید.

اریک اوانس (Eric Evans) در کتاب Domain-Driven Design: Tackling Complexity in the Heart of Software از اهمیت زبان فراگیر (Ubiquitous Language) به تفصیل سخن می‌گوید. منظور از UL زبانی است که همه‌ی افراد درگیر در پروژه آن را درک کرده، از ابهامات معنایی خالی باشد و در همه گفتگوها، کدها، تست‌ها و مستندات از آن استفاده شود. اما این زبان فراگیر تشکیل نمی‌شود مگر اینکه context مشخص باشد. او context را اینگونه معنا می‌کند:

The setting in which a word or statement appears that determines its meaning.

بنابراین یکی از سرنخ‌هایی که به تشخیص BC ها کمک مهمی می‌کند، همین تغییر معنای کلمات است. مثلا کلمه «سفر» در کانتکست اعزام به ماموریت یک معنای کاملا متفاوتی در کانتکست گردشگری دارد.

۲- داده‌ها را در طول عمرشان بررسی کنید.

موضوعاتی مانند جریان داده، مالکیت داده‌، تضمین یکتایی داده‌ها و تاثیر ناشی از تغییرات داده بر داده‌های دیگر را مورد توجه جدی قرار دهید. به عنوان مثال اگر در تغییرات در داده‌های یک BC همواره باعث تغییر در  BC دیگری شود، می‌تواند نشانه‌ای از این باشد که مرزهای BC به درستی کشیده نشده‌اند.

۳- به متخصصین حوزه‌های مختلف (Domain Expert) پروژه توجه کنید.

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

۴- ساختار فعلی سازمان را زیر ذره‌بین ببرید.

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

If the architecture of the organization is at oods with the architecture of the system, the architecture of the organization wins.
--Ruth Malan

در جستجوی Autonomy

توجه کنید که وجه مشترک همه این سرنخ‌ها این است که آدرس Autonomy را به ما می‌دهند. Autonomy (استقلال داخلی) باعث ‌می‌شود تا تیم‌ها مستقل از هم کار کنند، وابستگی‌های دیتا و کدها کمینه شوند و در نهایت تحویل محصول سریعتر انجام شود. می‌شود گفت اگر BC ها طوری طراحی شوند که مانع تحویل زود به زود محصول شوند، یا تحویل یک BC وابسته به تحویل BC دیگری باشد، به احتمال زیاد در تشخیص BC ها دچار اشتباه شده‌ایم. اهمیت این موضوع تا این حد است که در بعضی منابع از Bounded Context به عنوان Autonomy Context نام برده شده است.

نکته پایانی: همه‌چیز در حال تغییر است.

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


منابع:
  •     Domain-Driven Design: Tackling Complexity in the Heart of Software - Eric Evans
  •     Nick Tune, DevoxxUK 2017
  •     Finding Service Boundries - Udi Dahan
  •     Thinking in Systems - Donella H. Meadows
۰ نظر موافقین ۱ مخالفین ۰
روح الله دلپاک

هرم تست (Test Pyramid)

برای خودکارسازی تست نرم‌افزار می‌توان انواع متفاوتی از تست‌ را به کار گرفت. از تست‌های سطح پایین که برای تست قطعه کدهای نرم‌افزار نوشته می‌شوند، (Unit Test)؛ تا تست‌هایی سطح بالا که از واسط کاربری شروع می‌شوند و تست را به شکلی اجرا می‌کنند که گویا یک کاربر واقعی در حال کار با سیستم است. (End-To-End Test).

اما سوال کلیدی این است که وقت گذاشتن برای کدامیک از این انواع تست، نتیجه‌ی بهتری را عاید ما می‌کند؟ «هرم تست» پاسخی برای همین پرسش است.

هرم تست


همانطور که در شکل پیداست، بهتر این است که حجم تست‌های واحد (Unit Test) بسیار بیشتر از تست‌هایی باشد که از سطح UI اجرا می‌شوند.

تست‌های UI یا End-To-End Test

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

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

نکته دیگری که در مورد تستهای UI باید مورد توجه قرار داد این است که اجرای این تست‌ها معمولا تا رسیدن به یک Build موفق از سیستم به تاخیر می‌افتند و گاهی اوقات توسعه دهندگان برای اطمینان از عملکرد یک کد جدید باید منتظر بمانند تا دیگر اعضای تیم، کارشان را تا حد مناسبی پیش برده باشند. در این شرایط، رایج است که توسعه دهنده Back-End منتظر توسعه دهنده Front-End می‌ماند تا واسط کاربری پیاده‌سازی شود و پس از آن تست های UI اجرا شوند.

علاوه بر همه اینها، وقتی که یک تست UI شکست می‌خورد، تشخیص اینکه علت شکست دقیقا چه بوده است کار آسانی نیست و باید علل مختلفی را بررسی و سیستم را برای پیدا کردن علت شکست، دیباگ کرد.

ببینیم در مورد تستهای واحد (Unit Test) وضعیت چطور است.

تستهای واحد (Unit Test)

نوشتن تست‌های واحد (Unit Test) ارزان است. فریم ورک‌های متنوعی برای نوشتن تست واحد وجود دارند که در عین برخورداری از قابلیت‌های فراوان، رایگان هم هستند.

تست‌های واحد، فیدبک سریعتری به توسعه دهنده می‌دهند. توسعه‌دهنده در کمتر از چندثانیه متوجه می‌شود که کد یا تغییرات جدید درست کار می‌کند یا نه.

نگهداری تست‌های واحد مشروط بر اینکه با رعایت بِه‌رَوشها نوشته شده باشند بسیار راحت‌تر است. اصلی‌ترین علت تغییر در اسکریپت‌های تست واحد زمانی است که کلاس یا کلاسهای مورد تست (Class Under Test) تغییر کنند. معمولا دامنه این تغییرات مربوط به چند کلاس محدود خواهد شد. این را مقایسه کنید با تست UI که حتی تغییر مکان یا نام یک Button می‌تواند کل سناریوی تست را بشکند.

مزیت دیگر تست واحد این است که در صورت شکست تست، تشخیص علت شکست به صورت دقیق و واضح امکان پذیر است. توسعه دهنده به راحتی می‌فهمد که کلاس یا متد خاصی (از بین هزاران کلاس یا متد) درست کار نمی‌کند و به همین دلیل، کمتر درگیر عملیات Debug خواهد شد.

 

جمع‌بندی:

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

 

این بحث را در وبینار خودکارسازی تست نرم‌افزار دنبال خواهیم کرد و بیشتر با Unit Test آشنا خواهیم شد. برای کسب اطلاعات بیشتر مراجعه کنید به:

https://evand.com/events/softwaretesting-2nd

۰ نظر موافقین ۱ مخالفین ۰
روح الله دلپاک

تست خودکار نرم‌افزار؛ از آغاز تا انجام

تست خودکار نرم افزار


🔸اپیزود اول:

وقتی مشتری درخواست جدیدی می‌دهد، دست و دل ما می‌لرزد که نکند انجام این تغییرات، به جاهای دیگر سیستم هم گند بزند! چون سیستم بزرگ و پیچیده‌ای داریم، می‌ترسیم اینجا را تغییر دهیم و جای دیگری خراب شود و نفهمیم که خراب شده! یا وقتی بفهمیم که خیلی دیر شده! تا می‌آییم یک باگ را رفع کنیم، ۱۰ باگ دیگر ایجاد می‌شود! روحیه و انرژی تیم پایین آمده و جرات تغییر و دست زدن به کدهای قدیمی را نداریم!

🔸اپیزود دوم:

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

🔸اپیزود سوم:

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

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

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

📌تاریخ برگزاری: جمعه، 21 اردیبهشت، ساعت 15

کسب اطلاعات بیشتر و ثبت نام:

🌐https://evand.com/events/softwaretesting

۰ نظر موافقین ۰ مخالفین ۰
روح الله دلپاک