Kualitas kode mengacu pada kekokohan kode di luar apakah itu hanya berjalan dan melakukan fungsi yang diinginkan atau tidak. Kode berkualitas tinggi dibedakan oleh efisiensi, pemeliharaan, keterbacaan, dan kegunaan kembali, sedangkan kode berkualitas rendah rapuh, sulit diurai dan cenderung menumpukutang teknis dari waktu ke waktu.
Standar pengodean yang tinggi adalah untuk proses pengembangan perangkat lunak apa mise en place dan “bekerja dengan bersih” adalah untuk pengoperasian dapur komersial. Praktik yang meningkatkan kualitas kode Anda dapat menghasilkan fungsionalitas yang lebih baik dalam jangka pendek, tetapi manfaat yang lebih penting adalah lebih sedikit masalah, kemajuan yang lebih cepat, dan biaya pemeliharaan yang lebih rendah dalam jangka panjang.
Manfaat jangka panjang dari kode berkualitas tinggi terkadang sulit bagi programmer untuk berkomunikasi dengan manajemen yang kurang berpengalaman dalam hal-hal kecil dari siklus hidup pengembangan perangkat lunak. Menyeimbangkan manfaat holistik dari kode optimal dengan tekanan langsung dari prioritas bisnis seringkali memerlukan pertukaran yang kompleks. Meskipun demikian, sebuah studi pada tahun 2022 terhadap 39 basis kode produksi berpemilik menegaskan, di antara temuan lainnya,1 bahwa:
Utang teknis akibat dari penulisan kode yang terburu-buru dapat menghabiskan hingga 42% waktu pengembang.
Kode berkualitas rendah menyebabkan cacat 15 kali lebih banyak daripada kode berkualitas tinggi.
Menyelesaikan masalah dalam kode berkualitas rendah membutuhkan (rata-rata) 124% lebih banyak waktu daripada menyelesaikan masalah dalam kode berkualitas tinggi.
Kode berkualitas lebih tinggi meningkatkan kemudahan dan kecepatan dalam memahami, melakukan pemfaktoran ulang, debugging, dan menambahkan fitur baru ke basis kode. Kode yang jelas, konsisten, dan ditulis dengan baik memfasilitasi koordinasi yang lebih lancar di seluruh tim pengembangan dan mengurangi kompleksitas dan komplikasi perubahan kode. Hal ini tidak hanya mendorong kualitas perangkat lunak yang kuat, tetapi juga pengalaman pengembang dan pengalaman pengguna yang kuat.
Apakah sepotong kode di kompilasi dan berhasil mengeksekusi tujuannya pada waktu proses tidak cukup untuk menentukan kualitas keseluruhannya. Menulis kode tidak seperti menyelesaikan teka-teki silang, di mana ada satu cara tunggal untuk menyelesaikan tugas Anda dengan benar: seringkali ada solusi yang tak terhitung jumlahnya untuk masalah pengodean tertentu. Oleh karena itu, fungsionalitas mewakili sekadar kode yang dapat diterima. Nilai kode berkualitas tinggi dimanifestasikan dalam efek sekundernya pada konteks di sekitarnya.
Dapatkan kurasi insight tentang berita AI yang paling penting dan menarik. Berlangganan buletin Think mingguan. Lihat Pernyataan Privasi IBM.
Kode berkualitas tinggi adalah konsep yang relatif abstrak. Kualitas keseluruhan dari sepotong kode didefinisikan oleh bagaimana ia dibuat dan bagaimana ia berinteraksi dengan basis kode yang lebih besar di dalamnya seperti oleh kumpulan metrik kualitas kode objektif yang diskrit dan diskrit (meskipun banyak metrik seperti itu ada).
Ciri-ciri umum kode berkualitas tinggi meliputi:
Keterbacaan: Keterbacaan kode sangat penting untuk pemeliharaan, debugging, dan koordinasi lintas tim dan waktu. Bisakah anggota tim lain dengan mudah memahami kode Anda? Dapatkah programmer lain, yang bekerja bertahun-tahun dari sekarang, secara akurat menafsirkan kode Anda tanpa Anda berada di sekitar untuk memberikan konteks?
Pemeliharaan: Kompleksitas kode sering kali berkorelasi terbalik dengan pemeliharaan kode. Apakah kode Anda mudah diuji, sehingga memungkinkan tim Anda untuk mengevaluasinya secara efisien untuk mengevaluasi kerentanan keamanan dan peluang pengoptimalan? Apakah cukup kuat untuk menambahkan fitur baru tanpa mengganggu fungsionalitas inti, atau terlalu rapuh untuk disesuaikan tanpa memerlukan pemfaktoran ulang yang besar? Memprioritaskan kode yang dapat dipelihara mungkin memerlukan kerumitan tambahan di muka, tetapi menghemat waktu dan energi yang signifikan untuk bergerak maju.
Efisiensi: Kode yang ditulis dengan baik dapat mengurangi latensi sistem dan konsumsi sumber daya. Sebagai contoh, struktur data yang dipilih secara cermat dapat meminimalkan jumlah operasi CPU yang diperlukan untuk suatu fungsi tertentu. Strategi caching data yang bijaksana mengurangi operasi input/out (I/O) yang mahal dengan menghilangkan kueri basis data yang berlebihan dan permintaan jaringan, sementara segera melepaskan memori yang tidak terpakai untuk menghindari pembengkakan RAM yang tidak perlu.
Keandalan: Lebih sedikit cacat dan struktur yang kuat terhadap perubahan kode berarti kegagalan dan waktu henti yang lebih jarang terjadi. Keandalan sangat penting untuk pengalaman dan kepercayaan pengguna, serta kesehatan sistem kritis yang menjadi sandaran perusahaan Anda.
Menulis di Harvard Ilmu Data Review pada tahun 2023, para peneliti dari Calvin University, Amherst College dan Columbia mengusulkan kerangka kerja preskriptif untuk kode yang baik: “Empat C.”2
Ketepatan: Kode tersebut melakukan apa yang seharusnya dilakukan. Para penulis menekankan dua konsekuensi dari inklusi yang jelas ini: “Pertama, kebenaran adalah metrik yang diperlukan tetapi tidak cukup untuk kode yang baik. Kedua, tujuan-tujuan lainnya mendukung dan mendorong kebenaran."
Kejelasan: Siapa pun yang membaca dan menulis kode dapat mengetahui apa yang dimaksudkan untuk dilakukan dan secara intuitif membuat modifikasi seperlunya.
Penahanan: Hindari perluasan yang tidak terkontrol, redundansi, dan ketergantungan yang tidak perlu. Penahanan yang tepat mencakup, antara lain, “menggunakan fungsi untuk berisi kode yang dapat digunakan kembali, dan menyimpan kode yang digunakan di seluruh file atau proyek dalam modul atau paket.”
Konsistensi: Basis kode harus mempertahankan konsistensi internal gaya, konvensi penamaan, komentar, lekukan dan praktik lainnya.
Karena pengembangan perangkat lunak modern terus semakin didorong oleh asisten pengodean berbasis agen seperti IBM®, penahanan dan konsistensi sangat berguna untuk memaksimalkan keampuhan dan akurasi alat otomatis. Meskipun demikian, kemampuan platform generasi berikutnya seperti IBM® Bob untuk mengidentifikasi peluang pemfaktoran ulang AI secara real time dapat mengurangi upaya yang diperlukan untuk menegakkan tingkat disiplin gaya tersebut.
Meskipun setiap bahasa pemrograman dan contoh penggunaan memiliki nuansa spesifik dan pertimbangan terperinci, ada beberapa praktik terbaik universal untuk kode kualitas dalam skenario apa pun.
Salah satu pendekatan untuk mengonseptualisasikan kualitas kode tinggi adalah dengan menganggapnya sebagai kode yang menghindari sebanyak mungkin penanda kode buruk—yang akan dieksplorasi nanti dalam artikel ini—sebanyak mungkin.
Untuk pendekatan yang lebih normatif, makalah Harvard Ilmu Data Ulasan (HDSR) yang disebutkan di atas menguraikan serangkaian pedoman untuk memastikan kualitas kode. Meskipun pedoman ini tampaknya dioptimalkan untuk kebutuhan ilmuwan data, sebagian besar dapat diterapkan di semua disiplin pengodean.
Konvensi penamaan yang kuat sangat penting untuk keterbacaan dan konsistensi kode. Penulis menyarankan praktik berikut:
Panjang nama harus sebanding dengan ruang lingkupnya. Semakin besar jarak—baik dalam hal waktu, garis kode atau struktur organisasi—antara definisi awal suatu istilah dan penggunaannya, semakin penting bahwa namanya dengan jelas mengomunikasikan perannya.
Simpan daftar ringkasan singkatan. Variabel dengan nama pendek atau satu karakter memang dapat menyederhanakan tampilan kode, tetapi bisa menjadi sulit dimengerti oleh orang yang kurang terbiasa dengan proyek tersebut. Memiliki semacam “daftar istilah” dapat membantu mengurangi dampak tersebut.
Gunakan kapitalisasi secara konsisten. Sebaiknya juga hindari penggunaan dua nama yang hanya dibedakan oleh huruf besar dan kecil.
Hindari nama-nama yang tidak menarik. Mereka secara signifikan meningkatkan kesulitan interpretasi kode.
Pilih konvensi penamaan file yang diurutkan secara alami. Misalnya, Anda dapat mengadopsi standar ISO 8601 untuk tanggal dan waktu, atau angka di depan dengan 0 untuk memastikan bahwa semuanya memiliki jumlah digit yang sama.
Konvensi penamaan yang jelas dan konsisten juga dapat membantu menyederhanakan tindakan mendorong asisten pengodean AI dan meningkatkan akurasi outputnya. Misalnya, alih-alih memprompt agen untuk memeriksa jenis variabel tertentu atau menjelajahi semua file dari rentang tanggal tertentu—yang mungkin mengharuskan agen AI Anda untuk secara probabilistik menyimpulkan dari konteks variabel atau file mana yang memenuhi kriteria—Anda dapat secara eksplisit memprompt agen untuk menjelajahi semua file yang dimulai dengan nomor tertentu, atau semua variabel dengan nama tertentu.
Selain mengodifikasi konvensi penamaan yang kuat, panduan gaya yang komprehensif idealnya harus menstandarkan elemen pemformatan termasuk penggunaan spasi putih dan lekukan, komentar dan tipe data, serta “dialek pengodean.” Beragam panduan gaya yang telah terbukti untuk berbagai bahasa pemrograman dapat ditemukan di GitHub, seperti yang termasuk dalam daftar kurasi ini.
Panduan gaya juga merupakan referensi yang tak ternilai untuk asisten pengodean AI, berfungsi sebagai konteks untuk tugas-tugas tertentu atau bahkan sebagai bagian dari prompt sistem agen AI Anda.
Memanfaatkan toolkit dan pustaka adalah anugerah alami untuk kegunaan kembali dan efisiensi kode, membantu menstandardisasi alur kerja dan output di berbagai tim dan secara luas mempercepat pembuatan kode. Solusi ini sangat berguna ketika kode harus memediasi interaksi dengan sistem pihak ketiga yang kompleks atau menangani masalah yang berulang dan “terpecahkan”.
Tetapi ketergantungan yang berlebihan pada toolkit dapat menambah kembung yang tidak perlu dan memperkenalkan dependensi eksternal, mengurangi ketahanan dan pemeliharaan kode. Toolkit juga memiliki kecenderungan untuk mengabstraksi logika yang mendasari kode, mengurangi keterbacaannya. Penulis HDSR mengartikulasikan keseimbangan ideal dalam istilah sederhana: “Kami ingin toolkit kami sesederhana mungkin, tetapi tidak lebih sederhana dari itu.”
Jika Anda sering menyalin, menempelkan, dan memodifikasi blok kode yang sama, Anda mungkin lebih baik dilayani oleh fungsi yang merangkum kode berulang di satu tempat. Parameter fungsi tersebut dapat mencerminkan elemen-elemen yang berubah dari instance ke instance. Langkah ini membersihkan kode dan menyederhanakan pemeliharaan, karena memungkinkan Anda untuk menyesuaikan semua contoh fungsi itu dalam satu langkah dan tempat (daripada menyesuaikan setiap duplikat blok kode secara individual).
Pemeriksaan konsistensi adalah validasi otomatis yang memverifikasi apakah data potensial atau status sistem mematuhi aturan dan konvensi logis yang telah ditentukan sebelumnya, membantu menghindari dan memperhitungkan konflik dan kontradiksi yang tidak terduga dalam kode. Pengujian otomatis ini biasanya merupakan komponen penting standar dari pipeline CI/CD (Integrasi kontinu/penerapan berkelanjutan).
Ini adalah contoh klasik tentang pentingnya kemampuan pengujian kode. Sulit atau tidak mungkin untuk merancang pengujian unit yang secara mendalam memvalidasi setiap fungsi jika kode Anda terlalu kompleks atau mengandung terlalu banyak dependensi yang digabungkan erat.
Sistem kontrol versi membantu mendorong konsistensi, kontrol kualitas, koordinasi, dan proses ulasan di seluruh tim. Saat menggunakan kerangka kerja pemrograman berbasis AI—terutama yang mungkin secara mandiri menyesuaikan basis kode Anda—pastikan bahwa Anda memiliki sarana untuk dengan mudah mengembalikan perubahan yang tidak diinginkan atau merugikan. IBM® Bob, misalnya, secara otomatis membuat versi file ruang kerja Anda sebagai pos pemeriksaan untuk memungkinkan pengembalian perubahan kode yang mudah sesuai kebutuhan.
Secara garis besar, kode buruk sulit dibaca dan dipelihara, rapuh terhadap perubahan dan fitur baru, tidak efisien dan tidak dapat diandalkan. Kode ini sering menampilkan dependensi yang tidak perlu, di mana modul yang berbeda saling terkait satu sama lain dan setiap perubahan pada satu membutuhkan kerja ekstra untuk menghindari kerusakan yang lain. Kode ini juga tidak memiliki dokumentasi yang tepat dan tidak terorganisasi dengan baik, tidak memiliki struktur yang logis dan koheren, keadaan yang sering disebut sebagai “kode spageti.“
Kode buruk sering kali merupakan produk dari (tidak hanya) keterampilan pengodean yang buruk, tetapi insentif dan struktur organisasi yang buruk: memprioritaskan fitur yang terlalu agresif dengan mengorbankan kualitas kode biasanya menghasilkan waktu ke pasar yang lebih cepat tetapi komplikasi masa depan yang lebih besar dan utang teknis.
Penting untuk diingat bahwa kode buruk sering kali berfungsi—setidaknya untuk sementara. Utang teknis tidak akan menumpuk jika ini tidak terjadi, karena kode yang rusak yang tidak dapat disangkal harus ditangani. Pemfaktoran ulang: Improving the Design of Existing Code, buku penting karya Martin Fowler dan Kent Beck yang pertama kali diterbitkan pada tahun 1999 (dan telah diperbaharui berkali-kali sejak saat itu), menggunakan istilah code smells untuk mendeskripsikan kode yang buruk. Kode tersebut biasanya bukan bug dan tidak secara inheren mencegah program berfungsi, tetapi mereka menunjukkan kelemahan desain dan masalah kualitas kode yang mungkin memperlambat pengembangan atau menyebabkan bug di masa depan.
Daftar code smells Fowler dan Beck yang harus diwaspadai mencakup contoh-contoh seperti:
Fungsi panjang (metode panjang): Metode yang mengandung terlalu banyak baris kode.
Kelas besar: Kelas yang mencoba melakukan terlalu banyak dan mengandung terlalu banyak variabel, kurang kohesi.
Obsesi elemen dasar: Menggunakan tipe data elemen dasar alih-alih objek kecil khusus.
Nama misterius: Fungsi atau variabel yang diberi nama buruk, menyembunyikan maksud sebenarnya.
Gumpalan data: Kelompok variabel yang sering muncul bersama di mana-mana.
Elemen malas: Kelas atau fungsi yang terlalu sedikit kontribusinya sehingga sebenarnya tidak layak ada.
Daftar parameter panjang: Fungsi yang membutuhkan terlalu banyak argumen untuk beroperasi dengan benar.
Operasi senapan: Satu perubahan memerlukan modifikasi banyak modul yang tersebar secara bersamaan (yang pada dasarnya merupakan kebalikan dari kelas besar).
Kode yang diduplikasi: Struktur kode yang identik atau sangat mirip di beberapa tempat.
Daftar lengkap bau kode, lengkap dengan penjelasan, contoh, dan kutipan, dapat ditemukan di sini. Kehadiran mereka biasanya merupakan tanda bahwa perlu dilakukan pemfaktoran ulang. Pemahaman menyeluruh di seluruh organisasi tentang isu-isu ini dan komplikasi yang timbul darinya sangat membantu untuk membangun konsepsi bersama tentang standar kualitas di seluruh tim pengembangan.
Mengukur kualitas kode harus selalu memerlukan evaluasi kualitatif dan kuantitatif. Meskipun metrik objektif seperti kompleksitas siklomatik dapat berguna, metrik tersebut juga dapat menyesatkan tanpa konteks yang tepat.
Misalnya, tim Anda mungkin menulis rangkaian uji coba otomatis dan kode Anda dapat mencapai 100% cakupan kode di seluruh rangkaian uji coba unit. Namun, jika rangkaian pengujian tersebut kurang memiliki beberapa pernyataan penting yang diperlukan untuk benar-benar memvalidasi bahwa kode Anda berfungsi sepenuhnya sebagaimana mestinya, rasa percaya diri yang keliru dari cakupan pengujian tersebut mungkin akan lebih banyak menimbulkan kerugian daripada manfaat.
Demikian juga, struktur ulasan yang kuat harus mencakup ulasan kode manual dan ulasan kode AI. Alat pengodean berbasis agen modern seperti IBM® dapat melakukan analisis kode statis yang ekstensif dan refactoring secara real time, tetapi mendapat manfaat dari aturan khusus dan mode khusus yang menyampaikan kebutuhan dan maksud khusus pengembang. Manusia tidak mampu mencakup segalanya dan AI juga tidak selalu benar, tetapi dengan memperkuat satu sama lain, keduanya dapat memastikan bahwa seluruh potensi isu telah diperiksa dengan pemahaman konteks yang memadai.
Selalu ingat bahwa kualitas kode bergantung pada konteks. Bayangkan seorang programmer di tim Anda telah menulis algoritma atau blok kode yang fasih, efisien, dan diartikulasikan dengan sempurna yang dengan rapi mencapai fungsi yang dimaksudkan. Jika masalah tersebut dapat diselesaikan secara efektif menggunakan fungsi standar bawaan dari pustaka yang sudah dikenal semua orang, kode yang elegan tersebut sebenarnya merupakan masalah kualitas karena menambah kompleksitas dan beban mental yang tidak perlu.
Percepat pengiriman perangkat lunak dengan Bob, mitra AI Anda untuk pengembangan yang aman dan memahami maksud.
Optimalkan upaya pengembangan perangkat lunak dengan alat berbasis AI tepercaya yang meminimalkan waktu yang dihabiskan untuk menulis kode, debugging, pemfaktoran ulang kode, atau penyelesaian kode dan membuat lebih banyak ruang untuk inovasi.
Ciptakan kembali alur kerja dan operasi yang penting dengan menambahkan AI untuk memaksimalkan pengalaman, pengambilan keputusan secara waktu nyata, dan nilai bisnis.
1. “Kode merah: dampak bisnis dari kualitas kode — studi kuantitatif dari 39 basis kode produksi eksklusif,” Prosiding Konferensi Internasional tentang Utang Teknis (diakses melalui Association for Computing Machinery Digital Libtary), 16 Agustus 2022
2. “Membina Praktik Pengodean yang Lebih Baik untuk Ilmuwan Data,” Harvard Data Science Review, 27 Juli 2023