İçeriğe geç
academia.sh

Ders 13 / 15

Sahiplik ve Onay Kuralları

Zorunlu inceleyen sayısını bire, ikiye ve üçe çıkarmak bulunanı 6'da, turu 6'da ve beklemeyi 36'da sabit bırakır; tek serbest onay aynı değişiklikte 22 bulur ve kursun ikinci iddiası burada tersinden görünür — sahiplik bir kişi seçimi değil, bir eksen seçimidir.

İçindekiler

Önceki ders katkı rehberini ölçtü: yazılı beklenti incelemeye giren kusuru azaltıyor ve dar incelemede tur satın alıyordu. Rehber neyin karşılanacağını yazar. Değişiklik gönderildikten sonra ise başka bir soru doğar ve rehber onu yanıtlamaz: kim bakacak?

Kimi depoda bu soru serbesttir; kimi depoda dosya yoluna bağlı bir kural yanıtlar. Bir dizinin sahibi vardır ve o dizine dokunan her değişiklik sahibinin onayını bekler. Bu dersin sorusu kuralın adil olup olmadığı değil — kuralın kaç eksen açtığı ve açtığı eksen sayısının bulunan kusura ne yaptığıdır.

Kod Sahipliği Bir Yol Kuralıdır

Kod sahipliği (code ownership), deponun bölümlerini rollere bağlayan bir eşlemedir. Kural metni yolları ve rolleri listeler; bir değişiklik gönderildiğinde dokunduğu yollara bakılır ve karşılık gelen roller zorunlu inceleyen (required reviewer) olarak eklenir.

# örnek sahiplik kuralı — çalıştırılmamıştır

# yol öneki            zorunlu inceleyen rolü
/                      bakım
/cekirdek/             çekirdek-sahibi
/cekirdek/protokol/    protokol-sahibi
/belge/                belge-sahibi

Üç özellik hemen görünür. Kural yola bakar, değişikliğin içeriğine değil: /cekirdek/ altındaki bir yazım düzeltmesi de çekirdek sahibini çağırır. Kural en özgül eşleşmeyi uygular: /cekirdek/protokol/ altındaki bir değişiklik protokol sahibini çağırır. Ve kural bir kapıdır: sahip onaylamadan değişiklik tümleşmez.

Kuralın yola bakması iki yönlü çalışır. Bir yandan otomatiktir ve unutulmaz: kimse “buna kimin bakması gerekir” diye düşünmez, eşleme kendiliğinden yürür. Öte yandan kural yolu bilir, değişikliği bilmez. Aynı dosyaya dokunan iki değişiklikten biri bir arayüz kararı taşıyor, diğeri bir günlük satırı ekliyor olabilir; kural ikisine de aynı sahibi çağırır. Ölçüm bu ikinci yönü doğrudan sınar: sahibin bakışı değişiklikten bağımsız olduğu için, kuralın açtığı eksen kümesi de değişiklikten bağımsızdır.

Kuralın karşıladığı ihtiyaç açıktır. Deponun her bölümünü herkes bilmez; bir bölümün geçmişini, gerekçelerini ve tuzaklarını en iyi bilen rol, oraya dokunan değişikliği en iyi değerlendirendir. Ekip yapısı ile kod yapısı arasındaki bu ilişki Süreç, Ekip ve Teslimat kursunda kurumsal tarafıyla tartışıldı; burada tekrarlanmaz. Bu derste ölçülen tek şey incelemenin kendi sayılarıdır.

Onay Kuralı Kaç Onay ve Kimden

Sahiplik eşlemesi kimin çağrılacağını söyler; onay kuralı kaç onay gerektiğini söyler. İki ayar birbirinden bağımsızdır ve dört bileşim üretir: sahiplik yok ve tek onay; sahiplik var ve tek sahip onayı; sahiplik var ve birden çok sahip onayı; sahiplik var ama sahip onayının yanına serbest bir onay da eklenmiş.

