Saya telah menghabiskan 3 hari men-debug satu bug yang sangat tidak dikenal di perpustakaan yang dibuat oleh kolega saya, bug ini jarang terjadi. Setelah semua saya menemukan bahwa bug ini terjadi karena akses cross-thread ke objek tanpa kunci apa pun. Sebenarnya ini bukan bug pertama dari jenis ini, ada bug serupa sebelumnya. Dia hanya menjalankan tes unitnya, dan jika sesuatu gagal menempatkan suatu tempat kunci. Dan jika tidak ada yang gagal, ughm, maka kodenya sempurna. Sepertinya dia tidak tahu tentang keamanan threading. Saya 100% yakin ada banyak bug serupa yang belum muncul. Sepertinya PM tidak mengerti hal-hal threading juga.
Masalahnya, dia bekerja lebih banyak di perusahaan daripada saya. Bagaimanapun, saya tidak bisa mengatakan "orang ini tidak kompeten di bidang ini", karena ini selalu menunjukkan Anda sebagai "pemain tim yang buruk", dll.
sumber
Jawaban:
Yakinkan PM bahwa untuk menghindari bug seperti itu, pengetahuan tim tentang hal-hal threading harus ditingkatkan, dan beri tahu mereka bahwa Anda bersedia mengatur sesuatu seperti lokakarya atau presentasi tentang hal itu. Jangan menjadikannya masalah pribadi antara Anda dan kolega Anda.
sumber
Tulis unit test yang menunjukkan bug dan minta dia untuk memperbaikinya.
sumber
sumber
Saya pikir perusahaan Anda seharusnya tidak menggunakan multithreading.
Setelah melakukan proyek multithread secara besar-besaran, saya menemukan dua teknik sangat penting untuk membuat hal-hal bekerja. Pertama , kode harus ditulis dengan benar. Setiap bidang harus diperiksa secara manual untuk memastikan itu dinyatakan dengan benar dan disinkronkan dengan benar di mana pun direferensikan. (Peringatan: Saya menyederhanakan beberapa hal di sini untuk menjaga jawaban saya pendek - atau setidaknya, lebih pendek.) Kedua , kode harus diuji dengan menjalankannya pada mesin tunggal dan multicore - banyak menit menggunakan 100% dari masing-masing inti. (Dan jika hanya menggunakan 2% dari setiap inti, seperti yang sering saya lakukan, itu juga bug.)
Anda mungkin dapat mengelola ini, tetapi organisasi Anda tidak bisa. Bahkan jika mereka memahami masalah, yang tidak mereka miliki, mereka tidak memiliki keahlian.
Sebagian besar bahasa menyediakan cara untuk menghindari hal ini. Jika Anda memiliki pembaca soket, yang biasanya memiliki utasnya sendiri, mintalah ia mendapatkan info ke utas utama secepat dan sesederhana mungkin. Lebih baik lagi, cari kelas / fungsi sistem yang akan menangani bagian utas bacaan untuk Anda. Gunakan antrian yang menjalankan "acara" satu demi satu, seperti yang dilakukan sebagian besar API GUI. (Gunakan antrian acara GUI API sendiri, dalam hal ini.) Jika Anda membutuhkan pemrosesan paralel, Anda mungkin dapat menemukan semacam "utas pekerja" yang memungkinkan Anda menyimpan data / bidang dalam satu utas, menangani semua transfer untuk Anda.
Tekankan untuk semua bahaya multithreading. (Cerita menyeramkan: Bug favorit saya melibatkan beberapa baris seperti
int i = 5; i = i * i;
:, yang menghasilkani
nilai 35. Satu yang sering saya lihat adalah:if (thing != null) thing.reset();
melempar pengecualian pointer nol.) Saya pikir satu-satunya harapan Anda adalah membuat mereka mengerti bahwa mereka melangkah ke dunia yang baru dan aneh, dan mungkin mereka harus mengambil satu langkah besar ke belakang.Saya tidak begitu yakin bagaimana multithreading harus ditangani. Jika pekerjaan itu dapat diberikan kepada satu orang, dan semua yang mereka lakukan dibuang jika mereka gagal, baik-baik saja. Tetapi sebuah tim hanya akan sekuat anggota terlemahnya, dan bahkan seorang programmer yang baik akan mengalami masalah dengan multithreading penuh. Saya harap bahasa orang akan menemukan cara untuk membuatnya aman. Saya telah melihat beberapa perangkat lunak yang membantu di luar sana. Tapi saya pikir yang terbaik adalah menghindari multithreading kecuali waktu eksekusi sangat penting dan programmer yang baik atau tim yang terbukti tersedia.
sumber