بایگانی

نوشته های برچسب زده شده ‘XP’

داستان هشت ساعت قانون کار

داشتم توی دهن خودم کلنجار می‌رفتم که یک پست درباره میزان ساعت‌های کاری و سرعت توسعه پایدار در تیم‌ها بنویسم. تا رسیدم به یک تکنیک XP که تاکید می‌کند که تیم‌ها هر روز تعداد ساعت ثابتی را کار کنند و بعد از آن کار را تعطیل کنند. این تکینک میزان ساعت کاری که توصیه می‌کند ۴۰ ساعت در هفته است. همین ۴۰ ساعت برایم داستان را جالب کرد اگر شما هر هفته را ۵ روز کاری در نظر بگیرید آنوقت به همان ۸ ساعت قانون کار خودمان می‌رسید. کنجکاو شدم ببینم این ۸ ساعت قانون کار از کجا آمده؟

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

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

تام مان (Tom Mann) یک سوسیالیست دیگر در سال ۱۸۸۴ دوباره تلاش برای کاهش ساعات کاری روزانه را به ۸ ساعت از نو شروع کرد. اینبار این حرکت که از بریتانیا شروع شده بود بسیار گسترده شد و تا آمریکا رسید. و در اول مه  ۱۸۸۶ بود که کارگران آمریکای در شیگاگو برای دست یافتن به این هدف دست به راهپیمایی و اعتصاب زدن و در چهارمین روز این اعتصاب اتفاق‌های بسیار تلخ رخ داد، به همین دلیل اول مه هر سال را در دنیا به نام روز کارگر پاس می‌دارند.

با همه این اتفاقات و جنبش‌ها هنوز بسیار از صنایع تا اوایل قرن بیستم ۸ ساعت کار روزانه را به عنوان یک اصل قبول نکردند. یکی از اولین شرکت‌ها که این اصل را پذیرفت شرکت خودروسازی فورد بود که در ۱۹۱۴ ساعات کاری روزانه کارگران خود را به هشت ساعت کاهش داد و همزمان حقوق آنها را نیز افزایش داد. این تغییر در طول ۲ سال باعث شد که میزان سود فورد افزایش پیدا کند. تاثیر این اتفاق باعث شد که بسیاری از شرکتها نیز رویه مشابهی را برای کاهش ساعات کاری به هشت ساعت پیش بگیرند. و در نهایت در ۱۹۳۷، هشت ساعت کار روزانه به عنوان یک قانون در ایالت متحده تصویب شد.

این هشت ساعت قانون کار حاصل ده‌ها سال تلاش و خون‌های ریخته شده در چهار مه ۱۸۸۶ هست. اما سوال اساسی این است قانونی که نزدیگی یک قرن از عمر آن می‌گذرد و در این مدت زیربنای صنعت و فرهنگ تغییر کرده است آیا می‌‌تواند برای ما نیز به اندازه قهرمانان این جنبش آرمانی باشد؟

قوانین طراحی ساده

همه ما از سادگی صحبت می‌کنیم و می‌گوییم عاشق سادگی هستیم. ولی شاید جمله «برای آن مسئله یک راه‌حلی پیدا کردم که عمراً کسی بتواند بفهمد چیکار کردم.» را بعضی وقت‌ها با افتخار بزبان می‌آوریم. پیدا کردن یک راه‌حل پیچیده برای یک مسئله که برای دیگران قابل درک نباشد یک حس نبوغ در ما القا می‌کند؛ اما اگر کسی بتواند برای همان مسئله راه حلی ارائه بدهد که به سادگی توسط همه قابل درک باشد، راه حل پیچیده من یک راه‌حل احمقانه و شاید من یک احمق نامیده شوم. پس قبل از اینکه هر لقبی بگیرید لطفاً این سؤال را از خودتان بپرسید «ساده‌ترین چیزی که ممکن است کار کند، چیست؟”.» این سوالی است که توسعه دهندگان چابک در هنگام نوشتن کد از خودشان می‌پرسند و بدین معناست که ساده‌ترین کاری را انجام دهید که شما را قادر می‌سازد تا در مسیر درست به پیش بروید.

 یک از ارزش‌های XP، سادگی و یکی از تکنیک‌های آن طراحی ساده (Simple Design) هست. Kent Beck مبدع XP برای داشتن یک طراحی ساده چهار قانون تعریف کردن که عبارت‌اند از:

  1. پاس شدن همه تست‌ها
  2. عدم وجود تکرار
  3. بیان مقصود برنامه نویس
  4. کاهش تعداد کلاس‌ها و متدها

