Pazartesi, Haziran 12, 2006

Yazılımsal Testler hakkında


Bu konuya özellikle ülkemizde gerekenden çok daha az önem verildiğini düşünüyorum. Manual testleri bırakıp otomatize edilmiş testlere geçmemiz, hem yazılımın hayata geçtikten sonra müşteri önünde ortaya çıkaracak sorunlarını azaltacak, hem değişiklik maliyetini, hemde tekrar kullanılabilirlik maliyetini artıracaktır. Bu konu ile ilgili yeterli bilgisi olan teknik personelin bulunmaması, yöneticilerin bu konunun önemini bilmemeleri ve zaman kaybı olarak görmeleri dolayısı ile çok nadir uygulanabilmiştir. Ancak, bu konunun anlaşılıp uygulanması ile kalitemizin çok ciddi şekilde artacağı ve karlılığımızın yükseleceği de ısrarla savunduğum fikirlerdir.

Yazılımsal testleri kullanan herhangi bir kişinin kolay kolay manuel test edilen ortamlara geri dönmek istememesinin sebebi bu yaklaşımın gerçekten işe yaramasıdır.


Yazılım projeleri tüm yaşam evresi süresince bir takım istenmeyenlerle boğuşup durur.

Yaılım hayata geçinceye kadar ve geçtikten sonra, bir sürü beklenmyen davranış sergiler. Sebebi tam bitirilmemiş fonksiyonalite olabileceği gibi, düşünülmeyen nedenlerden, değişiklikten, anlık davranışlardan ortaya çıkan sorunlar olabilir. Bunların toplamına bug diyebiliriz.

- Bug terimi ilginç bir terim, bilgisayarların ilk yıllarından bize miras kalmış, o zamanlar oda büyüklüğünde bilgisayarla çalışan kişiler bazı problemlerin sebebinin uzun uğraşlar sonrasında devrelerin içerisine girmiş böceklerden kaynaklandığını bulmuşlar, işleme bug temizleme manasına gelen debugging adı vermişler ve terim bu şekilde günümüze kadar gelmiştir.
Sorun

Bazı yazılımcılar tarafından küçümsense de, istatistiklere göre yazılım geliştirme sürecinin çok büyük bir bölümünü debug işlemi almaktadır. Sorun, sadece yazılım kullanılmaya başladıktan sonra çıkan sorunlar değil, yazılım esnasında ve yazılımın değiştirilmesi esnasında çok şekilde uzun debug süreçlerinden geçme ihtiyacının ortaya çıkması, ayrıca bu debug süreçlerine girilmesi için gerekli önkoşulun da yazılımda bir hata veya beklnemyen davranışla karşılaşılmış olmasıdır. Hata göze çarpmayan bir hata ise, gerçek ortamda ortaya çıkana kadar yazılımal beraber yaşar. Gerçek ortamda ortaya çıkan bir bug ise, hem müşterinin güvenini zedeler, hem yazılımın üzerinden zaman geçmiş olabileceği için unutma riskini artırır, hem de değişikliği esnasında sistemin diğer taraflarını bozarak başka bugları oluşturma sürecine girmesine sebep olur.

Orta veya büyük çaplı bir projede yer almış herhangi bir kişi, bu debug sürecini iyi bilir. Yazılımda bir hata vardır, bunun tespiti için uzun süre boyunca uğraşılır, daha sonra bu hata bulunup çözülür ancak bir süre sonra ortaya çıkarki bu hatanın düzeltilmesi başka bir yeri bozmuştur, o kısım düzeltilir ve bir durumda ilk düzeltilmiş hatanın tekrarlandığı gözükür.

Biraz uzun süredir üzerinde uğraşılıyor olan herhangi bir yazılım için bu durum genel bir durumdur. Yeni özellik ekleme esnasında bu problemlerin hepsi hem yazılım hem kullanım esnasında nükseder ve her seferinde üzerinde zaman harcanarak düzeltilmeye çalışılır.

