Kapan kompleksitas harus dihilangkan?

14

Memperkenalkan kompleksitas sebelum waktunya dengan menerapkan pola desain sebelum dibutuhkan bukanlah praktik yang baik.

Tetapi jika Anda mengikuti semua (atau bahkan sebagian besar) prinsip-prinsip SOLID dan menggunakan pola desain umum Anda akan memperkenalkan beberapa kompleksitas karena fitur dan persyaratan ditambahkan atau diubah untuk menjaga desain Anda dapat dipertahankan dan fleksibel sesuai kebutuhan.

Namun begitu kompleksitas itu diperkenalkan dan bekerja seperti jagoan kapan Anda menghapusnya?

Contoh. Saya punya aplikasi yang ditulis untuk klien. Ketika awalnya dibuat di sana di mana beberapa cara untuk memberi kenaikan gaji kepada karyawan. Saya menggunakan pola strategi dan pabrik untuk menjaga seluruh proses tetap bagus dan bersih. Seiring waktu metode kenaikan tertentu di mana ditambahkan atau dihapus oleh pemilik aplikasi.

Waktu berlalu dan pemilik baru mengambil alih. Pemilik baru ini berhidung keras, menjaga segala sesuatunya sederhana dan hanya memiliki satu cara tunggal untuk menaikkan gaji.

Kompleksitas yang dibutuhkan oleh pola strategi tidak lagi dibutuhkan. Jika saya di mana kode ini dari persyaratan seperti sekarang saya tidak akan memperkenalkan kompleksitas tambahan ini (tapi pastikan saya bisa memperkenalkannya dengan sedikit atau tanpa pekerjaan jika perlu muncul).

Jadi, apakah saya menghapus implementasi strategi sekarang? Saya tidak berpikir pemilik baru ini akan pernah mengubah cara kenaikan gaji diberikan. Tetapi aplikasi itu sendiri telah menunjukkan bahwa ini bisa terjadi.

Tentu saja ini hanya satu contoh dalam aplikasi di mana pemilik baru mengambil alih dan telah menyederhanakan banyak proses. Saya bisa menghapus lusinan kelas, antarmuka dan pabrik dan membuat keseluruhan aplikasi jauh lebih sederhana. Perhatikan bahwa implementasi saat ini berfungsi dengan baik dan pemilik senang dengan hal itu (dan terkejut dan bahkan lebih bahagia bahwa saya dapat mengimplementasikan perubahannya begitu cepat karena kompleksitas yang dibahas).

Saya akui bahwa sebagian kecil dari keraguan ini adalah karena sangat mungkin pemilik baru tidak akan menggunakan saya lagi. Saya tidak terlalu peduli bahwa orang lain akan mengambil alih ini karena itu bukan penghasil pendapatan besar.

Tapi saya peduli tentang 2 hal (terkait)

  1. Saya sedikit peduli bahwa pengelola baru harus berpikir sedikit lebih keras ketika mencoba memahami kode. Kompleksitas adalah kompleksitas dan saya tidak ingin membuat orang gila gila datang setelah saya.

  2. Tetapi lebih lagi saya khawatir tentang pesaing melihat kompleksitas ini dan berpikir saya hanya menerapkan pola desain untuk menambah jam saya pada pekerjaan. Kemudian menyebarkan desas-desus ini untuk menyakiti bisnis saya yang lain. (Saya telah mendengar ini disebutkan.)

Begitu...

Secara umum apakah kompleksitas yang diperlukan sebelumnya harus dihilangkan meskipun berfungsi dan telah ada kebutuhan historis yang diperlihatkan untuk kompleksitas tersebut tetapi Anda tidak memiliki indikasi bahwa kompleksitas akan diperlukan di masa mendatang?

Bahkan jika pertanyaan di atas secara umum dijawab "tidak", apakah bijaksana untuk menghilangkan kompleksitas "yang tidak diperlukan" ini jika menyerahkan proyek kepada pesaing (atau orang asing)?

ElGringoGrande
sumber

Jawaban:

7

Dalam beberapa hal, saya pikir ini sebagian besar merupakan keputusan bisnis dan belum tentu didasarkan pada kode itu sendiri. Beberapa hal yang perlu dipertimbangkan:

  • Apakah Anda dibayar untuk melakukan perubahan?
  • Apakah kode saat ini berfungsi seperti yang diharapkan?
  • Apakah ada masalah keamanan atau kinerja dengan kode apa adanya?
  • Apakah jumlah utang teknis lebih besar daripada biaya untuk memperbaikinya?
  • Apa yang kemungkinan terjadi secara realistis jika Anda membiarkan kode apa adanya?
  • Apa masalah di masa depan yang dapat muncul dengan atau tanpa refactoring?
  • Berapa banyak tanggung jawab kode untuk Anda dan bisnis Anda?

Anda berada di posisi terbaik untuk menjawab pertanyaan-pertanyaan itu. Namun, berdasarkan uraian Anda, saya tidak tahu apakah saya akan repot-repot refactoring dan menyederhanakan hal-hal karena tidak terdengar seperti itu akan bernilai waktu Anda. Jika saat ini berfungsi, klien senang, dan Anda tidak suka dibayar untuk memperbarui semuanya, lalu biarkan dan kerjakan aktivitas yang menghasilkan pendapatan.

