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

# Tasarım Problemine Yaklaşım

Tek satırlık bir isteğin tasarıma çevrilmesi: soruların dört aileye ayrılması, her ailenin hangi tasarım adımını engellediğinin gösterilmesi, yanıtsız kalan sorunun varsayıma dönüşmesi ve kapsam daraltmasının tasarım yüzeyinde açtığı yerin ölçülmesi.

Önceki ders beş bileşenli bir tasarımı hazır verdi ve o tasarımın yüzeyini ölçtü. Gerçek bir
tasarım işi böyle başlamaz. Başlangıç noktası çoğunlukla tek bir cümledir: "satıcıların
gönderilerini takip edebileceği ve gün sonunda ücretlendirilebileceği bir servis." Bu cümlede
bileşen adı yok, sayı yok, sınır yok.

Bu ders o cümleden tasarıma geçişi ele alır. Geçiş iki işten oluşur: sorularak eksiklerin
bulunması ve kapsam daraltılarak tasarımın küçültülmesi. İkisi de ölçülebilir sonuç üretir —
birincisi yazılması gereken varsayım sayısını, ikincisi tasarım yüzeyindeki küçülmeyi.

## İstek Eksiktir, Eksikliği Sayılabilir

Tek satırlık istek üç şeyi söylüyor: bir aktör (satıcı), iki yetenek (takip, ücretlendirme)
ve bir zamanlama (gün sonu). Söylemedikleri daha fazladır ve bunlar rastgele dağılmaz, dört
aileye toplanır.

**Aktör ve akış** soruları sistemin dışını tanımlar: kim istek gönderir, kim veri gönderir,
kim sonucu bekler. Yanıtları bileşen listesini belirler.

**Hacim** soruları yükü tanımlar: günde kaç istek, kaç kayıt, kayıt başına kaç bayt.
Yanıtları olmadan hiçbir hesap yapılamaz.

**Eşik** soruları kabul ölçütünü tanımlar: yanıt ne kadar sürebilir, ne kadar kayıp kabul
edilir, sonuç ne zaman hazır olmalı. Yanıtları nitelik kararlarının girdisidir.

**Kısıt** soruları tasarımın dışından gelen zorunlulukları tanımlar: veri ne kadar saklanır,
hangi kural nerede değişir, hangi bileşen dokunulamaz.

Ayrımın işe yaramasının nedeni, her ailenin belirli bir tasarım adımını engellemesidir. Soru
listesi bu bağla birlikte yazıldığında hangi adımın başlayabileceği hesaplanabilir hâle
gelir.

```js
// tasarim/soru.mjs — problem satirinin acmadigi sorular ve her sorunun engelledigi adim
export const ADIM = {
  "aktor ve akis": "bilesen listesi yazilamaz",
  hacim: "kabaca buyukluk hesabi baslamaz",
  esik: "nitelik karari verilemez",
  kisit: "veri saklama karari verilemez",
};

export const SORU = [
  { aile: "aktor ve akis", soru: "takip sorgusunu kim yapar", yanit: "alici ve satici, ayri yetkiyle" },
  { aile: "aktor ve akis", soru: "durum olayini kim gonderir", yanit: "tasiyici" },
  { aile: "aktor ve akis", soru: "ucretlendirmeyi kim baslatir", yanit: "satici, gun sonunda" },
  { aile: "hacim", soru: "gunde kac takip sorgusu gelir", yanit: null },
  { aile: "hacim", soru: "gunde kac gonderi olusur", yanit: null },
  { aile: "hacim", soru: "gonderi basina kac durum olayi gelir", yanit: null },
  { aile: "esik", soru: "takip yaniti en cok ne kadar surer", yanit: null },
  { aile: "esik", soru: "durum olayi kaybi kabul edilir mi", yanit: "edilmez, olay yeniden gonderilir" },
  { aile: "esik", soru: "ucret raporu ne zaman hazir olmali", yanit: null },
  { aile: "kisit", soru: "durum kaydi ne kadar saklanir", yanit: null },
  { aile: "kisit", soru: "tarife kurali kac yerde degisir", yanit: "tek yer" },
];
```

