August 15, 2008

Kesalahan Pada Pemrograman


“ERROR” adalah sebuah kata yang terdengar cukup menakutkan di dunia pemrograman. Programer adalah orang yang akan dilirik dengan alis terangkat jika terjadi kesalahan pada sebuah aplikasi pada saat digunakan. Untuk menghindari hal tersebut, Anda perlu mengenal dan memperbaiki semua jenis kesalahan pada program.

Hampir tidak ada aplikasi yang berjalan sempurna sebelum melewati berbagai rentetan kesalahan, semakin besar aplikasi yang dibuat, semakin banyak kesalahan yang dapat timbul. Sukar dibayangkan jika Anda dapat mengetikkan ratusan baris kode program tanpa ditemukan kesalahan pada saat dijalankan atau dikompilasi untuk pertama kalinya.

Syntax Error

Kesalahan yang paling sering ditemukan pada saat membuat program adalah kesalahan sintaks atau Syntax Error, dimana perintah atau statemen yang diketikkan menyalahi aturan pengkodean yang dimiliki oleh bahasa pemrograman yang Anda gunakan.

Sebuah bahasa pemrograman memiliki aturan pengkodean tersendiri yang harus dipatuhi, sebagai contoh pada bahasa pemrograman Pascal/Delphi, setiap statemen diwajibkan diakhiri dengan tanda titik koma (;). Jika Anda tidak menuliskannya, program akan menampilkan pesan Syntax Error pada saat dijalankan.

Setiap bahasa pemrograman memiliki keyword, yaitu perintah-perintah baku yang digunakan. Sebagai contoh, keyword yang umum adalah kondisi if, perulangan for atau while, penulisan fungsi dan lambang aritmatika seperti modulus, pangkat, dan lain-lain. Kesalahan penulisan keyword juga merupakan Syntax Error.

Kesalahan penulisan parameter pada sebuah function/procedure juga termasuk dalam kategori Syntax Error, misalnya jika function yang Anda gunakan memerlukan parameter sementara Anda lupa menuliskan parameter tersebut.

Syntax Error merupakan jenis kesalahan yang paling sering ditemui, tetapi juga pada umumnya paling mudah untuk ditanggulangi. Syntax Error cukup mudah diketahui dan diperbaiki jika bahasa pemrograman yang Anda gunakan menunjukkan baris kesalahan dengan tepat, dan menampilkan pesan kesalahan yang benar.

Pada beberapa bahasa pemrograman, disediakan fasilitas Auto Syntax Check, dimana muncul sebuah pesan peringatan ketika Anda mengetikkan sintaks yang salah.

Run-time Error

Jenis kesalahan Run-time Error terjadi ketika kode program melakukan sesuatu yang tidak dimungkinkan. Contohnya pada saat sebuah aplikasi mencoba mengakses file yang tidak ada, atau terjadi kesalahan alokasi memory.

Terkadang Run-time Error terjadi karena berbagai aspek dan tidak selalu karena kesalahan pemrograman, sebagai contoh jika Anda sengaja menghapus beberapa file penting yang digunakan oleh suatu aplikasi, maka terdapat kemungkinan akan terjadi Run-time Error pada saat aplikasi tersebut dijalankan.

Walaupun demikian, pencegahan semaksimal mungkin dengan memberikan validasi dan pesan yang user-friendly saat terjadi kesalahan pada aplikasi, akan sangat membantu untuk mengetahui mengapa aplikasi tidak berjalan dengan semestinya.

Logical Error

Logical Error merupakan jenis kesalahan yang cukup sulit untuk ditemukan penyebabnya. Karena aplikasi yang mengandung Logical Error berjalan tanpa pesan kesalahan, tetapi mengeluarkan hasil yang tidak diharapkan, misalnya jika aplikasi Anda menghasilkan perhitungan yang salah.

Logical Error baru dapat diketahui setelah Anda melakukan testing dan meninjau hasilnya. Logical Error dapat diperbaiki dengan memeriksa alur program dan nilai variabel yang dihasilkan.

Programer = Pencari Bug?


