Rumah  >  Artikel  >  hujung hadapan web  >  Pertempuran Tidak Berakhir Menentang Kerumitan Perisian

Pertempuran Tidak Berakhir Menentang Kerumitan Perisian

王林
王林asal
2024-07-27 07:48:52845semak imbas

The Never Ending Battle Against Software Complexity

Apakah Kerumitan?

Baru-baru ini, saya selesai membaca "A Philosophy of Software Design" dan dalam bab kedua, ia meneroka topik Kerumitan Perisian. 

Buku "A Philosophy of Software Design" mentakrifkan kerumitan secara praktikal:

"Kerumitan ialah apa sahaja yang berkaitan dengan struktur sistem perisian yang menyukarkan untuk memahami dan mengubah suai."

Dalam erti kata lain, kerumitan boleh berlaku dalam pelbagai bentuk, dan tidak perlu ada kaitan dengan prestasi, kod anda boleh berprestasi dan masih rumit

Saya ingin berkongsi beberapa definisi dan pandangan utama daripada buku dalam artikel ini. Tetapi pertama-tama, mari bayangkan situasi biasa yang mungkin anda pernah alami…


Cerita Seram Pendek

Jom selami kisah seram yang mungkin ramai di antara anda pernah atau akan alami.

  1. Ia bermula dengan apl pengurusan tugasan CRUD yang ringkas. Kod itu bersih, modular dan mudah diselenggara. Pasukan pembangunan gembira dan sistem berfungsi dengan sempurna untuk pelanggan awal.

  2. Masalah bermula apabila pasukan jualan menjual sistem kepada syarikat besar, mendakwa ia mempunyai penyepaduan kalendar, pemberitahuan e-mel dan penjana laporan yang menakjubkan. Dengan penjualan dimuktamadkan, ciri ini terpaksa dilaksanakan dengan cepat.

  3. Penyepaduan Kalendar: Pasukan terpaksa menyepadukan dengan Kalendar Google dan Outlook. Pembangun yang berbeza melaksanakan penyelesaian, menghasilkan pendekatan yang tidak konsisten.

  4. Pemberitahuan E-mel: Pemberitahuan e-mel telah ditambahkan seterusnya. Seorang pembangun menggunakan perpustakaan tertentu, manakala yang lain mencipta penyelesaian tersuai. Pendekatan bercampur menjadikan kod mengelirukan.

  5. Penjana Laporan: Untuk penjana laporan, pembangun menggunakan pelbagai teknologi: PDF, eksport Excel dan papan pemuka interaktif. Kekurangan pendekatan bersatu menjadikan penyelenggaraan sebagai mimpi ngeri.

  6. Kerumitan Berkembang: Setiap ciri telah dibangunkan secara berasingan dan pantas, membawa kepada kebergantungan antara ciri. Pembangun mula mencipta "pembetulan pantas" untuk menjadikan semuanya berfungsi, meningkatkan kerumitan dan gandingan sistem.

Pembangunan perisian tidak berlaku dalam ruang hampa; pelbagai faktor dalaman dan luaran mempengaruhinya. Kita semua pernah, atau akan, dalam situasi seperti ini.


Permulaan Akhir

Kemudian masalah bermula:

  1. Perubahan dalam satu bahagian sistem menjejaskan bahagian lain secara tidak dijangka.
  2. Perubahan kecil memerlukan pengubahsuaian dalam banyak fail lain, menjadikan anggaran sukar.
  3. Bulan demi bulan, kod menjadi lebih sukar untuk difahami, selalunya diperbaiki melalui percubaan dan ralat.
  4. Produktiviti merosot dan semua orang takut dengan tugas penyelenggaraan.
  5. Panggilan yang tidak dapat dielakkan untuk "Kami perlu memfaktorkan semula."
  6. Tugas tertentu hanya boleh dikendalikan oleh pembangun tertentu (klasik)
  7. Lama-kelamaan, perisian yang dahulunya ditulis dengan cantik dan didokumentasikan dengan baik menjadi kemalangan kereta api.

Menamakan Gejala

Jelas sekali kita kini mempunyai sistem yang kompleks.

Sekarang mari kita "membedah" kerumitan ini untuk memudahkan mengenal pasti dan mengurangkannya.

Nah, "meringankan" bermaksud:

"Untuk mengurangkan berat, serius atau menyakitkan; untuk mengurangkan."

Saya percaya kerumitan selalunya wujud dalam kod. Sesetengah perkara adalah kompleks secara semula jadi. Peranan anda sebagai pembangun bukan sahaja untuk mencipta kod yang komputer boleh laksanakan dengan cekap tetapi juga untuk mencipta kod yang boleh digunakan oleh pembangun masa depan (termasuk diri anda sendiri).

“Mengawal kerumitan ialah intipati pengaturcaraan komputer.”

— Brian Kernighan

Pengarang buku yang disebutkan menyatakan bahawa kerumitan biasanya ditunjukkan dalam tiga cara, yang akan kita terokai di sini.

Ubah Amplifikasi

Penguatan perubahan berlaku apabila perubahan yang kelihatan mudah memerlukan pengubahsuaian di banyak tempat yang berbeza.