Bu ayarların hepsi kişi sayısıyla ifade edilir ve kursun ölçüsü kişi sayısı değildir. Bir zorunlu inceleyen bir eksen taşır; iki zorunlu inceleyen iki eksen taşımak zorunda değildir. Sahiplik kuralı yola göre yazıldığı için, aynı yolun sahipleri çoğu zaman aynı bakış açısını taşır: bölümün gerçekleştirimini bilirler. Onay sayısını artırmak bu durumda kişi ekler, eksen eklemez.

Kuralın üçüncü bir ayarı daha vardır ve ölçümün dışında kalır: yazanın kendi onayı sayılır mı? Sahip kendi bölümüne yazdığında, kural onu hem yazan hem zorunlu inceleyen olarak gösterir. Onay bu durumda bir bakış eklemez — değişikliğe zaten bakan tek bakış, onu yazan bakıştır. Ölçünün diliyle: kendi onayı sıfır eksen ekler. Kuralın bunu dışlaması, tabloda bir satır değiştirmez ama tablonun geçerliliğini korur; dışlanmadığında bütün satırlar birinci sütundaki onay sayısını olduğundan yüksek gösterir.

Ölçüm tam bu noktayı sınar. Kursun ikinci iddiası inceleyen eklemek kusur bulmaz; eksen eklemek bulur diyordu. Sahiplik kuralı, inceleyen ekleyip eksen eklemeyen bir düzeneğin en temiz örneğidir; iddia burada tersinden görünür.

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

  • EA15 — Ortak tanımın 600 satırlık değişikliği ve 24 kusuru olduğu gibi kullanılır; sınıf dağılımı ve kâhin kursun sabitidir.
  • EA16 — Sahibin baktığı eksen gerçekleştirimdir. Sahiplik yola göre atandığı ve yolun sahibi bölümün gerçekleştirimini bilen rol olduğu için varsayılan bakış budur.
  • EA17 — Aynı yolun birden çok sahibi aynı ekseni taşır. Bu bir kişilik iddiası değil, kuralın sonucudur: kural yolu seçer, yol bakışı seçer.
  • EA18 — Serbest onay, eksen ataması kısıtlanmamış bir incelemedir ve beş eksenin hepsine bakar. Kuralın açtığı eksen sayısı, atamadaki eksenlerin birleşimidir.
  • EA19 — Dikkat 12 öbekte sabittir ve 600 satır 12 öbektir; okunmayan öbek yoktur. Bu ölçümde tek değişen şey eksen atamasıdır.
  • EA20 — Tur döngüsü ortak tanımdan gelir ve tur başına 6 birim bekleme yazar. Onay sayısı turu doğrudan değiştirmez; turu ilk turda bulunan kusur sayısı belirler.
  • EA21 — Kümenin çözünürlüğü 24 kusurda 1/24’tür; eksen ölçeğinde ölçülebilen en küçük fark bir eksendir ve eksenler eşit büyüklükte değildir.

Ölçüm

"""Kod sahipligi ve zorunlu inceleyen: onay kuralinin eksen cesitliligi.

Bolum 1 - alti onay kurali; zorunlu inceleyen sayisi ile bakilan eksen sayisi.
Bolum 2 - hicbir sahibin bakmadigi eksenlerde duran kusur.
"""
TOHUM = 20260815
EKSENLER = ("arayuz", "gerceklestirim", "test", "belge", "bicim")
YAZILMAYAN = "eksik gereksinim"
SINIFLAR = EKSENLER + (YAZILMAYAN,)
DIKKAT, OBEK = 12, 50


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 kurul(d, atamalar, dikkat=DIKKAT):
    bulunan = set()
    for eksenler in atamalar:
        bulunan |= incele(d, eksenler, dikkat)
    return bulunan


def tur_dongusu(bulunan, kusur_sayisi, tur_basina_bekleme=6):
    kalan, tur, bekleme = kusur_sayisi - len(bulunan), 1, tur_basina_bekleme
    while kalan > 0 and tur < 6:
        tur += 1
        bekleme += tur_basina_bekleme
        kalan -= max(1, len(bulunan) // 2)
    return tur, bekleme, max(0, kalan)


TAM = set(EKSENLER)
SAHIP = {"gerceklestirim"}          # sahibin baktığı tek eksen
KURALLAR = {
    "sahiplik yok, bir onay": [TAM],
    "tek zorunlu inceleyen": [SAHIP],
    "iki zorunlu inceleyen": [SAHIP] * 2,
    "üç zorunlu inceleyen": [SAHIP] * 3,
    "zorunlu inceleyen + serbest onay": [SAHIP, TAM],
    "üç sahip, ayrı eksen": [{"arayuz"}, SAHIP, {"test", "belge"}],
}
d = degisiklik(600)
dagilim = {s: sum(1 for k in d["kusurlar"] if k["sinif"] == s) for s in SINIFLAR}
print("sınıf dağılımı: " + ", ".join(f"{s} {n}" for s, n in dagilim.items()))
print()
print(f"{'onay kuralı':<33s} {'onay':>4s} {'eksen':>5s} {'bulunan':>7s} "
      f"{'kaçan':>5s} {'yazılmayan':>10s} {'tur':>3s} {'bekleme':>7s} "
      f"{'kalan':>5s}")
for ad, atama in KURALLAR.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)
    tur, bekleme, kalan = tur_dongusu(b, len(d["kusurlar"]))
    eksen = set().union(*atama)
    print(f"{ad:<33s} {len(atama):4d} {len(eksen):5d} {len(b):7d} "
          f"{len(kacan):5d} {yaz:10d} {tur:3d} {bekleme:7d} {kalan:5d}")

print()
print(f"{'onay kuralı':<33s} {'bakılmayan eksen':>16s} {'orada duran kusur':>17s}")
for ad, atama in KURALLAR.items():
    eksen = set().union(*atama)
    bos = [e for e in EKSENLER if e not in eksen]
    duran = sum(1 for k in d["kusurlar"] if k["sinif"] in bos)
    print(f"{ad:<33s} {len(bos):16d} {duran:17d}")
sınıf dağılımı: arayuz 3, gerceklestirim 6, test 3, belge 3, bicim 7, eksik gereksinim 2

onay kuralı                       onay eksen bulunan kaçan yazılmayan tur bekleme kalan
sahiplik yok, bir onay               1     5      22     2          2   2      12     0
tek zorunlu inceleyen                1     1       6    18          2   6      36     3
iki zorunlu inceleyen                2     1       6    18          2   6      36     3
üç zorunlu inceleyen                 3     1       6    18          2   6      36     3
zorunlu inceleyen + serbest onay     2     5      22     2          2   2      12     0
üç sahip, ayrı eksen                 3     4      15     9          2   3      18     0

onay kuralı                       bakılmayan eksen orada duran kusur
sahiplik yok, bir onay                           0                 0
tek zorunlu inceleyen                            4                16
iki zorunlu inceleyen                            4                16
üç zorunlu inceleyen                             4                16
zorunlu inceleyen + serbest onay                 0                 0
üç sahip, ayrı eksen                             1                 7

İkinci İddia Tersinden

Tablonun ikinci, üçüncü ve dördüncü satırları aynıdır. Onay sayısı 1, 2, 3 olarak artıyor; bulunan 6’da, kaçan 18’de, tur 6’da, bekleme 36’da ve kalan 3’te duruyor. Üç kat onay, bir tek kusur daha buldurmuyor.

Kursun ikinci iddiası düz yönde “eksen eklemek bulur” diyordu. Burada iddia tersinden okunuyor: eksen eklemeden inceleyen eklemek hiçbir şey bulmaz. Sahiplik kuralının kişi eklemesi bedelsiz de değildir — üç kişinin onayını beklemek gerçek bir bekleme üretir; ölçümde tur sayısına yansımasa da öğe üç ayrı imzayı sırayla toplar.

Birinci satır karşılaştırmayı veriyor. Sahiplik kuralı olmayan, tek onaylı ama eksen kısıtı bulunmayan bir inceleme 22 buluyor, 2 kaçırıyor, 2 tur / 12 bekleme ile kapanıyor. Üç zorunlu sahibin bulduğunun üç katından fazlasını, üçte bir beklemeyle. Onay sayısı bire düşüyor ve sonuç iyileşiyor; çünkü değişen şey sayı değil, eksen sayısıdır: 1’den 5’e.

Beşinci satır kuralı kurtaran bileşimi gösteriyor. Zorunlu sahip duruyor, yanına eksen kısıtı olmayan bir onay ekleniyor: bulunan 22, kaçan 2, tur 2, bekleme 12. Sahiplik kuralının değeri korunuyor — bölümü bilen rol yine bakıyor — ve eksen boşluğu kapanıyor. Kural şu hâle geliyor: zorunlu inceleyen bir eksen garantisidir, bir kapsama garantisi değildir.

Beşinci satırın onay sayısı 2’dir ve ikinci satırın 1’inden fazladır; buna rağmen tur 6’dan 2’ye, bekleme 36’dan 12’ye iniyor. Onay eklemek bu kez zinciri kısalttı — çünkü eklenen onay yeni bir eksen getirdi. Aynı işlemin iki yönde çalışması, kişi sayısının ölçüde neden yer almadığını gösteriyor: onay sayısı tek başına ne iyi ne kötü bir işarettir, yanına eksen sütunu konmadan okunamaz.

Altıncı satır aynı sonucu başka yoldan üretiyor. Üç sahip, üç ayrı bölümün sahibi olduğu için üç ayrı eksene bakıyor: bulunan 15, tur 3, bekleme 18. Üç onay yine üç onaydır ama eksen 1 yerine 4’tür ve sayı buna göre değişiyor. Sahiplik kuralının kalitesi, kaç sahip çağırdığında değil, çağırdığı sahiplerin kaç ayrı ekseni temsil ettiğinde saklıdır.

Sahipliğin Boşluğu

İkinci tablo aynı satırları başka bir sorudan okuyor: kuralın hiç kapsamadığı eksenlerde kaç kusur duruyor?

Tek eksenli sahiplik kurallarında 4 eksen açıkta ve orada 16 kusur duruyor. Bunlar kaçanların bir alt kümesi değildir — kaçan 18’in 16’sı buradan gelir, kalan ikisi eksik gereksinim sınıfıdır. Yani dar sahiplikte kaçanların neredeyse tamamı kimsenin sorumlu olmadığı eksenlerde duruyor.

Bu sayının okunma biçimi önemlidir. 16 kusur, bakılıp da görülmemiş kusur değildir; hiç bakılmamış eksenlerdeki kusurdur. Aradaki fark sürecin nereye dokunacağını belirler: bakılıp görülmeyen kusur için dikkat ya da değişiklik boyutu tartışılır; hiç bakılmayan eksen için kuralın kendisi değiştirilir. İki soruna aynı çözümü uygulamak ikisini de çözmez.

Üç ayrı eksene bakan altıncı satırda açık eksen 1’e, orada duran kusur 7’ye iniyor. Açıkta kalan tek eksen biçim ve orada 7 kusur var — kümedeki en kalabalık sınıf. Bu, sahiplik kuralına biçim ekseni için bir sahip eklemenin en büyük tek kazancı vereceğini söylemez; kalabalık sınıf, en ucuza kapatılabilen sınıftır ve kapatılması için insan gerekmez. O tartışma inceleme ekseni konusunun kendi dersine aittir.

Son sütunun sabitliği yine altını çiziyor: altı kuralın altısında da 2 eksik gereksinim kusuru kaçıyor. Sahiplik kuralı ne kadar geniş yazılırsa yazılsın, kimse yazılmamış olanın sahibi olamaz.