پاس شدن همه تست‌ها

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

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

عدم وجود تکرار

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

این اصل اغلب بین توسعه دهنده‌های نرم‌افزار با نام DRY(Don’t Repeat Yourself.) یا Once And Only Once شناخته می‌شود. البته اصل DRY درباره تکرار کد نیست و درباره تکرار دانش هست، این اصل بیان می‌کند که  هر قسمت از دانش ما در سیستم باید جایگاه واحد، بدون ابهام و معتبری داشته باشد. (حسین بقایی عزیز چند ماه قبل لینک یک پست را در مورد DRY توئیت کرده بود که به صورت عالی این اصل را تشریح کرده بود خواندنش را از دست ندهید.)

بیان مقصود برنامه‌‌نویس

شاید این اصل یکی از اولین اصول و در ظاهر ساده‌ترین اصلی است که تعدادی زیادی از برنامه‌نویس‌ها سعی می‌کنند آنرا رعایت کنند. تاکید این اصل بر روی این هست که اسامی متغیرها، متدها، کلاس‌ها و … باید به هدف وجود آن‌ها اشاره کند.

کاهش تعداد کلاس‌ها و متدها

این یکی از اصولی هست که شاید در نگاه اول با اصول بالا در تضاد باشد. وقتی برای نمونه شما برای حذف کدهای تکراری کدهای موجود را ریفکتور می‌کنید به احتمال زیاد تعداد کلاس‌ها و متدها شما افزایش می‌یابد. پس اصل چهارم به خودی‌خود نقض می‌شود؛ اما این اصل به تعداد کلاس‌ها اشاره نمی‌کند و در واقع اشاره آن به اصل YAGNI (You Aren’t gonna need it) می‌باشد.  اصل YAGNI بیان می‌کند که شما باید هر چیزی را وقتی پیاده سازی کنید که واقعاً به آن نیاز دارید و نه وقتی که می‌فهمید در آینده ممکن است به آن نیازمند شوید. این جمله یکی از جملاتی است که XP واقعاً روی آن تاکید دارد و اعلام می‌کند که شما حتی اگر اطمینان حاصل کنید که به این ویژگی در آینده نیاز خواهید داشت آنرا الان پیاده سازی نکنید. پس هدف اصل چهارم این است که نباید با پیاده‌سازی کلاس‌ها و متدهایی که احتمالاً در آینده فرضی به آن نیاز خواهیم داشت نعداد کلاس‌ها و متدها را افزایش بدهیم.

آیا اسامی متدلوژی ها میزان موفقیت ما را مشخص می کنند؟

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

ما در پست ضایعات نرم افزاری، به بررسی مفهومی به نام ضایعات نرم افزاری پرداختیم و آن را از دیدگاه Lean مورد بررسی قرار دادیم. در این پست به بررسی همین موضوع از دید متدلوژیهای دیگر خواهیم پرداخت.

XP و YAGNI

در XP اصلی با عنوان YAGNI که سرنامی برای عبارت “You ain’t gonna need it” می باشد و به معنی “شما به آن نیاز نخواهید داشت” می باشد وجود دارد. که این اصل بیان می کند که شما باید هر چیزی را وقتی پیاده سازی کنید که واقعا به آن نیاز دارید، و نه وقتی که می فهمید در آینده ممکن است به آن نیازمند شوید. این جمله یکی از جملاتی است که XP واقعا روی آن تاکید دارد و اعلام می کند که شما حتی اگر اطمینان حاصل کنید که به این ویژگی در آینده نیاز خواهد داشت آنرا الان پیاده سازی نکنید.

