برآورد و برنامهریزی
برآورد یک پیشبینی با بازه است، نه یک قول. کار را به تکههای کوچک بشکن، کارهای پنهان را بشمار و برای بخش نامعلوم اول یک بررسی کوتاه انجام بده. عدد را با بازه، فرضها و ریسکها بگو و هر وقت چیز تازهای فهمیدی، برآورد را بهروز کن.
نویسنده: bezzad
مشکل: «فقط سه روز»
مدیر محصول فروشگاه اینترنتی ما در راهرو میپرسد: «کد تخفیف چقدر طول میکشد؟» برنامهنویس کمی فکر میکند و میگوید: «سه روز.»
مدیر این عدد را به تیم بازاریابی میگوید. بازاریابی کمپین را برای هفته بعد برنامهریزی میکند.
کار سه هفته طول میکشد. چرا؟
- درگاه پرداخت برای تخفیف یک API جدا داشت که هیچ کس نمیشناخت.
- پنل مدیر لازم بود تا تیم بازاریابی خودش کد بسازد. کسی به آن فکر نکرده بود.
- بازبینی، تست و استقرار در آن «سه روز» حساب نشده بود.
- وسط کار دو باگ فوری از بخش دیگری رسید.
برنامهنویس بد کار نکرد. مشکل این بود که یک حدس سریع، به شکل یک قول شنیده شد.
برآورد، هدف و تعهد
این سه کلمه خیلی وقتها با هم قاطی میشوند. ولی سه چیز جدا هستند:
- برآورد (Estimate). یک پیشبینی صادقانه. «به احتمال زیاد بین ۸ تا ۱۴ روز.»
- هدف (Target). چیزی که کسبوکار لازم دارد. «باید قبل از کمپین عید آماده باشد.»
- تعهد (Commitment). قولی که بعد از مقایسه برآورد و هدف میدهیم. «نسخه ساده را تا آن روز تحویل میدهیم.»
اگر هدف زودتر از برآورد است، کم کردن عدد برآورد کمکی نمیکند. کار همان قدر طول میکشد. راه درست، تغییر دامنه کار است: «برای کمپین، فقط کد درصدی. کد مبلغ ثابت و پنل کامل مدیر بعداً.»
چرا معمولاً کمتر برآورد میکنیم؟
- به بهترین حالت فکر میکنیم. در ذهنمان کار بدون هیچ مشکلی جلو میرود.
- کارهای پنهان را فراموش میکنیم. فقط «نوشتن کد» را میشماریم. بازبینی، تست، تغییر دیتابیس، استقرار و جلسهها را نه.
- روز کاری کامل نیست. جلسه، کمک به همکار و باگ فوری بخشی از هر روز را میگیرند.
- چیزهای نامعلوم را نمیبینیم. یک API ناآشنا یا کد قدیمی که هیچ کس نمیشناسد.
- فشار برای عدد کوچک. وقتی کسی جلوی ما منتظر است، عدد کوچکتر گفتنش راحتتر است.
مخروط عدم قطعیت
اول کار، ما خیلی چیزها را نمیدانیم. پس برآورد ما بازه پهنی دارد. هر چه جلوتر میرویم و بیشتر میفهمیم، بازه باریکتر میشود. به این شکل «مخروط عدم قطعیت» (Cone of Uncertainty) میگوییم.
این شکل دو درس دارد:
- برآورد اول کار، بازه پهن دارد. اگر کسی در جلسه اول یک عدد دقیق بخواهد، صادقانهترین جواب یک بازه پهن است.
- برآورد را تکرار کن. وقتی نیازها روشن شد، وقتی طراحی آماده شد، و وقتی بخشی از کار تمام شد. هر بار بازه باریکتر میشود.
شکستن کار
کار بزرگ را نمیشود خوب برآورد کرد. کار کوچک را میشود. پس کد تخفیف را به چند تکه میشکنیم:
چند قانون ساده برای شکستن:
- هر تکه کوچک باشد. اگر یک تکه بیشتر از چند روز است، هنوز آن را نمیفهمیم. دوباره بشکنش.
- هر تکه یک نتیجه قابل دیدن داشته باشد. «جدول و مدل آماده و تستشده»، نه «کار روی بکاند».
- کارهای پنهان را بنویس. آنها را جدا بشمار تا فراموش نشوند.
- بخش نامعلوم را جدا کن. برای درگاه پرداخت، اول یک بررسی کوتاه با زمان محدود (Spike) انجام بده. مثلاً «یک روز وقت میگذاریم تا API درگاه را امتحان کنیم.» بعد آن بخش را برآورد کن.
برآورد سهنقطهای
یک عدد تنها، اطلاعات کمی دارد. برای هر تکه سه عدد میگوییم:
- بهترین حالت. اگر همه چیز خوب پیش برود.
- محتملترین حالت. حدس واقعی ما.
- بدترین حالت. اگر چند چیز با هم بد پیش برود، ولی نه فاجعه.
یک فرمول رایج برای ترکیب این سه عدد، فرمول PERT است. به محتملترین عدد وزن بیشتری میدهد، ولی بدترین حالت را هم حساب میکند:
public sealed record TaskEstimate(string Name, double Best, double Likely, double Worst)
{
// PERT (three-point) expected value, in days
public double Expected => (Best + 4 * Likely + Worst) / 6;
}
TaskEstimate[] tasks =
[
new("Model and table", 1, 1.5, 2),
new("Rules and tests", 2, 2.5, 4),
new("Checkout page", 1, 2, 3),
new("Admin panel", 1, 1.5, 2),
new("Hidden work", 1, 2, 4),
];
var expected = tasks.Sum(t => t.Expected);
Console.WriteLine($"Expected: {expected:F1} days"); // 9.8
Console.WriteLine($"Range: {tasks.Sum(t => t.Best)}-{tasks.Sum(t => t.Worst)} days"); // 6-15
این عددها به ما چه میگویند؟
- عدد مورد انتظار حدود ده روز است. نه سه روز، و نه جمع محتملترین عددها که نه و نیم روز است.
- بازه کامل از ۶ تا ۱۵ روز است. ولی بعید است همه کارها با هم به بدترین یا بهترین حالت برسند. پس یک بازه واقعیتر، باریکتر از این است.
- درگاه پرداخت هنوز داخل حساب نیست. بعد از بررسی کوتاه، آن را هم اضافه میکنیم.
عدد را چطور بگوییم؟
یک برآورد خوب فقط یک عدد نیست. چهار بخش دارد: بازه، اطمینان، فرضها و ریسکها.
بد
«سه روز.»
- هیچ بازهای ندارد.
- معلوم نیست چه چیزی داخلش حساب شده است.
- شنونده آن را یک قول میشنود.
خوب
«به احتمال زیاد بین ۸ تا ۱۴ روز کاری. این عدد شامل تست، بازبینی و استقرار است. فرض کردهام که پنل مدیر فقط ساختن و غیرفعال کردن کد را دارد. بزرگترین ریسک درگاه پرداخت است. فردا یک روز آن را بررسی میکنم و پسفردا عدد دقیقتری میدهم.»
اگر کسی در راهرو یک عدد فوری خواست، بگو: «الان فقط یک حدس خیلی کلی دارم. تا فردا یک برآورد درست میدهم.» این یک روز، از سه هفته بیاعتمادی خیلی ارزانتر است.
در طول کار
برآورد یک بار گفته و فراموش نمیشود:
- پیشرفت را با تکههای کوچک بسنج. «سه تکه از پنج تکه تمام شده» دقیقتر از «هفتاد درصد کار شده» است.
- دیر شدن را زود بگو. اگر روز سوم فهمیدی کار دیر میشود، همان روز بگو. خبر بد زود، به کسبوکار وقت انتخاب میدهد. خبر بد دیر، فقط غافلگیری است.
- دامنه را کم کن، نه کیفیت را. اگر وقت کم است، یک بخش را حذف کن یا عقب بینداز. حذف تست، کار را بعداً گرانتر میکند.
- برآورد و واقعیت را مقایسه کن. بعد از چند کار، شاید ببینی که کارهایت معمولاً یک و نیم برابر برآوردت طول میکشند. این عدد برای برآوردهای بعدی خیلی ارزشمند است.
اشتباههای رایج
| اشتباه | نتیجه | راه درست |
|---|---|---|
| یک عدد تنها، بدون بازه | شنونده آن را قول میشنود. | بازه، فرضها و ریسکها. |
| برآورد کار بزرگ به شکل یک تکه | چیزهای زیادی دیده نمیشوند. | شکستن به تکههای یک یا دو روزه. |
| فقط شمردن زمان کدنویسی | تست، بازبینی و استقرار جا میمانند. | کارهای پنهان را جدا بنویس. |
| کم کردن عدد برآورد برای رسیدن به هدف | کار همان قدر طول میکشد، فقط دیرتر معلوم میشود. | کم کردن دامنه کار. |
| برآورد بخش نامعلوم بدون بررسی | بیشترین تأخیر از همین بخش میآید. | اول یک بررسی کوتاه با زمان محدود. |
| پنهان کردن تأخیر تا روز آخر | اعتماد از بین میرود و کسی وقت واکنش ندارد. | خبر بد را زود بگو. |
| برآورد کار به جای کسی که آن را انجام میدهد | عدد با سرعت و دانش آن آدم جور نیست. | کسی که کار را انجام میدهد در برآورد باشد. |
خلاصه در شش خط
- برآورد یک پیشبینی است. هدف خواسته کسبوکار است. تعهد قولی است که بعد از مقایسه این دو میدهیم.
- اول کار بازه پهن است. با پیشرفت کار، برآورد را تکرار کن.
- کار را به تکههای کوچک بشکن و کارهای پنهان را جدا بشمار.
- برای بخش نامعلوم، اول یک بررسی کوتاه با زمان محدود انجام بده.
- با سه عدد برآورد کن و نتیجه را با بازه، فرضها و ریسکها بگو.
- تأخیر را زود بگو و اگر وقت کم است، دامنه را کم کن، نه کیفیت را.