İçeriğe geç
academia.sh

Ders 08 / 15

Geri Bildirim Dili

Aynı 22 bulgu eyleme dönük yazıldığında 2 inceleme turunda kapanır, kapanma ölçütü yazılmadığında 4 turda; üçüncü turda birleştirilen değişiklikte ölçütsüz yazım 22 notun 22'sini açık bırakır.

İçindekiler

Önceki ders incelenebilir değişikliğin sınırını ölçtü: dikkat 12 öbekte sabit kaldığı için aynı 24 kusur 100 satırda 22 kez, 2400 satırda 2 kez bulunuyordu. Değişiklik okunabilir boyuttayken inceleyen bulabileceğinin neredeyse hepsini buluyor.

Ama bulunan bir kusur, düzeltilmiş bir kusur değildir. Aradaki mesafeyi tek bir şey kapatır: inceleme notu. Bu dersin sorusu notun kibarlığı değil, işlevidir — aynı bulgu iki ayrı biçimde yazıldığında kusurun koddan çıkması kaç inceleme turu sürer, ve hangi yazım kusuru kodda bırakır.

Notun Öznesi

Bu kursun sınırı burada en somut hâlini alır: inceleme notunun öznesi değişikliktir. Kural bir görgü kuralı değil, bir işlerlik kuralıdır ve gerekçesi ölçülebilir.

Sınama mekaniktir. Notun cümlesine bakılır ve tek bir soru sorulur: öznesi ne? Özne bir kod öğesiyse — bir işlev, bir parametre, bir koşul, bir test, bir belge satırı — not yerindedir. Özne bir rolse not yeniden yazılır ve öznesi, notun aslında konuştuğu kod öğesiyle değiştirilir. İçerik kaybolmaz; yalnız cümle, düzeltilebilir olan şeyi işaret etmeye başlar.

Gerekçe şudur: bir notun kapanma ölçütü kodda bulunur. “Şu koşul boş girdide sıfıra bölüyor” biçiminde bir not, o koşul değiştiğinde kapanır ve kapandığı herkesçe görülür. Öznesi rol olan bir cümlenin böyle bir ölçütü yoktur — neyin değişmesiyle kapanacağı yazılı değildir, bu yüzden kapanamaz ve inceleme turlarını dolaşır. Ölçüm bu dolaşmanın bedelini sayacak.

Aynı sınır ölçümün kendisine de uygulanır. Bu derste sayılan şey kimin kaç not yazdığı değil, notun hangi biçimde yazıldığında kaç inceleme turu sürdüğüdür. Ölçülen özne yine değişikliktir.

Notun Üç Yazımı

Aynı bulgu üç biçimde yazılabilir ve üçü de değişiklik hakkındadır. Fark, notun okurun eline ne verdiğidir.

# ogretilen ornek not , calistirilmamistir , olcum degildir

gözlem
  ortalama() boş liste geldiğinde beklenmedik davranıyor.

ölçütsüz istek
  Boş liste durumu daha sağlam ele alınmalı.

eyleme dönük
  ortalama() boş liste aldığında toplamı uzunluğa bölüyor ve sıfıra bölme
  hatası veriyor. Bu durumda 0.0 dönmesi ya da tanımlı bir hata yükseltilmesi
  gerekiyor. Hangisi seçilirse test dosyasına o durumun karşılığı eklenmeli;
  not, o test geçtiğinde kapanır.

Gözlem, ne görüldüğünü söyler ve orada durur. Doğrudur, yerini gösterir, ama ne isteneceğini yazmaz; yazanın bir soru sorması ve inceleyenin yanıtlaması gerekir. Bu bir alışveriştir ve bir inceleme turu tutar.

Ölçütsüz istek bir değişiklik ister ama isteğin ne zaman karşılandığını söylemez. “Daha sağlam” bir ölçüt değildir: yazan bir düzeltme gönderir, inceleyen düşündüğü şeyin bu olmadığını görür, not yeniden açılır. Bu iki alışveriştir.

Eyleme dönük not üç şeyi birden taşır: ne görüldü, ne değişmeli, ne olunca kapanır. Üçüncüsü en çok atlanan ve en çok kazandıranıdır. Kapanma ölçütü not içinde yazıldığında, düzeltmenin doğru olup olmadığı tartışma gerektirmez.

# ogretilen ornek not , calistirilmamistir , olcum degildir

gözlem
  Yeni parametre imzanın ortasına eklenmiş.

eyleme dönük
  esik parametresi imzanın ortasına eklendiği için konuma göre çağıran kod
  sessizce kayıyor. Parametre imzanın sonuna alınmalı ve varsayılan değer
  verilmeli; böylece eski çağrılar değişmeden çalışır. Not, imza sonda ve
  varsayılanlı olduğunda kapanır.

İkinci örnek eyleme dönüklüğün bir üslup değil bir bilgi meselesi olduğunu gösteriyor. Eyleme dönük not daha uzundur çünkü daha fazla şey söyler: gözlemin taşımadığı iki bilgi, istenen değişiklik ve kapanma ölçütü, orada yazılıdır. Kısalık burada bir erdem değildir; eksik bilgi sonraki inceleme turunda geri gelir.

Soru Biçimindeki Not

Notların bir bölümü soru biçiminde yazılır ve bu biçim tek başına iyi ya da kötü değildir. Belirleyici olan, sorunun durumu adlandırıp adlandırmadığıdır.

Durumu adlandıran bir soru eyleme dönüktür: hangi girdiyle, hangi kod öğesinde, hangi sonucun beklendiği yazılıysa yazan soruyu ya bir düzeltmeyle ya da tek cümlelik bir gerekçeyle kapatabilir. Durumu adlandırmayan bir soru ise gözlemle aynı sınıftadır — bir alışveriş ekler, çünkü önce hangi durumdan söz edildiğinin belirlenmesi gerekir.

Soru biçiminin gerçek işlevi başka bir yerdedir: notun kendisi yanlış bir varsayıma dayanıyor olabilir. Böyle bir not soru biçiminde yazıldığında varsayım tek bir yanıtla düzelir ve bu bir alışveriş tutar; aynı varsayım kesin bir istek biçiminde yazıldığında ise önce yanlış bir düzeltme gönderilir ve iki alışveriş tutar. Ölçüm bunu doğrudan gösteriyor: ölçütsüz istek rejiminin fazladan iki turu, yanlış anlaşılmanın ancak düzeltme geldikten sonra fark edilmesinden geliyor. Bilinmeyen bir şey varsa, bilinmediğini yazmak turdan tasarruf ettirir.

Ölçümün varsayımları:

  • IK7 — Yapılandırma sabittir: tek inceleyici, beş eksenin hepsi, 600 satır, dikkat 12 öbek. Bulunan 22, kaçan 2 ve kaçan ikisi de eksik gereksinim sınıfındadır. Not yazımı bu sayıları değiştirmez; ölçülen şey bulunanın kapanmasıdır.
  • IK8 — Bulunan her kusur için bir not yazılır. Notun yazımı, kusurun koddan çıkması için gereken alışveriş sayısını belirler: eyleme dönük 2, gözlem 3, ölçütsüz istek 4.
  • IK9 — Bir inceleme turu, o anda açık olan bütün notların bir alışverişini birden tüketir. Notlar sırayla değil toplu ele alınır; bu yüzden inceleme turu sayısını en yavaş not belirler.
  • IK10 — Bir inceleme turunun beklemeye eklediği süre 6 birimdir ve yazımdan bağımsızdır. Not-turu, bir notun açık kaldığı her inceleme turu için bir birim sayılır; toplam yükün sayımıdır.
  • IK11 — Karışık rejimde her notun yazımı uretec ile seçilir; hiçbir kural uygulanmadığında notların ne dağılımla yazıldığının bir örneğidir.
  • IK12 — İkinci ölçümde değişiklik üçüncü inceleme turunda birleştirilir. O anda açık kalan notların kusurları kodda kalır ve hiç bulunmayan 2 kusura eklenir.

Ölçüm

"""Geri bildirim dili: ayni 22 bulgu, dort not yazimi.

Bolum 1 - her yazim kac inceleme turunda kapanir, bekleme ve tasinan not-turu.
Bolum 2 - degisiklik ucuncu turda birlestirilirse hangi notlar acik kalir.
"""
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
# Bir notun kapanmasi icin gereken alisveris sayisi.
YAZIMLAR = {"eyleme dönük": 2, "gözlem": 3, "ölçütsüz istek": 4}


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=6, 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 = sorted(incele(d, TAM))
kacan = [k for k in d["kusurlar"] if k["no"] not in set(bulunan)]
r = uretec(TOHUM)
karisik = [list(YAZIMLAR)[r(3)] for _ in bulunan]
REJIMLER = {ad: [ad] * len(bulunan) for ad in YAZIMLAR}
REJIMLER["karışık"] = karisik

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("karışık rejimin dağılımı: " +
      ", ".join(f"{a} {karisik.count(a)}" for a in YAZIMLAR))
print()
print(f"{'not yazımı':<16s} {'tur':>4s} {'bekleme':>8s} {'not-turu':>9s} "
      f"{'kapanmayan':>11s} {'kodda kalan':>12s}")
