Kodlama yaparken hata sayısını nasıl azaltabilirim?


30

Kimse mükemmel değildir ve ne yaparsak yapalım, zaman zaman içinde böcek bulunan kodlar üreteceğiz. Hem yeni yazılım yazarken hem de mevcut kodu değiştirirken / sürdürürken, ürettiğiniz hata sayısını azaltmak için bazı yöntemler / teknikler nelerdir?


İyi bir yöntem daha açık tasarım yapmaktır (çok değil, ancak kodunuzu daha yapısal ve anlaşılması daha kolay hale getirmek için yeterlidir).
Giorgio

Yanıtlar:


58

Süslü kodlamadan kaçının. Kod ne kadar karmaşık olursa, hata olasılığı da o kadar fazla olur. Genellikle modern sistemlerde, açıkça yazılmış kod yeterince hızlı ve küçük olacaktır.

Kullanılabilir kütüphaneleri kullanın. Bir yardımcı program yordamı yazarken hata olmamasının en kolay yolu onu yazmamaktır.

Daha karmaşık şeyler için birkaç resmi teknik öğrenin. Karmaşık durumlar varsa, bunları kalem ve kağıtla çivileyin. İdeal olarak, bazı ispat tekniklerini bilin. Eğer kodun doğru olduğunu ispatlayabilirsem, düzeltmesi kolay olan büyük, dilsiz, belirgin hatalar dışında neredeyse her zaman iyidir. Açıkçası, bu sadece çok ileri gidiyor, ama bazen resmen küçük ama karmaşık şeyleri aklınıza getirebilirsiniz.

Var olan kod için, yeniden düzenlemeyi öğrenin: davranışta değişiklik yapmadan kodu daha okunaklı hale getiren, genellikle otomatik bir araç kullanarak kodda küçük değişiklikler yapma.

Çok hızlı bir şey yapmayın. İşleri doğru yapmak, ne yaptığınızı kontrol etmek ve ne yaptığınızı düşünmek için biraz zaman ayırmak, daha sonra büyük bir zaman ödeyebilir.

Kodu yazdıktan sonra, iyi yapmak için ne gerekiyorsa kullanın. Birim testleri harika. Sık sık önceden gelebilecek testleri yazabilirsiniz, bu da büyük geri bildirim olabilir (tutarlı bir şekilde yapılırsa, bu teste dayalı bir gelişmedir). Uyarı seçenekleriyle derleyin ve uyarılara dikkat edin.

Şifreye bakacak başka birini bul. Resmi kod incelemeleri iyidir, ancak uygun bir zamanda olmayabilirler. İsteklerinizi çekin veya scm'niz onları asenkronize incelemelere izin vermiyorsa desteklemiyorsa benzer. Arkadaş kontrolü daha az resmi bir inceleme olabilir. Çift programlama, iki göz çiftinin her şeye bakmasını sağlar.


x2 - Ryan'ın söylediği.
JBRWilkinson

2
Ayrıca çoğu dil az çok seçici olabilir. Mümkün olduğunca seçici olmasını istersiniz.

1
“Daha karmaşık şeyler için birkaç resmi teknik öğrenin.” ... mesela?
Dan Rosenstark

1
@Yar: Bu kitapta açıklanan sistemler gibi bir şey bekliyorum: amazon.com/Verification-Sequential-Concurrent-Programs-Computer/… ; Her ne kadar belirli kitabın aşırı derecede kuru ve donuk olduğunu söylememe rağmen, orada muhtemelen çok daha iyi olanlar var (ama okuduğum tek kitap bu).
Joeri Sebrechts

30

Birim Testleri , ikinci kez açılan böcek sayısını azaltmanıza izin verir. Kodunuzda bir hata bulursanız, bir birim testi yazmak daha sonra geri gelmemesini sağlayacaktır. (Artı, tüm davaları düşünmek ve binlerce ünite testi yazarken öne geçmek bazen zor oluyor)


3
"Öndeki tüm davaları düşünmek" temiz, tam tanımlanmış arayüzlere yol açar, bu da sadece iyi bir şey olabilir. Ünite testleri sadece, akılda tutularak tasarlanmayan koda yeniden uyarlama yapıyorsanız yazmak zordur.
Mike Seymour

