Sizi 10 saatten fazla şaşırtan tuhaf hataların üstesinden nasıl gelirsiniz? [kapalı]


29

Onları biliyorsunuz, hiçbir anlam ifade etmeyen hatalar. Bir gremlin gibi gözüktüğü yer cipslerin içinde derinlere atladı ve bir şeyleri mahvetti. Yürüyüşe çık, bir şeyler yaz, bir amca mı çağırdın?


3
Açıklamanız doğru olabilir - Yeniden başlatın ve tekrar deneyin!
NoChance

5
tabiki
William

5
Neden 10 saatlik bir eşiğe karar verdiniz? Bu çok uzun - bir ya da iki saat içinde beklenmeyen davranışa neyin neden olduğu hakkında iyi bir fikriniz yoksa, başınız belada demektir.
Vektör

5
"Gittikçe zorlaştığında, sert uyku moduna geçer ve bilinçaltının üzerinde çalışmasına izin verir." - anon
Michael Paskalya

2
1. Yardım edecek birini alın. İki kişi bir zorunluluktur. 2. Aşırı miktarda hata ayıklama ifadeleri kullanarak daraltın. Her bir satırın önce bir hata ayıklama makrosu tarafından, daha sonra kırılan parçayı tam olarak belirlemek için kullandığı bir dosya vardı.
SF.

Yanıtlar:


9

Gerçekten korkunç sorunlar için stratejim genellikle şu şekildedir.

  • Deneme ve google. Sorunu çözmeye çalışmaya devam edin. Bu çoğu zaman sorunu bir saat veya daha kısa sürede çözer.

  • Yani işe yaramadı. Bir ara ver. Bir kahve alın, bir meslektaşla ilgisi olmayan bir şey hakkında konuşun. Sorunu aklınızdan çıkarın. 5 veya 10 dakika sonra soruna baktığınızda, biraz farklı bir açıdan bakıyorsunuz. Çoğu zaman bu işe yarıyor.

  • Bu durumda olmadı. Öyleyse, bakmak için 10 - 30 dakika daha harca. O zaman bir meslektaşınızı arayın. Ama ondan önce, bazı notlar alın; sorunu göstermek, yeniden üretmek, daha sonra denediğiniz şeylerin listesini görmek ve en önemlisi onları denediğinizi kanıtlamak istiyorsunuz. Öyleyse önce kuru bir işlem yapın. Kodda bazı işaretler koyun, gereksiz açık belgeleri vb. Kapatın. Bu şekilde sorunu kendiniz çözebilir veya sorunu gösterdiğinizde zamanını boşa harcamazsınız.

  • Meslektaşınızdan tüm varsayımlarınızı kanıtlamanızı isteyin. bu pasör aslında çağrılıyor mu? Bu yöntem, iddia ettiğin şeyi gerçekten geri veriyor mu? Bu nesnenin boş olmadığını düşünüyorsunuz - onlara boş olmadığını gösterin.

  • Çoğu zaman, sorunu göstermek ya da tüm olasılıkları denememiş olduğunuzu ya da meslektaşınızın hatayı göreceğini fark etmenize neden olacaktır.

  • Bu ciddi olma vakti gelmiyorsa. Yapmaya çalıştığınız şeyi, neyi denediğinizi ve neden çalışmadığını belgeleyin. Bunu tüm meslektaşlarınıza e-posta ile gönderin. SO'da yayınla. Bu noktada, belge mükemmel bir SO sorusu olmalıdır.

  • Yanıt beklerken, google google. Sahip olduğunuz sorunun her permütasyonunu deneyin. Bir sürü sekme açın. Muhtemelen bu noktada bir cevap alamayacaksınız, ancak soruna yaklaşmanın farklı yollarını, fikirleri, olasılıkları arıyorsunuz.

  • Başka bir şey yapın, bir soruna 5 saat harcadıysanız, başka bir güne bırakma zamanı geldi. Belki yararlı bir cevap alırsınız. Belki ertesi gün soruna saldırdığın zaman belli olacak.

  • Bunların hiçbiri işe yaramazsa, farklı bir çözüm arama zamanı. Belki farklı bir yöntem, farklı bir teknoloji kullanabilirsiniz. Belki de şimdilik bu özellikten vazgeçmelisin. Müşteriyi saate göre faturalandırıyor musunuz? Dahili bir uygulamada bir şirket için mi çalışıyorsunuz? Bunu sahibine yükseltmeniz ve onlara "bak, x saatimi harcadım ve ilerleme kaydetmedim, maliyet faydası yok mu?" Patronuna gidip onlara bir sorun için 16 saat harcadığını, sadece geri dönüp söylemek istediklerini söylemek istemiyorsun, bu önemli değil, bu sürüm için atla. Bunu daha önce öğrenmen gerekiyor.

  • Ve bu işe yaramazsa? Tek seçenek, problemden uzak durmaya çalışmak veya endüstri uzmanlığı aramak. Twitter'dan teknoloji uzmanlarına danışın. Teknoloji sağlayıcınıza e-posta gönderin.


