Meskipun relatif mungkin bagi pengembang yang berpengalaman untuk memperkirakan berapa lama waktu yang diperlukan untuk mengimplementasikan kode ketika pola dan masalah yang dipecahkan oleh kode dipahami dengan baik, bagaimana Anda bisa membuat estimasi yang baik ketika, sementara tujuan akhir dipahami dengan baik, Implementasi adalah 95% teoretis / pemecahan masalah dan memiliki jumlah implementasi yang sangat kecil?
Pekerjaan saya sering kali terdiri dari tugas untuk mencapai tujuan yang terdefinisi dengan baik, namun saya harus menemukan cara untuk mencapai tujuan itu dan sampai saya memahami solusinya, tidak jelas apa hambatan tambahan yang mungkin ada. Lebih khusus, saya sering bekerja pada pembuatan kode atau alat manipulasi kode otomatis. Setelah solusi sepenuhnya dipecahkan dan alat disempurnakan, itu akan langsung melakukan 95% dari perubahan aktual dengan sangat cepat. Namun, saya tidak punya cara untuk memperkirakan berapa banyak masalah tambahan yang harus diselesaikan untuk membuat generasi atau alat analisis menangani kasus tepi yang tidak terduga.
Untuk tujuan perencanaan, perusahaan saya menginginkan gagasan yang lebih baik tentang berapa lama waktu yang dibutuhkan, tetapi karena saya tidak tahu berapa banyak masalah tambahan yang muncul ketika bekerja melalui penyelesaian setiap langkah solusi. Saya tidak yakin bagaimana saya bisa mendekati memberikan perkiraan yang lebih baik.
sumber
Jawaban:
Sebelum saya melangkah terlalu jauh, izinkan saya mengatakan bahwa Perkiraan Perangkat Lunak: Demistifying the Black Art adalah sumber yang bagus untuk orang-orang yang melihat dan berpikir tentang perkiraan. Kedua gambar di bawah ini berasal dari buku itu sebagaimana inti jika ide-ide yang disajikan berikut.
Seperti yang telah Anda catat, estimasi adalah bagian penting untuk dapat memprediksi dan merencanakan pekerjaan secara akurat. Tidak memiliki estimasi membuat bisnis buta tentang berapa lama sesuatu akan terjadi. Bukan hal yang aneh bagi bisnis untuk memiliki gagasan yang sepenuhnya keliru mengenai berapa lama hal itu akan terjadi - apa yang menurut mereka mudah memakan waktu enam hingga delapan minggu dan apa yang dianggap sulit adalah hack sore hari Jumat.
Hal pertama adalah memberi perkiraan. Perkiraan itu sendiri bukan angka tunggal - itu komitmen. "Berapa lama ABC berlangsung" -> "Sekitar 5 hari" berarti sekitar 5 hari. Namun, perkiraan yang baik adalah rentang di mana Anda 90% yakin bahwa Anda akan memilikinya dalam kisaran itu. Jika Anda bermaksud mengatakan "Saya 90% yakin bahwa itu akan memakan waktu antara 1 dan 5 hari" maka katakan itu. Jangan bekerja dari "Saya pikir itu akan memakan waktu antara 1 dan 10 hari, jadi 5 hari mungkin tentang rata-rata" - itu bukan perkiraan dan Anda akan salah 50% dari waktu.
Nah, 50% atau lebih dari waktu itu, programmer terkenal sebagai underestimator yang terkenal untuk waktu tugas.
Pertimbangkan Kerucut Ketidakpastian:
Gambar dari http://www.construx.com - artikel lengkap di http://www.construx.com/Thought_Leadership/Books/The_Cone_of_Uncertainty/
Sadarilah bahwa perkiraan pertama dalam kisaran itu adalah 16x. Ini mirip dengan mengatakan "Saya pikir itu akan memakan waktu antara siang dan dua minggu" - tetapi Anda belum tahu. Saat Anda maju sedikit dengan desain, kisaran menyempit ke 4x. Ini tidak berarti bahwa itu akan memakan waktu satu minggu, itu berarti bahwa Anda malah akan mengatakan "setelah melihat ini sedikit, itu akan memakan waktu antara tiga minggu" - ya, perkiraan naik, tetapi juga kisaran perkiraan pergi turun.
Dengan setiap taksiran yang Anda berikan, Anda harus yakin 90% bahwa taksiran itu berada dalam kisaran itu. Anda bisa salah - 10% dari waktu itu akan jatuh dari kisaran itu.
Ada banyak cara untuk memperkirakan ukuran proyek. Membandingkannya dengan proyek-proyek sebelumnya, menggunakan proxy (saya pikir itu akan membutuhkan 1000 baris kode yang akan memakan waktu selama ini untuk menulis), menggunakan titik fungsi (untuk mengkonversi menjadi LOC ...), mendapatkan perkiraan dari sejumlah orang dan kemudian menyempurnakannya secara iteratif ... beberapa pekerjaan untuk beberapa proyek, beberapa pekerjaan untuk proyek lain.
Sebuah sangat bab penting dalam buku ini yang saya sebutkan di atas adalah # 23 yang berkaitan dengan politik estimasi dan berurusan dengan manajer dan eksekutif.
Kunci untuk estimasi adalah proses berulang menyempurnakannya setelah mengerjakannya sedikit.
Memberikan perkiraan yang terlalu tepat terlalu awal dalam proses bisa sangat rawan kesalahan. Jika Anda tidak yakin tentang hal itu, berikan perkiraan luas dan kemudian kembalilah dengan perkiraan lain setelah beberapa periode waktu untuk introspeksi lebih dalam masalah dan mungkin menggambarkan bagaimana Anda akan melakukannya, melihat berapa banyak kode yang Anda buat untuk itu masalah serupa yang terakhir dan faktor-faktor lain yang akan mempengaruhi estimasi.
Perkiraan membutuhkan beberapa pemikiran - jangan berikan perkiraan manset. Ini sering memiliki kesalahan besar yang terkait dengan mereka dibandingkan dengan apa yang diperlukan ketika Anda memikirkannya sedikit.
Dari Bagaimana merespons ketika Anda diminta perkiraan?
Dari Bab 4 Estimasi Perangkat Lunak:
Perhatikan bahwa dalam hal ini, perkiraan setelah sedikit peninjauan secara sistematis kurang liar dan rawan kesalahan daripada taksiran perkiraan. Jangan lakukan perkiraan manset. Duduk dan pikirkan tugas itu dan perkirakan setelah sedikit memikirkannya.
sumber
Lihat, masalah yang memperkirakan berapa lama waktu yang dibutuhkan untuk menyelesaikan suatu masalah adalah bahwa dibutuhkan orang yang berbeda dalam jumlah waktu yang berbeda. Jika Anda memiliki riwayat penyelesaian masalah yang sama, Anda dapat memperkirakan berdasarkan berapa lama waktu yang Anda butuhkan sebelumnya. Jika tidak, maka Anda tidak memperkirakan, Anda hanya menebak.
Selain itu, masalahnya mungkin bahkan tidak memiliki solusi yang dapat diterima. Atau mungkin solusinya akan membutuhkan otorisasi lebih lanjut yang dapat membatalkan seluruh proyek. Atau mungkin solusi mengubah seluruh sifat masalah yang dirasakan sehingga solusi menjadi sama sekali tidak perlu.
Moral dari cerita ini adalah, jika Anda tidak memiliki informasi yang cukup untuk membuat estimasi yang masuk akal, maka jangan . Belum. Dapatkan informasi lebih lanjut. Penelitian lebih lanjut. Biasanya tidak apa-apa untuk mengatakan, "Saya akan menghubungi Anda dalam 2 hari dengan beberapa angka yang lebih solid."
Ketika merancang solusi untuk klien saya, saya tidak akan menandatangani kontrak sampai saya memiliki cukup banyak desain umum yang lengkap sehingga saya tahu seperti apa solusi itu dan berapa lama proyek akan berlangsung. Ini berarti bahwa saya beresiko telah melakukan pekerjaan desain awal yang saya tidak dibayar (jika proyek tidak melalui), tetapi itu lebih baik daripada beresiko kekurangan biaya untuk pekerjaan yang dilakukan secara signifikan .
sumber
Saya akan menyarankan Anda untuk mencoba sesuatu di tengah-tengah antara jawaban tylerl dan MichaelT dengan yang berikut:
Alasan di balik adalah bahwa Anda tahu berdasarkan pengalaman bahwa Anda perlu X hari untuk menganalisis basis kode yang diberikan (mungkin tergantung pada ukurannya) dan memiliki setelan alat dasar atau skrip yang berjalan (dan mungkin gagal). Kemudian, jumlah kesalahan harus memberi Anda beberapa informasi tentang kesulitan tugas yang sebenarnya.
Ini mungkin tidak persis seperti yang diinginkan manajemen, tetapi saya percaya selalu lebih baik untuk membuat perkiraan yang akan Anda temui.
sumber
Karena pertanyaan ini terutama tentang jenis pekerjaan penelitian, meminta pengembang perangkat lunak adalah pendekatan yang berani, metrik yang umum adalah bahwa pengembang perangkat lunak yang membutuhkan waktu dua kali lebih lama dari perkiraan mereka mungkin merupakan pengembang yang baik. Namun, yang mengatakan, tugas penelitian (dan desain arsitektur) sangat banyak bagian dari pemrograman, dan sering dilewati / diminimalkan. Mereka juga sering sulit diperkirakan.
Pertanyaan pertama yang akan saya tanyakan pada diri saya, apakah ini masalah yang bisa diselesaikan? Ini bukan masalah kecerdasan atau kekuatan otak, tetapi salah satu realitas praktis. Kecuali Anda berada di dunia tembakan bulan Google, di mana kegagalan merupakan hasil yang diharapkan, realitas keras adalah bahwa saya akan diharapkan untuk memberikan ini , apa pun ini ternyata menjadi. Aturan dasar yang kasar sepertinya adalah apakah kita sudah tahu 90% dari solusi yang dibutuhkan?
Pertanyaan kedua yang akan saya tanyakan, apa lagi yang berguna untuk diketahui dalam memikirkan solusinya? Ini benar-benar cara mengecek apakah kita benar-benar cukup tahu untuk menghasilkan solusi yang dapat diterima. Ini dapat menghasilkan serangkaian tugas pencarian fakta yang membantu untuk lebih menentukan apa solusi yang dibutuhkan, yang masing-masing biasanya cukup mudah untuk didefinisikan dan diperkirakan.
Pertanyaan ketiga adalah, siapa yang paling cocok di tim untuk masalah seperti ini? Siapa pun yang mendapatkan tugas ini akan merasakan hasilnya dengan gaya mereka sendiri. Memberikan masalah seperti ini kepada seorang programmer yang memiliki 10 juta pertanyaan di awal tugas, dan kemudian pergi dan memberikan sesuatu pertama kali (meskipun lambat) mungkin merupakan pilihan yang lebih baik daripada memberikannya programmer yang memadukan implementasi dengan cepat , tetapi ketika ada masalah, itu hanya ditemukan pada akhir proses.
Kemudian, tugas sebenarnya adalah memikirkan kemungkinan solusi, implementasi dan pendekatan, dan untuk memiliki skala waktu yang tetap di mana mereka perlu melaporkan kembali.
Ketika mereka melaporkan kembali, Anda kemudian memiliki pilihan tentang mendapatkan serangkaian solusi yang lebih luas, memberikan persetujuan untuk mengimplementasikan solusi, atau mencerminkan, karena solusi tersebut masih belum didefinisikan dengan cukup jelas.
sumber
Dengan pertanyaan penelitian di mana tidak jelas bahwa ada jawaban sama sekali, apalagi gagasan yang jelas tentang apa yang harus dilakukan, saya biasanya mengusulkan untuk menghabiskan jumlah waktu x di atasnya sebagai permulaan.
"Aku tidak tahu apakah ini mungkin, tapi aku bisa menghabiskan dua hari untuk meneliti itu. Itu mungkin tidak akan memberi kita solusi, tapi mungkin aku akan bisa mengesampingkan beberapa hal dan aku mungkin akan punya ide apa langkah konkret selanjutnya dan investasi waktu seperti apa yang akan mereka maksud. Lalu kita dapat memutuskan apakah masuk akal untuk mengambil langkah lain. "
Jadi letakkan ketidakpastian di arah lain - perkiraannya tepat (saya akan menghabiskan dua hari), hanya saja tidak ditentukan apa yang akan dicapai saat itu.
Timeboxing, pada dasarnya.
sumber