---
title: 'Tasarımı Anlatmak'
source: 'https://academia.sh/tr/kurslar/sistem-tasarimina-giris/tasarimi-anlatmak'
course: 'Sistem Tasarımına Giriş'
language: tr
updated: '2026-08-17T18:10:56+00:00'
license: 'CC BY-SA 4.0'
---

# Tasarımı Anlatmak

Bir tasarımın savunulabilir biçimde sunulması: kenar etiketleri hesaptan üretilen kutu-ok diyagramı, senaryo, eşik, değer, değerin sınıfı ve ödenen sayıdan oluşan beş alanlı karar kaydı, eksik alanların sayılması ve ölçüsüz cümlelerin anlatımdan ayıklanması.

Önceki dört ders bir tasarımın malzemesini üretti: beş bileşen ve yedi sözleşme, daraltılmış
bir kapsam, dört eşik ve on üç varsayımdan çıkan yirmi bir hesap. Bu malzeme tek başına bir
tasarım değildir. Tasarım, bir başkasına anlatıldığında ve o kişi karşı çıktığında savunulabildiği
ölçüde vardır.

Bu ders anlatımın biçimini ele alır. Biçim üç parçadan oluşur: akışları ve sınırları gösteren bir
diyagram, her kararı beş alanla kaydeden bir karar kaydı ve her sayının yanında duran sınıfı.
Mimari Biçemler kursunda kurulan biçem seçimi ve karar tablosu burada yeniden anlatılmaz;
oradaki üç parçalı savunma biçimi bu kursun sayı sınıflarıyla birlikte kullanılır.

## Diyagram Neyi Göstermek Zorunda

Bir tasarım diyagramı süs değildir; okuyanın karara katılmasını ya da karşı çıkmasını sağlayan
bir belgedir. Bunun için dört şeyi taşımak zorundadır: **bileşenler**, akışın **yönü**, kenarın
hangi **akışa** ait olduğu ve kenarın üzerindeki **sayı**. Dördüncüsü genellikle eksiktir ve
eksik olduğunda diyagram yalnız bir kutu dizilişi olur.

Kenar sayılarının elle yazılması iki risk taşır: bir varsayım değiştiğinde diyagram güncellenmez
ve sayının hangi sınıftan olduğu kaybolur. İkisinin çözümü diyagramı hesaptan üretmektir.
Aşağıdaki ilk dosya önceki dersin varsayım tablosundan yalnız bu anlatımda geçen sayıları
yeniden hesaplar.

```js
// tasarim/hesap.mjs — anlatimda gecen sayilar; girdiler Kabaca Buyukluk Hesabi dersinin varsayim tablosundan
const GUN = 86_400;
export const V = { gunlukKullanici: 2_000_000, kullaniciBasinaSorgu: 6, gunlukGonderi: 400_000,
  gonderiBasinaOlay: 7, tepeCarpani: 3, onbellekIsabeti: 0.9, topluKapsananGun: 30,
  topluPencereSaat: 4, gonderiKaydiBayt: 900, olayKaydiBayt: 220, saklamaGun: 730 };

const gunlukBayt = V.gunlukGonderi * V.gonderiKaydiBayt + V.gunlukGonderi * V.gonderiBasinaOlay * V.olayKaydiBayt;
export const H = {
  okumaTepe: ((V.gunlukKullanici * V.kullaniciBasinaSorgu) / GUN) * V.tepeCarpani,
  yazmaTepe: ((V.gunlukGonderi * V.gonderiBasinaOlay) / GUN) * V.tepeCarpani,
  depoOkuma: ((V.gunlukKullanici * V.kullaniciBasinaSorgu) / GUN) * V.tepeCarpani * (1 - V.onbellekIsabeti),
  tarama: (V.topluKapsananGun * V.gunlukGonderi) / (V.topluPencereSaat * 3600),
  gonderiBasinaMs: (V.topluPencereSaat * 3600 * 1000) / (V.topluKapsananGun * V.gunlukGonderi),
  saklananGB: (gunlukBayt * V.saklamaGun) / 1e9,
};
```

Çizim bir kutu-ok düzeninden oluşur ve kenar etiketleri yukarıdaki değerlerden gelir. Sınıf
harfleri etiketin sonunda durur: `V` varsayım, `H` hesap, `O` ölçüm.