Scrum و قلب آن (Product backlog)

Product backlog را قلب Scrum می نامند. لیستی از ویژگیها و نیازمندیهای نرم افزار که بر حسب اولویت مرتب شده است و بر حسب همان ترتیب در عمل پیاده سازی خواهد شد. اما این اولویت توسط چه کسی یا کسانی و با چه منطقی انجام می شود؟ وظیقه اصلی اولویت دهی را Scrum بر عهده Product owner قرار می دهد و او بر حسب ارزشی که هر ویژگی برای مشتری ایجاد می کند آنها را مرتب سازی می کند. ویژکیهای با ارزش افزوده بالا در ابتدای لیست قرار می گیرند و به به ترتیب که در لیست پایان می رویم از ارزش افزوده هر ویژگی کاسته می شود و همچنین از اولویت پیاده سازی آن.

Lean و حذف ضایعات در هر نقطه و هر زمانی

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

خلاصه و هدف هر سه دیدگاه بالا اولویت بندی نیازمندیها و ویژگیهای برنامه بر اساس ارزشی است که برای مشتری تولید می کنند، انجام هر کار در زمان مناسب با توجه به درخواستهای مشتری و بازگشت سرمایه. ولی هر کدام آن را با شیوه و ابزارهای خود بیان می کنند. شاید بتوان گفت ما باید بیشتر از آنکه درگیر اسامی باشیم باید به فکر ابزارها و شیوه های باشیم که به تیم و فرآیند ما در موفقیت کمک می کند (پست RUP بهتر است یا Agile؟ از استاد مهرداد یا پست آقای شهبازیان در مورد الگوهای فکری می تواند جالب توجه باشد). شاید منظور و هدف من به روشنی از متن پایین قابل استنباط باشد.

XP هیچ چیز جدیدی نیست. بیشتر تکنیک های XP، همان هایی هستند که برنامه نویسان، سال هاست که آنها را مورد استفاده قرار می دهند. تفاوت در اینجاست که XP همه آنها را باهم ترکیب کرده است و کارایی آنها را افزایش داد. ائده آن، پیدا کردن چیزهایی است که خوب کار می کنند همچنین بالا بردن کارایی آنها برای بهتر کار کردن است. بر این اساس، که علت استفاده از کلمه eXtreme معلوم می شود. استفاده زیاد از این تکنیک ها.

توزیع Agile در سازمان

ما می خواهیم به سمت Agile حرکت کنیم، XP، Scrum، Lean، FDD، AUP و شاید دهها اسم دیگر در این دسته از متدلوژیها وجو دارد که من نمی دانم و نشیدنم. ما باید از بین این اسامی کدام را انتخاب کنیم، چگونه انتخاب کنیم و چگونه به سمت آن حرکت کنیم؟ تفاوت اینها نسبت به هم چیست؟ نقاط قوت و ضعف آنها نسبت به هم چیست؟

اگر تیم یا سازمان شما Agile هست چه پاسخی به سوال بالا می دهید؟ روی پاسخ این مسئله فکر کنید و آنرا با دیگر دوستان به اشتراک بگذارید. در ادامه متن سعی می کنیم یک جواب واقع بینانه و قابل قبول به این سوال ارائه بدهیم.

یک انتقاد

اجازه بدهید قبل از ارئه پاسخ به سوال بالا، موضوعی را بررسی کنیم که می تواند در ارائه پاسخ نهایی به سوال ما راهگشا باشد.

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

راه حل : تفکر سیستمی

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

سطوح سازمان

در کتابهای مدیریت، سازمان را از لحاظ سطوح مدیریت به سه سطح مختلف تقسیم می کنند :

۱-       سطح عالی (استراتژیک – راهبردی) : در این سطح مدیران وظیفه دارند اهداف بلند مدت، آزمانها و استراتژیهای سازمان را تعیین کنند.

۲-       سطح میانی : این سطح وظیفه دریافت دستورات و برنامه ها را از سطح عالی سازمان و تبدیل آن به برنامه میان مدت، برنامه هایی اجرایی و زمانبندی شده و ابلاغ آن به سطوح پایین تر را بهعده دارد.

۳-       سطح عملیاتی : این سطح مدیریت را سطح درگیر در فعالیت های اجرایی گویند. به عبارت دیگر وظیفه به اجرا گذاردن تصمیمات و دستورات مدیریت عالی و میانی را بعهده دارد.

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

توزیع Agile در سازمان

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

برای پوشش هر سه سطح سازمان، سه گزینه XP،  Scrum و Lean را انتخاب می کنیم و هر کدام از آنها را به یک سطح سازمان نگاشت می دهیم. Lean را به بالاترین سطح سازمان نسبت می دهیم یعنی زمانیکه بازگشت سرمایه و اهداف بلندمدت و استراتژی نمود پیدا می کند (به پست ۱۴ اصل راه تویوتا مراجعه کنید). برای سطح میانی، Scrum را به کار می بریم یعنی سطحی که باید به سازماندهی تیمی، مدیریت زمان و تحویل پروژه تمرکز کرد. سطح آخر یا عملیاتی، جائیکه واقعا XP با آن تکنیک ها و اصول زیبای خود می تواند به تمام نیازهای عملیاتی توسعه نرم افزار جواب دهد.

نظر شما درباره این راه حل و پاسخ چیست؟

نحوه توزیع Agile در سازمان

ارزشهای پنجگانه

در پست قبلی درباره ارزش و ضایعات نرم افزار صحبت کردیم و در این پست به ارزشهای که در بعضی از متدلو‍ژیهای سبک مانند XP و Scurm وجود دارد که زیر بنای اصلی تکنیکهای این متدلوژیها را تشکیل می دهد خواهیم پرداخت و سعی خواهیم کرد که با استفاده از این ارزشها به ائده ها و اصولی دست پیدا کنیم که ضایعات را از فرآیند توسعه نرم افزار تا حد قابل قبولی حذف کنیم.

در جدول زیر ارزشهای مربوط به هر دو متدلوژی XP و Scrum آورد شده است ولی ما در این پست فقط به بررسی ارزشهای موجود در XP خواهیم پرداخت.

Scrum Values XP Values
ارتباطات  (Communication) ارتباطات  (Communication)
(Focus) سادگی (Simplicity)
(Openness) بازخورد (Feedback)
شجاعت (Courage) شجاعت (Courage)
احترام (Respect) احترام (Respect)

ارتباطات

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

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

XP برای ایجاد ارتباط در تیم ها،از تکنیک های استفاده می کند که ارتباط در تیم را اجباری می کند، تکنیک های مانند Planning Game، Pair Programming، Stand up meeting، تخمین کارها. یک تیم XP، از نقش مربی برای کنترل ارتباطات، حصول اطمینان از به کارگیری آن و تشویق برای سود جستن از تکنیک ها، به منظور غلبه بر مشکلات استفاده می کند.

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

تیمهای خود سازمانده و غیررسمی را که درAgile مورد تاکید قرار گرفته است می توان به عنون یک از عوامل موثر بر اثر بحشی ارتباطات نام برد.

سادگی

زیبایی در سادگی است ولی ما عاشق پیچیده کردن همه چیز هستیم، ساده ترین مسائل را با پیچیده ترین راه حل ها، حل می کنیم و به راه حل پبچیده خودمان افتخار می کنیم. ولی در XP جمله ای وجود دارد که توسط مربی از تیم پرسیده می شود “ساده ترین چیزی که ممکن است کار کند، چیست؟” این جمله بدین معناست که ساده ترین کاری را انجام دهید که شما را قادر می سازد تا در مسیر درست به پیش بروید.

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

رابطه بین ارتباط و سادگی: سادگی نیاز به ایجاد ارتباط را کاهش می دهد.