Projenin toplam maliyetine eklenen bu süreler, yazılım büyüdükçe daha da uzar, o yüzden yeni bir özellik eklemenin yaratacağı problemlerden ürken bir ekip bu durumdan sonra yazılıma dokunmak istemez veya dokunduğu zaman çok uzun zamanlarda sorunlar çözüleceğinden yöneticiler yazılımın baştan yazılmasına karar verme durumuna gelir.

Bu durumun çözümü nasıldır ? Yazılımın gerçek ortama geçmeden önce her noktasının manuel test edilmesi belki yazılımın gerçek ortamda hata vermesini engelleyebilir, ki bu tür bir çalışmanını başarılı olması için her değişiklikten sonra bu testin tekrarlanması gerekir, bu yaklaşım debug süresini azaltmaya yardımcı olamaz.

Çözüm

Bu döngünün içerisinden çıkmamızı sağlayan yapı aslında sihir gibi bir yapı olabilir. Sistemin her tarafını test edecek, problemlerin yerini bizim yerimize tespit edip nerelere müdahele etmemiz gerektiğini söyleyecek bir yapı, bu kontrolü çok kısa zamanda yapabilecek, yazılımdaki her türlü sıkıntıyı oluşmadan bize haber verebilecek bir yapı lazımdır.

Edindiğimiz bilgi, bu tür bir sihirin ancak başka bir yazılım ile mümkün olduğu yönündedir. İnsan gibi davranabilecek, sistemin her yerine girecek çıkacak ve problemleri tespit edecek.

Eğer yazılımı yapan veya yapan ekipten birisi , yazılım esnasında yazılımın sağlaması gereken fonksiyonaliteleri bir kağıda değilde yazılıma dökerse ve bu yazılım çalışma anında kodu kontrol ederse, problemleri bulmuş oluruz. Ancak sorunlarımız sadece kullanıncının gördüğü fonklsiyonalite değil, yazılımın kendi içerisindeki işleyiştende kaynaklanıyor olabilir. Bu durumda, aynı şekilde, bir yazılımcı bu kısmında nasıl çalışması gerektiğini koda yazar ise, bu problemler de sorun olduğunda tespit edilebilir.

Software testingin doğuşu bu şekilde olmuştur, bunun faydasını gören yazılımcılar, testlerin yazılabileceği, hızlı, anında ve kolay anlaşılabilecek şekilde çalışabilmesi için frameworkler yazmıştır.

Bu şekilde test edilmiş bir sistem, değişikliklere karşı sağlamlaştırılmış bir sistem de olur. Eğer sistemin tüm noktalarına çalışma prensipleri kod olarak yazılır ve bu kontrolü yapar ise her ne değişiklik veya yeni fonksiyonalite olursa olsun, kod kolayca değiştirilip yeni fonksiyonalite eklenebilir. Ayrıca, kodu düzeltme, okunulurluğunu artırma, performans artırma veya refactoring gibi işlemlerde bu tür testler olmadan çok zor ve risklidir.

Konuyla ilgilenenler için unit testler bir giriş noktası olabilir. Unit testler, bir classın kendi içerisindeki işleyişini bilen ve buna göre kontrolü yapan testlerdir. Kontrol edecek bir test suite çalıştırıldığında, sınıfların tümü kontrol edilir ve problem var ise tespit edilir. jUnit bu suitelerden bir tanesi, java için olmakla beraber, yeni her dilde bununla ilgili bir yazılım mevcut.

Fonksiyonalite testlerini yapan başka yazılımlar da var, Fit bir örnek olabilir.

Ayrıca, takım olarak çalışan insanlar için, kodun tutulduğu ortak noktaya kodun iletilmesinden önce tanımlanan testlerin herbirini çalıştıran ve tümü olumlu sonuç vermezse kodun yerleştirilme işlemine izin vermeyen bazı yapılar da ekip çalışmasını kolaylaştırır. (crusie control)

Çarşamba, Haziran 07, 2006

Yazılım Maliyeti

Maliyet Azaltma

(Yazılım ve Türkiye makalesine ek olarak yazılmıştır)


Yazılım maliyeti azaltma işlemi kapsamlı bilgi gerektiren ve zor bir işlemdir.
Buradaki kalemler,

1- Üretim maliyeti
2- Değişiklik maliyeti
3- Sorun Çözme (debug) maliyeti
4- Satış maliyeti
5- Destek maliyeti
6- Kullanılan diğer yazılımların maliyeti (Veritabanı vs.)

şeklindedir. Değişiklik ve debug maliyetleri küçük gibi gözükebilir, ancak yapılan araştırmalara göre, yazılımın asıl maliyeti bu kısımlarda ortaya çıkar.

Karşılaştığım çoğu yazılımcının en büyük şikayeti, değişiklik talepleri idi. Kullanıcılarının çok zahmetli olduğu / yazılımın konusunun çok değişken olduğu ve sürekli değişiklik taleplerinin geldiği bunun da yazılımı bozduğu, bugün yazılımın içerisinden çıkılmaz hale geldiği ve fırsat olsa baştan yazacaklarını belirtiyorlar. Bunun sadece o seferlik kendilerine mahsus bir durum olduğuna dair bir yaklaşım olsa da, yazılım dünyasında bu en büyük problemlerin arasındadır. Her yazılım ve her konu değişikliğüe ihtiyaç duyar, değişikliğe ayak uydurmayı sağlayamazsanız da bu değişiklik yazılımı alaşağı eder. Yazılım her değişiklikle biraz daha bozulur ve yönetilmesi imkansız hale gelir. Artık başlangıçta özenle tasarlanan yazılım yerine neresinden ne çıkacağı bilinmeyen bir ucube vardır. Her türlü değişiklik ile bu ucube daha da tuhaflaşır ve en ufak bir işlem yazılımın bin tane yerini etkiler, bunlar kullanıma kadar ortaya çıkmaz, kullanımda ortaya çıkan problemler tekrar yazılımcıya gittiği zaman yazılımcı bu problemleri düzeltirken başka problemler oluşur.

Bu da debug maliyetini getirir. Bunlar bir yazılımcının günlük karşıklaştığı durumlardır, bunun farklı şekilde olabileceğini bilmeyen kimseler ise bu döngü içerisinde çırpınırlar. Bu yüzden de maliyetler sürekli artar.

Eğer maliyet düşürme bir amaç ise, bu husus çok ama çok önemli bir husustur. Yazılımlar değişir, bunu reddeden bir mantık yok olmaya mahkumdur. Maliyetlerin içerisine bu yerleştirilmelidir.

Yazılım Mimarisinde Veritabanının Yeri

Orta - Büyük çaplı herhangi bir yazılım belirli bazı kısımları tasarlanmadan hayata geçemez. (Kastettiğim bir yazılım yapılmadan önce mimarisi tamamen hazırlanmış olmalıdır şeklinde algılanmasın, agile modeller için bu geçerli değildir, yazılım geliştirme süresince de mimari ortaya çıkabilir).

Başlangıç seviyesinden daha yukarıda uğraşan her kişi böyle bir çalışmanın veya konseptin gerekliliğine inanmaktadır.

Bir yazılımın yapacağı işlevler, akışı, mekanizmaları belirlenir ve bunlara göre bir mimari oluşturulur. Bu konularda herhangi bir görüş ayrılığı veya problem yok.

Ancak, genel olarak yazılım sektöründe ülkemizde bir problem var, bu problem mimariyi veritabanından ibaret olarak görmektir.

Veritabanı, verinin saklanması ihtiyacı ile ortaya çıkan bir kavram olsa da, zaman içerisinde kendisine daha fazla iş yükler hale gelip, yazılımın çalışma mantığını da içerisine alabilecek bir yapı haline geldi. Oracle in bunda etkisi büyüktür demek yanlış olmaz, oracle forms ile tamamen veritabanı odaklı yazılımlar kolayca geliştirildi. Bu yazılımların hazırlaması ve öğrenmesi kolay, sonuçta data saklanacak ortam üzerinde çalışıyorsunuz, prezentasyon ile ilgili tüm konseptlerde oracle tarafından hazırlanarak kolay kullanımlı bir library haline getirilmiş durumda.

Buradan yola çıkılarak gelinen seviye, prezentasyonu başka bir dille yapmak ancak iş akışını gene veritabanı üzerinde yönetmek şeklinde oluştu.

