Cara terbaik untuk memperkirakan biaya terkait kode porting dari bahasa A ke bahasa B?

8

Adakah klien yang berpikir tentang memperkirakan biaya pengangkutan proyek dari bahasa A ke bahasa B. Apa cara terbaik untuk mengumpulkan permintaan proposal untuk melakukan ini?

kesalahan besar
sumber
3
Mengapa Anda perlu melakukan itu? Sulit bagi saya untuk membayangkan itu menjadi pilihan yang baik.
Anto
+1 @Anto: Bahasa A ada di Perl, klien khawatir tentang keamanan basis kode yang berjalan di server jauh. Terima kasih!
kesalahan
Lebih baik Anda hanya bertanya, "Cara terbaik untuk memperkirakan biaya?" Itu sama mustahilnya untuk dijawab.
S.Lott
2
@blunders: menyusun estimasi untuk melakukan audit keamanan penuh dari basis kode, dan kemudian mengalikannya dengan 50.
Carson63000
1
Itu harus memakan waktu 6 hingga 8 minggu. Atau gunakan alat ini: cznp.com/6to8weeks/index.php
JohnFx

Jawaban:

10

Jika tujuannya hanya untuk mereproduksi satu aplikasi persis ke dalam bahasa baru, saya sarankan Anda membicarakan hal itu dengan klien Anda. Porting adalah salah satu hal yang paling berbahaya yang dapat Anda lakukan karena semua orang kebiasaan yang datang karena mereka diimplementasikan dalam Bahasa A dapat diandalkan oleh pengguna akhir, dan tiba-tiba Anda harus menciptakan mereka di Bahasa B . Hal-hal buruk. Belum lagi porting adalah biaya yang benar-benar hangus yang mereka tidak pernah bisa berharap untuk pulih.

Saya akan menyarankan memperlakukan proyek seperti yang lain dan mengumpulkan persyaratan dan memperkirakan seolah-olah aslinya tidak ada. Anda mungkin akan menemukan bahwa pengguna akhir memiliki perspektif baru tentang produk sejak menggunakannya. Jika Anda akan menulis ulang, mungkin lebih baik.

jbondeson
sumber
3
TDD adalah pendekatan yang cukup bagus. Ringkas beberapa kasus penggunaan. Tetapkan beberapa tes untuk kasus penggunaan yang dilewati oleh kode yang ada. Tulis kode baru yang lolos tes. Gunakan kode lama sebagai semacam "wasit" atau "wasit" jika ada pertanyaan tentang kasus tepi.
S.Lott
@ S.Lott: cukup sulit untuk TDD pengalaman pengguna akhir.
quentin-starin
@ S.Lott: Saya pikir masalahnya di sini adalah bahwa bahasa memiliki kebiasaan. Melakukan sesuatu dengan cara alami di Perl kemungkinan akan menghasilkan perilaku aneh dalam kasus sudut, dan merekonstruksi perilaku yang tepat ini, katakanlah, Common Lisp akan menjadi canggung. Kecuali Anda tahu apakah pengguna mengandalkan perilaku ini atau tidak, Anda tidak tahu harus menguji apa.
David Thornley
@ qes: Jika Anda tidak bisa mengujinya, itu tidak ada. Serius. Pengguna akhir harus "melakukan" sesuatu. Dan sesuatu itu harus diuji. Tanpa pengujian, bagaimana Anda mengklaim bahwa itu "selesai"?
S.Lott
1
@ S.Lott: Itulah yang ingin dilakukan IBM dengan emulasi IBM 360 (IIRC) pada 7094 komputer sebelumnya. Mereka menemukan bahwa beberapa pelanggan mereka mengandalkan fitur tidak berdokumen yang merupakan kecelakaan dari implementasi 7094, dan akhirnya mereplikasi selusin atau dua perilaku yang mereka pikir tidak perlu.
David Thornley
4

Jika Anda sudah memiliki basis kode Perl, Anda tahu jumlah baris kode (LOC). Lihat apakah Anda dapat menemukan perbandingan ekspresif antara Perl dan Bahasa B. Inilah salah satu contohnya.

Katakanlah Bahasa B adalah Java. Kemudian LOC yang ditebak waktunya untuk port akan menjadi sekitar empat kali LOC dari yang asli (ekspresifitas 6 berbanding 1,5).

Kemudian gunakan sesuatu seperti perangkat lunak Construx Estimate dalam mode LOC untuk memperkirakan berapa lama Anda (dan berapa banyak orang yang diperlukan).

