Test Odaklı Geliştirmenin (Kabul) Göreli Maliyet Verimliliği


15

Yazılım geliştirmeye daha "geleneksel" bir yaklaşımın aksine, kaynak planlamasının bir yazılım projesi üzerindeki genel etkisinin ne olduğunu, projenin gereksinimlerinin ve tasarımının otomatik kabul testleri ve birim testleri ile yönlendirildiğini bilmek istiyorum.

resim açıklamasını buraya girin

Deneyiminize göre, daha "geleneksel" geliştirme metodolojilerinin aksine, TDD kapsamında bir yazılım projesini tamamlamak için kaynak gereksinimleri üzerindeki genel etki nedir? Testin daha önce yapıldığı için kalitenin artacağı ve belirsizlik miktarının azaldığı açıktır, ancak testlerin önceden yapılması, başarılması için daha fazla geliştirici saati gerektiriyor gibi görünüyor. Geliştirme çabası ne kadar artar veya hataların önden ortadan kaldırılması nedeniyle gerçekten azalır mı?

Müşteriden ne kadar fazla çaba gerekiyor? Özellikle büyük tasarıma alışkınlarsa, projeyle olan ilişkilerini değiştirmek zorundalar mı? Müşterinin genel olarak ihtiyaç duyduğu saat sayısı artıyor mu yoksa gerçekten azalıyor mu?

Bir TDD projesinin başlangıcında yinelemeli bir TDD sürecinde zaman tahminlerinin çok belirsiz olacağını hayal ediyorum (Yazılım Geliştirme Planı olmadığından). Diyelim ki,% 20'lik bir projeye, güvenin müşteriye az ya da çok sabit bir zaman ve para tahmininin sağlanmasına yetecek kadar arttığı bir nokta var mı?

Not: Burada öznel görüşler veya teoriler aramıyorum, bu yüzden lütfen spekülasyon yapmayın. TDD'de gerçek dünya deneyimini daha çok arıyorum.


Eminim gerçek dünya verisi yoktur. Sadece insanların gerçek dünya deneyimine dayanan öznel görüşler ve teoriler alırsınız.
Euphoric

1
@Euphoric: Gerçek dünya deneyimine dayanan nesnel gözlemler ve gerçekler arıyorum. Üzgünüm bunu netleştirmedim. Ancak, zor sayılara ihtiyacım yok; Gibi genel izlenimleri kabul edeceğim: "Geliştirme süremiz önemli ölçüde artarken, yazılım daha güvenilir olduğu için müşteri maliyetlerimiz azaldı ve müşteri, geliştirme çabası boyunca tasarıma katıldıkları için yazılımı daha iyi anladı."
Robert Harvey

2
Peki, bu görüşe dayalı bir soru mu? Kesinlikle biri gibi geliyor
BЈовић


@ BЈовић: Soru bedenimdeki son paragrafa bakın.
Robert Harvey

Yanıtlar:


11

Belirtilmesi gereken ilk şey, TDD'nin yazılımın kalitesini (kullanıcının bakış açısından) mutlaka artırmamasıdır. Gümüş bir kurşun değil. Her derde deva değildir. TDD'yi neden yaptığımız hata sayısını azaltmak değildir.

TDD öncelikle daha iyi kodla sonuçlandığı için yapılır. Daha spesifik olarak TDD , değiştirilmesi daha kolay olan kodla sonuçlanır .

TDD'yi kullanmak isteyip istemediğiniz daha çok proje için hedeflerinize bağlıdır. Bu kısa vadeli bir danışmanlık projesi olacak mı? Yayına başladıktan sonra projeyi desteklemeniz mi gerekiyor? Önemsiz bir proje mi? Bu durumlarda eklenen ek yük buna değmeyebilir.

Ancak deneyimlerime göre, bir projede yer alan zaman ve kaynaklar doğrusal olarak arttıkça TDD için değer teklifinin katlanarak arttığı görülmektedir.

İyi birim testleri aşağıdaki avantajları sağlar:

  1. Birim testleri geliştiricileri istenmeyen yan etkiler konusunda uyarır.
  2. Birim testleri, eski ve olgun sistemlerde yeni işlevlerin hızlı bir şekilde geliştirilmesini sağlar.
  3. Birim testleri, yeni geliştiricilere kodun daha hızlı ve daha doğru bir şekilde anlaşılmasını sağlar.

