تخمین زمان پروژههای نرمافزاری: از کارهای سخت شروع کنید
زمان اجرای وظایف ساده را با دقت خوبی میتوان تخمین زد اما وزن اصلی پروژهها عموماً مربوط به کارهای سخت است. از تخمین کارهای سخت شروع کنید
مبحث برنامهریزی برای تولید نرمافزار، موضوع مهمی است و تست ششم جوئل به آن مربوط است. اما توضیح تست ششم جوئل فقط در همین حد است که برنامهریزی کنید چون خوب است!
جوئل اسپالسکی البته نوشته دیگری دارد به نام Painless Software Schedule که من برای صحبت در مورد برنامهریزی تولید نرمافزار از آن هم نوشته هم بهره خواهم گرفت. اما قبل از شروع همه این داستانها، باید درباره یک مبحث پایهای در تولید نرمافزار صحبت کنم: تخمین زمان اجرا

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