79

Çıkın. Hayır, işin değil! Sadece kalk ve eve git. Gün ya da hafta sonu için bitti. Bir sonraki soruna döndüğünüzde 20 üzerinden 19 kez, çözüm bir saat içinde kendini gösterecek.


17
Ayrıca lastik ördekleri deneyebilirsin. en.wikipedia.org/wiki/Rubber_duck_debugging
Dave Nay

2
20'de 19, evet. En kötüsüm hiç çözülmedi, sadece çalıştı. Hiçbir test ortamı bunu göstermedi, sadece operasyondaki tam üretim ortamını gösterdi - saatler sonra bile çoğaltamadık.
Loren Pechtel

3
Seni rahatsız eden bir şeyden uzaklaşmak gerçekten zor olabilir - ama yıllar boyunca her zaman yapılacak en iyi şey olduğunu gördüm. Bilinçaltı zihin, siz yemek yerken, uyurken, iyiyken, TV seyrederken ve ertesi gün (veya ertesi gün) işler daha iyi giderken sorun üzerinde çalışabilir. Yine de bir uyarı kelimesi: gitmeden önce bilgi topla ... Çekip gitmek onu görmezden gelmek ve orada yokmuş gibi yapmakla aynı şey değil. Hala çok çalışmana ihtiyacın var!
Çabuk_şimdi

1
Bir saatten haberim yok. Genellikle sabahları kalktığımda bu tür problemlerin çoğunu duşta çözerim. En sık ikinci olan ise geceleri neredeyse uykuya daldığım ve sonunda kendimi düşünmeyi bırakmama izin vermem olacak.
SoylentGray

3
ŞİMDİ Neil deGrasse Tyson'ın ev sahipliği yaptığı, uyku bilimi hakkında konuşan büyüleyici bir NOVA Science vardı. İçinde saatlerce sorununu kafana çarpma, uyumaya gitme ve hemen uyanma ve çözme olgusu tartışıldı. Uyuduğumuzda, beynimiz günümüzün olaylarını tekrar tekrar çevirir ve birçok farklı açıdan analiz eder. Geride bıraktığı şey, sorunu bilinçaltı olarak yepyeni bir şekilde görmemize ve sonra da sorunu çözmemize yardımcı olabilecek yeni sinir yolları. Oldukça harika.
Byrne Reese

44

On saat geçmeden önce biraz yardım alırdım.

  1. Sorunu bir başkasına, başkasına, hatta lastik ördinize bile anlatın .
  2. Başka birinden koda bir göz atmasını isteyin veya onunla birlikte adım atın.
  3. İzole et. Bir sürü öğeyi silin, ardından sorun yeniden ortaya çıkıncaya kadar yavaş yavaş geri getirin.
  4. Biraz uyu!

12
Sorun yok olana kadar her şeyi silmek için + 1'leyin.
Jonah

4
1 saat geçmeden önce bunlardan birini yapmalısın. Ne kadar çok göz kulak olursanız, epifanınızı elde etme olasılığınız o kadar düşüktür. Normalde bir problemi sadece birisiyle konuşarak çözerim.
Ben

Noktaya bak. Genellikle sorunu ilk önce tanımlayarak sorunu çözerim (veya yaklaşırım). Bir StackOverflow sorusu için sorunun açıklaması yazarken bu genellikle gerçekleşir. Aynı zamanda bir azalma (izolasyon) ve sonra da başarısızlık, problemden uzak
durduğunuz

17

Bir kelime, timeboxbir şey üzerinde çalışmak için sınırlı bir süre belirleyin ve çözülmezse, başka bir şeye geçin ve ertesi gün yeni bir bakış açısıyla geri gelin.

Bu ve başka bir göz kümesi, bir şeye bakarak harcayabileceğiniz zamandan daha değerlidir.

Bir oturuşta bir şeyi çözmek için bir saatte asla 45 dakikadan fazla harcamazdım, azalan getiriler kanunu ihlal eder.


Çok teşekkür ederim - wikipedia'daki zaman kutusu makalesini okudum, çok faydalı.
Adel

7

Sorunu başkasına açıklayın.

Sorunu bir başkasına açıklayarak, bunu açıklığa kavuşturmanız gerekir: bu genellikle çözümü görmenizi sağlar.

(İngiltere'deki profesyonel bilgisayar dergilerinden biri, bir zamanlar özellikle bu amaç için kıdemli bir programcının yaşam boyutu karton kesimlerini satmayı önerdi.)

Bir problem üzerinde uyumayı (bazen birkaç günlüğüne) de yardımcı olabilirim.


1
"Başka birinin" insan olması gerekmez. Bazen bir şeyi kedilere açıklarım ve aha! Sorunu buldum.
DarenW

Ben de bir kedi almalıyım. İsteğe bağlı olarak başımı tırmalamak için eğitirim.
Adel,

Birisi gerçekten Jon Skeet'in yaşam boyu karton kesmesini yapmalı.
Don Roby

5

Üç adımlı bir planım var:

  1. Bir kahve veya başka bir lezzetli içecek alın.
  2. Günün geri kalanında başka bir şey üzerinde çalışın.
  3. "Bir arkadaşınıza telefon edin" ve beyaz tahtaya doodle.

Bir önceki adım başarısız olursa, her aşama bir tırmanıştır. Neredeyse her zaman 2. aşamada çalışabileceğim verimli bir şey var.


Güzel tavsiye! Demek "Bir arkadaşa telefon et" yazıyor, çünkü Milyoner’de olduğu gibi 60 saniye ile sınırlı olmalı, değil mi? Ben de beyaz tahta fikrini seviyorum.
Adel,

1
Beyaz tahtanın gerçekten metodik olarak düşünmesine yardımcı olduğunu biliyorum. Alıntılar, genellikle arkadaşın aynı ofiste olduğu için aslında çağrı yapmak garip olurdu. Ama televizyon programındaki bir yaşam çizgisi gibi geldi.
Flexo

4

Bunun üzerinde uyu

Aksi takdirde, yakındaki birisini arayın ve kodu hızlı bir şekilde incelemesini isteyin.

Bulmanız çok uzun sürecek hatalar (kodunuzdan beri) başkaları tarafından çok kolay bulunur


3

Ayağa kalkıp dolaşıp, sorun hakkında düşünmenin bir çözüm bulmanıza yardımcı olup olmadığını anlayabilirsiniz. Gerçekten ayakta veya durmuş olsanız da olmasanız da, düşünürken bilgisayardan uzaklaşmayı deneyin.


3

Genellikle üç kişiden birini yaparım:

  1. Yürüyüşe / bisiklete binmek ... sizi bilgisayardan uzaklaştıracak.
  2. Köpeğim veya kedimle oyna
  3. Bir hobin varsa, bir süre bunun üzerinde çalış.

Üç kişiden herhangi biri, elindeki durumdan kendisini rahatsız etmek için iyi bir iş çıkarıyor. Dikkat dağıtıcı şeylerin bilinçaltı beynimin bir süreliğine çiğnemesine izin verdiğini fark ettim. Bundan bir saat kadar sonra, bam, çözüm var :-).


3

Bu Kusur ve Hedefi izole etmek için bir test Demeti kurun

Sadece iyi kodu kaldırmaya devam et .. kusuru kopyalarken. Hatayı gizleyen kodun tamamını hedefleyene kadar. Ardından kodu izleyin.

