İçeriğe geç
academia.sh

Ders 12 / 19

Bileşen Kataloğu

Bir bileşenin katalogda durmayı hak edip etmediğini belirleyen kapsam ölçütü, olgunluk düzeylerinin çıkış koşulları ve kataloğun sağlığını kullanım payına bağlayan denetim.

İçindekiler

Belirteç katmanı tamamlandığında sistemin değerleri adlandırılmış ve türetilebilir hâle gelmiş oluyor: bir rengin adı var, bir aralığın adımı var, bir temanın değerleri ilkel katmandan hesaplanıyor. Ancak bu değerleri kullanan şey bileşenlerdir ve bileşen katmanı belirteç katmanı gibi hesapla türetilemez. Kataloğa neyin gireceği, girenin ne kadar hazır olduğu ve kimin sahiplendiği ayrı kararlardır.

Bu ders üç soruyu ayırır. Bir bileşen katalogda durmayı hangi ölçütle hak eder? Katalogdaki bir bileşenin “hazır” olması ne demektir? Ve bir kataloğun sağlıklı olup olmadığı hangi sayıyla anlaşılır?

Katalog Nedir, Ne Değildir

Bileşen kataloğu, sistemin sunduğu bileşenlerin listesi değildir; her bileşen için kimin sahiplendiğini, hangi olgunluk düzeyinde olduğunu ve hangi sözleşmeyi verdiğini kayıt altına alan yapıdır. Bir depoda yirmi bileşen bulunması katalog olduğu anlamına gelmez. Katalog, listeye giriş ve çıkış kurallarıyla tanımlanır.

Bu ayrım pratik bir sonuç doğurur. Katalogsuz bir bileşen kütüphanesinde her bileşen eşit güvenilirlikte görünür: kullanan kişi, bir bileşenin altı ay sonra da aynı biçimde duracağını mı yoksa yarın adının değişeceğini mi bilemez. Katalog, bu belirsizliği bileşen başına bir düzey etiketine indirger.

Kapsam Ölçütü

Katalog büyümesinin doğal eğilimi, arayüzde görünen her şeyi içeri almaktır. Bu eğilim iki maliyet üretir: her bileşenin belgelenmesi, sürümlenmesi ve göç ettirilmesi gerekir; ve katalog büyüdükçe içinde arama yapmak zorlaşır.

Kapsama alma kararı üç soruya bağlanabilir:

  • Yinelenme. Bileşen kaç ayrı yerde kullanılıyor? Tek yerde kullanılan bir şey kataloğa değil, kullanıldığı ürüne aittir.
  • Sahiplik yayılımı. Kaç ayrı ekip kullanıyor? Tek ekibin kullandığı bir bileşen, o ekibin deposunda daha hızlı gelişir; kataloğa alındığında yalnızca inceleme yükü ekler.
  • Karar taşıyıcılığı. Bileşen bir tasarım kararını taşıyor mu? “Ödünç al” düğmesi birincil eylem rengi kararını taşır; bir kayıt satırının sütun sırası taşımaz, o ürünün bilgi mimarisi kararıdır.

Bu üç sorunun ikisi sayıya çevrilebilir. Aşağıdaki program katalog arayüzünün sistemine ait yirmi iki bileşeni alır, olgunluk dağılımını çıkarır, her bileşenin bulunduğu düzeyin ölçütünü karşılayıp karşılamadığını denetler ve kapsam ölçütünün dışında kalanları listeler.

// katalog.mjs — bilesen katalogunun kapsam ve olgunluk denetimi

