Nesneye Dayalı Yazılımlarda Hatalı Sınıfların Öğrenme Temelli Yöntemle Belirlenmesi

thumbnail.default.placeholder
Tarih
2015-06-03
Yazarlar
Biray, Çağıl
Süreli Yayın başlığı
Süreli Yayın ISSN
Cilt Başlığı
Yayınevi
Fen Bilimleri Enstitüsü
Instıtute of Science and Technology
Özet
Günümüzün rekabetçi ortamında artan müşteri ihtiyaçları geleneksel yazılım geliştirme yöntemlerinin değişmesi gerekliliğini ortaya çıkarmıştır. Müşteri ihtiyaçlarını en iyi şekilde anlamak ve yerine getirmek için yazılım ekibi ile müşteri arasında devamlı bir karşılıklı etkileşim olması gerekmektedir. Müşteri ihtiyaçları projenin ilk safhasında iyi belirlenmeli ve yazılım altyapısı bu ihtiyaçlara yönelik tasarlanmalıdır. Projenin ilerleyen aşamalarında, ihtiyaca yönelik müşteri tarafından gelen yeni istekler veya geri bildirimler yazılımdaki sınıflarda değişiklik yapılmasına sebep olabilmektedir. Mevcut yazılımın değişen isteklere uyum sağlayacak esneklikte tasarlanması, yazılımın ilerleyen sürümlerinde bakım maliyetlerinin düşürülmesinde önemli bir role sahiptir. Yazılımdan beklentiler arttıkça, yazılımlar yapısal olarak karmaşıklaşmakta ve bunun sonucunda yazılım geliştirme ve bakım maliyetleri artmaktadır. Yazılım dünyasında son zamanlarda üzerinde durulan en önemli konulardan biri yazılımda kalitenin sağlanmasıdır. Yazılımda kalite kavramı, yazılım projelerinin maliyetlerini önemli ölçüde iyileştiren unsurların başında gelmektedir. Yazılımın esnekliği, bakımının kolay olması, anlaşılabilirliği, gerçeklenebilirliği, kolay sınanabilir olması ve güvenilirliği gibi kriterler kaliteli bir yazılımdan beklenen özelliklerdir. Ancak, projelerdeki zaman kısıtı, müşteri isteklerinin projenin en başında iyi belirlenmemesi, müşteri taleplerinin sıkça değişmesi, yazılım ekibindeki iletişim eksiklikleri, yazılım geliştiren ekibin nesneye dayalı tasarımın gerekliliklerini bilmemesi ve uygulamaması sonucunda yazılımlardaki tasarım kalitesi düşmektedir.  Yazılım projelerinin tasarım kalitesini projenin erken safhalarında değerlendirmek, ilerleyen aşamalarda projenin sağlıklı bir şekilde devam ettirilebilmesini sağlar. Yazılımın mevcut kalitesinin değerlendirilmesinin yanısıra ileriki fazlarda sorun çıkarabilecek bileşenlerin önceden tespit edilmesi ile yazılımdaki kalitenin devamlılığını sağlanır. Kalitenin ölçülebilmesi ve değerlendirilebilmesi için bir kalite modeline ve ölçme metoduna gereksinim vardır. Elde edilen ölçümlerden yazılımın kalitesine ilişkin bir anlam çıkarılabilmesi için metrik-kalite ilişkisi incelenerek sonucun yorumlanması gerekmektedir.  Yazılımı ölçmek ve kalitesini değerlendirebilmek için yazılım ölçüm metrikleri kullanılır. Yazılım metrikleri, yazılımların belirli özelliklerine göre kalitelerini belirleyebilmek için sayısal değerler ile ölçülmesidir. Yazılım metrikleri, yazılım çalıştırılmadan yazılımın kaynak kodundan statik bir şekilde elde edilebileceği gibi, yazılımın çalışma anında dinamik bir şekilde de toplanabilir. Bu bağlamda yazılım metrikleri ile yapılan ölçümlerle elde edilen sayısal veriler kullanılarak yazılımın hataya açık, kusurlu bileşenlerini önceden kestirimi mümkündür. Yazılımda çıkacak olası hataların erken tespit edilmesinin iki önemli avantajı bulunmaktadır; (i)  yazılımının kusurlu bileşenleri önceden belirlenip yazılım geliştiriciler önceden bilgilendirildiği takdirde, ilgili sınıfların tasarımlarında iyileştirme ve düzeltmeler yapılabilir, (ii) yazılımı test edenler, yazılımın kritik kısımlarının sınanmasını önceliklendirebilir ve bu sayede yazılım sınama maliyetleri ve süresi önemli ölçüde azaltılabilir. Bu şekilde proje geliştirmek ve bakımının sağlanması için harcanan işgücü ve zamandan kazanç sağlanır. Yazılım sınıflarındaki tasarımsal problemler, yazılımın anlaşılabilirliğini, esnekliğini ve tekrar kullanılabilirliğini azaltır. Tasarım kusuru olan yazılım bileşenlerinin analiz edilmesi, değiştirilmesi ve sınanması zordur. Bu sınıfların bakım maliyeti yüksektir ve bakımı zaman alır. Yapısal tasarım kusurları kodun derleme veya çalışma zamanında hata vermezler. Bu tarz sınıflar üzerinde değişiklik yapılmadığı müddetçe yazılım yaşam döngüsü boyunca kendilerini gizleyebilirler ve hata üretmeyebilirler. Yazılımın işlevselliğini değiştirmeden kodda iyileştirme yapılmak suretiyle sınıfların yapısal bozuklukları düzeltilmedikçe, tasarım kusuru olan sınıflar yazılıma yapılacak her değişiklikte yeni hatalar çıkarmaya eğilimli hale gelecektir. Yapılacak çoğu değişiklik bu sınıflarda ve bu sınıfın bağımlılığının yüksek olduğu sınıflarda hata çıkaracak ve yazılımın fonksiyonelliğini düşürecektir. Bu durumda, sınıfın hata sıklığı olarak da adlandırılabilecek, sınıfa yapılan değişiklik başına sınıfta çıkan hata sayısı artar. Hataya eğilimli bu sınıfları yazılımın erken safhalarında tespit etmek hem test, hem de geliştirme maliyetlerini azaltır. Yapısal tasarım kusurları bulunan yazılım sınıfları çoğunlukla; çok karmaşık, yazılımın diğer sınıflarına olan bağımlılığı yüksek, kendi içerisinde uyumu düşük ve kalıtım hiyerarşisindeki uygun olmayan yerde olabilmektedir. Bu özellikler yazılımın iç özellikleri olarak adlandırılmaktadır. Bu iç özelliklere sahip yapısal bozukluklar, yazılımın tasarım ve kod metrikleri kullanılarak belirlenebilmektedir. Ancak, yazılım metriklerinin değişik özelliklerde ve dağılımlarda olması, aldıkları minimum ve maksimum değerlerin farklılaşması sebebiyle, yazılım kusurlarını belirlemek için yazılım metriklerini kullanarak kesin kurallar oluşturmak zordur. Bununla birlikte, yazılımda kalitenin tanımlanabilmesi için farklı metrikler bir arada kullanılarak modeller oluşturulabilir; fakat metrik ağırlıklarına, eşik değerlerine ve rollerine bağlı bir modelleme disiplini oluşturmak kolay değildir. Bu sebeple sınıflardaki kusur tahmini için öğrenme tabanlı yöntemler yaygın bir şekilde kullanılmaktadır. Bu çalışmada, yapısal tasarım kusuru olan hataya eğilimli sınıfları tespit etmek için karar ağacı modelleri oluşturularak öğrenme tabanlı bir yöntem önerilmektedir. Öğrenme tabanlı yöntemlerde, örnek veri ya da geçmiş bilgiler kullanılarak, gelecekteki bir durumun kestirimini yapmak mümkündür. Belirli parametrelere bağlı olarak bir model tanımlanır ve bu model gelecekteki bir veri için öngörü yapmak için kullanılır. En iyi parametre değerleri bulunduğunda yöntemin kestirim başarısı artmaktadır. Karar ağaçları modellemesi eldeki verinin sınıflandırılması için kullanılabilecek en etkili yöntemlerden birisidir. Karar ağacı, kök düğümden, iç düğümlerden, dallardan ve yaprak düğümlerden oluşmaktadır. Her bir iç düğümde ilgili kurala göre bir karar verilir ve kararın sonucuna göre dallardan biri seçilir. Karar denetimi kökte başlar ve yaprak düğümlere gelene kadar özyinelemeli olarak devam eder. Yaprak düğümler karar algoritmasının sonlandığı yerdir ve aynı yapraktaki örnekler aynı sınıfa mensupturlar. Karar ağaçları eğitim kümesinde yer alan niteliklerden yalnızca ihtiyaç duyduklarını kullanır ve boyut indirgeme işlevini kendisi gerçekleştirir. Karar ağacının seçtiği nitelikler, problemin tahmini için en belirleyici özelliklerdir. Önerilen yöntemde kullanılan tasarım metrikleri ile nesneye dayalı yazılımların tasarım kalitesi nitelikleri ölçümlenerek, kusurlu sınıfların kestirimi yapılmıştır. Öğrenme tabanlı yöntemlerde modelin doğruluğu, kullanılan eğitim kümesi ile doğrudan ilişkilidir. Modelin eğitimi için sınıfların hata sıklığı ve değişim sayıları göz önüne alınarak yenilikçi bir yaklaşımla veri kümesi oluşturulmuştur. Yazılımdaki sınıfların ileriki sürümlerde hata çıkarıp çıkarmayacağının kestirimini yapabilmek için her bir sınıfın belirli bir kurala göre etiketlenmesi gerekmektedir. Modeli eğitmek için kullanılacak eğitim kümesi oluşturulurken, telekom sektöründe kullanımda olan iki olgun yazılım projesinin kaynak kodları ardışıl sürümler boyunca incelenmiştir. Proje A yazılımı sektörde altı yıldır, Proje B ise sektörde dört yıldır kullanılmaktadır. Her bir sürümün hata raporları sürüm notları arasında yer almaktadır. Her projenin sürüm raporunda ilgili sürümde hangi hataların çözümlerinin yapıldığı, müşteri değişiklik isteklerinin neler olduğu ve o sürümde gelen yeni özelliklerle ilgili detaylar yer alır. Çalışma kapsamında kullanılan Proje A ve Proje B yazılımlarının hata raporları yazılımcı ekiple birlikte değerlendirilmiştir. Yapılan gözlemler sonucunda bazı önemli çıkarımlar yapılmıştır: (i) Yapısal kusuru olan sınıfların hemen hemen hepsi testler sırasında hata çıkarmaya meyillidir; buna ek olarak sağlıklı sınıfların bazıları da hata raporlarında yer alabilmektedir, (ii) Kusurlu sınıflar değiştirilmediği sürece hata çıkarmayabilirler; hatalar değişikliklerden sonra ortaya çıkmaktadır, (iii) Sağlıklı sınıflar çok sık değişime uğramazlar; ancak bu sınıflarda değişiklik olduğunda nadiren hata gözlenebilmektedir. Yazılım sınıflarında olan değişiklikler; müşteri kullanım senaryolarındaki değişikliklerle, yeni versiyonla gelen yeni özelliklerin gerçeklenmesi veya önceki sürümlerden kalıtılan hatalara gelen düzeltmelerden etkilenerek tetiklenebilmektedir. Yazılım sınıflarında olan tüm değişiklikler gerek yazılım takımının desteği ile gerekse kod incelemeleri ile değerlendirilerek, yazılımlarda bulunan her bir sınıfın hata sıklığı hesaplanmıştır. Eğitim kümesindeki hata sıklıklarına ve değişim sayılarına göre sınıfları “kusurlu/sağlıklı” olarak etiketlemek için birçok eşik değeri ile denemeler yapılmıştır. Bu denemeler sonucunda sık değişime uğrayan sınıflar ve sık hata çıkaran sınıflar belirlenmiş ve değerleri belirlenen eşik değerlerinin üzerinde kalan sınıflar “kusurlu” olarak etiketlenirken, tersi özellikteki sınıflar “kusursuz” olarak etiketlenmiştir. Ancak, yapılan deneyler esnasında yazılımdaki bazı sınıfların hiç değişmediği ya da çok az değişime uğradığı gözlenmiştir. Bu tarz sınıflar yapısal olarak kusurlu olsalar dahi, yazılım yaşam döngüsü boyunca değişime uğramadıkları için, bu sınıfların doğrudan “sağlıklı” olarak sınıflandırılması gerçekçi bir yaklaşım değildir. Bu sınıfları etiketlemek için eğitim kümesinde “kusurlu” olarak belirlenmiş sınıfların belirleyici özelliği olan sınıf karmaşıklıkları göz önüne alınmıştır. Bu durumda, hiç değişim geçirmeyen ya da az değişen sınıflardan, sınıf karmaşıklığı eğitim kümesindeki “kusurlu” sınıfların sınıf karmaşıklığının belli oranda yukarısında olan sınıflar “kusurlu” olarak etiketlenip, eğitim kümesine dahil edilmiştir. Her iki yazılım projesindeki sınıfların yazılım metrikleri, literatürde yer alan metrik elde etme araçları yardımıyla ile elde edilmiştir. Eğitim kümesinde her bir sınıf için toplanan metrikler ve sınıfın “kusurlu/kusursuz” etiketleri yer almaktadır.  Elde edilen verilerle oluşturulan eğitim kümesi kullanılarak öğrenme tabanlı bir model oluşturulmuş ve bu model sistemin önceden görmediği bir versiyonundaki sınıfların hata kestirimini yapmak üzere kullanılmıştır. Öğrenme algoritmasının kusurlu olarak tahmin ettiği sınıflar belli sayıdaki sürümler boyunca gözlemlenmiş ve yöntemin kusurlu sınıfları tahmin başarısı elde edilmiştir. Sonuçlar, düşük kaliteli yazılım sınıflarının sıklıkla değiştiğini ve hataya eğilimli olduklarını göstermektedir. Proje A’ dan elde edilen eğitim kümesi oluşturarak eğitilen sistem, aynı projenin ilerleyen safhalarında bir sürümdeki sık hata üreten kusurlu sınıfların %80’ ini başarılı bir şekilde belirlemiştir. Aynı eğitim kümesi hiç eğitilmediği Proje B yazılımının herhangi bir sürümündeki sınıflarından kusurlu olanlarının %83’ ünü doğru tahmin etmiştir.  Geliştirilen öğrenme tabanlı yöntemin belirlediği sınıfların öncelikli olarak sınanması ve tasarımsal olarak kodlarında iyileştirilme yapılması gerekliliği ile ilgili yazılım proje ekibi bilgilendirilmiştir. Bu çalışma kapsamında önerilen öğrenme tabanlı yöntemin sonuçları, telekomünikasyon sektöründeki yazılımlarda sık hata üreten tasarım kusuru olan sınıfları önemli oranda tespit etmektedir. Yazılım ekibinin bile farkında olmadığı bazı sınıfların kusurları tespit edilmiş ve bu sayede projenin ilerleyen sürümlerinde kaliteli yazılım geliştirilerek, yazılım geliştirme süresi ve bakım faaliyetlerinden kazanç sağlanmasına katkıda bulunulmuştur.
In today’s competitive environment, increasing customer demands have led to changes in the traditional software development methods. In order to clearly determine and fulfill customer requirements, continuous customer interaction with the team is important. Following requests and feedbacks of customers necessitate modifications in software classes. Poorly designed classes are difficult to analyze, modify and test, so that maintenance costs for such classes are very high. Code or design problems in software classes reduce understandability, flexibility and reusability of the system. Performing maintenance activities on defective components such as adding new features, adapting to the changes, finding bugs, and correcting errors, is hard and consumes a lot of time. Unless the design defects are corrected by a refactoring process these error-prone classes will most likely generate new errors after later modifications. Therefore, these classes will have a high error frequency (EF), which is defined as the ratio between the number of errors and modifications. Predicting defective classes before releasing the software is an important issue for the software quality assurance. Early estimate of error-prone classes has two important benefits, firstly it helps testers to focus on faulty modules of software, thus it saves significant proportion of testing time; secondly developers can refactor classes to correct their design defects. Software classes that include structural design defects mostly include one or more of the following properties. They are complex, highly coupled to other classes, their internal cohesion is low or they have an inappropriate position in the inheritance hierarchy. These properties can be revealed using software design and code metrics of the classes. However, it is difficult to work with metrics to create certain rules for detecting defects because of their various types, distributions and different minimum/maximum values. Also, different metrics should be used together to create a model for quality assessment; but it is difficult to determine the roles, weights and thresholds of metrics in creating such a model. The aim of this work is to detect poorly designed classes, in order to have testers focus on them and/or have the developers refactor them. Poorly designed classes typically become error-prone when modified. In this thesis, a learning-based decision tree model for detecting error-prone classes with structural design defects is proposed. In learning-based systems the accuracy of the model strongly depends on the training set. The main novelty in the proposed approach is that the EFs and change counts (ChC) of classes to construct a proper data set is considered for the training of the model. The training set is built that includes design metrics of classes by analyzing numerous releases of real-world software products and considering EFs of classes to mark them as error-prone or non-error-prone. To train the model and evaluate its performance, two long-standing projects are studied, namely Project A and Project B. Several releases of the projects are examined and modifications in classes triggered by changes in customer use case scenarios, new feature implementations and/or bug fixes inherited from previous releases are identified. After this examination, classes with high ChC and error rate are identified and classified as “defective”. Using the tags (defective/healthy) of the classes and collecting their design metrics, the data set is constructed to use in training and testing of the proposed model. Empirical experiment results demonstrate that the proposed approach succeeds in finding error-prone classes that need refactoring. The proposed model succeeded in finding frequently changing defective classes with relatively high EFs. The model correctly predicted 80% of the most defective classes with the highest EFs of Project A and 83% of Project B. Exposing these risky classes automatically also decreases the test time and maintenance cost.
Açıklama
Tez (Yüksek Lisans) -- İstanbul Teknik Üniversitesi, Fen Bilimleri Enstitüsü, 2015
Thesis (M.Sc.) -- İstanbul Technical University, Instıtute of Science and Technology, 2015
Anahtar kelimeler
Kusur Tahmini, Yazılım Kusurları, Yazılım Kalitesi, Karar Ağaçları, Bug Prediction, Software Defects, Software Quality,  decision Tree
Alıntı