Kapının Ölçülmeyen Yanı

Ölçüm bir şeyi kasten dışarıda bırakıyor ve bu sınır yazılmalı: zorunlu inceleyenin erişilebilirliği. Tur döngüsü her tura sabit bir bekleme yazar ve o beklemenin kaç kişiden toplandığına bakmaz. Gerçekte bir kapı, kuyruğu tek bir role bağlar; o rol meşgulse öğe incelemede sütununda durur ve zincirin en oynak halkası daha da uzar.

Bu etki tabloda görünmüyor, ama tablonun okunmasını değiştiriyor. İkinci, üçüncü ve dördüncü satırlar bulunan bakımından birbirinin aynısıdır; bekleme bakımından değildir. Üç imzayı sırayla toplayan bir kural, aynı sonucu bir imzayla üreten kuraldan daha uzun sürer ve ölçüm bu farkı kaydetmez. Yani tablodaki 36 birim, üç zorunlu inceleyenli kural için bir alt sınırdır.

İkinci ölçülmeyen yan, kuralın kapsamının dosya sayısına göre büyümesidir. Geniş bir yol öneki her değişikliği aynı role bağlar; o rol kuyruğun tamamının kapısı hâline gelir. Ölçümde görünmez, çünkü ölçüm tek bir iş öğesine bakar. Zincirde görünür, çünkü aynı rolün kuyruğunda bekleyen öğe sayısı sırada sütununu şişirir.

Üçüncü yan kuralın yokluğunda ortaya çıkar. Sahiplik kuralı olmayan bir depoda birinci satır elde edilir — 22 bulunan — ama yalnız o değişikliğe bakan biri gerçekten çıkarsa. Kural, eksen çeşitliliğini garanti etmez; bir bakışın var olacağını garanti eder. Ölçüm var olan bakışı sayar, var olmayanı değil.

Özet

  • Kod sahipliği dosya yolunu bir role bağlayan bir eşlemedir; eşleşen roller zorunlu inceleyen olur ve onayları bir kapı gibi çalışır.
  • Zorunlu inceleyen sayısını 1’den 3’e çıkarmak bulunanı 6’da, turu 6’da ve beklemeyi 36’da sabit bırakır: eksen eklemeden inceleyen eklemek hiçbir şey bulmaz.
  • Eksen kısıtı olmayan tek onay aynı değişiklikte 22 bulur ve 2 tur / 12 bekleme ile kapanır; fark kişi sayısından değil, eksen sayısının 1’den 5’e çıkmasından gelir.
  • Zorunlu sahibin yanına serbest bir onay eklemek her ikisini de verir: bulunan 22, açık eksen 0. Sahiplik bir eksen garantisidir, kapsama garantisi değildir.
  • Dar sahiplikte 4 eksen açıkta kalır ve orada 16 kusur durur; bunlar bakılıp görülmemiş değil, hiç bakılmamış kusurlardır ve çareleri kuralın kendisidir.
  • Altı kuralın altısında da 2 eksik gereksinim kusuru kaçar; yazılmamış olanın sahibi atanamaz.

Sonraki Adım

Buraya kadar akışın kuralları metinle kuruldu: rehber bir metin, sahiplik bir eşleme metniydi. Bu kuralların yürüdüğü bir yüzey de var — iş öğesinin kaydedildiği, kuyruğun görüldüğü, tartışmanın değişikliğe iliştiği, tümleşen işin yayımlandığı ve yayımlananın tüketilebildiği yetenekler. Sonraki ders bu yetenekleri sınıf düzeyinde ele alır ve her birine tek bir soru sorar: hangi geçişin beklemesini kısaltıyor? Yanıtı olmayan yetenek, zincirde bir yeri olmayan yetenektir; ve hiçbirinin bulunan kusur sayısına dokunup dokunmadığı da aynı ölçümde görünecek.

İ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