1
Yapabilirsen, yapmalısın. Maalesef, gördüğüm çoğu yerde, birim sınamalarını yalnızca "çok hızlı olan sorunları gidermekten" daha pahalı bir şey olarak görmüştüm. Öyleyse, eğer yapabilirseniz, o zaman ön testler yazmalısınız, ancak “uygun maliyetli” olarak görülmüyorsa, bunları hata düzeltmelerinin yanına yazmak, zaman içinde sadece birim sınamaları yazma bütçesine çok fazla bütçe koymadan oluşturmanıza yardımcı olur. .
Ryan Hayes

4
"Test, böcek yokluğunu değil, varlığını gösterir." - E. Dijkstra. Olduğu söyleniyor, otomatik testler kesinlikle yazılım kalitesini korumak ve artırmak için çok yararlı bir yoldur.
Limist,

9

Her iki birim test yorumu için +1.

Bunun ötesinde, derleyicinizin sunduğu en yüksek uyarı seviyesini ayarlayın ve uyarıların hata olarak kabul edildiğinden emin olun. Hatalar genellikle bu "hatalı" hatalarda gizlenir.

Benzer şekilde, derleme zamanında çalışan statik analiz araçlarına da yatırım yapın (bunları ekstra bir derleyici uyarısı seviyesi olarak görüyorum).


Statik analiz yorumu için +1. Tüm bu bilgileri ücretsiz olarak almak çok değerli :)
Morten Jensen

9

Bahsedilenlere ek olarak:

  • Hata kodlarını göz ardı etmeyin - örneğin geçerli bir sonuç aldığınızı, bir dosyanın başarıyla oluşturulduğunu vb. Varsaymayın. Çünkü bir gün bir şey olur.
  • Kodunuzun asla bir koşul girmeyeceğini ve bu nedenle “bu durumu yok saymanın güvenli olduğunu” varsaymayın.
  • Kodunuzu test edin, sonra başka biri tarafından test ettirin. Kendi kodumu test edecek en kötü insan olduğumu biliyorum.
  • Bir ara verin, ardından kodunuzu tekrar okuyun ve "açık olanı kaçırdıysanız" bakın. Genellikle bana olur.

Şu an unuttuğum başka şeyler var ama diğerleri kesinlikle onları düşünecek. :)


7
Bu kadar emin koşulu X asla olmayacak ki iseniz ... emin olmak için bir sav ileri kullanmak zaman durum X olur, bu konuda (istisna veya günlük ya da her neyse yoluyla) bileceksiniz.
Frank Shearar 18: 28'de

@MetalMikester: Ünite testleri iyi. Ancak, yüksek seviyeli diller ve iyi kütüphaneler ile, sert hataların çoğu çivi için entegrasyon ve regresyon testi gerektirir.
Vektör

9

Başlıca dillerimin C ++ ve Python olmasına rağmen oldukça işlevsel bir programlama stili geliştirdim. Tüm bağlamı, bu işin işini yapması gereken bir işleve (ya da yönteme) aktarırsam ve aradığım anlamlı verileri döndürürsem kodumun daha sağlam hale geldiğini öğrendim.

Örtük devlet düşmandır ve deneyimlerime göre 1 numaralı böcek kaynağıdır. Bu durum genel değişkenler veya üye değişkenler olabilir, ancak sonuçlar işleve geçmeyen bir şeye bağlıysa sorun isteyebilirsiniz. Açıkça, durumu ortadan kaldırmak mümkün olmamakla birlikte, bunu en aza indirmenin program güvenilirliği üzerinde büyük olumlu etkileri vardır.

İş arkadaşlarıma da her şubenin (eğer öyleyse? :) muhtemel bir hata olduğunu söylemek isterim. Böceğin tezahürünün ne olacağını söyleyemem, ancak kodunuzun şartlı davranışı ne kadar az olursa, uygulama sırasında kod kapsamının daha tutarlı olması nedeniyle hatasızlık olasılığı o kadar artar.

Go rakamı, tüm bunların da performans üzerinde olumlu etkileri var. Kazan!


Tecrübelerime göre, eğer yöntemler olması gerektiği kadar küçükse, her çağrı için tüm eyaleti dolaşmak çabucak can sıkıcı olabilir. Bu problem, kısa obje ömrüne sahip birçok küçük değişmez sınıf kullanılarak çözülebilir. Bu şekilde geçici durumu alanlar olarak saklayabilir ve artık duruma ihtiyacınız olmadığında nesneyi atabilirsiniz. :-)
Jørgen Fogh

Bu durumun sıkıcı hale gelmesinin bir başka düşüncesi, belki de çok fazla devleti geçmeye çalıştığınızdır. :)
dash-tom-bang