Itu akan memberi Anda perkiraan biaya dan waktu rata-rata, serta beberapa gagasan tentang seberapa besar kemungkinan Anda akan melampaui batas.

Jika Anda sudah mahir di Bahasa B dan telah menjalankan beberapa proyek terukur di dalamnya, Anda dapat menggunakan perangkat lunak Construx Estimate untuk mengkalibrasi untuk tim Anda.

Peter K.
sumber
1
Ya, lalu gandakan perkiraan itu dengan 2 atau 3 untuk memperhitungkan pelanggaran yang tak terhindarkan, hal-hal yang tidak Anda mengerti, server yang lebih kuat yang perlu Anda beli, kopi tambahan, obat penghilang rasa sakit untuk sakit kepala, dan sebagainya.
cepat_now
@quickly_now: setuju, tetapi Estimasi Construx memberi Anda rentang waktu yang memungkinkan, yang menyumbang beberapa variasi tersebut. Itu bagian dari apa yang saya sukai: itu tidak memberikan perkiraan. Ini memberikan jangkauan.
Peter K.
2

Joels artikel paling populer , 'Things You Should Never Do' mengatakan itu yang terbaik: Mereka melakukannya dengan membuat kesalahan strategis terburuk yang dapat dilakukan oleh perusahaan perangkat lunak:

Mereka memutuskan untuk menulis ulang kode dari awal.

Jika Anda akhirnya menulis ulang, tulis ulang dengan benar dan jangan hanya porting:

  • Bagian mana dari program yang tidak lagi digunakan? Lewati bagian ini.
  • Bagian mana dari program yang paling penting? Port ini dulu.
  • Program baru, saatnya menyegarkan GUI dan membuatnya lebih mudah digunakan dan lebih 'seksi'.
  • Oh, apakah investasi besar waktu tidak lebih baik digunakan untuk hanya menambahkan lebih banyak fitur ke kode lama?
Carra
sumber
2
Ada perbedaan besar antara "menulis ulang dari awal" dan "port kode ke bahasa lain".
2

Menurut saya, ini akan memakan banyak waktu. Anda lebih baik yakin itu sepadan. Coba ambil bagian dari kode dan porting. Lipat gandakan berapa lama waktu yang dibutuhkan oleh rasio baris kode yang Anda portingkan dengan total baris kode. Ini akan memberi Anda angka rata-rata, yang asli akan lebih tinggi oleh beberapa mulitple yang paling mungkin.

Secara efektif Anda menulis aplikasi lagi dari awal tetapi memiliki persyaratan yang ditentukan dalam bahasa lain, itu tidak sepele.

Alb
sumber
+1 @Alb: Setuju, tentang mengambil potongan kode sebagai ujian. Rencana saya adalah memasukkan potongan kode Perl (200 baris) dalam RFP dan memerlukan port dengan tawaran yang merespons. Ini juga akan memungkinkan saya untuk membandingkan kode di antara penawaran, karena mereka semua akan mendapatkan potongan kode yang sama.
kesalahan
1

Saya pikir pertama dan terutama, Anda harus benar-benar mempertimbangkan apakah ini pilihan yang baik. Apa keuntungan menggunakan bahasa B daripada bahasa A?

Saya pikir IBM memiliki penyelidikan yang mengatakan bahwa programmer menulis, rata-rata, 100LOC per jam. Masih ada lebih banyak pengembangan daripada itu, tetapi arsitektur lama masih direncanakan. Katakanlah 50% akan menulis kode, karena programnya masih direncanakan, kan? (Bisa jadi Anda memiliki program terstruktur dan Anda ingin yang berorientasi objek dan itu akan menjadi tugas yang lebih besar).

Tetapi jika seseorang akan menulis 100LOC / jam, bagi jumlah LOC saat ini dalam sistem dan kalikan dengan penjualan rata-rata seorang programmer dan kalikan dengan 2. Ini mungkin memberikan perkiraan kasar. Jangan menganggap angka yang Anda dapatkan sangat serius. (bahkan lebih baik, jangan menganggapnya serius sama sekali). Apa yang ingin Anda lakukan tergantung pada cara banyak hal untuk mengukur, seperti:

  • Kompetensi programmer dalam bahasa baru
  • Seberapa baik mendokumentasikan proyek lama ini
  • Bahasa mana yang dikonversi dari, dan ke mana dikonversi?