```js
// tasarim/diyagram.mjs — kenar etiketleri hesaptan uretilen kutu-ok cizimi (V varsayim, H hesap, O olcum)
import { H } from "./hesap.mjs";

const e = (x, birim, sinif) => `${x.toFixed(2)} ${birim} ${sinif}`;
const K = { UC: "+-------------+", DEPO: "+------------------+" };
function satir(...parca) {
  let s = "";
  for (const [kol, metin] of parca) s = s.padEnd(kol) + metin;
  return s;
}

const cizim = [
  satir([2, "dis aktor"], [25, "uc bileseni"], [48, "paylasilan bilesen"]),
  "",
  satir([2, "alici, satici"], [25, K.UC]),
  satir([3, "takip sorgusu   ----> "], [25, "|  takip-ucu  |"], [40, " ---+"], [48, e(H.depoOkuma, "istek/s", "H")]),
  satir([3, e(H.okumaTepe, "istek/s", "H")], [25, K.UC], [44, "|"]),
  satir([44, "|"]),
  satir([2, "tasiyici"], [25, K.UC], [44, "|"], [48, K.DEPO]),
  satir([3, "durum olayi     ----> "], [25, "| olay-alici  |"], [40, " ---+-> "], [48, "| gonderi-deposu   |"]),
  satir([3, e(H.yazmaTepe, "istek/s", "H")], [25, K.UC], [44, "|"], [48, `| ${e(H.saklananGB, "GB", "H").padEnd(17)}|`]),
  satir([44, "|"], [48, K.DEPO]),
  satir([2, "satici"], [25, K.UC], [44, "|"]),
  satir([3, "gun sonu istegi ----> "], [25, "| toplu-isci  |"], [40, " ---+"], [48, e(H.tarama, "kayit/s", "H")]),
  satir([3, "1 is/gun V"], [25, K.UC]),
];
for (const s of cizim) console.log(s);
console.log(`\ntoplu iste gonderi basina pay = ${H.gonderiBasinaMs.toFixed(2)} ms H`);
```

```
  dis aktor              uc bileseni            paylasilan bilesen

  alici, satici          +-------------+
   takip sorgusu   ----> |  takip-ucu  | ---+   41.67 istek/s H
   416.67 istek/s H      +-------------+    |
                                            |
  tasiyici               +-------------+    |   +------------------+
   durum olayi     ----> | olay-alici  | ---+-> | gonderi-deposu   |
   97.22 istek/s H       +-------------+    |   | 712.48 GB H      |
                                            |   +------------------+
  satici                 +-------------+    |
   gun sonu istegi ----> | toplu-isci  | ---+   833.33 kayit/s H
   1 is/gun V            +-------------+

toplu iste gonderi basina pay = 1.20 ms H
```

Diyagramın söylediği ilk şey, üç dış aktörün üç ayrı uca girmesi ve üçünün aynı bileşende
birleşmesidir. Bu, ilk dersin ölçtüğü olguyu görünür kılıyor: `gonderi-deposu` üç akışın da
dokunduğu bileşendir ve her kısıt önce orada birikir.

İkinci şey kenar sayılarının **asimetrisi**dir. Sol kenarda saniyede 416,67 istek var, aynı
akışın sağ kenarında 41,67. Aradaki fark bir bileşen kararının ta kendisidir ve diyagramda tek
bir sayı çifti olarak görünüyor. Kenarına sayı yazılmayan bir diyagram bu farkı gizler; okuyan
üç okun eşit yük taşıdığını sanır.

Üçüncüsü sınıf harflerinin dağılımıdır. Beş kenardan dördü `H`, biri `V`. Gün sonu isteğinin
günde bir kez gelmesi hesaplanmış bir sonuç değil, seçilmiş bir varsayımdır ve harfi bunu
söylüyor. Bir kenarda `O` olsaydı, o sayının bu makinede ölçüldüğü ve başka bir ortamda
değişeceği okunacaktı.

## Karar Kaydı

Diyagram durumu gösterir, kararı göstermez. "Neden üç ayrı uç" ya da "neden tarife kuralı ayrı
bir bileşen değil" sorularının yanıtı ayrı bir kayıtta durur. Kayıt beş alandan oluşur ve
alanların üçü Mimari Biçemler kursundaki savunma biçiminden gelir.

