Ders 01 / 12
Kalite Güvencesi Nedir
Kalitenin belirtilmiş ve örtük beklentilere uygunluk olarak tanımı, ürün kalitesi ile süreç kalitesinin ayrı ölçülmesi ve denetimsiz kalan kuralın gizlediği kusur.
İçindekiler
Bir program çalışıyor olabilir ve yine de yanlış olabilir. Testleri geçiyor olabilir ve yine de kimsenin istemediği bir şeyi yapıyor olabilir. Doğru çalışıyor olabilir ve on saniyede yanıt verdiği için kullanılamaz olabilir. Bu üç cümlenin ortak yanı, “çalışıyor” sözcüğünün tek başına bir yargı taşımamasıdır. Bu müfredat o yargıyı kurar: bir yazılımın istenen şey olduğuna nasıl karar verilir ve bu karar hangi kanıtlara dayanır?
Frontend Kalitesi kursundaki Test ve İzleme konusu birim, bileşen, tümleşim ve uçtan uca testleri tarayıcı bağlamında tanıttı. Orada test, belirli bir alanın — tarayıcıda çalışan arayüzün — kalite aracıydı. Burada konu tersine döner: test disiplininin kendisi, alandan bağımsız olarak ele alınır. Örnekler JavaScript ve Node.js Çalışma Zamanı kurslarında kurulan araçlarla yazılır, ama sorular dile ve platforma bağlı değildir.
Kalite Bir Uygunluk Yargısıdır
Kalite, bir ürünün belirtilmiş (stated) ve örtük (implied) beklentileri karşılama derecesidir. Bu tanımın iki yarısı da gereklidir.
Belirtilmiş beklenti yazılıdır: “öğrenci üyeler kitabı 28 gün ödünç alır”. Örtük beklenti yazılı değildir ama ihlal edildiğinde herkes fark eder: bir üyenin borcunun başka bir üyeye görünmemesi, iade işleminin iki kez işlenmemesi, sayfanın açılmasının dakikalar sürmemesi. Belirtim ne kadar dikkatli yazılırsa yazılsın, örtük beklentilerin tamamını içermez.
Bu yüzden kalite mutlak bir nitelik değil, bir uygunluk yargısıdır: neye uygunluk sorusunun yanıtı verilmeden ölçülemez. Kurs boyunca kullanılacak alan küçük bir kütüphane ödünç kitaplığıdır. Bu alan Backend müfredatındaki kütüphane sistemiyle aynıdır; burada o sistemin kodu varsayılmaz, kurallar sıfırdan kurulur ve dersler boyunca aynı kitaplık geliştirilir.
// kitaplik.mjs — odunc kurallari export const KURALLAR = { ogrenci: { oduncGun: 28, enCokOdunc: 10 }, uye: { oduncGun: 14, enCokOdunc: 5 }, }; export function oduncSuresi(uyeTuru) { const kural = KURALLAR[uyeTuru]; if (kural === undefined) throw new Error(`bilinmeyen uye turu: ${uyeTuru}`); return kural.oduncGun; } export function enCokOdunc(uyeTuru) { return KURALLAR[uyeTuru]?.enCokOdunc ?? 5; } export function sonTarih(alisGunu, uyeTuru) { return alisGunu + oduncSuresi(uyeTuru); }
Tarihler gün numarasıyla temsil edilir: sonTarih(1000, 'uye') bin numaralı günde alınan
kitabın bin on dördüncü günde iade edileceğini söyler. Takvim aritmetiği ve saat dilimi
sorunları kalite tartışmasının konusu değildir; sabit bir gün sayacı örnekleri
belirlenimci (deterministic) tutar.
Ürün Kalitesi ve Süreç Kalitesi
Ürün kalitesi (product quality) elde duran şeyin niteliğidir: kitaplık kuralları doğru uyguluyor mu, hızlı mı, güvenli mi? Süreç kalitesi (process quality) o şeyi üreten çalışma biçiminin niteliğidir: her kural bir denetime bağlanmış mı, değişiklikler gözden geçiriliyor mu, kusurlar nereden geldiğiyle birlikte kaydediliyor mu?
Aradaki bağ tek yönlü ve olasılıksaldır. İyi bir süreç iyi bir ürünü garanti etmez, ama kötü bir süreç iyi ürünü tekrarlanamaz kılar: bir sürüm iyi çıkar, sonraki çıkmaz ve farkın nereden geldiği bilinemez. Kalite güvencesinin ilgi alanı asıl budur.
İki niteliği ayrı ayrı ölçmek için önce kuralların makine okunur bir listesi gerekir.
// belirtim.mjs — yazili kurallarin makine okunur listesi export const BELIRTIM = [ { no: 'K1', metin: 'Ogrenci odunc suresi 28 gundur' }, { no: 'K2', metin: 'Uye odunc suresi 14 gundur' }, { no: 'K3', metin: 'Ogrenci en cok 10 kitap odunc alabilir' }, { no: 'K4', metin: 'Uye en cok 5 kitap odunc alabilir' }, { no: 'K5', metin: 'Bilinmeyen uye turu reddedilir' }, { no: 'K6', metin: 'Son tarih, alis gunu ile odunc suresinin toplamidir' }, ];
İki Ölçümü Ayırmak
Ürün kalitesi ölçümü “yazılmış denetimlerin kaçı geçiyor” sorusunu yanıtlar. Süreç kalitesi ölçümü bambaşka bir soru sorar: “belirtimdeki kuralların kaçının bir denetimi var?” İkinci soruya izlenebilirlik (traceability) denir ve yanıtı ürünün kendisine değil, ürünle belirtim arasındaki bağa bakar.
// denetim.mjs — iki ayri olcum: urun kalitesi ve surec kalitesi import assert from 'node:assert/strict'; import { BELIRTIM } from './belirtim.mjs'; import { oduncSuresi, enCokOdunc, sonTarih } from './kitaplik.mjs'; const DENETIMLER = { K1: () => assert.equal(oduncSuresi('ogrenci'), 28), K2: () => assert.equal(oduncSuresi('uye'), 14), K3: () => assert.equal(enCokOdunc('ogrenci'), 10), K6: () => assert.equal(sonTarih(1000, 'uye'), 1014), }; let gecen = 0; const dusen = []; for (const [no, denetim] of Object.entries(DENETIMLER)) { try { denetim(); gecen += 1; } catch { dusen.push(no); } } const denetimsiz = BELIRTIM.filter((k) => DENETIMLER[k.no] === undefined).map((k) => k.no); console.log(`urun kalitesi : ${gecen}/${gecen + dusen.length} denetim gecti`); console.log(`surec kalitesi: ${BELIRTIM.length} kuraldan ${BELIRTIM.length - denetimsiz.length} tanesi denetleniyor`); console.log(`denetimsiz kural: ${denetimsiz.join(', ')}`);
urun kalitesi : 4/4 denetim gecti surec kalitesi: 6 kuraldan 4 tanesi denetleniyor denetimsiz kural: K4, K5
Birinci satır kusursuz görünür. İkinci satır, birinci satırın neyi kapsamadığını söyler. Ürün kalitesi ölçümü yalnız sorulmuş sorular hakkında bilgi verir; sorulmamış sorular o ölçümün içinde görünmez. Süreç kalitesi ölçümü tam olarak bu boşluğu adlandırır.
Denetimsiz Kalan Kuralın Bedeli
İki eksik denetim yazıldığında ne olduğu görülür.
// denetim-tam.mjs — denetimsiz kalan iki kural da yazildi import assert from 'node:assert/strict'; import { oduncSuresi, enCokOdunc, sonTarih } from './kitaplik.mjs'; const DENETIMLER = { K1: () => assert.equal(oduncSuresi('ogrenci'), 28), K2: () => assert.equal(oduncSuresi('uye'), 14), K3: () => assert.equal(enCokOdunc('ogrenci'), 10), K4: () => assert.equal(enCokOdunc('uye'), 5), K5: () => { assert.throws(() => oduncSuresi('konuk')); assert.throws(() => enCokOdunc('konuk')); }, K6: () => assert.equal(sonTarih(1000, 'uye'), 1014), }; for (const [no, denetim] of Object.entries(DENETIMLER)) { try { denetim(); console.log(`${no} gecti`); } catch (hata) { console.log(`${no} dustu: ${hata.message.split('\n')[0]}`); } }
K1 gecti K2 gecti K3 gecti K4 gecti K5 dustu: Missing expected exception. K6 gecti
Kusur enCokOdunc işlevindedir: bilinmeyen bir üye türü geldiğinde hata vermek yerine
sessizce beş döndürür. Kayıtlı olmayan bir kişi kitap alabilir ve sistem bunu bir üye
davranışı sanır. Kusur her zaman oradaydı; ürün kalitesi ölçümü onu göremiyordu, çünkü
kimse o soruyu sormamıştı.
Buradaki ders, dördüncü satırın çıkmasından daha geneldir. Ürün ölçümü yalnız kendi kapsamı içinde konuşur; kapsamın nerede bittiğini söyleyen şey süreç ölçümüdür. “Bütün testler geçiyor” cümlesi, hangi soruların hiç sorulmadığı bilinmeden bir kalite iddiası değildir.
Güvence, Kontrol ve Test
Üç terim sık sık birbirinin yerine kullanılır; kapsamları farklıdır.
Kalite güvencesi (quality assurance) sürece yöneliktir ve önleyicidir. Kuralların yazılı olması, her kuralın bir denetime bağlanması, değişikliklerin gözden geçirilmesi, kusurların kaydedilmesi bu başlığa girer. Sorusu şudur: kusurun ortaya çıkmasını ne engelliyor?
Kalite kontrolü (quality control) ürüne yöneliktir ve tespit edicidir. Elde duran sürümün beklentileri karşılayıp karşılamadığına bakar. Sorusu şudur: bu sürümde kusur var mı?
Test kalite kontrolünün başlıca yöntemidir, ama tek yöntemi değildir. Gözden geçirme, biçimsel çözümleme ve statik denetim de kusur bulur. Test, programı çalıştırarak kanıt üretmesiyle ayrılır: gözlenen davranışı beklenenle karşılaştırır.
Üçünün ilişkisi hiyerarşiktir: test, kalite kontrolünün bir aracıdır; kalite kontrolü, kalite güvencesinin bir parçasıdır. Bu kurs ağırlıklı olarak test hakkındadır, ama testin neyi kanıtladığı ve neyi kanıtlayamadığı sorusu güvence düzeyinde yanıtlanır.
Testin kanıtlayamadığı şeyin adı da bellidir: bir test yalnız kusurun varlığını gösterebilir, yokluğunu gösteremez. Sonlu sayıda girdiyle sonsuz girdi kümesi denenemez. Bu yüzden testin işi “kusursuzluğu kanıtlamak” değil, “kusur bulma olasılığı en yüksek girdileri seçmektir”. Test tasarımının bütün teknikleri bu seçim probleminin yanıtıdır.
Özet
- Kalite, belirtilmiş ve örtük beklentilere uygunluk derecesidir; neye uygunluk sorusu yanıtlanmadan ölçülemez.
- Ürün kalitesi elde duran şeyin, süreç kalitesi onu üreten çalışma biçiminin niteliğidir; iyi süreç iyi ürünü garanti etmez ama kötü süreç iyi ürünü tekrarlanamaz kılar.
- İzlenebilirlik ölçümü “kuralların kaçının denetimi var” sorusunu sorar; ürün ölçümü yalnız sorulmuş sorular hakkında bilgi verir.
- Örnekte dört denetimin dördü geçiyordu; denetimsiz iki kuraldan biri yazıldığında bilinmeyen üye türünün sessizce kabul edildiği kusur ortaya çıktı.
- Kalite güvencesi önleyici ve sürece, kalite kontrolü tespit edici ve ürüne yöneliktir; test kalite kontrolünün programı çalıştırarak kanıt üreten yöntemidir.
- Test kusurun varlığını gösterebilir, yokluğunu gösteremez.
Sonraki Adım
Bu derste denetimler belirtimden türetildi: yazılı kural neyse, denetim onu sordu. Bu, “kitaplık belirtime uyuyor mu” sorusudur. Ama belirtimin kendisi yanlışsa ne olur? Kurallar eksiksiz uygulanmış, her denetim yeşil ve sonuç yine de hatalı olabilir — çünkü yazılı kural, kütüphanenin gerçekten uyguladığı kural değildir. Sonraki ders bu iki soruyu ayırır: doğru inşa etmek ile doğru şeyi inşa etmek.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.