// Her kayit bir bilesenin katalogdaki durumunu tasir: olgunluk duzeyi, o duzeyin
// istedigi kanit alanlari, surum, kac yerde ve kac ekipte kullanildigi.
const KATALOG = [
  { ad: "dugme",              duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "2.3.0", kullanim: 412, ekip: 6 },
  { ad: "baglanti",           duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "1.4.2", kullanim: 268, ekip: 6 },
  { ad: "metin-alani",        duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "2.0.1", kullanim: 143, ekip: 5 },
  { ad: "onay-kutusu",        duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: false, test: true,  erisim: true,  gocNotu: false, surum: "1.2.0", kullanim:  96, ekip: 5 },
  { ad: "radyo-grubu",        duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: false, gocNotu: false, surum: "1.1.0", kullanim:  34, ekip: 4 },
  { ad: "arama-alani",        duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "1.6.0", kullanim:  71, ekip: 4 },
  { ad: "rozet",              duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "1.0.3", kullanim: 188, ekip: 6 },
  { ad: "kart",               duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "1.3.1", kullanim: 157, ekip: 6 },
  { ad: "kirinti-yolu",       duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "1.0.0", kullanim:  29, ekip: 3 },
  { ad: "sayfalama",          duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "1.2.4", kullanim:  41, ekip: 4 },
  { ad: "bildirim-seridi",    duzey: "kararli",  belge: true,  ornek: false, karsiOrnek: false, test: true,  erisim: true,  gocNotu: false, surum: "0.9.0", kullanim:  63, ekip: 5 },
  { ad: "bos-durum",          duzey: "kararli",  belge: true,  ornek: true,  karsiOrnek: true,  test: true,  erisim: true,  gocNotu: false, surum: "1.1.2", kullanim:  52, ekip: 5 },
  { ad: "iskelet",            duzey: "aday",     belge: true,  ornek: true,  karsiOrnek: false, test: true,  erisim: false, gocNotu: false, surum: "0.7.0", kullanim:  38, ekip: 3 },
  { ad: "sekmeler",           duzey: "aday",     belge: true,  ornek: true,  karsiOrnek: false, test: false, erisim: false, gocNotu: false, surum: "0.5.1", kullanim:  24, ekip: 3 },
  { ad: "acilir-liste",       duzey: "aday",     belge: false, ornek: true,  karsiOrnek: false, test: false, erisim: false, gocNotu: false, surum: "0.4.0", kullanim:  57, ekip: 4 },
  { ad: "akordeon",           duzey: "aday",     belge: true,  ornek: true,  karsiOrnek: false, test: false, erisim: false, gocNotu: false, surum: "0.3.2", kullanim:  17, ekip: 2 },
  { ad: "kip-pencere",        duzey: "aday",     belge: true,  ornek: false, karsiOrnek: false, test: true,  erisim: false, gocNotu: false, surum: "0.6.0", kullanim:  45, ekip: 5 },
  { ad: "arac-ipucu",         duzey: "deneysel", belge: false, ornek: false, karsiOrnek: false, test: false, erisim: false, gocNotu: false, surum: "0.1.0", kullanim:  12, ekip: 2 },
  { ad: "tablo",              duzey: "deneysel", belge: false, ornek: true,  karsiOrnek: false, test: false, erisim: false, gocNotu: false, surum: "0.2.1", kullanim:   9, ekip: 2 },
  { ad: "kayit-satiri",       duzey: "deneysel", belge: false, ornek: false, karsiOrnek: false, test: false, erisim: false, gocNotu: false, surum: "0.1.0", kullanim:   6, ekip: 1 },
  { ad: "suzgec-paneli",      duzey: "aday",     belge: true,  ornek: true,  karsiOrnek: false, test: false, erisim: false, gocNotu: false, surum: "0.3.0", kullanim:   4, ekip: 1 },
  { ad: "yukleme-gostergesi", duzey: "kaldirilan", belge: true, ornek: true, karsiOrnek: true,  test: true,  erisim: true,  gocNotu: true,  surum: "1.0.0", kullanim:  31, ekip: 4 },
];

// Her duzeyin cikis olcutu: o duzeyde durabilmek icin dolu olmasi gereken alanlar.
const OLCUT = {
  deneysel:   [],
  aday:       ["belge", "ornek"],
  kararli:    ["belge", "ornek", "karsiOrnek", "test", "erisim"],
  kaldirilan: ["belge", "gocNotu"],
};

// Kararli duzey ayrica 1.0.0 ve ustu bir surum ister.
const anaSurum = (s) => Number(s.split(".")[0]);

const DUZEYLER = ["deneysel", "aday", "kararli", "kaldirilan"];
const ETIKET = { deneysel: "deneysel", aday: "aday", kararli: "kararlı", kaldirilan: "kaldırılan" };

const toplamKullanim = KATALOG.reduce((t, b) => t + b.kullanim, 0);

console.log("olgunluk düzeyi   bileşen   kullanım   kullanım payı");
for (const d of DUZEYLER) {
  const grup = KATALOG.filter((b) => b.duzey === d);
  const k = grup.reduce((t, b) => t + b.kullanim, 0);
  console.log(
    `${ETIKET[d].padEnd(17)} ${String(grup.length).padStart(7)} ${String(k).padStart(10)} ` +
    `${((k / toplamKullanim) * 100).toFixed(1).padStart(13)}%`
  );
}
console.log(`${"toplam".padEnd(17)} ${String(KATALOG.length).padStart(7)} ${String(toplamKullanim).padStart(10)} ${"100.0".padStart(13)}%`);

// Duzeyinin olcutunu karsilamayan bilesenler.
console.log("\nbileşen             düzey       eksik ölçüt");
let ihlal = 0;
for (const b of KATALOG) {
  const eksik = OLCUT[b.duzey].filter((alan) => !b[alan]);
  if (b.duzey === "kararli" && anaSurum(b.surum) < 1) eksik.push(`surum<1.0.0 (${b.surum})`);
  if (eksik.length === 0) continue;
  ihlal++;
  console.log(`${b.ad.padEnd(19)} ${ETIKET[b.duzey].padEnd(11)} ${eksik.join(", ")}`);
}
console.log(`ölçütünü karşılamayan bileşen sayısı: ${ihlal}/${KATALOG.length}`);

