Tampaknya, dalam pengalaman saya, membuat kami insinyur memperkirakan dan menentukan tugas yang harus diselesaikan secara akurat seperti mencabut gigi. Daripada hanya memberikan perkiraan barang curian 2-3 minggu atau 3-6 bulan ... apa cara paling sederhana untuk menentukan jadwal perangkat lunak sehingga mereka tidak begitu sulit untuk didefinisikan? Misalnya, pelanggan A menginginkan fitur sebelum 02/01/2011. Bagaimana Anda menjadwalkan waktu untuk mengimplementasikan fitur ini mengetahui bahwa perbaikan bug lain mungkin diperlukan di sepanjang jalan dan membutuhkan waktu rekayasa tambahan?
software-schedules
Brian
sumber
sumber
Jawaban:
Jika Anda membuat proyek yang hampir identik dengan proyek lain yang telah Anda lakukan, menggunakan alat yang sudah dikenal dan tim yang akrab, dan Anda diberi persyaratan tertulis yang tegas, maka harus mungkin untuk membuat perkiraan yang baik.
Ini adalah kondisi yang sering dialami oleh pelukis, pemasang karpet, penata taman, dll. Tetapi ini tidak cocok untuk banyak (atau sebagian besar) proyek perangkat lunak.
Kami sering diminta untuk memperkirakan proyek yang menggunakan alat baru, teknologi, di mana persyaratan berubah, dll. Ini lebih merupakan ekstrapolasi ke dalam yang tidak diketahui daripada interpolasi atas pengalaman masa lalu kita. Jadi wajar jika estimasi akan lebih sulit.
sumber
Menurut pengalaman pribadi saya, itu persis kebalikan dari apa yang dikatakan Pemdas : dengan latihan, saya baru mengerti bahwa sama sekali tidak mungkin untuk memperkirakan berapa banyak waktu yang dibutuhkan suatu tugas. Pada awal karir saya dalam pengembangan perangkat lunak, saya sering memberikan perkiraan seperti "45 hari", "lima minggu", dll., Kemudian berusaha sangat keras untuk menyelesaikannya tepat waktu. Beberapa tahun kemudian, saya mulai memberikan perkiraan yang kurang tepat seperti "sekitar satu bulan", "lima hingga tujuh minggu", dll. Sebenarnya, saya mencoba untuk tidak memberikan perkiraan apa pun, atau meminta pelanggan untuk memberikan perkiraannya sendiri atau tenggat waktu atau saya memberikan perkiraan sekasar mungkin.
Mengapa begitu sulit untuk memiliki perkiraan? Karena hampir mustahil untuk mengetahui bagaimana seluruh kode sumber akan ditulis sebelum benar-benar menulisnya, dan karena pekerjaan Anda bergantung pada hal-hal acak ketika orang lain bekerja, motivasi Anda, dll. Berikut adalah daftar yang lebih rinci dari alasan yang mungkin:
Tidak mudah untuk mengetahui apa sebenarnya yang diperlukan untuk melakukan suatu produk, dan terutama bagaimana melakukannya . Sangat sering saya memulai beberapa bagian aplikasi, daripada, setelah berhari-hari bekerja, mengerti bahwa pendekatan pertama saya salah, dan bahwa ada cara yang lebih baik dan lebih cerdas untuk melakukan sesuatu.
Beberapa masalah mungkin timbul . Misalnya, jika, untuk memulai pekerjaan Anda, Anda harus menginstal pada server Anda SQL Server yang mewah dan instalasi gagal dan dukungannya tidak ada, Anda mungkin menghabiskan waktu berminggu-minggu untuk menyelesaikan masalah ini.
Persyaratan seringkali tidak cukup jelas , tetapi setelah membacanya di awal, Anda mengira begitu. Kadang-kadang Anda dapat memahami bahwa berarti 'A', dan, setelah mulai menerapkannya, Anda akan melihat bahwa mereka mungkin berarti 'B'.
Pelanggan suka mengubah persyaratan mereka tepat ketika Anda baru saja menyelesaikan bagian yang bersangkutan , dan mereka benar-benar tidak mengerti mengapa Anda meminta dua minggu lagi dan $ 2000 untuk melakukan perubahan kecil , karena mereka tidak melihat bahwa perubahan kecil ini mengharuskan untuk mengubah hal-hal lain, yang perlu mengubah orang lain, dll.
Anda tidak dapat memperkirakan motivasi Anda . Ada hari-hari ketika Anda dapat bekerja berjam-jam dan berhasil dengan baik. Ada beberapa minggu ketika, setelah menulis sepuluh baris kode, Anda beralih ke Programmer StackExchange, dan menghabiskan berjam-jam membaca dan menjawab pertanyaan.
Keadaan menjadi sangat buruk ketika perkiraan Anda bergantung pada orang lain . Misalnya, dalam satu proyek 2 bulan saya harus menunggu seorang desainer untuk melakukan pekerjaannya untuk menyelesaikan sendiri. Perancang ini membutuhkan waktu 3 bulan sebelum memberikan sepotong omong kosong yang tidak dapat digunakan. Tentu saja proyeknya terlambat.
Perkiraan Anda juga tergantung pada pelanggan Anda . Saya memiliki pelanggan yang menghabiskan waktu berminggu-minggu sebelum menjawab surat mereka. Ini benar-benar dapat mempengaruhi jadwal Anda ketika Anda harus menunggu jawaban mereka (misalnya jika Anda meminta mereka untuk memenuhi persyaratan).
Apa yang bisa kau lakukan?
Berikan jadwal yang lebih besar . Jika Anda pikir Anda bisa melakukan pekerjaan itu dalam dua minggu, katakan Anda akan mengirimkannya dalam satu bulan.
Menjadi jelas . Jika Anda mengandalkan perancang, pengembang lain, dll., Katakan itu. Alih-alih mengatakan "Saya akan mengirimkan produk dalam tiga bulan", katakan "Saya akan mengirimkan produk dalam dua bulan setelah perancang akan memberi saya file PSD."
Jelaskan bahwa jika persyaratan berubah setiap hari, proyek tersebut tidak akan dikirimkan tepat waktu.
Iris jadwal Anda . Memberikan bagian dari proyek besar tepat waktu lebih mudah.
Jangan pernah memberikan perkiraan saat Anda menggunakan produk yang tidak Anda kenal dengan baik atau, terutama, ketika Anda akan mengerjakan kode sumber orang lain: Anda tidak akan pernah bisa memprediksi seberapa buruknya kode sumber dan berapa banyak waktu yang akan Anda habiskan memahami dan menyalin-menempelkannya ke The Daily WTF.
sumber
Pertanyaan yang sangat mirip adalah "Berapa lama waktu yang dibutuhkan untuk menyelesaikan teka-teki silang ini?"
Anda tidak dapat menjawabnya sampai Anda melihatnya untuk melihat banyak hal seperti:
Karena biasanya ada beberapa hal baru dalam suatu proyek (jika tidak itu bukan proyek), Anda tidak dapat mengatakan berapa lama waktu yang dibutuhkan untuk menyelesaikannya sampai Anda telah melihatnya dengan sangat cermat. Mungkin bahkan menyelesaikan lebih atau kurang dari mereka, dan kemudian Anda masih tidak yakin bahwa tidak ada satu atau dua kejutan di mana Anda tidak memikirkan mereka.
Juga ada tekanan kuat untuk melakukannya semurah mungkin, karenanya secepat mungkin dan kesalahan untuk perkiraan yang terlalu rendah tidak terjadi pada tekanan manajer proyek tetapi pengembang memberikan perkiraan tersebut. Tidak perlu banyak iterasi bagi pengembang untuk menangkap ini, dan belajar untuk menjadi SANGAT lelah memberikan angka absolut.
sumber
Tentu saja Anda dapat memperkirakan berapa banyak waktu + -2 menit dari rumah Anda untuk bekerja. Anda tahu cara mengendarai mobil, Anda dapat mengevaluasi lalu lintas, dan beberapa faktor eksternal lainnya.
Katakan berapa lama waktu yang Anda perlukan untuk berkendara dari London ke Barcelona. Tanpa alat perencanaan GPS canggih tentu saja. Menggunakan metode lama yang baik seperti yang masih kita lakukan dalam estimasi perangkat lunak. Estimasi dan prediksi empiris .
Dalam perangkat lunak, ini lebih buruk:
Itu sebabnya tidak mungkin memberi tahu pelanggan Anda apa yang dapat Anda kirim untuk 02/01/2011 dengan akurasi yang baik, dan lupakan tentang 03/01/2011.
Untuk mengatasi semua masalah itu, saya sarankan Anda teknik estimasi lanjutan seperti Poker Perencanaan (penafian: ini adalah salah satu situs web saya) dan Pengembangan Iteratif dengan perhitungan Velocity .
sumber
Pengembangan perangkat lunak - menurut definisi - tindakan penemuan dan penemuan. Itu harus selalu melibatkan sesuatu yang tidak diketahui.
Satu-satunya saat semua yang berhubungan dengan pengembangan perangkat lunak diketahui adalah ketika perangkat lunak selesai.
Satu-satunya saat tidak ada teknologi atau fitur bisnis yang tidak dikenal adalah ketika itu adalah solusi lengkap dan siap untuk diunduh.
Alasan kami menulis perangkat lunak baru adalah karena kami memiliki fitur baru atau teknologi baru atau keduanya. Baru berarti baru - tidak dikenal - tidak dapat diprediksi.
Karena pengembangan perangkat lunak harus melibatkan hal-hal baru, upaya pengembangan tidak dapat diprediksi.
sumber
Jujur, saya pikir itu hanya butuh latihan. Jika Anda menulis kode yang cukup pada akhirnya Anda harus "cukup" akurat. Bos pertama saya percaya bahwa keterampilan ini cukup penting sehingga ia meminta agar saya mempraktikkannya secara informal pada setiap fitur / proyek yang saya laksanakan. Setelah setiap proyek, kami meninjau taksiran dan berupaya mencari tahu di mana kesalahan saya. Akhirnya, Anda bisa menguasainya.
sumber
Tidak pernah mudah. Anda hanya mencoba untuk menjadi lebih baik.
Salah satu keuntungan dari memecah kode yang Anda kirim menjadi potongan-potongan kecil, adalah agar klien mendapatkan pemahaman tentang apa yang diharapkan dan kapan harus mengharapkannya. Sekarang Anda memiliki semacam garis dasar untuk digunakan sebagai referensi.
Jika mereka memiliki definisi ketat dari fitur yang mereka butuhkan pada waktu yang ditentukan, mereka perlu tahu bahwa sumber daya tambahan harus dialokasikan untuk permintaan ini. Mereka mengambil risiko dalam tingkat keparahan bug yang terjadi dan berapa lama mereka bisa pergi tanpa mereka diperbaiki. Ketika sesuatu yang besar muncul, Anda kembali ke klien dan memaksa mereka mengambil keputusan. Apakah saya memperbaiki bug atau membuat tenggat waktu pada fitur baru? Beri mereka informasi yang cukup untuk membuat keputusan.
Semoga Anda memiliki sejarah yang cukup untuk bekerja bersama dan telah memantapkan diri Anda untuk dipercaya. Anda tidak dapat mengharapkan mereka untuk sepenuhnya memahami proses pengembangan, tetapi Anda dapat membuat mereka merasa Anda melakukan upaya yang jujur dan tidak mengambil keuntungan dari kurangnya pengetahuan mereka.
sumber
Karena kami melakukan jadwal terlalu dini. Lihat artikel Construx tentang melakukan kasar awal, kemudian lebih baik nanti. Juga jika Anda tidak melacak apa yang Anda lakukan pada perkiraan sebelumnya, sulit untuk menjadi lebih baik. FogBugz melakukan itu [pelanggan yang gratis, tidak ada konflik kepentingan lain].
sumber
Saya telah belajar banyak dari buku ini:
Estimasi Perangkat Lunak: Demistifikasi Seni Hitam
Singkatnya untuk mendapatkan hasil estimasi yang lebih baik, kami melakukan ini:
Setelah pekerjaan selesai dan perkiraan kami salah, kami mencoba mencari alasannya. Dan kami menggabungkan pengetahuan ini ke dalam proses estimasi selanjutnya. Sejauh ini ini adalah proses terbaik yang saya gunakan untuk memperkirakan tugas yang lebih besar. Ketika saya mengatakan tugas, saya maksudkan pekerjaan yang membutuhkan waktu sekitar 50-500 jam.
sumber
Catatan: Ini benar-benar hanya berlaku untuk proyek-proyek di mana Anda menagih per jam versus tarif tetap / flat
Saya biasanya mencoba untuk merencanakan jadwal saya sehingga pada dasarnya terdiri dari sekelompok Sprint SCRUM (apakah menggunakan SCRUM atau tidak). Di depan saat membuat jadwal, saya menentukan berapa panjang masing-masing sprint dan apa saja fitur untuk proyek tersebut. Biasanya ada beberapa fitur yang harus dilakukan terlebih dahulu jadi saya mencoba memberikan perkiraan terbaik (jangan bingung dengan optimis) untuk itu dan semua fitur yang akan menuju akhir proyek akan memiliki perkiraan umum. Setelah memetakan fitur untuk sprint, saya mencoba menambahkan 1 hingga 2 sprint di bagian akhir proyek untuk memperhitungkan fitur yang meluncur ke kanan dan untuk fitur yang diabaikan dalam pengumpulan persyaratan asli.
Kunci untuk ini adalah bahwa saya membuat semua ini transparan untuk klien di muka sehingga mereka mengerti mengapa dua sprint terakhir kosong atau jarang penduduknya. Setidaknya sampai titik ini klien saya telah bekerja dengan menyukai ini karena mereka tahu bahwa ada beberapa bantal dalam jadwal / keuangan karena sebagian besar dari mereka sadar bahwa estimasi SW cenderung kurang konkret. Mereka juga sadar bahwa jika kita tidak membutuhkan sprint terakhir atau lebih, maka itu adalah jam-jam yang tidak kita tagih. Dengan transparansi dalam bagaimana jadwal dibuat dan umpan balik teratur tentang bagaimana kemajuan berlangsung selama pelaksanaan proyek, setiap klien yang saya lakukan dengan ini sangat puas.
sumber
Selain semua hal yang disebutkan, saya melihat dua hal ini sebagai beberapa masalah terbesar. Pertama, Anda memperkirakan tanggal akhir berdasarkan pada setiap devloper yang tersedia selama 8 jam sehari penuh 5 hari seminggu. Ini tidak benar dan hampir akan menjamin 100% bahwa tanggal berakhirnya proyek tidak sepele. Orang-orang mengambil cuti, menghadiri pertemuan perusahaan (atau non-proyek), berkelahi dengan SDM atas klaim asuransi kesehatan, beristirahat, dll. Jangan pernah menganggap lebih dari ketersediaan 6 jam per pengembang per hari.
Para penyembah berikutnya terkenal lupa untuk memperkirakan semua tugas non-pengembangan seperti pertemuan dan email tentang proyek, penyebaran, dukungan QA, dukungan UAT, tes unit penulisan, penelitian, dokumentasi dll. Setelah kami menambahkan jenis tugas ini ke spreadsheet estimasi kami, kami Perkiraan jauh lebih baik.
sumber
Ketika sampai pada estimasi waktu untuk tugas-tugas yang bisa memakan waktu lebih lama maka beberapa jam saya mencoba yang terbaik untuk menggunakan aturan ini:
Mungkin ada lebih banyak aturan dari itu, tapi saya sebenarnya tidak punya poster dengan aturan ini di dinding saya. Saya baru saja merumuskannya, tetapi itu berasal dari pengalaman saya (jadi mungkin tidak berhasil untuk Anda).
Satu-satunya cara yang dapat diandalkan untuk menjadwalkan pengembangan perangkat lunak yang dapat saya pikirkan (tapi saya belum benar-benar mencobanya) adalah Penjadwalan Berbasis Bukti yang pada dasarnya adalah metode Monte Carlo yang digunakan untuk menghitung probabilitas tanggal pengiriman berdasarkan catatan historis tentang tugas yang Anda lakukan. Saya telah menyelesaikan sebelumnya. Rasanya menyenangkan karena tidak mencoba menggunakan metrik apa pun selain perkiraan dan waktu sebenarnya. Namun, itu membutuhkan banyak pengalaman untuk membagi tugas-tugas besar menjadi yang lebih kecil sebelumnya dan Anda harus memiliki satu set data historis yang besar untuk membuatnya bekerja cukup tepat.
sumber
Ada "tidak dikenal yang diketahui" dan "tidak dikenal". :-)
Perkiraan sering menjadi tenggat waktu.
Persyaratan berubah (seringkali rasional) dan programmer tidak dapat memveto itu.
Programmer tidak / mungkin tidak memiliki kendali atas faktor-faktor seperti
sumber