Açıklanmayan, kirli kodları düzenleme


22

Size kirli kod hakkında bazı sorular sormak istiyorum. Orta dereceli bir projeye kod yazmış bazı acemiler var. Kod çok büyük bir çamur topudur. Gelişmiş programcılar değiller. Sadece biraz java hakkında klavyeyi kullanmayı biliyorlar. Ana sınıflarında 12 000 satırlık kod yazdılar, ancak 6 000 satır NetBeans'a ait.

Benim işim kodu analiz etmek ve kodu korumanın iyi bir yolunu önermek. Benim fikrim projeyi hurdaya çıkarmak ve OOP metodolojisi ile yeni bir proje başlatmak. Son zamanlarda sorun hakkında bazı notlar ve fikirler topladım, bu siteden ve diğerlerinden.

Şimdi, aşağıdaki soruları var:

  1. Kodu tamir edip bir OOP olarak değiştirmeli miyiz? Şimdi hata ayıklıyoruz.
  2. Kodda yorum yok, dokümantasyon yok, özel programlama stili yok. Bunu değiştirmek gerçekten pahalı ve zaman alıcı. Bu konuda ne yapabiliriz?
  3. Onlara tüm kuralları takip etmeyi nasıl öğretebilirim (yorum yapma, OOP, iyi kod kalitesi vb.)?
  4. Kod hatalı ve hata eğilimli. Ne yapabiliriz? Test yapmak? Düzeltme için neredeyse iki ya da üç A4 kâğıt yazıyoruz, ancak bu sonsuz görünüyor.

Onlarla yeni olduğumu söylemeliyim. Sanırım projeye çok geç insan ekleme konusunda da kuralları çiğnediğimi düşünüyorum. Onları bırakmam gerektiğini mi düşünüyorsun?


Bunun iki veya üç soruya bölünmesi gerekiyor, şu anda çok geniş.
Jon Hopkins,

2
Bu proje sürüm kontrolü altında mı?
JBRWilkinson

2
Geçerli kod üretimde mi?
JeffO,

Evet Jeff. Bu bir üretim, finansal sorunların yönetimi için bir yönetim projesidir!
Salivan

Üzgünüm JBR, böyle bir şey duymadılar. Sadece sabit diskin her yerine kopyala yapıştır kodlarının bir kupasını yapmak, sürüm kontrolü yapma teknikleridir.
Salivan

Yanıtlar:


36

Adım 0: SCM'ye Yedekleme

Çünkü, yorumlarda JBRWilkinson tarafından belirtildiği gibi, sürüm kontrolü (geri dönüşü olmayan) felakete karşı ilk savunma hattınızdır.

Ayrıca yedekleme yazılımı yapılandırma ayrıntılarını, çıktılar oluşturma prosedürlerini vb.

1. Adım: Önce Test Et

Ardından testler yazmaya başlayın :

  • ne işe yarıyorsa
  • ve başarısız olan şey için.

Ne yapmaya karar verirsen ver, işin bitti. Şimdi ikisini de yapabilirsiniz:

  • sıfırdan başlamak ve yeniden yazmak ,
  • veya düzelt .

Tavsiyem , genel mimariyi sıfırdan başlatmak , ancak kontrol noktalarını doğrulayan parçaları karışıklıktan çıkarmak ve uygun gördüğünüz şekilde yeniden yansıtmak olacaktır.

Adım 2: Doğrulayın ve İzleyin

Sürekli Bir Entegrasyon sistemi kurun ( adım 0 ve adım 1'i tamamlamak için ) VE Sürekli Denetim sistemi ( adım 4'e hazırlamak için ).

Adım 3: Devlerin Omuzlarında Durun

(her zaman gerektiği gibi ...)

4. Adım: Temizleyin

Bu tür söylemeye gerek yok, ancak kodun kendisiyle dolaşmak yerine, tasarımdaki ve uygulamadaki hataları bulmak için basitçe kodları / statik analizörleri ve kırık kod tabanında diğer araçları çalıştırmak isteyebilirsiniz.

O zaman temizlik hizmetinde biraz yardımcı olacak bir kod formatlayıcı çalıştırmak isteyebilirsiniz.

5. Adım: İnceleme

Yenileme yaparak veya temizlik yaparak küçük böcekleri kolayca ortaya çıkarabilirsiniz . Bir tuşa yalnızca yanlış bir seçim ve hızlı bir şekilde basmak yeterlidir ve ilk başta farketmeden oldukça önemli bir şeyi silebilirsiniz. Ve bazen etki sadece aylar sonra ortaya çıkacaktır. Elbette, yukarıdaki adımlar bundan kaçınmanıza yardımcı olur (özellikle güçlü bir test kablo demeti uygulayarak), ancak ne yapıp ne kaymayacağını asla bilemezsiniz. Bu nedenle, yeniden yansıtmalarınızın en az bir diğer özel göz topu çifti (ve tercihen bundan daha fazlası) tarafından incelenmesini sağlayın.

Adım 6: Gelişim Sürecinizi Gelecek Belgesi

Yukarıdakilerin hepsini alın ve eğer değilse, normal gelişim sürecinizin doğal bir parçası haline getirin. Bunun saatinizde tekrar olmasına izin vermeyin ve sürecinizde güvenceleri uygulamak ve politikalarınızda bunu (hatta mümkün ise) uygulamak için ekibinizle birlikte çalışmayın. Temiz Kod üretmeyi öncelikli yapın.


Ama gerçekten, test et . Çok fazla .


Harika bir öneri - sorunları yakalayabilecek testleriniz varsa ne kadar zarar verdiğiniz önemli değil. Elbette, hepimiz zaten sürüm kontrolüne sahip olduklarını varsayıyoruz ..
JBRWilkinson

@JBRWilkinson: Aslında iyi bir nokta! Gerçekten de, tamamen yaptıklarını varsaydım.
haylem

2
İlk önce sürüm kontrolünü başlat; geç olsun güç olmasın.
JeffO

@Jeff O: evet, zaten cevaba eklediğim şey bu.
haylem

Düzenlemelerden sonra netleştirmek için yeniden yazıldı. Sol atıflar :)
haylem

15

Şahsen, ben bu projeye Legacy Code ile Etkili Çalışmanın bir kopyası elime geçene kadar başlamazdım . Cidden, bu tür bir şey için yazılmıştır. Zor kodlarla baş etmek için stratejilerle dolu ve size burada verebileceğimden çok daha fazla ayrıntıya giriyor.


1
Her şeyi söyleyen kapsamlı harici referans kullanımı için +1.
haylem

Ne yazık ki, burada insanların kitap okumaktan haberi yok. Sadece işe yarayan bir proje geliştirmek, ihtiyaçları olan tek şey. Ben de bahsettiğim kitabı ve KOD KOMPLE 2'yi de okumaya başladım. Harika yazılmışlar diyelim.
Salivan

1
@Salivan - Belki de birileri onları bu tür kitapların okumaya değer olduğuna ikna etmemişlerdir. Keşke onlarla çalışan ve bu tür kitapları okumakla ilgilenen biri olsaydı ...
Jason Baker

1
@Salivan - önemli olan çabuk bir galibiyet ya da iki tane bulmak. Hemen hemen geri ödemesi olan bir şey yapın. Sürüm kontrolü gibi, bu yüzden bir dahaki sefere birileri "bu nasıl oldu" dediğinde onu arayabilirsin. Ardından WELC kopyanızı okumanızdan bazı önerilere yönlendirin. Sadece onlara kitap atma.

2
@Salivan Kitaplarını onlar için okuyabilir ve içeriğini tavsiye olarak bırakabilirsin. Takım gurusu olabilirsin.
MarkJ

8

Orada birkaç kez bulundum. Kuralım şudur: yazılım önemsiz değilse (sahip olduğunuz kaynak için 1 haftadan daha fazla iş varsa) ve çalışıyorsa, o zaman saklayın ve artımlı yeniden düzenleme işlemine geçin.

Yazılım gerçekten işe yaramazsa (çok fazla hata, net olmayan gereklilikler vb.) Sıfırdan yeniden yazmak daha iyidir. Aynı oldukça küçükse.

Yeniden yapılanmadaki nokta (Fowler's kitabında ve Kerievsky'ninki gibi bir http://www.industriallogic.com/xp/refactoring/ ) sistemin çalışmasını sürdürmesi, belki de yeniden yapılanmanın iki kez sürmesi, ancak risklerin sıfır olmasıdır.

Sıfırdan yeniden yazmak, yanlış anlama gereksinimlerinden yanlış uygulamaya kadar (takımın çoğu aynı olacaksa) birçok risk oluşturabilir.

Aslında iki kez sıfırdan başlayarak karmaşık bir prosedür gördüm ve hala beklendiği gibi çalışmıyor.


Mümkünse uygun yöntemler için birim testleri yazmayı da öneririm. İlk başta kodun ne yapması gerektiğini net bir şekilde tanımlamaya yardımcı olacaklar , bu da yeniden düzenleme işlemine yardımcı olacak.
Michael K,

2
Söylemeye gerek yok ... TDD'yi iyi bir kod için (yani yeni) bir zorunluluk olarak kabul ediyorum.
Uberto

En başından itibaren yazmak çok iyi bir fikir. Ama önce çalışmanın bazı diyagramlarına sahip olmanız gerekir. Ama ilişkileri ayıklamak için kodu analiz etmek zorunda kalırsan ne yapacaksın? Ayrıca, projenin büyüklüğü bunu imkansız kılıyor ya da başka programcılar kiralamamızı sağlayacak.
Salivan

Test Odaklı Geliştirme takdir!
Salivan

“Ama ilişkileri çıkarmak için kodu analiz etmek zorunda kalırsan ne yapacaksın?” -> eğer durum buysa, proje ne küçük, ne de kırılmış demektir. Aka. Zamanında bir parçayı yeniden düzenlemeye başlayacağım. Ayrıca bkz. Mikado yöntemi. danielbrolund.wordpress.com/2009/03/28/…
Uberto

2

Tamamen tekrar yazardım. Bazen böyle bir kodu onarmak imkansızdır. Başka bir seçenek de yeni özellikler eklemeden çalışmasını sağlamaktır. Ekibe iyi kod yazmayı öğretmek (iyi tasarlanmış, belgelenmiş, testlerle), şimdi sahip olduğunuz kodu düzeltmelerini sağlar. Herkesin, onun yerine değil, diğer geliştiricilerin kodlarını düzeltmesine / incelemesine izin verin. Bazı denemelerden sonra, bu tür kodları gözden geçirmenin / düzeltmenin neredeyse imkansız olduğunu anlayacaklardır.

İnsanları geç projelere eklemek çok nadiren yardımcı olur. Genellikle son teslim tarihlerini keser. Projeyi başarılı bir şekilde bitirmek için elinizden geleni yapmalı ve sonra ayrılmayı düşünmelisiniz.


Yinelemeli olarak geliştirmeye karşı tamamen yeniden yazmanın maliyeti ne kadardır? Hangi yaklaşım en hızlı sonuçları verir?
JBRWilkinson

@JBRWilkinson Bu bağlıdır. Çalışma kodunuz olduğunda yinelemeli yaklaşım iyidir.
saat

1
@ duros, bozuk kod için, evet. Bu kod üretimde çalışır.

2

Tavsiyem tüm kodu tamamen silmek değil. Bu, her gelişim ekibinin karşılaştığı günlük yaşam sorunudur. Bir seferde kodun bir bölümüne saldırın. Düzelt, temizle, belgele. Ve sonra diğer tarafa geç. Asıl mesele her zaman elinizin altında bazı gönderilebilir kod tutmaktır. Kodun tamamını sıfırdan yeniden yazmak, şu ana kadar harcanan zamanın miktarını alır ve geçerli olandan daha iyi olacağının garantisi yoktur.
Fakat aynı zamanda insanlar kodu bu şekilde yazmaktan kaçınmalıdır. Kod incelemelerinde biraz daha zaman harcayın. Bazı tek tip kodlama stiline uyarlayın. Önce tasarımı tartışın ve sonra kodu yazın. Böyle basit şeyler büyük değişiklikler yapacaktır.

Netscape'in neden gevşek olduğunu anlatan Nice Blog


2
Yeni bir sürüme yeni bir proje başlatmak, eski süreyi güncellemek / hata ayıklamak sırasında (ve bundan kaçınamazsınız, bu yüzden onu hayal etmeyin) birden fazla hareketli hedefe ateş etmeye çalışıyor.
JeffO,

"Bir kerede kodun bir bölümüne saldırmak" işe yaramadı, Manjo. derin bir kederle, kod çok fazla hata içeriyor. Her zaman başka bir şeye dönüşür. Kodun bir kısmına saldırmalı ve imha etmeli ve sonra onu yapmalıyız. Bu düşünceyi yöneticiye bir kez önerdim, ancak kodlayıcıların yeni kodlar yazmaması gerekiyor.
Salivan

@Salivan ... yeni kod yazmam gerekiyor . Eminim yönetim bunu söylüyor. Ancak, bir çukurdayken yapılacak ilk şey kazmayı bırakmaktır (aynı hataları yapmaya devam etmeyin). Bu şartlar altında daha fazlasının yaratılmasına izin vermek için, delik kazmaya devam etmektir. Zor olan kısım, yönetimi ve kodlayıcıların sorunları anlamalarını sağlamaktır.
SeraM

1

Çalışırsa, yeniden yansıtın. Bunu yapmanıza yardımcı olacak araçlar var. Çalışmazsa, büyülü kod geliştirme komutunu kullanın, örneğin deltreeWindows'ta. rm -rfLinux'ta.


2
"Tüm kodu tamamen silmek" önermek özellikle yararsızdır - daha yapıcı bir cevabınız var mı?
JBRWilkinson

LOL. Sana tamamen katılıyorum, ammo!
Salivan

JBRWilkinson: Yeni bir yeniden başlatma yapmak büyük olasılıkla pisliği çalışıp temizlemeye çalışmaktan daha iyi bir yaklaşımdır. Çalıştığım bir şirket bunu denedi ve yıllar geçtikçe çok fazla kaynak harcadılar ve kesinlikle hiçbir yere bulamadılar.
user281377,

@ammoQ, yanlış yaptığınızda gerçekte ne yaptığını görmek için eski koda ihtiyacınız vardır .

1
Thorbjorn: İşe yaramayan koddan bahsediyoruz , değil mi? Doğru şeyi yapmayan uncommented, dirty kodu analiz etmek bana yaratıcılarının zihinsel durumu hakkında her şeyden daha fazla şey söylüyor.
user281377,

1

Kodu tamir edip bir OOP olarak değiştirmeli miyiz? Şimdi hata ayıklıyoruz. [... hata içeriyor, belgeleme yok ...]

Ben orada bulundum, sende benim sempati var. Bununla ilgili bir bakış açısı elde etmenize yardımcı olabilecek bir makale bile yazdım . Ancak kısaca:

Kod içeriyorsa çok fazla çoğaltma , yeniden yazmalısınız. Eğer ayırt edilebilir bir yapı yoksa (açık arayüzler, spagetti), yeniden yapılanma başarısız olur ve muhtemelen tekrar yazmalısınız.

Onlara tüm kuralları takip etmeyi nasıl öğretebilirim?

Kişisel olarak ne kazanabileceklerini göstererek, neden bunu yapmak isteyebileceklerini açıklamaya başlayın. Bununla hemfikir olduklarında ve öğrenmeye istekli olduklarında, onlara shuhari kullanarak öğretmeye başlayın .


Teşekkürler Martin. “Onlara neden kişisel olarak onlardan kazanabileceklerini göstererek bunu yapmak isteyebileceklerini açıklamaya başlayın. Buna katılırlar ve öğrenmeye istekli olduklarında, onlara shuhari kullanarak öğretmeye başlayın.”
Salivan

0

Önerim @ duros'un & @Manoj R'nin cevaplarının bir birleşimidir.

Sıfırdan başlayın, bu kez iyi kod / OOP / yorumladı / etc oluşturmak için aklınızda bulundurun, eski kodunuzdan / kopyalayıp yapıştırın. Eski kodunuzun kötü bölümleriyle karşılaştığınızda, onları yeniden yazın / yeniden düzeltin.

Geliştiricileriniz iyi eğitilmemişlerse, bunları kurslara göndermenin iyi olacağını düşünüyorum. Hızlı değişen BT endüstrisinde düzenli yeniden eğitim için önemlidir

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.