Documentation Culture#
"Dokümante etmediğin sistem, sadece sen anlıyor; bus factor 1; sen ayrılırsan, gizli bilgi gider."
"Aşırı dokümante ettiğin sistem, kimse okumuyor; doc rotting; gerçek davranış ile yazı arasında drift büyür."
İkisinin arası — right-sized, role-targeted documentation — gerçek sanat.
📐 4-Tier Hierarchy#
Tier 1: README (her repo'nun)#
"Bu repo ne yapar? Nasıl başlarım?" 5 dakikada cevap.
Olması gerekenler: - 1 cümlelik özet - Ne işe yarar (use case) - Quick start (3-5 komut) - Architecture diagram (high-level) - "Where to go next" linkleri
Olmaması gerekenler: - Yüzlerce satır API docs (ayrı yere) - Internal team-only details
Tier 2: ADR (Architecture Decision Record)#
Önemli kararları niye aldığımız.
# ADR-0042: Postgres yerine Aurora kullanmak
## Status: Accepted (2026-04-15)
## Context
- Production load 5K → 50K RPS bekleniyor
- Cross-region read replica gerek
- Mevcut self-managed Postgres operasyon yükü yüksek
## Decision
Aurora PostgreSQL Global Database'e geçiyoruz.
## Consequences
+ Auto-failover, multi-region read replica yönetimi yok
+ %99.99 SLA built-in
- Cost +%30
- Aurora-specific features (vendor lock)
- Major version upgrade kontrolümüzde değil
## Alternatives Considered
- Self-managed PostgreSQL with Patroni: ops yükü reddedildi
- CockroachDB: ekip aşinalık yok, migration risk yüksek
- Cloud SQL (GCP): mevcut altyapı AWS, multi-cloud zorlaştırır
ADR'lar: - Numaralı (0001, 0002, ...) - Immutable — yeni karar gerekirse yeni ADR (önceki "Superseded") - Repo'da docs/adr/ altında - 1 sayfayı geçmesin
Tier 3: RFC (Request for Comments)#
Önemli yeni öneri'ler için review öncesi belge.
- ADR'dan daha geniş, kararsız, draft hali
- 5-15 sayfa
- Stakeholder feedback için 2 hafta açık
- Sonunda → ADR'a dönüşür ya da reddedilir
# RFC-0017: API rate limiting v2
## Author: @author
## Reviewers: @reviewer1, @reviewer2
## Status: Draft / Review / Accepted / Rejected
## Deadline: 2026-05-15
## Summary
2 cümle.
## Motivation
Sorun ne, niye çözüyoruz.
## Detailed Design
Mimari, API, UI mockups, code samples.
## Trade-offs
Hangi alternatifleri düşündük, niye bu.
## Open Questions
Yanıt bekleyen sorular.
## Migration Plan
Mevcut sistemden geçiş.
Tier 4: Runbook + Postmortem#
"İncident anında ne yap" / "İncident sonrası ne öğrendik".
Template'ler:
17-Templates/runbooks/
🎯 Audience-First yaklaşım#
Aynı bilginin farklı versiyonu:
| Doc tipi | Audience | Ne içerir |
|---|---|---|
| README | Yeni gelen mühendis | "Nasıl çalıştırırım" |
| Architecture | Senior + new starter | "Sistemin parçaları nasıl konuşur" |
| Runbook | On-call | "Bu alert geldiğinde ne yap" |
| ADR | Senior, future you | "Niye böyle karar aldık" |
| API docs | API tüketicisi | "Bu endpoint ne dönüyor" |
| Tutorial | Learner | "Adım adım nasıl yapılır" |
| Reference | Power user | "Tüm parametreler" |
Diátaxis framework — 4 doc türü ayrı tutulmalı: tutorial, how-to, reference, explanation. Karıştırma.
🛡️ "Doc rotting"e karşı stratejiler#
1. Code-as-doc (en çok)#
def calculate_tax(amount: Decimal, region: str) -> Decimal:
"""
Mevcut bölge için KDV hesaplar.
Trade-off: TR için %20 sabit, AB için region-spesifik tablo.
AB tablosu 2026-Q1'den itibaren mongo'da; rate'ler statik değil.
Args:
amount: Brüt tutar
region: ISO country code (örn: "TR", "DE")
"""
İyi yazılmış kod = en çok güncel doc'tur.
2. Test-as-doc#
def test_checkout_handles_concurrent_clicks():
"""
Kullanıcı checkout'a tıklarken double-click yaparsa,
sadece 1 sipariş oluşmalı (idempotency key).
"""
# ...
3. CI'da link checker#
4. "Last updated" zorunlu#
Her doc'un başında:
CI'da "6 aydır review olmamış" warning.
5. Sahiplik (CODEOWNERS)#
6. "Decommission ya da düzelt" reviewly#
Yılda bir audit. Her doc: - Hâlâ relevant mi? → güncel hale getir - Değil mi? → sil
Stale doc, no doc'tan kötüdür. Yanıltır.
📚 Tooling#
Statik#
- Markdown in repo — search'lenebilir, version-controlled
- MkDocs / Docusaurus / Hugo — markdown'dan static site
- Backstage TechDocs — service-attached docs
- Read the Docs — auto-deploy
Dinamik#
- Confluence / Notion — meeting notes, brainstorm
- Slack — anlık iletişim (asla doc kaynağı olarak kullanma)
Diagrama#
- Mermaid — markdown native, GitHub render'lı
- PlantUML — kod-as-diagram, version control
- Excalidraw — quick sketch
- Lucidchart / Miro — collaborative
Karar: docs Git'te, meeting notes Notion/Confluence'da. Ayrı tut.
✨ İyi doc yazma kuralları#
- Bir-cümlelik özet ile başla — okur ihtiyacı var mı 5 sn'de anlasın
- Active voice ("API token oluşturursun" vs "API token oluşturulmalıdır")
- Code blocks tested — komut çalışıyor mu?
- Placeholder'lar
<UPPER_CASE>— gerçek değer kullanma - Diagram > 300 satır metin — uygunsa
- Linkler relative — repo taşınınca kırılmasın
- Recently-updated date belirgin yerde
- Examples > abstract definitions
🚫 Anti-pattern'ler#
| Anti-pattern | Neden kötü |
|---|---|
| "TODO: ileride doldurulacak" | Asla doldurulmaz |
| Auto-generated reference (sadece signature) | Audience yok, faydasız |
| Wiki'de saklı doc | Search'lenmez, lost knowledge |
| Word doc / PDF | Versiyonlanmaz, diff yok |
| 50-sayfa "comprehensive" guide | Kimse okumaz, parçala |
| Doc PR review etmemek | Doc kalitesi kontrol dışı |
| Slack thread olarak yapışmış "doc" | Aranabilir değil, kaybolur |
| Personal yazı tarzı (ego) | Maintainability düşürür |
🎓 Doc-as-code principles#
- ✅ Doc, repo'da kod ile birlikte yaşar
- ✅ Doc PR review'dan geçer (yazım, anlam)
- ✅ Doc CI'da test edilir (link, syntax, formatting)
- ✅ Doc, code change ile aynı PR'da güncellenir (yoksa PR rejected)
- ✅ Doc'un bir owner'ı vardır (
CODEOWNERS) - ✅ Stale doc CI uyarısı verir
📚 Devamı#
- Diátaxis framework — 4 doc türü
- Architecture Decision Records (ADR) on GitHub
- Google Technical Writing courses — ücretsiz
- Write the Docs community
17-Templates/runbooks/— runbook + postmortem template