Kodun “olması” kötü olduğunda gözden geçiren olarak ne yapmalıyım?


18

Zorunlu kod incelemelerinin birkaç ay önce tanıtıldığı, kötü tasarlanmış, yapılandırılmış bir projede çalışıyorum.

Yeni bir özellik uygulayan önemli bir kod parçasını gözden geçirmem istendi. Kod tabanımızın geri kalanıyla aynı kusurları taşır. Büyük ölçüde, bu kusurların yeni koda sürüneceğini anlıyorum. uyumluluğunu korurken kötü tasarlanmış bir sınıftan miras almak veya kötü tasarlanmış bir arayüz uygulamak zorunda kalıyorum ve gerçekten kod tabanının yarısını yeniden yazmayı gerektirmeyecek çok daha iyi bir çözüm sunamıyorum. Ancak mühendislik açısından bakıldığında, zaten kırılmış bir kod tabanına daha da bozduğumuzun iyi olmadığını hissediyorum. İncelediğim kod kesinlikle kötü, ancak özellik uygulanacaksa olmalı.

Bu incelemeyle ilgili olarak nasıl davranmalıyım? Bütünlüğü korumamın ve yapıcı kalmamın bir yolu var mı?

Bu bağlamda kod incelemesinin sınırını soruyorum. Sorunun organizasyon ve çalışma kültürü gibi diğer faktörlerden kaynaklandığını fark ettim, ancak bilmek istediğim, incelemenin kendisiyle nasıl başa çıkılacağı.


1
Geliştirici, bunun neden böyle yapıldığını belgeledi ve hatta sorun izleyicideki temel sorun için bir sorun bile yazdı mı?
Luc Franken

Az ve hayır.
Kırmızı

4
Kuruluşunuzda teknik borç hakkında bir şeyler yapma isteği var mı?
Robert Harvey

5
Kod ortam göz önüne alındığında yanlış değilse, kod saldırmak olmazdı. Çoğunlukla yazdığınızdan beri şu anda gerçek bir gelişme görmüyorsunuz. İyileşme fırsatı olmadan çatışma yaratacaktır. İlk adım olarak daha iyi belgelemeyi öğretmek. İkincisi, açık konular yazmalarını sağlamak için bir prosedür oluşturun. Bu 2 şeyle sonuçlanacaktır: bir sonraki belgenin daha hızlı çalışabilmesi için konuyla ilgili belgeler. Buna ek olarak, potansiyel olarak düzeltilecek somut sorunların bir listesini alırsınız. GitHub'dan bahsediyorum, çünkü etiketlediklerinde kaç kez tekrarlandığını görüyorsunuz.
Luc Franken

Yanıtlar:


25

Basit:

1. Teknik borcunuzu belgeleyin

Çalışan ancak onunla ilgili bazı teknik sorunları olan bir kod parçası belirlediniz. Bu teknik borçtur . Diğer borç türleri gibi, ele alınmazsa zamanla kötüleşir.

Teknik borçla mücadelede ilk adım, belgeyi belgelemektir. Bunu, sorun izleyicinize borcu tanımlayan öğeler ekleyerek yapın. Bu, sorunun büyüklüğünün daha net bir resmini elde etmenize ve bununla başa çıkmak için bir plan hazırlamanıza yardımcı olacaktır.

2. Borcunuzu kademeli olarak geri ödeyin

Teknik borcu geri ödemeyi hesaba katmak için yazılım geliştirme sürecinizi değiştirin. Bu, zaman zaman sertleşme sprintini veya borç kalemlerinin düzenli aralıklarla çözülmesini içerebilir (örn. Haftada 2 öğe). Borcunuzu tahakkuk etmekten daha hızlı bir şekilde parçaladığınızdan emin olmanın önemli kısmı (borç, hatta teknik borç, faizle ilgilenir).

Artık bir Teknik Açığa sahip olmadığınız bir noktaya ulaştığınızda , daha sağlıklı bir kod tabanına doğru yola çıkıyorsunuz :)


5

Yan not olarak: yeni bir iş arayın. Bu daha iyi olamazdı.

İncelemekte olduğunuz kodun hedefleri:

  • Gereksinimlere göre çalışması gereken bir özellik göndermek için.

  • Teknik borcun büyümesini azaltmak.

İlk amaç, birim, entegrasyon, sistem ve fonksiyonel testlerin burada olup olmadığını, ilgili olduklarını ve test edilmesi gereken tüm durumları kapsadıklarını kontrol ederek gözden geçirilir. Ayrıca , orijinal yazarın programlama diliyle ilgili, ince hatalara veya gerçekte olduğundan farklı bir şey yapıyormuş gibi yapan kodlara neden olabileceği inançlarını da kontrol etmelisiniz .

İkinci hedef, sorunuzun odaklandığı hedeftir. Bir yandan yeni kanunun teknik borcu artırması beklenmiyor. Diğer yandan, incelemenin kapsamı kodun kendisidir, ancak tüm kod tabanı bağlamındadır. Oradan, bir hakem olarak, orijinal yazardan iki yaklaşım bekleyebilirsiniz:

  • Dış kod benim hatam değil. Ben sadece özelliği uygulamak ve tüm kod temeli umurumda değil.

    Bu perspektifte, kod, kod tabanının kusurlarını kopyalayacak ve böylece kaçınılmaz olarak teknik borcu artıracaktır : daha kötü kod her zaman daha kötüdür.

    Bu kısa vadeli geçerli bir yaklaşım olmakla birlikte, uzun vadede artan gecikmelere ve düşük üretkenliğe yol açacak ve sonuçta geliştirme sürecinin o kadar pahalı ve riskli olmasına yol açacak ki, ürün evrimini durduracaktır.

  • Yeni kod yazmak, eski kodu yeniden düzenlemek için bir fırsattır.

    Bu bakış açısıyla, eski koddaki kusurların yenisi üzerindeki etkisi sınırlı olabilir. Ayrıca, teknik borç, kod büyümesiyle orantılı olarak azaltılabilir veya en azından artırılamaz.

    Bu geçerli bir uzun vadeli yaklaşım olsa da, kısa vadeli riskleri vardır. Bunlardan en önemlisi, kısa vadede, belirli bir özelliğin gönderilmesinin bazen daha fazla zaman alacağıdır. Bir başka önemli husus, eski kodun test edilmemesi durumunda, yeniden düzenleme, gerileme getirme konusunda büyük bir risk oluşturmasıdır.

Teşvik etmek istediğiniz perspektife bağlı olarak, gözden geçirenlere daha fazla yeniden odaklanmalarını tavsiye etme eğiliminde olabilirsiniz. Her durumda, berbat bir kod tabanında güzel mimari ve tasarıma sahip kusursuz, temiz bir kod parçası beklemeyin. Ne olmamalıdır teşvik berbat bir kod temeli denemelerde işe sahip bilgili bir geliştirici yapmak davranıştır üzerine düşeni iyi. İşleri daha basit hale getirmek yerine, daha önce olduğundan daha karmaşık hale getirir. Şimdi, tek biçimli kötü kod yerine, tasarım desenleri olan bir parçanız, temiz, açık kodlu başka bir parçanız, zamanla yoğun bir şekilde yeniden düzenlenmiş başka bir parçanız var ve hiçbir birlik yok.

Örneğin, orta boyutlu bir web sitesinin eski bir kod tabanını keşfettiğinizi düşünün. Herhangi bir olağan yapının olmaması ve günlüğe kaydetme işleminin bittiğinde, bir günlük dosyası kullanmak yerine bir metin dosyasına el ile şeyler ekleyerek yapılması sizi şaşırtıyor . MVC'yi ve bir günlük kaydı çerçevesini kullanmak için yeni özelliğe karar verirsiniz.

İş arkadaşınız başka bir özellik uyguluyor ve mükemmel boyutta bir ORM eksikliğinden çok şaşırıyor. Böylece bir ORM kullanmaya başlar.

Ne siz ne de meslektaşınız her yerde MVC, bir günlük çerçevesi veya bir ORM kullanmak için yüz binlerce satırdan geçemiyor. Aslında, aylarca çalışma gerektirecekti: MVC'yi tanıttığınızı hayal edin; ne kadar sürer? Ya da kimsenin anlayamadığı kod içinde SQL sorgularının düzensiz olarak (zaman zaman SQL Enjeksiyonu için yerlerle) SQL sorgularının oluşturulduğu durumlarda ORM?

Harika bir iş çıkardığınızı düşünüyorsunuz, ancak şimdi projeye katılan yeni bir geliştiricinin öncekinden çok daha karmaşık olması gerekiyor:

  • Talepleri ele almanın eski yolu,

  • MVC yolu,

  • Eski kayıt mekanizması,

  • Günlük kaydı çerçevesi,

  • Anında SQL sorguları ile veritabanına doğrudan erişim,

  • ORM.

Çalıştığım bir projede, yan yana kullanılan dört (!) Günlük çerçevesi (artı manuel günlük kaydı) vardı. Bunun nedeni, birisinin her şeyi günlüğe kaydetmek istediğinde, bunu yapmak için ortak bir yaklaşım yoktu, bu nedenle yeni bir çerçeve öğrenmek yerine (her durumda kod tabanının sadece% 5'inde kullanıldı), biri basitçe başka bir çerçeve ekleyecekti. Zaten biliyor. Dağınıklığı hayal edin.

Daha iyi bir yaklaşım, kod tabanını her seferinde bir adım yeniden düzenlemektir. Bir kez daha günlüğe kaydetme örneğini alarak, yeniden düzenleme aşağıdaki küçük adımlardan oluşur:

  • Eski günlüğe kaydetmenin yapıldığı tüm yerleri bulun (yani günlük dosyasına doğrudan erişildiğinde) ve hepsinin aynı yöntemleri çağırdığından emin olun.

  • Varsa, bu kodu özel bir kitaplığa taşıyın. Alışveriş sepeti sınıfımda depolama mantığı kaydetmek istemiyorum.

  • Gerekirse, günlüğe kaydetme yöntemlerinin arabirimini değiştirin. Örneğin, mesajın gayri resmi mi yoksa uyarı mı yoksa hata mı olduğunu gösteren bir seviye ekleyebiliriz.

  • Yeni özellikte yeni yeniden düzenlenmiş yöntemleri kullanın.

  • Günlüğe kaydetme çerçevesine geçiş yapın: etkilenen tek kod, ayrılmış kitaplık içindeki koddur.


1
Son paragrafa kadar büyük cevap. İsteseniz de istemeseniz de, iyi kodların yeni kod için kullanılmaması gerektiğini ima edersiniz. -1
RubberDuck

2
@RubberDuck: iyi uygulamalarla ilgili değil , kalan kod tabanından kökten farklı bir kod yazmakla ilgilidir . Bu geliştirici oldum ve yaptığım şeylerin sonuçlarını gördüm: kötü kodlar arasında önemli ölçüde daha iyi kodlara sahip olmak sadece işleri daha da kötüleştirir; onu daha iyi hale getiren, küçük yeniden düzenleme adımları ile kod tabanını geliştirmektir. Birkaç dakika içinde cevabıma bir örnek ekleyeceğim.
Arseni Mourzenko

Yapabilirsem tekrar DV yapardım. Düzenleme daha da kötüleşiyor. Yeni bir yol yapmak için dört farklı yönteme sahip olmak kötüdür, ancak ikinci günlükleme çerçevesini ekleyen adamın hatasıdır. Kuma bir çizgi çizmek ve çürük kodun yanında temiz bir koda sahip olmak kendi başına kötü değildir.
RubberDuck

@RubberDuck: İkinci günlük çerçevesini eklemekle ilgili değil, birincisi. İkinci kayıt çerçevesini ekleyen adam, sadece birincisi sadece küçük bir özellikte kullanıldığından bunu yapar; Eğer kod tabanı tavsiye ettiğim gibi yeniden düzenlenmiş olsaydı, bu olmazdı.
Arseni Mourzenko

Sanırım sen ve ben katılıyorum, ancak cevaplarınız gelişmeyi caydıracak şekilde okuyor. Ben sadece bununla yüzleşemem.
RubberDuck

3

Geliştirme sürecinizin bir parçası olarak kod incelemeleri yapıyorsanız; incelemekte olduğunuz kodu 'yargıladığınız' kuralları belirlemeniz gerekir.

Bu, 'tamamlanmış tanımınıza' girmeli ve kod tabanı veya statik analiz için bir stil kılavuzu, mimari belge olabilir, yasal gereklilikleri kontrol edebilir, şirket 'kod kalitesi' için ne isterse karar verir

Bunu yerine koyduktan sonra kod yorumları elbette bir konu haline gelir, stil kılavuzu takip edilir mi, gerekli test kapsamı yüzdesi vb.

Bunu yerine koymadıysanız, kod incelemeleri sadece en büyük kodlamaya kimin sahip olduğu veya sizin durumunuzda olduğu gibi, son başvuru tarihinden önce yapılan özelliklere karşı yeniden düzenleme hakkındaki karar çağrılarının sorgulanması olabilir. Bu sadece herkesin zamanının kaybıdır.


3

Ana sorun, önemli bir yeni özellik üzerinde bir kod inceleme bu tartışma için yanlış zaman olmasıdır. Bu noktada küçük değişiklikler dışında bir şey yapmak için çok geç. Doğru yer planlama aşamasında veya en geç bir ön tasarım incelemesinde. Şirketiniz en azından gayri resmi olarak bu erken incelemeleri yapmıyorsa, önce bu kültürü değiştirmeye çalışmalısınız.

Bir sonraki adım, kendinizi bu toplantılara davet etmek ve bu toplantılarda verimli fikirlere sahip olmaktır. Çoğunlukla bu, her şeyi bir gecede değiştirmeye çalışmak değil, ancak ısırmaya ve başa çıkabileceğiniz ısırık boyutlu parçalar aramak anlamına gelir. Bu parçalar zamanla önemli ölçüde artacaktır.

Diğer bir deyişle, anahtar, projenin başlangıcında, sona doğru daha büyük değişiklikler önermek yerine vurulmak yerine düzenli olarak daha küçük değişiklikler önermektir.


2

Ben kod inceleme yaptığım yerlerde, (en azından) bazı refactoring yapmak için bir taahhüt ile geliyor, ben kabul ve kod gönderme Tamam. Dosyalanmış bir hata, bir hikaye olarak veya (bazı) yeniden düzenleme ile başka bir inceleme gönderme sözü olsun.

Bu durumlarda, incelemek için kodu yazan kişi benim, genellikle iki değişiklik, biri benim yeni özellik (ler) veya hata düzeltmeleri, sonra başka bir temizlik ve bazı temizlik hazırlar. Bu şekilde, temizleme değişiklikleri yeni özellik (ler) veya hata düzeltme (ler) i olumsuz etkilemez, ancak kolayca bir belirteç olarak işaret edilir "Evet, bu sorunları çözmediğini biliyorum, ama orada" saf temizlik "yapar".

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.