Gereksiz olduğuna inandığınız bir kod incelemesini nasıl reddedebilirim?


89

Var olduğuna inanmadığım bir sorunu gideren bazı kodları gözden geçirmem istendi.

Benden daha kıdemli olan tamirci, düzeltmesinin gerekli olduğu konusunda ısrar ediyor, ancak benim için C ++ sofistiğinden daha fazlası değil gibi görünüyor. Dağıtım sürecimizin bir kısmı kod incelemesi ve küçük bir şirkette en yüksek 2. mühendis olarak değişiklikleri incelemem bekleniyor.

Gözden geçirenlerin orijinal kodlayıcı kadar kod değişikliklerinden de sorumlu olduğuna inanıyorum ve bu değişiklik için sorumluluk almak istemiyorum. Bu incelemeyi reddetme konusunda nasıl gidersiniz?


113
Bana çok açık geliyor. Sen işaret incelemede kod C ++, amacı, var olmayan bir sorunu giderir etmektir entelektüel mastürbasyon olduğunu. Ve sonra, inceleme sürecinin bir parçası olarak, kodu reddedersiniz.
user16764

86
Reddettiğinizde "entelektüel mastürbasyon" kelimelerini kullanmayın. Eğer bu ifadeyi kullanırsanız, onu kızdıracaksınız ve potansiyel olarak doğru bir teknik eleştiri olarak söyleyeceğiniz şeyi görmeyecek, kişisel bir saldırı olarak görecek. Tam olarak entelektüel mastürbasyon olabilir, ama onu böyle görmediğinden kesinlikle emin olabilirsiniz .
Michael Shaw

15
James - Topluluğun temel soruna odaklanmasına izin vermek için bu sorunun dışına çıktım. Diğerlerinin de belirttiği gibi, yorumunuzda yüklü terminoloji kullanmak, yalnızca hassas bir durumun net bir şekilde ortaya çıkmasına neden olacaktır.

8
C ve C ++ iş gibi görünen şeylerle doludur ancak aslında tanımsız davranışlardır. UB gerçek bir hatadır, olması gerektiği gibi çalışmadığını gösteren bir test yazamamanıza rağmen. Örneğin, çoğu derleyici tanımlanmamış durumun asla gerçekleşmeyeceğini varsayarak UB'yi bir optimizasyon fırsatı olarak kullanır. Örneğin size > size+1, işaretli bir tamsayıdaki taşma olup olmadığını kontrol etmek için kullandıysanız , derleyici bu ifadeyi false, işaretli tamsayıların taşması tanımsız olduğu için değiştirebilir. Blog.llvm.org'a
CodesInChaos

5
@MichaelShaw "kişisel bir saldırı olarak görecek." sorunun ifadesi bana benziyor, OP’nin güç kazandığı için artık “kazanabileceği” düşüncesi olduğu daha kıdemli bir deveye yapılan kişisel saldırı.
00'da 07:03

Yanıtlar:


274

Değişiklikle başarılı olan değişiklik olmadan başarısız olan bir test durumu isteyin.

Bir tane üretemezse, bunu gerekçe olarak kullanırsın.

Bir tane üretebilirse, testin neden geçersiz olduğunu açıklamanız gerekir.


245
Ya da belki bir tane üretebilirse, varsayımlarınızı yeniden gözden geçirir ve sonuçta olabileceğini düşünürsünüz. Muhtemelen, alıştırmanın amacı tartışmayı kazanmak için değil kodu geliştirmek.
Caleb,

99
Sadece bir test yazamadığınız için kırılmadığı anlamına gelmez. Genellikle beklendiği gibi işe yarayan tanımsız davranış (C ve C ++ bununla dolu), yarış koşulları, zayıf bellek modeline bağlı potansiyel yeniden sıralama ...
CodesInChaos

29
Ayrıca, standart yeniden düzenlemeye ne dersiniz? Bir parça yeniden düzenleme işi için başarısız bir test nasıl yazılır?
Mike Weller

62
“Neden gerekli olduğunu ispatlamasını isteyin …” Belki de neden gerekli olduğunu size öğretmesini isteyin .
Mike Sherrill 'Cat Recall'

8
@RhysW: Yanlış varsayım. Yarış koşulu ile mevcut kod bu açıdan da test edilemez. Dolayısıyla yeni kod teorik olarak daha iyi ve ampirik olarak eşdeğerdir. Varsayımınız ancak eski kodun ampirik olarak daha iyi olması durumunda geçerlidir.
MSalters

