|
Gereksinim Mühendisliği |
|
Yazılım geliştirme süreçlerinin en
önemlilerinden birisi, geliştirilecek olan sistem veya yazılım için
müşterinin gereksinimlerini ortaya çıkarmak ve bunları analiz etmektir.
Gereksinim mühendisliği; müşterinin bir yazılımdan beklentilerini,
operasyonel ve geliştirme esnasındaki kısıtları da dikkate alarak ortaya
koyma ve gereksinimleri belgeleme işlemlerini sistematik olarak
yapabilme disiplinidir. Gereksinim mühendisliği için benzer bir diğer
tanım ise, yazılımda neler yapılacağını, nasıl yapılacağını
belirtmeksizin, doğru, eksiksiz, tutarlı ve muğlak olmayan ifadeler
biçiminde belirtmek ve ortaya çıkartmak için tanımlanan süreçler
bütünüdür. Yazılım geliştirme sürecinin tüm aşamalarında, kalite ile
maliyet ve kaynak kullanımının azaltılmasının öneminin artması ile
birlikte bu sürecin de önemi zamanla artmış ve sistem geliştirme
süreçlerinin en önemli ve kritik aşaması olduğunun farkına varılmıştır.
Sistem gereksinimleri tam ve doğru olarak
ortaya konulamaz ise, daha sonraki süreçlerde bu aşamadan dolayı ortaya
çıkacak problemlerin maliyeti göreceli olarak artacak ve ortaya çıkan
yazılım kaynaklar açısından verimli olmayacaktır. Bu sürecin mühendislik
şeklinde ifade edilmesinin nedeni ise gereksinimleri elde etme esnasında
ve analiz işlemlerinde sistematik yaklaşımların yer almasıdır. Bu
önemine rağmen hala yazılım geliştiriciler bu sürece daha az zaman ve
emek harcayarak doğrudan geliştirme sürecine geçmekte, müşteri
gereksinimleri dokümanlarını yapısal ve düzenli biçimde
hazırlamamaktadırlar.
Gereksinim mühendisliğinin temelini
oluşturan gereksinim için belli bir sınır koymak imkansızdır. Müşteri
ile uzlaşışmış tüm istekler ve ortaya çıkabilecek tüm kısıtlar
gereksinim olarak düşünülmelidir. Geniş bir aralıkta değerlendirilen
gereksinimler, üst seviyedeki genel isteklerden yazılımın fonksiyonel
detaydaki belirtimlerine kadar dağılım gösterir. Sonuçta hepsinin
gereksinim olarak ele alınıp analizinin yapılması gerekir. Gereksinimler
çok değişik şekilde sınıflandırılıp, farklı tiplere ayrılabilir. - Kullanıcı gereksinimleri: Doğrudan kullanıcıya yönelik, görsel ve fonksiyonel ağırlıklı gereksinimlerdir. Doğal dille yazılabilen, diyagramlarla gösterilebilen ve müşterileriler için hazırlanan gereksinimlerdir. Kullanıcı senaryoları (use-case) için temel oluşturur. Kullanıcıdan alındıkları için teknik anlamda detaylar içermeyebilir.
- Uygulama alanına yabancı olmak: Yazılım
geliştiriciler çok çeşitli alanlara hizmet sunmaktadırlar ve her
sektörün de kendine özgü kavramları ve iş süreçleri bulunmaktadır.
Yazılım geliştirilecek alanda bilgi birikimi sahibi olunmaması
durumunda, doğru ve eksiksiz gereksinim elde etmek zordur. Çünkü
çalışılacak alanın iş süreçlerini anlayıp bunların arasındaki ilişkileri
ortaya çıkarmak ve müşteri gereksinimlerini elde etmek için varolan
sistemi anlamak, çözümlemesini yapmak gerekir. Bu zorluğun üstesinden
gelmek için piyasa araştırması yapılmalı veya mümkün olduğunca bileşen
tabanlı çözümler üreterek eldeki çözümler yeni sisteme uyarlanmalıdır.
- Uygulama alanının kompleks olması:
Uygulama geliştirme alanı ne kadar kompleks ve büyük olursa, ortaya o
kadar fazla gereksinim ve bu gereksinimler arasındaki ilişkiler çıkar.
Kompleks sistemleri anlamanın yanı sıra bu sistemler arasında ilişkileri
kurmak da oldukça zordur. Bu durumda önce sistemleri modüllere ayırmak
sonra da bu modüller arasındaki arayüzleri çıkartmak, gereksinimleri
elde etmeyi kolaylaştıracaktır.
- Tüm sistemi bir kişinin bilmesi:
Organizasyon altyapısı oturmamış bir kuruluşa yazılım geliştirileceği
zaman çoğunlukla sistemi bütünüyle bilen bir kişiyle karşılaşılır. Bu
kişi genelde o kuruluşta yıllardır çalışan ve eski sistemin
mimarlarından birisidir. Fakat çoğunlukla bu durumdaki kişilerin,
gereksinimleri elde etmek için yeterli zamanları olmaz ve yerlerinde
bulunamazlar. En doğru bilgi bu kişilerden alınabileceği için, bu
kişilerden gereksinimleri elde etmek için planlı toplantılar yapmak ve
zamanı verimli kullanmak gerekir.
- Müşterilerin bilgilerini ortaya
koy(a)maması: Gereksinimleri elde ederken uç kullanıcılar genelde
sistemden beklentilerini tam olarak ortaya koymazlar veya koymak
istemezler. Kimi zaman yeni sisteme karşı bir tutum izlenerek bilgi
sağlamayarak zorluklar çıkarılabilir. Bazen de dar bir bakış açısından
sistemin bütününe bakmak durumunda olan kişiler, gerçek gereksinimleri
göz ardı ederek detaylarda boğulurlar ve yeterince verimli olamazlar. Bu
durumda sistemle ilgili tüm kişi ve grupları gereksinim sağlayıcı olarak
seçmek ve her kişiye uygun sorular sormak gerekir. Farklı bakış
noktaları, sistemin tüm paydaşlar tarafından nasıl algılandığı konusunda
ipucu verir ve sistemin analizini kolaylaştırır.
- Müşteri ihtiyaçlarını tam yansıtamamak:
Elde edilen gereksinimler bazen müşterinin ne istediğini tam olarak
yansıtamazlar. Müşterinin yeterli ve eksiksiz bilgi vermemesinden
kaynaklanan veya analistin dikkat ve özeni göstermemesinden kaynaklanan
nedenlerden dolayı ortaya beklentilerin dışında bir sistem çıkar. Bu
durumun üstesinden gelmek için müşteriden alınan gereksinimleri
onaylatmak ve eksikleri önceden tamamlamak gerekir.
- Gereksinimlerin tutarsız ve eksik
olması: Gereksinimlerin farklı bakış açılarından elde edilmesi durumunda
benzer gereksinimler arasında uyuşmazlık ve tutarsızlık ortaya
çıkabilmektedir. Bazen de gereksinimler tam elde edilemediğinden oluşan
eksiklikler daha sonraki süreçlerde ek maliyetler ortaya
çıkarabilmektedir. Bunu önlemek için gereksinimleri, kontrol listelerini
kullanarak sınama ve doğrulama yapmak gerekir. Bu şekilde gereksinimler
arası tutarsızlıklar ortaya çıkarılabilir.
- Gereksinim değişikliklerinin maliyetli
olması: Gereksinimler için müşteriden kabul alınıp onaylandıktan sonra
ortaya çıkacak değişiklikler maliyetli olmaktadır. Onaylama sürecinden
sonra yazılım tasarımına geçileceği için ortaya çıkacak değişiklikler,
doğrudan tasarımı etkileyecektir ve geri dönüşler, ek maliyetler ve
fazladan zaman gerektirecektir. Ayrıca gereksinimlerde olabilecek
değişikliklerin takibi ile değişikliğin diğer gereksinimleri nasıl
etkileyeceğinin izlenmesi gerekecektir. Bunun için gereksinim
dokümanlarında izlenebilirlik matrisinin oluşturulması ve değişiklik
tarihçesinin hazırlanması gereklidir.
- Yazılım ekibi ile müşteri arasındaki
yanlış anlamalar: Analistler her zaman yazılım geliştirme ekibi ile
müşteri arasında köprü görevi kurarak, müşterinin gereksinimlerini tam
ve anlaşılır biçimde yazılım geliştiricilere aktarmakla yükümlüdür.
Yalnız kimi zaman gerek analist-müşteri ve gerekse analist-geliştirici
arasında yanlış anlamalar olmakta ve ortaya beklenmeyen sonuçlar
çıkabilmektedir. Bunu önlemek için sık sık müşteriye geri bildirimlerde
bulunmak ve hatta yapılabiliyorsa müşteri temsilcisinin de yazılım
ekibinin bir parçası olmasını sağlamak gereklidir. Müşteriden erken geri
dönen uyarılar ve bildirimler, ileride oluşabilecek yüksek maliyetlerin
önüne geçilmesini sağlayacaktır.
Gereksinimler, sistemdeki etkilerine ve
kullanılırlığına göre kalıcı veya değişken olabilirler. Kalıcı
gereksinimler daha çok organizasyonun ana faaliyet alanından türetilen
ve tüm süreçlerde değişmez olan gereksinimlerdir. Örneğin bir hastanede
her zaman doktor ve hemşire bulunması bu tip gereksinimdir. Değişken
gereksinimler ise sistemin kullanımı veya geliştirilmesi sırasında
değişime uğrayabilecek gereksinimlerdir. Örneğin sigorta şirketlerine
özgü yasalar ve vergi düzenlemeleri bu tip gereksinimlerdir.
Analistlerin, analiz ve tasarımında zorlandıkları bu tip
gereksinimlerdir.
- Olurluk (fizibilite) çalışması: Müşteri
gereksinimlerinin maliyetinin, uygun bütçe ve teknoloji sınırları içinde
olup olmadığının tespit edildiği süreçtir. Müşterilere, fazladan
istenilen hizmetlerin bir ek maliyeti olduğu ve bunun hem zaman hem de
maddi açıdan yeterli olması gerektiği belirtilmelidir. Bazen de eldeki
teknolojinin de yetersiz kalması ortaya çıkabilir. Tüm gereksinimler
için olurluk çalışmasının yapılması gereklidir. Bunun sonucunda
fizibilite raporu hazırlanmalıdır. Değişik biçimlerde olurluk çalışması
yapılabilir.
- Ekonomik olurluk
- Gereksinim tanımlama: Gereksinimleri
müşterinin anlayabileceği formlara dönüştürerek gerekli tanımlamaları
yapmaktır. Bu süreçte diyagram veya formlar kullanılır ve görsel anlamda
yapısal doküman hazırlanır. Müşteriye yönelik süreçtir ve gereksinim
analizi süreciyle iç içe yürütülür.
- Ayrıntılı gereksinim belirtimi:
Gereksinimleri detaya inerek tanımlama ve ortak olmayan ve olmayan
noktaları ortaya koyma sürecidir. Yazılım tasarımına giriş yapılır. Bu
süreç daha çok uygulama geliştiriciler ile müşteri ortamındaki teknik
paydaşlar içindir. Gereksinim tanımlama sürecinden ortaya çıkan
formların her biri için detaylı formlar ve diyagramlar oluşturulur.
Yazılımın tasarımında tanımlanacak nesneler için soyut tanımlamalar
yapılır ve üst düzeyde veri akışı diyagramı oluşturulur.
- Çalışma alanını anlamak: Çalışma
yapılacak alan ile varsa daha önceki varolan sistemi ve süreçleri anlama
aktivitesidir. Uygulama alanında, olurluk çalışması yapılmasında ve
iyileştirme yapmak için başvurulur.
- Gereksinim elde etme/meydana çıkarma:
Paydaşlarla birlikte gereksinimleri keşfetme, meydana çıkarma
aktivitesidir. Bu aktivite kapsamında paydaşlarla mülakat ve müzakere
yapılır, varolan dokümanlar gözden geçirilir, gözlemleme ve sosyal ortam
analizi yapılır, gereksinim anketleri düzenlenir ve bunlar
değerlendirilir. Sosyal içerikli bir çalışma olup tüm paydaşlar ile
etkili bir iletişim ortamının kurulması gerekir. Tüm paydaşların farklı
bakış açıları dikkate alınarak sistem gereksinimleri hakkında bilgiler
elde edilir. Gereksinimleri önceliklendirmek planlama ve süreç yönetimi
açısından çok önemlidir. Önceliklendirme ayrı bir uzmanlık ve yetenek
gerektirmesine rağmen gereksinimler üzerindeki bazı kriterler
gereksinimlere öncelik sağlar. İşlevsel gereksinimler ve çalışma alanına
özgü temel ve kritik gereksinimler önceliklidir. Ayrıca analiz sonucu
birbirini takip eden gereksinimlerde de kolay önceliklendirme
yapılabilir.
- Analiz ve modelleme: Gereksinimleri
tanımlayarak ayrıntılı belirtimlerini oluşturma faaliyetidir. Müşteri
gereksinimleri modüler şekilde ayrıştırılmış ve arındırılmış olur.
Tasarım öncesi yazılım modellemesi yapılır ve veri tipleri tanımlanır.
Gereksinimler arasındaki arayüzler ve sistem etkileşimleri detaya
inilmeden belirtilir. Bilgisayar destekli yazılım mühendisliği (CASE)
araçlarıyla gereksinimler kullanıcı senaryoları ve diyagramları
oluşturulur.
- Gereksinimleri geliştirme ve
olgunlaştırma: Gereksinimler analiz edildikçe yeni gereksinimleri
doğurur. Proje bütçesi ve kaynak sınırlamaları çerçevesinde yeni ortaya
çıkan gereksinimlerin de müşteri onayı ile gerçekleştirilmesine
gereksinimleri geliştirme faaliyeti denir. Bu tip gereksinimler daha çok
proje kabul aşamasında ortaya çıkabilecek kabul kriterleridir.
Gereksinimleri geliştirmenin bir diğer yöntemi ise prototip oluşturma ve
bu prototipi müşteriye sunarak daha önceden alınan gereksinimlerin
eksiklerini tamamlamak ve geliştirmektir.
- Onaylama ve doğrulama: Müşteri onayı
olmayan gereksinimleri tasarıma girdi olarak almak, hatalara ve boşa
emek harcanmasına neden olabilir. Büyük projelerde müşteri tarafından da
teknik kişilerin proje ekibinde yer alması nedeniyle onaylama işlemi
anlık yapılsa da hazırlanan tüm gereksinim dokümanlarının resmi olarak
onaylatılması gereklidir. Bu onaylamadan sonra ortaya çıkabilecek
gereksinim değişikliklerinin maliyeti ve proje planı revizyonları daha
kolay olabilecektir. Gereksinimleri doğrulamak için kontrol listelerinin
kullanılması gereklidir. Kontrol listesindeki tüm kriterlerin
sağlandığından emin olunması ve eksikliklerin tamamlanması zorunludur.
- Gereksinim yönetimi: Gereksinim
mühendisliği süreçlerini, proje planına uygun olarak zamanında ve
eksiksiz tamamlayabilme aktivitesidir. Müşteri görüşmelerinin ve
toplantılarının düzenlenmesi ve elde edilen gereksinimlerin doğru analiz
edilerek dokümantasyon edilmesi bu faaliyet kapsamındadır. Proje
yöneticisi ve müşteri sorumlusu tarafından yürütülür.
Yazılım mühendisliğindeki eğitiminin daha
çok tasarım ve programlamaya yönelik olması sebebiyle, yazılım
projelerinde çalışan analistlerin, gereksinimleri tam ve doğru elde
edilmiş bir uygulamada hata yapma ihtimali oldukça düşük olmaktadır. Bu
sebepten dolayı müşterinin gereksinimlerini doğru almak ve analiz etmek,
projenin tamamlanmasında en önemli kriterdir. Proje yönetiminde
gereksinim mühendisliği süreçlerine yeterli zaman ve kaynak ayrılması,
başarının anahtarı olacaktır.
"Software Engineering", Ian
Sommerville (6th edition).
Bu yazıyla ilgili görüş ve yorumlarınızı yorum@teknoTurk.org ve kasims@kocsistem.com.tr adreslerine yollayabilirsiniz.
|