for ad, notlar in REJIMLER.items():
    tur, bekleme, nt, acik = dongu(YAZIMLAR[n] for n in notlar)
    print(f"{ad:<16s} {tur:4d} {bekleme:8d} {nt:9d} {acik:11d} "
          f"{acik + len(kacan):12d}")

print()
print("değişiklik üçüncü inceleme turunda birleştirilirse")
print(f"{'not yazımı':<16s} {'tur':>4s} {'bekleme':>8s} {'kapanan':>8s} "
      f"{'kapanmayan':>11s} {'kodda kalan':>12s}")
for ad, notlar in REJIMLER.items():
    tur, bekleme, nt, acik = dongu((YAZIMLAR[n] for n in notlar), kapak=3)
    print(f"{ad:<16s} {tur:4d} {bekleme:8d} {len(notlar) - acik:8d} "
          f"{acik:11d} {acik + len(kacan):12d}")
bulunan 22, kaçan 2, bunun yazılmayan sınıfı 2
karışık rejimin dağılımı: eyleme dönük 2, gözlem 11, ölçütsüz istek 9

not yazımı        tur  bekleme  not-turu  kapanmayan  kodda kalan
eyleme dönük        2       12        44           0            2
gözlem              3       18        66           0            2
ölçütsüz istek      4       24        88           0            2
karışık             4       24        73           0            2

değişiklik üçüncü inceleme turunda birleştirilirse
not yazımı        tur  bekleme  kapanan  kapanmayan  kodda kalan
eyleme dönük        2       12       22           0            2
gözlem              3       18       22           0            2
ölçütsüz istek      3       18        0          22           24
karışık             3       18       13           9           11

Turun Nereden Geldiği

Üst tablonun ilk sütunları aynı 22 bulgunun bedelini veriyor. Eyleme dönük yazımda süreç 2 inceleme turu ve 12 birim bekleme ile kapanıyor. Gözlem yazımında 3 tur / 18 birim, ölçütsüz istekte 4 tur / 24 birim. Bulunan hiç değişmedi: her rejimde 22 bulgu, 2 kaçan, kaçanların ikisi de eksik gereksinim. Not yazımı bulunanı değiştirmez; bulunanın ne zaman koddan çıktığını değiştirir.

Kapanmayı geciktiren şeyin ne olduğu sayının içinde yazılı. Gözlem yazımı bir alışveriş ekliyor çünkü eksik olan bilgi — ne isteniyor — sonraki inceleme turunda sorulup yanıtlanıyor. Ölçütsüz istek iki alışveriş ekliyor çünkü eksik olan bilgi ancak yanlış bir düzeltme geldikten sonra ortaya çıkıyor. Her eksik bilgi, kendisini bir inceleme turunda geri ister.

Not-turu sütunu yükü daha iyi gösteriyor: 44, 66, 88. Ölçütsüz yazım eyleme dönük yazımın tam iki katı yük üretiyor ve bunun tamamı aynı 22 bulgunun taşınmasıdır. Kodda hiçbir fark yok; fark yalnız notların ne söylediğinde.

Karışık rejim ise inceleme turu sayısının nasıl belirlendiğini açığa çıkarıyor. Dağılım 2 eyleme dönük, 11 gözlem, 9 ölçütsüz istek; toplam yük 73 not-turu, yani ortalama üç rejimin arasında. Buna karşılık inceleme turu sayısı 4 — yani en yavaş rejimin sayısı. Toplu ele alınan notlarda inceleme turu sayısını ortalama değil, en yavaş not belirler. Yirmi iki notun on üçü kusursuz yazılsa bile, kalan dokuzu süreci dört tura taşır.

Kapanmadan Kapanan İnceleme

Alt tablo gerçek bir kısıt ekliyor: değişiklik sonsuza kadar açık kalmaz. Üçüncü inceleme turunda birleştirildiğinde her rejim aynı beklemeyi ödüyor ama farklı şeyler teslim ediyor.

Eyleme dönük yazım zaten ikinci turda bitmişti; sınır ona dokunmuyor. Gözlem yazımı tam üçüncü turda kapanıyor. Ölçütsüz istek rejiminde ise kapanan 0, kapanmayan 22 ve kodda kalan kusur 24 — yani hepsi. Bu, tablonun en sert satırıdır: inceleme 24 kusurun 22’sini buldu ve hiçbirini teslim etmedi. Bulunan sayısıyla ölçülen bir süreç bu incelemeyi başarılı sayardı.

Karışık rejim daha gerçekçi bir sonuç veriyor: 13 kapanan, 9 kapanmayan, kodda kalan 11. On birin 2’si hiçbir eksenin aramadığı sınıftır — eksik gereksinim, incelemenin görebileceği bir şey değildi. Kalan 9’u ise görüldü, yazıldı ve yazımı yüzünden kapanamadı. İki kayıp arasındaki fark önemlidir: birincisi incelemenin sınırıdır, ikincisi incelemenin kendi ürettiği kayıptır ve tamamen ortadan kaldırılabilir.

Kümenin çözünürlüğü 24 kusurda 1/24 = 0,042‘dir. 9 kusurluk fark bunun yirmi katıdır ve tartışmasız ölçüm bandının içindedir. 22’den 13’e inen kapanan sayısı da öyle.

Alt tablonun bekleme sütunu ayrıca dikkat çekicidir: gözlem, ölçütsüz istek ve karışık rejimlerin üçü de 18 birim harcıyor. Sınıra dayanan üç süreç aynı süreyi tüketiyor; farklılaşan tek şey o sürenin sonunda kaç kusurun gerçekten koddan çıktığı — sırasıyla 22, 0 ve 13. Yalnız beklemeye bakan bir okuma bu üç rejimi ayırt edemez.

Notu Eyleme Dönük Kılan Alışkanlıklar

Ölçümden çıkan üç alışkanlık doğrudan uygulanabilir ve üçü de notun içine bir bilgi ekler.

Kapanma ölçütünü yaz. Not, hangi gözlemlenebilir durumda kapanacağını söylemeli: bir testin geçmesi, bir imzanın belirli hâle gelmesi, bir belge satırının eklenmesi. Ölçütsüz istek rejiminin fazladan iki turu buradan geliyor.

İsteği gözlemden ayır. Gözlem yerini gösterir, istek yönü verir. İkisi aynı notta bulunmadığında eksik olan, sonraki inceleme turunda sorulur.

Bağlayıcı olmayanı işaretle. Her not bir engel değildir; kimi not bir öneridir ve düzeltilmeden de birleştirilebilir. Bunu notun kendisinde belirtmek, bağlayıcı olmayan notların inceleme turu sayısına katılmasını önler — karışık rejimin dört tura çıkmasının nedeni tam olarak birkaç notun yavaşlığıydı.

Aynı bulguyu bir kez yaz. Bir düzenin on yerde tekrarlandığı bir değişiklikte her tekrara ayrı not yazmak not sayısını büyütür ama bilgiyi büyütmez; on notun onu aynı alışverişi bekler. Düzeni bir kez yazıp kapsamını belirtmek — hangi dosyalarda, hangi öğelerde — aynı kapanma ölçütünü tek notla verir.

Dört alışkanlığın ortak yanı, hepsinin notu daha bilgili kılmasıdır. Ölçümde yavaşlığın tek kaynağı vardı: notta olmayan bilginin sonraki inceleme turunda istenmesi. Nezaket bu tablonun hiçbir sütununda görünmez; görünen şey, bilginin nerede durduğudur.

Özet

  • İnceleme notunun öznesi değişikliktir; sınama mekaniktir — özne bir kod öğesi değilse not, konuştuğu kod öğesi özne olacak biçimde yeniden yazılır.
  • Gerekçe ölçülebilir: notun kapanma ölçütü kodda bulunur. Ölçütü olmayan not neyle kapanacağını söylemez ve inceleme turlarını dolaşır.
  • Aynı 22 bulgu eyleme dönük yazıldığında 2 tur / 12 bekleme / 44 not-turu, gözlem yazıldığında 3 / 18 / 66, ölçütsüz istek yazıldığında 4 / 24 / 88 tutar. Bulunan ve kaçan hiç değişmez: 22 ve 2, kaçanların ikisi de eksik gereksinim.
  • Notlar toplu ele alındığı için inceleme turu sayısını ortalama değil en yavaş not belirler: karışık rejimde 22 notun 13’ü hızlı yazılmış olsa da süreç 4 tur sürer.
  • Değişiklik üçüncü inceleme turunda birleştirildiğinde ölçütsüz yazım 0 not kapatır ve 24 kusur kodda kalır; karışık yazım 13 kapatır, kodda 11 kalır — bunun 2’si hiç bulunamayan sınıftır, 9’u ise bulunup kapanamayandır.

Sonraki Adım

Ölçüm bir şeyi varsayıyordu: yeterince alışveriş yapıldığında not kapanır. Bu her zaman doğru değildir. Kimi notta eksik olan bilgi değil, anlaşmadır — yazan ile inceleyen aynı kod öğesi hakkında farklı bir tasarım savunur ve alışveriş sayısını artırmak tarafları yaklaştırmaz. Sonraki ders böyle bir bulgunun kaç inceleme turu taşındığını ve dört ayrı karara bağlama kuralının beklemeye, kapanan nota ve kodda kalan kusura ne yaptığını ölçüyor.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat