- Pada 2016, fitur unggah foto berbasis lokasi di aplikasi mobile React Native gagal hanya pada Android beta, sementara masalahnya tidak bisa direproduksi di Android lokal maupun iOS, dan ditelusuri selama seminggu
- Android beta tidak memberi umpan balik kesalahan meskipun unggah gambar gagal, dan setiap kali build baru diunggah ke Play Store dibutuhkan sekitar 1 jam, sehingga verifikasi hipotesis berjalan lambat
- Dibandingkan dengan contoh di bidang embedded, perangkat keras, kimia, dan kedokteran hewan, terlihat bahwa debugging perangkat lunak jauh lebih cepat dan memiliki observabilitas yang lebih tinggi
- Penyebab sebenarnya adalah perbedaan satu karakter pada tipe MIME gambar: ditulis
"jpg", padahal meskipun ekstensi filenya.jpg, tipe MIME-nya harus"jpeg" - Lingkungan pengembangan yang memungkinkan penggunaan log, observasi real-time, debugger, dan eksperimen berulang dengan murah adalah sebuah keistimewaan besar jika dibandingkan dengan loop umpan balik di profesi lain
Unggah foto yang gagal hanya di Android beta
- Fitur geolocated photos di aplikasi mobile React Native tampak seperti sudah siap dirilis pada hari Senin, tetapi setelah distribusi Android beta, gambar tidak bisa diunggah
- Pengujian Android lokal dan iOS beta berjalan normal, sehingga penyebab kegagalan tidak langsung terlihat
- Bahkan setelah mengunggah ulang versi dengan penanganan error yang ditingkatkan, kegagalan unggah tetap terjadi tanpa umpan balik
- Mengunggah versi iterasi baru ke Play Store membutuhkan sekitar 1 jam, dan sambil menyiapkan hipotesis berikutnya harus menunggu build selesai didistribusikan
Loop umpan balik yang lebih panjang di profesi lain
- Seorang engineer embedded mengalami situasi ketika pembaruan firmware yang didistribusikan ke perangkat jarak jauh membuat node tidak lagi merespons
- Untuk mengetahui penyebabnya, perangkat harus ditarik kembali dan dianalisis
- Dalam beberapa kasus, perlu berbulan-bulan untuk mengetahui apa yang salah
- Seorang hardware engineer melihat bahwa perangkat keras baru yang didistribusikan ke lokasi jauh baru bisa menunjukkan cacat desain setelah melewati beberapa musim
- Perangkat lama dikirim lewat pos untuk kemudian perbaikannya diterapkan pada produk generasi berikutnya
- Ada kasus ketika ventilasi ditambahkan untuk mengurangi panas, tetapi lubangnya cukup besar hingga tawon bisa membuat sarang, sehingga menjadi bug yang lebih buruk
- Pengujian laboratorium memang mungkin dilakukan, tetapi verifikasi akhir pada akhirnya tetap terjadi di lapangan
Cara menerima kegagalan
- Sang CEO mengenang masa ketika ia menjadi kimiawan yang menyiapkan disertasi doktoral, melakukan eksperimen dengan dana penelitian besar untuk bahan kimia mahal, tetapi beberapa minggu kemudian hasilnya tampak gagal karena kesalahan eksperimen
- Ia tidak bisa mengetahui apa yang salah, dan juga tidak bisa menjawab pertanyaan tentang apa yang akan dilakukan berbeda agar kesalahan yang sama tidak terulang
- Meski begitu, ia tetap mendapatkan dana penelitian kedua, dan pengalaman ini menjadi contoh kepemimpinan yang penuh empati yang membantu orang bangkit lagi setelah gagal
Kasus kedokteran hewan yang menunjukkan risiko lebih tinggi
- Seorang teman dokter hewan menangani anjing tua yang sakit dan menyarankan pemiliknya melakukan X-ray, tetapi ditolak karena biaya
- Tanpa X-ray, hal terbaik yang bisa dilakukan adalah meraba perut anjing dari luar, dan teraba benda besar
- Yang diangkat melalui operasi adalah tongkol jagung, tetapi tanpa X-ray tidak ada kepastian apakah itu memang seluruh sumber masalahnya
- Keesokan harinya anjing itu mati, dan tidak seperti masalah peluncuran aplikasi mobile, kegagalan di profesi lain benar-benar bisa menyangkut hidup dan mati
Bug satu karakter dan keistimewaan alat debugging
- Pada Jumat pagi terlihat ada ketidaksesuaian antara dokumentasi Android dan codebase, dan penyebab masalah selama seminggu ternyata hanya satu karakter
- Tipe MIME gambar disetel ke
"jpg", padahal seharusnya"jpeg", sementara file disimpan sebagai.jpg - Developer perangkat lunak bisa melihat jauh ke dalam proses yang kompleks, memantau perilaku secara real-time, menulis log, serta menghentikan eksekusi dengan debugger untuk memeriksanya
- Kemampuan ini murah dan cepat, dan eksperimen bisa diulang berkali-kali dalam sehari hanya dengan beberapa klik
- Perangkat lunak juga bisa sama penting dan berdampaknya seperti profesi lain, tetapi developer bekerja dalam lingkungan yang layak disyukuri karena memiliki alat debugging yang ada sekarang
1 komentar
Pendapat Hacker News
Ini hampir seperti fabel yang menunjukkan bagaimana rekayasa perangkat lunak berbeda dari profesi lain—kalau bercanda, dari profesi yang “nyata”
Saya juga suka versi yang lebih pendek dan jenaka: seorang insinyur perangkat lunak, insinyur perangkat keras, dan kepala departemen sedang dalam perjalanan ke rapat di Swiss ketika rem mobil mereka rusak di jalan pegunungan yang curam; mobil menabrak pagar pembatas saat meluncur turun dan secara ajaib berhenti
Kepala departemen mengusulkan mengadakan rapat untuk menetapkan visi, misi, dan tujuan, lalu memecahkan masalah inti lewat perbaikan berkelanjutan; insinyur perangkat keras mengusulkan membongkar rem dengan pisau Swiss Army dan memperbaikinya
Insinyur perangkat lunak berkata, “Sebelum melakukan apa pun, mari dorong mobilnya kembali ke atas dan lihat apakah bisa direproduksi lagi”
Pada saat yang sama, kekurangan besar rekayasa perangkat lunak juga adalah ia berurusan dengan abstraksi. Bahkan fondasinya pun ikut bergerak
http://thecodelesscode.com/case/154
Punya kemampuan seperti itu tidak berarti insinyur perangkat lunak itu konyol atau tidak realistis
Rekayasa di ruang digital memberi kemampuan debugging yang nyaris ajaib di bidang fisik. Kalau ingin membuat 10 barang yang sama dan mengujinya dengan 10 cara, secara harfiah cukup CTRL+C, CTRL+V. Saya ingin melihat mekanik melakukan itu
Saya benar-benar lelah dengan keluhan bahwa insinyur perangkat lunak bukan “insinyur sungguhan”, dan bahwa semuanya akan beres kalau kita mengadakan lebih banyak rapat desain besar di awal serta perencanaan yang luar biasa banyak
Bidang rekayasa lain bekerja seperti itu bukan karena mereka jauh lebih profesional daripada kita, atau karena cara itu lebih baik, melainkan karena bagi mereka hanya itu satu-satunya cara. Setelah hotel selesai dibangun, mereka tidak akan sadar plafonnya harus dinaikkan 6 inci lalu merobohkan semuanya dan membangunnya ulang
Kalau mereka bisa menjalankan
ceilingHeight += 6, menekan “Rebuild”, lalu hotel dibangun ulang sementara unit test otomatis juga memeriksa aksesibilitas dan total biayanya 2,82 dolar, tentu mereka juga akan melakukannyaKita harus membuang rasa inferioritas. Kita melakukan rekayasa dengan alat yang bahkan tak bisa diimpikan oleh insinyur sipil dan mesin di dunia nyata, dan wajar saja prosesnya menjadi sangat berbeda
Tentu ada kalanya kita tidak menerapkan proses yang cukup pada suatu masalah. Tapi kalau Anda mengira itu masalah yang hanya ada pada pemrograman, saya ingin meresepkan beberapa jam menonton https://www.imdb.com/title/tt4788946/
Ini bukan soal merasa lebih unggul; jika salah satu dari empat kriteria itu hilang, Anda tidak sedang melakukan rekayasa. Dari pengalaman saya, sebagian besar pengembangan perangkat lunak tidak memiliki keempatnya. Itu tidak selalu buruk, tetapi sebagian besar pengembangan perangkat lunak bukan rekayasa
Sama sekali bukan berarti rekayasa lebih unggul daripada pengembangan
Ini seperti perbedaan antara memahat tanah liat dan memahat marmer. Kalau salah di tanah liat, Anda bisa segera membentuknya ulang, tetapi kalau Anda memahat bagian yang tidak boleh hilang dari marmer, Anda harus memesan blok marmer baru
Membawa cara memahat marmer ke dunia tanah liat hanya akan menjadikan Anda pematung tanah liat yang buruk, atau setidaknya sangat tidak efisien
Tidak banyak gunanya juga memperdebatkan mana yang lebih bernilai, patung tanah liat atau marmer. Keduanya punya tempat masing-masing dalam masyarakat
ceilingHeight += 6di dunia nyataHari ini saya memodelkan dan mencetak sebuah benda, lalu menyadari satu bagiannya akan lebih baik jika sekitar 1 mm lebih tebal. 30 detik kemudian, versi 2 sudah menuju printer
Benar-benar hebat. Saya sulit menunggu sampai hal seperti ini menjadi sepopuler printer kertas
https://www.youtube.com/watch?v=NPVT2lvMvOk
Sepanjang karier, sudah beberapa kali semua orang buntu karena ada sesuatu yang error tetapi benar-benar diam. Tidak ada output error, tidak ada apa pun
Dalam banyak kasus seperti itu, penyebabnya adalah pustaka pihak ketiga tingkat rendah yang melakukan
catch (e) {}. Kasus pertama yang saya alami di awal menjadi pelajaran bagus, dan sekarang saya tidak pernah mengabaikan error begitu saja. Minimal saya mencatatnya di logPerangkat lunak yang dibuat sekarang bisa saja digunakan 5 tahun lagi di lingkungan yang sama sekali tidak pernah dibayangkan
30 tahun kemudian:
/* X systems I modul body I 14.09.1990 */void xxvcda(int *addr, int sizeof)Ia bahkan tidak tahu fitur bahasa untuk menaikkan exception baru dari exception sebelumnya agar konteks stack trace tetap terjaga. Lucu juga. Setidaknya ini bukan kode pekerjaan utama saya, meski pekerjaan utama juga punya kelucuannya sendiri
DRF menelan error validasi dan hanya mengembalikan error umum, jadi tidak ada petunjuk sama sekali; akhirnya saya harus turun sendiri dan menambahkan logging untuk mencari tahu apa yang terjadi
Seorang teman fisikawan sering mengutip ucapan Rutherford, “semua sains adalah fisika atau mengumpulkan perangko”
Maksud teman itu adalah, berbeda dengan matematika atau ilmu komputer, fisika punya cara untuk diverifikasi oleh realitas fisik
Bidangnya adalah medan magnet ekstrem, dengan eksperimen seperti membuat kumparan tembaga raksasa, mengalirkan arus sampai hampir meleleh, lalu meledakkan bahan peledak di sekitar kumparan agar dalam sesaat yang sangat singkat medan magnet di pusatnya menjadi yang terkuat yang pernah dibuat manusia, setelah itu tembaga cair bersuhu ribuan derajat terpental dan seluruh perangkat hancur
Dalam lingkungan kerja seperti itu, kesalahan atau salah hitung berarti orang bisa mati dengan sangat cepat dan mengerikan. Jadi dia tidak setuju ketika mahasiswa doktoral matematika, yang kerugian terbesarnya hanya bubuk kapur di sweter, menyebut diri mereka ilmuwan
Dengan kata lain, entah berusaha memahami dinamika suatu objek, atau sekadar mengumpulkan fakta menarik dan memberi nama pada objek yang diminati
Untuk orang yang tertarik berkarier sebagai supervillain tapi tidak tahu harus mulai dari mana, EMP sungguhan dibuat dengan cara begitu
[1] https://en.m.wikipedia.org/wiki/Explosively_pumped_flux_comp...
Setelah kejadian seperti ini, saya selalu berharap ada tindakan korektif di hulu. Kalau ada logging dan pelaporan error yang memadai, memperbaikinya tidak akan memakan waktu seminggu
Library yang menerima tipe MIME
image/jpgyang salah seharusnya melempar exception, crash, atau setidaknya mencatat log dengan jelas. Saya penasaran apakah penulis asli melaporkan bug ke library ituApakah ia punya akses untuk memastikan atau menolak apakah upload gambar benar-benar masuk ke server? Kenapa di lingkungan uji upload berhasil, tetapi di versi rilis aplikasi tidak? Apa yang berbeda pada lingkungan uji?
Secara teori, Shawn seharusnya punya akses yang cukup untuk cukup cepat menjawab “upload berhasil, lalu kenapa tidak terlihat?”, entah dengan menjalankan server sendiri atau meminta bantuan orang yang bisa mendiagnosis mengapa upload gagal secara diam-diam
Menurut saya, pelajaran yang jauh lebih penting daripada “tipe MIME gambar adalah
jpgpadahal seharusnyajpeg” adalah mengapa di pengujian berhasil tetapi di produksi tidak. Lebih penting daripada bug itu sendiri adalah kenapa lingkungan membuat bug itu sulit ditemukanDalam kasus saya, sebuah aplikasi desktop mengalami malfungsi parah tetapi error tidak masuk log. Baru beberapa hari kemudian saya tahu bahwa file handle habis, dan log4net juga tidak bisa mencatat log jika tidak bisa mendapatkan file handle. Solusi untuk membatalkan satu perbaikan bug kecil memang sederhana, tetapi perbaikan sebenarnya adalah mengustomisasi log4net agar file log selalu tetap terbuka. Dengan begitu, meski aplikasi menghabiskan semua file handle, error tetap tercatat
Diam bukanlah tujuan. Terlalu banyak developer menganggap diam sebagai tujuan, padahal tujuan sebenarnya adalah kebenaran. Kalau tidak ada error, aplikasi memang sebaiknya tenang, tetapi kalau ada error yang berdampak pada pengguna, harus ada kotak peringatan merah besar
Menurut saya developer perlu belajar menyukai pesan error. Pesan error yang ditulis dengan baik akan cepat mengungkap penyebabnya dan menghemat banyak waktu semua orang
Kalau developer ini belajar untuk lebih sering menampilkan pesan error ke depannya, itu hasil yang sangat baik
Saya teringat mantan rekan kerja yang sering berkata, “kita kan tidak sedang membuat sistem pengatur lalu lintas udara.” Maksudnya, kesalahan tidak akan mempertaruhkan nyawa
Saat itu kami sedang membuat game, tetapi ucapan itu juga berlaku untuk hampir semua aplikasi CRUD yang pernah saya tulis
Secara terpisah, saya sering bertanya kepada para pemimpin teknologi senior lain, terutama Director, VP, dan CTO, “apa kesalahan paling mahal yang pernah Anda buat?” Kalau Anda engineer junior, ini sesuatu yang sebaiknya dicoba suatu hari nanti
Banyak pemimpin teknologi tingkat tinggi bisa bercerita tentang kesalahan bernilai 100 ribu sampai 1 juta dolar. Saya pernah melihat orang membuang jutaan dolar dalam sebuah proyek lalu langsung dipromosikan. Penting untuk memahami kenapa hal seperti itu bisa terjadi, dan bahkan kenapa itu bisa menjadi hal yang baik
Frustrasi karena game yang penuh bug bisa berujung pada aksi balas dendam di jalan atau adu teriak di dunia nyata. Ada orang yang bunuh diri karena komputer mengirim tagihan yang salah. Ada juga perusahaan yang bangkrut karena software kehilangan data berharga
Orang pernah dibunuh gara-gara aplikasi media sosial yang tampak sepele, dan Twitter pernah dipakai untuk mengorganisir hasutan pembantaian. Ada juga orang yang menjadi korban stalking dan penyerangan karena informasi yang dibocorkan Pokemon Go
Software punya kekuatan nyata. Kalau tidak, tidak ada alasan untuk menulis software
Saya pernah membuat software yang bisa menghilangkan data berharga, dan sekarang saya membuat software yang jika rusak bisa menyebabkan banjir
Kita seharusnya punya sedikit lebih banyak rasa bangga terhadap pekerjaan sendiri
Sebagai software engineer, saya cukup menikmati debugging. Karena debugging membuat saya memakai keterampilan dan cara berpikir yang berbeda dari saat membuat desain dan mengimplementasikannya
Tentu saja bukan berarti debugging tidak membuat stres. Saat mengembangkan software untuk switch telepon AT&T 5ESS, kami punya demo, dan di lab pengujian hanya ada satu saluran telepon yang disetel untuk fitur kami
Berapa kali pun dicoba, software-nya tidak berjalan, dan saya stres sambil memeriksa semua hal yang mungkin, tetap yakin bahwa software-nya benar. Akhirnya saya meminta teknisi lab memeriksa salurannya, dan ternyata satu-satunya saluran yang disetel itu entah bagaimana terlepas. Masalah hardware bodoh
Debugging sistem terdistribusi di cloud secara eksponensial lebih buruk daripada ketika semua service bisa dijalankan secara lokal, dan sistem terdistribusi lokal itu pun jauh lebih buruk daripada ketika masalah bisa di-debug di dalam satu program
Debugger sungguhan juga membuat debugging jauh lebih baik. Saya tidak pernah memahami orang yang hanya bersikeras memakai salah satu antara debugging
printfdan debugger sungguhan. Padahal memakai keduanya memberi keuntungan besar. Fitur tracing yang bagus juga, kalau tersedia, jauh lebih baik daripada debuggingprintf, jadi layak ditekankan di siniPada masa-masa awal pemrograman, saya menempelkan banyak emosi yang tidak perlu pada keadaan tidak tahu kenapa sesuatu terjadi, tetapi lambat laun saya menerima loop “sebentar, kenapa begini? saya tidak tahu… oh, tunggu… wah, alasan kenapa ini tidak jalan ternyata benar-benar masuk akal!”, dan juga menginternalisasi bahwa rasanya menyenangkan kalau sudah sampai akhir
Sekarang, keadaan tidak tahu itu sendiri hanya bisa dirusak oleh ekspektasi dan tindakan orang lain. Seiring waktu, saya belajar bahwa pilihan bahasa, pilihan arsitektur, dan sebagainya harus dikelola dengan sangat tegas agar proses ini mudah dan cepat
Pada titik karier saya sekarang, jauh lebih mudah meyakinkan sejak awal bahwa AWS Lambda adalah pilihan yang buruk dari sisi performa, total biaya, kemampuan debugging, dan kecepatan pengembangan, daripada nanti meyakinkan orang bahwa memang ada alasan masuk akal kenapa “memperbaiki satu masalah itu makan waktu selama ini”
Saya tertawa di bagian terakhir. Baru kemarin, saya menyelesaikan masalah yang selama 3 tahun mengganggu perusahaan, dan penyebabnya bagi kami adalah huruf A
Selama 3 tahun terakhir, seseorang melakukan perbaikan manual dengan memasukkan dan mengeluarkan data, dan itu menjadi bagian dari pekerjaannya. Ia bahkan memasang jadwal berulang di kalender untuk pembersihan rutin. Jutaan pelanggan bergantung pada satu orang ini agar paket data yang benar diterapkan pada saluran ponsel mereka
Bisa dibayangkan kekacauan apa yang terjadi kalau ia lupa atau pergi cuti
Pada akhirnya penyebabnya adalah
if $line->status == STATUS_ACTIVE, dan yang satuActive, yang lainactive. Tidak ada anjing yang terluka, tetapi selama bertahun-tahun uang yang tak terhitung jumlahnya lenyapOrang malang itu tidak lagi menjadi sosok yang tak tergantikan. Setengah bercanda. Software memang membuat pekerjaan lebih efisien, tetapi saya juga cenderung memperhatikan motivasi manusia
Saya terutama sangat menderita saat mengisi field HL7 di Mac. Sepertinya karakter
’yang diketik dari keyboard Mac tidak kompatibel dengan semua versi HL7, atau tidak cocok dengan tujuan tempat HL7 itu diteruskanIni ingatan lama, tetapi perbedaan kata seperti
o’clockdano′clockmembuat distribusi laporan radiologi rusak. Masalah itu berlangsung bertahun-tahun sebelum tertangkapHN menampilkan
’berbeda dari yang saya ketik, tetapi tetap karakter yang sama. Cukup lucu, karena setengah masalahnya adalah perbedaannya tidak terlihat saat debuggingSTATUS_ACTIVEdidefinisikan keliru di sebagian kode?Selalu ada risiko seseorang “dengan baik hati” memperbaiki typo
refererpadaHttpHeader::REFERRERmenjadireferrer. Tetapi typo itu sudah dibekukan dalam standar HTTP, jadi kalau dilakukan software akan rusak total. Itu tanggung jawab Phillip Hallam-Baker pada era CERNAnekdot sarang tawon itu terasa sangat dekat
Pemilik gedung kantor kami memasang antarmuka layar sentuh di luar gedung agar orang bisa menelepon masing-masing front desk dan dibukakan pintu. Itu dilakukan karena tidak ada resepsionis yang bisa melihat pintu
Perangkat itu bertahan 6 bulan sebelum mulai mengalami malfungsi parah. Penyebabnya adalah antarmuka tersebut, yang pada dasarnya tablet Android hitam besar, dipasang di sisi timur gedung
Begitu pertengahan musim semi tiba, perangkat itu mendapat cukup banyak sinar matahari setiap hari hingga overheat, dan sebagian elektronik sentuh serta hardware layarnya rusak
Dalam jenis software yang saya buat, saya tidak perlu khawatir soal beban panas
Perusahaan kereta itu menulis di Twitter bahwa “terjadi kemacetan parah pada layanan yang melewati Lewisham akibat masalah keberangkatan yang disebabkan oleh sinar matahari yang kuat”
Mereka juga mengatakan matahari musim dingin yang rendah menyinari monitor keberangkatan sehingga masinis tidak bisa melihatnya
Pesan “akhirnya terpecahkan. Penyebabnya huruf ‘E’” itu lucu
Bug yang paling sederhana dan kecil sering kali justru paling sulit ditemukan. Pagi ini pun saya menghabiskan satu atau dua jam mencari off-by-one error
Penyebabnya adalah satu
index + 1yang lupa diubah saat refactoring