Önerilen okumalar: Özellikle Pragmatik Programcı Bölüm 10: İzleyici madde işaretleri


bütün bunlar iyi ve iyi, ancak hatanın yeniden üretilebileceği ve yeniden üretilebileceği kabul edildi. Peki ya şu ana kadar harcanan 19 saat, sorunu ... deterministik ve sistematik bir şekilde yeniden üretmek için bir araç bulmaya çalışıyorsa ... ya sonra? Bana göre buradaki sorunun özü budur!
Newtopian

Pragmatik Programcı mükemmel
Adel

2

Tüm bu öneriler harika. Ancak, çok sık bahsetmediğim bir teknik kullanıyorum. Sorunla ilgili düşüncelerinizi düzenlemek için listeler yapın. Yapışkan bir sorunum varsa, genellikle aşağıdakiler gibi birden fazla liste yazarım: Gerçekler, Varsayımlar, Sorular, Belirtiler, vs. Bu genellikle yanlış olduğu ortaya çıkıyor), farketmediğim sorular sorulmalı, kontrol edebileceğim diğer izinler vs.


2

Düzenle:

Kısa cevap:

S: 10 saatten fazla bir süre boyunca sizi şaşırtan, tuhaf hatalarla nasıl başa çıkıyorsunuz?

C: Asla olmadıklarından emin olun: tasarımınızı anlayın, kodunuzu öğrenin, hata ayıklayıcınızı nasıl kullanacağınızı öğrenin.


Açıklama:

"Bir gremlin göründüğü yer cipslerin içine düştü ve bir şeyi berbat etti"

Bu asla olmamalı. Bu sizin kodunuzsa, düzeltmeyi denemeden önce hataya neyin neden olduğu hakkında çok iyi bir fikre sahip olmalısınız.

Dahası, kodunuzu yazarken, nerede ve neden başarısız olabileceğini zaten bilmelisiniz.

Bunu söylemek - bir arkadaşınıza sormak, SO'da yayınlamak, adımlarınızı geri çekmek ve geri almak ve ara vermek - yukarıda belirtilen tüm öneriler size yardımcı olacaktır.

Diğer bir şey ise, araçlarınızı - hata ayıklama araç setini bilmeniz gerektiğidir. Mesajlarınızı kodunuzdaki şüpheli noktalara kaydetmek, arama yığınınızı dikkatlice incelemek, koşullu kesme noktaları ve saatler vb. Kullanmak. Hata ayıklama becerileri ekstra değildir - bunlar programlamanın bir parçasıdır.


Birinin adımlarını takip edebilmek çok önemlidir. Teşekkür ederim!
Adel,

> Adımlarını takip edebilmek çok önemlidir. SourceControl yazılımı geri alma / geri alma işleminin anahtarıdır. Bu konuda ANAL olun ve yapabilirseniz ayarlarınızı sizi check-in sırasında yorum bırakmaya zorlayacak şekilde ayarlayın.
Vektör

3
Ne yazık ki, kodunuzu ne kadar iyi bildiğiniz önemli değil, bazen sorun başkasının (kapalı kaynak kodlu) koduyla etkileşime girmesidir.
Nate CK

2
+1 @ Nate CK - çok doğru. En kötü böcek türleri, güvendiğiniz bir web hizmetinden bir tür saçma sapan şey aldığınızda ortaya çıkar. Bir süre önce web servislerinde herhangi bir uyarı vermeden bazı işlevleri ustaca değiştiren bir Saas satıcısı vardı. Geliştiriciye, kodunun nasıl göründüğünü anlattığı gibi, kendi hatalarını telefonla nasıl çözeceğimi açıklamak zorunda kaldım.
Morgan Herlocker

1
Neyi belirlemek için? 3. parti kodunda bir sorun mu var? Bu kısım nispeten kolaydır. Zor kısım, hangi koşulların onu tetiklediğini ve bunun etrafında nasıl çalışacağını bulmak, kaynağa sahip olmadığınız zaman, satıcı yanıt vermemektir ve belki de test sisteminizde gerçekleşmez. Kodunuzu bilmenin sizin için her şeyi çözeceğini düşünüyorsanız, belki de asla başa çıkmak zorunda kalmamanızı öneririm.
Nate CK

