İçeriğe geç
academia.sh

Ders 01 / 15

Kod İncelemenin Amacı

Aynı değişiklikte üç inceleyen aynı eksende 6, üç inceleyen ayrı eksende 15, tek inceleyen beş eksende 22 kusur bulur; beş inceleyen beş eksende yine 22 bulur ve iki eksik gereksinim kusuru dört yapılandırmanın dördünde de kaçar.

İçindekiler

İleri Git kursu on iki ders boyunca tek bir birimle çalıştı: bir işlemin dokunduğu nesne sayısı. Yeniden yazma 5640 nesneye dokunuyordu, ikili arama on bir adımda bitiyordu, bir kanca engeli erken ya da geç koyuyordu. Kapanış bu sayıların yanıtlamadığı soruyu bıraktı: araç tarihçeyi değiştirir, kararı insan verir. Bir dönüşümün bedelini bilmek, o dönüşümün yapılıp yapılmayacağını söylemez.

Bu kurs kararın verildiği yere bakar ve ölçülen birim değişir. Orada sayılan aracın dokunduğu nesneydi; burada sayılan insanın baktığı yer — ve baktığı yerin dışında kalan. Sorunun kendisi de değişir: bir değişikliği kaç kişinin okuduğu değil, o okumanın neyi bulduğu ve neyi bulamadığı sorulur.

İncelemenin Üç İşi

Kod inceleme (code review), bir değişikliğin birleştirilmeden önce onu yazmayan biri tarafından okunması ve okunanın kayda geçirilmesidir. Üç işi vardır ve üçü aynı şey değildir.

Birincisi hata bulmadır: gönderilen değişiklikte doğru olmayan bir şeyi, birleştirilmeden önce görmek. İkincisi bilgi yaymadır: değişikliği yalnız yazanın bilmesini engellemek; okuyan kişi o kodun ikinci sahibi olur. Üçüncüsü tasarım hizalamadır: değişikliğin deponun geri kalanıyla aynı yönde durup durmadığına bakmak.

Bu kursun ölçtüğü şey birincisidir, çünkü sayılabilen odur. Ama üçü birbirinden bağımsız değildir: bir sonraki bölümde kurulan inceleme ekseni (review axis) kavramı üçüne birden uygulanır. Kimin hangi eksene baktığı hem bulunan hatayı hem yayılan bilgiyi hem de hizalamanın hangi düzeyde yapıldığını belirler.

Değişiklik isteğinin mekaniği — öneri, tartışma, birleştirme döngüsü — Dallanma ve İşbirliği kursunda kuruldu ve orada inceleme ekseni açıkça buraya bırakıldı; burada tekrarlanmaz. Güvenlik gözüyle okuma Güvenli Kodlama kursunun konusudur ve bu kursun eksen listesinde güvenlik yoktur. Ekip yapısının ve karar hakkının kurumsal tartışması Süreç, Ekip ve Teslimat kursundadır. Burada kalan tek şey incelemenin kendi sayılarıdır.

İki Sınır: Eksen ve Dikkat

Bir inceleyen sınırsız değildir. İki sınırla çalışır ve kursun bütün ölçümleri bu ikisinin üzerine kurulur.

Ekseni: bir okuma her şeye birden bakmaz. Arayüze bakan göz imzayı, adlandırmayı ve sözleşmeyi arar; gerçekleştirime bakan göz döngü sınırını ve kenar durumu arar; teste bakan göz iddianın gerçekten bir şey doğrulayıp doğrulamadığına bakar. Aynı satırın üzerinden geçen iki göz iki ayrı kusur görür, çünkü ikisi ayrı şey aramaktadır. Bu kurs beş eksen tanımlar: arayüz, gerçekleştirim, test, belge, biçim.

Dikkati: bir inceleyen bir turda sınırlı miktarda metin okur. Okuma birimi öbek (chunk) olarak adlandırılır ve bir öbek elli satırdır. Bir turda gerçekten okunan öbek sayısı sabittir; değişiklik bundan büyükse geri kalanı okunmaz. Bu dersin ölçümünde değişiklik tam olarak dikkat kadardır, yani bu derste hiçbir kusur okunmadığı için kaçmaz. Kaçan her kusurun tek bir nedeni olacaktır: bakılmayan eksen.

