یکی از سوالات اصلی که در هنگام سوئیچ از روش های قدیمی به اسکرام با آن مواجه می شویم Incremental بودن و یا Iterative بودن اسکرام است . به عبارت دیگر ما قرار است به کدامین روش کار کنیم؟ Incremental یا Iterative .
من این سوال را از شما دارم، کدام روش؟ مرد مومن تعریفی از هر دو مقوله ارائه بده تا بتوانیم تصمیم گیری کنیم: کل تعریف هر دو روش در شکل زیر کاملا مشهود است:
همانطور که حتما متوجه شده اید هر دو روش دقیقا معکوس یک دیگر عمل می کنند. در روش Incremental هدف توسعه یک محصول است اما تکه تکه. به عبارت دیگر ما آخر کار را به صورت قطعی می دانیم (همانطور که در تصویر معلوم شده است ) پس نسبت به دانش اولیه و کامل، در حال تکمیل قسمتی از محصول به صورت 100% و کامل هستیم . اگر دقت کنید در متد Incremental در سه مرحله ما به نقاشی دست پیدا کردیم . البته در هر مرحله قسمتی (تکه ای ) از شکل به صورت کامل تمام شده است. یعنی در مرحله دوم دیگر نیاز نیست ما بر روی چشم ها دوباره کار کنیم زیرا که در مرحله قبل تمام شده است. این نوع متد نیازمند یک دید کلی و کامل از نتیجه نهایی است . یعنی بدون طراحی اولیه دقیق (Up-front) قبل از شروع به پیاده سازی چنین متدی امکان پذیر نیست.
ولی در متد دوم یا همان Iterative شاهد این هستیم که در هر تکرار کل عکس شاهد دگرگونی است . یعنی در هر تکرار یا چرخش بر روی کل عکس کار کرده ایم و در آخرین چرخش کل عکس آماده است ولی نه به صورت 100 % . این نوع متد وابسته به خروجی تکرار قبلی است . به عبارت ساده تر در اول کار ما فقط میخواهیم عکس یک زن را بکشیم ولی طرح نهایی در ذهنمان وجود ندارد یعنی دانش مان کامل نیست. هر مرحله ای که به جلو می رویم یاد می گیریم و بر اساس یادگیری ها مرحله بعدی را شروع می کنیم . این همان بازخورد و بازبینی هایی هست که در اسکرام انجام می شود .
خوب شاید الان بتوانید بگویید که اسکرام برپایه کدام روش است؟ بلی، اسکرام ترکیبی از هر دوروش میباشد. (درست گفته بودید؟) . به نظر می رسد متوجه شده باشید که هر دوروش یک سری معایب و مزایای بزرگ دارند :
در روش Incremental ما بخشی از محصول را به صورت کامل تمام می کنیم (مزیت) ولی این تمام کردن نیازمند یک دانش کامل و فراگیر نسبت به کل محصول است که این محصول جز با طراحی های Up-front امکان پذیر نخواهد بود (عیب) { قابل ذکر است که عیب طراحی Up-front این است که در فاز شروعی پروژه زمانی زیادی برای اینگونه طراحی ها باید صرف شود} . اما در روش Iterative ما نیازی به طراحی Up-front نخواهیم داشت زیرا رفته رفته طراحی می کنیم که اصطلاحا به این نوع طراحی Just-In-time-Design اطلاق می شود . ولی در اینگونه طراحی ها می توانیم در دام کارهای 95% بیفتیم (شاید دیده باشید که پروژه در دو ماه به 95% می رسد ولی 5% پروژه 4 ماه طول می کشد که این همان دام 95% است که هیچ وقت تمام نمی شود ) .
اسکرام برای اینکه بتواند روش کاملی باشد از هر دو روش بهره جسته است. اسپرینتهای یک پروژه همان چرخش ها هستند و انجام دادن Feature های داخل هر اسپرینت Incremental ما خواهند بود . به عبارت سادتر در انتهای یک Iteration، شاهد Increment (خروجی اسپرینت) خواهیم بود .
2 نکته اساسی از نوشته های بالا قابل استنباط خواهد بود که هدف من از نگارش این نوشته فقط تبیین اهمیت این مطالب بوده است و نه ارائه یک سری تعریف کلاسیک :
- Feature های داخل هر اسپرینت زمانی که توسط یک نفر از اعضای تیم برای پیاده سازی انتخاب می شوند باید به صورت Incremental کار بشوند. یعنی اینکه باید تمام شود یعنی ویژگی های Done شدن را پیدا کند و کنار گذاشته شود و نه اینکه چند روزی کار شود بعد Stand-By و کار بروی ویژگی دیگر و بعد سوییچ به ویژگی قبلی و چند روزی دوباره کار و بعد دوباره Stand-By . برنامه نویس باید وظایف خود را در قبال ویژگی تمام کند و بلافاصله تست های لازم بر روی ویژگی باید انجام شود و خلاصه هر کاری که لازم است که این ویژگی Done شود باید پی در پی و بدون وقفه انجام شود تا سنت حسنه Incremental به جا آورده شود .
- اسپرینت ها روح اسکرام هستند . ما Iterative کار می کنیم تا یاد بگیریم و نه اینکه زود به زود یک سری ویژگی به درد نخور تحویل مشتری بدهیم. ما برآیند یک اسپرینت را تحویل مشتری می دهیم و همراه مشتری اسپرینت و برآیند اسپرینت را بازبینی می کنیم تا یاد بگیریم. یاد می گیریم که چگونه یک محصول با ارزش برای مشتری ارائه بدهیم . Mike Cohn یک اصلاح با ارزش دارد : Get Feedback , Learn and Adapt .
Incremental کار می کنیم که بتوانیم یک سری ویژگی های محصول را به صورت کامل (Done شده) در آخر اسپرینت برای بازبینی به مشتری ارائه بدهیم . Iterative کار می کنیم که بتوانیم بازخوردهای مشتری را دریافت کنیم (Get Feedback) ودر مورد محصول بیشتر یاد بگیریم (Learn) {منظور از یادگیری این است که محصول چگونه باید توسعه داده شود که برای مشتری هایمان با ارزش باشد } و یادگیری هایمان را در Design اسپرینت های بعدی به کار می گیریم (Adapt) .
به امید توسعه محصولات نرم افزاری با ارزش
اسد صفری
سلام
واقعا در قالب مثال ساده خیلی خوب تفاوت بین این دو موضوع طرح شده است .
ممنونم
خیلی خوب بود. ممنون
خیلی مفید بود در عین اختصار.
بسیار خوب توضیح دادید؛ مطالبی که در وبلاگتان منتشر میکنید مرا راغب کرد تا در پروژه بعدی این فریم ورک را پیاده سازی نمایم.
حتما، سعی کنید استفاده کنید
ولی دانش کم در این چارچوب می تونه برعکس جواب بده که بعدا یه نوشته ای در این باره خواهم نوشت
در هر حال امیدوارم موفق باشید
عالـــــــــــــــــــــــــــــــــــی بود.ممنونم
مرسی ! خیلی مفید بود
خیلی خوب توضیح دادین، واقعا استفاده کردم، ممنون
در مورد TFS هم توضیح بدین ممنون میشم
سلام
برام من خیلی مفید بود.
تشکر می کنم.
ممنووون خیلی خوب بود … مفاهیم رو با مثالتون خیلی خوب فهمیدم
عالی بود . ممنون
عاااااااااالی بود! تازه فهمیدم چی شده! ترم پیش مهندسی نرم افزار داشتم الان فهمیدم هیچی نفهمیده بودم!
یاشا
شادلیقلا
اوغورلارلا
سپاس فراوان استاد عزیز!
عالی بود ممنون از اینکه این مسله اینقدر واضح توضیح دادید
خیلییی کامل و جامع توضیح داده بودید… واقعا ممنونم
خیلی عالی توضیح دادین واقعا ممنون
دمتون گرم. شیوه ی بیانتون واقعا عالی بود.