
By: Sadık Nazik / 0 comment
İyi Gereksinim Nasıl Yazılır?
Başarılı bir ürün ortaya koymanın ve proje yönetmenin temel taşlarından biri, gereksinimlerin doğru ve etkili şekilde belirlenmesidir. Gereksinimler, bir sistemin ne yapması gerektiğini, hangi özelliklere sahip olması gerektiğini ve hangi kısıtlamalara uyması gerektiğini tanımlayan ifadelerdir. İyi yazılmış gereksinimler, projenin tüm paydaşları arasında ortak bir anlayış sağlar, geliştirme sürecini hızlandırır, hataları minimize eder ve nihayetinde ürünün kalitesini artırır. Aksi takdirde, belirsiz veya eksik gereksinimler, yanlış anlamalara, yeniden çalışmalara ve projenin başarısız olmasına yol açabilir. Bu makalede, iyi gereksinimlerin temel özelliklerini, yazımında dikkat edilmesi gereken noktaları ve kaçınılması gereken yaygın hataları detaylı bir şekilde ele alacağız.
İYİ GEREKSİNİMLERİN ÖZELLİKLERİ
İyi bir gereksinim, projenin başarısı için kritik öneme sahip olan belirli niteliklere sahip olmalıdır. Bu nitelikler, gereksinimlerin anlaşılır, uygulanabilir ve doğrulanabilir olmasını sağlar. Aşağıda, iyi gereksinimlerin temel özellikleri detaylandırılmıştır:
-
- Açık ve Anlaşılır (Unambiguous): Gereksinimler, tüm paydaşlar (iş analistleri, geliştiriciler, test uzmanları, son kullanıcılar vb.) tarafından aynı şekilde anlaşılmalıdır. Belirsiz veya yoruma açık ifadelerden kaçınılmalıdır. Örneğin, “Sistem hızlı olmalıdır” yerine, “Sistem, kullanıcı girişinden sonra 2 saniye içinde yanıt vermelidir” gibi ölçülebilir ve net ifadeler kullanılmalıdır. Kısaltmalar veya teknik terimler kullanılıyorsa, bunların dokümanda açıkça tanımlanması önemlidir.
-
- Doğrulanabilir (Verifiable): Bir gereksinim, test edilebilir ve doğrulanabilir olmalıdır. Yani, gereksinimin karşılanıp karşılanmadığı objektif bir şekilde ölçülebilmelidir. “Kullanıcı dostu bir arayüz sağlanmalıdır” gibi ifadeler doğrulanabilir değildir. Bunun yerine, “Kullanıcı, ana sayfadan ürün arama işlemini en fazla 3 adımda tamamlayabilmelidir” gibi somut ve ölçülebilir kriterler sunulmalıdır. Doğrulanabilirlik, test senaryolarının oluşturulmasına ve gereksinimin başarıyla uygulandığının kanıtlanmasına olanak tanır.
-
- Tam ve Bütün (Complete): Gereksinim, ilgili tüm bilgileri içermeli ve eksik bir yönü olmamalıdır. Bir gereksinim, kendi başına anlam ifade etmeli ve başka bir gereksinime ihtiyaç duymadan anlaşılabilmelidir. Örneğin, “Sistem kullanıcılar için bir raporlama özelliği içermelidir.” ifadesi eksiktir. Şu atomik ifadeleri içermesi tam ve bütün olması açısından önemlidir. “Sistem, kullanıcıların günlük, haftalık ve aylık raporları PDF formatlarında indirebilmelerini sağlayacaktır.“, “Raporlar, kullanıcı adı, oturum süresi, yapılan işlemler ve işlem tarihlerini içerecektir.“, “Kullanıcılar, raporlar için başlangıç ve bitiş tarihlerini seçebilir.“
-
- Tutarlı (Consistent): Gereksinimler kümesi içinde çelişkili ifadeler bulunmamalıdır. Bir gereksinim, başka bir gereksinimle veya sistemin genel mimarisiyle çelişmemelidir. Farklı paydaşlardan gelen bilgilerde tutarsızlıklar varsa, bunlar netleştirilmeli ve giderilmelidir. Tutarsızlıklar, geliştirme sürecinde karmaşıklığa ve hatalara yol açabilir.
-
- Uygulanabilir (Feasible): Gereksinimler, mevcut bütçe, kaynaklar, zaman çizelgesi, teknolojik kısıtlamalar ve iş kuralları dahilinde gerçekleştirilebilir olmalıdır. Gerçekçi olmayan veya mevcut imkanlarla karşılanamayacak gereksinimler, projenin başarısız olmasına neden olabilir. Uygulanabilirlik, projenin fizibilitesini değerlendirmek için önemlidir.
-
- Önceliklendirilmiş (Prioritized): Tüm gereksinimler aynı öneme sahip değildir. Gereksinimler, iş değeri, risk ve bağımlılıklarına göre önceliklendirilmelidir. Bu, geliştirme ekibinin en kritik özelliklere odaklanmasını sağlar ve projenin aşamalı olarak ilerlemesine yardımcı olur. Önceliklendirme, gereksinimler arasındaki ilişkileri ve bağımlılıkları da ortaya koymalıdır.
-
- Atomik (Atomic): Bir gereksinim, daha küçük, bağımsız parçalara bölünemeyecek kadar tek bir konuya odaklanmalıdır. Eğer bir gereksinim birden fazla işlevi veya özelliği tanımlıyorsa, bunlar ayrı gereksinimler olarak ayrılmalıdır. Örneğin, “Sistem kullanıcı adı ve parolayı doğrulamalı, ardından kullanıcının profil sayfasını yüklemelidir.” yerine, “Sistem, kullanıcı adı ve parolanın doğruluğunu kontrol etmelidir.” ve “Kullanıcı adı ve parola doğrulandıktan sonra, sistem kullanıcının profil sayfasını yüklemelidir.” şeklinde iki ayrı gereksinim tanımlanmalıdır.
-
- Kısa ve Öz (Concise): Gereksinimler, gereksiz ayrıntılardan arındırılmış, net ve özlü olmalıdır. Uzun ve karmaşık cümleler, gereksinimlerin anlaşılmasını zorlaştırabilir. Teknik olmayan paydaşların da kolayca anlayabileceği basit bir dil kullanılmalıdır.
-
- İzlenebilir (Traceable): Her gereksinim, benzersiz bir kimliğe sahip olmalı ve projenin yaşam döngüsü boyunca (tasarım, geliştirme, test ve dağıtım) izlenebilir olmalıdır. İzlenebilirlik, gereksinimlerin nasıl karşılandığını ve hangi test senaryolarıyla doğrulandığını takip etmeyi sağlar. Bu, değişiklik yönetimi ve etki analizi için de kritik öneme sahiptir.
GEREKSİNİM YAZIMINDA KAÇINILMASI GEREKEN HATALAR
İyi gereksinimler yazmak kadar, kötü gereksinim yazımına yol açan yaygın hatalardan kaçınmak da önemlidir. Bu hatalar, projenin ilerlemesini sekteye uğratabilir, yanlış anlamalara neden olabilir ve maliyetli yeniden çalışmalara yol açabilir. İşte gereksinim yazımında kaçınılması gereken başlıca hatalar:
-
-
- Çok Anlamlı İfadeler Kullanmak: Gereksinimlerde belirsiz kelimeler ve birden fazla anlama gelebilecek ifadeler kullanmaktan kaçınılmalıdır. Özellikle “ya da”, “veya”, “bununla birlikte” gibi bağlaçlar, gereksinimin muğlak olmasına neden olabilir. Örneğin, “Kullanıcı, siparişini onaylamak için e-posta veya SMS ile bildirim almalıdır.” ifadesi, onay için e-posta mı yoksa yoksa SMS mi olacağı konusunda belirsizlik yaratır. Her gereksinim tek ve net bir anlam taşımalıdır.
- Belirsiz ve Muğlak İfadeler Kullanmak: Gereksinimler, paydaşlar ile geliştirme ekibi arasında imzalanmış bir kontrat gibidir ve bu kontratın her maddesi yoruma kapalı olmalıdır. “Hızlı”, “kullanıcı dostu”, “verimli”, “genellikle” veya “kolay” gibi sübjektif ifadeler, her bireyin zihninde farklı bir karşılık bulur. Geliştiricinin “hızlı” olarak varsaydığı bir yanıt süresi, son kullanıcı için kabul edilemez derecede yavaş olabilir. Bu yorum farklılıkları, projenin ilerleyen aşamalarında kaçınılmaz olarak beklenti uyuşmazlıklarına, maliyetli yeniden işlemelere (rework) ve takvim sapmalarına yol açar. Bu nedenle, her gereksinim net, ölçülebilir, test edilebilir ve tek anlama gelecek biçimde ifade edilmelidir. Ancak bu şekilde, tüm ekip üyelerinin aynı hedef doğrultusunda hizalanması ve projenin başarıya ulaşması için sağlam bir zemin oluşturulabilir.
-
- Gereksiz Yere Uzun ve Karmaşık Cümleler Kurmak: Gereksinimler edebi metinler değildir; kısa, öz ve anlaşılır olmalıdır. Gereksiz yere uzun cümleler ve paragraflar, özellikle teknik taraftaki geliştiriciler ve kullanıcılar için sıkıcı ve anlaşılması zor olabilir. Bir gereksinim çok uzunsa, muhtemelen birden fazla gereksinimi içeriyordur ve parçalara ayrılmalıdır. “Kullanıcı, profil sayfasında bulunan ‘Bilgileri Güncelle’ butonuna tıkladığında, sistem, girilen e-posta adresinin formatının geçerli olup olmadığını ve daha önce başka bir kullanıcı tarafından kullanılıp kullanılmadığını veri tabanından kontrol etmeli, ayrıca şifre alanına girilen yeni şifrenin en az 8 karakter uzunluğunda, bir büyük harf ve bir rakam içerip içermediğini doğrulamalı ve tüm bu kontroller başarılı olursa kullanıcı bilgilerini güncelleyerek kullanıcıya bir başarı mesajı göstermelidir.” şeklinde bir gereksinim gereksiz yere uzundur ve karmaşıklık içermektedir. Atomik parçalara ayrılmalıdır.
-
- Genişletici ve Dağıtıcı Kelimeler Kullanmak: “İse”, “-diği zaman”, “-in dışında”, “-madıkça”, “-masına rağmen” gibi kelimeler, gereksinimlerin yorumlanmasını zorlaştırır ve test senaryolarının karmaşıklığını artırır. Bu tür ifadelerden kaçınılarak, gereksinimlerin doğrudan ve koşulsuz bir şekilde ifade edilmesi sağlanmalıdır.
-
- Bağlaçlarla Birden Fazla Gereksinimi Birleştirmek: “Ve”, “veya” gibi bağlaçlarla birden fazla gereksinimi tek bir cümlede birleştirmek, gereksinimlerin atomik yapısını bozar ve test edilebilirliğini zorlaştırır. Her bir işlevsellik veya özellik ayrı bir gereksinim olarak tanımlanmalıdır. Bu, hem okunabilirliği artırır hem de her bir gereksinimin ayrı ayrı test edilmesini kolaylaştırır.
-
- Gereksinim Yazarken Tasarım Yapmak: Gereksinim dokümanları, “ne” yapılması gerektiğini tanımlamalı, “nasıl” yapılacağını değil. Gereksinim yazarken sistemin iç bileşenlerinin isimlerini kullanmak, fonksiyonları tanımlamak, kayıt tablolarından bahsetmek bir tasarım hatasıdır. Bu tür detaylar, tasarım dokümanlarına bırakılmalıdır. Analiz ve tasarım süreçlerinin ayrılması, gereksinimlerin daha esnek ve teknoloji bağımsız olmasını sağlar. Örneğin “Kullanıcı bir sipariş oluşturduğunda, sistem bu olayı transaction_log.txt adlı bir metin dosyasına, işlem zamanı, kullanıcı ID’si ve sipariş ID’sini virgülle ayırarak ekleyecektir.” yerine “Sistem, kullanıcı tarafından yapılan tüm sipariş işlemlerini, geriye dönük olarak incelenebilecek şekilde kaydetmelidir. Her kayıt, işlemin ne zaman yapıldığını, hangi kullanıcı tarafından gerçekleştirildiğini ve ilgili siparişin kimliğini içermelidir.” şeklinde yazılması daha uygundur.
-
- Spekülasyon Yapmak: Gereksinimler, somut gerçeklere ve paydaşlardan alınan bilgilere dayanmalıdır. Gelecekteki olası senaryolar veya varsayımlar üzerine spekülasyon yapmak, gereksinimlerin doğruluğunu ve güvenilirliğini azaltır. Belirsizlikler veya bilinmeyenler varsa, bunlar açıkça belirtilmeli ve risk olarak yönetilmelidir.
-
İyi gereksinim yazımı, başarılı projelerin temelini oluşturur. Açık, anlaşılır, doğrulanabilir, tam, tutarlı, uygulanabilir, önceliklendirilmiş, atomik, kısa, öz ve izlenebilir gereksinimler, projenin tüm aşamalarında rehberlik eder. Belirsizliklerden, bağlaçlarla birleştirilmiş ifadelerden, genişletici kelimelerden, uzun cümlelerden, tasarım detaylarından ve spekülasyonlardan kaçınmak, gereksinimlerin kalitesini artırır. Bu prensiplere uyarak yazılan gereksinimler, paydaşlar arasında ortak bir anlayış sağlayarak, geliştirme sürecini daha verimli hale getirir ve nihayetinde yüksek kaliteli ürünlerin ortaya çıkmasına katkıda bulunur. Gereksinim analizi, sürekli öğrenme ve iyileştirme gerektiren dinamik bir süreçtir ve bu prensipler, bu süreçte yol gösterici olacaktır.