Yazılım Projeleri Nasıl Yönetilmelidir..!
Yaşadığımız dünyayı geçtiğimiz yüz hatta on yıllar ile kıyasladığımızda teknolojik gelişmelerin logaritmik olarak arttığını görüyoruz.
Alpplas Ar-Ge Mühendisi Gömülü Yazılım
Ebru Üstünbaş
Yaşadığımız dünyayı geçtiğimiz yüz hatta on yıllar ile kıyasladığımızda teknolojik gelişmelerin logaritmik olarak arttığını görüyoruz. Çok değil 2000’li yılların başındaki teknoloji ile günümüz teknolojisini kıyasladığımızda bile aradaki fark yadsınamayacak kadar fazla. Beyaz eşyalarımızın internete bağlandığı, kol saatlerimizden telefon bildirimlerimizi alabildiğimiz, otonom araçların, yapay zeka uygulamalarınının gündemde olduğu yıllardayız. Daha mevcut teknolojinin geldiği noktayı anlayamadan kendimizi o teknolojiyi kullanırken buluyor ya da o teknolojinin çoktan evrilerek daha üst seviyelere ulaştığını görüyoruz.
Düşünsenize elinizde altın kaplamalı bir cep telefonu var. Ancak o kadar yavaş çalışıyor ki menüde gezinmeniz bile dakikalar alıyor. Bu durumda telefonun altın kaplamalı olması fonksiyonel açıdan yetersizliğini tolere edebilir mi? Elbette hayır. Bu yüzden teknolojonin ilerleme hızını ivmelendiren en önemli unsur şüphesiz ki yazılım. Bugün şehirlerde, sokaklarda, evlerimizde, ceplerimizde bile yazılım ile kuşatılmış yeni teknoloji ürünleri yer alıyor. Yalnızca günlük yaşantımızda değil fizik, kimya, biyoloji bilimlerinde de modelleme ve simülasyon metotlarında yine yazılım sayesinde birçok problem ve bilinmezlik çözüme kavuşmakta.
Mademki teknolojinin ve bilimin birçok alanında yazılım bu denli önemli, öyleyse yazılım geliştiren tüm firmaların yazılıma dolayısıyla da yazılım projelerine ekstra önem ve öncelik vermesi gerekir öyle değil mi? Ne yazık ki gerçekte durum pek de düşünüldüğü gibi değil. Amerika’da Standish Group tarafından yapılan bir araştırmaya göre yazılım projelerinin; %33’ü bitmeden iptal edilmekte, %53’ünde maliyet tahminleri % 189 oranında aşılmakta, proje süre aşımı ortalama olarak % 222 oranındadır. Bir projenin başarılı olmasını belirlenen zaman ve bütçe dahilinde, koşulan performans gerekliliklerini yerine getirmesi şeklinde tanımlayacak olursak; araştırma verileri gösteriyor ki aslında yazılım projeleri çoğunlukla başarısız sonuçlanmaktadır.
Yazılım projelerindeki başarısızlıklara birçok sebep göstermek mümkün. Öncelikle yazılım, diğer mühendislik alanlarına göre oldukça yeni bir alan. Dolayısıyla yazılım süreçlerinin ve metodolijisinin oturmuş kurallarından bahsetmek güç. Bununla beraber birçok yazılım dili ve yazılım geliştirme aracı bulunmakta. Tüm bu sebepler birçok yazılımcının, yazılım faaliyetlerini kendi kurallarına ve doğrularına göre gerçekleştirmesine sebep olmakta. Hepimiz iş hayatında çalışan bir kodun yeterli olduğu yorumuna veya süreçlerin tanımlanması, ihtiyaç duyulan bilgi ve dokümanların temini, risklerin belirlenmesi, süreçlerin ve iş karmaşıklığının tanımlanması, faaliyet adımlarının dokümante edilmesi gibi proje alt adımlarının fazladan iş yükü veya oyalayıcı işler olarak nitelendirildiğine şahit olmuşuzdur. Bu yorum ve tanımlar bir projenin başarılı bir şekilde yürütülmesini ve tamamlanmasını direkt olarak engellemektedir. Yazılım projeleri de diğer projeler gibi tanımlanan hedeflerine uygun olarak, kalite standartlarının göz önünde bulundurulması mecburi, sürdürülebilir, belli bir disiplin ile gerçekleştirilmesi gereken adımlardan oluşmaktadır. Dolayısıyla çalışan bir kod aslında sadece o günü kurtarır! Yurtiçi ve yurtdışında birçok proje doğru yürütülmediği için herhangi bir müdahale ihtiyacında düzeltilememekte veya geliştirilememektedir. Bunun yerine ister o yazılımın ilk geliştiricileri, isterse yeni devralan bir geliştirici çoğunlukla yazılımı en baştan yapmak zorunda kalır. Bu da ekstra zaman, enerji ve maliyet anlamına gelmektedir. Martin Fowler’ın “Herhangi bir insan bilgisayarın anlayabileceği kod yazabilir. İyi programcılar ise insanların anlayabileceği kod yazarlar. “ sözü belki de bu duruma verilebilecek en güzel cevaplardan biridir. Araştırmacılar günlük hayatta da sıkça karşımıza çıkan yazılım projelerinin başarısız olma sebeplerini 4 temel başlıkta ele almışlardır. Bunlar;
- Teknik nedenler; kullanıcı gereksinimlerinin doğru belirlenmemesi, geçmişe yönelik yazılım ölçüm verilerinin bulunmaması, uygun olmayan, yetersiz veya disiplinsiz test yöntemlerinin kullanılması, yazılım geliştirme faaliyetinin yeniden kullanılabilir bileşenler ile yapılmaması
- Yönetimsel nedenler; gerçekçi olmayan zaman planı ve sürekli zaman baskısı, proje sorumlusunun ve/veya proje takımının doğru belirlenmemesi, ilgisizliği veya teknik olarak yetersizliği, kalite kontrol yaklaşımlarının az kullanılması veya hiç kullanılmaması, problemlerin doğru iletişimin sağlanamaması nedeni ile geç farkedilmesi
- Sosyal nedenler; hataların sonuçlarının deneyimsizlikten ötürü öngörülememesi veya paylaşılmaması, takım içi iletişimin zayıf olması, bölüm ve birimler arası iletişimin zayıf olması
- Diğer nedenler; proje ekibindeki kişilerde sıkça yaşanan değişiklikler, hem yazılım hem de donanımın eşzamanlı olarak birlikte geliştirildiği hibrid projelerin fazla karmaşık olması, teknik personelin genel becerilerinin dışındaki alanlarda projeler yürütülmesi olarak sıralanmaktadır.
Yazılım projelerinin başarısız olma sebepleri incelendiğinde aslında kaçınılması gereken durumların da doğal olarak tanımlanmış olduğu görülüyor. Bir yazılım projesinin başarılı sonuçlanması için her adımının doğru tanımlanması ve yürütülmesi gerekmektedir. Projenin hedeflerinin yalnızca proje ekibi tarafından anlaşılması yeterli bir parametre değildir. Öncelikle tüm isterler ve senaryolar o proje ile ilk kez karşılaşan bir kişinin dahi anlayabileceği şekilde dokümante edilmelidir. Bununla beraber yazılım tasarım dokümanı gibi geliştirilecek yazılımın mantıksal algoritmasını içeren dokümanlar hazırlanmalıdır. Yazılım geliştirme işinin yapılabilmesi için ihtiyaç duyulan tüm teknik dokümanlar sağlanmalıdır ki herhangi bir adım yoruma açık değil istenen veya ihtiyaç duyulan çıktı ile doğrudan örtüşebilsin. Hazırlanan veya temin edilen tüm datalar mutlaka yedeklenen bir ortamda, açık ve anlaşılır şekilde klasörlenerek muhafaza edilmelidir. Aynı zamanda yazılım geliştirilirken versiyonlamanın doğru yapılması, versiyon geçmişinin açık ve anlaşılır şekilde kaydedilmesi gerekmektedir. Böylece herhangi bir müdahale ihtiyacında kolay ve hızlı işlem yapılabilir. Yazılım geliştirme adımları modüler geliştirilmelidir. Bu sayede yazılımın herhangi bir bölümünde yapılan değişiklik genelini etkilememeiş olur. Yazılım ekibi belirledikleri periyotlarda mutlaka bir araya gelerek geçmiş projelerin kazanımları olan öğrenilmiş dersler (lesson learned) veya iyi uygulama (best practices) örneklerini de göz önünde bulundurarak; gerçekleştirilen iş adımları, mevcut durum ve sonraki iş adımları hakkında görüşmeli, yaşanan veya öngörülen problemler hakkında açık iletişim kurmalıdır. Yapılan toplantıların, görüşmelerin sonuçları proje yöneticisine doğru ve açık bir şekilde sunulmalıdır. Bu sayede önceden aksiyon almak, yanlış zaman planı yapmanın önüne geçmek, gerekli bölüm veya birimleri zamanında bilgilendirmek mümkün olacaktır. Aynı zamanda bu görüşmelerin çıktısı olan toplantı notlarının, mevcut projenin öğrenilmiş ders veya iyi uygulama kaynağı olacağı göz önünde bulundurulmalı bu sebeple mutlaka toplantı notları da kayıt altına alınmalıdır. Yazılımın geliştirme adımları kadar test adımları da projenin başarısı için önemlidir. Yazılım testleri doğru tanımlanmış disiplinli bir sınama niteliğinde olmalıdır. Yazılım testleri, yazılım projelerinin kalite kontrol adımlarının belki de önemli bileşenidir. Yapılan testler, sonuçları, testler sırasında karşılaşılanlar ve akabinde alınan aksiyonlar da kayıt altına alınmalıdır ki bir sonraki proje için bir alt yapı ve bilgi birikimi olarak aktarılabilsin.
Yazılım projelerinin başarıya ulaşması için projenin bir sistematiğinin olması mecburidir. Bunun için yazılım süreçlerinin doğru ve anlaşılır tanımlanması gerekir ancak yalnızca süreçleri tanımlamak elbette yeterli değildir. Sürdürülebilir bir başarı; yazılımcının yaratıcılığını ön plana çıkartmak, ona bir saha açmak, aynı zamanda belirlenen sistematiğin uygulanmasını sağlamak ile mümkündür. Süreçlerin tanımlanması; ekibe katılan veya mevcutta işlerini yürüten bir yazılımcının izleyeceği yolların, kişiye veya yoruma bağlı değil önceden belirlenmiş kurallar dahilinde ilerlemesini sağlar. Bu yazılımcıların sistematiği uygulaması için kolaylık sağlarken; müdahale edilmesi gereken eski veya yeni başlayacak bir proje daha az zaman kaybı ve kolaylıkla ilerletilmiş olur. Unutulmamalıdır ki yazılım geliştirmeyi iş olarak yapmakla, bunu severek,tutkulu bir şekilde yapmak tamamen farklı şeylerdir. Bununla ilgili olarak en sık karşılaşılan problemlerden biri de yazılım ekibinin sürekli benzer işler ve problemler üzerinde çalışmasıdır. Bu kişilerin, projelerin dolayısıyla da firmaların gelişimini olumsuz etkileyen durumlardan biridir. Sürekli aynı problemler veya birbirine çok benzer işler ile uğraşan bir yazılımcı hem kendini geliştirmeye hem de yeni şeyler öğrenmeye zaman yaratamazken, yazılımcının yaratıcılığını kullanacak bir fırsat yakalaması da güçleşir. Bu yüzden önceden tanımlanan süreç ve izlenecek adımların olabildiğince kolay ve pratik ilerlemesi gerekir. Bunun için iş adımlarının gerçekleştirilmesini ve takibini kolaylaştıran uygulamalardan yararlanılabilir. Örneğin; otomatik versiyonlama, girilen verilere göre otomatik dokümantasyon gibi. Süreçlerin tanımlanması ve uygulanmasının yanında yazılımcılara doğru görev paylaşımı yapmak da projenin başarısı ile doğrudan ilgilidir. Örneğin daha az tecrübeli bir yazılımcı küçük bir projeyi şevkle yerine getirirken, tecrübe ve becerilerine göre karmaşık bir proje hem kendisinin hem de projenin başarısız olmasına yol açar. Bunun yerine kişilere mutlaka bilgi, tecrübe ve yeteneklerine göre görev paylaşımı yapmak gerekir. Bu hem projenin başarısı hem de çalışanların mesleki tatminleri ve motivasyonları için bir gerekliliktir. Hem firmalar hem de yazılım proje ekipleri, gelişimin teknoloji ile paralel olarak ilerlemesi gerekliliğini göz önünde bulundurmalıdır. Bu yüzden yazılım proje ekibinin teknolojiyi yakından takip etmesi, alanı ile ilgili sürekli okuması ve araştırması, sürekli gelişmesi ve geliştirmesi gerekir. Firmaların da bu gelişim için gereken imkanları sağlaması kaçınılmaz bir gerekliliktir.
Sonuç olarak yazılım projeleri yalnızca kod geliştirme ve kodun çalışması olarak değerlendirilemeyecek kadar karmaşık ve önemlidir. Yazılım projelerinin başarılı olması için tüm anlatılanlardan önce bu anlatılanların gerekliliğine inanmak gerekir.