Contohnya, jika Pemilik Produk meminta medan "keutamaan" atau "tarikh siap" dan entiti anda digandingkan dengan ketat, berapa banyak perubahan yang perlu anda lakukan?

Beban Kognitif

Beban kognitif merujuk kepada jumlah pengetahuan dan masa yang diperlukan oleh pembangun untuk menyelesaikan tugas.

Jadi bayangkan senario ini: Pembangun baharu menyertai pasukan, dia ditugaskan untuk membetulkan pepijat dalam penjana laporan. Untuk menyelesaikan tugasan ini, pembangun perlu:

  • Fahami penyepaduan kalendar yang berbeza (Google dan Outlook).
  • Pahami pendekatan yang berbeza untuk pemberitahuan e-mel.
  • Navigasi melalui kod pecahan penjana laporan, berurusan dengan PDF, Excel dan papan pemuka.
  • Sepadukan pelbagai teknologi dan gaya ini untuk mencari dan membetulkan pepijat.

Ini adalah senario klasik "mustahil untuk dianggarkan", di mana tugas itu boleh mengambil satu atau lapan mata—lebih baik gulungkan D20 dan bertindak balas dengan sewajarnya.

Tidak diketahui Tidak diketahui

Tidak diketahui yang tidak diketahui ialah apabila anda tidak tahu apa yang anda tidak tahu.

Ini adalah manifestasi kerumitan yang paling teruk kerana anda mungkin mengubah perkara yang tidak sepatutnya, menyebabkan semuanya rosak.

Contoh: Seorang pembangun mengubah suai kod penghantaran e-mel untuk menambah pemberitahuan baharu, tanpa menyedari bahawa ia akan menjejaskan penjana laporan, yang bergantung pada fungsi itu. Ini menyebabkan isu penting kepada pelanggan, yang menunjukkan bentuk kerumitan terburuk yang timbul.

Punca Kerumitan

Setelah melihat kisah seram dan tiga gejala utama, mari lihat apa yang menyebabkan kerumitan.

1. Kebergantungan

Pergantungan adalah penting dalam perisian dan tidak boleh dihapuskan sepenuhnya. Mereka membenarkan bahagian sistem yang berlainan untuk berinteraksi dan berfungsi bersama. Walau bagaimanapun, kebergantungan, apabila tidak diurus dengan betul, boleh meningkatkan kerumitan dengan ketara.

Definisi:

Pergantungan wujud apabila kod tidak dapat difahami atau diubah suai secara berasingan, memerlukan pertimbangan atau pengubahsuaian kod yang berkaitan.

Jenis Ketergantungan:

  • Terus: Modul A bergantung secara langsung pada Modul B.
  • Transitif: Modul A bergantung pada Modul B, yang bergantung pada Modul C.
  • Kitaran: Modul A, B dan C saling bergantung dalam cara bulat.

2. Kekaburan

Kekaburan berlaku apabila maklumat penting tidak jelas. Ini boleh menjadikan pangkalan kod sukar difahami, membawa kepada peningkatan beban kognitif dan risiko perkara yang tidak diketahui.

Definisi:

Kekaburan berlaku apabila maklumat penting tidak jelas.

Contoh Kekaburan:

  • Penamaan Lemah: Pembolehubah dan fungsi dengan nama yang tidak jelas.
  • Kesan Sampingan Tersembunyi: Kaedah yang melakukan tindakan yang tidak dijangka.
  • Keadaan Global: Penggunaan berlebihan pembolehubah global.
  • Warisan Mendalam: Tingkah laku merentas pelbagai peringkat dalam hierarki kelas.

Ingat: Kerumitan adalah Bertambah

  • Kerumitan jarang disebabkan oleh satu "ralat" atau keputusan yang salah.
  • Kerumitan dibina "perlahan-lahan" melalui keputusan dan pergantungan yang buruk dari semasa ke semasa.

Oleh kerana ia adalah tambahan, mudah untuk berfikir, "sekali ini sahaja, tidak mengapa." Tetapi apabila terkumpul, membetulkan satu atau dua kebergantungan sahaja tidak akan membawa banyak perbezaan.

“Semuanya adalah pertukaran dalam kejuruteraan perisian.”
— Saya tidak ingat pengarangnya

Kesimpulan

Saya boleh menulis banyak peraturan, strategi dan rangka kerja yang mungkin telah anda lihat di Internet tentang cara mengelakkan kerumitan: SOLID, Corak Reka Bentuk, YAGNI, KISS, dll.

Walau bagaimanapun, anda boleh menyatukan kesemuanya menjadi satu prinsip panduan (seperti yang disebut dalam "The Pragmatic Programmer."): "Adakah perkara yang saya laksanakan mudah diubah?" Jika jawapannya tidak, maka anda mungkin meningkatkan kerumitan.

Memastikan kod anda mudah diubah memudahkan penyelenggaraan, mengurangkan beban kognitif pada pembangun dan menjadikan sistem lebih mudah disesuaikan dan kurang terdedah kepada ralat.

Terima Kasih!

Atas ialah kandungan terperinci Pertempuran Tidak Berakhir Menentang Kerumitan Perisian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn