Ada sejumlah definisi untuk kata sains, tetapi sepertinya Anda mungkin merujuk pada apa yang lebih tepat disebut " metode ilmiah ". Metode ilmiah dapat diringkas sebagai mengamati beberapa fenomena (mungkin bug atau perilaku program yang tidak terduga), merumuskan hipotesis atau hipotesis untuk menjelaskan perilaku, dan yang paling mungkin bereksperimen untuk membuktikannya (menulis tes yang mereproduksi masalah dengan andal).
Jenis bug (fenomena) yang dapat terjadi praktis tidak ada habisnya dan beberapa tidak perlu proses yang jelas. Misalnya, kadang-kadang Anda mengamati bug dan Anda langsung tahu apa yang menyebabkannya hanya karena Anda sangat terbiasa dengan kode tersebut. Di waktu lain, Anda tahu bahwa dengan beberapa input (aksi, serangkaian langkah, dll.), Hasil yang salah terjadi (macet, output buruk, dll.). Untuk kasus-kasus itu, seringkali tidak memerlukan banyak pemikiran "ilmiah". Beberapa pemikiran dapat membantu mengurangi ruang pencarian, tetapi metode yang umum adalah hanya dengan menelusuri kode dalam debugger dan melihat di mana semuanya berjalan serba salah.
Namun, situasi yang saya anggap paling menarik dan mungkin layak untuk proses ilmiah adalah ketika Anda menyerahkan beberapa hasil akhir dan diminta untuk menjelaskan bagaimana hal itu terjadi. Contoh nyata dari ini adalah crash dump. Anda dapat memuat crash dump dan mengamati keadaan sistem dan tugas Anda adalah menjelaskan bagaimana keadaannya. Kecelakaan crash (atau inti) dapat menunjukkan pengecualian, kebuntuan, kesalahan internal, atau keadaan "tidak diinginkan" seperti yang didefinisikan oleh pengguna (misalnya, kelesuan). Untuk situasi ini, saya biasanya mengikuti langkah-langkah berikut ini:
Observasi Sempit : Studi informasi langsung di sekitar masalah spesifik jika berlaku. Hal-hal yang jelas di sini adalah tumpukan panggilan, variabel lokal jika Anda bisa melihatnya, garis-garis kode yang mengelilingi masalah. Jenis studi lokasi spesifik ini tidak selalu berlaku. Sebagai contoh, mempelajari sistem "lambat" mungkin tidak memiliki lokasi awal yang jelas seperti ini, tetapi situasi kerusakan atau kesalahan internal kemungkinan akan memiliki titik kepentingan yang segera dan jelas. Salah satu langkah spesifik di sini mungkin menggunakan alat seperti windbg (jalankan! Analisis -v pada crash dump yang dimuat dan lihat apa yang memberitahu Anda).
Pengamatan Luas : Mempelajari bagian lain dari sistem. Periksa status semua utas dalam sistem, lihat informasi global apa pun (jumlah pengguna / operasi / item, transaksi / proses / widget aktif, dll.), Informasi sistem (OS), dll. Jika pengguna memberikan detail eksternal apa pun , pikirkan hal-hal yang berkaitan dengan apa yang telah Anda amati. Misalnya, jika mereka memberi tahu Anda bahwa masalahnya terjadi setiap Selasa sore, tanyakan pada diri sendiri apa artinya itu.
Mengadakan hipotesa: Ini adalah bagian yang benar-benar menyenangkan (dan saya tidak bercanda tentang hal itu menjadi menyenangkan). Ini seringkali membutuhkan banyak pemikiran logis secara terbalik. Sangat menyenangkan untuk memikirkan bagaimana sistem masuk ke kondisi saat ini. Saya menduga ini bagian yang banyak orang anggap sebagai seni. Dan saya kira itu mungkin jika programmer baru saja mulai melemparkan benda-benda secara acak untuk melihat tongkat apa. Tetapi dengan pengalaman, ini bisa menjadi proses yang didefinisikan dengan cukup baik. Jika Anda berpikir sangat logis pada titik ini, sering kali mungkin untuk menentukan set path yang mengarah ke status yang diberikan. Saya tahu bahwa kita dalam keadaan S5. Agar itu terjadi, S4a atau S4b perlu terjadi dan mungkin S3 sebelum S4a, dll. Lebih sering tidak, mungkin ada beberapa item yang dapat mengarah ke keadaan tertentu. Kadang-kadang mungkin membantu untuk menuliskan pada kertas awal alur sederhana atau diagram keadaan atau serangkaian langkah yang berhubungan dengan waktu. Proses aktual di sini akan sangat bervariasi tergantung pada situasinya, tetapi pemikiran serius (dan pemeriksaan ulang pada langkah-langkah sebelumnya) pada saat ini akan sering memberikan satu atau lebih jawaban yang masuk akal. Perhatikan juga bahwa bagian yang sangat penting dari langkah ini adalah untuk menghilangkan hal-hal yang tidak mungkin. Menghapus yang mustahil dapat membantu memangkas ruang solusi (ingat apa yang dikatakan Sherlock Holmes tentang apa yang tersisa setelah Anda menghilangkan yang mustahil). Perhatikan juga bahwa bagian yang sangat penting dari langkah ini adalah untuk menghilangkan hal-hal yang tidak mungkin. Menghapus yang mustahil dapat membantu memangkas ruang solusi (ingat apa yang dikatakan Sherlock Holmes tentang apa yang tersisa setelah Anda menghilangkan yang mustahil). Perhatikan juga bahwa bagian yang sangat penting dari langkah ini adalah untuk menghilangkan hal-hal yang tidak mungkin. Menghapus yang mustahil dapat membantu memangkas ruang solusi (ingat apa yang dikatakan Sherlock Holmes tentang apa yang tersisa setelah Anda menghilangkan yang mustahil).
Eksperimen : Pada tahap ini, cobalah untuk mereproduksi masalah berdasarkan hipotesis yang diturunkan pada langkah sebelumnya. Jika Anda melakukan pemikiran serius pada langkah sebelumnya, ini seharusnya sangat mudah. Terkadang saya "menipu" dan memodifikasi basis kode untuk membantu tes yang diberikan. Sebagai contoh, saya baru-baru ini menyelidiki kecelakaan yang saya simpulkan karena kondisi balapan. Untuk memverifikasinya, saya cukup meletakkan Sleep (500) di antara beberapa baris kode untuk memungkinkan utas lain melakukan hal-hal buruk pada saat yang tepat. Saya tidak tahu apakah ini diizinkan dalam sains "nyata", tetapi sangat masuk akal dalam kode yang Anda miliki.
Jika Anda berhasil mereproduksinya, kemungkinan Anda hampir selesai (semua yang tersisa adalah langkah sederhana untuk memperbaikinya ... tapi itu untuk hari lain). Pastikan untuk memeriksa tes baru ke dalam sistem uji regresi. Dan saya harus menunjukkan bahwa saya bermaksud pernyataan sebelumnya tentang memperbaikinya menjadi sederhana. Menemukan suatu solusi dan mengimplementasikannya membutuhkan kerja keras. Menurut pendapat saya, memperbaiki bug bukan bagian dari proses debugging, melainkan pengembangan. Dan jika perbaikannya sama sekali terlibat, bahwa itu harus memerlukan sejumlah desain dan ulasan.