Kolega saya tidak mengerti hal-hal yang ia kerjakan. Apa yang harus dilakukan? [Tutup]

13

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.

tika
sumber
Negara apa ini?
Ini perusahaan internasional.
tika
2
Jika ini benar-benar masalah besar dan Anda 100% yakin bahwa kolega Anda melakukan kesalahan, hal pertama adalah dengan sopan menunjukkannya sedemikian rupa sehingga ia tidak terancam. Hal kedua adalah, jika kolega Anda tidak mendengarkan, hanya menunjukkan potensi kerusakan dalam bentuk uang. Itulah yang semua manajer dengarkan, dan sangat hati-hati saat itu. Memiliki masalah threading seperti yang Anda gambarkan berpotensi sangat berbahaya, dan kecuali Anda 100% yakin dalam pernyataan Anda, teruskan saja.
NB
Kemungkinan milik di situs Manajemen Proyek SE.
Bernard
1
Situs SE Manajemen Proyek tidak memiliki tag "Multithreading", yang seharusnya dimiliki pertanyaan ini.
RalphChapin

Jawaban:

13

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.

Doc Brown
sumber
Aku takut ini tidak akan diterima oleh orang itu, karena menurutnya dia adalah profesional di daerah ini (dan dapat mengajar semua orang sendiri). Tetapi saya dapat mencoba.
tika
Ah ya, dan satu masalah besar - Bahasa Inggris bukan bahasa ibu saya, saya tidak bisa berbicara dengan baik.
tika
Jika kolega dan PM Anda memiliki pengetahuan terbatas tentang threading, dan keamanan benang, maka pelatihan jelas merupakan pendekatan terbaik. Ini bukan ketidakmampuan satu orang - ini adalah kompetensi tim yang menjadi masalah.
boisvert
1
Sebuah bengkel adalah sesuatu di mana Anda semua dapat memberikan pengetahuan mereka, dan Anda semua harus belajar sesuatu darinya. Jika kolega Anda berpikir dia tahu sesuatu tentang threading, mungkin Anda bisa belajar beberapa hal darinya juga.
Doc Brown
8

Tulis unit test yang menunjukkan bug dan minta dia untuk memperbaikinya.


sumber
1
Dia sudah mengetahui bug ini. Dia tidak bisa menemukan alasannya.
tika
Tidakkah Anda menemukan alasannya dalam sesi debug tiga hari? Atau apakah saya salah membaca pertanyaan Anda?
1
@ scarfridge Tergantung pada platform. Untuk Java Anda dapat menggunakan instrumentasi kode byte atau pemrograman berorientasi Aspect untuk memasukkan tunggu persis di mana masalahnya, (atau gunakan JVMTI untuk mengontrol eksekusi). Itu mungkin dilakukan!
1
Ini bukan hanya masalah urutan. Banyak faktor lain yang terlibat - core yang mengeksekusi kode, ketika GC terjadi dan bagaimana ia memindahkan objek, bagaimana perubahan disebarkan dari cache satu core ke yang lain, dll.
tika
1
Sebenarnya itu hanya seperangkat metode panggilan yang diulang miliaran kali. Tapi ini tidak masalah. Alasan sebenarnya adalah akses ke objek kamus dari 2 utas tanpa kunci (yaitu tanpa hambatan memori). Thread A menciptakannya, thread B membacanya.
tika
4
  • Merupakan tugas pengembang senior untuk meninjau kode dan menyarankan peningkatan.
  • Anda tidak ada di sana untuk memeriksa setelah pekerjaannya, saya pribadi akan benci jika seseorang memeriksa ulang semua perubahan saya untuk melihat apakah ada yang rusak
  • Jika dia tidak menerima saran Anda, maka tugas PM adalah untuk memperbaiki masalah komunikasi.
  • Masalah Threading dalam tes unit membuat saya bertanya-tanya apakah tes ini sebenarnya adalah tes unit, bukan tes integrasi atau komponen.
CodeART
sumber
Saya mendapatkan ide Anda. Patuhi perintahmu.
tika
2
Apa bedanya jika tes yang menunjukkan masalah disebut "tes unit" atau "tes integrasi"? Seluruh situasi tetap sama.
Doc Brown
1
Kekhawatiran saya adalah bahwa rekannya mungkin tidak tahu perbedaan antara unit dan uji komponen, oleh karena itu pelatihan lebih lanjut mungkin diperlukan untuk mengatasi masalah ini.
CodeART
@ KodeRush - Saya menganggap Anda tidak percaya pada peer review? Apa yang diperlukan bagi Anda untuk benar-benar menghargai bahwa orang lain sedang memeriksa ulang kode Anda (bukan hanya mogok dalam produksi)?
Saya mendapatkan ide itu, tetapi saya belum melihatnya bekerja secara efektif di pekerjaan saya sebelumnya. Saya pikir ulasan oleh pengembang senior adalah mekanisme umpan balik yang lebih baik.
CodeART
-5

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 menghasilkan inilai 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.

RalphChapin
sumber
2
Anda tidak tahu perusahaan apa itu, atau apa yang mereka lakukan, jadi komentar "Anda mungkin bisa mengelola ini, tetapi organisasi Anda tidak bisa" agak tidak berdasar - untuk semua yang Anda tahu, tika dapat bekerja di Microsoft . Siapa pun mereka, multithreading mungkin merupakan cara terbaik untuk menyelesaikan masalah mereka; ada banyak situasi yang cocok. Dan mengesampingkan semua itu, pertanyaannya bukan tentang multithreading, ini tentang menangani kolega yang menyebabkan masalah karena kurangnya keahlian.
anaximander
@anaximander: Multithreading menghasilkan bug yang sangat sulit direproduksi dan sangat sulit dilacak. Untuk menghasilkan perangkat lunak MT yang dapat digunakan dan diperbaiki, Anda harus, minimal, untuk memiliki programmer dan manajemen yang sadar akan bahaya. Organisasi Tika jelas tidak bisa menangani ini. Saya telah melihat pengujian / orang-orang QA memaksa programmer untuk menulis kode suara dengan menguji banyak dan menuntut perbaikan untuk setiap bug. Itu tidak bekerja dengan MT. Jika kolega tersebut tidak memiliki kemampuan, minat, dan motivasi, tangani dia dengan menjauhkannya dari MT.
RalphChapin
@anaximander: Anda harus memiliki pengalaman yang lebih baik dengan Microsoft daripada yang pernah saya alami. Meskipun untuk bersikap adil, saya belum pernah melihat sesuatu yang tampak seperti bug mutlithreading dari mereka. .... Dan terima kasih atas komentarnya.
RalphChapin
1
Terlepas dari itu, ketika pertanyaannya adalah "bagaimana saya menangani kolega yang tidak memiliki keahlian?", Saya tidak berpikir "perusahaan Anda membuat perangkat lunak salah" adalah jawaban yang valid. Dalam organisasi apa pun, tidak peduli seberapa luas dan berpengetahuan luas, akan selalu ada orang-orang yang memiliki kesenjangan dalam pengetahuan mereka. Tanpa mengetahui siapa organisasi atau apa yang dilakukan perangkat lunak, saya tidak berpikir Anda dapat dengan andal membuat penilaian bahwa perusahaan tidak tahu apa yang mereka lakukan, atau bahwa masalah mereka dapat diselesaikan tanpa multithreading.
anaximander