Singkatnya, lakukan analisis biaya-manfaat dan penilaian risiko kedua jalur dan ambil tindakan yang paling aman, paling efisien, dan paling menguntungkan.

VirtuosiMedia
sumber
6

Bukankah menghapus kode ini dan menggantinya dengan sesuatu yang sederhana untuk kemudahan pengkodean di masa depan yang perlu dipertimbangkan dan dibayar oleh klien?

Anda mungkin memiliki sesuatu yang berguna yang bisa dipelajari oleh pengembang lain, tetapi kemungkinan menemukan aplikasi klien lain untuk memasangnya, tidak mungkin.

Bergosip tentang kode pesaing bukanlah sesuatu yang bisa Anda cegah. Mereka akan terlihat bodoh mencoba merekrut klien secara negatif.

JeffO
sumber
+1 untuk "dan membayar untuk". Jika Anda akan meminta klien untuk membayar perubahan, Anda harus mengizinkan klien untuk memutuskan apakah akan melakukan perubahan. Perhatikan bahwa membiarkan sistem fleksibel menambah sejumlah nilai jual kembali bisnis, karena hal itu akan memungkinkan pemilik BERIKUTNYA untuk membuat perubahan lebih mudah.
John R. Strohm
3

Pepatah umum adalah: "Jika tidak rusak, jangan memperbaikinya".

Ada beberapa alasan di balik aturan ini. Beberapa di antaranya mungkin bahwa "penyederhanaan" akan berisiko memperkenalkan bug baru, berbeda, dan mungkin lebih besar, dapat mengambil waktu pengembangan yang jauh dari upaya lain yang lebih bernilai, dan bisa sepenuhnya merupakan perubahan yang salah untuk beberapa peluang bisnis di masa mendatang yang tak terduga. muncul.

Jika ada nilai bisnis yang cukup untuk kode ini menjadi portabel dan lebih dapat dipelihara, maka putuskan apakah nilai itu benar-benar cukup untuk menganggap kode saat ini "rusak". Bisa jadi, jika ada ekspansi bisnis besar yang direncanakan, atau Anda mencurigai bug laten tersembunyi dalam kompleksitas yang dapat menjatuhkan bisnis.

hotpaw2
sumber
2

Pertama-tama, jika aplikasi sudah pernah diambil alih oleh pemilik baru, itu mungkin terjadi lagi. Dan pemilik selanjutnya dapat mulai lagi menggunakan kompleksitas yang tidak diuntungkan saat ini.

Terlepas dari ini, perubahan non-sepele untuk kode kerja selalu mengandung risiko, sehingga (seperti yang dicatat orang lain) klien harus setuju dengan (dan membayar) mereka. Jika kompleksitas "ekstra" saat ini tidak menyebabkan kelemahan yang nyata dan dapat diukur (seperti masalah kinerja), tidak ada alasan kuat untuk menghapusnya.

Klien (potensial) yang (tidak) mempekerjakan Anda hanya berdasarkan rumor pesaing adalah IMHO tidak layak untuk dimiliki, kecuali jika Anda sangat membutuhkan penghasilan. Anda memiliki alasan yang masuk akal dan logis mengapa Anda menerapkan aplikasi seperti yang Anda lakukan, dan setiap klien yang serius cenderung memahami hal itu. Seseorang yang tidak - atau bahkan tidak mau bertanya tentang Anda - kemungkinan akan menyebabkan Anda lebih banyak kesulitan di sepanjang jalan daripada nilai pekerjaan itu.

Péter Török
sumber
1

Secara umum apakah kompleksitas yang diperlukan sebelumnya harus dihilangkan meskipun berfungsi dan telah ada kebutuhan historis yang diperlihatkan untuk kompleksitas tersebut tetapi Anda tidak memiliki indikasi bahwa kompleksitas akan diperlukan di masa mendatang?

Tidak.

Sekalipun pertanyaan di atas secara umum dijawab "tidak", apakah bijaksana untuk menghilangkan kerumitan "tidak diperlukan" ini jika menyerahkan proyek kepada pesaing (atau orang asing)

Tidak. Mengapa membuang waktu Anda untuk memperbaiki pekerjaan dengan prioritas rendah seperti ini? Tidak ada salahnya untuk kode tinggal di sana.

Adapun pertanyaan Anda: Kapan kompleksitas harus dihilangkan?

Menurut saya, jika tidak rusak, jangan memperbaikinya .

Pizza tebal
sumber
0

Untuk dapat menghapus kompleksitas, yang berikut ini harus benar:

  1. Potongan yang dihapus harus independen dari program. Jika ada dependensi dari program di sekitarnya ke kode yang dimaksud, menghapus kompleksitas saja tidak akan berhasil
  2. Sayangnya, jika terlihat seperti kerumitan, maka sangat mungkin potongan tidak independen dan dependensi akan merusak program Anda ketika Anda menghapus potongan
  3. Menghapus semua dependensi akan membutuhkan waktu, sehingga waktu perlu dipertimbangkan ketika Anda memperkirakan apakah operasi sepadan dengan usaha
  4. Sebagian besar waktu itu tidak sepadan dengan usaha, tetapi Anda hanya akan memutuskan untuk tidak membuat kode baru menggunakan yang lama
