Ana içeriğe atla

Yazılım Maliyet Tahmineleme Tecrübeleri

Yazılım mühendisliğinde maliyet hesabı her zaman problem olmuştur. "Bu iş kaç Adam/Gün tutar?" sorusuyla sıkça karşılaşıyoruz. Adam/gün veya Adam/ay ölçütleri bir kaynağın/kişinin belirtilen zaman dilimindeki iş gücü anlamına gelir. Tabi bu noktada yine kafa karışıklıkları başlar. 6 A/G'lik bir işi hızlandıralım diye 2 kişi ile yapmaya çalışsak ve kaynak/kod, modül, altyapı, insan vb. her bir şeyi bir kenara bıraksak, matematiksel basit formülle 6/2=3 A/G'de biter? Gerçek hayat böyle değil, öncelikle bunu anlamamız lazım. Hep şu örnek verilir; "Aynı bebeği 2 kadın birlikte daha kısa sürede doğurur mu?" Eğer bunun cevabı "Evet" ise (veya bir gün böyle bir durum ortaya çıkarsa), yazımı değiştirmem gerekecek:)

Mevzu gerçekten derin...Maliyet hesabı; bulunduğunuz firmanın yazılım süreçlerini hangi methodlarla uyguladığına, ilgili işin o dönemdeki aciliyetine, (şirket yönetiminin baskısına:)) vb. bir çok duruma bağlı olabilir.

Örneğin; bizim firmada eğer bir planın tam ortasındaysak, 1-2 saatlik kodlama işi olsa bile, planda tamponumuz varsa, 1 A/G'den daha az A/G verilmemesi gerekir. Neden mi?;
  • Bu iş için öncelikle ihtiyaç analizi girilecek, uniVIP (Univera Versiyon ve İstek Planlama Programı) kaydı oluşturulacak,
  • Maliyet çalışması yapılacak,
  • uhiSYS'de (Univera Hata ve İş Yönetim/Analiz Sistemi) iş kaydı açılıp, konu developer arkadaşa gönderilecek,
  • Developer arkadaş tamamlayacak ve teste delege edecek,
  • Test, ilgili relase'i üretip, set çıkartıp, test edecek, işi kapatacak,
  • Destek departmanı dağıtımı yapacak.
Neyse ki kendi bünyemizde XP(eXtereme Programming) ve yarı TDD (Test Driven Development) içeren bir süreç işletmeye çalışıyoruz. Ekipler birbirine yakın ve süreç hızlı işliyor.
Yine başka bir örnekte; ürünün/projenin teslim aşamasında, pilotta (beta test) olduğumuzu varsayalım. Bir takım süreçsel eksikliklerden dolayı, iş kritik olduğu için gece-gündüz geliştirme yaptığımız da çok olmuştur. O anda kimseye süreç anlatamazsınız (sakın denemeyin). Hedef odaklı işi bitirmek ve projeyi tamamlamak zorundasınız. Fakat şirkete dönüldüğünde bu ekstra maliyet plana mutlaka yansıtılmalıdır. En azından biz yanısıtıyoruz.
Yazılım maliyet tahminleme ile ilgili literatürde bir çok yönteme rastlarsınız. Bunlardan sıkça duyulanı COCOMO (COnstructive COst MOdel) yaklaşımıdır. Ben de kendi şirketimdeyken ve daha geçnken:) bu yöntemlerin türevlerini uygulama gafletinde bulunmuştum:) Gerçek bir senaryonun örneği aşağıda;
Şimdi bu yönteme bakıyorum, o zamanki "beni" anlamaya çalışıyorum. Sanırım tecrübesizliği, teknik olarak alt etmenin bir arayışı (Yazılım dünyasında böyle tiplere rastlamak mümkün). Sakın yanlış anlaşılmasın, yazılım yaşam döngüsündeki süreçleri ve methodları sonuna kadar savunurum, ancak hangi firmada olursanız olun, "hayatın da bir gerçeği var".
Edindiğim tecrübeler şunu gösteriyor, iyi bir yazılım maliyet tahminlemesi için aşağıdaki adımlar temel alınmalı;
  • Öncelikle yazılım iş ihtiyacı/kapsamı net şekilde ortaya konulmalıdır.
  • Tahmini yapacak kişinin sistemin altyapısını ve tasarımını bilmesi gerekmektedir (Tecrübesi ve sorumluluğu kapsamında).
  • Tahmini yapacak kişinin kaynakları iyi tanıması gerekmektedir (Tecrübesi ve sorumluluğu kapsamında).
  • Mutlaka risk hesabının işin içine katılarak, maliyete eklenmesi gerekmektedir (Özellikle başka sistemler ile entegrasyon varsa, %25-30 risk koyduğumu bilirim).
  • Yapılan maliyet çalışması; Analiz, Kodlama/Tasarım, Test, Dokümantasyon, Dağıtım (Duruma göre eklenir) safhaları için ayrıca detaylandırılmalıdır (İşin büyüklüğüne göre proje yönetimi gerekebilir).
Bu durumda dahi mutlaka sapmalar olacaktır. Lakin, zamanla edinilen tecrübelerle ve süreçlerin iyileştirilmesiyle, gerçeğe yakın yazılım maliyet tahminlemeleri yapılabilir.
Deniz KILINÇ

