Ini adalah bahan referensi tentang Heisenbags. Kita berbicara tentang bagaimana mereka terlihat dan bagaimana mereka berhubungan dengan mainframe - nenek moyang dari cloud.
/ foto Lars Zimmermann CC BYHeisenbug (Heisenbug atau Heisenbug) adalah istilah yang menjelaskan kesalahan yang mengubah properti selama debugging kode. Artinya, mereka menghilang selama pengujian dan debugging, tetapi muncul dalam produksi.
Nama "Heisenbag" mengacu pada
prinsip ketidakpastian Heisenberg dari mekanika kuantum. Secara umum, ini dapat digambarkan sebagai perubahan tak terduga dalam sifat-sifat objek yang diamati sebagai hasil dari pengamatan.
Ceritanya
Istilah Heisenbug dianggap Bruce Lindsay, seorang karyawan Pusat Penelitian IBM. Dia telah berkontribusi pada pengembangan basis data relasional dan telah terlibat dalam pengembangan mesin basis data perusahaan
IBM System R.Pada tahun 1985, ketika belajar di Universitas Berkeley, Bruce dan
Jim Gray (James Nicholas Gray), seorang ilmuwan Amerika dalam teori sistem komputer,
bekerja pada OS CAL-TSS. Itu ditulis khusus untuk mainframe
Proses Proses 6400 dual-prosesor [
PDF , hal. 3], di mana militer memproses sejumlah besar data.
Tentu saja, selama proses pengembangan ada bug. Tetapi beberapa dari mereka istimewa - segera setelah para insinyur berusaha memperbaikinya, mereka menghilang. Pada saat itu, Lindsay hanya mempelajari fisika dan prinsip Heisenberg pada khususnya. Tiba-tiba, ia sadar pada Lindsay - ia dan Gray menyaksikan fenomena serupa: kesalahan menghilang, karena pengamatan mempengaruhi sifat-sifat objek. Dari sini nama "heisenbag" datang.
Lindsay menceritakan kisah ini
dalam sebuah wawancara dengan perwakilan dari
Association of Computing Engineering (ACM) pada tahun 2003.
Contoh Heisenbug
Pengguna di jaringan dan pada platform tematik seperti Stack Overflow berbagi beberapa contoh tas heisen yang mereka temui dalam proyek mereka. Salah satu penghuni SO mencoba menghitung luas gambar antara dua kurva dengan akurasi tiga angka desimal. Untuk men-debug algoritma dalam C ++, ia menambahkan baris:
cout << current << endl;
Tetapi begitu dia mengomentarinya, kode itu berhenti bekerja dan berputar. Programnya
adalah sebagai berikut :
#include <iostream> #include <cmath> using namespace std; double up = 19.0 + (61.0/125.0); double down = -32.0 - (2.0/3.0); double rectangle = (up - down) * 8.0; double f(double x) { return (pow(x, 4.0)/500.0) - (pow(x, 2.0)/200.0) - 0.012; } double g(double x) { return -(pow(x, 3.0)/30.0) + (x/20.0) + (1.0/6.0); } double area_upper(double x, double step) { return (((up - f(x)) + (up - f(x + step))) * step) / 2.0; } double area_lower(double x, double step) { return (((g(x) - down) + (g(x + step) - down)) * step) / 2.0; } double area(double x, double step) { return area_upper(x, step) + area_lower(x, step); } int main() { double current = 0, last = 0, step = 1.0; do { last = current; step /= 10.0; current = 0; for(double x = 2.0; x < 10.0; x += step) current += area(x, step); current = rectangle - current; current = round(current * 1000.0) / 1000.0; //cout << current << endl; //<-- COMMENT BACK IN TO "FIX" BUG } while(current != last); cout << current << endl; return 0; }
Inti dari heisenbug : ketika tidak ada cetakan, program melakukan perbandingan dengan akurasi tinggi dalam register prosesor. Selain itu, akurasi hasil melebihi kemampuan ganda. Untuk mengeluarkan nilai, kompiler mengembalikan hasil perhitungan ke memori utama - sementara bagian pecahan dibuang. Dan perbandingan selanjutnya sementara mengarah ke hasil yang benar. Ketika sebuah garis dikomentari, tidak ada pemangkasan tersirat dari bagian fraksional. Karena alasan ini, kedua nilai sementara selalu berubah menjadi tidak setara satu sama lain. Sebagai solusi untuk masalah ini, salah satu peserta dalam diskusi menyarankan untuk menggunakan perbandingan perkiraan angka floating point.
Kisah lain tentang heisenbug
dibagikan oleh para insinyur yang bekerja dengan lingkungan bahasa
Smalltalk-80 di Unix. Mereka memperhatikan bahwa sistem macet jika Anda membiarkannya untuk sementara waktu. Tetapi setelah memindahkan kursor mouse, semuanya bekerja kembali seperti biasa.
Masalahnya adalah dengan penjadwal Unix, yang menurunkan prioritas tugas yang menganggur. Pada titik tertentu, prioritas berkurang sedemikian rupa sehingga proses di Smalltalk tidak punya waktu untuk menyelesaikan. Tumpukan tugas tumbuh dan menggantung program. Ketika pengguna memindahkan kursor, OS mengembalikan prioritas dan semuanya kembali ke titik awal.
Bug * lainnya
Ada sejumlah istilah yang menggambarkan semua jenis kesalahan: Borbag, Mandelbug, SchrΓΆdinbag.
Borbag , kebalikan dari Heisenbug, adalah kesalahan umum yang mudah ditemukan dan diperbaiki. Dinamai setelah Niels Bohr, yang pada 1913 mengusulkan model struktur atom yang sederhana dan mudah dipahami. Menurut model ini, elektron dari suatu atom bergerak dalam orbit tertentu, yang berarti bahwa momentum dan jari-jarinya dapat diprediksi. Demikian juga, penampilan Borbags dapat diprediksi jika kondisi yang diperlukan dibuat untuk mereka.
/ foto OLCF di ORNL CC BYSchroedinbag adalah kesalahan yang ada dan tidak ada pada saat yang sama, sampai pengembang melihatnya. Kesalahan itu dinamai untuk menghormati
eksperimen pemikiran terkenal.
Adapun
Mandelbug , ini adalah kesalahan karena sistem berperilaku tidak menentu dan tak terduga. Fenomena ini dinamai setelah fisikawan, ahli matematika dan pencipta geometri fraktal
Benoit Mandelbrot .
Apa hasilnya
Ada
banyak contoh Heisenbags (dan * bug lainnya). Mereka sangat sulit ditemukan, tetapi penyebabnya biasa: variabel tidak diinisialisasi, kesalahan sinkronisasi dalam lingkungan multi-utas, atau masalah dengan algoritma
penghilangan kode mati . Ternyata untuk mengatasi kesalahan seperti itu, mereka harus dipotong bahkan pada tahap desain aplikasi.
Dari blog IaaS perusahaan: