“Bandaj” düzeltmeleri ne kadar yaygındır? [kapalı]


18

Aşağıdaki senaryoyu düşünün:

Programınızda (veya bir başkasının) bir hata olduğunu tespit ettiniz - belirli bir girdi verildiğinde bir işlev yanlış sonuç veriyor. Kodu inceliyorsunuz ve yanlış bir şey bulamıyorsunuz: bu girdi verildiğinde sadece bataklık gibi görünüyor.

Şimdi iki şeyden birini yapabilirsiniz: asıl nedeni bulana kadar kodu daha ayrıntılı inceleyebilirsiniz; veya ifgirdinin bu belirli girdi olup olmadığını kontrol eden bir deyim ekleyerek bandajı tokatlarsınız - öyleyse, beklenen değeri döndürün.

Bana göre, bandajı uygulamak tamamen kabul edilemez. Kod bu girişte beklenmedik bir şekilde davranıyorsa, kaçırdığınız başka bir giriş tuhaf bir şekilde tepki verir mi? Sadece bir düzeltme gibi görünmüyor - sadece halının altında kürek çekiyorsunuz.

Bunu yapmayı bile düşünmediğim için, profesörlerin ve kitapların "bandaj" düzeltmelerinin uygulanmasının ne kadar iyi bir fikir olmadığını bize ne sıklıkta hatırlattığına şaşırdım. Bu beni meraklandırıyor: bu tür "düzeltmeler" ne kadar yaygın?

Yanıtlar:


19

Zaman / son tarih baskıları bunun nedenlerinden biridir.

Sıkı bir son teslim tarihine karşıysanız ve patronunuzun boynunuzu soluduğunu (muhtemelen kelimenin tam anlamıyla!) Sonra bunu yapıyor ve "Geri döneceğim ve bunu daha sonra tamir edeceğim" diye düşünmek çok cazip ve tek şey olabilir yapabilir.

Tabii ki gerçekten geri dönüp düzgün bir şekilde düzeltmek için sayısı çok az ve uzaktır, çünkü dün düzeltilmesi gereken yeni bir sorununuz var.


10

Programcılar olarak kabul etmek istemediğimiz kadar, güzel kodlanmış yazılımlar her zaman şirkete veya müşterilere daha fazla değer ifade etmeyecektir. Bu bir felaket durumunda iki kat doğrudur, örneğin yazılım insanların kredi kartlarını iki kez şarj ediyor. Bazen, bir bandaj gibi, kanamayı gerekli olan her şekilde durdurmanız ve hasta stabilize edildikten ve geri dönüp çekirdek problemini düzelttikten sonra geri dönmeyi vaat etmeniz gerekir.

İşin püf noktası, aciliyet ortadan kalktığında, bandajı gerçek bir düzeltme ile değiştirmeye öncelik vermeye ikna etmek gerçekten zor. Özellikle her zaman birincisinin arkasında bekleyen acil bir konu olduğunu düşünürsek. Sadece hızlı düzeltmenin ötesinde sorunla kalmayla ilgili uyanık olmalısınız.


Ah çok doğru, çok doğru. Kabul ettiğimden daha fazla bandaj uyguladım ve çoğu daha sonra düzeltilmedi.
Corin

Bazen kodun son sürümü, gerçek düzeltmeden daha fazla bandaj içerir. Bazı programcılar bile diğer projelerde bu bandajları kopyalamaya başladı.
Prasham

7

zaman

Bence 1. neden. Sorun kod tabanı akıllıca olsa da ben araştırmak için daha fazla zaman alabilir. Genellikle "bandaj" düzeltmelerimde CSS veya UI ince ayarları yer alır. Onlarla hızlıca başa çıkmak için oldukça kötü satır içi CSS ve JavaScript yazdım. Eğer zaman alırsanız geri dönüp sabitlemek her zaman bir seçenektir.


Dün (Pazar. ASLA Pazar günü çalışmam, burada karşılaştığım haftanın türünden bahsetmeliyim.) Bir SQL ifadesinde "Na" dizesini "0" ile değiştirmek için düzenli bir ifade yazdım. sunucuya gönderildi. Bu noktada neden NaN olduğunu bilmiyorum ve ilgileniyorum, ama avlamak için zamanım yok.
Dan Ray

5

Onları olağanüstü yapıyoruz.


