Programlama Röportajı: Bir program nasıl hata ayıklanır?

Geçenlerde bir röportajda aşağıdaki soru soruldu:

Bir C ++ programında nasıl hata ayıklarsınız?

I started by explaining that programs may have syntax and semantic errors. Compiler reports the syntax errors which can be corrected. For semantic errors, various debuggers are available. I specifically talked about gdb, which is command line, and Visual Studio IDE's debugger, which has a GUI, and common commands. I also talked about debug and release version of code, how assertions should be used for debug build, how exceptions helps in automatic cleanup & putting the program in valid state, and how logging can be useful (e.g. using std::clog).

Bu cevabın eksiksiz olup olmadığını bilmek istiyorum. Ayrıca, başkalarının bu soruyu yapısal olarak nasıl cevaplayacaklarını duymak istiyorum.

Teşekkürler.

4
@James VS 2010 IDE'nin hata ayıklayıcısındaki gdb ve call stack penceresindeki geri dönüşü açıklarken
katma yazar John M., kaynak
Benzer bir soru soruldu, aradıkları vızıltı sözcüğünün 'çağrı yığını' olduğu ortaya çıktı. Sen bahsettin değil mi?
katma yazar James, kaynak

7 cevap

Böyle belirsiz bir sorunun cevabı asla tamamlanamaz.

Bu bilerek belirsiz olarak tasarlanan sorulardan birine benziyor: bence aşırı gözleme yapmaktan kaçınmalı ve sorunun odak noktasını daraltmasını istediniz. Bahsettiğiniz gibi, önce hataları sözdizimi ve anlambilimsel olarak sınıflandırırsınız, sonra cevabınızı oradan alırsınız - ama zaten ikisini de derinlemesine tartışmak istediklerini düşündüğünüz için, konuşmaya devam ettiniz.

Evet, söyledikleriniz iyi, ancak burada kimse röportaj sorusunu cevapladıysanız söyleyemez.

Şahsen, "neden tür C ++ sorunumun hata ayıklamasını yapıyorum?" ( Segmentasyon Hatası , bildiğiniz gibi Beklenmeyen ... 'den çok farklıdır, ancak her zaman açıkça belirtmelisiniz bir röportajda varsayımları) ve oradan aldım, soru yeterince daraltılmışsa, cevap tam olarak ve büyük ölçüde bütünüyle cevaplayabilecekti. Bunu şöyle düşünün: "arabam çalışmıyor, nedenini söyleyebilir misiniz?" Gerçekten bu kadar az bilgi ile cevap vermeye çalışacak mısın?

8
katma
@ ShivanDragon: soruyu cevaplamak istemek için tamamen doğal bir cevap olduğu için ...
katma yazar Paul Roub, kaynak
+1, neden ah, neden görüşmeler hakkındaki kasten belirsiz soruları unutuyorum (ve ilk önce daraltıcı takip sorularını sormam gerektiğiyle ilgili olarak her zaman).
katma yazar Shivan Dragon, kaynak

Sık sık çok benzer bir soru soran bir görüşmeci olarak, belki biraz ışık tutabilirim.

Her şeyden önce, görüşmelerde genellikle iki tür soru vardır: (1) bir şey bildiğinizi kanıtlayın (pratik olarak konuşursak, bunlar oldukça açık bir şekilde "doğru" ve "yanlış" cevaplar vardır) ve (2) kafanızı açıp aklınızın nasıl çalıştığını gösterin (bunların çok daha fazla gri tonu vardır ve çok çok farklı cevapların hepsi iyi olabilir). Görüşme yapanların "doğru" cevabı aramayacağımı ve sadece nasıl düşündüklerini bilmek istediklerini bilmelerini sağlamaya çalışıyorum. Benim için bu soru ikinci kategoride.

Tekrar düşünün, "C ++ programında nasıl hata ayıklarsınız?" veya "Bir C ++ programı nasıl hata ayıklanabilir?", çünkü verdiğiniz cevap ikinci soru içindi. Genel olarak, röportajlarda generali duymak istiyoruz (yani, kodun sürümleri ve hata ayıklama sürümleri var) ve sonra Xem projesinde kişisel olarak bunu nasıl kullandığına dair duymak istiyoruz. Shroozlebob sınıfı düzgün başlatılamıyordu, bu yüzden kodun hata ayıklama sürümünü hata ayıklayıcıya yükledim ve ... "). Tabii ki, seninki gibi bir cevabım olsaydı, örnekler sormaya başlardım. Görüşme yapanların görüşme yapma konusunda bilgili olmalarını beklemiyorum; Bilgili programcılar olmalarını bekliyorum.

Bazı cevaplar diğerlerinden daha iyi olmasına rağmen benim için bu sorunun doğru bir cevabı yoktur. Bana cevabını verdin, ben de örnekler istedim ve hiçbir şey veremezsen, çok fazla hata ayıklama deneyimine sahip olmadığını varsaymak zorunda kalacağım. Ama bana bahsettiğin şeylerden iyi örnekler verseydin, bu iyi bir cevap olurdu.

4
katma

Saygılarımla, mh. Bu hileli bir soru değil. Bunun hata ayıklama ve genel olarak gelişim süreci hakkında bir tartışma başlatılması girişimi olduğunu tahmin ediyorum.

Cevabınız, özellikle iddialar ve istisnalar hakkında iyi bir başlangıç ​​noktasıdır. Ama daha derine inebilirdin. Birim testleri yazıyor musunuz? Eğer değilse, o zaman yapmalısın. Böcek bir birim testinden yakalandı mı? Değilse, bunun için yeni bir test eklemeniz gerekir. Sürüm kontrol sistemi kullanıyor musunuz? (Yine yapmanız gerekir.) Öyleyse, hangi değişikliğin hataya yol açabileceğini görmek için son işlem günlüğünü kontrol etmelisiniz. Hatanın ne zaman ortaya çıktığını tam olarak bulmak için hatayı önceki sürümlerde çoğaltmayı denemek isteyebilirsiniz.

Kodunuz temiz mi? (Bkz. Robert C. Martin "Temiz Kod"). Tanımlayıcı adlara ve açık bir amaca sahip küçük sınıflarınız ve işlevleriniz varsa, hatayı sadece koda bakarak bulabilirsiniz. Eğer değilse, o zaman bu daha net ve daha az hataya eğilimli hale getirmek için söz konusu kodun bir kısmını yeniden canlandırmak için iyi bir zaman olabilir.

Bu arada, tam anlamıyla anketöre sürüm kontrolü ve ünite testleri ile ilgili bu soruları sormalısınız. Mülakat, onları değerlendiren kadar, sizi değerlendiren kadar.

2
katma

Tamamlanmadığını söyleyebilirim, ancak genç bir pozisyon için kesinlikle kabul edilebilir. En güçlü hata ayıklama aracı, kodu anlamak ve ne yapması gerektiğine karşı ne yapması gerektiği hakkında doğru şekilde karar verebilmektir. Bu yine de ilham verici ve hepimiz yetersiz kalıyoruz. Her zaman daha önce hiç görmediğimiz hata ayıklama kodunu buluruz. Bir hata ayıklayıcı bunun için harika. Ayrıca, uygulamalarınıza bir günlük kaydı kurma tesisi ve iyi belgeler ve açık kodlar yazmaktan bahsettim. Ayrıca Valgrind, systrace ve gprof veya Windows veya Java eşdeğerleri gibi araçlardan bahsetmek de iyi olurdu.

1
katma

Kaçırdığın bir dava var. Program hata vermese de, bir gereksinimin yanlış yorumlandığı durumlar olabilir ve bu nedenle yazılımın bunu yansıtması için değiştirilmesi gerekir. Derleyici herhangi bir istisna atmaz çünkü program söz konusu olduğunda yanlış bir şey olmuyor.

Aynı zamanda çeşitli hatalar, derleme zamanı, çalışma zamanı ve değişen gereksinimlerle başlasam da, daha sonra ne tür bir hatayla karşı karşıya olduğumu sorusuna sorardım. Bu, kodda, veride veya altyapıda bir sorun mu? Kaynak olabilecek birkaç yerden daha fazlası var. Muhtemelen bunun bir yerde olup olmadığını ya da kaçırıldığını görmek için program için yazılmış testlere bakacağımı eklerdim.

1
katma

Bu bana yarı hileli bir soru gibi korkunç bir ses gibi geliyor - sizi yakalamak ve daha basit birinin yapacağı zaman aşırı karmaşık bir cevap vermek için sizi tuzağa düşürmek için tasarlandı.

Sorunun ne olduğunu öğrenir, bir repro durumu alır, bir hata ayıklayıcı kullanır, yapıldığında regresyon testi yapar; bu kadar basit.

Kendi cevabınız bu konuya çok fazla değiniyor, bu yüzden kabul edilebilir.

0
katma
"Bu kadar basit" inizin dört adımı zaman zaman çok karmaşık olabilir. Nadiren "bu kadar basit".
katma yazar whatsisname, kaynak

Bu soruyu soruyor olsaydım daha yüksek seviyede bir cevap arardım. Bir "hata", programın ne yaptığını düşündüğünüz ile gerçekte ne yaptığı arasında bir boşluktur. Bir hata bulmak için birincil araç bilimsel yöntemdir. Neler olup bittiği hakkında bir teori yapana kadar, hata ayıklayıcıları, günlükleri, kod değişikliklerini kullanarak deneyler yapın. Ardından, bu teoriyi mümkün olduğu kadar çok vaka kullanarak, tekrar ne anlama gelirse kullanın. Bir teoriyi ispat edene kadar tekrarlayın. Neler olup bittiğini öğrendikten sonra, ilgili değişiklikleri yapın ve düzeltmenizi test edin.

Hangi araçlar katılır böcek ve çevreye bağlı olarak değişir. "Bir programda nasıl hata ayıklama buluyorsunuz?" beni çok zorluyor. Nasıl bir yazılım yazdığınız sorulduğunda "editör kullanarak" cevap vermek gibi. Bir hata ayıklayıcı bir araçtır ve sektördeki tüm araçlar gibi kaliteye göre değişebilir ve hatta olmayabilir. "Visual Studio", yalnızca bir Microsoft mağazasına bakıyorsanız çalışır. Sorun yalnızca hata ayıklama eklerine izin vermeyen fiziksel bir aygıtta serbest bırakma modunda kendini gösterirse felç olur musunuz?

Bir görüşmeci olarak arayacağım bir diğer şey ise, belirli koşullar altında neyi arayacağınız konusunda bilgi sahibi olduğunuzu gösteren sorun. Sistem birden çok iş parçacığı olan bir uygulamada donarsa yaklaşımınız nedir? Serbest bırakma ve hata ayıklama modunda farklı davranışlarınız olduğunda yaklaşımınız nedir? Belirli bir kod satırına bağlanamayan rastgele bir çökme olduğunda yaklaşımınız nedir? Bellek sızıntısını izlemek için yaklaşımınız nedir?

Cevaplar elbette tüm bu durumlarda araçlardan bahsetmelidir, ancak araçlar sürece ikincildir.

Bu sorunun hiç de belirsiz olduğunu sanmıyorum. Röportaj yaparken, bu gibi soruları severim, çünkü genellikle yazılım mühendisliği süreci hakkında derinlemesine konuşmalara neden olabilirler. Bu olduğunda, doğru insanın sen olduğunu biliyorsun. "Tam" bir cevap ya da "doğru" bir cevap diye bir şey yoktur. Mesele, soruyu doğru yapmak değil, sorunuzu yeteneklerinizi göstermek için bir sıçrama tahtası olarak kullanmaktır. Bir görüşmeci olarak, size bu fırsatları vermekle ilgileniyorum, "doğru" bir cevabı geri alabileceğinizi bildiğimden daha fazla.

0
katma