// Kapsam olcutu: katalogda durmayi hak eden bilesen en az iki ekipte ve en az sekiz
// yerde kullanilir. Altinda kalan bilesen urune ozgudur, katalogda degil urunde durur.
const EKIP_ESIGI = 2;
const KULLANIM_ESIGI = 8;
console.log("\nkapsam ölçütü dışında kalanlar (ekip < 2 veya kullanım < 8)");
console.log("bileşen             ekip   kullanım");
for (const b of KATALOG) {
  if (b.ekip >= EKIP_ESIGI && b.kullanim >= KULLANIM_ESIGI) continue;
  console.log(`${b.ad.padEnd(19)} ${String(b.ekip).padStart(4)} ${String(b.kullanim).padStart(10)}`);
}

// Tek satirlik saglik gostergesi: kullanimin ne kadari kararli bilesenlere dusuyor.
const kararliKullanim = KATALOG.filter((b) => b.duzey === "kararli").reduce((t, b) => t + b.kullanim, 0);
const olcutuGecen = KATALOG.filter((b) => {
  const eksik = OLCUT[b.duzey].filter((alan) => !b[alan]);
  return eksik.length === 0 && !(b.duzey === "kararli" && anaSurum(b.surum) < 1);
});
const gecenKullanim = olcutuGecen.reduce((t, b) => t + b.kullanim, 0);
console.log(`\nkararlı düzeydeki kullanım payı        : ${((kararliKullanim / toplamKullanim) * 100).toFixed(1)}%`);
console.log(`ölçütünü karşılayan bileşenlerin payı  : ${((gecenKullanim / toplamKullanim) * 100).toFixed(1)}%`);
olgunluk düzeyi   bileşen   kullanım   kullanım payı
deneysel                3         27           1.5%
aday                    6        185          10.3%
kararlı                12       1554          86.5%
kaldırılan              1         31           1.7%
toplam                 22       1797         100.0%

bileşen             düzey       eksik ölçüt
onay-kutusu         kararlı     karsiOrnek
radyo-grubu         kararlı     erisim
bildirim-seridi     kararlı     ornek, karsiOrnek, surum<1.0.0 (0.9.0)
acilir-liste        aday        belge
kip-pencere         aday        ornek
ölçütünü karşılamayan bileşen sayısı: 5/22

kapsam ölçütü dışında kalanlar (ekip < 2 veya kullanım < 8)
bileşen             ekip   kullanım
kayit-satiri           1          6
suzgec-paneli          1          4

kararlı düzeydeki kullanım payı        : 86.5%
ölçütünü karşılayan bileşenlerin payı  : 83.6%

Olgunluk Düzeyleri

Çıktının ilk bloğu dört düzeyi gösteriyor ve düzeylerin anlamı, birbirinden ne kadar farklı söz verdiklerinden gelir:

  • Deneysel. Sistem bu bileşenin biçiminin ve adının değişebileceğini söyler. Kullanan ekip, değişikliği kendi üstlenir. Belge zorunlu değildir; zorunlu olan tek şey bileşenin düzeyinin görünür olmasıdır.
  • Aday. Biçim oturmuştur ama sözleşme henüz kilitlenmemiştir. Belge ve en az bir örnek gerekir; kırıcı değişiklik hâlâ olabilir, ama duyurulur.
  • Kararlı. Sözleşme kilitlenmiştir. Kırıcı bir değişiklik ancak ana sürüm artışıyla ve göç yoluyla gelir. Bu söz, çıktıdaki beş kanıt alanına bağlanmıştır: belge, örnek, karşı örnek, test ve erişilebilirlik incelemesi.
  • Kullanımdan kaldırılan. Bileşen artık kullanılmamalıdır ama hâlâ çalışır. Bu düzeyin ölçütü göç notudur: yerine ne kullanılacağı yazılı olmalıdır.

Düzeyler etiket olarak değil, çıkış ölçütü olarak tanımlanır. “Bu bileşen kararlı” demek, listedeki beş alanın dolu olduğunu iddia etmektir. Çıktının ikinci bloğu bu iddianın üç yerde tutmadığını gösteriyor. onay-kutusu karşı örneksiz, radyo-grubu erişilebilirlik incelemesi geçmemiş, bildirim-seridi ise üç ayrı eksikle kararlı sayılmış. Bu satırlar bir hata listesi değil, düzey düşürme veya eksik tamamlama iş listesidir; ölçüt olmadan bu liste hiç üretilemezdi.

Düzey geçişleri tek yönlü değildir. Bir bileşen kararlıyken erişilebilirlik incelemesinde kalırsa aday düzeye düşürülebilir. Düşürme, kırıcı değişiklikten farklı bir sinyaldir: bileşen hâlâ çalışır, ama sistemin verdiği kararlılık sözü geri çekilmiştir.

Kapsamın Dışında Kalanlar

Çıktının üçüncü bloğu kapsam ölçütünü işletiyor. kayit-satiri ve suzgec-paneli tek ekipte ve sekizden az yerde kullanılıyor. İkisi de katalog arayüzünün kendi parçalarıdır; sistemin bileşeni değil, ürünün bileşenidir.

Bu ayrım, sistemin ilk kurulduğu yerin ürün olmasından doğan bir karışıklığı çözer. Sistem, katalog arayüzünden doğduğu için ürünün her parçası doğal aday gibi görünür. Ancak kayit-satiri bir bibliyografik kaydın hangi alanlarını hangi sırayla gösterdiğine karar verir; bu karar başka bir üründe yeniden kullanılamaz. Buna karşılık o satırın içindeki rozet, düğme ve bağlantı yeniden kullanılabilir.

Eşiklerin kendisi bir karardır ve ölçeğe bağlıdır. İki ekipli bir kuruluşta “en az iki ekip” ölçütü hiçbir şeyi elemez; on ekipli bir kuruluşta üçe çekilebilir. Ölçütün değeri sayının kendisinde değil, kararın gerekçesinin yazılı olmasındadır.

Kataloğu Bileşen Sayısıyla Ölçmemek

Son iki satır, kataloğun sağlığını sayan iki göstergeyi veriyor. Kullanımın yüzde 86,5’i kararlı bileşenlere, yüzde 83,6’sı ise bulunduğu düzeyin ölçütünü gerçekten karşılayan bileşenlere düşüyor. Aradaki 2,9 puan, “kararlı” etiketinin karşılıksız kaldığı bölümdür.

Bu iki sayı, bileşen sayısından farklı bir şey söyler. Katalogdaki yirmi iki bileşenin üçü deneysel, ama deneysel bileşenlerin kullanımdaki payı yalnızca yüzde 1,5. Yani kataloğun olgunlaşmamış bölümü, arayüzün küçük bir bölümünü etkiliyor. Bileşen sayısıyla ölçen bir rapor “bileşenlerin yüzde 13,6’sı deneysel” derdi ve aynı katalog daha riskli görünürdü.

Ters durum da olabilir. acilir-liste belgesiz bir aday olmasına karşın 57 yerde kullanılıyor; tek başına deneysel bileşenlerin tümünden fazla. Kullanımla ağırlıklandırılan gösterge bu bileşeni öne çıkarır, sayı temelli gösterge ise onu diğer beş adayla eşitler. Kataloğun iş listesini sıralayan şey, kullanım ağırlığıdır.

Özet

  • Bileşen kataloğu bir bileşen listesi değil, her bileşenin sahibini, olgunluk düzeyini ve sözleşmesini kayıt altına alan yapıdır.
  • Kapsam kararı yinelenme, sahiplik yayılımı ve karar taşıyıcılığı sorularına bağlanır; ilk ikisi eşiklerle sayıya çevrilebilir ve ürüne özgü bileşenleri eler.
  • Olgunluk düzeyleri etiket değil çıkış ölçütüdür: her düzey, dolu olması gereken kanıt alanlarıyla tanımlanır ve düzey iki yönde de değişebilir.
  • Kataloğun sağlığı bileşen sayısıyla değil kullanım payıyla ölçülür; ağırlıksız sayım aynı kataloğu olduğundan daha riskli veya daha güvenli gösterir.
  • Ölçütünü karşılamayan bileşenlerin listesi, kullanım ağırlığına göre sıralandığında doğrudan iş listesine dönüşür.

Sonraki Adım

Kapsam ve olgunluk kararları bir varsayıma dayanıyordu: bir bileşenden söz edildiğinde tasarımcının ve geliştiricinin aynı şeyi kastettiği varsayımına. Çıktıdaki acilir-liste satırının tasarım dosyasındaki karşılığının ne olduğu, arac-ipucu ile bir üründeki “ipucu balonu”nun aynı bileşen olup olmadığı bu tablodan okunamaz. Sonraki ders adlandırma sözleşmesini kurar: tasarım adlarıyla kod adları arasındaki eşlemeyi bir kurala bağlar, kuralı denetleyen bir betik yazar ve eşleşmeyen adları — hem tasarımda karşılığı olmayan bileşenleri hem de kodda karşılığı olmayan tasarım parçalarını — sayar.

İ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