```js
// tasarim/gereksinim.mjs — yanitlanan soru, yanitsiz kalan soru ve yazilmasi gereken varsayim sayisi
import { ADIM, SORU } from "./soru.mjs";

console.log(`${"soru ailesi".padEnd(15)}${"yanit".padStart(6)}  engellenen adim`);
for (const [aile, adim] of Object.entries(ADIM)) {
  const grup = SORU.filter((s) => s.aile === aile);
  const yanitli = grup.filter((s) => s.yanit !== null).length;
  const engel = yanitli === grup.length ? "-" : adim;
  console.log(`${aile.padEnd(15)}${`${yanitli}/${grup.length}`.padStart(6)}  ${engel}`);
}

const yanitsiz = SORU.filter((s) => s.yanit === null);
console.log(`\ntoplam soru = ${SORU.length}, yanitli = ${SORU.length - yanitsiz.length}, yanitsiz = ${yanitsiz.length}`);
console.log(`yazilmasi gereken varsayim = ${yanitsiz.length}`);
for (const s of yanitsiz) console.log(`  varsayim gerekiyor: ${s.soru}`);
```

```
soru ailesi     yanit  engellenen adim
aktor ve akis     3/3  -
hacim             0/3  kabaca buyukluk hesabi baslamaz
esik              1/3  nitelik karari verilemez
kisit             1/2  veri saklama karari verilemez

toplam soru = 11, yanitli = 5, yanitsiz = 6
yazilmasi gereken varsayim = 6
  varsayim gerekiyor: gunde kac takip sorgusu gelir
  varsayim gerekiyor: gunde kac gonderi olusur
  varsayim gerekiyor: gonderi basina kac durum olayi gelir
  varsayim gerekiyor: takip yaniti en cok ne kadar surer
  varsayim gerekiyor: ucret raporu ne zaman hazir olmali
  varsayim gerekiyor: durum kaydi ne kadar saklanir
```

Çıktının en çok işe yarayan satırı ilk tablodur. Aktör ve akış ailesi tamamlandığı için
bileşen listesi yazılabilir; önceki dersin beş bileşeni bu yüzden yazılabilmişti. Hacim
ailesinde yanıt oranı 0/3 olduğu için kabaca büyüklük hesabı başlamaz. Eşik ailesinde 1/3
yanıt var, yani nitelik kararlarının üçte ikisi askıda.

## Yanıtsız Soru Varsayıma Dönüşür

Yanıtsız altı sorunun karşılığı altı varsayımdır. Bu, tasarım işinin durmaması için gereken
adımdır: bir soru yanıtlanamıyorsa yerine bir sayı seçilir, o sayının **varsayım** olduğu
yazılır ve gerekçesi bir cümleyle verilir.

Varsayımın maliyeti sıfır değildir. Yanlış bir varsayım üstüne kurulan bütün hesaplar aynı
oranda yanlıştır ve bunu görünür kılmanın tek yolu duyarlılığı yazmaktır: varsayım iki katına
çıkarsa hangi hesap kaç katına çıkar. Önceki ders bunun bir örneğini verdi — kullanıcı başına
sorgu 6 yerine 12 alındığında okuma/yazma oranı 4.29'dan 8.57'ye çıkıyordu.

Varsayım ile eşik karıştırılmamalıdır. Varsayım sistemin dışındaki dünya hakkında bir
tahmindir ve ölçülerek düzeltilir. Eşik ise bir karardır: kabul edilen sınırdır ve ölçümle
düzeltilmez, tartışmayla değişir. "Günde on iki milyon sorgu gelir" bir varsayım, "takip
yanıtı 200 milisaniyeyi geçmez" bir eşiktir.

## Kapsamı Daraltmak

İkinci iş, sorular yanıtlanırken ortaya çıkan yeteneklerin bir bölümünü tasarımın dışında
bırakmaktır. Daraltmanın gerekçesi zaman değil, ölçüdür: her yetenek tasarım yüzeyine bileşen,
sözleşme ve alan ekler.

Aşağıdaki liste yedi kapsam maddesini ve her birinin yüzeye katkısını taşıyor. Üçü içeride,
dördü dışarıdadır; dışarıda bırakılan her madde bir gerekçe ve bir geri dönüş koşulu
taşımalıdır. Son madde bilinçli olarak kayıtsız bırakılmıştır.

```js
// tasarim/kapsam.mjs — kapsam maddelerinin tasarim yuzeyine katkisi ve daraltmanin kaydi
const MADDE = [
  { ad: "takip sorgusu", kapsam: "ic",
    bilesen: ["takip-ucu", "gonderi-deposu"], sozlesme: 3, alan: 6 },
  { ad: "durum olayi kabulu", kapsam: "ic",
    bilesen: ["olay-alici", "gonderi-deposu"], sozlesme: 2, alan: 8 },
  { ad: "gun sonu ucretlendirme", kapsam: "ic",
    bilesen: ["toplu-isci", "gonderi-deposu", "tarife-kurali"], sozlesme: 2, alan: 5 },
  { ad: "alici bildirimi", kapsam: "dis",
    bilesen: ["bildirim-ucu", "sablon-deposu"], sozlesme: 3, alan: 9,
    neden: "takip sorgusunun esigini degistirmiyor", geri: "her durum olayi bildirim doguracaksa" },
  { ad: "satici arayuzu", kapsam: "dis",
    bilesen: ["arayuz-sunucusu", "oturum-deposu"], sozlesme: 4, alan: 14,
    neden: "ucret raporu dosya olarak da teslim edilebilir", geri: "rapor gun icinde istenirse" },
  { ad: "tasiyici sozlesme yonetimi", kapsam: "dis",
    bilesen: ["sozlesme-ucu"], sozlesme: 2, alan: 7,
    neden: "tarife kurali ucretlendirme kitapligindan gelir, burada degismez", geri: "tarife bolgeye gore surumlenirse" },
  { ad: "rota planlama", kapsam: "dis",
    bilesen: ["rota-planlayici", "konum-alici"], sozlesme: 3, alan: 11,
    neden: null, geri: null },
];

function yuzey(maddeler) {
  const bilesen = new Set(maddeler.flatMap((m) => m.bilesen));
  return {
    bilesen: bilesen.size,
    sozlesme: maddeler.reduce((t, m) => t + m.sozlesme, 0),
    alan: maddeler.reduce((t, m) => t + m.alan, 0),
  };
}

const genis = yuzey(MADDE);
const dar = yuzey(MADDE.filter((m) => m.kapsam === "ic"));
console.log(`${"olcu".padEnd(10)}${"genis".padStart(7)}${"dar".padStart(6)}${"oran".padStart(7)}`);
for (const a of ["bilesen", "sozlesme", "alan"]) {
  console.log(`${a.padEnd(10)}${String(genis[a]).padStart(7)}${String(dar[a]).padStart(6)}${(dar[a] / genis[a]).toFixed(2).padStart(7)}`);
}

const disi = MADDE.filter((m) => m.kapsam === "dis");
const kayitli = disi.filter((m) => m.neden !== null && m.geri !== null);
console.log(`\nkapsam disi madde = ${disi.length}, gerekcesi ve geri donus kosulu yazili = ${kayitli.length}`);
for (const m of disi.filter((x) => kayitli.includes(x) === false)) {
  console.log(`  kayitsiz daraltma: ${m.ad} (${m.bilesen.length} bilesen, ${m.alan} alan geri gelebilir)`);
}
for (const m of kayitli) console.log(`  ${m.ad.padEnd(26)} geri donus kosulu: ${m.geri}`);
```

```
olcu        genis   dar   oran
bilesen        12     5   0.42
sozlesme       19     7   0.37
alan           60    19   0.32

kapsam disi madde = 4, gerekcesi ve geri donus kosulu yazili = 3
  kayitsiz daraltma: rota planlama (2 bilesen, 11 alan geri gelebilir)
  alici bildirimi            geri donus kosulu: her durum olayi bildirim doguracaksa
  satici arayuzu             geri donus kosulu: rapor gun icinde istenirse
  tasiyici sozlesme yonetimi geri donus kosulu: tarife bolgeye gore surumlenirse
```

