Ekip üyelerini “mandelbug” un varlığı konusunda nasıl ikna edilir?


20

Bir uygulama geliştiriyoruz; başka bir kodlayıcı tarafından geliştirilen bir kitaplığı içerir, bu kitaplık sunucu ile birden çok ağ bağlantısı üzerinden iletişim kurar ve bu birlikte çalışan birden çok iş parçacığını içerir. Sunucu tarafı kodu oldukça karmaşıktır ve kaynak koduna erişimimiz yoktur.

Son zamanlarda bazen uygulama çökmesi yapan bir mandelbug keşfettim . Bir kez çoğaltabilir ve yığın izlemesi yapabilirim, bu yüzden bir hata raporu açtım. Hatanın kendisini düzeltmek kolaydır (arka plan iş parçacıklarından birinde yakalanmamış web istisnası, CLR'nin programı sonlandırmasını sağlar).

Sorun, geliştiricinin "düzeltildiğine ikna olmadığı için" hatayı düzeltmeyi reddetmesidir. Ne yazık ki benim için patron onunla birlikte ve hata varlığını kanıtlamak ve gittiğini doğrulamak birim testi yapmak için "sağlam bir test vakası" yapmak sürece bu hata düzeltilemez diyor. Böceğin doğası nedeniyle temelde imkansız olan şey.

Herhangi bir tavsiye?


12
Çok basit olduğunu söyleyebilirim. Söylediklerinizin doğru olduğunu kanıtlayan bir birim testi oluşturun.
Charles Sprayberry

1
Yığın izini bir biçimde kaydettiniz mi? Örneğin, IDE'nizin çökmenin yığın izini gösteren bir ekran görüntünüz var mı?
Giorgio

7
@fithu: Bu tür bir böceğin yeniden üretilmesinin imkansız olduğuna biraz fazla ikna oldunuz - zor olabilir, ancak nadiren "imkansız" olabilir. Ve kaynak koduna erişiminiz olmadığında hatanın "düzeltilmesi kolay" olduğunu nasıl bilebilirsiniz? Sadece bir istisna yakalamak sorunu gerçekten çözmeyebilir. Yoksa erişiminiz olan kütüphane kodundan mı bahsediyorsunuz ve hatanın oluştuğu satırı tam olarak tespit ettiniz mi? Öyleyse, neden kodda bir düzeltme önermiyorsunuz?
Doc Brown

2
@fithu: orijinal unvanın patronun aleyhine bir tür rütbeydi. Sorunuzun yakında kapanmasını önlediğini umarak değiştirdim, rants bu sitede çok popüler değil. Yeni başlık sorunuzu doğru bir şekilde yansıtmıyorsa, sorunuzu daha da geliştirmekten çekinmeyin.
Doc Brown

4
@Giorgio: Yığın izleme, bir programın belirli bir satıra çökebileceğinin bir kanıtıdır, bu satırın hatanın ana nedeni olduğunu kanıtlamaz. OP'nin yanlış anlaşıldığı görülüyor ve bazı soru ayrıntılarını anlamakta sorun yaşadığım gibi görünüyor.
Doc Brown

Yanıtlar:


35

Mümkünse, uygulama kodunuza biraz uyku veya blok koyarak bu hatanın yeniden üretilip üretilemeyeceğini kontrol etmek için biraz zaman harcayabilirsiniz . Ama çok fazla zaman harcamayın. Bu sorun çoklu yoldan (ve gözlemlediğiniz gibi) bağlı olduğu için, bu durum nadir olacaktır.

Benim tavsiyem bunu çok fazla terlememek. İşinize devam edin. Bu kilitlenme ile karşılaştığınızda, hata raporunuzu yığın izlemesi ile güncelleyin, bunun tekrarlanan bir durum olduğunu söyleyip sahibini kütüphane geliştiricisine değiştirin. Yönetimin / müşteri adayının frekansına bağlı olarak düzeltilip düzeltilmeyeceğine karar vermesine izin verin.

Ayrıca geliştiricinin zihnini anlamaya çalışın. "Yakalanmayan web istisnası" dediniz. Bu aşamadaki geliştirici, bunu yakalamanın diğer etkilerinin ne olacağından tam olarak emin olmayabilir . Bu nedenle, koda dokunmak konusunda isteksiz olabilir.


10

Yani, az çok açıklayıcı yorumlarınızdan, bunu şu şekilde anladım:

Eksik olan basit bir ek istisna işleme olduğundan eminsiniz ve lib'deki hangi kod satırının sorunlu olduğunu ve lib'in nasıl düzeltilebileceğini zaten biliyorsunuz.

O zaman neden sadece eksik olan birkaç kod satırını lib'e kendiniz eklemiyorsunuz, takımdan lib'i bu değişikliklerle test etmesini isteyin? Düşük riskli bir değişiklik olduğundan emin olun, lib'den sorumlu geliştirici tarafından anlaşılması kolaydır. Olabilecek en kötü şey, düzeltmeniz bazı beklenmedik davranışlara neden olursa, birinin VCS'nizdeki değişikliği geri alması gerektiğidir.

Çoğu insan, iş zaten yapıldığında ikna etmek daha kolaydır. Ayrıca, "bu kod yanlış, bir şekilde düzeltin" aksine, "burada geliştirilmiş bir çözüm" üzerinde daha iyi tepki veriyorlar.

EDIT: geliştirici hala bu değişikliği eklemeyi reddettiğinde, en iyi seçenek sorunlu kodu ağ hatası simüle nerede izole bir test koşum içinde çalışması için çalışıyor. Eski kodla etkili bir şekilde çalışmak , bu tür sorunların nasıl çözüleceğine dair birçok tekniği açıklar. Örneğin, kitaplığın yalnızca sorunlu modüller ve işlevler de dahil olmak üzere bir test sürümünü oluşturabilir ve çevresinde "ağ özel durumunu" denetimli koşullarda simüle edebileceğiniz bir "sahte ortam" oluşturabilirsiniz. Bu ilk bakışta çok fazla çaba gibi görünebilir, ancak böyle bir ortama sahip olduğunuzda, ona çok fazla ek test ekleyebilirsiniz (ve sanırım bu mantıklı olacaktır, çünkü lib'in yazarı eksik eklemeyi reddettiğinde tek bir yerde istisna yönetimi,


"Buna gerek yok", çünkü bu değişikliği birleştirme reddediyor
fithu

@fithu: düzenlememi görün.
Doc Brown

4
@DocBrown +1 for Onlar (insanlar) "bu kod yanlış, bir şekilde düzeltin" aksine "işte iyileştirilmiş bir çözüm" üzerinde daha iyi tepki veriyor.
laika

2
@fithu: İşlenmemiş istisnayı atılmasını tetikleyen bir test durumu hazırlayın. Onu tetikleyen paramaterleri buluyorum.
wirrbel

2

Bunun gibi bir hata için, otomatik fuzz testi (rastgele test olarak da bilinir) yeniden üretmeye yardımcı olabilir. Bu, sabit bir parametre setini (veya girişleri) test ettiğiniz şeye rasgele ayırarak hatayı bulma işlemini otomatikleştirir. Her test çalıştırması, parametreler, zaman damgaları vb. Dahil olmak üzere bir günlük dosyasına kaydedilir, böylece kilitlenme meydana geldiğinde (teorik olarak), aynı parametreleri kullanarak testi tekrarlamak için tekrar oynatabilirsiniz.

Otomatikleştirildiğinden beri, test süreci kısa sürede birçok testi gerçekleştirebilir. Genellikle bir gecede çalıştırmak için bırakılabilir ve sabahları çökmeyi yeniden oluşturup oluşturmadığını görmek için bir günlük dosyasını kontrol edebilirsiniz.


3
"sadece yeniden test, aynı parametreleri kullanarak, yeniden üretmek için" - gerçekten diş / ağ sorunları için mümkün değil. Ama fikri seviyorum.
fithu

2

Şeytan Avukatı başka bir yol önerir.

Diğer geliştirici, açıkça, orada bir hata olmadığını belirtti.

Var olmadığı iddia edilen hatadan cehennemi strese sokmanın ve çok daha sık çökmesine neden olmanın bir yolunu bulabilir misiniz?


2

Yığın izlemesi, hatanın var olduğunu veya en azından belirli bir yapıda var olduğunu gösteren açık bir kanıttır. Elinizde olmayan, hatanın giderildiğine dair kanıt. Bunu görmezden gelmek aptalca. Bir müşterinin sisteminde her seferinde tetiklenen birden fazla sistemde yüz binlerce otomatik denemeden sonra hataları yeniden üretmek imkansızdı .

Yılda bunun gibi birkaç hata alıyorum, çoğu yığın izinden bile faydalanmadan. Hemen hemen her durumda, önceden üretemesem bile, düzeltildikten sonra kolayca otomatik bir test yapabilirdim.

Örneğin, birkaç ay önce yalnızca kullanıcı dakikada 96 kelimeden daha hızlı yazdığında oluşan bir hatayı düzelttim. Düzeltmeden önce, tek bildiğim hata "bazen" oldu. Hızlı yazma için bir birim testi yazmak benim için asla olmazdı. Ancak, temel nedeni öğrendikten sonra, bunun için bir test yapmak önemsizdi.

Bir hatanın düzeltildikten sonra bile çoğaltılamadığı nadir durumlarda bile, kod denetimi ile kapatabilirsiniz.


böyle şeyler için otomatik bir test nasıl yapılır? (yanlış anlaşılmayı önlemek için, yazdığınız diğer her şey kendi deneyimim ve inançlarımla eşleşir) Bu gibi en son hatam, senkronize olmayan eşzamanlı erişim için veri yarışıydı, hem hata hem de düzeltme kod denetimi ile kanıtlamak çok kolaydı ama yapamam bunu otomatik olarak nasıl test edeceğinizi hayal edin. (Çoğunlukla eşzamanlı şeyler için test tasarlarken çok az sorunum var, ancak veri yarışının olmadığını kanıtlamak için test kodunu
anlayamıyorum

1
Bu benim kod inceleme istisnama düşebilir, ama aynı zamanda iş parçacıklarından birine bir gecikme getirerek yarış koşullarını tetikleyebilirsiniz. Genellikle bunu harici bir uyaranı geciktirerek gerçekleştirebilir veya daha az ideal olarak, test sırasında gecikmeyi doğrudan koda koyabilirsiniz.
Karl Bielefeldt

Teşekkürler görüyorum. Kulağa ilginç geliyor, biraz düşünmem gerek ...
sivri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.