- **Senaryo:** hangi nitelik, hangi uyaran altında sorulmaktadır.
- **Eşik:** o nitelikte kabul edilen değer ve kaynağı.
- **Değer:** kararın o ölçütte aldığı sayı.
- **Değerin sınıfı:** varsayım, hesap ya da ölçüm.
- **Ödenen:** karşılığında büyüyen sayı, yani ödünleşimin öteki yarısı.

Beşinci alan olmadan kayıt bir savunma değil bir ilandır. Dört karar aşağıda bu beş alanla
yazılmıştır; dördüncüsünde iki alan bilinçli olarak boş bırakılmıştır.

```js
// tasarim/anlatim.mjs — karar kaydinin bes alani ve anlatim cumlelerinin olcu denetimi
import { H } from "./hesap.mjs";

const KARAR = [
  { ad: "okuma ve yazma ayri bilesenlere konur",
    senaryo: "yazma dalgasi surerken alici takip sorgusu yapar",
    esik: "takip yaniti ortancasi en cok 200 ms",
    deger: `${H.yazmaTepe.toFixed(2)} istek/s yazma ayni surece dusmez`, sinif: "hesap",
    odenen: "bilesen 3 -> 4, yeni sinir 1" },
  { ad: "tarife kurali surec icinde cagrilir",
    senaryo: "gun sonu isi otuz gunluk gonderiyi tarar",
    esik: "gonderi basina en cok 1 ms",
    deger: `${H.gonderiBasinaMs.toFixed(2)} ms pay`, sinif: "hesap",
    odenen: "tarife ayri yayinlanamaz, birlikte yayinlanan parca 2" },
  { ad: "takip yaniti onbellekten karsilanir",
    senaryo: "ayni takip numarasi kisa aralikla yeniden sorulur",
    esik: "depoya ulasan okuma en cok 50 istek/s",
    deger: `${H.depoOkuma.toFixed(2)} istek/s`, sinif: "hesap (0.90 isabet varsayimina bagli)",
    odenen: "yanit bir onbellek yasi kadar bayat olabilir" },
  { ad: "gun sonu isi dort saatlik pencerede kosar",
    senaryo: "satici raporu sabah ister",
    esik: `tarama en az ${H.tarama.toFixed(2)} kayit/s`,
    deger: null, sinif: null,
    odenen: "pencere disinda tarama yapilamaz" },
];

const ALAN = ["senaryo", "esik", "deger", "sinif", "odenen"];
for (const k of KARAR) {
  const eksik = ALAN.filter((a) => k[a] === null);
  console.log(`${k.ad}\n  ${5 - eksik.length}/5 alan${eksik.length ? ` — eksik: ${eksik.join(", ")}` : ""}`);
}
const eksiksiz = KARAR.filter((k) => ALAN.every((a) => k[a] !== null));
console.log(`\nsavunulabilir karar = ${eksiksiz.length}/${KARAR.length}`);
console.log(`odunlesimi yazili karar = ${KARAR.filter((k) => k.odenen !== null).length}/${KARAR.length}`);

const CUMLE = [
  "okuma yolu yazma dalgasindan bagimsizdir",
  "depoya ulasan tepe istek hizi 138.89/s",
  "tasarim olceklenebilir",
  "gun sonu isi 10.80 GB tarar",
];
console.log("");
for (const c of CUMLE) console.log(`${/\d/.test(c) ? "olculu " : "olcusuz"}: ${c}`);
console.log(`olcusuz cumle = ${CUMLE.filter((c) => /\d/.test(c) === false).length}/${CUMLE.length}`);
```

```
okuma ve yazma ayri bilesenlere konur
  5/5 alan
tarife kurali surec icinde cagrilir
  5/5 alan
takip yaniti onbellekten karsilanir
  5/5 alan
gun sonu isi dort saatlik pencerede kosar
  3/5 alan — eksik: deger, sinif

savunulabilir karar = 3/4
odunlesimi yazili karar = 4/4

olcusuz: okuma yolu yazma dalgasindan bagimsizdir
olculu : depoya ulasan tepe istek hizi 138.89/s
olcusuz: tasarim olceklenebilir
olculu : gun sonu isi 10.80 GB tarar
olcusuz cumle = 2/4
```