Çoğu durumda bu doğru, ancak çoğu zaman değildir. Bazı etki alanlarında, çok fazla değişken durumunuz olmasa bile, bir çok devlete erişmeniz gerekir . Şu anda birkaç sembol tablosuna erişmem gereken bir kod üreticisi üzerinde çalışıyorum. Onları her yönteme dolaştırmak istemiyorum.
Jørgen Fogh

8
  • Daha fazlasını yapan daha az kod yazın.
  • Düşük seviye uygulamalar ve üst düzey sonuçlar hakkında düşünün
  • Kodunuzda yarattığınız soyutlamayı düşünün.
  • Mümkünse yalnızca temel karmaşıklığı yazın.

"Daha azını yaz, daha azını yaz" diye özetleyen büyük bir yazı yazacaktım (IOW sizin için mevcut olan araçları bilir ve kullanır). Bunun yerine sadece + 1'im.
Kaz Ejderha

1
Ancak daha az kod almaya çalışırken süslü kod almamaya dikkat edin.
gablin

1
@gablin: Fantazi, birçok açıdan bakanın gözündedir. Bugün 4 yıl önce boğulacak olduğum kodları yazıp okuyabilirim. Haskell bugün benim için çok süslü. :)
Paul Nathan

8

Biraz daha az teknik cevap: yorulduğunuzda (9 saat / gün yeterli), sarhoş veya 'pişmiş' olduğunuz zaman programlamayın. Yorgun olduğumda temiz kod yazmak için gerekli sabra sahip değilim.


2
Bunu yapması çoğu programcının genelde birkaç yılını alır. Bu önemli bir nokta.
Jeff Davis


5

Birim test ve araçları ile ilgili bazı büyük cevaplar. Onlara ekleyebileceğim tek şey şudur:

Test cihazlarınızı olabildiğince erken işe alın

Eğer bir test ekibiniz varsa, onlara kod kaliteniz için kapı bekçisi olarak davranma ve sizin için kusurlarınızı yakalama tuzağına düşmeyin. Bunun yerine, onlarla çalışın ve mümkün olduğunca erken onları dahil edin (çevik projelerde bu projenin başlangıcından itibaren olacaktır, ancak gerçekten denersek onları daha önce dahil etmenin yollarını bulabiliriz).

  • Test planlarının ne olduğunu bulun. Test durumlarını onlarla inceleyin - hepsini kodunuzla mı kapatıyorsunuz?
  • Gereksinimleri anlamalarını isteyin. Seninkilerle aynı mı?
  • Açıklayıcı testler yapmak için onlara erken çalışma yapmaları verin - önerecekleri gelişmelere hayran kalacaksınız.

Test cihazlarınızla iyi bir çalışma ilişkisine sahip olmak, herhangi bir zarar vermeden önce, gerçekten erken varsayımları ve kusurları yakalayabileceğiniz anlamına gelir. Bu aynı zamanda, test uzmanlarının, ürün tasarımında yardımcı olma ve kendilerini düzeltmek için zaman olduğunda kullanılabilirlik sorunlarını yakalama konusunda kendilerini daha güçlü hissettiği anlamına gelir.


4

Statik Analiz Araçları

FindBugs gibi eklentiler ve uygulamalar kodunuzu tarar ve olası hataların olduğu yerleri bulur . Değişkenlerin başlatılmadığı ve kullanılmadığı veya 10'dan 9 kez çıkan sadece çılgınca şeyler olduğu yerler, böceklerin ortaya çıkmasını kolaylaştırır. Bunun gibi araçlar, henüz bir böcek olmasa da, başımın aşağı doğru hareket etmesini önlememe yardımcı oluyor.

Not: Bir aracın neden bir şeylerin kötü olduğunu söylediğini her zaman araştırmayı unutmayın . Asla öğrenmek için acıtmaz (ve her durumda her şey doğru değildir).


3

Kod denetimi veya çift programlama gibi diğer akran değerlendirmesi.

Fagan denetimi gibi yapılandırılmış kod incelemeleri , en az birim testi kadar etkili ve verimli olabilir ve hatta bazı durumlarda birim testinden daha iyi olduğu kanıtlanmıştır. Denetimler ayrıca, yazılım yaşam döngüsünde daha önce ve kod dışındaki yapay nesnelerle birlikte kullanılabilir.

Yazan: Karl Wiegers'ın Yazılımdaki Akran Değerlendirmeleri , bu konuda harika bir kitap.


2