Sebuah error pada aplikasi disebut dengan istilah bug, atau dalam Bahasa Inggris berarti kutu atau binatang kecil. Konon istilah bug muncul karena ditemukannya binatang kecil yang menyebabkan kerusakan pada sebuah komputer tabung pada tahun 1945.

Bug aplikasi terdapat pada kode program, yang dapat mengganggu kenyamanan pengguna aplikasi Anda. Pada tingkat tertentu, keberadaan bug cukup memberikan efek yang besar.

Anda mungkin belum melupakan saat dimana orang ramai membicarakan “Y2K Bug” atau bug tahun 2000, atau munculnya istilah “Blue screen of Death” pada sistem operasi Windows, atau “Kernel Panic” pada sistem operasi Linux, semua contoh tersebut menunjukkan sebuah bug serius dapat mengakibatkan dampak negatif yang cukup besar.

Proses mencari penyebab bug disebut dengan debug, yang juga merupakan tugas programer setelah menerima laporan bug. Walaupun demikian, jangan menjadikan pekerjaan Anda sebagai pencari bug, Untuk itu hanya ada satu cara, minimalkan bug pada aplikasi yang Anda buat.

Apa yang harus Anda lakukan untuk menghindari jenis-jenis kesalahan yang telah disebutkan di atas? Bisa jadi tidak ada program yang sempurna, tetapi selalu ada cara untuk mengatasi atau menghindari kesalahan semaksimal mungkin.

Selalu Deklarasikan Variabel

Syntax Error, bahkan Logical Error, mungkin terjadi jika terdapat penulisan variabel yang salah. Sebaiknya Anda mendeklarasikan variabel yang Anda gunakan walaupun bisa jadi bahasa pemrograman yang Anda gunakan mengijinkan untuk tidak melakukan deklarasi variabel.

Visual Basic merupakan salah satu bahasa pemrograman yang mengijinkan penggunaan variabel tanpa deklarasi, walaupun demikian disarankan Anda menggunakan deklarasi variabel. Hal tersebut akan memperkecil kesalahan penulisan variabel.

Masih dengan contoh Visual Basic, Anda dapat menambahkan perintah Option Explicit pada program untuk mencegah kesalahan tulis pada variabel, jika terdapat variabel yang belum dideklarasikan, maka Visual Basic akan menampilkan pesan kesalahan.

Anda sebaiknya memiliki suatu skema standard untuk pemberian nama variabel dan konsisten dengan penggunaannya. Contohnya berikan nama variabel diawali dengan huruf s jika bertipe data string, misalnya sResult, sTemp, dan lain-lain.

Pada Visual Basic maupun beberapa bahasa pemrograman lain yang berorientasi object, kita dapat mendeklarasikan variabel dengan tipe data object. Terdapat berbagai jenis macam object yang dikenal, dan sebaiknya Anda menuliskannya dengan lengkap object yang dimaksud. Misalnya object ListBox, Label, dan lain-lain.

Gunakan Variabel Lokal

Sangat disarankan agar Anda selalu menggunakan variabel lokal. Salah satu manfaatnya adalah jika terjadi kesalahan program (terutama Logical Error), maka penyebab kesalahan dan solusinya akan lebih mudah ditemukan. Hal ini dikarenakan variabel lokal memiliki ruang lingkup penggunaan yang lebih kecil dibandingkan variabel global, yang dapat diakses oleh procedure yang mana saja.

Penggunaan variabel global, sering menimbulkan kerancuan dan memperbesar kemungkinan terjadinya kesalahan tanpa disadari.

Kenali Jenis Bug

Bug yang timbul pada sebuah aplikasi memiliki karateristik. Karena itu selalu baca dan perhatikan baik-baik pesan kesalahan yang timbul. Beberapa jenis bug berdasarkan karakteristiknya adalah sebagai berikut:

1. Divide By Zero.
Jika pada sebuah pembagian, pembagi bernilai 0, maka program akan terhenti dan mengalami error.

2. Infinite Loop.
Pengertian loop adalah perulangan, yang sering digunakan dalam teknik pemrograman. Penggunaan loop yang salah dapat mengakibatkan program menjalankan sebuah procedure tanpa akhir.

3. Arithmatic overflow or Underflow.
Overflow terjadi saat sebuah perhitungan menghasilkan nilai yang lebih besar daripada nilai yang dapat ditampung oleh media/variabel penyimpan. Sementara underflow merupakan kebalikannya. Pada perhitungan aritmatik, hal ini sering ditemukan dan menjadi masalah.

4. Exceeding Array Bounds.
Array merupakan variabel berdimensi yang memiliki indeks. Saat program mengakses indeks diluar array yang ditentukan, maka akan mengakibatkan error.

5. Access Violation.
Hal yang terjadi saat sebuah proses mencoba melewati batas yang diijinkan oleh sistem. Misalnya menulis sebuah nilai pada alamat memory, segmen, atau media yang diproteksi.

6. Memory Leak.
Penggunaan memory yang tidak diinginkan, dapat terjadi karena program gagal melepaskan memory yang sudah tidak digunakan.

7. Stack Overflow or Underflow.
Stack merupakan struktur data dengan prinsip LIFO (Last In First Out), pada program Anda dapat mengimplementasikan logika stack untuk suatu tujuan. Tetapi jika stack melebihi atau dibawah nilai yang diijinkan oleh program, maka akan timbul kesalahan Stack Overflow/Underflow.

8. Buffer Overflow.
Buffer merupakan tempat penyimpanan sementara dalam teknik pemrograman. Buffer Overflow terjadi jika Anda menyimpan terlalu banyak data yang tidak dapat ditampung oleh buffer yang disediakan.

9. Deadlock.
Merupakan suatu kondisi dimana dua atau lebih proses saling menunggu satu sama lain untuk menyelesaikan prosesnya, dan tidak satupun dari proses tersebut yang selesai. Problem deadlock sering ditemukan pada multiprocessing.

10. Off By One Error.
Merupakan istilah untuk menggambarkan perulangan yang terlalu banyak atau terlalu sedikit. Misalnya perulangan yang dikehendaki adalah lima kali, tetapi kenyataan yang terjadi aplikasi mengulang proses tersebut sebanyak empat kali atau enam kali. Kesalahan ini pada umumnya terjadi karena kesalahan logika penulisan kode pada proses perulangan.

Berikan Komentar

Jangan kuatir kode program Anda dipenuhi oleh komentar. Karena akan lebih mudah bagi Anda untuk mempelajari lagi kode-kode program yang pernah Anda buat dengan membaca komentar.

Dengan mengerti kode program dengan baik, maka akan menjadi lebih mudah jika pada suatu saat terdapat Logical Error yang membutuhkan analisa ulang kode program.

Gunakan Log File

Informasi proses yang dijalankan aplikasi dan tersimpan pada sebuah log file (dapat berupa file text atau table) dapat menjadi informasi yang sangat berguna untuk menganalisa bug yang mungkin terjadi. Terutama informasi yang menjelaskan apa yang terjadi sebelum, selama, dan sesudah bug terjadi.

Untuk menghindari log file yang terlalu besar, Anda dapat memisahkan log file terbagi menjadi log untuk komponen-komponen utama pada aplikasi. Jangan lupa untuk selalu mencatat waktu (timestamp) pada setiap record. Anda dapat menghapus atau melakukan backup pada log file secara periodik.

Validasi

Tidak semua orang mematuhi aturan yang Anda terapkan pada aplikasi, karena itu Anda harus melakukan validasi untuk data yang dimasukkan oleh pengguna. Misalnya pada suatu form pendaftaran, Anda sebaiknya melakukan validasi untuk input yang tidak boleh kosong (mandatory/required fields), melakukan pembatasan karakter, dan validasi huruf/angka yang diperlukan.

Mengenal Environment

Saat Anda mengetikkan kode program, menjalankannya, atau melakukan debug pada program, Anda berada pada environment yang berbeda-beda. Terdapat 3 environment yang umum dikenal, yaitu:

1. Design Time.
Aplikasi yang Anda kerjakan dilakukan pada saat design time.

2. Run Time.
Saat menjalankan aplikasi.

3. Break Mode.
Environment saat Anda melakukan proses debug atau melihat kode program saat program tersebut dijalankan, Anda dapat melihat alur program dan perubahan nilai pada variabel, sehingga Anda dapat menelusuri kesalahan yang terjadi. Break Mode terletak diantara Design Time dan Run Time.