Yorumlar

  1. Zaten COCOMO dan elde edilen bilgi genellikle sembolik kalıyor ve gerçek hayatla denk geldiğine ben hiç şahit olamadım.Bilgilendirme için teşekkür ederim.takipteyim yazılarınızın devamını sabırsızlıkla bekliyorum..

    YanıtlaSil
  2. Bakalım belki bir gün farklı bir efor tahminleme uygularız, sayılarla kandırmanın en güzel yolu bu formüller:)

    YanıtlaSil
  3. Ben,kendi başıma şöyle hesaplıyorum.
    Gün/Adam ekipli projelerde,Tek başıma yaptıgım projelerde ise,Saat te,50 liraya çalışıyorum.
    Proje maliyeti = 50 * ProjeSaati

    Hoşcakalın.

    YanıtlaSil
  4. Paylaşımınız için teşekkürler Serdar Bey.

    YanıtlaSil
  5. merhaba
    paylaşımınız için teşekkürler
    endüstri mühendisliği son sınıf öğrencisiyim
    oyun motoru yazmakta olan bir firmada gönüllü staj yapmaktayım ve zaman, maliyet gibi tahminlerde bulunmalıyım; elimde geçmişe ait veri yok. Açıkçası hangi modeli kullanmam gerektiğini de bilmiyorum. Nesne yönelimli yazılımlarda bahsettiğiniz Cocomo modeli işimize yaramayacak gibi görünüyor.
    yardımcı olup yol gösterirseniz mutlu edersiniz.

    ilginize şimdiden teşekkürler

    nurten keleş
    nurtenkeles88@gmail.com

    YanıtlaSil
  6. Merhaba Nurten, içinde bulunduğun durum kolay değil:) Eğer daha önce yazılım maliyet tahminleme ve ilgili işin teknik tarafında tecrüben yoksa herhangi bir tahminleme tekniği üzerinden gitmen seni zorlar, yanlış tahmine yol açar. Burada yapabileceğin en iyi yöntem elindeki işi küçük parçalara, safhalara ayırmak olacaktır. Örneğin, basitçe; analiz, tasarım, kodlama, test, eğitim, dokümantasyon başlıklarından yola çıkıp. Her başlığın altında ana görevler tanımlayıp, bunlar tahmini ne kadar sürer diye ilgililerden bilgi toplayarak ilerleyebilirsin. En son hepsini alt alta toplarsın. Dediğim gibi bu noktada tecrübe önemli. Umarım yardımcı olmuşumdur. Detaylı görüşmek istersen. deniz.kilinc[at]univera.com.tr adresinden bana yazabilirsin.

    YanıtlaSil
  7. bu kadar çabuk dönmeniz şaşırttı beni=)
    ilginize tekrar çok teşekkür ederim...

    YanıtlaSil

Yorum Gönder

Bu blogdaki popüler yayınlar

UML ve Modelleme – Bölüm 3 (Use Case Diyagramlar)

Önceki iki makalemizde (1, 2) UML’e genel olarak değinip ve modellemede kullanacağımız dokuz diyagram hakkında bilgiler vermiştik. Bu makalemizde Use Case diyagramından detaylı bahsedeceğiz. Öncelikle, genel Use case diyagramının tanımını hatırlayalım. “Bir kullanıcı ve bir sistem arasındaki etkileşimi anlatan senaryo topluluğudur.” Ivar Jacobson Senaryo tanımı için der ki:
“Aktörle sistem arasında gerçekleştirilen, sonucunda aktöre farkedilir getirisi/ faydası oluşan etkileşimli diyalogdur. ” UML Use Case Diyagramları  sistemin işlevselliğini açıklamak amacıyla kullanılır. Sistemin birbirinden ayrı özelliklerinin detaylarını göstermekten ziyade, Use Case Diyagramlar, tüm mevcut işlevselliği göstermek için kullanılabilir. Buradaki en önemli noktalardan biri,   Use Case Diyagramlar temelde sequence diyagram ve akış diyagramlarından farklıdır. Use Case diyagramlar dört ana elemandan oluşmaktadır. Aktörler, Sistem (Proje kapsamını belirtir), Use Caseler ve bunlar arasındaki ilişkiler. Şekil…

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz. UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir. Şekil 1. Class Diyagram Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Amaç, diyagramın sadece belirli k…

Cluster ve clustering nedir? Cluster oluşturmanın faydaları nelerdir? (Bölüm I)

Cluster, basit anlamda benzer bir amaç için belirli bir konfigürasyon yapılarak aynı görevi birlikte ya da yedekli çalışmasını sağlayan servistir. Cluster farklı amaçlarla oluşturulabilir fakat son kullanıcı tarafından her zaman tek bir bilgisayar gibi gözükecektir. Bir cluster oluşturmak için en azından iki adet sunucuya ihtiyaç vardır ve bir cluster içindeki her bir sunucu “node” olarak adlandırılır. İhtiyaç olan hizmete göre çeşitli sayıda nodelar bir araya gelerek clusterları oluşturmaktadır. Bir cluster oluşturmak için gerekli sebepler daha fazla performans ihtiyacı, yüksek erişilebilirlik (high availability) ya da her ikisi birlikte olabilir. Şimdi cluster çeşitlerini çok fazla ayrıntıya girmeden biraz daha yakından inceleyelim. Yüksek erişilebilirlik (High-availability) clusterlarıBu tip cluster yapısında öncelik erişilebilirliği arttırmadır. Bunu tek bir sunucunun görevini herhangi bir donanım yada yazılım problemi oluştuğunda diğer bir sunucunun otomatik olarak devralması olara…