Bu tür bir yazılım, tamamen veritabanı üzerine oturtulur. Sistemin değişik yerlerindeki değişik kod parçacıkları, veritabanına bazı kayıtlar atıp bazı kayıtlar alırak çalışır, bu data tutarlılığı açısından bir sorun teşkil etmese de, şu konularda sorun oluşturur.

  • Değişiklik
  • Tekrar Kullanılabilirlik
  • Bakım
  • Veritabanı Yazılımından bağımsız çalışabilme
  • Test edilebilirlik (Software testing)
  • Modülarite
  • Farklı disiplindeki kişilerin birarada çalışma zorluğu

    • Yazılımın tamamen veritabanına bağımlı olmasından ötürü yazılımcının veritabanına veritabanı ile ilgili kişinin yazılıma müdahele etmeden birşey yapamaması
  • Veritabanı hazır olmadan yazılıma başlanamama
Yazılım, sürekli yaşayan ve içerisinde her durumda değişiklik gerektiren bir yapıdır. Değişiklik olmayan yazılımlar çok küçük yazılımlardır, kullanılan yazılımlar ise sürekli büyür.

Tüm sistem mimarisi ve mantığı veritabanı içerisinde olursa, değişiklik külfeti çok büyük olur. En ufak özellik eklemek için en ufak hesaplama yapmak için veritabanını değiştirmek gerekir. Ayrıca, veritabanında gerekecek bazı performans değişiklikleri vb. de yazılımı doğrudan etkiler.

Eğer veritabanından yazılımı soyutlayabilirsek, o zaman istenilen tüm fonksiyonalite yazılım içerisinde olabilir. Sadece saklama işlemleri için veritabanı kullanılır ise, o zaman veritabanı yazılımını (Oracle sql server vb) değiştirmek de çok kolay olur.

Sistem veritabanına göre düzenlenmiş ise, tekrar kullanılabilirlik sıfıra yakın bir seviyede olur. Sistem çok fazla içiçedir ve bazı fonksiyonları çıkarıp bazı yenilerini eklemek, bazı modülleri çıkarmak, sistem tamamına müdahele etmeden imkansız gibidir. Dolayısı ile maliyeti artırır.

Eğer sistem veritabanına çok sıkı bağlı ise test edilebilirlik de mümkün değildir, testten kasıt manuel test değil yazılımsal testtir. Sistemin parça parça çalışıp çalışmadığını kontrol etmek, problemleri ortaya çıkmadan yakalamak için kullanılan yazılım testlerinin veritabanına çok sıkı bağlı sistemlerde oluşturulması çok güç olur.

Modülaritedeki zorluk, tekrar kullanımdaki zorluk gibidir.

Pazartesi, Haziran 05, 2006

Yazılım ve Türkiye

Yazılım sektöründe Türkiye'nin olması gereken pozisyonundan daha aşağıda bir pozisyonda olduğu ve ülkenin geleceği için önemli bir rol oynayabileceği ile ilgili bir fikir birliği var, bu iş ile ilgili biraz bilgi sahibi olan kimseler bu konunun önemine değiniyor.



Öngörüler

Düşük yatırım maliyeti, lojistik sorunu olmaması, diğer sektörlere nispetle daha az maliyetle daha büyük pazarlarda oyuncu olabilme imkanı genel olarak heyecanlandırıcı bir sektör görünümü veriyor. Ancak konu ile ilgili bilgi çok sığ kalıyor ve bu konu ile ilgili politikaların düzenlenmesinde bazı eksiklikler var kanaatindeyim.



Üretim

Öncelikle ülke ve sektör içerisindeki bireyler olarak konuya yaklaşımı yanlış buluyorum, yazılım projeleri ve şirketlerinde genel gidişat başıboş bir atı bırakıp hedefine varmasını beklemek şeklinde oluyor. Amatör bir ruhla profesyonel iş yapmaya çalışıyoruz, her amatör uğraş gibi ortaya çıkan şey çok fazla emek ancak nisbeten daha az değer sağlıyor.
Bu konuda hiçbir zaman bir atölye den ileriye gidemedik ve büyük şirketlerimiz de dahil, henüz bir yazılım fabrikası vücuda getirebilmiş değiliz. Sektörün ülkemizdeki üyeleri ise Fabrika olmak istemediği gibi bir fabrika olabileceğinin dahi farkında değil. Dünyada uzun zaman önce çözülmüş problemlerin varlığının farkına varılması dahi yıllar alıyor. Eğitim eksikliği gibi gözüküyor.

Şimdiye kadar üretim yöntemlerindeki problemlerin çok farkına varılamamasının bir sebebi, ülke içerisine iş yapan şirketlerin yaptıkları işleri yüksek fiyatlardan pazarlayabilme ve bu sayede maliyeti çok önemsememedir. Aynı hata senelerce sanayicilerimiz tarafından yapıldı, çok yüksek maliyetlerle yüksek fiyata satılan mallar ülke içerisinde müşteri bulmasına rağmen ülke dışında müşteri bulamadı. Bir değişiklik geçirmeleri gerekti, geçiremeyenler de bu gün ayakta değil.

Sonuç olarak, hem kalite olarak yazılımlarımız belirli bir seviyenin üstüne çıkamadı, hemde maliyetlerimiz hep yüksek oldu.


Global Oyuncular

Global oyuncu ve rakip olarak karşımıza çıkarılan örnek Hindistan. Gerçekten Hindistan bu konuda çok yol katetmiş ve her taraftan yazılım şirketleri fırlıyor. Büyük bir hızla özellikle Amerika'dan Hindistan'a para akıyor. Bizim için de aynı modeli savunanlar mevcut, ancak gözardı edilen birşey var. Türkiye Hindistan'dan nüfus açısından korkunç farklılık gösteriyor, bunun sonucu olarak da Hindistan Çin gibi ucuz iş gücünün olduğu bir yer. Bu, bizim sanayimizin Çin'in sanayisiyle yarışmaya çalışması veya o modeli uygulamaya çalışması gibi olur.

Ayrıca, yazılımın emek yoğun bir iş olmasından dolayı, yatırım maliyetinin yükselmesi de rekabeti sağlamak için yeterli olamaz, buradakinin 5 de biri maaşla aynı işi yapabilecek kişilerin Hindistan'da mevcut olması bu yönden rekabet veya model kopyalanmasını imkansız kılmaktadır.



Kar Maksimizasyonu

Yazılım için üretim maliyetinin satılan adetle doğru orantılı olduğu aşikardır, eğer yapılan üründen bir tane yerine bin tane satılır ise kar bu kadar artıp maliyet bu kadar azalmış olur. Ayrıca, burada hammadde sıkıntısı olmadığı için, diğer üretim sektörlerine göre adet artışından elde edilen kar çok daha üstlere çıkabilir. Microsoft'un bir anda bu kadar büyüyebilmesinin bir sebebi, 1 kere üretip n kere satabilmesidir.

Ancak, yazılımdaki ekstra bir maliyet, değişiklik ve güncelleme talebidir. Diğer üretim sektörlerinde üretilen bir ürünün üzerinde değişiklik yapma ihtiyacı olmadığından maliyet sadece ilk üretim ve teslim anında, belki bazı sektörler için bakım vb durumunda oluyor. Ancak bakım maliyeti, yazılımdaki değişiklik maliyeti yanında küçük bir maliyet gibi duruyor.

Bir işletmenin karının hesaplanmasını kabaca satış fiyatı - maliyetler şeklinde düşünecek olursak, sektörden daha fazla nemalanabilmek için ya satış fiyatı artırılacak yada maliyetler düşürülecektir. Şimdiye kadar, Türkiye'de (ve bir süre öncesine kadar tüm dünyada) kar maksimizasyonu satış fiyatlarının yüksek tutulması ile sağlandıysa da, artık müşteri bu yaklaşımı kabul etmemekte, bu yüzden rakipler fiyat indirmekte, yüksek fiyatta satış yapanlar ise rekabet edememektedir. Bu durumda, gelinen durum, artık ayakta kalabilmek için dahi yapılacak şey maliyetlerin düşürülmesi ve bu sayede rekabet içerisine dahil olmaktır.

Maliyet ile ilgili kısım için tıklayınız.