Lebih Jauh Mengenal Break Mode

Break Mode merupakan environment favorit programer untuk melacak kesalahan program atau dikenal dengan proses debug, terkadang memerlukan kesabaran dan ketelitian super tinggi, tetapi no pain no gain, bukan?

Dengan menjalankan Break Mode, aplikasi Anda akan dijalankan bertahap dari satu proses ke proses selanjutnya, Anda juga dapat menghentikan proses Break Mode setelah mendapatkan informasi yang cukup dalam proses debug.

Dalam menganalisa kesalahan di dalam kode program yang sangat panjang, akan sangat melelahkan jika Anda melakukan debug per-baris program dari awal hingga akhir. Untuk itu fasilitas breakpoint sangat penting untuk keperluan debug. Breakpoint mengijinkan Anda menandai baris dimana proses debug dimulai.

Posisi breakpoint tidak dapat ditempatkan pada baris:

1. Compiler Directive.
2. Deklarasi Variabel.
3. Baris Konstanta.
4. Baris yang kosong atau berisi komentar.

Pada saat memasuki Break Mode, umumnya terdapat beberapa instruksi yang dapat Anda gunakan untuk melakukan proses debug:

1. Step Into.
Menjalankan kode program baris per baris. Setelah satu baris dieksekusi, maka cursor akan berpindah pada baris dibawahnya. Jika baris yang dieksekusi merupakan suatu procedure, maka proses debug akan berpindah pada procedure tersebut dan akan menjalankan kode program didalamnya.

Dengan eksekusi per-baris ini, Anda dapat memantau nilai-nilai variabel yang dihasilkan, umumnya pada sebuah jendela terpisah yang menampilkan nilai-nilai variabel saat ini.

Setiap kali Anda mengeksekusi baris program, maka program akan dijalankan pada environment Run Time, dan kembali pada Break Mode saat selesai menjalankan baris tersebut.

2. Step Over.
Pada prinsipnya Step Over sama dengan Step Into. Hal yang membedakan hanyalah saat pemanggilan sebuah procedure. Jika pada Step Into, proses debug akan memasuki procedure yang dipanggil dan mengeksekusi kode program didalamnya baris demi baris, maka Step Over menjalankan procedure tersebut tanpa memperlihatkan baris program didalamnya.

Step Over dilakukan jika Anda hanya ingin melakukan proses debug pada satu level, atau jika Anda yakin procedure yang dipanggil telah berjalan dengan baik dan tidak memerlukan proses debug per-baris.

Step Over dan Step Into dapat digunakan bergantian tergantung kebutuhan Anda dalam menganalisa kode program.

3. Step Out.
Jika Anda telah berada pada suatu procedure dan ingin kembali pada baris dimana procedure tersebut dipanggil, maka gunakanlah Step Out. Step Out akan menjalankan semua baris program yang tersisa pada procedure tersebut, dan kembali pada Break Mode saat keluar dari procedure yang bersangkutan.

4. Run To Cursor.
Anda dapat menentukan baris selanjutnya dimana Anda ingin memulai proses debug yang baru. Proses ini mirip dengan breakpoint, hanya Anda tidak perlu menandai baris tersebut terlebih dahulu, tetapi langsung mengarahkan eksekusi program pada posisi tersebut.

Layar Penolong Saat Break Mode

Melakukan proses debug pada Break Mode tidak akan menghasilkan sesuatu yang signifikan jika Anda tidak mengetahui apa saja yang terjadi pada variabel-variabel yang dieksekusi. Untuk itu Anda memerlukan layar penolong, yang dapat dikategorikan sebagai berikut:

1. Layar Immediate.
Jika layar ini diaktifkan, Anda dapat mengetikkan variabel atau perhitungan untuk melihat nilainya. Anda bahkan dapat mengubah nilai variabel yang sedang berjalan sehingga mempengaruhi proses debug selanjutnya.

Anda dapat mengetikkan object debug pada baris program sehingga menampilkan nilai variabel yang ingin Anda monitor pada Layar Immediate, contoh perintah object debug adalah debug.print.

Pada Visual Basic 6.0, Anda dapat mengaktifkan Layar Immediate dengan memilih menu View – Immediate Window.