Beş Eksen Ne Arar

Eksenler soyut değildir; her biri belirli bir soruyu sorar ve bulgusunu belirli bir biçimde yazar. Aşağıdaki notlar aynı değişikliğe beş ayrı eksenden bakan beş okumanın ürünüdür.

# ogretilen inceleme notu ornegi , calistirilmamistir

arayuz          Genel islevin ikinci parametresi zorunlu hale gelmis; onceki
                imzayla cagiran kod artik derlenmiyor. Varsayilan deger
                verilirse sozlesme korunur.
gerceklestirim  Dongu, liste bos oldugunda son elemani okuyor; bos girdi
                icin bir erken donus gerekiyor.
test            Testin tek iddiasi cagrinin hata firlatmadigi; donen degeri
                dogrulayan bir iddia yok.
belge           Islevin anlattigi davranis degismis, aciklama satiri eski
                davranisi tarif ediyor.
bicim           Girinti bu dosyada iki ayri genislikte kullanilmis.

Bu blok bir örnektir ve çalıştırılmaz; bu dersin sayıları yalnız ölçüm bloğundan gelir. Notların ortak bir yanı var: beşi de değişikliğin bir yerini gösteriyor ve ne yapılırsa kapanacağını söylüyor. Hiçbiri kişiden söz etmiyor. Bu, kurs boyunca korunan sınırdır — inceleme yazanı değil, gönderilen değişikliği okur.

İkinci ortak yanları, hiçbirinin ötekinin yerine geçememesidir. Arayüz notu imzaya bakmadan yazılamaz; biçim notunu yazan göz döngü sınırını aramıyordur. Aynı dosyanın aynı satır aralığında duran iki kusur, ayrı eksenlerde olduğu için ayrı okumalar gerektirir. Ölçümün tablosu bu bağımsızlığın sayısal karşılığıdır.

Bilgi yayma ve tasarım hizalama da aynı bağımlılığı taşır. Bir değişikliği yalnız biçim ekseninden okuyan kişi o kodun ikinci sahibi olmaz; girintiyi öğrenir, davranışı öğrenmez. Aynı biçimde, tasarım hizalaması yalnız arayüz ve gerçekleştirim eksenlerinden görülebilir. Eksen seçimi bu yüzden incelemenin üç işini birden belirler.

Yazılmamış Olanın Kusuru

Beş eksenin dışında altıncı bir kusur sınıfı vardır ve kurgunun en önemli parçası budur: eksik gereksinim (unwritten requirement). Bu, değişikliğin içindeki yanlış bir satır değildir; olması gerekip de hiç yazılmamış olandır.

Bir arayüz kusuru için imzaya bakılır, bir test kusuru için iddiaya bakılır. Yazılmamış bir gereksinim için bakılacak bir yer yoktur, çünkü o gereksinim değişikliğin içinde bir metin olarak bulunmaz. İnceleme gönderilene bakar; gönderilmemiş olanın yokluğunu göremez. Bu bir dikkat sorunu da değildir: eksen listesinde o sınıf yoktur.

Ölçümün Kurgusu

Ölçüm bir değişiklik ve içine serpilmiş 24 kusur üzerine kurulur. Her kusur altı sınıftan birine aittir. Kâhin kurgunun kendisidir: kusurları biz yerleştirdiğimiz için hangisinin hangi öbekte ve hangi sınıfta olduğu bilinir. Dört yapılandırma aynı değişikliğe bakar ve her biri için bulunan ile kaçan birlikte yazılır.

  • IE1 — Değişiklik 600 satırdır, yani 12 öbektir; dikkat de 12 öbektir. Değişikliğin tamamı okunur ve bu ders boyunca okunmamış öbek yoktur.
  • IE2 — 24 kusur altı sınıfa kurgu tarafından dağıtılır; sınıf listesi ve dağılım kursun sabitidir ve hiçbir derste değiştirilmez.
  • IE3 — Bir inceleyen yalnız kendi eksenlerindeki kusuru görür. Eksen dışındaki bir kusur, satırın üzerinden geçilmiş olsa bile bulunmaz.
  • IE4 — Birden çok inceleyenin bulgusu birleşimdir: aynı kusuru iki kişi bulursa bir kez sayılır. Yapılandırmalar arasındaki fark bu yüzden kişi sayısı değil, kapsanan eksen kümesidir.
  • IE5 — Aynı eksene bakan iki inceleyen aynı kümeyi bulur. Kurgu, ikinci kişinin birinciyi tamamladığı bir bulma payı içermez; bu kasıtlı bir yalınlaştırmadır ve ölçümün sonucunu şuraya bağlar: eksen çeşitliliği.
  • IE6 — Altıncı sınıf hiçbir eksenin arama listesinde değildir. Bu bir eksiklik değil, tanımdır.
  • IE7 — Ölçümde tur, bekleme ve geri bildirim yazımı yoktur; bunlar sonraki konuların değişkenleridir. Burada tek bir turun tek bir okuması sayılır.
  • IE8 — 24 kusurluk bir kümede ölçülebilen en küçük fark 1/24, yani 0,042’dir. Bundan küçük bir fark bu kümeyle savunulamaz.

Ölçüm

"""Kod incelemenin amaci: bakan kisi sayisi mi, bakilan eksen sayisi mi.

Bolum 1 - degisiklik ve kusurlarin sinif dagilimi.
Bolum 2 - dort yapilandirma: bulunan, kacan, hicbir eksenin aramadigi kacan.
"""
TOHUM = 20260815
EKSENLER = ("arayuz", "gerceklestirim", "test", "belge", "bicim")
YAZILMAYAN = "eksik gereksinim"      # hicbir eksende aranmaz
SINIFLAR = EKSENLER + (YAZILMAYAN,)
DIKKAT = 12                          # bir turda gercekten okunan obek
OBEK = 50                            # satir


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):
    """Bir inceleyen: yalniz kendi ekseninde ve yalniz okudugu obekte gorur."""
    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 kurul(d, atamalar, dikkat=DIKKAT):
    bulunan = set()
    for eksenler in atamalar:
        bulunan |= incele(d, eksenler, dikkat)
    return bulunan


TAM = set(EKSENLER)
ATAMALAR = {
    "tek inceleyen, tüm eksenler": [TAM],
    "üç inceleyen, aynı eksen": [{"gerceklestirim"}] * 3,
    "üç inceleyen, ayrı eksen": [{"arayuz"}, {"gerceklestirim"},
                                 {"test", "belge"}],
    "beş inceleyen, beş eksen": [{e} for e in EKSENLER],
}

d = degisiklik(600)
dagilim = {s: sum(1 for k in d["kusurlar"] if k["sinif"] == s) for s in SINIFLAR}
print(f"değişiklik {d['satir']} satır, {d['obek']} öbek, "
      f"kusur {len(d['kusurlar'])}, dikkat {DIKKAT} öbek")
print("sınıf dağılımı: " + ", ".join(f"{s} {n}" for s, n in dagilim.items()))
print()
print(f"{'atama':<28s} {'eksen':>5s} {'inceleyen':>9s} {'bulunan':>7s} "
      f"{'kaçan':>5s} {'yazılmayan kaçan':>16s}")
for ad, atama in ATAMALAR.items():
    b = kurul(d, atama)
    kacan = [k for k in d["kusurlar"] if k["no"] not in b]
    yaz = sum(1 for k in kacan if k["sinif"] == YAZILMAYAN)
    eksen = len(set().union(*atama))
    print(f"{ad:<28s} {eksen:5d} {len(atama):9d} {len(b):7d} "
          f"{len(kacan):5d} {yaz:16d}")