1

Benzer bir problemim vardı, Objective-C’de, saatlerce uğraştığım gibi görünen bir bellek bozulması. Ama daha sonra ben ve meslektaşlarım öğle yemeği için bir yürüyüşe çıktık ve sorunu açıkladım (ve belirli bir bitin init yönteminde bir nesnenin seri hale getirilmesi ile ilgili olması gerektiğini) ve temelde tüm sorunu kendime açıkladım.

(teknik detaylar: temelde, bir nesneyi kendimden başka bir şeyin üzerine başlattım ve geri verdim, bu yüzden iki alloc vardı, fakat sadece bir nesne geri döndü. Hafıza değişti ve çılgına döndü, çöktü ve hata ayıklayıcı gerçekten ne yapacağını bilmiyordu. ya).


1
"Ben bir nesneyi kendimden başkasına başlattım ve geri verdim" - böyle bir şey TOUGH! 100 defadan fazla bakabilir ve yakalayamazsınız. Ancak hata ayıklayıcısını izleyerek iki tahsisat görmediniz mi?
Vektör

1

görüntü tanımını buraya girin

Yıkanmak.

Herhangi Rodney McKay fanlar?

Cidden, tüm bu cevaplar arasında ortak bir nokta varsa, ara vermek ve başka bir şey yapmaktır .

Sorunu bilinçaltınıza aktarırken düşünmeyi seviyorum. Aksi halde farkında olmasak bile, zihinlerimiz (göründüğü gibi) banyo yapmak gibi başka bir şey yaparken bile sorun üzerinde çalışmaya devam eder .


Harika bir fikir .... şimdi patronuma ofise yarım düzine küvet yerleştirmem gerekiyor.
Dave Nay

Keşke oda işçilerinin lejyonu her birinin böyle bir odası olsaydı.
Adel,

1

Montajdan aşağı adım adım ilerleyin. Kim ne çağırır, hafıza erişiminde kırılma noktası. Bu genellikle hatayı çok hızlı yakalar.

Değilse, bir yürüyüşe çıkın.


1

Bunların hepsinin bir kombinasyonu:

  • Bir süre ondan uzak durun, böylece sırt ocağınıza oturabilir. Uyu, dinlen, ye, yürüyüş yap, herneyse.

  • Sorunu daha fazla inceleyin , başka ne yanlış yapar, başka hangi belirtileri bulabilirsiniz?

  • Sorunu araştırın , ne bulabileceğinizi görün. Farklı anahtar kelimeler denemeyi unutmayın

  • Farklı bir şey dene . Etrafta bir çalışma. Farklı bir hata ayıklama tekniği. Bir doğrulayıcı. Farklı bir bilgisayar.

  • Biriyle konuş . Yardımcı olamasalar bile, hatta bir programcı bile olmasalar, bazen konuşmak fikir ampulünü tetikler.

  • Tekrar başlat! Uygunsa, bilgisayarınızı, sunucunuzu vb. Yeniden başlatmayı deneyin. Başka bir şey yoksa, düşünmek için zamanı kullanabilirsiniz.

  • StackOverflow'a sor! Yardım etmek için buradayız


1

En çok oy alan cevabı hiç beğenmedim, çünkü bazen çalışsa da, bazen aynı günü bulmanız gerekir, bu nedenle, bu sırayla önerdiğim şey:

  1. Bunun sadece senin için olmadığını onayla. Bu size çok zaman kazandırabilir. Belki gerekli bir bileşeni kaldırdınız ya da ortamınızda bir değişiklik yaptınız ve istisnalar kodunuzun bir yerinde yutuluyor. Sadece senin başına geliyorsa, bir çevre karşılaştırma aracı kullanırdım. Geçenlerde Envy adında bir yazılımı okudum, bu da bunu yapmanıza izin veriyor, ücretsiz olmasa da 10 USD'ye mal oluyor.

  2. Herkese mi oluyorsun? İyi, şimdi kod üzerinde bir Geçmişi Görüntüle'yi yapın ve doğrudan veya dolaylı olarak hataya neden olmuş olabilecek son değişiklikleri doğrulayın.

  3. Son değişiklik yok mu? Çok özel bir hata ise (bir istisna), 'stackoverflow it'. Şimdi bu 'google’dan daha iyi gelmiyor ama google’dan önce programlama araştırması için önce stackoverflow’u aradığımı söylemek güzel. Gerçekten bilinen bir sorunsa, burada bir çözüm bulmanız çok muhtemeldir. Değilse, ilgili stackexchange sitesinde bir soru gönderin. Çok hızlı bir cevap alabilirsiniz ya da yapmasanız bile, daha fazla araştırma yaparken sorunuzu orada bulabilirsiniz. Bu bir avantaj.

  4. Çevrimiçi bir cevap bulamadıysanız veya genel bir hata değilse, her adımın elde ettiği sonuçların beklediğiniz sonuç için anlamlı olup olmadığını kontrol ederek kod adım adım ilerleyin. Her bir yöntemde bitmeye başlayın ve katmanlı bir çözümde aşağıdan yukarıya doğru gidin. (örneğin, performans sorunlarını giderirseniz, kayıtları alan kodla başlayın. İlk adımın sorun olup olmadığını hızlı bir şekilde belirleyebiliyorsanız, kullanıcı arayüzünde başlatmak mantıklı değildir).

  5. Eğer birkaç kez kodu geçtikten sonra hala neyin yanlış olduğunu bulamadıysanız, konuşması için birisini arayın. Birinin daha önce de söylediği gibi, yüksek sesle konuşmak ampulü yakabilir. Ayrıca çift programlama gerçekten faydalıdır.

  6. Bu noktada, uygunsa, bir süre veya gün boyunca ya uzaklaşın. Dün, "yatağın 'nasıl olduğunu' düşünerek yattım 've elbette' düşünerek uyandım" diyen çok gerçek bir tweet okudum. Çok doğru.

  7. Hala bir cevabınız yoksa, daha küçük görevlere / yöntemlere / fonksiyonlara yeniden girmeyi deneyebileceğinizi söyleyebilirim. Henry Ford 'Küçük işlere bölünerek gerçekleştirilemeyecek kadar karmaşık bir iş yok' dedi. Bu noktada, eğer çözüm çok karmaşıksa ve kendiniz ya da başkasının yardımı ile çözemediyseniz, kodu daha küçük işlere dönüştürün. Bunu yapmayı başaramasanız bile, sebebi bulmanıza yardımcı olabilir.

  8. Kodunuza enstrümantasyon ekleyin.

  9. Bunun hakkında Tweet?


1

Geri adım atman gerekiyor. Benim sloganım 'sorun çok zorsa o zaman yanlış sorunu çözüyorsunuz'. Varsayımlarınız neler? hiçbir şeye güvenme.

Bunun sonucu olarak, “problem ne kadar garip, çözüm ne kadar garip” olur. Bilgisayarın gücü onun mantığı olduğundan mantık kazanamazsınız. Bir beynin var ve düşünmek zorundasın.

Modern zamanlarda, bir sistemde etkileşime giren birçok şey var - güvenlik duvarları, AV, Antispyware, her gece gerçekleşen otomatik güncellemeler - hareketli hedeflerle uğraşmak zorundasınız.


Öyle doğru ki 'problem ne kadar garipse çözüm de tuhaf'
Adel

-1

Google'da Ara. Stackoverflow onu. Forumlarda yayınla. Temel olarak, tek başına çözemezseniz, insanlara yardım etmelerini sağlayın.


-1
  1. Sorunu yaz.
  2. Sert düşün.
  3. Çözümü uygulayın.

Özlü, çok iyi!
Adel

1
Aslında hayır. Aynı parça boyunca çok fazla düşünmek, yapabileceğiniz en kötü şey hakkında. 'Her bir varsayımınızı sistematik bir şekilde meydan okuyun, numaralandırın, tekrar ziyaret edin ve test edin' ; insanlar bunu başarmanın farklı taktiklerini tartışıyorlar.
smci
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.