Daraltmanın kazancı üç sayıda görünüyor: bileşen 12'den 5'e, sözleşme 19'dan 7'ye, sınırdan
geçen alan 60'tan 19'a iniyor. Üç oran birbirinden farklı ve bu fark bilgi taşıyor. Bileşen
oranı 0.42, alan oranı 0.32; yani dışarıda bırakılan maddeler bileşen sayısından çok
sözleşme yüzeyini büyütüyordu. Kapsamı daraltmanın en büyük kazancı bileşen adedini
azaltmak değil, bileşenler arasındaki bağ sayısını azaltmaktır.

Üçüncü satırın önceki dersteki sayıyla aynı olması rastlantı değil: daraltılmış kapsamın
yüzeyi 5 bileşen ve 7 sözleşmedir, yani önceki dersin tasarımı bu daraltmanın sonucudur.

## Daraltmanın Kaydı

Dört kapsam dışı maddenin üçü kayıtlı, biri kayıtsız. Kayıt iki alandan oluşur ve ikisi de
zorunludur.

**Gerekçe** maddenin neden çıkarıldığını söyler ve doğru gerekçe hep aynı biçimdedir: bu
madde hangi eşiği değiştirmiyor. Alıcı bildirimi çıkarıldı çünkü takip sorgusunun yanıt
süresi eşiğini değiştirmiyor; satıcı arayüzü çıkarıldı çünkü ücret raporu dosya olarak da
teslim edilebilir.

**Geri dönüş koşulu** maddenin hangi durumda tekrar kapsama gireceğini söyler. Bu alan
tasarımı ileriye dönük olarak korur: koşul yazılıysa, o koşul gerçekleştiğinde tasarımın
yeniden açılacağı bilinir ve aradaki kararlar bu bilgiyle verilir. Alıcı bildiriminin koşulu
her durum olayının bir bildirim doğurması; bu koşul gerçekleşirse yazma akışının hacmi
değişir ve önceki dersin okuma/yazma oranı geçersizleşir.

Kayıtsız bırakılan madde tam bu yüzden risktir. Rota planlama kapsam dışıdır ama neden
çıkarıldığı ve ne zaman döneceği yazılmadığı için tasarım onu hesaba katmıyor: geri geldiğinde
2 bileşen ve 11 alan bir anda yüzeye eklenir. Kapsam dışı bırakmak bir karardır ve her karar
gibi gerekçesiyle yazılır; yazılmayan daraltma, unutulmuş bir yetenekten ayırt edilemez.

## Özet

- Tek satırlık bir istek dört soru ailesine ayrılır: aktör ve akış, hacim, eşik, kısıt; her
  aile belirli bir tasarım adımını engeller.
- Örnekte 11 sorunun 5'i yanıtlı: aktör ve akış 3/3 olduğu için bileşen listesi yazılabildi,
  hacim 0/3 olduğu için kabaca büyüklük hesabı başlamıyor.
- Yanıtsız kalan 6 soru 6 varsayıma dönüşür; varsayımın gerekçesi ve duyarlılığı yazılmadıkça
  üstüne kurulan hesap denetlenemez.
- Varsayım dünya hakkında bir tahmindir ve ölçümle düzeltilir; eşik bir karardır ve
  tartışmayla değişir.
- Kapsam daraltması ölçülebilir yer açtı: bileşen 12'den 5'e (0.42), sözleşme 19'dan 7'ye
  (0.37), sınırdan geçen alan 60'tan 19'a (0.32) indi.
- Kapsam dışı bırakılan madde gerekçe ve geri dönüş koşulu taşımalıdır; örnekteki dört
  maddeden biri kayıtsız kaldığı için geri geldiğinde 2 bileşen ve 11 alan hesapsız eklenir.

## Sonraki Adım

Soru listesindeki dört aileden ikisi aynı şeyi soruyor gibi görünüyor: aktör ve akış soruları
sistemin ne yapacağını, eşik soruları bunu nasıl yapacağını. Bu ikisi ayrı yanıtlanabildiği
için ayrı belirleyicidir ve ayrı yazılırlar. Sonraki ders bu ayrımı kurar: işlevsel
gereksinimler bileşen listesini üretir, işlevsel olmayan gereksinimler o listenin kaç parçaya
bölüneceğini üretir. İkisi bağımsız değiştirilebilir ve bunun kanıtı ölçülebilir — aynı
işlevsel liste iki ayrı eşik kümesiyle iki ayrı tasarım verir.