tp1
sumber
Mereka independen dan saya benar-benar menghapusnya dan telah lulus semua unit / integrasi / uji regresi. Kompleksitas hanyalah sebuah implementasi dari Strategi yang membutuhkan setidaknya sebuah antarmuka dan implementasi konkret dari antarmuka itu. Di dua lusin tempat di mana pemilik baru telah menyederhanakan semua itu bisa dilakukan dengan satu kelas.
ElGringoGrande
0

Saya pikir ada sesuatu yang lebih besar sedang bekerja di sini ... Skalabilitas

Apa yang Anda bicarakan disebut Skalabilitas . Tidak masalah apakah kode itu rumit atau tidak, apakah aplikasi dapat berkembang berdasarkan aturan bisnis baru atau mengubah aturan bisnis. Apa yang terjadi jika pemilik berikutnya menginginkan sesuatu yang sama sekali berbeda.

Jadi, saya katakan menyimpan kode dan mendokumentasikannya. Ini adalah fitur bagaimana aplikasi dapat digunakan.

Michael Riley - AKA Gunny
sumber
0

Secara umum apakah kompleksitas yang diperlukan sebelumnya harus dihilangkan meskipun berfungsi dan telah ada kebutuhan historis yang diperlihatkan untuk kompleksitas tersebut tetapi Anda tidak memiliki indikasi bahwa kompleksitas akan diperlukan di masa mendatang?

Ada upaya dan risiko untuk menghilangkan kompleksitas. Jika itu lebih tinggi daripada upaya tambahan dan risiko mempertahankan kode yang terlalu rumit, maka Anda menyimpannya. Kalau tidak, Anda menghapusnya. Namun, sulit untuk memperkirakan risiko-risiko itu.

Saya akan menambahkan bahwa Anda dapat mengurangi risiko pemeliharaan yang lebih sulit dengan mendokumentasikan mengapa Anda menggunakan Strategi pola desain di tempat pertama, dalam kode. Saya pribadi percaya bahwa setiap pola desain harus dapat dilacak ke persyaratan eksplisit (fungsional atau non-fungsional).

Bahkan jika pertanyaan di atas secara umum dijawab "tidak", apakah bijaksana untuk menghilangkan kompleksitas "yang tidak diperlukan" ini jika menyerahkan proyek kepada pesaing (atau orang asing)?

Skenario Anda dibubarkan oleh kompetisi untuk jam padding adalah alasan mengapa Anda harus mendokumentasikan kompleksitas. Jika Anda mendokumentasikan dan membenarkan (dengan persyaratan pelanggan tertentu) penggunaan pola apa pun, maka Anda dilindungi. Jika Anda tidak dapat membenarkan suatu pola dengan kebutuhan pelanggan, maka itu terlihat seperti desain berlebihan atau patternitis.

Jika persyaratan berubah, maka Anda dapat membenarkan meninggalkannya karena risiko bahwa Anda dapat memecahkan kode (atau jumlah pekerjaan untuk menghilangkan pola secara operasi).


Saya pikir itu baik untuk membedakan antara kompleksitas yang tidak disengaja dan kompleksitas yang esensial , karena pola sering melibatkan keduanya.

Artinya, kebutuhan Anda untuk mendukung berbagai algoritme untuk memutuskan kenaikan gaji adalah kompleksitas yang penting (bagian dari masalah yang harus dipecahkan). The pemeliharaan kode Anda menjadi lebih mudah dengan pola Strategi, tapi hard-kode jika / kemudian alternatif untuk Strategi masih akan bekerja. Saya telah melakukan latihan dalam kursus master saya di mana siswa menemukan peluang untuk menerapkan Strategi dalam proyek sumber terbuka. Kompleksitas belum tentu lebih baik / lebih buruk ketika menerapkan Strategi (karena itu adalah kompleksitas esensial ). Kadang-kadang mungkin lebih sulit untuk memahami Strategi, karena kode dipecah menjadi beberapa kelas dengan polimorfisme, daripada satu blok if / then / else yang besar.

Idealnya, sebuah pola bekerja ketika manfaat yang diberikannya lebih besar daripada biaya kelemahannya. Sekali lagi, menghitung hal-hal ini sulit. Seringkali sebuah pola membuat pengembang senang (bukan hanya karena membuat menambahkan strategi kenaikan baru lebih mudah, tetapi memberikannya kehangatan pengembang untuk mengetahui bahwa suatu pola diterapkan). Sulit untuk menunjukkan kepada pelanggan bagaimana manfaatnya bagi mereka.

Pelanggan tidak peduli atau bahkan memahami detailnya. Dalam kasus pemilik baru menerapkan KISS dalam prosesnya, itu mengurangi kompleksitas esensial , yang seharusnya berdampak pada solusi perangkat lunak juga.

Fuhrmanator
sumber