---
title: 'Sahiplik ve Onay Kuralları'
source: 'https://academia.sh/tr/kurslar/kod-inceleme/sahiplik-ve-onay-kurallari'
course: 'Kod İnceleme ve Ekip Süreci'
language: tr
updated: '2026-08-17T18:10:46+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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.

```text
# ö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

```python
"""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.
