Bagaimana cara memperbaiki proyek yang pada dasarnya tidak memiliki struktur?

25

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.

Dylan Nissley
sumber
4
Kedengarannya sangat buruk. Langkah awal adalah menyimpan salinan kode saat ini dan menghapus kode lama yang telah dikomentari (itu hanya suara berisik). Ketika saya bekerja pada sistem warisan saya biasanya akan meletakkan tanggal di bagian atas kode saya akan berkomentar. Kemudian mengeluarkan kode komentar yang berusia 6 bulan atau lebih.
programmer
4
Saya akan mulai dengan Jamison dan bekerja di rak. . .
Wyatt Barnett
1
Pernahkah Anda mencoba mengambil alih proyek C # yang ditulis oleh seorang programmer VB?
שינתיא אבישגנת

Jawaban:

28

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:

  1. Belajar setiap bit dalam menyiksa rinci. Hal ini membuat kecil kemungkinan Anda akan memecahkan sesuatu secara tidak sengaja.
  2. Refactor tanpa ampun untuk meningkatkan pemisahan dan struktur, tetapi jangan mencoba untuk menyemir metodologi baru seperti pemrograman berorientasi objek di sana, karena VB6 hanya mengisapnya.
  3. Memperlakukannya sebagai pengalaman belajar. Bagaimana Anda tahu cara yang berbeda lebih baik jika Anda tidak pernah melihat cara yang lebih rendah?
  4. Jangan repot-repot menulis ulang dalam bahasa / kerangka / platform baru kecuali Anda memiliki modul utama untuk menulis. Bahkan kemudian, mempertimbangkan dengan hati-hati.

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. :)

Scott Whitlock
sumber
3
+1 Jawaban Hebat: Yang bisa saya tambahkan adalah pastikan Anda tidak terlalu berharap. Pemeliharaan kode lambat dibandingkan dengan perkembangan baru, kode warisan, bahkan lebih lambat, dan didokumentasikan, kode terstruktur seperti Anda telah dijelaskan .... The 5 tahun terakhir saya telah bekerja pada berbagai basis kode dating kembali ke tahun 1980-an dan langkah-langkah dalam Jutaan SLOC ... Saya tahu rasa sakit Anda ...
mattnz
+1 tetapi satu fitur OO VB6 tidak OK di adalah Antarmuka. Jika Anda dapat melihat kode yang sama disalin dan tidak dicicipi beberapa kali, Anda mungkin dapat melakukan refactor di Antarmuka, jika bukan Kelas penuh.
Mark Hurd
3

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.

pengguna281377
sumber
11
Saya sudah dalam situasi ini. Pertama, VB6 memiliki unit pengujian yang menyedihkan. Tes unit kedua hampir selalu membutuhkan DI dan itu sangat sulit di VB6 karena dukungannya yang mengerikan untuk pemrograman berorientasi objek. Saya belum pernah mendengar dari siapa pun yang mengambil proyek VB6, menulis banyak tes unit dan melanjutkan pesta refactoring, bahkan jika itu adalah jawaban stok Anda akan selalu mendengar pertanyaan seperti ini di Programmers.SE. Apakah Anda tahu betapa menyakitkannya menulis unit test untuk logika yang tertanam di semua tempat di Form handler? Anda harus melakukan refactor sebelum dapat menulis tes!
Scott Whitlock
Saya ingin menambahkan unit test ke kode kami, tetapi saya bingung harus mulai dari mana. Saya telah melakukan beberapa pengujian unit dalam .net dan bahasa lain tetapi hanya dari awal, tidak pernah menambahkan tes ke proyek yang ada. Dan tidak ada pengujian unit yang telah saya lakukan pada program yang menggunakan GUI, terutama bukan GUI dengan banyak basis data dan logika bisnis yang tercampur dalam event handler!
Dylan Nissley
1
Jika kode tidak ditulis agar dapat diuji, yang akan Anda lakukan adalah menulis unit test yang mencakup kasus-kasus yang mudah dan jelas, dan melewatkan kasus tepi yang menyebabkan 90% dari kerusakan. Saya telah berada di sana, melakukan itu, membuang banyak waktu dan upaya (baca Uang). Pendekatan terbaik adalah memastikan bahwa kode yang Anda ubah mudah diuji-apa pun artinya di lingkungan yang Anda miliki, yang tidak terdengar seperti unit test.
mattnz
3

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.

Karl Bielefeldt
sumber
Kecuali dilakukan dengan benar, "Porting ke bahasa modern" akan memberikan "program VB dalam sintaks C #" - Saat ini bekerja pada aplikasi C porting ke Java yang benar-benar "Cava" bukan Java - ini adalah yang terburuk dari keduanya dan yang terbaik dari keduanya ........ Porting dengan benar benar-benar menulis ulang dalam drag, dan seperti yang dikatakan Joel - itu adalah daftar "hal yang tidak boleh dilakukan".
mattnz
Poin bagus. Itu sebabnya saya berkata "jika itu mungkin." Jika Anda tidak dapat melakukannya sedikit demi sedikit dan juga menulis kode porting secara idiomatis, jangan mencoba.
Karl Bielefeldt
3

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.

jfrankcarr
sumber
+1 Anda benar tentang kehilangan dukungan VB6 pada versi Windows modern. Cepat atau lambat (mungkin lebih cepat), aplikasi Anda akan berhenti berfungsi di tempat yang seharusnya.
Bernard
1

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.

Doc Brown
sumber
0

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:

Steven C. MCCONNELL: Bekerja Efektif dengan Legacy Code, Edisi Kedua. Microsoft Press, Juni 2004.

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.

QuantumOmega
sumber