değişiklik 600 satır, 12 öbek, kusur 24, dikkat 12 öbek
sınıf dağılımı: arayuz 3, gerceklestirim 6, test 3, belge 3, bicim 7, eksik gereksinim 2

atama                        eksen inceleyen bulunan kaçan yazılmayan kaçan
tek inceleyen, tüm eksenler      5         1      22     2                2
üç inceleyen, aynı eksen         1         3       6    18                2
üç inceleyen, ayrı eksen         4         3      15     9                2
beş inceleyen, beş eksen         5         5      22     2                2

Sayı İnceleyen Sayısını İzlemiyor

Tablonun iki sütunu yan yana duruyor ve bulunan sütunu ikisinden yalnız birini izliyor.

İnceleyen sayısı 1, 3, 3, 5; bulunan kusur 22, 6, 15, 22. Aralarında hiçbir düzenli ilişki yok: bir kişi 22 buluyor, üç kişi 6 buluyor, beş kişi yine 22 buluyor.

Eksen sayısı 5, 1, 4, 5; bulunan kusur 22, 6, 15, 22. Bu sütun bulunanı satır satır açıklıyor. Beş eksen 22 veriyor, dört eksen 15, tek eksen 6. Kursun ölçü ekseni buradan çıkar: bir incelemenin sayısı bakan kişi sayısı değil, bakılan eksen sayısıdır.

İkinci ve dördüncü satır bunu tek başına söylüyor. Üç inceleyen aynı eksende 6 kusur buluyor; üçü de gerçekleştirime bakıyor ve gerçekleştirim sınıfında 6 kusur var. İkinci ve üçüncü kişi birinciye tek bir kusur eklemiyor, çünkü aynı şeyi arıyorlar. Buna karşılık tek inceleyen beş eksene bakınca 22 buluyor ve beş inceleyen beş eksene dağılınca yine 22. Beş kişiyle bir kişi arasında 0 fark var. İkinci iddia budur: inceleyen eklemek kusur bulmaz; eksen eklemek bulur.

Üçüncü satır aradaki ara değeri veriyor. Üç inceleyen dört ekseni kapsıyor — biri arayüze, biri gerçekleştirime, biri hem teste hem belgeye bakıyor — ve 15 kusur çıkıyor. Kaçan 9 kusurun 7’si biçim sınıfındandır; o eksene kimse bakmıyor. Bu, kişi eklemenin değil eksen eklemenin işe yaradığının en somut kanıtıdır: aynı üç kişi, ekseni dağıtınca 6 yerine 15 buluyor. Fark 9 kusurdur ve kümenin çözünürlüğünün yirmi katından fazladır.

Dağılımın Kendisi Bir Sonuç

Çıktının ikinci satırı ölçümden önce gelen bir bilgidir ama kendi başına okunmayı hak eder: biçim 7, gerçekleştirim 6, arayüz 3, test 3, belge 3, eksik gereksinim 2.

En kalabalık sınıf biçimdir ve 24 kusurun 7’sini, yani 0,292’sini tutar. Bir incelemede en çok not düşülen şeyin neden çoğu zaman biçim olduğunu bu sayı açıklıyor: biçim kusuru hem sayıca fazladır hem de görülmesi en az bilgi ister. Ardından gerçekleştirim gelir, 6 kusurla, ve bu sınıf tam tersidir — görülmesi kodun ne yaptığını anlamayı gerektirir.

Kalan üç eksen — arayüz, test, belge — 3’er kusur taşır ve toplamları 9’dur. Üçü birden biçim ile gerçekleştirimin toplamından azdır; buna karşılık üçü de ayrı bir okuma isteyen sınıflardır ve hiçbiri ötekinin yan ürünü olarak bulunmaz.

Dağılımın pratik sonucu ilerideki derslerin konusudur. Bir inceleme dikkatini kalabalık ama ucuz sınıfa harcarsa, pahalı sınıflara kalan pay küçülür; toplam bulunan sayısı bunu göstermez, ancak sınıf başına ayrıştırma gösterir. Bu kursta her ölçümde bulunan ve kaçan birlikte yazılmasının ve kaçanların sınıfının ayrıca sayılmasının nedeni budur.