فیدبک

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

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

درک زود هنگام یک مساله، معمولا یک بحران در آینده را برطرف می کند.

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

شجاعت

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

تصور کنید که شما با فردی که عادت به توسعه نرم افزار به شکل سنتی دارد درباره TDD صحبت می کنید و درباره مزایا آن صحبت می کنید و او را به انجام TDD تشویق می کنید. اگر به این تصور عینیت ببخشید یا تجربه این مورد را داشته باشید، اکثرا طرف مقابل شما را یک … و TDD را یک کار بیهوده تصور می کند، “یعنی چی که قبل از نوشتن کد، تست ها را بنویسیم، تست برای چیزی که وجود ندارد”. اما اگر طرف مقابل جسارت در هم ریختن دیوارها را داشته باشد و بتواند تغییرات را بپذیرد آنگاه مزایای ائده ها و تکنیکهای جدید را کشف خواهد کرد.

تغییرات را باید پذیرفت اما نه کورکورانه. تکینک های XP را به کار ببندید تا اعتمادتان به این تکنیکها افزایش پیدا کند. در این صورت به خودی خود، جسارت به کار بستن این تکنیک ها و ائده های جدید را پیدا خواهید کرد.

احترام

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

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

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

یک سوال: ارتباط این پست با پست قبلی در چیست؟ یا چگونه با این اصول می توانیم تکنیکهای را طراحی کنیم که به نبرد با ضایعان نرم افزاری برویم.
Categories: Agile Tags: ,

planning poker

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

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

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

بعد از ایام عید، پیش بینی های هر دو گروه مورد بازبینی قرار گرفت. گروه کارشناسان ۹۵ درصد فروش واقعی را تخمین زده بودند در حالیکه گروه کارمندان ۹۹٫۹ درصد فروش واقعی را تخمین زده بودند. اما چگونه ممکن است که یک گروه از کارمندان به گروهی از کارشناسان خبره غلبه کنند؟

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

آیا می توانیم از روش مشابه بالا برای تخمین زدن اندازه کارها در پروژه های نرم افزاری استفاده کنیم یا نه؟ پاسخ بله است. در متدلوژهای Agile ما تکنیکی به نام planning poker برای تخمین زدن داریم که تقریبا مشابه روش بالا می باشد. در این تکنیک به جای اینکه فقط مدیران کار تخمین را انجام بدهند، کل تیم یعنی مدیران، تحلیلگران، معمارها، مدیران پایگاه داده و …. با هم اینکار را نجام می دهند.

در این روش ما مجموعه ای از کارت ها داریم، که بر روی هر کدام از آنها عددی نوشته شده است. این اعداد در اکثر موارد سری فیبوناچی یا یک سری مانند سری مقابل ۰,۱/۲,۱,۲,۳,۵,۸,۱۳,۲۰,۴۰,۱۰۰ می باشد.

روند انجام این تکینیک به این صورت است که، در جلسه ای که با شرکت اعضای تیم  تشکیل می شود به هر کدام از آنها یک دسته از کارت ها داده می شود. یکی از داستانهای کاربر (User story ) انتخاب می شود و یک نفر که آگاهی بیشتر نسبت به مسئله دارد شروع به شرح مسئله می کند این شخص ممکن است مشتری، صاحب محصول، مدیر پروژه یا هر عضوی از تیم باشد. پس از اینکه شرح مسئله تمام شد، اعضای تیم سوالات خود را درباره آن مسئله (داستان کاربر) از آن شخص می پرسند و به سوالات آنها پاسخ داده می شود. بعد از آنکه به همه سوالات پاسخ داده شد، اعضاء می توانند برآوردهای خود را نسبت به آن مسئله انجام دهند، که اینکار با انتخاب یکی از کارتها به صورت محرمانه که بیانگر تخمین آن فرد است انجام می پذیرد.
کارتها نمایش داده نمی شوند تا همه کارت خود را انتخاب کرده باشند، سپس به طور همزمان هر کس کارت خود را نشان می دهد تا همه شرکت کنندکان تخمین همدیگر را ببینند. روال طبیعی این است که در اول مرتبه اعداد مختلفی توسط اعضاء انتخاب شوند، چون همانطوریکه در بالا اشاره شد افراد داری تجربیات و دیدگاههای مختلفی هستند. اگر اعداد مشابه یا خیلی نزدیگ به هم نبودند، اعضاء می توانند روی داسنان و تخمین خودشان بحث کنند و سپس مجددا هر کدام از اعضاء یکی از کارتها را نتخاب می کند. این روند تکرار می شود تا زمانیکه همه اعضاء یا اکثر اعضاء یک عدد مشترک را انتخاب کنند. سپس کل روند از ابتدا برای یک داستان دیگر تکرار می شود.

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

مالکیت جمعی (Collective Ownership)

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

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

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

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

Categories: Agile Tags: , ,

برنامه نویسی دونفره (pair programing)

شاید شما هم یک یا چند دوست صمیمی داشتید یا دارید که با هم پشت یک کامپیوتر نشستید و برنامه های متنوعی را نوشتید، و از این کار لذت برده اید، اما شاید در آن لحظات متوجه نشده اید که شما در حال یکی از تکنیک های XP به نام برنامه نویسی دو نفره هستید.

برنامه نویسی دونفره، نوعی از برنامه نویسی است که دو برنامه نویس باهم و در کنار هم پشت یک کامپیوتر می نشینند و بر روی یک قسمت از کد برنامه، طراحی و یا تست نرم افزار کار می کنند. یکی از جفت ها که کد برنامه را تایپ می کند یا مستندات مربوط به طراحی را می نویسد را راننده (driver) می نامند. فرد دیگر را هدایت کننده (navigator) می نامند که کارهای راننده را نظارت می کند و سعی می کند اشکلات او را کشف کند. خطاهای مانند syntax errors، فراخوانی یک تابع به صورت اشتباه، پیاده سازی یک الگوریتم به شیوه ناکارا و ….  در واقع از بعد دیگر می توان گفت  در برنامه نویسی دو نفره، افراد مختلف با دانش ها و مهارت ها مختلف می توانند مهارتشان را ترکیب کنند تا یک مسئله مشکل را حل کنند. فرض کنید شما کسی هستید که مهارتتان در پایگاه داده در سطح عالی هست و دوست شما کسی که در برنامه نویسی شی گرا مهارت خیلی زیادی دارد در اینصورت شما می توانید کدی را بنویسید که به صورت بهینه و کارا به پایگاه داده دسترسی پیدا کند.

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

۱٫       کیفیت: در این شیوه ما کدی با کیفیت بالا خواهیم داشت چون اکثر خطاها و اشتباهات در همان مرحله اول تشحیص داده می شود.

۲٫       صرفه جویی در زمان: چون ما کدی با کیفیت بالا خواهیم داشت، زمان تست و تغییرات در سیستم کاهش خواهد یافت.

۳٫       افراد شاد: برنامه نویس های که با این تکنیک کار می کنند، اکثرا خوشحالتر و شادتر از زمانی هستند که به تنهایی کار می کنند. برای نمونه شما فشار کمتر را تحمل می کند چون همیشه کسی را در کنار خود دارید که به شما کمک کند و این باعث می شود که شما خیلی خوشحالتر باشید.

۴٫       اعتماد و روحیه همکاری بالا: در این شیوه شما تک و تک افراد تیم خود را به خوبی خواهید شناخت و باعث می شود که شما به آنها اعتماد کند و روح همکاری بخاطر شناخت عمق افراد بالا برود.

۵٫       دو نفر همیشه بهتر از یک نفر است.

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

۷٫       مالکیت جمعی (این گزینه یکی از نقاط مورد علاقه من است و بعداً در یک پست مجزا آنرا بررسی خواهیم کرد.)

 

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

Categories: Agile Tags: , ,