TDD'nin bir yan etkisi daha az hata olabilir , ancak maalesef çoğu hatanın (özellikle en kötü olanların) genellikle belirsiz veya kötü gereksinimlerden kaynaklandığı veya ünite testinin ilk turu tarafından kapsanmayacağı tecrübemdir.

Özetle:

Sürüm 1'deki geliştirme daha yavaş olabilir. Sürüm 2-10'daki geliştirme daha hızlı olacaktır.


1
Ben "yazılımın kalitesini" artırmaktan farklı olmak "daha iyi kod" açık yan yana gibi, yani programcıların kodda değer şeyler mutlaka müşterinin istediği şeyi yapmak değildir.

1
Ön kabul testleri ve birim testlerinin gereksinimleri açıklığa kavuşturması gerekmiyor mu?
Robert Harvey

@RobertHarvey Onlar gerektiğini olabilir ama değil mutlaka . Birim testleri ve kabul testleri, geliştiricinin gereklilikleri yazılırken anlamasını yansıtacaktır. Geliştiriciler, yazılımı yazmaya başladıklarında, tam bir anlayıştan, gerekliliklerin anlaşılmamasına kadar her şeye sahip olabilirler. Denklemin bu kısmı, her şeyden çok müşteri ve ürün yöneticisine bağlıdır. Teorik olarak, testler çok yardımcı olmalıdır. Uygulamada, "duruma göre değişir".
Stephen

1
Açıkça belirtmeliyim ki, TDD'yi içeren bir SCRUM uygulaması değil, burada TDD'den ayrı olarak bahsediyoruz. Tek başına, TDD yazma testleri ile ilgilidir, böylece daha iyi kod yazabilirsiniz ve daha sonra daha hızlı ve daha güvenli bir şekilde yeniden düzenleyebilirsiniz.
Stephen

1
@Stephen: Belki de gereksinimleri toplama sürecinin bir parçası olarak kabul testlerini içeren TDD'nin lezzetinden bahsettiğimi daha net hale getirmeliydim. Soruyu daha net hale getirmek için bir grafik ekledim.
Robert Harvey

6

Test Odaklı Geliştirme Hakkında Yazılım Yapma bölümünde burada tartışılan makaleye atıfta bulunan bir bölüm var .

Microsoft'ta üç geliştirme ekibi ve IBM'de TDD'yi benimsemiş bir geliştirme ekibi ile vaka çalışmaları yürütülmüştür. Vaka çalışmalarının sonuçları, dört ürünün serbest bırakma öncesi kusur yoğunluğunun, TDD uygulamasını kullanmayan benzer projelere göre% 40 ile% 90 arasında azaldığını göstermektedir. Öznel olarak, ekipler TDD'yi benimsedikten sonra ilk geliştirme süresinde% 15-35 oranında bir artış yaşadı.

Bu sonuçların davanız için genelleştirilebilir olup olmadığı, elbette, TDD taraftarlarının tartışacağı bir şeydir ve TDD'nin detraktörlerinin iddia edeceği yanlıştır.


4
Bu çalışmanın problemi, TDD'yi uyarlamadan önce kodu birim test etmedikleri. TDD sadece benimseyerek kusur sayısını% 40-90 azaltan sihirli bir araç değil
BЈовић

1
@ BЈовић Ben bu gazetenin herhangi bir yerinde "büyü" iddia ettiklerini sanmıyorum. Bazı takımların TDD'yi benimsediğini, bazı takımların da "benzer" iş aldıklarını ve bazı kusur yoğunlukları ve geliştirme sürelerinin kaydedildiğini iddia ediyorlar. Eğer TDD üyesi olmayan takımları yine de herkesin birim testleri yapması için birim testleri yazmaya zorlarlarsa, ekolojik olarak geçerli bir çalışma olmazdı.

Ekolojik olarak geçerli bir çalışma mı? Sorta neyi ölçtüğüne bağlı. Testlerinizi ön plana yazıp yazmadığınızı bilmek istiyorsanız , herkesin sadece TDD grubu değil, birim testleri yazması gerekir.
Robert Harvey

1
@robert Harvey bu, ekolojik geçerlilik değil, değişkenleri karıştırmak meselesidir. İyi bir deney tasarlamak, bunları saptırmayı içerir. Örneğin, kontrol grubu hoc'dan sonra birim testleri yazıyorsa, insanlar denemenin kötü olduğunu iddia ediyorlardı çünkü kontrol grubu vahşi doğada nadir bulunan bir şekilde çalışıyorlardı.

2
Neyse ki olduklarını söylemedim.

5

Size verecek herhangi bir araştırma makalem veya istatistikim yok, ancak deneyimlerimi tarihsel olarak düşük ortalama bir birim test kapsamı olan ve uçtan uca testler olmayan ve yavaş yavaş bir ekip / kuruluşta çalışmaktan alacağım. daha fazla ATDD (ama ironik bir şekilde geleneksel TDD değil ) yaklaşımıyla çıtayı şu anda bulunduğumuz yere taşımak .

Özellikle, proje zaman çizelgeleri aynı organizasyondaki diğer ekiplerde / ürünlerde oynamak için kullandı:

  • 4 haftaya kadar analiz ve uygulama
  • 2 haftalık regresyon testi, hata düzeltme, stabilizasyon ve salım hazırlığı
  • Bilinen kusurları gidermek için 1-2 hafta
  • 2-3 haftalık kod temizleme ve üretim sonrası sorunlar / destek (bilinmeyen hatalar / planlanmamış kesintiler)

Bu saçma bir yük gibi görünüyor, ancak aslında çok yaygın, çoğu kuruluşta genellikle eksik veya etkisiz KG ile maskeleniyor. İyi test edicilerimiz ve yoğun test kültürümüz var, bu nedenle bu konular aylarca / yıl boyunca yavaşça oynamalarına izin vermek yerine erken yakalanır ve ön tarafta (çoğu zaman) sabitlenir. % 55-65 bakım yükü, hata ayıklama için harcanan zamanın% 80'inin genel kabul görmüş normundan daha düşüktür - bu makul görünüyor, çünkü bazı birim testlerimiz ve çapraz fonksiyonel ekiplerimiz (KG dahil) vardı.

Ekibimizin en son ürünümüzün ilk sürümünde, kabul testlerini güçlendirmeye başlamıştık, ancak enfiye etmek için yeterli değildiler ve hala birçok manuel teste güvenmek zorunda kaldık. Serbest bırakma diğerlerinden biraz daha az acı vericiydi, IMO kısmen gelişigüzel kabul testlerimizden ve kısmen de diğer projelere göre çok yüksek birim test kapsamımızdan dolayı. Yine de yaklaşık 2 hafta regresyon / stabilizasyon ve 2 hafta da post prodüksiyon konularında geçirdik.

Buna karşılık, bu ilk sürümden bu yana yapılan her sürümde erken kabul kriterleri ve kabul testleri vardı ve mevcut yinelemelerimiz şöyle görünüyor:

  • 8 günlük analiz ve uygulama
  • 2 günlük stabilizasyon
  • 0-2 kombine günlerde üretim sonrası destek ve temizlik

Başka bir deyişle,% 55-65 bakım yükünden% 20-30 bakım yüküne geçtik. Aynı ekip, aynı ürün, temel fark kabul testlerimizin aşamalı olarak iyileştirilmesi ve düzenlenmesi.

Bunları sürdürmenin maliyeti, sprint başına bir KG analisti için 3-5 gün ve bir geliştirici için 1-2 gündür. Ekibimizin 4 geliştiricisi ve 2 KG analisti var, bu yüzden (UX, proje yönetimi vb. Sayılmaz) 60 üzerinden en fazla 7 adam-gün, ki bu sadece devam etmek için% 15 uygulama yüküne yuvarlayacağım güvenli tarafı.

Her bir serbest bırakma döneminin% 15'ini otomatik kabul testleri geliştirerek geçiriyoruz ve bu süreçte her bir serbest bırakmanın% 70'ini regresyon testleri yaparak ve üretim öncesi ve üretim sonrası hataları düzeltebiliyoruz.

İkinci zaman çizelgesinin birincisinden çok daha kesin ve daha kısa olduğunu fark etmiş olabilirsiniz. Bu, ön kabul kriterleri ve kabul testleri ile mümkün kılınan bir şeydir, çünkü "yapılan tanımını" büyük ölçüde basitleştirir ve bir sürümün kararlılığına daha fazla güvenmemizi sağlar. Başka hiçbir ekip (şimdiye kadar), belki de oldukça önemsiz bakım sürümleri (yalnızca hata düzeltme, vb.) Yapma durumu dışında, iki haftalık bir yayınlama programını başaramadı.

Bir başka ilginç yan etki ise, yayınlama programımızı iş gereksinimlerine uyarlayabilmemiz. Bir kez, başka bir sürümle çakışmak için yaklaşık 3 hafta uzatmamız gerekiyordu ve bunu daha fazla işlevsellik sunarken, ancak test veya stabilizasyon için fazladan zaman harcamadan yapabildik. Başka bir zaman, tatil ve kaynak çatışmaları nedeniyle yaklaşık 1½ haftaya kısaltmak zorunda kaldık; daha az geliştirme çalışması yapmak zorunda kaldık, ancak beklendiği gibi, yeni kusurlar ortaya koymadan test etme ve stabilizasyon için daha az zaman harcayabildik.

Deneyimlerime göre, kabul testleri, özellikle bir proje veya sprintte çok erken yapıldığında ve Ürün Sahibi tarafından yazılan kabul kriterleri ile bakıldığında, yapabileceğiniz en iyi yatırımlardan biridir. Diğer insanların doğru bir şekilde işaret ettiği geleneksel TDD'den farklı olarak, hatasız koddan ziyade test edilebilir kod oluşturmaya odaklanmıştır - ATDD gerçekten kusurları çok daha hızlı yakalamaya yardımcı olur ; her gün tam bir regresyon testi yapan, ancak çok daha ucuz bir testçi ordusuna sahip olmanın örgütsel eşdeğeridir.

ATDD, RUP veya (ugh) Şelale tarzında yapılan uzun vadeli projelerde, 3 ay veya daha uzun süren projelerde size yardımcı olacak mı? Bence jüri hala bu konuda. Deneyimlerime göre, uzun süredir devam eden projelerde en büyük ve en çirkin riskler gerçekçi olmayan teslim tarihleri ​​ve değişen gereksinimlerdir. Gerçekçi olmayan son tarihler, insanların test kısayolları da dahil olmak üzere kısayolları almasına neden olur ve gereksinimlerdeki önemli değişiklikler büyük olasılıkla çok sayıda testi geçersiz kılarak yeniden yazılmasını ve uygulama yükünü potansiyel olarak şişirmesini gerektirir.

ATDD'nin Agile modelleri veya resmi olarak Agile olmayan ancak çok sık sürüm programları olan takımlar için harika bir getirisi olduğundan eminim. Asla uzun vadeli bir projede denemedim, çünkü bu tür bir projede denemek isteyen bir kuruluşta hiç duymadım, hatta duymadım, bu yüzden standart feragatnameyi buraya ekleyin. YMMV ve hepsi.

PS Bizim durumumuzda, "müşteri" fazladan çaba gerekmez, ama biz gerçekten kabul kriterleri yazan özel, tam zamanlı bir Ürün Sahibi var. "Danışmanlık yazılımı" işindeyseniz, son kullanıcıların yararlı kabul kriterleri yazmasını sağlamanın çok daha zor olabileceğinden şüpheleniyorum . Bir Ürün Sahibi / Ürün Yöneticisi, ATDD yapmak için oldukça önemli bir unsur gibi görünüyor ve bir kez daha sadece kendi deneyimlerimden konuşabilmeme rağmen, ATDD'nin bu rolü yerine getirecek biri olmadan başarılı bir şekilde uygulandığını hiç duymadım.


Bu çok faydalı, teşekkürler. ATTD'nin TDD çabasının karakterini değiştirebileceği bana gelmedi, ancak özellikle iyi yazılmış, nispeten hatasız yazılımı zamanında ve bütçesiz olarak ortaya çıkarabilen insanları duyduğunuzda mantıklı. zorunlu olarak birim testlerinden faydalanmak.
Robert Harvey

@RobertHarvey: Açıklığa kavuşturmalıyım - hala TDD sürecinin bir parçası olarak değil, birim testleri oluşturuyoruz. Tipik olarak kabul testleri önce veya ilk geliştirmeye paralel olarak gelir, sonra kod tamamlanır, sonra birim testleri ve yeniden düzenleme yapılır. Bazen TDD'nin bazı geliştiricilerin daha iyi kod yazmasına yardımcı olacağını düşündüm, ancak bunu (henüz) destekleyemiyorum. Her ne kadar kendim için konuşabilsem de - sadece birim testlerini yazarken kendi kodumda çok fazla böcek yakalayıp kusurları tasarlıyorum.
Aaronaught

1

Kaynak gereksinimleri

Deneyiminize göre, daha "geleneksel" geliştirme metodolojilerinin aksine, TDD kapsamında bir yazılım projesini tamamlamak için kaynak gereksinimleri üzerindeki genel etki nedir?

Tecrübelerime peşin test yapılması gerekliliği maliyeti olduğunu hemen hem testine yazmanın ön net bir kabul kriterlerini tanımlayan ve hafifletilebilir. Sadece ön testin maliyeti hafifletmekle kalmaz, aynı zamanda genel gelişimi hızlandırır. Her ne kadar bu hız geliştirmeleri kötü proje tanımı veya değişen gereksinimlerle ortadan kaldırılabilir. Bununla birlikte, bu tür değişikliklere ciddi bir etkisi olmadan hala iyi yanıt verebilmekteyiz. ATDD ayrıca, aşağıdaki durumlarda otomatik test paketi aracılığıyla geliştirici sisteminin doğru davranışını doğrulama çabalarını da önemli ölçüde azaltır:

  • büyük refaktörler
  • platform / paket yükseltmeleri
  • platform geçişi
  • toolchain yükseltmeleri

Bu, sürece dahil olan süreç ve uygulamaları bilen bir takım olduğunu varsayar.

Müşteri katılımı

Müşteriden ne kadar fazla çaba gerekiyor?

Sürekli olarak çok daha fazla yer almaları gerekiyor. Ön yatırımda büyük bir düşüş gördüm, ancak çok daha fazla talep devam ediyor. Ölçmedim, ancak müşteri için daha büyük bir zaman yatırımı olduğundan oldukça eminim.

Ancak, yazılımlarının yavaşça şekillendiğini gördükleri yaklaşık 5 demodan sonra müşteri ilişkisinin büyük ölçüde iyileştiğini gördüm. Herkesin sürece ve beklentilere alıştığı bir ilişki geliştirildikçe, müşteriden zaman taahhüdü zamanla bir miktar azalır.

Proje Tahmini

Bir TDD projesinin başlangıcında yinelemeli bir TDD sürecinde zaman tahminlerinin çok belirsiz olacağını hayal ediyorum (Yazılım Geliştirme Planı olmadığından).

Sorunun ne kadar iyi tanımlandığına ve teknik adayların projeyi karttan çıkartabildiğine (kart tahmini dahil) ilişkin bir soru olduğunu buldum. Projenin iyi tarandığını ve makul bir hız ortalamasına ve standart sapmaya sahip olduğunuzu varsayarak, iyi bir tahmin almanın kolay olduğunu gördük. Açıkçası, proje ne kadar büyük olursa, o kadar fazla belirsizlik söz konusudur, bu yüzden daha sonra devam edeceğine söz vererek büyük bir projeyi küçük bir projeye ayırırım. Müşteriyle bir ilişki kurduğunuzda bunu yapmak çok daha kolaydır.

Örneğin:

Takımımın "sprintleri" bir hafta sürüyor ve koşu ortalaması ve std var. son 14 haftanın sapması. Eğer proje 120 puan ise ortalama 25 ve std elde ederiz. 6 sapması ve ardından bir projenin tamamlandığını tahmin etmek:

Project Total / (Mean Velocity - (2 * Std. Deviation) = 95% Time Estimate
120           / (25            - (2 * 6             ) = 9.2 weeks

Biz 2 Std kullanın. % 95 güven tahminimiz için sapma kuralı. Uygulamada genellikle ilk aşamada projeyi tamamlarız. sapma, ama bizim ortalamanın üzerinde. Bunun nedeni genellikle ayrıntılandırmalar, değişiklikler vb.


Yani temelde söylediğiniz şey, TDD'nin paydaşları açık, eyleme geçirilebilir şartlar ve kabul kriterleri sağlamak gibi yapmaları gereken şeyleri yapmaya teşvik ederek geliştirme çabalarını geliştirmesidir.
Robert Harvey

1
Sadece bu da değil. Proje ilerledikçe artan katılım, geliştirici ve paydaşlar arasında daha iyi bir görüşme yapılmasına olanak tanır. Bu, dev gibi şeylerin daha az maliyetli alternatifler sunmasına izin verir, çünkü paydaşların ne istediğini anlamaları daha da arındırılır. Paydaşların, bir şeylerin eksik olduğunu fark ettikleri veya geliştiricilerin böyle antagonistik bir yanıtı olmadan çalışmadığı için gereksinimleri daha erken değiştirmelerine izin verir; ve genellikle paydaşlardan gelen mantıksız beklentilerin çoğu olmadan.
dietbuddha

-1

Testlerin önceden yapılması, başarmak için daha fazla geliştirici saati gerektirecek gibi görünüyor. Geliştirme çabası ne kadar artar veya hataların önden ortadan kaldırılması nedeniyle gerçekten azalır mı?

Bu aslında doğru değil. Geliştiricileriniz birim testleri yazıyorsa (ve yapmaları gerekiyorsa), zaman yaklaşık olarak aynı veya daha iyi olmalıdır. Daha iyi dedim, çünkü kodunuz tamamen test edilecek ve gereksinimleri yerine getirmek için sadece kod yazmak zorunda kalacaklar.

Geliştiricilerle ilgili sorun, yazılımı olabildiğince genel hale getirmek için gerekli olmayan şeyleri bile uygulama eğilimindedir.

Müşteriden ne kadar fazla çaba gerekiyor? Özellikle büyük tasarıma alışkınlarsa, projeyle olan ilişkilerini değiştirmek zorundalar mı? Müşterinin genel olarak ihtiyaç duyduğu saat sayısı artıyor mu yoksa gerçekten azalıyor mu?

Önemli değil. Gereksinimleri kim yapıyorsa, bunu mümkün olduğunca iyi yapmalıdır.

Eğer çevik bir gelişim yolu yaparsanız, bu ön tarafta büyük tasarım anlamına gelmez. Ancak, gereksinimler, mimari ve tasarım ne kadar iyi yapılırsa - kod kalitesi artacak ve yazılımı bitirme süresi azalacaktır.

Bu nedenle, BDUF yapmak istiyorlarsa, yapsınlar. Geliştirici olarak hayatınızı kolaylaştıracaktır.


1
Anladığım kadarıyla TDD ve BDUF genellikle birbirleriyle uyumlu değildir.
Robert Harvey

3
BDUF genellikle iyi bir geliştirme yönetimi uygulaması ile uyumlu değildir. Ancak bir BDUF projesi TDD tarzında yapılabilir. TDD daha kaliteli bir yazılım geliştirme tekniğidir, BDUF ise gereksinimlerin ortaya çıkarılması için bir tekniktir. Kötü bir teknik ama yine de bir teknik.
Stephen

@RobertHarvey Doğru, ama BDUF yapmak istiyorlarsa - bu onların tercihi. Gerçekten çevik yapıyorsanız, tasarımlarını geliştirmekte özgürsünüz ve yine de TDD yapıyoruz.
BЈовић

bu yüzden birim testi yazdığımda kodumun tamamen test edileceğini ve tüm test geçmesi durumunda, elbette yazılımın hatasız (veya en azından daha iyi) olduğu anlamına gelirsiniz. Bu yüzden sadece benim yazılım her yöntemi test gerekir örneğin "fonksiyon testSqr () {int a = 3; assertTrue (mySqr (a) == 9);} fonksiyon mySqr (int a) {return 9;}"
Dainius

@Dainius Hayır, tekrar okuyun. % 100 kod kapsamı hatasız değildir. Evet, her yöntemi birim test etmelisiniz. Tabii ki, birim test veri tabanı erişimi, GUI, vb. Birim testleri bunlar için değildir.
BЈовић
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.