2. Layar Local.
Layar Local akan menampilkan seluruh nilai variabel pada procedure yang sedang aktif/dijalankan pada saat Break Mode, sehingga Anda dapat memonitor perubahannya tanpa perlu mengetikkan masing-masing variabel atau menggunakan object debug seperti pada Layar Immediate.

Selain itu, Layar Local juga menampilkan hirarki object dan property yang terdapat pada form yang aktif.

Pada Visual Basic 6.0, Anda dapat mengaktifkan Layar Local dengan memilih menu View – Locals Window.

3. Layar Watch.
Digunakan untuk melihat nilai variabel pada konteks yang telah ditentukan, misalnya pada procedure tertentu. Anda harus terlebih dahulu mendefinisikan variabel atau expression yang ingin Anda tampilkan. Expression adalah sebuah instruksi untuk menjalankan sesuatu yang menghasilkan sebuah nilai, x = 1 adalah contoh sebuah expression sederhana.

Terkadang Anda memerlukan Watch jika Anda memiliki nama variabel yang sama tetapi terletak pada procedure/konteks yang berbeda. Layar Watch juga sangat berguna karena Anda dapat menentukan expression, dimana pada saat kondisi nilai expression tersebut terpenuhi atau berubah, maka program akan berada pada Break Mode.

Pada Visual Basic 6.0, Anda dapat mengaktifkan Layar Watch dengan memilih menu View – Watch Window. Untuk menambahkan variabel/expression, pilih menu Debug – Add Watch, atau Debug – Quick Watch.

4. Layar Call Stack.
Sering terjadi pada saat melakukan proses debug, Anda tersesat dan kehilangan alur karena terlalu banyak procedure dan modul yang dieksekusi. Pada saat ini Layar Call Stack sangat diperlukan.

Call Stack menunjukkan alur proses debug dengan menampilkan procedure yang dieksekusi secara berurutan. Sehingga Anda dapat mengetahui procedure pemanggil dan procedure yang dipanggil.

Pada Visual Basic 6.0, Anda dapat mengaktifkan Layar Call Stack dengan memilih menu View – Call Stack.

Langkah Pelaksanaan

Anda telah meminimalkan kesalahan, Anda telah mengenal dan memiliki tools untuk menanggulangi kesalahan, tetapi masih terdapat bug yang ditemukan dan harus ditanggulangi. Berikut adalah langkah mengatasi bug:

1. Kenali Keberadaan Bug.
Programer yang berpengalaman sering telah dapat mengira-ngira penyebab terjadinya bug, beberapa proses yang rumit pada aplikasi dapat menyebabkan kesalahan saat digunakan oleh user. Contohnya saat aplikasi membutuhkan data input dengan format tertentu, tetapi user menyediakan data input dengan format yang salah.

Jika respon aplikasi adalah dengan menampilkan pesan kesalahan dan menghentikan proses, kesalahan akan dapat lebih mudah diperbaiki. Sedangkan kesalahan yang diketahui karena hasil yang tidak diinginkan tidak sesuai dengan hasil yang diharapkan, tetapi aplikasi tetap berjalan dengan baik justru akan lebih sulit diperbaiki.

Tujuan dari langkah ini adalah mengenali penyebab bug, dengan menganalisa dalam kondisi apa bug terjadi, maka akan lebih mudah untuk melangkah ke tahap selanjutnya.

2. Memisahkan Kode Program yang Mengandung Bug.
Setelah menemukan penyebab dan kondisi yang menghasilkan bug, Anda dapat memisahkan kode program yang bermasalah tersebut untuk diperiksa. Langkah ini memerlukan testing yang berulang-ulang untuk memastikan kode program yang bermasalah.

Lakukan testing secara berurutan, misalnya apakah input sudah benar, terbaca dengan benar, diproses dengan benar, dan seterusnya.

Langkah ini akan lebih mudah jika Anda membuat aplikasi dengan konsep pemrograman modular yang membagi-bagi program yang besar ke dalam sub modul atau procedure yang terpisah.

Jika terdapat suatu procedure yang menerima input dengan benar tetapi menghasilkan output yang salah, maka dapat dipastikan letak bug terdapat pada procedure tersebut.

3. Identifikasi Penyebab Bug.
Setelah menemukan lokasi kode program yang mengandung bug, langkah selanjutnya adalah mengidentifikasi penyebab bug. Pemahaman yang baik akan ruang lingkup aplikasi tersebut adalah kunci sukses mencari sumber bug.

Hal yang cukup berbahaya adalah jika Anda kurang memahami alur aplikasi dan mengubah kode program untuk memperbaiki bug yang ada, tetapi ternyata menciptakan bug yang lain.

4. Memperbaiki Bug.
Dengan mengidentifikasi sumber bug dengan tepat, mungkin akan timbul beberapa langkah perbaikan bug, pilihlah yang terbaik dan tidak mengganggu proses lainnya. Terkadang Anda dapat menemukan bug lain yang belum dilaporkan, eliminasi semua bug yang mungkin muncul.

5. Testing.
Setelah bug diperbaiki, adakan testing dengan tujuan memastikan apakah bug telah dapat ditanggulangi dan tidak muncul lagi, dan apakah perbaikan yang dilakukan tidak memiliki efek yang tidak diinginkan.

Basmi Sebelum Dilaporkan

Percaya atau tidak, ada beberapa pengguna aplikasi yang cukup kreatif menyikapi bug dengan cara sendiri dan memiliki resep khusus dengan mempelajari pola dan karakteristik aplikasi, sehingga bug dapat dihindari dengan melakukan langkah-langkah tertentu.

Contohnya ada aplikasi yang tidak dapat berjalan saat aplikasi tertentu aktif pada saat bersamaan, atau aplikasi yang baru berjalan baik pada resolusi layar tertentu. Ada baiknya Anda memperbaiki bug yang Anda temukan dan melakukan update pada pengguna, walaupun bug tersebut tidak dilaporkan.

Hal ini tentu akan menambah kredibilitas Anda, dan yang terpenting, aplikasi Anda akan menjadi lebih nyaman bagi pengguna.

7 comments:

johan said...

artikel di tulis oleh programmer yang sangat kompeten di bidang nya. thumbs up

Joko Nurjadi said...

ah si bapak, bisa aja! :-ss

John said...

Iya top banget, ternyata banyak juga tipe kesalahan dalam pemrograman. Jadi tau skrg.

Pak Joko minta latihan VB6 dunk buat anak SMP, tapi yg simple simple aja yah.

Oh yah email bapak apa?
my email : eishildes@gmail.com

Thanks

Joko Nurjadi said...

halo pak john, email saya joko.nurjadi@gmail.com.

wah saya dulu smp blom ngerti komputer pak, jadi rada susah ngeraba-raba kalo ditanya materi untuk anak smp, hehehe...

tapi mungkin tekankan pada logika pemrograman, misalnya gimana bikin deret sederhana, 1,2,3,4,5 .. dst

trus meningkat ke deret2 yang lebih susah, misal:

1
12
123
1234
12345

dan seterusnya, supaya logika pemrogramannya kuat dan ada unsur have fun dalam coding.

John said...

Terimakasih Pak Joko, oh yah mengenai deret angka itu gimana buatnya? Bisa kasih tau cara penulisan commandnya?

Joko Nurjadi said...

kalo deret angka yang 1,2,3,4,5 buatnya mudah pak, asal tau perintah pengulangan, misalnya dalam vb 6:

For i = 1 To 5
lbl1.Caption = lbl1.Caption & i & " "
Next

intinya adalah variabel i diulang dari 1 sampai 5, dan ditampung dalam sebuah label yang bernama lbl1

kalau untuk deret:
1
12
123
1234
12345

logikanya lebih main, kira2 codingnya seperti ini:

For i = 1 To 5
For j = 1 To i
lbl1.Caption = lbl1.Caption & j & " "
Next j
lbl1.Caption = lbl1.Caption & vbCrLf
Next i

contoh diatas pake language vb6, tapi rata2 bahasa pemrograman bisa menggunakan logika yg sama.

Alvino Felix said...

Gan, Bisa Tanya Kaga, Bila syntax error Gimana Bisa Memperbaikinya? Maklum Masih Newbie Yang Baru Dibeliin LP