Dördünde de Kaçan İki Kusur

Son sütun dört satırda da aynı değeri veriyor: 2.

Bu iki kusur eksik gereksinim sınıfındandır ve yapılandırma ne olursa olsun kaçıyor. Tek inceleyen beş eksene baksa da kaçıyor, beş inceleyen beş eksene dağılsa da kaçıyor. Kaçan sayısı 2’ye kadar iniyor ve orada duruyor — çünkü kalan iki kusur için bakılacak bir yer üretilmemiş.

Buradan dördüncü okuma çıkar: hiçbir eksen yazılmayanı görmez. Eksen eklemek bulunanı 22’ye kadar çıkarır; 24’e çıkarmaz. İncelemeye daha çok kişi koymak, daha çok eksen dağıtmak ya da aynı değişikliği ikinci kez okutmak bu iki kusuru bulmaz. Bunlar ancak inceleme dışındaki bir yerde — gereksinimin yazıldığı yerde — yakalanır.

İki kusurun yakalanabileceği yer bellidir ve incelemenin öncesindedir: gereksinimin yazıldığı, kabul ölçütünün belirlendiği ve değişikliğin kapsamının kararlaştırıldığı yer. Oraya konan tek bir cümle, incelemenin hiçbir eksenle bulamadığı bir kusuru ortadan kaldırabilir. Bu yüzden bu kursun sayıları bir incelemenin ne kadar iyi olduğunu değil, neyi hiç göremeyeceğini de söylüyor.

Bu, incelemenin bir kusuru değil, sınırının tanımıdır. Bir incelemenin “hiçbir şey bulmadım” demesi, değişikliğin doğru olduğu anlamına gelmez; gönderilenin içinde, bakılan eksenlerde bir şey bulunmadığı anlamına gelir. Bu cümlenin üç koşulu vardır ve üçü de tabloda ayrı sütun olarak durur.

Özet

  • İncelemenin üç işi vardır — hata bulma, bilgi yayma, tasarım hizalama — ve üçünü birden belirleyen şey kimin hangi eksene baktığıdır.
  • Bir inceleyen iki sınırla çalışır: ekseni yalnız aradığı sınıfı görmesini, dikkati bir turda okuduğu öbek sayısını sınırlar. Bu derste değişiklik dikkat kadardır, bu yüzden kaçan her kusurun nedeni tek başına eksendir.
  • Aynı değişiklikte üç inceleyen aynı eksende 6, üç inceleyen ayrı eksende 15, tek inceleyen beş eksende 22 kusur bulur; beş inceleyen beş eksende yine 22 bulur. İnceleyen eklemek kusur bulmaz, eksen eklemek bulur.
  • İki eksik gereksinim kusuru dört yapılandırmanın dördünde de kaçar; eksen listesinde o sınıf yoktur ve inceleme gönderilmemiş olanın yokluğunu göremez.
  • Sınıf dağılımı eşit değildir: biçim 7, gerçekleştirim 6, arayüz, test ve belge 3’er kusur taşır. En kalabalık sınıf, görülmesi en az bilgi isteyen sınıftır.
  • Bulunan sayı en iyi durumda 22/24’te durur; kalan 2 kusur incelemenin değil, gereksinimin yazıldığı yerin sorunudur.

Sonraki Adım

Tablonun tek eksenli satırı 6 kusur veriyordu ve o eksen gerçekleştirimdi. Beş eksenin her biri kendi payını taşıyor ve paylar birbirinden ayrı: bir eksenin bulduğu kusuru başka bir eksen bulmuyor. Sonraki ders bu ayrılığı ilk eksende, arayüz ekseninde ölçer: genel bir arayüzün sözleşmesini bozan bir değişikliği inceleme nasıl fark eder, o bulguyu kaç eksen görebilir, ve arayüze bakan inceleyenin yerine başka bir eksene bakan biri konursa kaç kusur kaybedilir.

İ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