Kupon talebini baştan sona yürüttün, ama bir şeyi açık bıraktık: bu iş hangi düzende yürüyor? Aynı analist bir şirkette Agile (çevik) çalışır, iki haftada bir sprint toplantısına girer; başka bir şirkette Waterfall (şelale) düzeninde onay imzası bekleyen uzun bir doküman yazar. Bu derste iki ortamın araçlarını yine kupon talebi üzerinden görüyorsun. Süreci tek bir ders öğretmez; amaç, iş ilanında ve görüşmede geçen adların ne olduğunu bilmek ve birini uygulayacak kadar görmektir.
Gereksinim toplama teknikleri (elicitation)
Gereksinim hazır gelmez, onu çıkarırsın. Hangi tekniği seçeceğin sorduğun soruya bağlıdır.
| Teknik | En çok ne zaman? | Kuponda | Tuzak |
|---|---|---|---|
| Görüşme (interview) | Bir kişiden derin bilgi gerektiğinde | Destek ekibi şefiyle “son şikâyet neydi?” | Tek kişinin görüşünü kural sanmak |
| Çalıştay (workshop) | Birden çok paydaş aynı karara varacaksa | Pazarlama ve finans kupon süresini birlikte tartışır | Gündemsiz toplantı; en yüksek ses kazanır |
| Gözlem (observation) | İnsanlar yaptığını tam anlatamıyorsa | Destek çalışanının elle kupon verişini izlemek | İzlendiğini bilen kişi farklı davranabilir |
| Doküman inceleme (document review) | Yazılı kural, sözleşme, eski sistem varsa | Veri sözlüğünde “400 TL üzeri ücretsiz” | Doküman eskimiş olabilir; süreç derslerinde veriyle sınadığın gibi doğrula |
Tek teknik nadiren yeter: dokümanı oku, görüşmede sor, çelişkiyi çalıştaya taşı, sonucu gözlemle sına. AS-IS sütununu görüşmeden yazdığımızı hatırla; gözlem, “kendi yorumuyla karar verir” cümlesini kanıtlar ya da çürütür.
Önceliklendirme: MoSCoW
MoSCoW dört kovadır: Must (bu olmadan sürüm çıkmaz), Should (önemli ama geçici çözümü var), Could (yer kalırsa), Won't (bu sürümde yok, reddedilmedi).
| Kova | Kuponda | Neden burada? |
|---|---|---|
| Must | Kupon üretimi, tutar kuralı, “yalnız teslim”, aylık sınır | Bunlar olmadan para yanlış gider |
| Should | Uygulama içi bildirim, operasyon raporu | Bir süre elle ya da sorguyla idare edilir |
| Could | Kupondan sonra iadede otomatik iptal | Açık soru kapanınca; önce elle iptal edilebilir |
| Won't | Ödeme ekranının yeniden tasarımı | Ayrı talep; kapsam dışına yazıldı |
CREATE TABLE ba_gereksinim (grs VARCHAR(10), baslik VARCHAR(60), oncelik VARCHAR(10), puan INT);
INSERT INTO ba_gereksinim VALUES ('GRS-01', 'Geç teslimde kupon üret', 'Must', 8);
INSERT INTO ba_gereksinim VALUES ('GRS-02', 'Tutarı karar tablosundan hesapla', 'Must', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-03', 'Yalnız teslim durumu kupon alır', 'Must', 2);
INSERT INTO ba_gereksinim VALUES ('GRS-04', '2.700 saniye geç sayılmaz', 'Must', 1);
INSERT INTO ba_gereksinim VALUES ('GRS-05', 'Ayda en çok iki kupon', 'Must', 5);
INSERT INTO ba_gereksinim VALUES ('NFR-01', 'Kupon en geç 5 dakikada görünür', 'Must', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-06', 'Kuponu uygulama içinde bildir', 'Should', 5);
INSERT INTO ba_gereksinim VALUES ('GRS-07', 'Operasyon için kupon raporu', 'Should', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-08', 'Kupondan sonra iadede kuponu iptal et', 'Could', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-09', 'Ödeme ekranını yeniden tasarla', 'Wont', 13);
SELECT oncelik, COUNT(*) AS gereksinim, SUM(puan) AS puan
FROM ba_gereksinim
GROUP BY oncelik
ORDER BY oncelik;
Puan, ekibin verdiği göreli büyüklüktür (story point). Bu örnekte Must toplamı 22 puan. Ekibin bir sprintte 20 puan yaptığını varsayarsak Must'ların hepsi bile sığmıyor: ya kapsam küçülür ya süre uzar. Bu cümle, “hepsi önemli” tartışmasını sayıya çevirir.
Kullanım senaryosu (use case) ve kullanıcı hikâyesi
Aynı gereksinimi iki biçimde yaz, farkı görürsün.
KULLANICI HİKÂYESİ Bir müşteri olarak, siparişim söz verilen süreyi aştığında otomatik telafi kuponu almak istiyorum, böylece destek ekibine yazmadan hakkım olanı alırım. (Ayrıntı kabul kriterlerinde.)
KULLANIM SENARYOSU UC-01: Geç teslime kupon üret Aktör: Kupon işi (zamanlanmış sistem). İlgili: Müşteri. Ön koşul: Siparişin teslim kaydı oluşmuş. Ana akış: 1. İş, teslim süresini saniye olarak hesaplar. 2. İş, süreyi 2.700 ile karşılaştırır; aşıyorsa devam eder. 3. İş, müşterinin bu ayki kupon sayısını okur; ikiden azsa devam eder. 4. İş, tutarı karar tablosundan bulur, kuponu yazar. 5. Sistem müşteriye bildirim gönderir. Alternatif akışlar: 2a. Süre aşmıyor: kupon yok, süreç biter. 3a. Sınır dolu: kupon yok, "sınır dolu" kaydı yazılır. 4a. Kayıt hatası: hata kuyruğuna düşer, operasyon inceler. Son koşul: Siparişin en çok bir kuponu vardır ya da nedeni kayıtlıdır.
| Kullanıcı hikâyesi | Kullanım senaryosu | |
|---|---|---|
| Amacı | Konuşmayı başlatmak, değeri söylemek | Etkileşimi adım adım tarif etmek |
| Ayrıntı | Kısa; ayrıntı kabul kriterinde ve konuşmada | Ana ve alternatif akış içinde yazılı |
| Sık görüldüğü yer | Agile ekipler | Doküman ağırlıklı projeler, sözleşmeye bağlı işler |
| Eksiği | Birbirine bağlı akışları bir arada göstermez | Yazması ve güncel tutması pahalı |
İkisi rakip değildir. Alternatif akışı çok olan bir işte önce use case yazıp hikâyeleri ondan çıkarmak yaygın bir yoldur: 2a, 3a ve 4a burada ayrı kabul kriterleri olur.
İzlenebilirlik matrisi (RTM, requirements traceability matrix)
RTM, her gereksinimi kaynağına, hikâyesine, testine ve hatasına bağlayan tablodur. İki soruyu cevaplar: ileri yön, bu gereksinim test edildi mi? Geri yön, bu test ya da kod hangi gereksinim için var? Geri yönde sahibi çıkmayan iş, kimsenin istemediği iştir.
| Gereksinim | Kaynak | Hikâye | Test | Sonuç | Hata |
|---|---|---|---|---|---|
| GRS-03 Yalnız teslim | Finans görüşmesi | KUP-12 | olumsuz-iptal, olumsuz-iade | 1 geçti, 1 kaldı | HATA-31 |
| GRS-04 Sınır 2.700 | Karar tablosu K2 | KUP-12 | sinir-2700, sinir-2701 | 1 geçti, 1 kaldı | HATA-32 |
| NFR-01 5 dakika | Görüşme | KUP-14 | yok | ? |
RTM genellikle tablo ya da Jira bağlantılarıdır. Veriye dökülürse boşlukları SQL bulur: test edilmemiş gereksinim, eşi olmayan satırla aynı kalıptır.
CREATE TABLE ba_gereksinim (grs VARCHAR(10), baslik VARCHAR(60), oncelik VARCHAR(10), puan INT);
INSERT INTO ba_gereksinim VALUES ('GRS-01', 'Geç teslimde kupon üret', 'Must', 8);
INSERT INTO ba_gereksinim VALUES ('GRS-02', 'Tutarı karar tablosundan hesapla', 'Must', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-03', 'Yalnız teslim durumu kupon alır', 'Must', 2);
INSERT INTO ba_gereksinim VALUES ('GRS-04', '2.700 saniye geç sayılmaz', 'Must', 1);
INSERT INTO ba_gereksinim VALUES ('GRS-05', 'Ayda en çok iki kupon', 'Must', 5);
INSERT INTO ba_gereksinim VALUES ('NFR-01', 'Kupon en geç 5 dakikada görünür', 'Must', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-06', 'Kuponu uygulama içinde bildir', 'Should', 5);
INSERT INTO ba_gereksinim VALUES ('GRS-07', 'Operasyon için kupon raporu', 'Should', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-08', 'Kupondan sonra iadede kuponu iptal et', 'Could', 3);
INSERT INTO ba_gereksinim VALUES ('GRS-09', 'Ödeme ekranını yeniden tasarla', 'Wont', 13);
CREATE TABLE ba_testler (test VARCHAR(20), grs VARCHAR(10), sonuc VARCHAR(10));
INSERT INTO ba_testler VALUES ('olumlu-30', 'GRS-01', 'gecti');
INSERT INTO ba_testler VALUES ('olumlu-60', 'GRS-02', 'gecti');
INSERT INTO ba_testler VALUES ('olumsuz-iptal', 'GRS-03', 'gecti');
INSERT INTO ba_testler VALUES ('olumsuz-iade', 'GRS-03', 'kaldi');
INSERT INTO ba_testler VALUES ('sinir-2700', 'GRS-04', 'kaldi');
INSERT INTO ba_testler VALUES ('sinir-2701', 'GRS-04', 'gecti');
INSERT INTO ba_testler VALUES ('aylik-sinir', 'GRS-05', 'kaldi');
INSERT INTO ba_testler VALUES ('bildirim-metni', 'GRS-06', 'gecti');
SELECT g.grs, g.baslik, COUNT(t.test) AS test_sayisi
FROM ba_gereksinim g
LEFT JOIN ba_testler t ON t.grs = g.grs
GROUP BY g.grs, g.baslik
ORDER BY g.grs;
Tel çerçeve (wireframe)
Tel çerçeve, ekranın düzenini ve akışını renksiz, kaba biçimde gösterir. Amacı tasarım seçmek değil, “bu ekranda ne var, tıklayınca nereye gidiyor?” sorusunu erken konuşmaktır.
+------------------------------+ | Siparişlerim > #5045 | |------------------------------| | [!] Teslimat geç kaldı | | 30 TL kupon tanımlandı | | Son kullanım: 07.01.2025 | | [ Kuponu kullan ] | |------------------------------| | Sipariş ayrıntıları ... | +------------------------------+
Bu kaba çizim hemen soru üretir: kupon geçerlilik tarihi nereden gelecek, kullanılmış kuponda düğme ne olacak? Sonraki adımlar: mockup görsel tasarımı gösterir, prototip tıklanabilir. İş analisti çoğu zaman yalnız tel çerçeveyi çizer ya da tasarımcıyla konuşur; sonuç ekranın kararı tasarım ekibindedir.
Doküman adları: BRD, FRD, SRS
| Doküman | Sorusu | Kim okur? | Kuponda |
|---|---|---|---|
| BRD (business requirements document) | İş neden ve ne istiyor? | İş birimi, yönetim | Sorun, başarı ölçüsü, kapsam, iş kuralı |
| FRD (functional requirements document) | Sistem ne yapacak? | Analist, geliştirici, test | Kupon işinin davranışı, ekranlar, hata durumları |
| SRS (software requirements specification) | Yazılım hangi koşullarla nasıl davranacak? | Geliştirici, mimar, test | İşlevsel ve işlevsel olmayan gereksinim, arayüz, kısıtlar |
Bu adlar kuruma göre değişir: bazı şirkette tek bir doküman üçünü taşır, bazısında FRD ile SRS aynı şeydir. Görüşmede “sizde bu belge ne içeriyor?” diye sormak bilgisizlik değil, doğru sorudur.
Waterfall ve Agile: aynı iş, farklı ritim
| Waterfall | Agile | |
|---|---|---|
| Gereksinim | Başta, büyük ölçüde tamamlanır ve onaylanır | Parça parça, işin yanında netleşir |
| Ana çıktı | BRD, FRD ya da SRS, imza | Backlog (iş listesi), hikâye, kabul kriteri |
| Değişiklik | Değişiklik talebi ve onay | Bir sonraki sprintin önceliği olur; kapsam büyükse yine görünür tartışılır |
| Uygun olduğu yer | Kapsamı sabit, sözleşmeli ya da denetime tabi işler | Belirsizliği yüksek, sık geri bildirim alınabilen işler |
Çoğu kurum ikisinin karışımıyla çalışır. Waterfall'da analist belgeyi erken bitirir ve onayı alır; Agile'da yazıyı küçük tutar, sürekli güncel tutar. RTM ve mini BRD ikisinde de işe yarar, yalnız kalınlığı değişir.
Sprintte iş analisti
Scrum rehberi “iş analisti” diye bir rol tanımlamaz. Analist çoğu ekipte ürün sahibine ya da geliştirme ekibine destek verir. Aşağıdaki tablo yaygın kullanımı anlatır, kural değildir.
| Etkinlik | Amaç | İş analisti ne yapar? |
|---|---|---|
| Backlog refinement (backlog inceleme) | Yaklaşan işleri netleştirmek. Tören değil, sürekli süren etkinlik | Hikâyeyi ve kabul kriterini hazırlar, soruları kapatır |
| Sprint planlama (sprint planning) | Bu sprintte ne yapılacağı | Kapsamı açıklar, kuralları cevaplar |
| Günlük toplantı (daily scrum) | Ekibin günlük uyumu | Gerektiğinde katılır, engel olan soruyu alır |
| Sprint gözden geçirme (sprint review) | Yapılanı paydaşla konuşmak | Paydaşı getirir, geri bildirimi backlog'a yazar |
| Retrospektif (retrospective) | Çalışma biçimini iyileştirmek | Gereksinim kaynaklı sorunları söyler |
Boşluk analizi (gap analysis)
Boşluk analizi üç soru sorar: neredeyiz, nereye gidiyoruz, farkı kapatmak için ne gerekir? AS-IS ile TO-BE yan yana yazıldığında süreç boşluğu görünür; veri olan yerde boşluk sayıya çevrilir.
WITH t AS (
SELECT order_id, customer_id, restaurant_id, courier_id, status, placed_at,
ROUND((julianday(delivered_at) - julianday(placed_at)) * 86400) AS sure_sn
FROM lk_orders
WHERE placed_at >= '2024-10-01' AND placed_at < '2025-01-01'
)
SELECT COUNT(*) AS teslim,
SUM(CASE WHEN sure_sn <= 2700 THEN 1 ELSE 0 END) AS zamaninda,
ROUND(100.0 * SUM(CASE WHEN sure_sn <= 2700 THEN 1 ELSE 0 END) / COUNT(*), 1) AS oran
FROM t
WHERE status = 'teslim';
Dönemde teslimlerin %77,3'ü 45 dakikanın altında. Diyelim ki yönetim “%80 zamanında” hedefi koydu; bu rakam senaryonun varsayımıdır, sektör değeri değildir. Boşluk 181 teslimat: bu kadarı daha zamanında olsaydı hedef tutardı. Kupon bu boşluğu kapatmaz, çünkü geç teslimi azaltmaz, sonucunu yumuşatır. Boşluk analizinin faydası budur: istenen çözümün gerçekten farkı kapatıp kapatmadığını sordurur.