Dört karardan üçü beş alanı da taşıyor, biri üçünü. Eksik olanın nesi eksik olduğu da önemli:
senaryosu, eşiği ve ödediği sayı yazılı, ama eşiğe karşı alınan değer ve o değerin sınıfı boş.
Bu, tasarım metinlerinde en sık görülen eksiktir; karar bir eşikle birlikte ilan edilir, eşiğin
karşılandığı gösterilmez. Dört saatlik pencere kararının savunulabilir olması için taramanın
saniyede 833,33 kayda yetiştiğinin gösterilmesi ve bu sayının sınıfının söylenmesi gerekir —
tek işçiyle hesap, işçi sayısı seçildikten sonra ölçüm.

Ödünleşim satırları da okunmaya değer. Dört kararın dördü de bir bedel yazıyor ve bedellerin
hiçbiri "karmaşıklık" gibi ölçüsüz bir sözcük değil: bileşen sayısının artması, birlikte
yayınlanan parça sayısı, yanıtın bayatlama olasılığı, pencere dışında tarama yapılamaması.
Ödünleşimi ölçüsüz sözcüklerle yazan bir karar kaydı, ödünleşimi yazmamış sayılır.

## Ölçüsüz Cümle

Son denetim anlatımın kendisine bakar. Dört cümlenin ikisi sayı içermiyor: "okuma yolu yazma
dalgasından bağımsızdır" ve "tasarım ölçeklenebilir". İkisi de tasarım metinlerinde sık geçer ve
ikisi de bir şey söylemez. Birincisi düzeltilebilir: bağımsızlığın ölçüsü, yazma akışındaki
büyümenin okuma yanıtına ne kadar geçtiğidir ve bu bir sayıyla yazılabilir. İkincisi
düzeltilemez, çünkü hangi niteliğin hangi yükte ne kadar bozulduğunu söylemiyor; yerine bir
nitelik, bir yük ve bir eşik yazılmadıkça cümle atılır.

Sayı taşıyan iki cümle ise sınıfını da taşımak zorundadır. "Depoya ulaşan tepe istek hızı
138,89" cümlesi altı varsayıma bağlı bir hesaptır ve öyle sunulmalıdır; "gün sonu işi 10,80 GB
tarar" cümlesi de öyle. Bir tasarım anlatımının denetlenebilir olması, içindeki her sayının
kaynağının izlenebilmesi anlamına gelir.

## Özet

- Bir tasarım anlatımı üç parçadan oluşur: akış ve sınır gösteren diyagram, beş alanlı karar
  kaydı ve her sayının yanındaki sınıfı.
- Diyagram bileşen, yön, akış ve kenar sayısını taşımak zorundadır; kenar etiketleri hesaptan
  üretildiğinde varsayım değiştikçe güncel kalır ve sınıfı kaybolmaz.
- Örnek diyagramda kenar asimetrisi bir bileşen kararını görünür kılıyor: aynı akış sol kenarda
  416,67 istek/s, sağ kenarda 41,67 istek/s taşıyor.
- Karar kaydının beş alanı senaryo, eşik, değer, değerin sınıfı ve ödenen sayıdır; örnekte dört
  karardan üçü beş alanı taşıdı, biri değer ve sınıf alanları boş kaldığı için savunulamaz sayıldı.
- Ödünleşim ölçüsüz bir sözcükle yazılamaz; dört kararın bedeli bileşen sayısı, birlikte
  yayınlanan parça, bayatlama olasılığı ve pencere kısıtı olarak yazıldı.
- Anlatımdaki dört cümleden ikisi sayı taşımıyordu; sayı taşımayan cümle ya bir ölçüyle
  yeniden yazılır ya da atılır.

## Sonraki Adım

Bu konu bir tasarımın nasıl kurulduğunu ve nasıl anlatıldığını gösterdi: bileşenlerin ayrılması,
gereksinimin iki yarısı, varsayımdan hesaba geçiş ve her kararın bir gerekçeye bağlanması.
Gerekçenin dayandığı şey ise hâlâ adlandırılmadı. Bu dersin eşiklerinde geçen "takip yanıtı
ortancası", "depoya ulaşan istek hızı", "pencere içinde bitme" ölçütleri sanki bilinen
kavramlarmış gibi kullanıldı; oysa "hızlı", "ölçeklenir" ve "ayakta kalır" cümlelerinin
karşılığı olan nitelikler tek tek tanımlanmadı. Sonraki konu bu ölçütleri sırayla tanımlar ve
ilk ders en sık birbirine karıştırılan çiftle başlar: gecikme ile verim aynı sistemin iki ayrı
sorusunun yanıtıdır ve birinin iyileşmesi ötekinin iyileşmesi anlamına gelmez.
