Kod kararlılığını ölçmek için kaynak kodu metrikleri?


17

Yazılımın bir yayın döngüsü sırasında nasıl geliştirildiğini göz önünde bulundurarak (uygulama, test, hata düzeltme, serbest bırakma) Kod satırında değiştirilen kod satırlarında bazı desenleri görebilmeliydi; Örneğin, projenin sonuna doğru, kod daha kararlı hale gelirse, birim zaman başına daha az kod satırının değiştirildiğini görmelidir.

Örneğin, projenin ilk altı ayında, ortalamanın günde 200 satır kod olduğunu, geçen ay boyunca günde 50 satır kod olduğunu ve son hafta boyunca (ürün DVD'lerinden hemen önce) hiçbir kod satırı değiştirilmedi (kod dondurma). Bu sadece bir örnektir ve belirli bir ekip tarafından benimsenen gelişim sürecine göre farklı modeller ortaya çıkabilir.

Her neyse, bir kod tabanının kararlılığını ölçmek için birim zamandaki değiştirilmiş kod satırı sayısını kullanan herhangi bir kod metriği (üzerinde herhangi bir literatür var mı?) Var mı? Bir proje bir yere ulaşıyorsa veya hâlâ salıverilmeye hazır olmaktan uzaksa, bir his elde etmekte fayda var mı? Bu bilgileri bir sürüm kontrol sisteminden çıkarabilecek ve istatistik üretebilecek araçlar var mı?



4
"İkincisi, mekanizma soyut, üretimi tasarımında. Bu açıdan bir program bir şiir gibidir: yazmadan bir şiir yazamazsınız. Yine de insanlar programlama gibi bir üretim süreci ve ölçüsü gibi konuşuyorlar" "Üretilen kod satırı sayısı" anlamında, bu sayıyı defter defterinin yanlış tarafında ayırırlar: her zaman "harcanan kod satırı sayısı" na başvurmalıyız. - Yanlış anlama meyveleri , Edsger W. Dijkstra.
yannis

3
@Yannis Rizos: Hiçbir şekilde LOC tarafından üretkenliği veya kod karmaşıklığını ölçmeyi önermiyorum çünkü bunun iyi bir önlem olmadığını biliyorum. Öte yandan, göndermeden iki gün önce 300 satır kod değiştirilirse, bir yönetici olarak aklımda büyük bir "KIRMIZI UYARI" lambası olurdu (bu planlanmadıysa ve risklerin çok dikkatli bir değerlendirmesinin sonucu değilse) ). Genel olarak, uzun süre değiştirilmeden kullanılan (ve test edilen) kodun, her gün 100 satırın değiştirildiği koddan "daha kararlı" olduğunu varsayabilirim.
Giorgio

2
@Giorgio Argh, başka bir yorum gönderirken (ilkinde char sınırına ulaştı) kesintiye uğradım (burada iş gününün ortasında). Verimlilik hakkında konuştuğunuz anlamına gelmiyordu, Dijkstra alıntısı akla geldi ve bunun ilginç olacağını düşündüm. Her durumda, kod karmaşası metrikleri aradığınıza oldukça yakındır ve üzerinde tonlarca literatür vardır. Aletlere gelince, Atlassian'ın FishEye muhteşem.
yannis

@Yannis Rizos: Gerçekten çok ilginç bir okuma. FishEye'ye gelince, iş yerimizde kullanıyoruz (incelemeler için), bu yüzden derhal kılavuza bakacağım ve ne tür istatistikler üretebileceğimizi göreceğim.
Giorgio

Yanıtlar:


17

Michael Feather'ın tanımladığı bir önlem, " Aktif Sınıflar Seti " dir.

O "kapalı" olanlara karşı eklenen sınıf sayısını ölçer. Sınıf kapanışını şöyle tanımlar:

Bir sınıf, o tarihten bugüne herhangi bir değişiklik yapılmadığı tarihte kapatılır.

Bu önlemleri aşağıdaki gibi grafikler oluşturmak için kullanır: Aktif sınıf şeması

İki çizgi arasındaki boşluk ne kadar küçük olursa o kadar iyidir.