152

Hakemler objektif olmalıdır.

Söz konusu kod hakkında, daha önce incelemeden önce bir fikir oluşturduğunuz ve sizin ve tamircinin pozisyonları belirlemediği anlaşılıyor. Eğer öyleyse, o zaman objektif görünmekte zorlanacak bir zamanınız ve objektif olmak daha zor bir zamanınız olacak . Bunların hiçbiri sürece yardımcı olmuyor ve yapabileceğiniz en iyi, en objektif şeyin konuya çok yakın olduğunuz yerlere boyun eğmek olabilir.

Bir takım yaklaşımı düşünün.

Kendinizi kaldırmak mümkün değilse, belki birkaç başka mühendisin aynı anda kodu incelemesini sağlayabilirsiniz. Ya kodun reddedilmesi gerektiği konusunda hemfikirler ya da kabul etmeyecekler. Sizinle aynı fikirdelerlerse, o zaman artık sadece siz ve tamirciye karşı olmayacak, ve ekibin düzeltmeye objektif olarak bakıp kabul etmemeye karar vermesi konusunda daha güçlü bir dava açabileceksiniz. Öte yandan, düzeltmeyi kabul etmeye karar verirlerse, o zaman bu da bir takım kararı olacaktır. Yönetebildiğiniz kadar açık bir fikirle katılmanız gerektiğini ve diğer takım üyelerinin görüşlerini rasyonel tartışmadan başka bir şeyle etkilemeye çalışmamanız gerektiğini söylemeden devam etmelidir. Önemli: Daha sonra kötü bir sonuç varsa, takımı "Eh, ben her zaman hatalı kod olduğunu söylerdi, ama diğer ekip üyeleri tarafından sayıca fazla sayıldım. "

Reddetme, kod inceleme sürecinin doğal bir parçasıdır.

Kod gözden geçirme işlemi daha kıdemli kişilerin lastik damga düzeltmelerinde bulunmaz; Kodun kalitesini korumak ve iyileştirmek için oradadır. Doğru nedenden ötürü yapmanız şartıyla düzeltmeyi reddetmenin yanlış bir tarafı yoktur, yani düzeltmenin kodu iyileştirmemesi. Kodun açık görüşlü bir incelemesinden sonra, düzeltmenin gösterilebilir bir sorunun riskini ve / veya büyüklüğünü azaltmadığını hala hissediyorsanız, reddetmelisiniz. Kişisel değil, sadece dürüst düşüncen. Eğer tamirci aynı fikirde değilse, bu da sorun değil ve bu noktada yönetimin çözmesi zorlaşıyor. Sadece dürüst, açık ve profesyonel kaldığınızdan emin olun.

Sorumluluk iki yolu da keser.

Bir sorun olduğuna inanmadığın için görünüşe göre bu değişiklikten sorumlu olmak istemediğini söyledin. Ancak, yanılıyorsanız ve bir sorun varsa , sorundan kaçınacak kodu reddetmekten sorumlu olabileceğinizi anlamalısınız .

Not almak.

Gözden geçirme işleminin yazılı bir kaydını tutmak, gerçeklerinizi doğru tutmanıza yardımcı olacaktır. İddia edilen sorunu ve düzeltmeyi ölçmek için yapabileceğiniz testlerin açıklamalarını, açıklamalarını ve sonuçlarını incelerken düşüncelerinizi ve endişelerinizi yazın. Sorun yükselirse, sizin durum. Mesele gelecekte tekrar ortaya çıkarsa (muhtemelen tamirci kendi görüşüne bağlıysa olacaktır), hafızanızı canlandıracak bir şeyiniz olacaktır.


24
+1 bu kabul edilen cevaptan çok daha faydalı
Simon Bergot

2
Kesinlikle. Kabul edilen cevap, bir davaya özgüdür, açıkça genel olduğu ve bu konuda iyi düşünülmemiş.
Florian Margaine

40

Reddetme nedenlerini ve olası karşı argümanlar için savunmaları not edin. Ardından rasyonel olarak fiksatörle tartışın ve gerekirse yönetime yükselin.

Yeterli belgeleriniz varsa (kod listeleri, test sonuçları ve nesnel argümanlar dahil), iyi anlaşılırsınız.

Düzelticinin bir miktar hasta iradesine neden olacaksınız, bu yüzden sorunun değeceğinden emin olun (örneğin, düzeltmeme zarar veriyor mu?)

Ayrıca, tamirci sahiplerle ilgili herhangi bir şekilde ise, bu cevabı unut.


9
Cevabınızın son kısmı için iki kez oy kullanırdım. Çok sağlam cevap.

31

Son zamanlarda LinkedIn haberlerinde, işyerinde uyuşmazlıkların çözümü ve kibirli görünmek yerine mütevazi olmak üzerine bir makale vardı. Ne yazık ki, şu anda bağlantıyı bulamıyorum, ancak genel esas sorunla karşı karşıya kalmayacak şekilde sorular oluşturmaya çalışmaktı. Lütfen bunu kibirli olduğunuzu ima ederken kabul etmeyin, bu sadece makalenin yazıldığı yoldur.

Her neyse, üst düzey programcıya varsayımında yanlış olduğunu söylemek, yalnızca savunmacı bir yaklaşım benimsemesine ve cevabını size geri vermesine neden olacaktır. Bununla birlikte, sorunun neden var olduğuna inandığına dair bir soru sormuyorsanız, anlama konusundaki eksikliğiniz açısından, konuyu tartışmak için daha açık olması muhtemeldir.

Bu yüzden, "Sorun mevcut değil, bu yüzden bunu gözden geçirmemeliyim" demek yerine "Belki de bunu doğru bir şekilde gözden geçirmek için, sorunu anlamam gerek." bakış açısı?"

Bir örnek olarak, makale, bir yetişkinin, yüzünü tamamen tek renkli olan bir yetişkinin, yüzünü tek tek yetişkin olarak gördüğü çocuklara verilen bir testi tarif etmiştir. Çocuklara yetişkinin hangi rengiyle yüzleştiği sorulduğunda, 5 yaşın altındakiler yetişkinlerin kendilerine göre farklı bir bakış açısına sahip olduklarını anlayamadıkları için hemen hemen her zaman görebilecekleri rengi söyleyecektir.


8
Mükemmel nokta, ancak alttaki örnekte nasıl bir ilişki olduğunu anlamada başarısız oldum (ilişkisiz olduğunu iddia etmiyorum, elbette kapalı, sadece ilişkiyi anlama konusundaki eksikliğime dikkat çekiyor).
ugoren

8
@ugoren Ha ha, orada yaptıklarınızı beğendim!
TheDarkKnight

1
@ugoren ilişkisi 'tüm resmi görmüyorsanız, somut görüşler oluşturmayın'
RhysW

2
Ben her zaman mütevazi yaklaşımı severim, anlayamadığım bir temelde değişikliği reddederdim ve bu yüzden tamam vermeye yetkim yok.
PhilDin

2
@PhilDin Mütevazı ve sonra iş için nitelikli olmadığınızı söyleyerek etrafta dolaşıyor. Eğer kodu gözden geçirebilecek bir pozisyondaysa, onu bu pozisyona sokan insanların bunu yapacak kadar nitelikli olmasını beklediklerini düşünüyorum.
Andy

9

C / C ++ tanımsız davranışlarla dolu olabilir. Bir yandan beklenmedik davranışlara yol açabileceğinden kötüdür. Öte yandan, agresif optimizasyona izin verir ve genellikle C / C ++ kullanırken hıza ilgi duyarsınız.

Sonları zorlayan bir test senaryosunun yazılması zor olabilir - artık bulunmayan tuhaf bir mimari veya derleyici içerebilir. Ayrıca , mantıklı bir mimaride "herhangi bir soruna neden olmamalı" gibi görünebilir .

Ancak bir noktada veya diğerinde platformu değiştireceksiniz (diyelim ki - mobil gitmek istiyorsunuz, böylece ARM'e bağlantı yapacaksınız veya işleri hızlandırmak ve GPU kullanmak isteyeceksiniz). Bu noktada bazı şeyler kırılmaya başlayabilir ve hata ayıklamanız gerekecektir. Derleyiciyi daha yeni bir sürüme güncellemek kadar önemsiz olabilir (ve isteyebilirsiniz / ihtiyacınız olabilir).

Sorunlu kod şuydu:

int d[16];

int SATD (void)
{
   int satd = 0, dd, k;
   for (dd=d[k=0]; k<16; dd=d[++k]) {
     satd += (dd < 0 ? -dd : dd);
   }
   return satd;
 }

Son yineleme sırasında d[++k] => d[++15] => d[16]erişilir. Genellikle bir sonraki öğe yasal bellek olduğundan (disk belleği cinsinden disk belleği modelinde) önemsiz derleyiciler bile garip davranışlarla çalıştırılabilir herhangi bir işlem yapmadılar. Test senaryosunu yazmanın tek yolu, C (muhtemelen VM) ile aynı bellek modeline sahip bir platform bulmaktı.

Ancak d[++k]her döngüde gcc 4.8 prerelaz görülmüştür . Bu nedenle, k < 16aksi takdirde erişim yasadışı olacaktır ve derleyiciye beslenen programın yasallığı sözleşmenin bir parçasıdır. Dolayısıyla, döngü koşulu, varsayımlar göz önüne alındığında her zaman doğrudur, böylece sonsuz döngüdür. Bu garip gelebilir ama tamamen yasal bir optimizasyon oldu - yayma system("dd if=/dev/zero of=/dev/sda"); system("format c:")da döngü için doğru yerine olacaktır. Davranış sergilemeyi seçebileceğiniz daha ince yollar var. Örneğin, İşlemsel Bellek hakkında ders sırasında , 2 iş parçacığı aynı değeri artırdığında sunum yapan kişinin birkaç kez yanlış değer almaya çalıştığını hatırlıyorum.

Bununla birlikte, C / C ++, bazı dillerin aksine, standardize edilmiştir, böylece bu tür anlaşmazlıklar, amaç kaynağına atıfta bulunarak yapılabilir:

  • Bunun bir sorun olmadığını düşünüyorsanız, C / C ++ standardını kullanarak (yani tanımlanmış değer ve davranışa yol açtığını) kanıtlamaya çalışın.
  • Bunun bir sorun olduğunu düşünüyorsa, C / C ++ standardını kullanarak ispatlamasını isteyin (yani tanımsız değere veya davranışa yol açtığını)

Genel olarak eğer takımınız C / C ++ ile yazıyorsa, elinizin altında standart olması yararlıdır - ekip uzmanları bile arada bir garip şeyler bulabilir.


4

Bu, ekip politikanızda bu özel incelemeden daha fazla bir sorun gibi görünüyor. 9 kişilik bir ekipte büyük bir yazılım mağazasında çalıştığımda, flat-out bir gözden geçirenin kod üzerinde veto yetkisi vardı ve bu hepimiz saygı duyduğumuz bir standarttı. Yetenekli ve yeterince anlayışlı olduk - viz. "olgun", fakat "çocukça" anlamında, "tecrübeli" den ziyade - takım liderimizin, ihtiyatlı bir zaman diliminde tartışmalara girmeden her zaman bir anlaşmaya varabileceğimizi makul bir şekilde bekleyebileceğini söyleyebiliriz.

Görevinizdeki dilinize bağlı olarak, sizi, bu duruma, somut bir argümana yol açacak şekilde yaklaşacaksınız gibi geldiği konusunda sizi uyarabilirim. Belki de "entelektüel mastürbasyon" dür, fakat muhtemelen onun yapmasının bir nedeni vardır ve bunun üzerindeki yük, bu sorunu çözmek için daha basit bir yol bulmak olacaktır - ve eğer böyle bir yol yoksa, nedenini yorumla. Mastürbasyon kodu aslında gerekliydi.


1
“... ama muhtemelen onun yapmasının bir nedeni var…” - Yaptığın büyük bir varsayım. Ayrıca, Sorunun (OP'nin görüşüne göre) hiçbir sorunun bulunmadığını belirttiği noktasını da kaçırıyorsunuz. Elbette, onus, düzeltilmesi gereken gerçek bir problem olduğunu göstermek için bir "düzeltme" öneren kişi üzerinde olmalıdır. Var olmayan bir soruna "basit bir çözüm" önermek anlamsızdır.
Stephen C,

4
@StephenC evet ve OP'nin bu durumda şüphenin avantajını sağlaması gerektiği görüşüne katılıyorum. Ya da gerçekten bir yüzleşme incelemesi olacak.
djechlin

3

Gönderenin kodunun problemini çözdüğünü kanıtlamasını sağlayın. Eğer test edebilir ve kanıt gösterebilirse, o zaman yanlış olan sensin ve şikayetini bırakıp onunla ilgilenmelisin. Bir sorun olduğu iddiasını destekleyecek kanıt gösteremiyorsa ve yamasının sorunu çözdüğüne dair kanıt gösteremezse, onu çekmece kuruluna geri gönderirim.

Elbette bu konuda hassas bir iç politika olabilir. Ama bu benim tarzımdır (nefretle).

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.