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…
Jom selami kisah seram yang mungkin ramai di antara anda pernah atau akan alami.
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.
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.
Penyepaduan Kalendar: Pasukan terpaksa menyepadukan dengan Kalendar Google dan Outlook. Pembangun yang berbeza melaksanakan penyelesaian, menghasilkan pendekatan yang tidak konsisten.
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.
Penjana Laporan: Untuk penjana laporan, pembangun menggunakan pelbagai teknologi: PDF, eksport Excel dan papan pemuka interaktif. Kekurangan pendekatan bersatu menjadikan penyelenggaraan sebagai mimpi ngeri.
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.
Kemudian masalah bermula:
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.
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 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:
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 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.
Setelah melihat kisah seram dan tiga gejala utama, mari lihat apa yang menyebabkan kerumitan.
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.
Pergantungan wujud apabila kod tidak dapat difahami atau diubah suai secara berasingan, memerlukan pertimbangan atau pengubahsuaian kod yang berkaitan.
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.
Kekaburan berlaku apabila maklumat penting tidak jelas.
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
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!