Kod tabanınıza benzer bir önlem uygulayabilirsiniz. Sınıf sayısının kod satırı sayısı ile ilişkili olması muhtemeldir. Hatta bunu, bazı büyük monolitik sınıflarınız varsa, grafiğin şeklini değiştirebilecek her sınıf ölçüsü için bir kod satırı içerecek şekilde genişletmek mümkün olabilir.


4

Özelliklerin sınıflara nispeten tutarlı bir şekilde eşleştirildiği veya dosya sistemi için, gurme gibi bir şeyi sürüm kontrol sisteminize bağlayabilir ve çok hızlı bir şekilde geliştirmenin çoğunun nereye odaklandığını anlayabilirsiniz (ve böylece kodun hangi bölümleri en kararsız).

Bu, nispeten düzenli bir kod tabanına sahip olduğunuzu varsayar. Kod tabanı bir çamur topuysa, esasen bağımlılıklar nedeniyle üzerinde çalışılan her küçük parçayı göreceksiniz. Bununla birlikte, belki de (bir özellik üzerinde çalışırken kümeleme) kod tabanının kalitesinin iyi bir göstergesidir.

Ayrıca, işinizin ve dev ekibinizin bir bütün olarak geliştirmedeki özellikleri ayırmanın bir yoluna sahip olduğunu varsayar (sürüm kontrolünde şubeler olsun, her seferinde bir özellik, ne olursa olsun). Örneğin, aynı dalda 3 ana özellik üzerinde çalışıyorsanız, bu yöntem anlamsız sonuçlar üretir, çünkü ellerinizdeki kod kararlılığından daha büyük bir sorununuz var.

Maalesef, benim fikrimi kanıtlayacak literatürüm yok. Sadece iyi (ve çok iyi değil) kod tabanlarında gurme kullanma deneyimime dayanmaktadır.

Git veya svn kullanıyorsanız ve gurme sürümünüz> = 0,39 ise, proje klasöründe gurme çalıştırmak kadar basittir.


gurme de harika bir araç gibi görünüyor! (+1)
Giorgio

1
Bu cevabı tökezledim, ardından sonraki altı saati Gource ile oynayarak geçirdim. Bunun bir +1 veya -1'i hak edip etmediğinden emin değilim, ama lanet olsun, bu harika bir araç.
RonU

@RonU: Deponun durumunu özel bir zaman aralığında görselleştirmek için gurme kullanabilirsiniz. Bunun amacı, kod tabanınızdaki etkinliği zaman içinde görselleştirmesidir. Bilginin yorumlanması ne kadar kolay, yukarıdaki cevabımda açıkladığım gibi birçok faktöre bağlıdır. Evet, "büyük resim" istiyorsanız inanılmaz bir araçtır, bu yüzden + 1'i hak ettiğini düşünüyorum;)
Carl

Evet, "altı saat" dediğimde, o zaman için bir Gource sim'i çalıştırdım demek istemedim ... sadece birçok seçenekle oynadım, ffmpeg'e bağladım, muhtemelen destansı bir film müziği ekledim. oldukça tavşan deliğiydi. :)
RonU

Tahmin et. Film müzikleri ilmekledi Harlem Shuffle;)
Carl

0

Değiştirilmiş hatların frekansının kod kararlılığı için bir gösterge olarak kullanılması en azından tartışmalıdır.

İlk başta, değiştirilen hatların zaman içindeki dağılımı, büyük ölçüde projenin yazılım yönetim modeline bağlıdır. Farklı yönetim modellerinde büyük farklılıklar vardır.

İkincisi, bu varsayımdaki zayiat net değil - yazılımın istikrarından kaynaklanan ya da son tarihin sona ermesi ve geliştiricilerin şimdi bazı değişiklikler yapmaya değil, ancak serbest bırakmak?

Üçüncü olarak, yeni özellikler eklendiğinde satırların çoğu değiştirilir. Ancak yeni özellik kodu kararlı hale getirmez. Geliştiricinin becerisine ve tasarımın kalitesine bağlıdır. Öte yandan, çok az satır değiştiğinde ciddi hatalar bile düzeltilebilir - bu durumda yazılımın kararlılığı önemli ölçüde artar, ancak değiştirilen satır sayısı çok büyük değildir.


"Geliştiricinin becerisine ve tasarımın kalitesine bağlıdır.": Ancak değişiklikleri test etmek için en azından biraz zamana ihtiyacınız var, böylece herhangi bir hataya neden olmadığınız konusunda yeterince güveniniz olacak. En yetenekli geliştiriciler bile yazım hataları yapabilirler, örneğin baskı altındalarsa, fazla mesai yaptılar veya çok az uyudular. Ayrıca, açık / kapalı prensibini uygularsanız, bir süre sonra değişikliklerin sayısı (hata düzeltmeleri) azalmalıdır. Her neyse, sorumda böyle bir ölçümün sonucunun geliştirme sürecine göre değişebileceğini açıkça belirtmiştim.
Giorgio

BTW, kod geliştiricilerin kötü olduğu için değil, gereksinimlerin net olmadığı ve proje hala bir prototipleme aşamasında olduğu için kararsız olabilir.
Giorgio

@Giorgio: Elbette haklısın. Ama tam olarak bu yazdım: Değiştirilmiş satırların sayısı çok fazla faktöre bağlıdır. Bazıları kod kararlılığı ile ilgili, bazıları değil. Kaç kişinin seks yaptığını, elektrik gücünü ölçerek, daha az güç - daha az ışık - daha fazla seks olduğunu varsaymaya çalışmak gibi. Her ne kadar büyük karartmalardan sonra doğum oranının arttığı kanıtlanmış olsa da. ;)
johnfound

-1

Sağlamlık, bu talimatları ifade etmek için kullanılan metnin niceliği, ayrıntı düzeyi, tersliği, dilbilgisel doğruluğu ile değil, bir talimat setinin doğru işlevi ile ilgili bir terimdir.

Aslında sözdizimi önemlidir ve doğru olmalıdır, ancak bunun ötesinde herhangi bir şey, talimatların 'metriklerine' bakarak talimatların istenen işleviyle ilgili olduğu için, gelecekteki çay bardağı.

Sağlamlık testlerle ölçülür. Birim testleri, duman testleri, otomatik regresyon testleri; testler, testler, testler!

Sorunuza cevabım, sağlamlıktan birine cevap ararken yanlış yaklaşımı kullandığınızdır. Kod satırlarının kod işgal eden satırlardan başka bir şey ifade ettiği kırmızı bir ringa balığıdır. Kodun, istediğiniz şeyi yaptığını test ederseniz, yapmasını istediğiniz şeyi yapıp yapmadığını öğrenebilirsiniz.

Lütfen uygun test kablo demetlerini tekrar ziyaret edin ve kod metri mistisizminden kaçının.

En iyi dileklerimle.


3
Açıkça kod karmaşıklığının bir ölçüsü olarak LoC önermek olmadığını belirtti. Ben kod istikrar bir ölçüt olarak kod değişiklikleri öneriyordu: bir kod parçası istikrarlı fonksiyonel gereksinimleri ve bu gereksinimleri karşılayan istikrarlı, test edilmiş bir uygulama var mı?
Giorgio

Seninle tartışmak istemiyorum ama saygıyla kod metrik anlamsızlığın ahlakından uzak dur. Sorunuzu yeniden okudum ve örneklerinizin tümü, kod satırlarının değişmesi ile sonuçta ortaya çıkan sağlamlık arasındaki ilişkiyi ortaya çıkarma arzusunu gösteriyor. Ne kadar çok kelime yazarsanız, yazım hatası yapma olasılığınız o kadar artar. Ama sorduğunuz şeyde onun prensibine çok karşıyım, görevinizi bu şekilde terk etmekten yanayım. İyi test uygulamaları = iyi sağlamlık olasılığı.
Sassafras_wot

"İyi test uygulamaları = iyi sağlamlık olasılığı.": Kesinlikle katılıyorum. Bu yüzden son zamanlarda değiştirilen bir kod parçasının doğru olduğundan emin olmadan önce tekrar test edilmesi gerektiğini öneriyorum.
Giorgio

İstikrarın birkaç tanımı vardır ve bunlardan biri sizin tartıştığınız şeydir. Yaptığımdan farklı bir anlamsal yorum. "Değişime dirençli" olmaktan ziyade "aşırı değişikliklere tabi değil" demek için kararlı oldum
Dave Hillier
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.