Geliştirme sırasındaki düzeltmeler için, temel nedeni bilmeden hiçbir düzeltme yapılmadığından emin oluyoruz. Ancak:

  • İstisnai olarak kök neden arayışı çok uzun sürecek veya durmaya başlayacak VE zorlu bir son tarih var,
  • Kök nedenini düzeltmek için istisnai olarak kod değişiklikleri taktiksel değildir (değişiklik çok uzun sürecek ve son başvuru tarihi yaklaşacaktır)

Bu durumlarda "bandaj" düzeltmelerini tercih ediyoruz. Daha sonra kök nedeni çözmek için dahili kusurları açıyoruz. Evet, bu iç kusurlara göre çok daha düşük bir öncelikle tedavi edilir.


Bakım akışındaki düzeltmeler için, temel nedeni bilmeden hiçbir düzeltme yapılmadığından emin oluyoruz. Ancak:

  • Çok istisnai olarak kök neden arayışı durur,
  • İstisnai olarak kök nedenini düzeltmek taktiksel olarak mümkün olmayabilir (değişiklik önemsizdir ve müşteri dün düzeltmeye ihtiyaç duymuştur).

Bu durumlarda öncelikle "bandaj" geçici düzeltmeyi seçeriz ve müşteri mutlu olduğunda uygun düzeltme üzerinde çalışırız ve ancak o zaman kusur çözülür.


4

Disambiguation.

  • Belirli bir hata göz önüne alındığında, belirli bir düzeltmenin "bandaj" olup olmadığını nesnel olarak tanımlamakta önemli zorluk vardır: çünkü kişinin "doğru çözümü" başka bir kişinin "bandajı" olabilir.
  • Bu yüzden, aşağıdaki tanımı kullanıyorum: Bir kusuru profesyonelce yapmamı dilediğimden daha az zarif ve daha az çalışılmış bir şekilde düzeltmek için.

İlk olarak, "bandaj" düzeltmelerinin sıklığı ile ilgili :

  • Yeni kod: neredeyse hiç.
  • Eski kod:
    • Bazıları, genellikle bandaj gibi görünmedikleri ve tüm kod incelemelerinden kurtulacak kadar yeterince zarif yazıldıkları halde (aşağıdaki "veriye dayalı hafifletme" konusuna bakın) bulacaksınız .
    • Ayrıca "görünmez bandaj" a dikkat edin: sadece bu işlevi çağırmayın. Kod eksikliği ile, bir hatanın varlığına dair bir ipucu izi bile yoktur.
  • Birçok harici bağımlılığa sahip eski kod:
    • Neredeyse doluydu.
    • Neredeyse her zaman bağımlılığın eski bir sürümü için yazılmıştır ve hiç kimse bağımlılığı yeni bir sürüme güncellemeden önce bağımlılığın "sürüm notlarını" gerçekten okumaz.

İkincisi, tavsiyem:

Hata bir geliştirme ekibinin kendi kaynak kodunda olursa:

  • Profesyonel bir şekilde düzeltin. (Düzeltirseniz, kendiniz alırsınız.)
  • Zaman baskısı altındayken, yapabileceğiniz en iyi şeyleri yapın - bu şunları yapmanızı gerektirir:
    • Düzeltmeyi kabul edip etmeyeceğinize karar vermek için son kullanıcı: hatanın kendisinin ve önerilen düzeltmenin potansiyel etkisine bakın.
    • İlgili kod snippet'lerini inceleyin (kaynak kodu yönetim aracınızın geçmiş bilgilerini kullanarak) ve sorunu ve çözümü iyi anlayana kadar iş arkadaşlarınızla tartışın (ancak zamanlarının çoğunu işgal etmeyin).
  • Hatayı her zaman bir hata izleme sistemi ile takip edin .

Hata başka bir ekibin kaynak kodunda olursa:

  • Hatalarını düzeltmek için o takımı itin.
  • Bu hatayı her zaman diğer ekibin hata izleme sistemi ile dosyalayın .

Hata başka bir şirketin (veya hiçbir şirketin) ürününde olmazsa:

  • Bu durumda, koli bandı düzeltmeleri (veya veriye dayalı geçici çözümler ) hatayı düzeltmenin tek yolu olabilir.
  • Açık kaynak ise, bu hatayı yine de bazı (muhtemelen genel) kusur izleme sistemi ile dosyalayın, böylece birisi içine bakabilir.

