/* ── Blog Detail Styles ── */ .bd-layout { display: grid; grid-template-columns: 1fr 320px; gap: 32px; padding-top: 28px; } /* ── Article ── */ .bd-article { background: #fff; border-radius: 20px; border: 1px solid rgba(0,0,0,.04); box-shadow: 0 4px 24px rgba(0,0,0,.04); overflow: hidden; } .bd-article__img { width: 100%; max-height: 400px; object-fit: cover; } .bd-article__body { padding: 32px 36px; } .bd-article__meta { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; } .bd-article__date { font-size: .78rem; font-weight: 600; color: #94a3b8; display: flex; align-items: center; gap: 5px; } .bd-article__date i { color: #027a94; } .bd-article__title { font-size: 1.75rem; font-weight: 800; color: #0a1628; line-height: 1.3; margin: 0 0 24px; letter-spacing: -0.5px; } .bd-article__content { font-size: 1rem; color: #334155; line-height: 1.85; } .bd-article__content p { margin: 0 0 18px; } .bd-article__content img { max-width: 100%; border-radius: 12px; margin: 12px 0; } .bd-article__content a { color: #027a94; font-weight: 600; } .bd-article__content h2, .bd-article__content h3 { color: #0a1628; margin: 28px 0 12px; } .bd-article__content code { background: #f1f5f9; padding: 2px 8px; border-radius: 6px; font-size: .9em; color: #027a94; } .bd-article__content pre { background: #0f172a; color: #e2e8f0; padding: 20px; border-radius: 14px; overflow-x: auto; font-size: .88rem; line-height: 1.7; } .bd-article__content pre code { background: transparent; color: inherit; padding: 0; } .bd-article__content blockquote { border-left: 4px solid #027a94; margin: 16px 0; padding: 12px 20px; background: rgba(2,122,148,.03); border-radius: 0 12px 12px 0; color: #475569; font-style: italic; } .bd-article__content ul, .bd-article__content ol { padding-left: 20px; margin: 0 0 18px; } .bd-article__content li { margin-bottom: 8px; } /* ── Divider ── */ .bd-divider { height: 1px; background: linear-gradient(90deg, transparent 0%, #e2e8f0 20%, #e2e8f0 80%, transparent 100%); margin: 32px 0; } /* ── Comments Section ── */ .bd-comments { padding: 0 36px 36px; } .bd-comments__title { font-size: 1.1rem; font-weight: 800; color: #0a1628; display: flex; align-items: center; gap: 8px; margin: 0 0 20px; } .bd-comments__title i { color: #027a94; } .bd-comment { display: flex; gap: 14px; padding: 16px; background: #f8fafc; border-radius: 14px; margin-bottom: 12px; border: 1px solid rgba(0,0,0,.03); } .bd-comment__avatar { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, #027a94, #01b0c1); display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 700; font-size: .9rem; flex-shrink: 0; } .bd-comment__body { flex: 1; min-width: 0; } .bd-comment__header { display: flex; align-items: center; gap: 10px; margin-bottom: 6px; } .bd-comment__name { font-weight: 700; color: #0a1628; text-decoration: none; font-size: .88rem; } .bd-comment__name:hover { color: #027a94; } .bd-comment__time { font-size: .75rem; color: #94a3b8; } .bd-comment__text { font-size: .88rem; color: #475569; line-height: 1.6; margin: 0; } .bd-comment__empty { text-align: center; padding: 20px; color: #94a3b8; font-size: .88rem; } /* ── Comment Form ── */ .bd-form { padding: 0 36px 36px; } .bd-form__title { font-size: 1.05rem; font-weight: 800; color: #0a1628; display: flex; align-items: center; gap: 8px; margin: 0 0 16px; } .bd-form__title i { color: #027a94; } .bd-form__textarea { width: 100%; border: 1px solid #e2e8f0; border-radius: 14px; padding: 14px 16px; font-size: .9rem; color: #334155; resize: vertical; min-height: 100px; transition: border-color .15s, box-shadow .15s; box-sizing: border-box; font-family: inherit; } .bd-form__textarea:focus { outline: none; border-color: #027a94; box-shadow: 0 0 0 3px rgba(2,122,148,.08); } .bd-form__submit { display: inline-flex; align-items: center; gap: 6px; margin-top: 12px; padding: 12px 28px; background: linear-gradient(135deg, #027a94, #01b0c1); color: #fff; border: none; border-radius: 12px; font-weight: 700; font-size: .9rem; cursor: pointer; transition: box-shadow .2s; } .bd-form__submit:hover { box-shadow: 0 6px 20px rgba(2,122,148,.3); } .bd-form__login { text-align: center; padding: 16px; color: #64748b; font-size: .88rem; } .bd-form__login a { color: #027a94; font-weight: 700; text-decoration: none; } .bd-form__login a:hover { text-decoration: underline; } /* ── Sidebar ── */ .bd-sidebar { position: sticky; top: 80px; } /* ── Responsive ── */ @media (max-width: 900px) { .bd-layout { grid-template-columns: 1fr; gap: 20px; } .bd-sidebar { position: static; } .bd-article__body { padding: 24px 20px; } .bd-article__title { font-size: 1.35rem; } .bd-comments { padding: 0 20px 24px; } .bd-form { padding: 0 20px 24px; } }
API Tasarlarken Öğrenilen Acı Dersler

API Tasarlarken Öğrenilen Acı Dersler

API Tasarlarken Öğrenilen Acı Dersler

API tasarlamak genelde “endpoint yazmak” gibi görünür.

Bir şey isterler, bir şey dönersin, çalışır. İlk başta her şey yolundadır.

 

Sonra kullanıcı sayısı artar.

İstemciler çoğalır.

“Buna da ihtiyaç var” denir.

Ve bir noktada fark edersin:

Sorun kodda değil, kararlardadır.

 

İşte API tasarlarken genelde can yakarak öğrenilen dersler tam da burada başlar.

 

 

“Şimdilik böyle” kararları en pahalı olanlardır

 

API tasarımında en masum görünen cümle şudur:

 

“Şimdilik böyle yapalım, sonra değiştiririz.”

 

Ama API’ler “sonra”yı pek sevmez.

 

Bir endpoint kullanıma girdiyse:

• Client’lar ona bağlanır

• Dokümantasyon ona göre yazılır

• Geriye dönmek maliyetli hâle gelir

 

Kod değişir ama sözleşme kalır.

Bu yüzden geçici kararlar API dünyasında genelde kalıcıdır.

 

 

İsimlendirme sandığından daha önemlidir

 

/getUserData, /fetchUser, /userInfo

 

İlk başta çok fark etmez gibi durur.

Ama zamanla şunu yaşarsın:

• Aynı şeyi yapan ama farklı isimli endpoint’ler

• Ne işe yaradığını adından anlamadığın yapılar

 

API’de isimlendirme sadece estetik değildir.

Okunabilirliktir.

 

Kötü isimler, kötü deneyim yaratır.

 

 

Her şeyi esnek yapmak çözüm değildir

 

“İleride lazım olur” diyerek:

• Çok genel endpoint’ler

• Her şeyi alan payload’lar

• Fazla opsiyonlu parametreler

 

tasarlamak cazip gelir.

 

Ama bu esneklik:

• Kullanımı zorlaştırır

• Hataları artırır

• Davranışı belirsizleştirir

 

API tasarımında netlik, esneklikten daha değerlidir.

 

 

Hataları net tanımlamamak en çok geri dönen konudur

Başta şöyle dersin:

 

“Şimdilik 500 dönsün.”

 

Sonra:

• Frontend ne olduğunu anlayamaz

• Log’lar şişer

• Aynı hata defalarca sorulur

 

İyi bir API sadece “doğru cevap” vermez,

yanlışta da ne olduğunu söyler.

 

Hata yönetimi sonradan eklenmez.

En başta düşünülür.

 

 

Versiyonlama ertelendikçe korkutucu olur

“v1 eklemeyelim, gerekirse sonra yaparız.”

 

Sonra API büyür.

Client’lar çoğalır.

Değişiklik ihtiyacı gelir.

 

Ama artık:

• Geriye dönmek zor

• Herkes farklı şey bekliyor

• Kimse kırılmasını istemiyor

 

Versiyonlama başta küçük bir detay gibi görünür.

Geç kalındığında ise en acı derslerden biri olur.

 

 

Dokümantasyon yazmamak sana geri döner

 

“Zaten basit, herkes anlar.”

 

Hayır, anlamaz.

• Sen unutursun

• Başkası yanlış kullanır

• Aynı sorular tekrar tekrar gelir

 

Dokümantasyon başkaları için değil,

gelecekteki sen içindir.

 

 

Asıl ders: API kod değil, iletişimdir

 

API tasarlarken genelde teknik düşünürüz.

Ama API aslında:

• Bir ekipyle

• Bir ürünle

• Bir gelecek senaryosuyla

 

kurulan iletişimdir.

 

Yanlış anlaşılırsa, teknik olarak doğru olsa bile başarısız olur.

 

 

Son söz

API tasarlarken öğrenilen acı derslerin çoğu,

kod yazarken değil,

karar alırken ortaya çıkar.

 

Daha yavaş karar almak,

daha net olmak,

daha az varsaymak…

 

Bunlar API’yi “çalışan” değil,

yaşayan bir yapı hâline getirir.

 

Ve çoğu geliştirici şu noktada hemfikirdir:

API’yi ikinci kez yazmak zorunda kalmak,

ilkinde acele etmekten çok daha acıdır.

Yorumlar

Henüz yorum yapılmamış. İlk yorumu sen yap!