Ders 09 / 15
Anlaşmazlık Çözümü
Yirmi iki bulgunun altısı tasarım anlaşmazlığına döndüğünde kural yokluğu 6 inceleme turu ve 36 birim bekleme üretip 8 kusuru kodda bırakır; ölçüte bağlama 3 tur ve 18 birimle kodda yalnız 2 bırakır.
İçindekiler
Önceki ders inceleme notunun yazımını ölçtü ve tek bir kaynak buldu: notta olmayan bilgi, sonraki inceleme turunda geri isteniyordu. Eyleme dönük yazım 2 inceleme turunda kapanıyor, kapanma ölçütü olmayan yazım 4 turda. Ölçümün varsayımı şuydu — yeterince alışveriş yapıldığında not kapanır.
Bu varsayım her notta doğru değildir. Kimi bulguda eksik olan bilgi değil, karardır: aynı kod öğesi hakkında iki tasarım savunulur, ikisi de çalışır, ikisinin de testi geçer. Böyle bir notta alışveriş sayısını artırmak kapanmaya yaklaştırmaz; aynı iki gerekçe her inceleme turunda yeniden yazılır. Bu dersin sorusu şudur: kararsız kalan bir bulgu kaç inceleme turu taşınır, ve onu karara bağlayan kural beklemeye ne ekler.
Anlaşmazlık ile Eksik Bilgi Ayrımı
İki not birbirine benzer görünür ama farklı davranır ve ayrım mekanik olarak yapılabilir. Sınama tek sorudur: notu kapatacak bilgi taraflardan birinde var mı?
Varsa not eksik bilgi notudur. Yazan boş girdi durumunda ne olması gerektiğini biliyordur ya da inceleyen imzanın neden bozulduğunu biliyordur; bilgi bir alışverişle karşıya geçer ve not kapanır. Önceki dersin bütün ölçümü bu sınıftaydı.
Yoksa not bir tasarım anlaşmazlığıdır. Eksik olan şey kimsenin sahip olmadığı bir bilgidir: hangi tasarımın daha iyi olduğu, mevcut ölçütlerle belirlenemiyordur. Böyle bir notta alışveriş bilgi taşımaz, yalnız gerekçeleri tekrarlar. Ölçüm bu tekrarın maliyetini sayacak.
Anlaşmazlığın hangi eksenlerde çıktığı da rastgele değildir. Biçim ekseni bir araca devredildiğinde tartışma kalmaz; testin bir durumu kapsayıp kapsamadığı ya da belgede bir satırın bulunup bulunmadığı gözlemle çözülür. Anlaşmazlık asıl olarak arayüz ve gerçekleştirim eksenlerinde çıkar, çünkü bu iki eksende birden çok savunulabilir çözüm vardır. Ölçüm anlaşmazlıkları yalnız bu iki sınıftan seçiyor.
Kurumsal karar alma düzenleri, yetki dağılımı ve ekip yapısı bu dersin konusu değildir; onlar Süreç, Ekip ve Teslimat kursunda kuruldu. Burada ölçülen şey incelemenin kendi sayılarıdır: inceleme turu, bekleme ve kodda kalan kusur.
Dört Karara Bağlama Kuralı
Ölçüm aynı 22 bulguyu dört kuralla işletiyor. Kurallar birbirinin yerine geçer; ekip bunlardan birini önceden seçer ve anlaşmazlık çıktığında uygular.
Kural yok. Anlaşmazlık her inceleme turunda yeniden tartışılır. Tartışmanın bir bitiş düzeneği olmadığı için değişikliğin açık kalabildiği en çok inceleme turu dolar ve anlaşmazlıklar açık kalır.
Ölçüte bağlama. Tartışma yazılı bir ölçüte götürülür: arayüz sözleşmesindeki bir kural, ölçülmüş bir sayı, bir testin geçip geçmemesi. Ölçüt tarafların tercihinden bağımsızdır ve karar ondan çıkar.
Sahibin kararı. Kod sahipliği tanımlıysa, ölçütle çözülemeyen anlaşmazlıkta kararı sahip verir. Karar tek alışverişte gelir ama sahip incelemenin içinde değildir; sürece dahil edilmesi ek bekleme yükler.
Ayrı iş öğesine ayırma. Anlaşmazlık bu değişiklikten çıkarılır ve kendi iş öğesine taşınır. Değişiklik hemen kapanır; tasarım tartışması sürer ve kusur bu değişiklikte düzeltilmez.
# ogretilen ornek not , calistirilmamistir , olcum degildir anlaşmazlık Aynı işlev için iki tasarım savunuluyor: seçenekleri tek bir sözlük parametresinde toplamak ya da ayrı adlandırılmış parametreler bırakmak. İki yazım da çalışıyor ve iki yazımın da testi geçiyor. ölçüte bağlanmış hâli Karar ölçütü, arayüz sözleşmesindeki geriye dönük uyumluluk kuralıdır: yeni seçenek eklendiğinde eski çağrılar değişmeden çalışmalıdır. Sözlük parametresi bu kuralı sağlıyor, ayrı parametreler her eklemede imzayı değiştiriyor. Not, sözlük parametresi seçilip belgeye yazıldığında kapanır.
Örnek, ölçüte bağlamanın ne yaptığını gösteriyor: tartışmayı bitiren şey tarafların ikna olması değil, kararı verecek yerin değişmesidir. Karar artık nottan değil, sözleşmeden çıkıyor ve not önceki dersin sınamasından geçen bir kapanma ölçütü kazanıyor.
Ölçümün varsayımları:
- IK13 — Yapılandırma sabittir: tek inceleyici, beş eksen, 600 satır, dikkat 12 öbek. Bulunan 22, kaçan 2 ve kaçanların ikisi de eksik gereksinim sınıfındadır. Karara bağlama kuralı bu sayıları değiştirmez.
- IK14 — Anlaşmazlık yalnız arayüz ve gerçekleştirim sınıflarındaki bulgularda
çıkabilir. Bu sınıflarda bulunan 9 notun hangilerinin anlaşmazlığa döndüğü
uretecile seçilir. - IK15 — Anlaşmazlık olmayan not eyleme dönük yazılmıştır ve 2 alışverişte kapanır. Önceki dersin en iyi rejimi bu derste taban kabul edilir.
- IK16 — Kural yokken anlaşmazlık hiç kapanmaz: her inceleme turunda yeniden tartışılır. Ölçüte bağlama ve sahibin kararı 3 alışverişte kapatır; ayrı iş öğesine ayırma 2 alışverişte kapatır ama kusuru koddan çıkarmaz.
- IK17 — Bir inceleme turu beklemeye 6 birim ekler. Sahibin kararı ayrıca 6 birim sahip beklemesi ekler: sahip incelemenin dışındadır ve sıraya girmesi gerekir.
- IK18 — Bir değişiklik en çok 6 inceleme turu açık kalabilir. Bu sınırda hâlâ açık olan notların kusurları kodda kalır.
- IK19 — Kümenin çözünürlüğü 24 kusurda 1/24 = 0,042’dir; bekleme birim başına ölçülür ve bir inceleme turundan küçük fark bu kümeyle savunulamaz.
Ölçüm
"""Anlasmazlik cozumu: ayni 22 bulgu, dort karara baglama kurali. Bolum 1 - anlasmazlik hangi bulgularda cikiyor. Bolum 2 - her kural kac inceleme turu, ne kadar bekleme ve kodda ne birakiyor. """ TOHUM = 20260815 EKSENLER = ("arayuz", "gerceklestirim", "test", "belge", "bicim") YAZILMAYAN = "eksik gereksinim" SINIFLAR = EKSENLER + (YAZILMAYAN,) DIKKAT = 12 OBEK = 50 TUR_BEKLEME = 6 # bir inceleme turunun beklemeye ekledigi birim KAPAK = 6 # bir degisikligin acik kalabildigi en cok inceleme turu TARTISILIR = ("arayuz", "gerceklestirim") # anlasmazlik cikabilen siniflar EYLEME_DONUK = 2 # anlasmazlik olmayan notun kapanma alisverisi # alisveris None ise anlasmazlik her turda yeniden tartisilir ve kapanmaz. KURALLAR = { "kural yok": {"alisveris": None, "sahip": 0, "erteler": False}, "ölçüte bağlama": {"alisveris": 3, "sahip": 0, "erteler": False}, "sahibin kararı": {"alisveris": 3, "sahip": TUR_BEKLEME, "erteler": False}, "ayrı iş öğesi": {"alisveris": 2, "sahip": 0, "erteler": True}, } def uretec(tohum): d = tohum % 2147483646 + 1 def r(n): nonlocal d d = (d * 48271) % 2147483647 return d % n return r def degisiklik(satir, kusur_sayisi=24, tohum=TOHUM): r, kusurlar = uretec(tohum), [] obek_sayisi = max(1, satir // OBEK) for i in range(kusur_sayisi): kusurlar.append({"no": i + 1, "sinif": SINIFLAR[r(6)], "obek": r(obek_sayisi)}) return {"satir": satir, "obek": obek_sayisi, "kusurlar": kusurlar} def incele(d, eksenler, dikkat=DIKKAT): okunan = set(range(min(dikkat, d["obek"]))) return {k["no"] for k in d["kusurlar"] if k["sinif"] in eksenler and k["obek"] in okunan} def dongu(gereken, kapak=KAPAK, tur_basina_bekleme=TUR_BEKLEME): """Her inceleme turu acik notlarin bir alisverisini tuketir.""" acik, tur, bekleme, not_turu = list(gereken), 0, 0, 0 while acik and tur < kapak: tur += 1 bekleme += tur_basina_bekleme not_turu += len(acik) acik = [g - 1 for g in acik if g > 1] return tur, bekleme, not_turu, len(acik) TAM = set(EKSENLER) d = degisiklik(600) bulunan = [k for k in d["kusurlar"] if k["no"] in incele(d, TAM)] kacan = [k for k in d["kusurlar"] if k not in bulunan] r = uretec(TOHUM) for k in bulunan: k["anlasmazlik"] = k["sinif"] in TARTISILIR and r(2) == 0 anl = [k for k in bulunan if k["anlasmazlik"]] print(f"bulunan {len(bulunan)}, kaçan {len(kacan)}, bunun yazılmayan sınıfı " f"{sum(1 for k in kacan if k['sinif'] == YAZILMAYAN)}") print(f"tartışılır sınıfta bulunan " f"{sum(1 for k in bulunan if k['sinif'] in TARTISILIR)}" f", anlaşmazlığa dönen {len(anl)}") print("anlaşmazlık sınıfları: " + ", ".join(f"{s} {sum(1 for k in anl if k['sinif'] == s)}" for s in TARTISILIR)) print() print(f"{'kural':<16s} {'tur':>4s} {'bekleme':>8s} {'not-turu':>9s} " f"{'anlaşmazlık not-turu':>21s} {'kapanan':>8s} {'ertelenen':>10s} " f"{'kodda kalan':>12s}") for ad, kural in KURALLAR.items(): gereken = [kural["alisveris"] or KAPAK + 1 if k["anlasmazlik"] else EYLEME_DONUK for k in bulunan] tur, bekleme, nt, acik = dongu(gereken) anl_nt = sum(min(g, tur) for g, k in zip(gereken, bulunan) if k["anlasmazlik"]) ertelenen = len(anl) if kural["erteler"] else 0 kapanan = len(bulunan) - acik - ertelenen print(f"{ad:<16s} {tur:4d} {bekleme + kural['sahip']:8d} {nt:9d} " f"{anl_nt:21d} {kapanan:8d} {ertelenen:10d} " f"{acik + ertelenen + len(kacan):12d}")
bulunan 22, kaçan 2, bunun yazılmayan sınıfı 2 tartışılır sınıfta bulunan 9, anlaşmazlığa dönen 6 anlaşmazlık sınıfları: arayuz 1, gerceklestirim 5 kural tur bekleme not-turu anlaşmazlık not-turu kapanan ertelenen kodda kalan kural yok 6 36 68 36 16 0 8 ölçüte bağlama 3 18 50 18 22 0 2 sahibin kararı 3 24 50 18 22 0 2 ayrı iş öğesi 2 12 44 12 16 6 8
Kararsız Bulgunun Taşıdığı
Yirmi iki bulgunun 9’u tartışılır sınıftadır ve bunların 6’sı anlaşmazlığa dönüyor: arayüzde 1, gerçekleştirimde 5. Kalan 16 not eksik bilgi notudur ve önceki dersin taban rejiminde, 2 alışverişte kapanır.
Kural yokken tablo çöküyor. Süreç 6 inceleme turuna ve 36 birim beklemeye çıkıyor; sonunda 16 not kapanıyor, 6 anlaşmazlık açık kalıyor ve kodda kalan kusur 8 oluyor. Sekizin 2’si hiçbir eksenin aramadığı sınıftır — eksik gereksinim, incelemenin göremeyeceği kusur. Kalan 6’sı görüldü, yazıldı, tartışıldı ve karara bağlanmadığı için kodda kaldı.
Anlaşmazlık not-turu sütunu maliyetin nereden geldiğini tek sayıda veriyor: 36. Altı anlaşmazlığın her biri altı inceleme turu boyunca açık kaldı; 6 × 6 = 36. Toplam yükün 68‘inin 36’sı, yani yarıdan fazlası, hiçbir şey üretmeyen tekrardır. Eksik bilgi notlarının hepsi ikinci turda kapanmıştı; üçüncü turdan altıncı tura kadar geçen dört tur yalnız altı anlaşmazlık için harcandı.
Buradaki sayı çifti tanıdıktır. Ortak kurgunun en kötü eksen yapılandırması da 6 inceleme turu / 36 bekleme üretiyordu. İki farklı neden, aynı fatura: orada dar bir eksen listesi yüzünden kusurlar ilk turda görülemiyordu, burada görülen kusurlar karara bağlanamıyor. Her iki durumda da inceleme turu sayısını uzatan şey, ilk turda kapanmayan işin miktarıdır.
Bu eşleşme ölçütlerin okunmasıyla ilgili bir uyarı da veriyor. Dışarıdan bakıldığında iki süreç aynı iki sayıyı gösteriyor; sayıların hangisinin eksen darlığından, hangisinin karara bağlanmamış tartışmadan geldiği tablonun kendisinde yazılı değildir. Aynı fatura, iki ayrı düzeltme gerektirir.
Karara Bağlamanın İki Yolu
Ölçüte bağlama en dengeli satırdır: 3 inceleme turu, 18 birim bekleme, 22 kapanan ve kodda kalan 2. İkisi de eksik gereksinim, yani incelemenin ulaşamayacağı sınıf. Bu kural, incelemenin bulabildiği her şeyi teslim eden tek kuraldır.
Bedeli kural yokluğuna göre negatiftir: 36 birimden 18 birime iner. Karara bağlama kuralı beklemeyi artırmıyor, azaltıyor. Ölçümün en pratik sonucu budur — anlaşmazlık çözümü bir ek süreç değil, sürecin en pahalı kalemini ortadan kaldıran şeydir.
Sahibin kararı aynı sonucu veriyor: 22 kapanan, kodda kalan 2. Aradaki fark bekleme sütununda: 24 birim, ölçüte bağlamadan 6 birim fazla. Fark tam olarak bir inceleme turudur ve nedeni yapısaldır — sahip incelemenin içinde değildir, dahil edilmesi gerekir. Bu kural ölçütün olmadığı ya da ölçütlerin çeliştiği anlaşmazlıklar için ayrılırsa fazladan 6 birim yalnız gereken yerde ödenir.
Hangi Ölçüt Bağlar
Ölçüte bağlamanın işe yaraması ölçütün bir niteliğine dayanır: tarafların tercihinden bağımsız olması ve önceden yazılmış olması. İki koşuldan biri eksikse tartışma ölçüt tartışmasına dönüşür ve tablodaki 18 birim geri gelmez.
Bağlayan ölçütler bellidir. Arayüz sözleşmesi geriye dönük uyumluluk sorularını kapatır; sözleşmenin ne söylediği tartışma sırasında değil, önceden yazılmıştır. Ölçülmüş bir sayı başarım anlaşmazlıklarını kapatır: iki tasarımın hangisinin daha hızlı olduğu bir tercih değil, bir ölçüm sonucudur. Bir testin geçip geçmemesi davranış anlaşmazlıklarını kapatır. Belgede yazılı bir kural — adlandırma düzeni, katman sınırı, bağımlılık yönü — yapısal anlaşmazlıkları kapatır.
Bağlamayan ölçütler de bellidir ve hepsinin ortak yanı, tartışma anında üretilmiş olmalarıdır: kişisel alışkanlık, “daha temiz” ya da “daha okunur” gibi ölçülemeyen sıfatlar, ve başka bir yerde şöyle yapıldığı gözlemi. Temiz kod ilkeleri Temiz Kod kursunda kuruldu ve orada bir kural listesidir; bir anlaşmazlığı kapatabilmeleri için o listenin ekipte yazılı ve bağlayıcı olması gerekir. Yazılı değilse ölçüt değil, ikinci bir tercihtir.
Buradan pratik bir sonuç çıkar: ölçüt tartışma sırasında değil, tartışmadan önce yazılır. Ölçümdeki 36 birimlik fatura, ölçütün eksikliğinin faturasıdır — ve o eksiklik incelemenin içinde giderilemez.
Erteleme Bir Karardır
Ayrı iş öğesine ayırma tablonun en hızlı satırıdır: 2 inceleme turu, 12 birim bekleme, toplam yük 44 not-turu. Bu sayılar tesadüf değildir; anlaşmazlıkların tartışılmadığı bir süreç, önceki dersin eyleme dönük rejimiyle aynı sayıları verir.
Ödenen bedel sağdaki iki sütunda: 6 ertelenen ve kodda kalan 8 kusur. Ertelenen notlar kaybolmuş değildir, kendi iş öğelerinde durur; ama o değişiklik birleştiğinde kod, 6 kusuru üzerinde taşır. Kodda kalan sayısı bakımından erteleme ile kural yokluğu aynı sonucu veriyor: ikisinde de 8. Fark, ertelemenin bunu 24 birim daha az beklemeyle ve bir kayıt bırakarak yapmasıdır.
Bu yüzden erteleme bir kaçış değil, bir karardır — ama ancak kaydı gerçekten tutulduğunda. İş öğesi açılmadan yapılan erteleme, ölçümde kural yokluğuyla aynı yere düşer: 6 kusur kodda, kaydı hiçbir yerde. Ertelemenin sınırı da buradan çıkar: anlaşmazlığın kendisi ertelenebilir, ama anlaşmazlığın altındaki kusur bir hataysa ertelenemez. Tasarımın hangi biçimde yazılacağı bekleyebilir; boş girdide sıfıra bölünmesi bekleyemez.
Özet
- Tasarım anlaşmazlığı eksik bilgi notundan mekanik olarak ayrılır: notu kapatacak bilgi taraflardan birinde varsa not eksik bilgi notudur, yoksa anlaşmazlıktır.
- Anlaşmazlık arayüz ve gerçekleştirim eksenlerinde çıkar; ölçümde tartışılır sınıftaki 9 bulgunun 6’sı anlaşmazlığa dönüyor.
- Kural yokken süreç 6 inceleme turu / 36 birim bekleme tutar, 16 not kapanır ve kodda 8 kusur kalır. Toplam yükün 68 not-turunun 36’sı yalnız altı anlaşmazlığın tekrarıdır.
- Ölçüte bağlama 3 tur / 18 birim ile 22 notun hepsini kapatır; kodda kalan 2, hiçbir eksenin aramadığı eksik gereksinim sınıfıdır. Sahibin kararı aynı sonucu verir ama sahip incelemenin dışında olduğu için 24 birim tutar.
- Ayrı iş öğesine ayırma en hızlı satırdır (2 tur / 12 birim) ama kodda 8 kusur bırakır — kural yokluğuyla aynı sayı, çok daha az beklemeyle ve bir kayıtla.
Sonraki Adım
Üç ders üç ayrı nedenle aynı iki sayıyı üretti: inceleme turu ve bekleme. Değişiklik boyutu okunan öbeği belirledi, not yazımı kapanma hızını, karara bağlama kuralı ise kapanıp kapanmayacağını. Sonraki ders bu iki sayıyı doğrudan ölçüt olarak alıyor: eksen atamasının kendisi inceleme turu ve bekleme üzerinde ne yapıyor, inceleme kuyruğunun sağlığı nasıl okunur, ve bu ölçütlerin neden kişi başına raporlanmadığı.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.