Sering mendengar istilah “bug”? Sebelumnya kita juga pernah membahas mengenai debugging dan sejarahnya. Nah, dalam tulisan kali ini, mari kita bahas lebih lanjut mengenai bug, jenis-jenisnya, dan sebab terjadinya pada sebuah aplikasi.
Definisi Bug
Secara harfiah dalam bahasa inggris “bug” dapat diterjemahkan sebagai “serangga kecil”. Namun, dalam bidang teknologi, dapat diartikan sebagai sebuah kecacatan, error, ataupun kegagalan fungsi yang menyebabkan suatu solusi (aplikasi) tidak dapat berjalan sesuai dengan kebutuhan atau harapan.
Kata “bug” diambil dari kejadian yang cukup unik. Ketika Itu Grace Brewster, seorang ilmuwan komputer asal Amerika, menemukan serangga yang terjebak di dalam relay komputer. Hal itu menyebabkan operasi dari komputer tersebut terhambat. Setelah kejadian tersebut kata debugging menjadi sering digunakan untuk mengacu kepada galat dalam sistem komputer.
💻 Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar SekarangContoh Sederhana
Mari kita mulai dengan contoh bug yang sederhana. Seorang programmer sedang menyusun fungsi-fungsi untuk membuat sebuah aplikasi kalkulator dengan bahasa Python. Ia mulai dengan membuat fungsi untuk menjumlahkan bilangan pada argumen pertama dengan bilangan pada argumen kedua. Fungsi terlihat seperti ini.
Mungkin, Anda sudah melihat sesuatu yang aneh, tetapi kodenya masih berjalan sesuai harapan untuk semua kasus. Jadi, mari simpan dulu keanehan yang mungkin Anda sadari.
Tentunya, untuk membuat kalkulator kita juga butuh fungsi lainnya, seperti substract (pengurangan), multiply (perkalian), dan divide (pembagian). Secara alami, banyak programmer akan melakukan copy paste dan kemudian mengubah nama fungsi serta operator aritmetikanya saja. Jadi, fungsi-fungsi yang dibuat akan terlihat seperti ini.
Nah, apakah kamu sudah sadar tempat bug itu dapat terjadi? Jika kamu menebak jawabannya adalah pada fungsi substract dan divide, jawaban kamu benar. Bisa kita lihat bahwa masalahnya ada pada penempatan parameter fungsi yang tidak sesuai (b menjadi argumen pertama dan a menjadi argumen kedua).
Sementara itu, ketika mencari hasil operasi yang dilakukan, ditemukanlah a – b dan a / b (a dahulu, baru b). Hal ini tentunya berpengaruh karena pengurangan dan pembagian tidak memiliki sifat komutatif (dapat bertukar tempat) seperti penjumlahan dan perkalian.
Sementara hasil yang didapat adalah sebagai berikut.
Nah itu adalah contoh sebuah bug sederhana yang terjadi karena kesalahan dalam penulisan kode.
Jenis-Jenis Bug dalam Aplikasi
Ada berbagai jenis bug dalam pengembangan perangkat lunak dan penyebabnya dapat bervariasi. Berikut adalah beberapa jenis bug yang umum ditemukan beserta penyebabnya.
Syntax Error
Ini terjadi ketika aturan sintaksis dalam bahasa pemrograman tidak diikuti dengan benar. Misalnya, kesalahan penulisan kata kunci (keyword) pada bahasa pemrograman Python di bawah ini.
Logical Error
Logical error adalah kesalahan dalam logika program yang menyebabkan hasil tidak sesuai dengan harapan. Ini dapat terjadi jika alur logika atau perhitungan matematis salah.
Concurrency Bug
Ini adalah sebuah kesalahan sinkronisasi saat dua thread mencoba mengakses ataupun mengubah suatu data bersamaan tanpa ada mekanisme penguncian (locking). Salah satu bentuk yang umum dari concurrency bug adalah race condition.
Race condition dapat menyebabkan ketidakpastian dan kesalahan tidak terduga karena interaksi yang tidak terkoordinasi antara proses atau thread yang saling bersaing untuk mengubah atau mengakses data bersama. Hal ini dapat menyebabkan kegagalan fungsionalitas program atau perubahan data yang tidak konsisten.
Misalnya dua atau lebih pengguna bersamaan mencoba menyelesaikan transaksi pembelian tiket. Tiket yang dijual kepada satu pengguna mungkin masih dianggap tersedia untuk pengguna lain, hal ini berpotensi menyebabkan overbooking.
Solusinya, kita dapat membuat mekanisme tertentu, seperti penguncian sementara jumlah tiket yang tersedia selama transaksi atau penggunaan teknik lain yang memastikan ketersediaan tiket.
Runtime Error
Runtime error terjadi saat sebuah program sedang dijalankan (runtime) dan menemui kondisi atau situasi yang tidak dapat ditangani dengan benar. Ini bisa disebabkan oleh berbagai faktor, termasuk kesalahan penggunaan sintaksis, pembagian oleh nol, atau masalah dengan operasi saat program berjalan.
Jika dijalankan, kode di atas akan menghasilkan runtime error, seperti di bawah ini.
Memory Leak
Memory leak terjadi ketika program tidak membebaskan atau mengosongkan memori yang sudah tidak diperlukan dan akibatnya penggunaan memori terus meningkat seiring waktu.
Kasus ini umumnya terjadi pada bahasa pemrograman yang tidak memiliki manajemen memori otomatis (garbage collector), tetapi dalam beberapa kasus, memory leak juga bisa terjadi pada bahasa pemrograman dengan garbage collector, misalnya karena file stream yang tidak ditutup kembali.
Integration Bug
Integration bug terjadi ketika terdapat kesalahan atau ketidakcocokan antara dua atau lebih komponen perangkat lunak atau sistem yang diintegrasikan. Misalnya ada kasus bahwa aplikasi mobile bergantung pada sebuah REST API.
Integration bug dapat terjadi jika ada perubahan pada struktur respons REST API, tetapi aplikasi yang mengonsumsi API tersebut tidak diperbarui untuk mengikuti perubahan tersebut.
Contoh: REST API sebelumnya memberikan respons dengan property bernama user_name. REST API diperbarui dan sekarang memberikan respons dengan property yang diubah menjadi username.
Oleh karena itu, ketika aplikasi mencoba mengakses user_name (nama lama), tidak ditemukan properti tersebut, dan hal ini menyebabkan aplikasi tidak berfungsi dengan baik atau bahkan dapat menghasilkan error.
Floating-Point Imprecision
Floating point imprecision merujuk pada ketidakmampuan komputer untuk merepresentasikan bilangan riil secara persis dalam representasi floating-point komputer. Floating point pada komputer memiliki batasan presisi dan dapat menyebabkan hasil perhitungan yang tidak tepat.
Jika kamu telusuri secara logika, kode di atas akan menghasilkan output “Harga Produk Sama”. Namun, ketika dijalankan ternyata output yang dihasilkan adalah “Harga Produk Tidak Sama”. Nah, bug ini disebabkan oleh floating-point imprecision. Sebab keterbatasannya dalam merepresentasikan bilangan real, komputer memproses 0.1 + 0.2 sebagai 0.30000000000000004
Jika kamu penasaran mengenai hal ini, ada sebuah web bernama 0.30000000000000004.com yang memuat penjelasan dan juga contoh kasusnya dalam berbagai bahasa pemrograman.
Compatibility Bug
Compatibility bug terjadi ketika suatu perangkat lunak tidak dapat berfungsi secara benar atau berinteraksi dengan baik dengan lingkungan tempat aplikasi dijalankan (runtime environment). Ini dapat terjadi pada level sistem operasi, perangkat keras, perangkat lunak pihak ketiga, atau antarmuka aplikasi.
Contoh kasusnya sebuah aplikasi dikembangkan untuk sistem operasi Windows 7, tetapi ketika dijalankan pada Windows 10, beberapa fitur atau fungsionalitas mungkin tidak berfungsi dengan benar karena adanya fitur atau API yang dihilangkan implementasinya pada Windows 10.
Cara Menghindari Bug dan Error
Pada dasarnya, bug dan error adalah suatu keniscayaan dalam pengembangan suatu solusi, perusahaan-perusahaan besar juga tidak lepas dari yang namanya bug. Tentunya, sebagai engineer kita sudah seharusnya mengusahakan agar kemungkinan terjadinya bug dapat diperkecil agar kerugian yang diakibatkan oleh bug tersebut dapat diminimalkan.
Berikut adalah beberapa cara yang dapat mencegah dan mengurangi kemungkinan munculnya bug dan error.
Pengujian Menyeluruh dan Terotomatisasi
Melakukan pengujian (testing) yang menyeluruh dan terstruktur untuk mengidentifikasi dan memperbaiki bug sebelum perilisan. Termasuk pengujian unit, integrasi, sistem, dan pengujian fungsional.
Pengujian sebaiknya diotomatisasi. Ini membantu mengidentifikasi bug lebih cepat dan memungkinkan pengujian secara efektif dan efisien.
Code Review dan Penerapan Standar Penulisan Kode
Melakukan code review secara berkala. Dengan memiliki lebih dari satu orang yang memeriksa kode, peluang untuk menemukan dan memperbaiki bug lebih awal menjadi lebih besar. Selain itu, menerapkan standar penulisan kode yang konsisten dan mudah dibaca juga membantu menghindari kesalahan penulisan yang umum.
Dokumentasi yang Baik
Menyertakan dokumentasi yang baik untuk kode, API, dan proses pengembangan. Ini membantu pengembang lain atau tim masa depan memahami dan menggunakan kode dengan benar.
Manajemen Versi
Menggunakan sistem kontrol versi (version control) seperti git untuk melacak perubahan kode. Hal ini memudahkan kembali ke versi sebelumnya jika terjadi bug ataupun perubahan yang tidak diinginkan.
Pembaruan Rutin
Memastikan bahwa semua dependensi dan library pihak ketiga diperbarui secara berkala untuk menghindari kerentanan keamanan dan bug yang dibawa oleh dependensi tersebut.
Pemantauan Kinerja dan Logging
Memantau kinerja aplikasi dan sistem secara terus-menerus untuk mendeteksi masalah sebelum mereka menjadi serius. Pemantauan aktif dapat membantu mengidentifikasi dan memperbaiki bug atau error yang muncul secara tiba-tiba.
Selain itu, log juga diperlukan agar kamu bisa langsung menganalisis masalah dan mengambil langkah yang diperlukan berdasarkan data dari log.
Refaktor Kode
Melakukan refaktor kode secara teratur untuk meningkatkan kualitas dan keterbacaan. Kode yang bersih dan sesuai standar penulisan memiliki kemungkinan lebih kecil untuk mengandung bug.
Kesimpulan
Kita telah mengeksplorasi berbagai jenis bug dalam pengembangan perangkat lunak, contoh-contoh konkret, dan gambaran nyata tentang situasi bug dapat muncul. Untuk mencegah bug, praktik-praktik seperti pengujian mendalam, otomasi pengujian, code review, dan penggunaan standar penulisan kode sangat ditekankan.
Dapat disimpulkan bahwa pencegahan bug memerlukan perhatian terhadap detail, pemeliharaan terus-menerus, dan pemahaman yang mendalam tentang lingkungan pengembangan. Walaupun bug adalah sesuatu yang tidak terhindarkan, kita perlu berusaha untuk mengurangi kemungkinan terjadinya karena bug bisa memunculkan kerugian besar yang tidak diinginkan.