Saya telah mengerjakan proyek perangkat lunak kebanyakan solo selama lebih dari 5 tahun. Awalnya memang berantakan (saya adalah pengembang ketiga atau keempat yang mengerjakannya), dan meskipun tidak terlalu berantakan sekarang ini masih sangat tidak terorganisir. Tingkat kemajuan dalam mengendalikannya adalah gletser dan saya mulai merasa sedih atas keadaannya. Bagaimana cara saya benar-benar mulai memperbaikinya?
Khusus proyek: Ini adalah program penjualan yang ditulis hampir seluruhnya dalam Visual Basic Classic (VB6) dengan ujung belakang MySQL dan mesin pelaporan yang ditulis dalam C #. Modul pelaporan C # adalah kegembiraan untuk dikerjakan, itu baru saja ditulis dalam beberapa tahun terakhir dan sebelum itu semua laporan dilakukan di Crystal Reports 9 (ya, kami masih memiliki beberapa laporan yang mengandalkannya).
Program yang sebenarnya itu sendiri, bagaimanapun, adalah bencana yang lengkap. Tidak ada total 90k LOC, dan sekitar 10k baris komentar (kebanyakan bukan dokumentasi, tetapi kode lama yang sudah dikomentari). 158 file formulir, dan 80 file modul. Saya tidak tahu berapa banyak dari mereka yang benar-benar digunakan, karena beberapa fitur dari program ini cukup usang dan (eh, kadang-kadang) dicatat seperti itu tanpa kode yang terkait dihapus dari program. Saya kira hanya 50% kode yang digunakan secara produktif sebenarnya.
Saya takut menyentuh banyak kode hanya karena saya tidak yakin jika saya melanggar sesuatu yang diandalkan oleh satu klien yang tidak dikenal, itu terjadi pada lebih banyak kesempatan daripada yang bisa saya hitung. Ini seperti ada ranjau darat berserakan di seluruh kode.
Ada tidak benar-benar struktur proyek. Ini tidak berorientasi objek kecuali di beberapa tempat saya memiliki kesabaran untuk melakukan reformasi sejauh ini. Jika Anda perlu mendapatkan data pada formulir, Anda instantiate objek database, mendeklarasikan permintaan Anda di sana dalam fungsi, jalankan dan lakukan apa yang Anda inginkan dengan dataset.
Ketika saya mulai mengerjakan proyek tidak ada sumber kontrol yang digunakan. Saya mencoba untuk mendorong orang lain yang sedang berusaha untuk menggunakannya, tetapi saya adalah orang baru dan upaya saya untuk membuat orang menggunakan subversi tetapi gagal. Pengembang utama perusahaan akhirnya menangkap bug lincah dalam beberapa tahun terakhir dan dia memastikan bahwa semua pengembang menggunakan kontrol sumber pada semua proyek sekarang, jadi setidaknya itu beberapa kemajuan.
Saya pikir jika saya dapat bekerja untuk mereformasi proyek secara penuh, saya akan dapat membuat kemajuan yang layak dan mungkin bahkan memiliki perkiraan untuk berapa lama waktu yang saya perlukan untuk menyelesaikan proyek sepenuhnya, tetapi itu sedang digunakan secara aktif dan saya terus-menerus diminta untuk memadamkan api, memperbaiki bug, menambahkan fitur, dll.
Jadi bagaimana saya mulai benar-benar memperbaiki proyek ini? Cobalah untuk alat VB6 dengan bahasa lain? Coba dan tulis ulang program di waktu luang saya? Atau ini benar tanpa harapan?
Memperbarui
Setelah posting ini saya kembali ke proyek dengan semangat baru, tetapi jatuh kembali ke keputusasaan dalam beberapa bulan setelah melihat tingkat kemajuan yang lambat. Saya kemudian mengulangi siklus ini 2 atau 3 kali lebih banyak selama satu tahun ke depan.
Sejak itu saya pindah ke pekerjaan lain. Meskipun setelah bertahun-tahun vb6, dan hanya pengalaman periferal dengan teknologi lain pencarian itu sulit dan saya menghadapi banyak penolakan di sepanjang jalan (sekitar selusin wawancara selama setahun). Saran saya kepada orang lain dalam situasi ini adalah mempertimbangkan meninggalkan faktor ini sendirian. Pertimbangkan kerusakan yang dapat Anda lakukan untuk karier Anda dengan tetap berada di posisi buntu seperti ini.
sumber
Jawaban:
Sekarang karena sudah dalam kontrol sumber, Anda dapat menyingkirkan kode yang dikomentari.
Saya mulai di sini dalam situasi yang sama (aplikasi 80KLOC VB6 tanpa kontrol sumber, tanpa struktur nyata, hampir semuanya dilakukan dalam event handler).
Dalam sekitar 2 tahun hidup dan mati, saya telah mendapatkan lebih dari setengah dikonversi ke C # (biasanya ketika fitur baru yang signifikan diperlukan). Semua C # kode baru memiliki cakupan tes unit. Ini jelas membutuhkan jauh lebih banyak waktu untuk mengkonversi ke C # sekalipun. Jika Anda tidak menambahkan modul baru yang signifikan, saya tidak akan turun rute itu.
Satu hal yang saya lakukan adalah membuat lapisan akses data dasar yang secara otomatis dihasilkan sendiri dari database. Setidaknya menangkap masalah di mana nama kolom tabel berubah dan saya tidak menemukan semua tempat dalam kode. Juga, saya perlahan-lahan memindahkan logika bisnis ke modul, keluar dari penangan event formulir.
Aku, bagaimanapun, memiliki keuntungan bahwa aplikasi itu hanya internal. Karena saya hanya memiliki satu situs untuk digunakan, saya bisa mengambil risiko yang lebih besar daripada yang Anda bisa. Jika saya melakukan kesalahan, biasanya bukan masalah besar untuk memperbaikinya. Terdengar seperti Anda tidak memiliki kemewahan itu.
Saya benar-benar berpikir Anda terbaik adalah untuk mengambil pendekatan berikut:
Ingat, tujuan dari program ini adalah untuk menjadi produk yang menghasilkan uang bagi perusahaan Anda. Itu tidak harus menjadi karya seni yang sempurna (dan saya perfeksionis sehingga sangat sulit bagi saya untuk mengakuinya). Kadang-kadang lebih baik untuk merangkul pragmatisme.
Seharusnya ada banyak programmer COBOL di luar sana yang mempertahankan kode legacy dalam jumlah besar. Saya ragu mereka semua bekerja keras untuk menulis ulang dalam beberapa bahasa baru. :)
sumber
Yang perlu Anda lakukan adalah refactoring. Refactoring hampir mustahil dalam situasi seperti itu tanpa unit test yang memberi Anda kepercayaan diri bahwa Anda belum merusak apa pun. Karena itu, mulailah dengan membuat unit test. Dokumentasikan perilaku kode - tetapi tidak (hanya) di atas kertas, tetapi lebih banyak kode - tes unit. Setelah tes selesai, Anda dapat mulai menyusun kembali kode.
sumber
Satu aturan dari " Debugging " David Agan muncul di pikiran: berhenti berpikir dan melihat. Anda kebetulan memiliki mesin yang mampu memproses teks dalam jumlah besar. Gunakan untuk mengetahui dengan tepat kode apa yang tidak lagi digunakan, dan hapus tanpa belas kasihan. Jika Anda membuat kesalahan, untuk itulah kontrol sumber dilakukan.
Itu bagian yang mudah. Apa yang perlu Anda pikirkan selanjutnya adalah bagaimana Anda memakan seekor gajah? Satu gigitan sekaligus. Ambil " Refactoring " Martin Fowler dan bawa fungsinya berdasarkan fungsi, file demi file. Jangan sepenuhnya memo sesuatu dan menulis ulang dari apa yang Anda pikirkan persyaratannya. Bekerjalah seperti pendaki gunung, jangan pernah lepaskan keselamatan Anda sebelumnya sampai keselamatan berikutnya tercapai.
Sudah cukup metafora? Intinya adalah jika Anda melakukannya dengan lambat dan mantap, dengan banyak perbaikan semudah mengganti nama atau memisahkan fungsi, Anda dapat meningkatkan bagian buruk dari kode tanpa merusak bagian yang baik dari kode itu yang dibangun selama bertahun-tahun dengan permintaan debugging dan fitur. . Anda ingin kode tetap dapat dikirim kapan saja. Jika mungkin untuk melakukan itu saat porting ke bahasa yang lebih modern, lakukanlah.
sumber
Aku benci mengatakannya, tetapi aku akan pergi dengan "benar-benar putus asa" di luar hanya terus melakukan siklus patch / meningkatkan tanpa akhir dan berharap tidak ada yang rusak. Saya telah melihat terlalu banyak proyek VB6 seperti yang Anda gambarkan dan berusaha untuk memperbaiki / menulis ulang / mengulanginya menjadi C # /. NET gagal sangat, sering dengan orang-orang yang bertanggung jawab atas upaya yang dipecat.
Masalahnya adalah bahwa menulis ulang lengkap dari bawah ke atas akan diperlukan cepat atau lambat. Versi VB6 dan Windows yang mendukungnya dengan baik mengalami penurunan. Menemukan pengembang yang mengetahui kebiasaan VB6 dan yang bersedia bekerja pada program seperti ini semakin jarang. Batas internal VB6 akan mengenai program besar seperti ini, menyebabkan kesalahan aneh.
Jika ada konsensus dan komitmen yang baik untuk total, membangun, mendesain ulang, dan menulis ulang pada titik ini, mulailah mengerjakannya dan mendelegasikan pemeliharaan berkelanjutan kepada orang lain (kontraktor, programmer junior, apa pun yang sesuai untuk Anda). Jika orang belum cukup yakin untuk memulai ini, tunggulah sampai rasa sakitnya menjadi cukup hebat atau pindah ke padang rumput yang lebih hijau.
sumber
Beberapa jawaban bagus sudah ada di sini, saya ingin menambahkan satu hal. Alih-alih mencoba menulis ulang semuanya, mungkin Anda akan memiliki kesempatan untuk mem-porting setidaknya beberapa modul yang sebagian besar 1: 1 ke VB.NET (tentu saja, Anda harus sangat berhati-hati saat melakukan ini)? Menurut pengalaman saya, porting seperti itu dapat dilakukan dengan ~ 5-10 kali lebih sedikit upaya daripada mencoba membangun kembali semua fungsi yang ada dari awal. Dan setelah Anda porting, maka Anda dapat mulai melakukan refactor - dengan semua alat yang tersedia di dunia .NET, seperti alat pengujian unit yang bagus, alat refactoring otomatis, OOP asli, dll.
Saya telah berada dalam situasi yang sama, di mana kami harus memigrasi program C ++ 16 bit lama (150k LOC) ke dunia 32 bit, di mana kerangka kerja GUI asli yang digunakan tidak tersedia lagi. Kami butuh beberapa waktu untuk memahami bahwa menulis ulang itu tidak realistis, tetapi setelah kami memutuskan untuk porting hal itu ke dunia .NET, menggunakan C ++, C ++ / CLI dan C #, kami hanya membutuhkan sekitar 9 bulan untuk mewujudkannya (dengan sekitar 1 dev penuh waktu mengerjakan proyek itu). Dan kami tidak memiliki tes unit untuk bagian GUI yang tersedia, melakukan semua pengujian bagian-bagian itu secara manual.
sumber
Meskipun itu menempatkan BANYAK penekanan pada unit-menguji aplikasi Anda yang, meskipun hal yang sangat penting untuk dilakukan, adalah sesuatu yang sangat sulit dilakukan di VB6, Steven McConnell menulis buku yang bagus tentang bagaimana menangani projet semacam itu.
Lihatlah itu:
Pada dasarnya, maksudnya adalah menerimanya perlahan, sedikit demi sedikit. Dia juga merekomendasikan untuk memulai dengan menggunakan teknik refactoring yang sangat tidak mungkin untuk memecahkan apa pun, kadang-kadang membuatnya sedikit lebih buruk dalam jangka pendek, dan untuk mulai menggunakan teknik yang lebih maju karena kode semakin bersih dan memiliki unit test untuk mendukungnya.
sumber