Buradaki diğer tüm önerilere ek olarak, olası tüm uyarıları en yüksek hassasiyet düzeyine getirin ve hata olarak kabul edin. Ayrıca dilin sahip olduğu herhangi bir yazı aracını kullanın.

Sen olurdu hayret birçok basit hatalar uyarı ve nasıl bu basit şeylerin birçoğu Kodunuzdaki gerçek böcek çevirmek tarafından yakalanmış olabilir nasıl.


2

Burada birçok iyi cevap var, fakat eklemek istediğim birkaç şey var. Gereksinimi gerçekten anladığınızdan emin olun. Kullanıcı gereksinimin X anlamına geldiğini düşündüğü ve programcının Y anlamına geldiğini düşündüğü zaman birçok hata gördüm. Hepimiz içeri girip kodlamayı sevdiğimizi biliyorum, ancak ön plana daha fazla zaman ayırıp anlayışı sağlamak, daha az yeniden işlem ve hata düzeltmesi olacak.

Desteklediğiniz işi yakından tanıyın, çoğu zaman eksik ya da daha sonra açıklamaya ihtiyaç duyan gereksinimlerde gereksinimleri görürsünüz. Y görevini belirtildiği gibi yaparsanız, mevcut Z özelliğini kıracağını unutmayın.

Veritabanı yapınızı anlayın. Birçok hata, sözdizimsel olarak doğru olan ancak yanlış sonuç veren bir sorgunun sonucudur. Sonuçlarınızın komik göründüğünü nasıl tanıyacağınızı öğrenin. Karmaşık bir raporlama sorgusu yazıyorsam, gitmeye hazır olarak işaretlemeden önce sonuçlarımı gözden geçirmek üzere her zaman bir teknik uzmanım olur, kaçınılmaz olarak kaçırdığım verilerde bir şey görürler. Sonra kendinize ne yakaladıklarını not edin ve bir dahaki sefere simliar yaptığınızı hatırlayın.


1

Bence en önemli teknik zaman ayırmak . Yeni bir modül kodlamak için iki güne ihtiyacınız olduğunu düşünüyorsanız, ancak patronunuz sizi yalnızca bir gün içinde kodlamanız için zorlarsa ... kodunuz daha fazla hatayla karşılanacaktır.

Bir süre önce okuduğum kitaplardan biri, kırık pencerelerle yaşamanız gerektiğini söyledi , çünkü insanlar bir başka kahvenin kırılmasını önemsemezler ... Kodlama aynıdır, herkes kötü bir şey yapan ilk kişi olmayı umursar ama hızlı , ama hiçbiri bir sürü cehennem kodunu , çok fazla hatayı ve çok zayıf tasarım ve stili önemser .


1

Kod-test-kod-test yerine Test-Kod-Test uygulamasını takip ediyorum. Bu, kullanım durumlarını düşünmeme ve mantığı uygun bir şekilde çerçevelememe yardımcı oluyor


1

ReSharper veya IDE'ler gibi IntelliJ IDEA gibi kod inceleme araçlarını kullanın ; örneğin "yazılan, ancak hiçbir zaman okumayan" değişkenleri işaret ederek, kopyala ve yapıştır hataları hakkında uyar. Bana çok zaman kazandırdı.


1

Şaşırtıcı bir şekilde, aşağıdaki üç çok önemli noktadan henüz bahsedilmedi:

  • İddiaları liberal bir şekilde kullanın. Her zaman kendinize sormanız gereken soru "bunu iddia etmeli miyim?" Değil. ama "iddia etmeyi unuttuğum bir şey var mı?"

  • Değişmezliği tercih edin. (Finali / salt okunur şekilde kullanın.) Sahip olduğunuz az değişken durum ne kadar azsa yanlış gidebilir.

  • Erken optimize etmeyin. Pek çok programcı performans kaygıları ile tarafını takip eder, gereksiz yere kodlarını değiştirmelerine neden olur ve performansın bir sorun olup olmayacağını önceden bilmeden tasarımlarını bastardi. İlk olarak, yazılım ürününüzü akademik şekilde inşa edin, performansı göz ardı edin; sonra kötü performans gösterip göstermediğine bakın; (Muhtemelen olmaz.) Herhangi bir performans sorunu varsa, git ürününüzün kod kodunuzun tamamını değiştirmek ve kırmak yerine performans gereksinimlerini karşılamasını sağlayacak güzel ve resmi algoritmik optimizasyonlar sağlayabileceğiniz bir veya iki yeri bulun. Burada ve orada saat döngülerini sıkın.

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.