İçeriğe geç
academia.sh

Ders 05 / 15

Sürüm Notları

Dört tür ürünü bugünkü hâliyle anlatır ve hiçbiri zamanı taşımaz; ham değişiklik listesi on ikinci sürümde 56 bayat iddianın 17'sini tarihlendirir ve sessiz olanların 0'ını, aynı dokuz girdiye yanlışlanan iddia yazıldığında 56'sının 56'sı ve sessiz 39'un 39'u tarihlenebilir olur.

İçindekiler

Önceki ders üretilen referansı altıncı sürümde 13/15 ile bıraktı ve okura bir soru borçlandırdı: kalan ikisi ne zaman düştü? İkinci ders bu sorunun adını çoktan koymuştu — altı okur sorusundan biri, “hangi sürümde değişti”, dört türün hiçbirine düşmüyordu.

Bu ders o boşluğu kapatan metni ölçer. Sorulan şey sürüm notunun nasıl yayımlandığı değil, neyi tarihlenebilir kıldığıdır: bayat bir iddiaya bakan okur, o cümlenin hangi sürümde yanlışlandığını nereden öğrenecek?

Zamanı Taşıyan Tek Metin

Dört türün ortak bir özelliği vardır ve bugüne kadar hiç adlandırılmadı: hepsi şimdiki zamanla yazılır. Öğretici bugün nasıl başlanacağını, nasıl yapılır bugün nasıl yapılacağını, açıklama bugün neden öyle olduğunu, referans bugün hangi alanın hangi tipte olduğunu söyler. Dördü de geçmişi silen metinlerdir; bir alanın tipi değiştiğinde referans eski tipi anmaz, yenisini yazar ve eskisi hiç var olmamış gibi olur.

Bu, dört tür için doğru bir tasarımdır. Referansın içine tarihçe konursa okur her hücrede hangi satırın bugüne ait olduğunu ayırmak zorunda kalır ve referansın tek işlevi — hızlı doğrulama — kaybolur. Ama bir bedeli var: hiçbir tür zamanı taşımadığı için, hiçbiri “ne zaman değişti” sorusunu yanıtlayamaz.

Sürüm notu tam olarak bu boşluğa oturur ve ötekilerden farkı içeriğinde değil, indeksinde durur. Dört tür konuya göre indekslenir: okur bir konu arar, o konunun bölümünü açar. Sürüm notu zamana göre indekslenir: okur bir sürüm arar, o sürümün girdisini açar. Bu yüzden sürüm notu dört türün beşincisi değil, ayrı bir eksende duran ayrı bir türdür.

Sürümün hangi hattan geçerek yayımlandığı, notun alanlarının okurun altı sorusunu nasıl karşıladığı ve etiketin neyi işaretlediği Kod İnceleme ve Ekip Süreci kursunda ölçüldü ve burada tekrarlanmaz. Orada ölçülen şey notun okura ne söylediğiydi; burada ölçülen şey notun öteki dokümanlara ne yaptığıdır.

İki Liste

Aynı sürüm iki biçimde yazılabilir ve ikisi de aynı olaydan üretilir.

# kurgu ürünün sürüm notundan iki biçim
# örnek metin, çalıştırılmamıştır

ham değişiklik listesi
  s6  ölçüm çağrısının seçenek adları düzenlendi
  s6  özet akışında adım sırası değişti

anlam listesi
  s6  ölçüm çağrısının seçenek adları düzenlendi
      yanlışlanan: referanstaki parametre satırları,
      nasıl yapılır metnindeki çağrı örnekleri
  s6  özet akışında adım sırası değişti
      yanlışlanan: öğreticinin üçüncü ve dördüncü adımı

İki liste aynı sayıda girdi taşıyor. Fark tek bir alanda: ikincisi her girdiye ne yanlışlandığını yazıyor. Bu alan sıradan bir ayrıntı gibi görünür ama yönü tersine çevirir. Ham liste değişikliğin tarafından yazılmıştır: yapılan işi anlatır. Anlam listesi dokümanın tarafından yazılmıştır: hangi cümlelerin bugünden itibaren yanlış olduğunu söyler.

