Yazılım Mühendisliğinde Hata Tahmini

Yazılım yaşam döngüsü (Software Development Life Cycle, SDLC), proje yönetiminde bir ürünün kalitesini iyileştirmek için tanımlanan bir süreçtir. SDLC’nin ana aşamaları, projenin planlanması, ihtiyaç analizi, tasarımı, kodlanması, test edilmesi ve bakımıdır. Planlama, projede çalışacak personel sayısının ve donanım gereksinimlerinin tanımlandığı, fizibilite çalışmalarının yapıldığı aşamadır. İhtiyaç analizi, sistem gereksinimlerinin ayrıntılı olarak çıkarıldığı aşamadır. Tasarım, belirlenen gereksinimlere uygun yazılım sisteminin oluşturulduğu aşamadır. Kodlama, sistemin uygulanmasıdır. Son olarak sistemin sürekli test edilmesi, hataların giderilmesi ve teslimden sonra bakımının yapılması gereken aşama ise test ve bakım sürecidir. Aşamalar sürekli bir döngü halindedir, tek yönlü değildir ve herhangi bir aşamada geriye dönülebilir.

Software Development Life Cycle

Yazılım geliştirmenin her aşamasında bazı yazılım sorunları ortaya çıkabilir, örneğin, çeşitli yazılım hataları, güvenlik veya tasarım sorunları gibi. Bir yazılımın kalitesi, yazılım yaşam döngüsü boyunca oluşabilecek hataların erkenden önlenmesi veya en aza indirilmesi ile sağlanabilir. Yazılım hata tahmini, yazılım modüllerindeki olası hataları tahmin etmek için yazılım ölçütleri (software metrics) ve hata bilgileri (buggy or non-buggy) üzerine bir öğrenme modeli oluşturma sürecidir.

Yazılımda Hata nedir?

Hata (bug), yazılımın yanlış davranmasına neden olan bir anormalliğin sonucu olarak düşünülebilir. Hatalar, stabilite sorunlarından çalıştırılabilirlik sorunlarına kadar çeşitli problemlere neden olur ve genellikle programlama sırasında insan hatalarından kaynaklanabilir. Test aşamasında hatalar tespit edilip düzeltilmelidir.

Yazılım Hata Tahmininde Kullanılan Metrikler Nelerdir?

Literatürde, yazılım hata tahmini modeli oluşturmak için yazılım ölçütleri (software metrics) kullanılır. Aşağıdaki şekilde (Hata Tahminleme Süreci) gösterildiği gibi yazılım sistemlerindeki dosya, sınıf veya fonksiyonlardan çeşitli yazılım metrikleri elde edilir. Bu metrikler kullanılarak bir öğrenme modeli geliştirilir ve yeni gelen yazılım sistemlerinin bug içerip içermediği tespit edilir. Model oluşturma aşamasında çeşitli makine öğrenmesi yöntemleri (Karar Ağaçları, En Yakın Komşu, Yapay Sinir Ağları, Destek Vektör Makinesi gibi) kullanılabilir ve yeni yazılım versiyonlarının bug içerip içermediği bu model sayesinde tahmin edilebilir. Çalışmalarda genellikle açık kaynak veri setleri (NASA MDP, Softlab, Bug Prediction) kullanılır.

Hata Tahminleme Süreci

Metrikler Nasıl Oluşturulur?

Yazılım uzmanı, aşağıda başlıkları görülen metrikleri formüllere uygun olarak hesaplar. Örnek olarak bazı metriklerin tanımları aşağıda verilmiştir.

NUM_OPERATORS: projede yer alan toplam operator sayısı.
NUMBER_OF_LINES: projedeki toplam kod satır sayısı.
NUMBER_UNIQUE_OPERANDS: projede kullanılan toplam tekil operand sayısı.
DEFECTIVE: Hata Tahminleme (Bug Prediction) Sonucu. (Yes/No).

Yazılım Projesinden Elde Edilen Veri Seti

Örneğin Halstead_Level aşağıdaki gibi hesaplanır:

Kaynak: https://maisqual.squoring.com/wiki/index.php/Halstead_Program_Level

Örnek bir c kodunu inceleyelim. Aşağıdaki c kodunun Halstead_Level metrik değerini hesaplamak için tekil operand ve operatör sayıları bulunur.

main()
{
    int a, b, c, avg;
    scanf("%d %d %d", &a, &b, &c);
    avg = (a + b + c) / 3;
    printf("avg = %d", avg);
}
Tekil Operatörler (n1): "main", "()", "{}", "int", "scanf", "&", "=", "+", "/", "printf", ",", ";"
Tekil Operandlar(n2): a, b, c, avg, "%d %d %d", 3, "avg = %d"

* n1 = 12
* n2 = 7
* Toplam Operand Sayısı (N2) = 15
 
L = (2 * 7)/(12 * 15) = 0,078

Kaynak: https://en.wikipedia.org/wiki/Halstead_complexity_measures

Halstead level, toplam operand sayısı, toplam operatör sayısı gibi metrikler bulunduktan sonra makine öğrenmesi algoritmaları (Karar Ağaçları, En Yakın Komşu, Yapay Sinir Ağları, Destek Vektör Makinesi vs.) uygulanarak hata tahmini yapılabilir.

Dipnot: “BUG” Kelimesinin Tarihçesi

9 Eylül 1947 tarihinde bilgisayar bilimcileri tarafından programlanan askeri amaçlı kullanılan “Mark II” adındaki bir bilgisayarda sorun meydana gelir. Mark II, diğer adıyla Colossus Mark II, 2. Dünya Savaşı sırasında yapılan Alman yazışmalarını çözmek için kullanılan bir odayı kaplayan bir bilgisayardır. Harvard Üniversitesi’ndeki bilgisayar bilimcilerinden ve mühendislerinden oluşan ekip, bilgisayarları Mark II’nin tutarlı hatalar verdiğini keşfetti. Donanımı açtıklarında devrelerin arasına giren bir böcek buldular. Böcek girdiği yerden çıkarılmış ve devrelerdeki sorun giderilmişti. Bu konuda rapor tutulması gerekiyordu. Bilgisayardan sorumlu asker Grace Murray Hopper böceği kağıda bantla yapıştırarak “First actual case of bug being found.” (Böceğin ilk vakası bulunmuştur.) notunu düşer. O tarihten bu yana bilgisayarlarda meydana gelen hatalara “bug”, bu hataların çözülmesine de “debug” denmiştir.

Grace Murray Hopper’ın defterine aldığı not

Bug kelimesi bu tarihten önce de zaten kullanılmaktaymış. Thomas Edison, 1800’lü yılların başlarında tasarımlarında “böcek” olduğunu bildirdi. Hatta Oxford İngilizce Sözlüğünde bu kelimenin açıklaması 1889 yılında Edison ile yapılan bir röportaj sonrası yazılı basında kullanılan yerden alınmıştır.

Kaynaklar:

BPDET: An Effective Software Bug Prediction Model using Deep Representation and Ensemble Learning Techniques

https://maisqual.squoring.com/wiki/index.php/Halstead_Program_Level#:~:text=Halstead%20Program%20Level%20defines%20a,as%20the%20program%20volume%20increases.

Yazılım Hata Kestiriminde Kolektif Sınıflandırma Modellerinin Etkisi 

Yazılım hata tahmininde kullanılan metriklerin karar ağaçlarındaki bilgi kazançlarının incelenmesi ve iyileştirilmesi 

https://www.nationalgeographic.org/thisday/sep9/worlds-first-computer-bug/

Elife Öztürk KIYAK
Elife Öztürk KIYAK
%d blogcu bunu beğendi: