Yazan : Şadi Evren ŞEKER
Bu yazının amacı, özellikle uç programlama (extreme programming) konusunda sıkça kullanılan aşamalardan birisi olan planlama oyunu (planning game) kavramını açıklamaktır.
Planlama oyunu, aslında belirli zaman kutularında (time box, zaman aralıkları) yapılan toplantılara verilen isimdir. Örneğin haftada bir yapılan toplantıladır ve bu toplantılarda iki önemli kısım bulunur:
-
Sürüm Planlaması (Release Planning): Bu kısımda, yakın dönem sürümlere odaklanılır, bu planlama aşamasında müşteri ile ortak olarak çalışılmaktadır. Sürüm planlamasında üç temel aşama vardır:
-
Keşif Aşaması (Exploration Phase): Bu aşamada, müşteri kendisi için yüksek öneme haiz işlerin kısa bir listesini sunar. Bu bilgi ayrıca ileride kullanılmak üzere kullanıcı hikayesi kartına (user story card) yazılarak kaydedilir.
-
Taahüt Aşaması (Commitment Phase) : Bu aşamada iş tarafı ve yazılımcı tarafı, bir sonraki sürüm tarihi ve bu sürümdeki fonksiyonel özellikler konusunda taahütleşirler.
-
Yönlendirme Aşaması (Steering Phase) : Bu aşamada, planda değişiklikler yapılarak ilerlenir, yeni ihtiyaçlar eklenebilir veya mevcut ihtiyaçlarda değişiklik yapılarak çıkarılması tartışılabilir.
-
-
Dönüş Planlaması (Iteration Planning): Bu aşamada program geliştiricilerinin yapacakları işlemler ve görevleri planlanır. Bu aşama geliştirme ekibi içinde yapılan planlamadır ve müşteri tarafı katılmaz. Dönüş planlamasının da kendi içinde üç ayrı alt aşaması bulunmaktadır.
-
Keşif Aşaması (Exploration Phase) : Bu aşamada ihtiyaçlar farklı görevlere çevrilir. Bu görevler daha sonra kullanılmak üzere görev kartlarına (task card) kayıt edilir.
-
Taahüt Aşaması (Commitment Phase): Görevler programcılara atanır ve bu görevlerin zamanı ve son tarihinin tahmini yapılır.
-
Yönlendirme Aşaması (Steering Phase) : Görevlerin işletilmesi sağlanır ve sonuçların daha önceden hazırlanan kullanıcı hikayeleri (user story) ile uyumu kontrol edilir.
-
Planlama oyununun genel amacı, ara sürümlerle üretilen ürünün teslime hazır hale getirilmesidir. Burada klasik programlama yaklaşımına göre en büyük farkı, ürünün tamamlanması ve tam olarak bitmiş ürüne ihtiyaç duyulan tarih ve bitmiş ürünün kullanılma geçirildikten sonra yaşanacak problemlerin tahmini gibi zor işleri bir seferde ve büyük risk alarak yapmak yerine projeyi yönlendirerek teslime hazır hale getirmektir.
Sürüm Planlaması (Release Planning)
-
Keşif Aşaması(Exploration Phase) : Bu aşama, dönüş işlemi olarak görülebilir ve bu aşamada ihtiyaçlar toplanır ve aşağıda listelenen ihtiyaçların işe olan etkileri araştırılır.
-
Hikaye Yazma : Bu aşamada, kullanıcı hikayesi (user story) ismi verilen bir hikaye hazırlanır. Genelde bir toplantı şeklinde geçen ve kullanıcının problemlerine ve ihtiyaçlarına odaklanılan bu aşamada, kullanıcının istediği sistemi ve bu sistemin parçalarını tanımlamasına ve nasıl çalışması istediğini anlatmasına yardımcı olunur. Bu aşamada, olumsuz etkisi olmaması için, programcıların hikayeye etkisinin olmaması beklenir ve oluşturulan hikaye kullanıcı hikaye kartına (user story card) yazılır.
-
Hikaye Tahmini: Bu aşamada programı geliştirecek olan yazılımcı ekibinin, istenen özellikleri içeren kullanıcı hikaye kartına göre bir süre tahmini yapması beklenir. Bu aşamadaki geliştirme çözümlerinin iş mantığına müdahalesine izin verilmez, sadece tanımlı iş mantığının geliştirilmesi için tahmin yapılması beklenir.
-
Hikayenin Bölünmesi: Bu aşamada hikaye alt parçalara bölünür. Döngü başlamadan önce kritik karmaşıklıktaki parçalar tespit edilir. Şayet programı geliştirecek olan programcılar, hikayeyi tahmin etmekte güçlük yaşıyorsa, hikayenin yeniden bölünerek yazılması gerekir.
Şayet iş sürecinde yeni bir işlem yapılması gerekmiyorsa, taahüt adımına geçilir.
Taahhüt Aşaması
Bu aşamda, yazılımın geliştirme sürecine dahil olan bütün taraflar, belirli taahütler altına girmiş sayılır. Bu aşamanın amacı, maliyet, çıkarlar ve zamanlama konusunda kesin sonuçlar elde etmektir ve dört bileşeni bulunur:
-
Değere göre sıralama: Kullanıcı hikayelerini iş sürecindeki kişiler değerine göre sıralar
-
Riske göre sıralama: Geliştirme ekibi, hikayeleri taşıdıkları risklere göre sıralar. Bu aşamda üç tip risk tanımı yapılabilir, düşük orta ve yüksek. Ayrıca risk araştırması sırasında farklı açılardan konu ele alınabilir. Tamamlılık (completeness), yani bir hikayenin bütün detaylarını biliyor muyuz? Değişkenlik (volatility) yani bir hikayenin ileride değişme ihtimali bulunuyor mu? Karmaşıklık (complexity) yani bir hikayenin tamamlanması için ne kadar emek harcanması gerekiyor? Bu sorulara düşük orta veya yüksek cevapları verilerek daha sonra ortalaması alınıp hikaye için bir değerlendirme yapılabilir.
-
Hıza göre sıralama: Geliştirme ekibi, hikayeleri, geliştirme sürelerine ve projenin en hızlı bitmesine yardımcı olacak şekilde sıralarlar.
Konuya göre seçim: Kullanıcı hikayeleri arasından, çıkacak ilk sürümde bitmesi gerekenler seçilir.
Yönlendirme aşaması (Steering Phase): Bu aşamda, iş sürecinden veya programlama sürecinden kişiler projeyi yönlendirebilirler. Buna göre bu kişiler projede değişiklik yapabilir. Bireysel olarak kullanıcı hikayeleri ele alınıp, değişik kullanıcı hikayeleri ile olan bağlantıları incelenip bu hikayelerin öncelikleri belirlenebilir.
Dönüş Planlaması (Iteration Planning): Bir dönüş 3 temel unsurdan oluşur, bunlar keşif aşaması (exploration phase), taahhüt aşaması (commitment phase) ve yönlendirme aşaması (steering phase) olarak sıralanabilir ve detayları aşağıda sunulmuştur.
-
Keşif aşamasında, projedeki görevlerin ve bu görevlerin sürelerinin tahmini yapılır. Bu aşamada aşağıdaki adımlar izlenebilir:
-
İhtiyaçların göreve dönüşmesi: Görev kartlarına işlenir
-
Görevlerin birleştirilmesi veya bölünmesi: Şayet programcı bir görevin çok küçük veya çok büyük olmasından dolayı tahminde bulunamıyorsa, görevi alt parçalara bölmek veya birleştirmek gibi yollar izleyebilir.
-
Tahmin: Bu aşamda programcı görevin süresini tahmin eder.
-
Taahhüt aşaması (commitment phase): Bu aşamda, kullanıcı hikayelerine dayanılarak programcılara planlama kapsamındaki görevleri atanır. Bu atama işlemi ve programcıların taahhüde girmesi aşağıdaki adımlardan oluşur:
-
Programcı görevi kabul eder: Her programcı, kendi sorumluluğunu alabileceği bir görevi kabul eder.
-
Programcı görevi tahmin eder: Programcı sorumluluğuna aldığı görev ile ilgili tahminde bulunur.
-
Yük çarpanının belirlenmesi (load factor): Yük çarpanı, programcının kendisine atanan görev ile ilgili her döngüde ne kadar vakit harcayacağını belirler. Örneğin haftada 40 saat harcanacak bir iş atandıysa, döngünün her dönüşünde programcı bu görev ile ilgili 40 saat harcamakla yükümlüdür. Elbette bir programcının uygunluğuna göre birden fazla görev alması söz konusu olabilir ve döngü süresi örneğin 1 hafta olan bir çalışma ortamında programcı 5 saatlik 3 görev 10 saatlik 1 görev gibi farklı boyutlarda ve dolayısıyla farklı yük çarpanına sahip görevlere atanabilir.
-
Dengeleme (Balancing): Bir ekipte bulunan bütün programcılara görevler atandıktan sonra bu görevlerin süre tahminleri ve yük çarpanları üzerinden son bir kere gçeilerek karşılaştırma yapılır. Örneğin bir proje ekibinde haftalık toplam 5 saat yük çarpanı olan bir programcı ve haftalık toplam 40 saat yük çarpanı olan başka bir programcının bulunması sağlıklı değildir. Şayet 40 saatlik tek bir görev bulunuyorsa ve tek bir kişiye atanması gerekiyorsa, geri dönülerek görevin alt görevlere bölünmesi yolu izlenebilir.
-
Yönlendirme Aşaması (Steering Phase) : Görevlerin yönlendirilmesi aslında dönüşün son adımıdır ve aşağıdaki adımlardan oluşur:
-
Bir görev kartının alınması: Programcı daha önce taahüdü verdiği görev kartılarından birisini üzerine alır.
-
İkili arkadaşını bul: Programcı bu işte beraber çalışacağı ekip arkadaşı ile eşleşir. Bu işlem aslında ikili programlama (pair programming) olarak bilinen yaklaşımdaki iki kişinin bir görev kartı üzerinde eşleşmesidir.
-
Görevi tasarla: Şayet gerekiyorsa, görevin fonksiyonel tasarımını programcılar yaparlar.
-
Birim testi yaz (unit test): Programcılar, programlamaya başlamadan önce bu programdan bekledikleri görevlere uygun olarak yerine getireceği testleri yazarlar.
-
Kodu yaz: Bu aşamada kod yazılır.
-
Testi çalıştır: Kod bittikten sonra, programcılar daha önceden belirledikleri testleri bitmiş kod üzerinde çalıştırırlar.
-
Temizleme (refactor) : Bu aşamada, kodda bulunan kod kokuları (code smells) temizlenir.
-
Fonksiyonel Test: Bu aşamada kullanıcının hazırladığı kullanıcı hikayesine uygun olarak fonksiyonel gereksinimlerin sağlanıp sağlanamadığı test edilir.
Planlama oyunu, sadece planlama aşamasında yapılan işlemlerden oluşur ve yukarıdaki yazıdan da anlaşılacağı üzere her aşamada bir planlama yapılması söz konusudur. Ancak burada dikkat edilecek husus, aslında yukarıdaki adımların tamamının bir döngünün alt adımları olduğudur. Yani birinci dönüşten sonra tekrar en başa dönülerek yeni bir sürüm için yeniden aynı adımlar takip edilir.