Bu ayrımın okur üzerindeki etkisi, notun ne zaman işe yaradığıyla ilgilidir. Ham listeye bakan okur, aradığının ne olduğunu zaten bilmek zorundadır. Bir örnek elinde patladıysa hangi çağrının bozulduğunu bilir ve listede o çağrıyı arar; bulunca tarihi de öğrenir. Ama hiçbir şey patlamadıysa listeye bakmak için bir nedeni yoktur, çünkü hangi cümlenin yanlışlandığını bilmiyordur. Ham liste, arızayı zaten duymuş okura yarar.

Notun Boyu

Bir not yazmanın maliyeti girdi sayısıdır ve o sayı sanıldığı kadar büyük değildir. On iki sürüm boyunca yüzeyler kendi sıklıklarında değişir; bazı sürümlerde hiçbir yüzey değişmez, bazılarında birden fazlası aynı anda değişir. Not yalnız değişimin olduğu sürümlerde girdi taşır. Ölçüm bu girdi sayısını ve girdi başına tarihlenen iddia sayısını da verecek.

Girdinin ne zaman yazıldığı da bir tercihtir ve sonucu belirler. Not yayım gününde toplu olarak yazılırsa, yazan kişi geriye dönüp her değişikliğin hangi cümleleri yanlışladığını çıkarmak zorunda kalır; bu bilgi o noktada artık kolay bulunmaz ve pratikte yazılmaz. Girdi değişiklik anında yazılırsa, yanlışlanan cümleyi bilen kişi zaten oradadır: değişikliği yapan kişi. Aradaki fark bir disiplin sorusu gibi görünür ama ölçülen sütunu doğrudan belirler — aşağıdaki tabloda anlam listesini ham listeden ayıran tek alan, yalnız o anda ucuzdur.

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

  • DT37 — Ölçülen küme kursun kurgu kümesidir: 56 iddia, dört tür, dört yüzey ve 17 gömülü örnek. Karışım değiştirilmez.
  • DT38 — Yüzey sıklıkları sabittir: imza 2, akış 3, ad 5, kavram 12 sürümde bir. Bir yüzey, sıklığının katı olan her sürümde bir kez değişir.
  • DT39 — Bir iddianın düşüş sürümü, bağlandığı yüzeyin ilk değiştiği sürümdür ve kurguyu biz yazdığımız için bilinir. Okur bunu ancak yazılmışsa bilir.
  • DT40 — Sürüm notu, en az bir yüzeyin değiştiği her sürüm için bir girdi taşır. Hiçbir yüzeyin değişmediği sürümlerde girdi yoktur.
  • DT41 — Üç not biçimi denenir: sürüm notu yok, ham değişiklik listesi ve anlam listesi. Üçü de aynı olaylardan üretilir.
  • DT42Sürüm notu yokken bayat bir iddia tarihlenemez; dört türün hiçbiri zaman taşımaz.
  • DT43Ham değişiklik listesi yalnız yapılanı yazar. Bir iddiayı tarihlenebilir kılması için okurun o iddiadan şüphelenmiş olması gerekir; bu ölçümde şüphe yalnız gömülü bir iddia kırıldığında doğar.
  • DT44Anlam listesi her girdiye yanlışlanan iddiaları yazar; okurun şüphelenmesi gerekmez, bayat olan her iddia tarihlenebilir olur.
  • DT45 — Bir iddia tarihlenebilir sayılmak için önce bayat olmalıdır; henüz doğru olan iddia bu sütuna girmez.
  • DT46 — Kümenin çözünürlüğü 1/56’dır; not girdisi ölçeğinde 1/9’dur.

Ölçüm

"""Surum notu: bayat bir iddianin ne zaman dustugu okur icin tarihlenebilir mi.

Bolum 1 - on iki surumdeki degisim olaylari ve notun satir sayisi.
Bolum 2 - uc not bicimi altinda tarihlenebilir bayat iddia ve sessiz olani.
"""
TURLER = {
    "öğretici":      {"akis": 9, "imza": 3, "ad": 2, "kavram": 1},
    "nasıl yapılır": {"akis": 6, "imza": 5, "ad": 2, "kavram": 1},
    "açıklama":      {"akis": 1, "imza": 1, "ad": 1, "kavram": 9},
    "referans":      {"akis": 0, "imza": 13, "ad": 2, "kavram": 0},
}
SIKLIK = {"imza": 2, "akis": 3, "ad": 5, "kavram": 12}
ORNEKLI = {"öğretici": 0.60, "nasıl yapılır": 0.70, "açıklama": 0.10,
           "referans": 0.00}
SURUMLER = (2, 3, 5, 6, 12)
SON = 12


def iddialar():
    liste, no = [], 0
    for tur, dagilim in TURLER.items():
        gomulu_hedef = 0
        for yuzey, adet in dagilim.items():
            for _ in range(adet):
                no += 1
                gomulu_hedef += ORNEKLI[tur]
                gomulu = gomulu_hedef >= 1 and yuzey != "kavram"
                if gomulu:
                    gomulu_hedef -= 1
                liste.append({"no": no, "tur": tur, "yuzey": yuzey,
                              "gomulu": gomulu, "dusen": SIKLIK[yuzey]})
    return liste


def olaylar(son=SON):
    """Her surumde hangi yuzeyler degisti: notun yazacagi girdiler."""
    return [(s, [y for y in SIKLIK if s % SIKLIK[y] == 0])
            for s in range(1, son + 1)
            if any(s % SIKLIK[y] == 0 for y in SIKLIK)]


# Not bicimleri: bayat bir iddiayi hangi kosulda tarihlenebilir kiliyorlar.
BICIMLER = {
    "sürüm notu yok": lambda i: False,
    "ham değişiklik listesi": lambda i: i["gomulu"],
    "anlam listesi": lambda i: True,
}

L = iddialar()
O = olaylar()
print(f"iddia {len(L)} | örneğe gömülü {sum(i['gomulu'] for i in L)} | "
      f"on iki sürümde değişim olayı {sum(len(y) for _, y in O)} | "
      f"not girdisi {len(O)}")
print("not girdileri: " + "; ".join(f"s{s}: {', '.join(y)}" for s, y in O))

print()
print(f"{'sürüm':>5s} {'bayat':>5s} {'sessiz':>6s} " +
      " ".join(f"{ad:>23s}" for ad in BICIMLER))
print(f"{'':5s} {'':5s} {'':6s} " +
      " ".join(f"{'tarihlenebilir/sessizi':>23s}" for _ in BICIMLER))
for s in SURUMLER:
    bayat = [i for i in L if s // SIKLIK[i["yuzey"]] >= 1]
    sessiz = [i for i in bayat if not i["gomulu"]]
    satir = f"{s:5d} {len(bayat):5d} {len(sessiz):6d} "
    for ad, kural in BICIMLER.items():
        t = [i for i in bayat if kural(i)]
        ts = [i for i in t if not i["gomulu"]]
        satir += f" {f'{len(t)}/{len(ts)}':>23s}"
    print(satir)

print()
print(f"{'not biçimi':<24s} {'girdi':>5s} {'tarihlenen iddia':>16s} "
      f"{'girdi başına':>12s} {'sessizden':>9s}")
son_bayat = [i for i in L if SON // SIKLIK[i["yuzey"]] >= 1]
son_sessiz = [i for i in son_bayat if not i["gomulu"]]
for ad, kural in BICIMLER.items():
    t = [i for i in son_bayat if kural(i)]
    ts = [i for i in t if not i["gomulu"]]
    girdi = 0 if ad == "sürüm notu yok" else len(O)
    pay = len(t) / girdi if girdi else 0
    print(f"{ad:<24s} {girdi:5d} {f'{len(t)}/{len(son_bayat)}':>16s} "
          f"{pay:12.3f} {f'{len(ts)}/{len(son_sessiz)}':>9s}")
iddia 56 | örneğe gömülü 17 | on iki sürümde değişim olayı 13 | not girdisi 9
not girdileri: s2: imza; s3: akis; s4: imza; s5: ad; s6: imza, akis; s8: imza; s9: akis; s10: imza, ad; s12: imza, akis, kavram

sürüm bayat sessiz          sürüm notu yok  ham değişiklik listesi           anlam listesi
                    tarihlenebilir/sessizi  tarihlenebilir/sessizi  tarihlenebilir/sessizi
    2    22     17                      0/0                     5/0                   22/17
    3    38     24                      0/0                    14/0                   38/24
    5    45     28                      0/0                    17/0                   45/28
    6    45     28                      0/0                    17/0                   45/28
   12    56     39                      0/0                    17/0                   56/39

not biçimi               girdi tarihlenen iddia girdi başına sessizden
sürüm notu yok               0             0/56        0.000      0/39
ham değişiklik listesi       9            17/56        1.889      0/39
anlam listesi                9            56/56        6.222     39/39

Tarihlenebilirliğin Okunması

İlk satır notun boyunu veriyor: on iki sürümde 13 değişim olayı var ama not yalnız 9 girdi taşıyor. Üç sürümde birden fazla yüzey aynı anda değişiyor — altıncı sürümde imza ile akış, onuncuda imza ile ad, on ikincide üçü birden. Üç sürümde ise hiçbir şey değişmiyor ve not o sürümler için girdi taşımıyor.

Üst tablonun sol sütunları kursun tanıdık sayılarını veriyor: bayat iddia ikinci sürümde 22, üçüncüde 38, beşincide 45, on ikincide 56; sessiz olanlar sırasıyla 17, 24, 28 ve 39. Sağdaki üç sütun aynı satırlarda okurun ne tarihlendirebildiğini gösteriyor.

Sürüm notu yokken her satırda 0/0. Bu, dersin başındaki savın sayısal karşılığıdır: dört tür ne kadar iyi yazılırsa yazılsın, tek bir iddianın ne zaman yanlışlandığını söyleyemez.

Ham değişiklik listesi ikinci sürümde 5, üçüncüde 14, beşincide 17 tarihlendiriyor ve orada duruyor. On ikinci sürümde bayat iddia 56’ya çıktığı hâlde ham liste hâlâ 17’de kalıyor. Sayı tesadüf değil: gömülü iddia sayısı 17’dir ve ham liste tam olarak onları tarihlendirir, bir tanesini bile fazla değil. Beşinci sürümden sonra ham listenin eğrisi düzleşiyor: değişiklikler sürüyor, not büyüyor, tarihlenen iddia sayısı sabit kalıyor. Not yazmaya harcanan emek artıyor, karşılığı artmıyor.

Asıl bulgu ise ham listenin sağdaki payında: 0/39. Sessiz bayatlayan otuz dokuz iddianın hiçbiri ham değişiklik listesiyle tarihlenemiyor. Neden açık — ham liste yalnız şüphelenmiş okura yarar ve sessiz bir iddia kimseyi şüphelendirmez. Ham liste, işe yaraması için okurun zaten bilmesini gerektiren bir metindir; bilmeyen okur için hiçbir şey yapmaz.

Anlam listesi aynı satırlarda bayat sayısının tamamını tarihlendiriyor: 22/17, 38/24, 45/28 ve 56/39. Son sütun bunu tek bir oranla veriyor — sessiz otuz dokuz iddianın 39’u tarihlenebilir hâle geliyor.

Alt tablo bedeli ölçüyor ve dersin en pratik sonucu orada. İki biçim de 9 girdi taşıyor. Anlam listesi daha uzun bir not değildir; aynı dokuz girdiye fazladan bir alan yazılmış hâlidir. Buna karşılık girdi başına tarihlenen iddia 1,889’dan 6,222’ye çıkıyor — üç katından fazlası. Yazma emri tek cümleyle söylenebilir: girdiye ne yapıldığını yazmak yetmez, neyi yanlışladığını yazmak gerekir.

Bu, kursun boyunca sessiz bayatlamaya ulaşan ilk düzenektir ve nasıl ulaştığı önemli. Sessiz bayatlamayı görünmez kılan şey, dokümanın kendisinden hiçbir sinyal gelmemesiydi. Anlam listesi sinyali dokümandan değil, değişikliğin kendisinden alır: kod değişirken hangi cümlelerin yanlışlandığı o anda bilinir, sonradan bilinmez. Notun tuttuğu şey bu andır. Yazılmazsa kaybolur ve bir daha üretilemez.

Notun Kapatmadığı

Tablo notun ne yaptığını söylüyor; ne yapmadığını da yazmak gerekir, çünkü 56/56 görüntüsü fazlasını vaat ediyor.

Birincisi: tarihlemek düzeltmek değildir. Anlam listesi okura “referanstaki parametre satırı altıncı sürümde yanlışlandı” der; doğrusunun ne olduğunu demez. Okur yanlışı öğrenir, doğruyu öğrenmez. Bu yine de büyük bir kazançtır — yanlış olduğunu bilmek, yanlışı doğru sanmaktan iyidir — ama iddiayı doğru kalanlar sütununa geri taşımaz. Tabloda doğru sütunu hiçbir not biçiminde değişmiyor; değişen yalnız bayat olanın görünürlüğü.

İkincisi: notun okuru dokümanın okuru değildir. Sürüm notunu izleyen kişi ürünü zaten kullanandır. Bugün ilk kez gelen okur, geçmiş notları okumaz; onun için doküman yine tarihsizdir ve 17 gömülü iddia dışında hiçbir şey ona bir uyarı vermez. Anlam listesi bayatlamayı bakım yapan için görünür kılar, yeni okur için kılmaz.

Üçüncüsü: not ancak yazıldığı kadar doğrudur ve kendisi de bir dokümandır. Girdilerindeki “yanlışlanan” alanı, yazıldığı andaki doküman yapısına bağlıdır; bölümler yeniden düzenlendiğinde o alan da bayatlar. Notun kendisi bu ölçümün dışında tutuldu, ama gerçek bir depoda o da sayılan kümeye girer.

Özet

  • Dört tür şimdiki zamanla yazılır ve konuya göre indekslenir; sürüm notu zamana göre indekslenen ayrı bir türdür ve “hangi sürümde değişti” sorusunu yalnız o kapatır.
  • On iki sürümde 13 değişim olayı, notta 9 girdi eder; bazı sürümlerde birden çok yüzey aynı anda değişir, bazılarında hiçbiri değişmez.
  • Sürüm notu yokken bayat iddiaların 0/56’sı tarihlenebilir; ham değişiklik listesiyle 17/56 ve bu sayı gömülü iddia sayısına eşittir, on ikinci sürümde de büyümez.
  • Ham değişiklik listesi sessiz bayatlayan 39 iddianın 0’ını tarihlendirir; yalnız arızayı zaten duymuş okura yarar.
  • Anlam listesi aynı 9 girdiyle 56/56 ve sessizlerin 39/39’unu tarihlenebilir kılar; girdi başına tarihlenen iddia 1,889’dan 6,222’ye çıkar.
  • Fark girdi sayısında değil, girdiye yazılan yanlışlanan iddia alanındadır; bu bilgi değişiklik anında vardır ve yazılmazsa sonradan üretilemez.

Sonraki Adım

Bu ders okurun iki karşılıksız sorusundan birini kapattı. İkincisi duruyor ve ötekinden daha sık sorulur: “bu neden çalışmıyor?” Bu soruyla gelen okur ne bir konu adı bilir ne bir sürüm numarası; elinde yalnız bir belirti vardır — bir hata satırı, boş bir çıktı, beklenenden başka bir sonuç. Elindeki tek şey ürünün ona gösterdiğidir ve o gösterilen şey, dokümanın hiçbir bölüm başlığıyla eşleşmez. Sonraki ders belirtiden başlayan bir metnin kapsadığı okur sorusuyla kavramdan başlayanın kapsadığını karşılaştırır ve sorun giderme içeriğinin ulaşamadığı sınırı adlandırır.

İ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