سید علی رکنی دزفولی

یادداشت ها

۲ مطلب با کلمه‌ی کلیدی «مهندسی نرم افزار» ثبت شده است

آیا پیش بینی در پروژه های نرم افزاری غیر ممکن است؟

    در حالت کلی، خیر. تعدادی از پروژه های خاص منظوره مثل سیستم های نرم افزاری سفینه های فضایی وجود دارند که بارها و بارها برای همین منظور توسط یک تیم که برای همین کار آموزش دیده اند تولید می شوند. پروژه هایی از این قبیل مانند پروژه های عمران هم مدل دقیقی دارند و هم با طراحی با تحلیل ریاضی قابل اثبات است. در نتیجه این نوع پروژه ها در حد خوبی قابل پیش بینی هستند. ولی برای عموم نرم افزارهایی که تولید می شود، پیش بینی کار بسیار مشکلی است. این سختی دلایل زیادی دارد از جمله[۱]:

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

    کنترل فرایندهای غیر قابل پیش بینی با فرایندهای مبتنی بر تکرار

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

    افراد در متدولوژیهای چابک چه جایگاهی دارند؟

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

    مدیریت یک فرایند چابک چگونه است؟

    در این بخش به چند نکته بسنده می کنیم. این نکات خلاصه مطالبی است که از[۱] گرفته شده است.

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

منابع:

[1] Martin Fowler, The New Methodology, http://martinfowler.com/articles/newMethodology.html#AgileManifesto

[2] Steve McConnell, Development: Taming Wild Software Schedules, ISBN 1556159005

[3] Alistair Cockburn, Characterizing People as Non-Linear, First-Order Components in Software Development,  4th International Multi-Conference on Systems, Cybernetics and Informatics, Orlando, Florida, June, 2000.

[4] Jack W. Reeves,  What is Software Design?,  C++ Journal

 

  • سید علی رکنی دزفولی

مقدمه

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

چرا متدولوژی؟

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


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


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

روشهای پیش بینی کننده یا روشهای تطبیق پذیر

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


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


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

نکته دیگر مقایسه نسبت هزینه طراحی به پیاده سازی پروژه با سایر رشته های مهندسی است. به عنوان مثال وقتی یک پل ساخته می شود، هزینه طراحی شاید حدو د۱۰ درصد هزینه کل باشد. ولی در سیستم های نرم افزاری همانطور که در [۲] نشان داده، حدود ۱۵ درصد  از هزینه های کل پروژه مربوط به کد و تست ها می شود. حتی اگر تمامی مرحله تست شامل تست جامعیت و استرس و کارایی و … را بخشی از ساخت پروژه بدانیم، هنوز ۵۰ درصد از هزینه پروژه صرف طراحی می شود.


این تفاوت اساسی منجر به این شد که عده ای پیشنهاد دهند[۳] که کدها هم قسمتی از مستندات فاز طراحی هستند و فاز ساخت تنها کامپایل کردن و لینک کردن کدهاست.

منابع:

[1] Martin Fowler, The New Methodology, http://martinfowler.com/articles/newMethodology.html#AgileManifesto

[2] Steve McConnell, Development: Taming Wild Software Schedules, ISBN 1556159005

[3] Alistair Cockburn, Characterizing People as Non-Linear, First-Order Components in Software Development,  4th International Multi-Conference on Systems, Cybernetics and Informatics, Orlando, Florida, June, 2000.


 

 

  • سید علی رکنی دزفولی