2

Bence kod tabanının yaşına çok bağlı. Eski kodda çok yaygın olduğunu düşünüyorum, 20 yaşındaki COBOL rutininin eğlenceli olmadığını yeniden yazmak. Üretimde olan orta derecede yeni kodlarda bile hala oldukça yaygındır.


2

Çok yaygın olduğunu söyleyebilirim.

Joel Spolsky tarafından yazılmış blog yazısı: Duct Tape Programmer

Şimdiye kadar yaptığım hemen hemen her projede son teslim tarihlerini karşılamak ve bir görevi tamamlamak için bir çeşit bandaj veya koli bandı uygulamak zorunda olduğumu kolayca söyleyebilirim . Güzel değil, temiz değil, ama işi hallediyor, böylece bir işletme çalışmaya devam edebilir ve proje bir şekilde ilerleyebilir.

Akademik dünya ile yazılımın gerçekte zaman içinde gönderilmesi gereken gerçek dünya ve iş zıtlıkları arasında bir fark vardır.

Bir şekilde, halının altına koymak, umarım sonraya kadar bir düzeltmeyi ertelemek. Ne yazık ki, çok sık, ertelenen düzeltme asla gerçekleşmez ve bu kod üretime geçer.


1

Daha fazla bağlam olmadan söylemek zor - örneğin, if ifadesini neden doğru düzeltme eklemiyor? Orada sözde bu girdiyle uğraşması gereken başka bir kod bloğu var mı?

Bandaj düzeltmelerinin ne sıklıkta kullanıldığı, kodun ne kadar karmaşık olduğu, koda en çok aşina olan kişinin mevcut olup olmadığı (Craig'in 20 yaşındaki COBOL rutininden sorumlu olan kişi şirketten yıllar önce ayrılmış olabilir) ) ve ilgili zaman çizelgeleri.

Yüzünüze bakan bir son teslim tarihiyle, kök nedenini düzeltmek yerine sadece bir sıva tokatlasa bile, bazen daha güvenli düzeltme için dolgunlaşırsınız. İşleri daha da kötüleştirmediğiniz sürece sorun değil, ancak yine de doğru olmadığını ve hala düzgün bir şekilde düzeltilmesi gerektiğini izlemek önemlidir.


ifAst işlevi kusurlu çünkü eğer deyimi doğru değil.
Josh K

Bu doğru olabilir, ancak OP'de gösterilmedi - tüm gablin, bir fonksiyonun bir girdi verildiğinde yanlış bir sonuç döndürdüğünü söyledi. İşlev sadece bir karar vermesi gerekiyorsa (uygulamanın hangi modda çalışması gerektiği gibi), belki de sorun if ifadesinin eksik olmasıydı. İşlevin bir değeri işlemesi gerekiyorsa (ayrı bir seçenek kümesinden seçim yapmıyorsanız), muhtemelen haklısınız demektir. İşlev ve ne için kullanıldığı hakkında daha fazla bilgi sahibi olmadan söylemek mümkün değildir.
JohnL

1

Bu tür bir düzeltmenin gerçekten iyi ve muhtemelen ideal olduğu durumlar vardır (hata ayıklamak için gereken süre kadar).

Ana yürütülebilir programınız için bir tür modül gibi davranması gereken ancak aynı zamanda ana yürütülebilir dosyadan çalıştırılması gereken bazı bilgiler gerektiren 20 DLL dosyanızın olduğu bir senaryo düşünün.

Bu DLL'leri ana yürütülebilir dosyanın dışında kullanmak isterseniz, ana dönüş dosyasından bazı dönüş değerlerini geçmeniz gerekir. A.) Bu bağlamda mevcut değildir ve B.) Bu bağlamda var olmasını istemezsiniz.

Bununla birlikte, gerçek sonuçları aldığınızda sonuçları karşılaştırırken tamamen farklı bir kod çalıştırdığınızdan emin olmak için kodunuza bazı derleyici yönergelerini koymanız daha iyi olur.

Bir ifbaşkasının işlevini içine koymak yerine, işlevin {$ifdef}etrafına bir yer koyardım - bu şekilde hiç kimse onu orada olması gereken bir şeyle karıştırmaz.

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.