Anto
sumber
2
Angka-angka (LOC / hari) terakhir yang saya tahu lebih rendah - sekitar 30. Ini DIRANCANG, DIKode, DOKUMEN dan DIUJI. Semua programmer superstar benar-benar tersinggung dengan angka-angka ini karena mereka tahu mereka dapat membuang 1000 baris kode / hari. Mereka dengan mudah melupakan sedikit tentang waktu untuk desain, dokumen, tes. (Dan waktu dalam rapat kemajuan, perbaikan busuk, memilah arsitektur yang rusak, dll - tetapi Anda benar-benar harus menghitungnya juga. Waktu adalah waktu.)
cepat_now
2
Saya harus menambahkan - angka ajaib LOC / hari ini tampaknya tetap konstan selama 30-40 tahun terakhir. yaitu 30 garis ganjil assembler ... 30 garis ganjil FORTRAN ... 30 garis ganjil c #. Baris-baris kode itu sekarang mungkin melakukan lebih banyak, tetapi tingkat produktivitas keseluruhan yang diukur dalam LOC / hari cukup keras kepala tidak berubah untuk waktu yang sangat lama.
cepat_now
Dalam posting saya, saya katakan bahwa kodenya hanya 50%, jadi Anda harus menggandakan tebakannya. Pada kenyataannya, saya pikir kodenya hanya ~ 10%, tetapi karena programnya telah dirancang, seharusnya tidak perlu waktu lama (atau tergantung pada seberapa berbedanya kedua bahasa itu)
Anto
1

Itu tergantung pada berapa banyak waktu yang Anda miliki. Beberapa opsi:

  • Tidak ada waktu sama sekali, lakukan saja - Ambil bagian belakang serbet dan pergi ke sana. Rasanya kurang dari yang dibutuhkan untuk membuatnya di tempat pertama, dan lebih dari sekadar mengetik ulang dalam sintaks yang berbeda.
  • 1-3 hari - cari tahu apa yang perlu dilakukan pengerjaan ulang arsitektur, coba perkirakan perkiraannya. Cari tahu berapa banyak logika harus diangkut, cari semacam rasio. Tambahkan waktu ekstra untuk tugas terkait keamanan yang akan memberikan harapan bahwa Anda telah meningkatkan keamanan dalam proses. Tambahkan waktu untuk pengujian integrasi berdasarkan kompleksitas pekerjaan dan kesederhanaan arsitektur Anda.
  • 1 bulan - coba beberapa - tahap tes arsitektur, dan coba porting sesuatu. Cari tahu fraksi apa dari kode yang Anda porting dan perkirakan lebih lanjut. Kemungkinan Anda juga akan menemukan beberapa hal yang sama sekali tidak mungkin dalam bahasa baru, dan itu akan memberikan dasar yang lebih baik dari pekerjaan aktual yang terlibat dalam membuat transisi terjadi.

Dalam dunia yang ideal, saya akan mengusulkan kepada klien bahwa mereka membayar tugas investigasi untuk mencakup satu bulan pekerjaan untuk membiarkan Anda membuat prototipe apa yang akan Anda lakukan. Itu memberi mereka pilihan untuk berhenti dan tidak maju jika biayanya terlalu besar. DAN, Anda masih dibayar untuk pekerjaan yang Anda lakukan.

bethlakshmi
sumber
+1 Tugas investigasi adalah ide yang bagus. Memungkinkan pelingkupan yang jauh lebih baik, yang mengurangi risiko latihan. Bahaya menemukan sesuatu yang buruk beberapa minggu kemudian menjadi jauh lebih sedikit.
cepat_now
1

Hanya ada satu cara untuk mendapatkan perkiraan yang layak untuk tugas perangkat lunak. Tugaskan staf yang tersedia untuk melakukan bagian tugas yang kecil namun dapat diuji dari tugas SEPENUHNYA, dan lihat berapa lama waktu yang dibutuhkan. Pisahkan pekerjaan yang tersisa menjadi sebanyak mungkin kasus penggunaan, dan minta staf yang sama memperkirakan setiap iterasi dibandingkan dengan pekerjaan yang sudah dilakukan. Jangan meminta mereka untuk memperkirakan waktu, minta mereka untuk memberitahu Anda bagaimana membandingkannya dengan iterasi pertama. Ini akan memberi Anda estimasi terbaik untuk sisa proyek.

kevin cline
sumber