<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title><![CDATA[sph.sh Blog]]></title>
        <description><![CDATA[Ayhan Sipahi, Berlin merkezli yazılım mühendisliği içgörüleri, mimari notlar ve teknik yazılar paylaşır.]]></description>
        <link>https://sph.sh/tr</link>
        <generator>RSS for Node</generator>
        <lastBuildDate>Sun, 27 Sep 2026 22:23:05 GMT</lastBuildDate>
        <atom:link href="https://sph.sh/rss/tr.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Sun, 27 Sep 2026 22:23:05 GMT</pubDate>
        <copyright><![CDATA[2026 sph.sh]]></copyright>
        <language><![CDATA[tr]]></language>
        <ttl>60</ttl>
        <item>
            <title><![CDATA[Yazılımda Chesterton Çiti: Önce Neden Diye Sor, Sonra Sil]]></title>
            <description><![CDATA[Chesterton Çiti eski kodu yerinde bırakma gerekçesi sayılır. Hata ayıklama sorusu olarak okunursa ne zaman silineceğini ve cevabın nasıl kaydedileceğini söyler.]]></description>
            <link>https://sph.sh/tr/posts/chestertons-fence-in-software/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/chestertons-fence-in-software/</guid>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[feature-flags]]></category>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Chesterton Çiti, açıklanamayan kodu yerinde bırakmanın gerekçesi olarak anılır; oysa Chesterton'ın kendi metni, amaç anlaşıldığında çitin kaldırılmasına izin verir. Bu yüzden her çiti iki yarısı olan, zaman sınırlı bir hata ayıklama sorusu olarak ele alın: neden kuruldu ve bugün kim ona bağımlı. Bütçe bitince, değişiklik geri alınabilir ve bağımlılar gözlemlenebilir olduğu sürece, varsayılan olarak kademeli kaldırmaya geçin. Çit kalsın ya da gitsin, cevabı yorum, commit gövdesi, ADR ya da flag metadata'sı olarak geride bırakın.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[İletişim, Bir Sonraki Mühendislik Seviyenizin Kapısıdır]]></title>
            <description><![CDATA[Teknik işiniz sağlam ama seviyeniz yerinde sayıyorsa ölçülen şey iletişimdir: somut olarak ne demek olduğu, basamakların onu neden şart koştuğu, nereden başlanacağı.]]></description>
            <link>https://sph.sh/tr/posts/communication-skill-gate-next-engineering-level/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/communication-skill-gate-next-engineering-level/</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[rfc]]></category>
            <category><![CDATA[decision-making]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[mentorship]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Passkey Artık Default: Asıl İş Login Değil, Recovery]]></title>
            <description><![CDATA[E-posta, şifre ve SMS OTP kullanan SaaS ekipleri için Cognito passkey geçiş rehberi: yapılandırma, enrollment ve SMS'in yerini alan dört basamaklı recovery merdiveni.]]></description>
            <link>https://sph.sh/tr/posts/passkeys-by-default-recovery/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/passkeys-by-default-recovery/</guid>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[saas]]></category>
            <category><![CDATA[migration]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Passkey, gelişmiş seçenek olmaktan çıkıp varsayılan giriş yöntemi haline geldi. Amazon Cognito managed login içinde passkey ile girişi Kasım 2024'ten beri sunuyor. Microsoft Entra ID Eylül 2026'da passkey'i varsayılan olarak açmaya başlıyor; arkalarındaki WebAuthn spesifikasyonu da Ağustos 2026'da Level 3 ile W3C Recommendation statüsüne ulaştı. E-posta, şifre ve SMS OTP ile çalışan bir login akışının sahibiyseniz geçişin küçük yarısı giriş tarafı: bir feature plan kararı, tek bir yapılandırma bloğu ve birkaç API çağrısı. Büyük yarı, passkey ortada olmadığında ne olacağı; çünkü giriş sertleştikçe saldırı trafiği hesap kurtarmaya, yani recovery tarafına kayıyor. Önce Cognito kurulumu, sonra asıl ağırlığı hak eden kısım: SMS'in yerini alan recovery merdiveni.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ajan Planınız Tasarım Dokümanınızdan Uzun Olmalı]]></title>
            <description><![CDATA[Planın işi, ajanın aksi halde sessizce vereceği kararları önceden vermek. Bu işi yapan doküman iskeleti, yayınlanmış tek bir değişiklik üzerinden adım adım.]]></description>
            <link>https://sph.sh/tr/posts/writing-plans-for-coding-agents/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/writing-plans-for-coding-agents/</guid>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[code-quality]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Geliştirdiğim bir filo ve lojistik platformunun kod deposunda ajana dönük dokümanlar iki dizine ayrılıyor: docs/superpowers/specs/ tasarım dokümanlarını, docs/superpowers/plans/ uygulama planlarını tutuyor. İkisi de yönettiğim Claude Code oturumlarından çıkıyor: önce spec'i onaylıyorum, plan ardından o spec'e göre yazılıyor. İki dizini wc -l ile saydım: 36 spec toplam 6.765 satır, ortalama yaklaşık 188; 45 plan toplam 38.639 satır, ortalama yaklaşık 859. Yürütülebilir plan, uyguladığı tasarımdan dört ila beş kat uzun.</p>
<p>| Doküman türü | Adet | Toplam satır | Ortalama |
|---|---|---|---|
| Tasarım spec'i (docs/superpowers/specs/) | 36 | 6.765 | ~188 |
| Uygulama planı (docs/superpowers/plans/) | 45 | 38.639 | ~859 |</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Yapay Zeka Kodu Ucuzlattı, İncelemeyi Pahalılaştırdı]]></title>
            <description><![CDATA[Yapay zeka kod üretimini ucuzlattı, doğrulama yükünü artırdı. CTO'lar için benimseme hızını inceleme kapasitesine eşlemek ve velocity dışında ne ölçmeli.]]></description>
            <link>https://sph.sh/tr/posts/ai-assisted-coding-burnout-review-load/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-assisted-coding-burnout-review-load/</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kimlik Okumaları DynamoDB'de, Arama OpenSearch'te: Zero-ETL Okuma Modeli]]></title>
            <description><![CDATA[Kimlik okumaları DynamoDB'de kalsın; keyfi sıralama, filtre, facet ve tam metin arama zero-ETL OpenSearch okuma modeline gitsin. Bazen tek PostgreSQL ikisini de yener.]]></description>
            <link>https://sph.sh/tr/posts/dynamodb-kv-mindset-opensearch-read-model/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/dynamodb-kv-mindset-opensearch-read-model/</guid>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[event-driven]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DynamoDB Sayfalama: İmzalı Cursor, Sıralama ve Toplam Sayı Problemi]]></title>
            <description><![CDATA[DynamoDB'de OFFSET, keyfi ORDER BY ve ucuz COUNT yok. İmzalı next/prev cursor sunun, sıralamayı sort key ile modelleyin, toplam sayıyı listeden çıkarın.]]></description>
            <link>https://sph.sh/tr/posts/dynamodb-pagination-sorting-cursor/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/dynamodb-pagination-sorting-cursor/</guid>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kod Ajanlarında Kalite: Model Kademesi mi, Harness mi?]]></title>
            <description><![CDATA[Kod ajanı kötü çıktı verince refleks daha güçlü model. Sınırlı görevlerde harness skoru en az kademe yükseltmek kadar oynatıyor; hangi kolu çekeceğinizi söyleyen kural.]]></description>
            <link>https://sph.sh/tr/posts/agentic-coding-model-tier-vs-harness/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/agentic-coding-model-tier-vs-harness/</guid>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[decision-making]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Kod ajanı kötü bir diff ürettiğinde standart çözüm tek satırlık bir konfigürasyon: daha güçlü modele geçmek. Model ile harness'i ayrı sütunlar olarak yayımlayan benchmark tabloları bu refleksi zora sokuyor. Yetenekleri birbirine yakın modeller arasında harness'i değiştirmek skoru en az modeli değiştirmek kadar oynatıyor; modelin üstünlüğü ancak görevler uzadıkça yeniden öne çıkıyor. Bu yüzden benim varsayılanım yaygın refleksin tersi: kapalı bir doğrulama döngüsüne ve sıkı bir bağlam bütçesine sahip bir harness içinde orta kademe bir model; kademe yükseltmenin tetiği ise görevin ufku, görevin önemi değil.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dogwood: AI Ajanları için Zamansal Yetkilendirme]]></title>
            <description><![CDATA[AWS Dogwood, Cedar politikalarına zamansal koşullar ekler, bunları düz Cedar'a indirger ve ajan korumalarını Amazon Bedrock AgentCore ağ geçidinde uygular.]]></description>
            <link>https://sph.sh/tr/posts/dogwood-temporal-policy-language/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/dogwood-temporal-policy-language/</guid>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code Nerede Çalışmalı? Devcontainer, Codespaces ve MicroVM]]></title>
            <description><![CDATA[Bir kodlama ajanının evi olarak devcontainer, Codespaces ve AWS Lambda MicroVM: her basamak ne katıyor ve ajanı laptoptan çıkarmak ne zaman kazandırıyor.]]></description>
            <link>https://sph.sh/tr/posts/claude-code-lambda-microvm-dev-sandboxes/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/claude-code-lambda-microvm-dev-sandboxes/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[serverless]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Prisma vs Drizzle vs Kysely: TypeScript Veri Katmanı Seçimi]]></title>
            <description><![CDATA[Postgres üzerinde TypeScript veri katmanı için karar çerçevesi: SQL'in ne kadarı kütüphanede kalmalı, Lambda'da maliyeti ne, varsayılan ne zaman yanlış.]]></description>
            <link>https://sph.sh/tr/posts/prisma-vs-drizzle-vs-kysely/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/prisma-vs-drizzle-vs-kysely/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[serverless]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Postgres üzerinde kurulan her yeni TypeScript servisi, geri dönüşü pahalı olan tek bir kararı dayatır: SQL'in ne kadarını bir kütüphaneye devrediyorsunuz? Prisma, Drizzle ve Kysely bu soruya farklı cevap verir ve fark bir özellik listesi değildir. Fark, tiplerin nereden geldiği ve sorguyu kimin yazdığıdır. Lambda üzerinde çalışan, Postgres tabanlı yeni bir servis için varsayılan Drizzle. Şemanın ve migration'ların sahipliğini üstlenir, ama sorgunun şeklini yine de kod içinde görünür bırakır. Bu varsayılanı geçersiz kılan iki koşul var. Prisma'ya yöneltilen ve karşılaştırmaların çoğunda hâlâ tekrarlanan serverless itirazı da geçerliliğini yitirdi; yerine geçen daha dar itirazı fark etmek ise çok daha zor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hızlanmak İçin Yavaşla]]></title>
            <description><![CDATA[Acele etmek hızlı hissettirir ama yeniden iş, hata ve yangın söndürme yaratır. Refactor, test ve CI bakımı için durmak neden hız kaybı değil, hıza yatırımdır.]]></description>
            <link>https://sph.sh/tr/posts/slow-down-to-speed-up-sustainable-engineering-pace/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/slow-down-to-speed-up-sustainable-engineering-pace/</guid>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <category><![CDATA[engineering-culture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir tarihi tutturmak için temizliği atlamak o an hızlı hissettirir ve tek bir sprint boyunca çoğu zaman gerçekten öyledir. Sorun şu: testi, küçük refactor'ü ya da kararsız pipeline düzeltmesini atlamak o işi silmez. İşi faizle erteler ve faiz size hatalar, yeniden iş ve yangın söndürmeye giden zaman olarak geri döner. Sezgisel okuma şudur: bakım, gönderime harcanmayan zamandır, o halde sizi yavaşlatmalıdır. Teslimat performansı üzerine yapılan araştırma tam tersini gösteriyor: kodunu ve pipeline'ını temiz tutan ekipler daha sık gönderim yapar. Buradaki öneri şu: varsayılan olarak istikrarlı, bakımı içine alan bir tempoyu seçin ve teknik borcu bir kaza olarak değil, bilinçli ve takvime bağlı bir karar olarak ele alın.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bu Kodun Sahibi Kim: Hesap Verebilirlik ve Suçlama]]></title>
            <description><![CDATA[Legacy kodu kimin yazdığını sormayı bırakın. Sorumluluğu, hesap verebilirliği ve suçlamayı ayırın; miras kodu sahipsiz bırakmak yerine sahiplendirin.]]></description>
            <link>https://sph.sh/tr/posts/code-ownership-accountability-vs-blame/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/code-ownership-accountability-vs-blame/</guid>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[psychological-safety]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>"Bunu her kim yazdıysa aptalın tekiymiş" cümlesi yazılımda en sık kurulan, ama en işe yaramaz cümlelerden biridir. Analiz gibi görünür; oysa önemi olmayan bir soruyu yanıtlar. Bir dosyayı açıp tek bir satırı değiştirdiğiniz an, orijinal kodu kimin yazdığından bağımsız olarak, o kodun canlıdaki davranışının sahibi olursunuz. Yazarlık geçmiştir. Sahiplik ise şimdiki zamandır. Çoğu geliştirme ekibi için kalıcı yanıt şudur: makine tarafından okunabilir bir kayıt (bir CODEOWNERS dosyası ve bir servis kataloğu) ile desteklenen, gerçek bir on-call rotasyonuna sahip ekip düzeyinde servis sahipliği. Bunu işler kılan ise ekiplerin yanlışlıkla eş anlamlı sandığı üç kelimedir: sorumluluk (responsibility), hesap verebilirlik (accountability) ve suçlama (blame).</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Event Odaklı Düşünmek: Yeni Başlayanlar için Komut ve Event]]></title>
            <description><![CDATA[Event odaklı sistemlerin arkasındaki zihinsel değişimi öğrenin: komut vermek yerine olguları duyurmak. İsimlendirme, ayrıştırma, nihai tutarlılık ve idempotency.]]></description>
            <link>https://sph.sh/tr/posts/thinking-in-events-beginner-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/thinking-in-events-beginner-guide/</guid>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[idempotency]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[nodejs]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Birçok ekip bir mesaj broker'ı ekler, RPC çağrılarının adını "event" olarak değiştirir ve komutlarla düşünmeye devam eder. Değişen isimdir, zihniyet değil. Bir komut hâlâ "şunu şimdi yap" der ve tek bir bilinen worker'a yöneliktir; yani hiçbir şey gerçekten ayrışmaz. Mesajlaşmanın operasyonel maliyetini ödersiniz, ama faydasını görmezsiniz.</p>
<p>request/response HTTP ve CRUD ile rahatsanız ama daha önce hiç event odaklı sistem kurmadıysanız, küçük bir değişim her şeyi yerine oturtur. Talimat vermek (komut) yerine zaten olmuş olguları duyurun (event). Bu bir düşünme biçimi olduğu için, herhangi bir broker'a dokunmadan önce doğru yapabilirsiniz.</p>
<p><strong>Komut mu, Event mi, Mesaj mı?</strong></p>
<p>Üç kelime sanki aynı anlama geliyormuş gibi kullanılıyor. Gelmiyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless İç Servis Katmanı Seçmek]]></title>
            <description><![CDATA[İç servis katmanı kurmadan önce kurup kurmayacağınıza karar verin. Katmanın çağrı başına maliyeti, VPC Lattice'in kazandığı hacim ve direct invoke'un hâlâ kazandığı an.]]></description>
            <link>https://sph.sh/tr/posts/serverless-internal-service-layer-101-choosing-the-layer/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-internal-service-layer-101-choosing-the-layer/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir serverless yapı tek takımı aştığında servisler birbirini çağırmaya başlar. Alışılmış cevap, başka bir takımın fonksiyon ARN'i üzerinde lambda:InvokeFunction yetkisi vermektir. Bu yetki, fonksiyon adını herkese açık bir sözleşmeye çevirir. Çağrılan takım artık fonksiyonu yeniden adlandıramaz, ikiye bölemez veya değiştiremez; çünkü göremediği bir repo'daki tüketiciyi bozar. Akla ilk gelen çözüm çağrılan servisi bir SDK istemci kütüphanesiyle sarmalamaktır ama işe yaramaz: bağımlılık IAM politikasının içindedir ve hiçbir istemci kütüphanesi oraya uzanamaz.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[gRPC, Protobuf ve Gateway’inizin İzin Verdiği Wire Format]]></title>
            <description><![CDATA[Private REST API gRPC’yi yapısal olarak taşıyamaz ve gRPC konuşan her AWS yüzeyi Lambda hedeflerini dışlar. gRPC’den neyi tutmalı, neyi bırakmalı.]]></description>
            <link>https://sph.sh/tr/posts/serverless-internal-service-layer-102-protocols-payloads/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-internal-service-layer-102-protocols-payloads/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Alternatifleri eleyip bu katmanı seçtiniz. Sıradaki soru onun neyi taşıyabildiği ve 101. bölümdeki katmanı gören, service mesh dünyasından gelen herkes bunu bir dakika içinde soruyor: neden gRPC değil? Orada doğu-batı trafiğinin varsayılan taşıyıcısı gRPC ve soru da yerinde.</p>
<p>Cevap yapısal. Private REST API istekleri HTTP/1.1'e düşürüyor, gRPC ise HTTP/2 framing üzerinde taşınıyor. Dahası, gRPC konuşan her AWS yüzeyi Lambda fonksiyonlarını hedef olmaktan çıkarıyor; yani gateway değiştirmek sizi kurtarmıyor. Ama takımların gRPC'den asıl istediği şey bütün bunlardan sağ çıkıyor, çünkü istenen şey hiçbir zaman taşıma katmanı değildi. Şemaydı.</p>
<p><strong>gRPC neden masada değil</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Katmanı Private API Gateway ile Kurmak]]></title>
            <description><![CDATA[Private REST API, onu açan resource policy, route bazlı AWS_IAM yetkileri, iki CDK stack'i ve Node 22 Lambda'dan çağrıyı imzalamak.]]></description>
            <link>https://sph.sh/tr/posts/serverless-internal-service-layer-103-building-the-layer/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-internal-service-layer-103-building-the-layer/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Katmanı seçtiniz (101. bölüm) ve neyi taşıyacağını karara bağladınız (102. bölüm). Bu bölüm kurulum: private REST API, onu erişilebilir yapan resource policy, route bazına daraltılmış AWS_IAM yetkileri, sahiplik sınırına göre bölünen iki CDK stack'i, Node 22 Lambda'dan atılan SigV4 çağrısı ve bütün bunların çalışıp çalışmayacağına karar veren, VPC'ye bağlı çağıranlarla ilgili operasyonel gerçekler. Desenin merkezindeki değişiklik küçük kalıyor: çağıranın execution role'ü, fonksiyon ARN'i üzerinde lambda:InvokeFunction yerine bir route ARN'i üzerinde execute-api:Invoke taşır ve çağrılan fonksiyonun ARN'i kendi stack'inden hiç dışarı çıkmaz. Önce private endpoint kısıtı geliyor, çünkü API tipini her şeyden önce o belirliyor.</p>
<p><strong>Private endpoint yalnızca REST'te var</strong></p...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Servisler Arasında Kimlik ve Şifreleme]]></title>
            <description><![CDATA[SigV4 hangi servisin çağırdığını kanıtlar, kimin adına çağırdığını değil. Doğrulanmış özneyi nasıl taşırsınız ve taşıma katmanı gerçekte neyi şifreler.]]></description>
            <link>https://sph.sh/tr/posts/serverless-internal-service-layer-104-identity-encryption/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-internal-service-layer-104-identity-encryption/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>103. bölüm katmanı kurdu: paylaşılan bir execute-api interface endpoint üzerinden erişilen, her çağrısı SigV4 ile imzalanan ve route bazlı yetkilendirilen private bir REST API. O katman bir soruyu iyi cevaplıyor, ikincisini ise tamamen açık bırakıyor.</p>
<p>SigV4 <strong>hangi servisin</strong> çağırdığını kanıtlar. <strong>Kimin adına</strong> çağırdığı hakkında hiçbir şey söylemez. Bunlar farklı sorulardır ve yalnızca ilkini cevaplayan bir katman, her servisin her kullanıcı adına iş yapabildiği bir katmandır. Bu bölüm o boşluğu kapatıyor, ardından taşıma katmanının neyi şifreleyip neyi şifrelemediğini tam olarak söylüyor.</p>
<p><strong>Doğrulanmış özneyi taşımak</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Çok Hesaplı Kurulum: Hesaplar Arası Çağrılar ve Veri Sınırı]]></title>
            <description><![CDATA[Aynı hesapta resource policy ile çağıranın identity policy'si bir OR'dur. Hesaplar arası çağrıda AND'e döner ve sessizlik reddeder. Veri sınırında bunun sonuçları.]]></description>
            <link>https://sph.sh/tr/posts/serverless-internal-service-layer-105-multi-account/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-internal-service-layer-105-multi-account/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>101 ile 104 arasındaki bölümler bu iç servis katmanını tek bir AWS hesabının içinde seçti, protokollerini belirledi, kurdu ve güvenli kıldı. Çok takımlı yapılar orada kalmaz. Takım sınırı genelde bir hesap sınırının üzerine oturur ve bu tek hamle, katmanın altındaki yetkilendirme kurallarını baştan yazar. Aynı hesapta, API'nin resource policy'si ile çağıranın identity policy'si bir OR'dur: ikisinden biri çağrıya izin verebilir. Hesaplar arasında bunlar bir AND'e döner: ikisinin de açıkça izin vermesi gerekir ve sessizlik reddetmek demektir. Bu bölümdeki her şey o dönüşten çıkıyor: seçebileceğiniz iki ağ topolojisi, veri sınırını taşıyan politikalar ve organizasyon seviyesinde hiç yazamayacağınız o tek guardrail. Aşağıdaki her kural AWS dokümantasyonuna sabitlendi.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Katman Nasıl Bozulur: Throttle, Retry ve Döngüler]]></title>
            <description><![CDATA[API Gateway throttle kovasını ön kapınızla paylaşır, Lambda entegrasyonunu asla retry etmez ve kendi üzerinden geçen döngüleri göremez. Neyi yeniden kurmalısınız.]]></description>
            <link>https://sph.sh/tr/posts/serverless-internal-service-layer-106-failure-modes/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-internal-service-layer-106-failure-modes/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Katman kuruldu, kimliği iki yönde de yerine oturdu ve hesaplara yayıldı. Şimdi dürüst kısım: nasıl bozulduğu. Her iç çağrının arasına bir gateway koymanın bedeli, çağrı başına eklenen fiyattan ibaret değil. Bozulmanın şeklini de değiştiriyor ve direct invoke'un size bedavaya verdiği iki şeyi sessizce geri alıyor: Lambda'nın özyinelemeli döngü kesicisi ve retry'ın kendisi. 103. bölümdeki katman yine de kurulmaya değer. Bu bölümün konusu şu: katmanın geri aldığı işleri artık siz üstleniyorsunuz ve eksilen parçalar, çoğu yazının uyardığı parçalar değil.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gözlemlenebilirlik ve Service Mesh'ler Nereye Gidiyor]]></title>
            <description><![CDATA[Access log çağıranı, route'u ve latency'yi zaten yazıyor. Route bazlı metrikler bedava değil, kullanıcı token'ı maskeleme istiyor ve AWS kendi mesh'ini kapatıyor.]]></description>
            <link>https://sph.sh/tr/posts/serverless-internal-service-layer-107-observability/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-internal-service-layer-107-observability/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir service mesh size üç şey vaat eder: kimlik, dayanıklılık ve gözlemlenebilirlik. Bu seri ilk ikisini hesapta zaten duran primitive'lerden kurdu: kimliği 104. bölümde, dayanıklılığı 106. bölümde. Üçüncüsü gözlemlenebilirlik ve insanların bedava geleceğini varsaydığı parça tam olarak bu. Yarısı gerçekten bedava geliyor. Tek satır uygulama kodu yazmadan, her çağrı tek bir JSON satırı yazıyor: çağıran servis, route, status ve latency. Ortada hiçbir sidecar yok.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CDK TypeScript Lambda: Bundler ve cdk synth Runner Seçimi]]></title>
            <description><![CDATA[CDK TypeScript Lambda için 9 bundler ve 3 cdk synth runner'ının ölçümlü karşılaştırması; her katman için varsayılan ve onu seçtiren kural.]]></description>
            <link>https://sph.sh/tr/posts/cdk-lambda-bundler-runner-benchmark/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cdk-lambda-bundler-runner-benchmark/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[esbuild]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[build-tools]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nub vs Vite+: JS Yığınının Zıt Uçları İçin İki Rust Araç Zinciri]]></title>
            <description><![CDATA[Nub ve Vite+, 2026'nın oxc tabanlı iki Rust araç zinciri; rakip gibi görünüp öyle değiller. Hangi ikilinin hangi repoda yeri olduğuna dair net bir kural.]]></description>
            <link>https://sph.sh/tr/posts/nub-vs-vite-plus-javascript-toolchain/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/nub-vs-vite-plus-javascript-toolchain/</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[vite]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[rust]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>JavaScript araç zinciri hâlâ ayrı parçalardan oluşan bir yığın: paket yöneticisi, runtime, TypeScript çalıştırıcısı, bundler, test çalıştırıcısı, linter ve formatlayıcı; her birinin kendi config dosyası ve kendi sürüm kayması var. 2026'nın iki projesi bu yığını tek ve hızlı bir Rust ikilisine indirmeyi vaat ediyor: Nub ve Vite+. İkisi de oxc tabanlı, tek ikilili ve haftalar arayla çıktı; bu yüzden geliştiriciler onları sürekli rakip diye sınıflandırıyor. Değiller. Vite+, tarayıcıya bakan uygulama hattının sahibi; Nub ise stok Node sürecinin sahibi. Kural bu kadar basit: derleme çıktın tarayıcıda yükleniyorsa Vite+ üzerinde standartlaş; bir Node süreci olarak çalışıyorsa Nub'a uzan. Aşağıdaki sayıların tümü sağlayıcının belirli senaryolardaki mikro benchmark'larından geliyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Stateful Kaynaklar Ayrı Bir CDK Stack'inde mi Durmalı?]]></title>
            <description><![CDATA[CDK stack düzeni için yaşam döngüsü testi: bir kaynağın ömrü tek bir dağıtımdan uzunsa kendi uzun ömürlü stack'ine koyun, ona bilinen bir adla erişin.]]></description>
            <link>https://sph.sh/tr/posts/cdk-stateful-stack-named-contracts/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cdk-stateful-stack-named-contracts/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir CDK uygulaması aynı yerleşim sorusunu defalarca yanıtlar: bu kaynak, onu kullanan Lambda fonksiyonlarıyla aynı stack'te mi dursun, yoksa kendi stack'ini mi alsın? Yaygın tavsiye, "veritabanını ayrı tut," doğru cevaba yanlış testle ulaşır. Ölçüt state değildir. Paylaşılan bir EventBridge bus'ı hiç veri tutmaz; ama onu silmek tüm domain'leri aynı anda bozar, dolayısıyla "state tutuyor mu" sorusu onu yanlış sınıflandırır. Yerleşimi belirleyen ölçüt yaşam döngüsüdür: bir kaynağın ömrü tek bir dağıtımdan uzun olduğunda kendi uzun ömürlü stack'ini hak eder ve diğer stack'ler ona bilinen bir adla erişir. Bu ad bir sözleşmedir ve sözleşme, ayarlayabileceğiniz bir bağlılık spektrumunun üzerinde durur.</p>
<p><strong>Yaşam döngüsü testi</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Limitlerine Takılmadan Ölçekte IAM Politika ve Rol Yönetimi]]></title>
            <description><![CDATA[Ölçekte karşılaşacağınız IAM boyut, ekleme ve kota limitleri; ve hepsinden uzak tutan dar kapsamlı politika, izin sınırı ve SCP yapısı.]]></description>
            <link>https://sph.sh/tr/posts/iam-policies-roles-at-scale-aws-limits/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/iam-policies-roles-at-scale-aws-limits/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[iam]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>IAM'in sessiz ve katı tavanları var. Bir yönetilen politika ancak belli sayıda karakter tutabilir. Bir role ancak belli sayıda politika ekleyebilirsiniz. Satır içi politikalar, uyarı vermeden dolan bir varlık başına boyut bütçesini paylaşır. Hesapların varsayılan bir rol kotası vardır. Tek bir paylaşılan mega-role yaslanıp izinleri konsoldan yapıştıran ekipler bu tavanlara doğru sürüklenir ve bir dağıtımın ortasında anlaşılması güç bir hatayla engellenir. Çıkış yolu yapısal: varsayılan olarak en az ayrıcalık, sorumluluk başına tek politika, paylaşılan mega-role yerine dar kapsamlı roller ve koruma katmanı olarak izin sınırları ile SCP'ler.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Backstage Kur mu Satın Al mı: Kendi IDP'nin Gerçek Maliyeti]]></title>
            <description><![CDATA[Backstage hızlı bir kurulum gibi görünür ama asıl tekrar eden maliyet kalıcı bir platform ekibidir. DIY Backstage ile yönetilen IDP arasında karar rehberi.]]></description>
            <link>https://sph.sh/tr/posts/backstage-build-vs-buy/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/backstage-build-vs-buy/</guid>
            <category><![CDATA[platform-engineering]]></category>
            <category><![CDATA[developer-experience]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Liderlerin Backstage'e yönelmesinin nedeni servis dağınıklığıdır: onlarca ya da yüzlerce servis var ve hangisinin nerede çalıştığını, kimin sahibi olduğunu kimse söyleyemiyor. Tuzak şudur: araç demoda hızlı bir kurulum gibi görünür, bu yüzden bütçe kuruluma yazılır ve onu ayakta tutan şeyi ıskalar. Backstage satın aldığınız bir ürün değil, ekip ayırdığınız bir çatıdır ve asıl tekrar eden gider kalıcı bir platform ekibidir. Bundan sonraki karar, Backstage'i kendiniz mi işleteceğiniz yoksa yönetilen bir geliştirici platformu mu kullanacağınızdır; ortada fonlanmış bir platform ekibi yoksa varsayılan yanıt yönetilen platformdur.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bruno API Koleksiyonlarını Git'te Tutmak: Bedava Postman Değil, Bir İş Akışı Değişikliği]]></title>
            <description><![CDATA[Bruno .bru dosyalarını repo'ya commit etmek, API sözleşmesini kodla aynı PR ve geçmişte tutar. Tek gerçek bedel, bilinçli bir secret sınırıdır.]]></description>
            <link>https://sph.sh/tr/posts/bruno-api-collections-in-git/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/bruno-api-collections-in-git/</guid>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[api-design]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>API koleksiyonunuz bir bulut sağlayıcıda ya da tek bir mühendisin laptopunda yaşarken, o uç noktalara hizmet veren kod git'te yaşıyor. Bir uç nokta zorunlu bir header eklediği veya bir alanı yeniden adlandırdığı anda ikisi birbirinden uzaklaşır: kod değişikliği bir pull request ile gider, ama kaydedilmiş istek geride kalır ve koleksiyonu sonradan açan kişi, artık gerçeğe uymayan bir isteği debug eder. Çözüm, istek koleksiyonunuzu kodun yanında düz metin dosyaları olarak commit etmektir; böylece API sözleşmesi, kullandığı handler ile aynı pull request, aynı inceleme ve aynı geçmişten geçer. Buradaki araç Bruno, ama asıl mesele onu hangi istemcinin gösterdiğinden çok sözleşmenin nerede yaşadığı; secret'lar etrafında net bir sınır ve bulut iş birliğinin hâlâ kazandığı birkaç durum var.</p>...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Kinesis: Data Streams vs Firehose vs Managed Flink]]></title>
            <description><![CDATA[Kinesis tek isim altında dört ayrı AWS servisidir. Dördünün ayrımı, altındaki Data Streams shard motoru, maliyet şekli ve ne zaman başka bir şey seçmeli.]]></description>
            <link>https://sph.sh/tr/posts/aws-kinesis-family-deep-dive/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-kinesis-family-deep-dive/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[real-time]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[serverless]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>"Kinesis", AWS'deki en fazla anlam yüklenmiş isimlerden biridir. İsim, farklı problemleri çözen dört ayrı servisi kapsar; bu yüzden konsoldaki bir açılır listeden "Kinesis" seçen bir ekip, çoğu zaman seçtiği servisin varsaydığı işi yapamadığını sonradan fark eder. Bir mühendis "bunu Kinesis'e koyarız" dediğinde neredeyse her zaman <strong>Data Streams</strong>'i kasteder: shard tabanlı, sıralı ve yeniden okunabilen ham log'u. Diğer üçü bir teslim borusu, bir akış işleme motoru ve bir video servisidir. Aşağıdaki bölümler önce dördünü ayrıştırır, sonra karar vermeden önce bilmen gereken Data Streams mekaniğine, maliyet şekline ve karar sınırlarına derinlemesine iner.</p>
<p><strong>Dört servisin ayrımı</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Suçsuz Postmortem: Bir Model ve Kopyala-Yapıştır Şablon]]></title>
            <description><![CDATA[Suçlu aramak yerine sistemi düzelten bir suçsuz postmortem modeli, kopyalanabilir bir şablon ve bireysel sorumluluğun hâlâ geçerli olduğu sınır.]]></description>
            <link>https://sph.sh/tr/posts/blameless-culture-postmortem-thinking/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/blameless-culture-postmortem-thinking/</guid>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[incident-response]]></category>
            <category><![CDATA[psychological-safety]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Aynı kesinti tekrar tekrar geri geliyor; çünkü olay incelemeniz bir neden değil, bir suçlu buldu. Düzeltilmesi gereken hata modeli budur. Yanlış komutu yazan kişiyi adıyla işaret etmek, aynı komutun sistemi bir daha düşürmesini nadiren engeller; düzeltme, komutun geçtiği kontrolde yapılmalıdır. Sayfaya bir isim yazılıp kapanan bir inceleme, tekrarı önleyecek sistem değişikliğinin gerisinde kalır. Aşağıdaki model kişileri değil kontrolleri hedefler; yanında kopyalanabilir bir şablon ve bireysel sorumluluğun nerede hâlâ geçerli olduğuna dair net bir sınır gelir.</p>
<p>İşleyiş modeli farklı ekiplerde tutarlı biçimde işliyor; ancak "suçsuzluk" bir kültür değişimidir. Bunun oturduğunu kanıtlayan metriklerin kımıldaması birkaç çeyrek alır.</p>
<p><strong>İki Soru Kümesi, İki Sonuç</strong></...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mühendislik Ekibi Dokümantasyonu: Çalışma Anlaşmaları, Definition of Done ve Nöbet Belgeleri]]></title>
            <description><![CDATA[Olgun bir mühendislik ekibinin sahiplendiği belgelere bir rehber: onboarding, takım anlaşmaları, Definition of Done, nöbet, bilgi aktarımı ve her birini iyi yapan şey.]]></description>
            <link>https://sph.sh/tr/posts/team-documentation-ways-of-working/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/team-documentation-ways-of-working/</guid>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[hiring]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[knowledge-sharing]]></category>
            <category><![CDATA[organizational-design]]></category>
            <category><![CDATA[leadership]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir ekibin çalışma biçimi genellikle insanların kafasında yaşar. Sonuç tahmin edilebilir: her yeni katılan kişi "biz işleri nasıl yaparız" konusunun farklı ve eksik bir versiyonunu öğrenir, beklentiler hiç yazılmadığı için nöbet stresli geçer ve kilit bir kişi ayrıldığında aylarca biriken bağlamı yanında götürür. Çözüm "daha fazla belge yazmak" değildir; çözüm, çalışma biçimini her biri tek bir sahibe ait, işin yanında saklanan, küçük ve adı konmuş bir canlı belge kümesi olarak ele almak ve onboarding'i bir refakatçi ritüeli yerine takip edilen, kontrol listeli bir program olarak yürütmektir. Devamı, sağlıklı bir ekibin sahiplendiği belirli belgelerin bir taksonomisidir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AppSync Subscription'larını AppSync Dışından Tetiklemek]]></title>
            <description><![CDATA[AppSync subscription'ları yalnızca mutation ile tetiklenir. Downstream BFF olaylarını NONE veri kaynaklı bir mutation'a EventBridge ve CDK ile köprülemeyi inceliyorum.]]></description>
            <link>https://sph.sh/tr/posts/appsync-graphql-bff-subscriptions/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/appsync-graphql-bff-subscriptions/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[real-time]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS AppSync size yönetilen WebSocket subscription'ları verir, ama bunlar yalnızca bir AppSync GraphQL mutation'ına yanıt olarak tetiklenir. Çok servisli bir Backend-for-Frontend (BFF) içinde asıl durum downstream'de, yani sipariş, stok ve ödeme servislerinde tutulur ve bu durum değişiklikleri hiçbir zaman bir AppSync mutation'ından geçmez. Yani bir BFF'te "subscription yönetmek" aslında tek bir problemdir: downstream olaylarını NONE veri kaynaklı dahili bir mutation'a köprülemek ve sonra payload'ı AppSync'in fan-out yapmasına bırakmak. Aşağıdaki kurulum AWS CDK ile yapılan bir incelemedir; henüz hiçbir parçası deploy edilmedi ya da ölçülmedi.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GitHub Actions Tetikleyicileri: push vs pull_request vs Merge Queue vs Release]]></title>
            <description><![CDATA[Her git olayı farklı bir işi hak eder: push, pull_request, merge kuyruğu ve tag/release'de ne çalışmalı? Lead time'ı koruyan bir GitHub Actions yönlendirme rehberi.]]></description>
            <link>https://sph.sh/tr/posts/ci-steps-by-trigger/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ci-steps-by-trigger/</guid>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Özellik commit'i push'layın, pull request açın ya da release çıkarın; birçok pipeline üçüne de aynı yanıtı verir: tam test matrisi, entegrasyon paketi ve deploy mantığının hepsi tetiklenir. Asıl sorun bu tekdüzeliktir. Her git olayı yaşam döngüsünün farklı bir noktasında gelir ve farklı bir güvenlik bağlamı taşır; bir tetikleyiciye ait olan kontrol, başka bir tetikleyicide ya israftır ya da tehlikelidir. Bunun yerine on: bloğunu bir yönlendirme tablosu gibi ele alın: kontrolü tetikleyiciye eşleyin ki PR geri bildirimi hızlı kalsın, main deploy edilebilir kalsın ve release'ler tekrar üretilebilir kalsın.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Native Mobil Uygulamalar için Sunucu Güdümlü Arayüz]]></title>
            <description><![CDATA[Sunucu güdümlü arayüz, sunucu tarafı kompozisyonun mobil karşılığıdır. Zor kısmı JSON render etmek değil, eski sürümlerde ayakta kalan sürümlenmiş bileşen sözleşmesidir.]]></description>
            <link>https://sph.sh/tr/posts/server-driven-ui-mobile/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/server-driven-ui-mobile/</guid>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir native uygulama yayınlarsınız, sonra her hafta bir vitrin ekranını, bir promosyon afişini veya bir ödeme adımını değiştirmeniz gerekir. Her değişiklik app-store incelemesini ve kullanıcıların güncellemesini bekler; zaten yüklü olan sürümler aylarca kullanıcıların cebinde kalır, yani bir sunucuyu yeniden dağıttığınız gibi istemciyi geri alamazsınız. Sunucu güdümlü arayüz (SDUI) buna, yeni native kod yerine bir arayüz <em>tarifi</em> göndererek yanıt verir: buradaki öneri, onu içerik biçimli yüzeyler için bir neşter gibi kullanmak ve sözleşmeyi eski istemciler zarifçe geri çekilecek biçimde tasarlamaktır.</p>
<p><strong>Web Karşılığı ve Mobildeki Ek Kısıt</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Commit'ten Üretime Lead Time Nasıl Azaltılır?]]></title>
            <description><![CDATA[Yüksek performanslı ekiplerin kod-tamam ile canlı arasındaki süreyi güvenlikten ve kaliteden ödün vermeden nasıl kısalttığı. Teknik liderler için bir karar rehberi.]]></description>
            <link>https://sph.sh/tr/posts/compressing-time-to-production/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/compressing-time-to-production/</guid>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <category><![CDATA[feature-flags]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Birçok organizasyonda bir özellik canlıya çıkmadan günlerce kod-tamam halinde bekleyebilir; bir inceleme kuyruğunun, bir release train'in ya da kaçırdığı bir deploy slotunun arkasında takılı kalır. Bunu yakalayan metrik, değişiklikler için lead time'dır: bir değişikliğin commit edilmesinden üretimde çalışmasına kadar geçen süre; ve bu sürenin büyük kısmı programlama değil, süreçtir. Bir teknik liderin yapabileceği en faydalı hamle, lead time'ı birincil teslimat metriği olarak ele almak ve en büyük bekleme aşamasının üzerine yapısal olarak gitmektir. Sıra bellidir: parti boyutunu küçült, deploy ile release'i ayır, sonra güvenlik kapısını ve ekipler arası kapıyı kendi kendine işleyen guardrail'lere dönüştür.</p>
<p><strong>Lead Time Saati</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Shift-Left Security: İnceleme Kuyruğu Darboğazını Kaldırmak]]></title>
            <description><![CDATA[Yüksek performanslı ekipler güvenlik incelemesini lead-time darboğazına çevirmiyor: shift-left otomasyon, risk-tabanlı kapılar, hazır yol ve bağımlılık ritmi.]]></description>
            <link>https://sph.sh/tr/posts/security-without-the-review-queue/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/security-without-the-review-queue/</guid>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Birçok organizasyonda tamamlanmış bir değişiklik, üretime çıkmadan önce günlerce inceleme kuyruğunda bekler. Bu kuyruğun nedeni, güvenlik incelemesinin tek tip manuel bir kapı gibi ele alınmasıdır: her değişiklik, riski ne olursa olsun, üretime ulaşmadan önce bir insanın arkasında sıraya girer. Çözüm, incelemeyi her değişiklik için bir kapı olarak görmeyi bırakmaktır: onu otomatik, risk-tabanlı korkuluklara dönüştürün ki sıradan durum hiçbir zaman bir insanı beklemesin. Kuyruk böylece güvenliği zayıflatmadan ortadan kalkar ve kapı yalnızca riskin gerektirdiği yerde kalır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[BFF ile Mobil API Sürümleme: İstemciyi Geri Alamadığınızda Ship Etmek]]></title>
            <description><![CDATA[Mobil binary geri alınamaz ve eski sürümler kalıcıdır; güvenlik ve hız sunucuya kayar: BFF, tüketici güdümlü sözleşmeler ve geriye dönük uyumlu sürümleme.]]></description>
            <link>https://sph.sh/tr/posts/the-client-you-cannot-roll-back/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/the-client-you-cannot-roll-back/</guid>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Sunucuda kötü bir deploy saniyeler içinde geri alınabilir; mobilde ise ship edilen binary kalıcıdır, app store incelemesi sizin kontrolünüz dışındadır ve eski istemci sürümleri aylarca kullanımda kalır. Bu asimetri, release stratejinizi belirlemesi gereken tasarım kısıtıdır: istemci, sistemin geri alamayacağınız tek parçasıdır; bu yüzden hem güvenlik hem hız, değiştirebildiğiniz tarafa kaymak zorundadır. Bu kısıttan doğan kaldıraçlar şunlar: bir backend-for-frontend katmanı, bağımsız deploy için tüketici güdümlü sözleşmeler, geriye dönük uyumlu API evrimi ve server-driven UI'ın değerini nerede kanıtladığına dair net bir sınır.</p>
<p><strong>Asimetrik Saat</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lambda Durable Functions vs Step Functions: Orkestratör Ne Zaman Kodunuza Ait?]]></title>
            <description><![CDATA[Lambda durable functions orkestratörü TypeScript kodunuza taşır. Tüm iş akışı sizinse onları seçin; Step Functions'ı ekipler arası state machine'ler için saklayın.]]></description>
            <link>https://sph.sh/tr/posts/lambda-durable-functions-vs-step-functions/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/lambda-durable-functions-vs-step-functions/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[step-functions]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[design-patterns]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Problem</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Frontend Platformu için Golden Path: İskelet, Paylaşılan Paketler ve Görev CLI'si]]></title>
            <description><![CDATA[Bir frontend platform ekibi doğru yolu nasıl en kolay yol haline getirir: golden-path iskeleti, sürümlü paylaşılan paketler ve ekip kaymasını gideren bir görev CLI'si.]]></description>
            <link>https://sph.sh/tr/posts/paved-road-frontend-platform/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/paved-road-frontend-platform/</guid>
            <category><![CDATA[platform-engineering]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir organizasyon çok sayıda küçük frontend uygulaması işlettiğinde, her ekip farklı bir iskeletten başlar ve build yapılandırması, lint kuralları ile dağıtım şekli birkaç sprint içinde birbirinden kayar. Bu kayma tembellikten değildir: bir uygulamayı başlatmanın standart yolunun aynı zamanda en hızlı yolu olduğu tek bir yer yoktur, bu yüzden her ekip temelleri yeniden kurar ve gözlemlenebilirliği, i18n'i ve dağıtımı biraz farklı şekilde yeniden uygular. Çözüm, üç temel taştan kurulan ince bir asfalt yoldur (bir golden-path iskeleti, sürümlü paylaşılan paketler ve bir görev CLI'si); işe yaradığını kanıtlayan tek ölçüt ise zorunlu tutulması değil, gönüllü benimsenmesidir.</p>
<p><strong>Ekipler Arası Kayma Neden Birikir</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sunum Servisi için Hexagonal Mimari: BFF Karşılaştırması]]></title>
            <description><![CDATA[Bir UI parçasının arkasındaki ince sunum servisi yapışkan koda dönüşür. Port-ve-adaptör, çekirdeği somut hiçbir şeye bağımlı bırakmayarak bunu sürdürülebilir tutar.]]></description>
            <link>https://sph.sh/tr/posts/hexagonal-presentation-service/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/hexagonal-presentation-service/</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[domain-driven-design]]></category>
            <category><![CDATA[observability]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Sunum servisi, tek bir UI parçasının arkasında duran ince arka uçtur: parayı ve tarihleri biçimler, metni ve i18n'i çözer, oturum durumunu şekillendirir ve UI adına tek bir alt domain servisini proxy'ler. Ekipler bunu yapışkan kod için bir çöplük olarak görür ve bu kod zamanla çamur topuna dönüşür. Para biçimleme HTTP işleyicilerinin içine karışır, alt servis istemcisinin tuhaflıkları iş kurallarına sızar. Bu servisi sürdürülebilir tutan disiplin port-ve-adaptör (hexagonal mimari) yaklaşımıdır ve tek bir kurala iner: domain çekirdeğini somut hiçbir şeye bağımlı olmamaya zorla.</p>
<p><strong>Yapışkan Koddan Çamur Topuna</strong></p>
<p>"İnce proxy" olarak başlayan bir servis, hiçbir sınır ayakta kalmayana kadar sessizce sorumluluk biriktirir:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sunucu Tarafı Micro-Frontend Kompozisyonu: Tek Sayfa, Birçok Ekip]]></title>
            <description><![CDATA[Sunucu tarafı micro-frontend kompozisyonu, sayfa parçalarının sahipliğini bağımsız ekiplere verir. Zor kısım sahiplik sınırı ve sürümlenmiş tutarlılık sözleşmesidir.]]></description>
            <link>https://sph.sh/tr/posts/server-side-micro-frontend-composition/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/server-side-micro-frontend-composition/</guid>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[nodejs]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Checkout ya da vitrin gibi tek bir yüksek trafikli sayfa, çoğu zaman bağımsız teslimat yapması gereken birçok ekibin katkısına ihtiyaç duyar. Frontend monolit, bu ekipleri tek bir sürüm trenine bindirir; böylece bir ekibin yavaş derlemesi veya bozuk testi diğer tüm ekiplerin deploy'unu engeller. Sayfayı birleştiren mekanizma kolay kısımdır; asıl zor problem, sahiplik sınırı ile birçok ekibi koordineli bir sürüm olmadan görsel ve davranışsal olarak hizalı tutan sürümlenmiş tutarlılık sözleşmesidir. Çok ekipli, SEO'ya duyarlı ve ilk boyamanın önemli olduğu bir sayfada varsayılan seçenek sunucu tarafı kompozisyondur; istemci tarafı kompozisyon ile iframe'ler daha dar senaryolarda öne geçer.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Init Amortismanına Göre Kod Mimarisi: Lambda'da Yalın, Ağırlık Ancak Hak Edilince]]></title>
            <description><![CDATA[Mimari ağırlığını runtime'ın init-amortismanına göre seç: single-purpose Lambda'da yalın handler, Lambdalith'te orta, tam OOP/DI yalnızca uzun ömürlü runtime'da.]]></description>
            <link>https://sph.sh/tr/posts/code-architecture-init-amortization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/code-architecture-init-amortization/</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Problem</strong></p>
<p>1. Bölüm Lambda sorusunun topoloji yarısını yanıtladı: single responsibility bir kod ilkesidir, kaç fonksiyon deploy edileceği ise ayrı bir topoloji kararıdır. Diğer yarı, belirli bir runtime'ın içine ne kadar kod mimarisi girmesi gerektiğidir: ne kadar OOP, dependency injection ve framework ağırlığı. Yanıt 1. Bölüm'ün "istisnayı hak et" biçimini yansıtır: varsayılan olarak yalın fonksiyonel handler kullan, sonra her runtime'ın init-amortismanı izin verdikçe daha ağır yapıyı hak et. Kararı belirleyen değişken, tek bir initialization'ın kaç invocation'a hizmet ettiğidir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda'da Effect: SST ve DynamoDB ile URL Kısaltıcı Oluşturma]]></title>
            <description><![CDATA[AWS Lambda ve DynamoDB üzerinde Effect ve SST v4 ile küçük, eksiksiz bir URL kısaltıcı; sınırda şema, layer'lar ve tagged error eşlemesini gösterir.]]></description>
            <link>https://sph.sh/tr/posts/effect-lambda-link-shortener/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/effect-lambda-link-shortener/</guid>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[dynamodb]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Tipik bir TypeScript Lambda handler'ı kesişen işleri kodun içine yığar: JSON.parse(event.body), gelişigüzel if (!body.url) kontrolleri, bir try/catch içinde URL doğrulaması, ardından her catch bloğunun bir HTTP statüsünü yeniden türetip bir hata gövdesini yeniden serileştirdiği iş mantığı. Asıl maliyet ilk bakışta görünmez; sorun boilerplate değil, statülerin ve hata şekillerinin çağrı noktasında seçilmesi ve bu yüzden zamanla kayması. Dahası, mantığı test etmenin tek yolu ya gerçek AWS'ye bağlanmak ya da SDK istemcisini elle mock'lamak. Effect bu yığını tipli bir programın üzerindeki ince bir adaptöre indirger. Kurulabilir tek bir parça, Lambda ve DynamoDB üzerinde SST v4 ile kurulmuş bir URL kısaltıcı, her Effect yapı taşının size tam olarak ne kazandırdığını gösterir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda: Tek Amaçlı Fonksiyonlar mı, Lambdalith mi?]]></title>
            <description><![CDATA[AWS Lambda fonksiyonlarını nasıl bölmeli: varsayılan single-purpose, single-domain Lambdalith'i hak edilmiş istisna gör, kararı veren platform güçlerini tanı.]]></description>
            <link>https://sph.sh/tr/posts/lambda-function-granularity-responsibility-scope-domain/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/lambda-function-granularity-responsibility-scope-domain/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[cold-start]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Problem</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Scrum, Kanban ve Scrumban: Yapay Zeka Destekli Ekipler]]></title>
            <description><![CDATA[Yapay zeka uygulamanın çoğunu üstlendikçe çerçevenin adı dört geri besleme döngüsünden daha az önem taşır. Akış, tempo, WIP ve inceleme için bir karar merceği.]]></description>
            <link>https://sph.sh/tr/posts/scrum-kanban-scrumban-ai-driven-teams/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/scrum-kanban-scrumban-ai-driven-teams/</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Yapay zeka asistanları artık kodun giderek büyüyen bir kısmını yazıyor. Mühendislik liderleri ise hâlâ Scrum mı, Kanban mı, başka bir çevik çerçeve mi seçecekleri konusunda haftalarca tartışıyor; sonra başka bir şirketin törenlerini kopyalayıp neden hiçbir şeyin daha hızlı akmadığına şaşırıyor. Tuzak, çerçevenin ismini kararın kendisi sanmaktır. Görüşüm şudur: yapay zeka destekli bir ekibin neredeyse hiç markalı bir metodolojiye ihtiyacı yoktur. İhtiyacı olan, bağlamına göre ayarlanmış dört geri besleme döngüsüdür: işin nasıl aktığı, ne sıklıkla yeniden yön belirlediğiniz, paralelde ne kadar iş yürüdüğü ve çıktının nasıl incelendiği. Bu karar merceği, bir sonraki çerçeve modasından sonra da geçerli kalır ve yapay zekanın darboğazı kod yazmaktan uzaklaştırdığını hesaba katar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zod Branded Types ile PII Koruması: Compile-Time Log Güvenliği]]></title>
            <description><![CDATA[Tek bir PII branded type'ı observability API imzalarınıza yerleştirin; TypeScript hassas alanları runtime redactor görmeden, çağrı yerinde reddetsin.]]></description>
            <link>https://sph.sh/tr/posts/zod-brands-prevent-pii-logging/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/zod-brands-prevent-pii-logging/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[zod]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[compliance]]></category>
            <category><![CDATA[nodejs]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Structured loglar PII'yi birbirine çok benzeyen üç çağrı yerinden sızdırır: logger.info({ user }), metrics.increment("login", { email }) ve tracer.startActiveSpan("auth", { attributes: { ip } }). Çoğu ekip bunu yakalamak için Pino redact.paths ya da cloud tarafında bir scrubber ekler. O savunmalar son hattır ve liste tabanlıdır; şemalar değiştikçe sessizce kayarlar. Effect-TS aynı problemi runtime'da, Redacted<A> ve değer yerine <redacted> basan bir Logger ile ele alıyor. Pino, problemin bir dilimini compile-time'da LogFnFields ile kapatıyor; belirli anahtarları never üzerinden yasaklıyor. Rust'ın secrecy crate'i üçüncü bir yol izliyor: wrapper Display'i hiç implement etmiyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Staff Engineer Solver Arketipi: Bir Operasyon Modeli]]></title>
            <description><![CDATA[Gayri resmi hızlı şerit için bir el kitabı: Solver rolünü tanımak, rol kemikleşmeden operasyon modelini yazıya dökmek ve unvan-kapsam-ücret konuşmasıyla eşzamanlamak.]]></description>
            <link>https://sph.sh/tr/posts/solver-track-staff-engineer-operating-model/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/solver-track-staff-engineer-operating-model/</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[organizational-design]]></category>
            <category><![CDATA[compliance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Mühendislik organizasyonlarında kendiliğinden oluşan gayri resmi hızlı şerit</strong></p>
<p>Belirli bir ölçeği aşan mühendislik organizasyonlarının çoğunda, standart SDLC'nin yanına sessizce ikinci bir şerit kurulur: beklemeye fazla stratejik, planlamaya fazla belirsiz, tam ekip ayırmaya fazla dar işler için. Bu örüntü sektörden bağımsız tekrarlar: yönetici sponsorluğu, bir veya iki kıdemli mühendis, aylarla ölçülen bir süre ve tanınabilir küçük bir sonuç kümesi. Bu şeritlerin çoğu uygulama nedeniyle değil, ilk proje şeride girmeden önce operasyon modelini kimse yazmadığı için başarısız olur.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aurora Serverless v2 Nasıl Çalışır: Mimariye Derin Bakış]]></title>
            <description><![CDATA[Aurora Serverless v2'nin altında ne çalışıyor: paylaşılan depolama katmanı, ACU temelli işlem, Caspian altyapısı, sıfıra ölçekleme ve karışık modlu cluster'lar.]]></description>
            <link>https://sph.sh/tr/posts/aurora-serverless-v2-architecture/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aurora-serverless-v2-architecture/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[postgresql]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Aurora Serverless v2, çoğu zaman provisioned Aurora'dan bağımsız, ayrı bir veritabanı ürünüymüş gibi tanıtılır. Bu çerçeve mühendisleri yanlış varsayımlara götürür: replika sayısının otomatik arttığı, ölçekleme anında bağlantıların düştüğü, her ölçeklemede cache'in soğuduğu sanılır. Üçü de doğru değil; ama Kasım 2024'ten beri bir dördüncü kısmen doğru: sıfıra ölçekleme bir soğuk başlangıç yolu ima ediyor. Altta yatan gerçek şu: Serverless v2, provisioned cluster'ların da üzerinde çalıştığı aynı Aurora işlem ve depolama altyapısına eklenmiş bir scaling daemon ve faturalama sarmalayıcısıdır.</p>
<p><strong>Adlandırma üzerine kısa bir not</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Phronesis ve AI Kodlama Ajanları: Modelin Size Veremeyeceği Beceri]]></title>
            <description><![CDATA[Ajanlar kod yazmayı neredeyse bedavaya indirdi; ama onları ne zaman ve ne kadar kullanacağınız konusundaki yargı hâlâ tamamen size ait. İki beceriyi ayıran bir çerçeve.]]></description>
            <link>https://sph.sh/tr/posts/phronesis-and-ai-coding-agents/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/phronesis-and-ai-coding-agents/</guid>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AI kodlama ajanları kod yazma maliyetini neredeyse sıfıra indirdi. Ne kadar kod yazılması gerektiğini ve ne zaman yazılması gerektiğini bilmenin maliyeti ise kıpırdamadı. Bugünkü "AI verimliliği" tartışmasının büyük kısmı, insanların bu iki beceriyi birbirine karıştırarak birbirlerini yanlış anlamasından ibaret. Aristoteles'ten ödünç alınan bir çerçeve bu iki beceriyi temiz biçimde ayırıyor; Mario Zechner, Addy Osmani, Kent Beck, Simon Willison, METR ve Steve Yegge bu çerçeve üzerinden okunduğunda görünürdeki çelişkiler tek bir anlaşmazlığa iniyor. O anlaşmazlıkta Zechner doğruya Yegge'den daha yakın duruyor; ama Yegge'nin karşıt pozisyonu argümanı körleştirmek yerine keskinleştiriyor.</p>
<p><strong>Tartışmanın Sürekli Karıştırdığı İki Beceri</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GitHub Environments: Deployment İçin Manuel Onay Kapıları]]></title>
            <description><![CDATA[Üretim deploy'ları gerçek bir onay adımı ister: GitHub Environment, native koruma kuralları ve environment'a bağlı secret'lar; if: hilesi ya da marketplace değil.]]></description>
            <link>https://sph.sh/tr/posts/github-environments-approval-gates/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/github-environments-approval-gates/</guid>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Üretim deploy'larında insan onayı gerekir, ama çoğu ekip yanlış parçayı seçer. En sık görülen üç şekil şudur: bir label'a bakan workflow if: koşulu, issues: write izniyle yorum bekleyen marketplace onay action'ı, ya da herhangi bir katkıcının tetikleyebildiği workflow_dispatch butonu. Artifact'ı main üzerinden bir kez üretin, staging'e otomatik düşsün, aynı artifact production'a ancak bir PM ya da QA bir GitHub Environment kapısında onay verdikten sonra promote edilsin. Aynı artifact, iki environment, tek onay. Bu kapı hem deploy credential'ını hem de insan onayını birlikte kapsar ve run'a bağlı bir audit kaydı bırakır.</p>
<p><strong>Environment nesnesi</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Bedrock ve CDK ile RAG Agent Kurmak]]></title>
            <description><![CDATA[AWS Bedrock + Knowledge Bases + OpenSearch Serverless üstüne CDK ile TypeScript kullanarak RAG agent kurmak: mimari, IAM bağlantısı, otomatik ingestion ve chat UI.]]></description>
            <link>https://sph.sh/tr/posts/aws-bedrock-rag-cdk-port/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-bedrock-rag-cdk-port/</guid>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[rag]]></category>
            <category><![CDATA[vector-databases]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[iam]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS, Bedrock Agent ile Knowledge Bases ve OpenSearch Serverless üçlüsünü yönetilen RAG yolu olarak konumlandırıyor: retrieval kodunu kendin yazmadan, belgeye dayalı sohbet uygulaması çıkarıyorsun. DigitalOcean rag-assistant şablonunun şeklini AWS-native servislere TypeScript ile CDK üzerinde taşıdım, uçtan uca dağıttım ve ilk koşunun düştüğünü gördüm. AWS Bedrock yönetilen RAG yığını CDK ile çalışıyor, ancak belge boşluğundan doğan iki tuzak ilk dağıtımını düşürecek: bölgeler arası inference profile için IAM açığı ve dağıtım anında otomatik ingestion job'un olmaması.</p>
<p><strong>Mimari eşleme</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amazon Bedrock Knowledge Bases Rehberi: Veri Kaynakları ve Vektör Depoları]]></title>
            <description><![CDATA[Bedrock Knowledge Base aslında nedir, hangi veri kaynakları ve vektör depoları birinci sınıf desteklenir ve konsol varsayılanı küçük bir korpusa neden nadiren uyar.]]></description>
            <link>https://sph.sh/tr/posts/bedrock-knowledge-bases-anatomy/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/bedrock-knowledge-bases-anatomy/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[rag]]></category>
            <category><![CDATA[vector-databases]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[embeddings]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Konsol sihirbazının arkasındaki varsayılan</strong></p>
<p>Amazon Bedrock Knowledge Bases; bir konnektörü, bir chunker'ı, bir embedding modelini, bir vektör deposunu ve bir retrieval API'sini tek bir yönetilen yüzeyde paketler. Confluence konnektörü aslında kılık değiştirmiş bir vektör deposu kararıdır. AWS dokümantasyonu, Confluence Cloud'un "şu anda" yalnızca OpenSearch Serverless vektör deposu ile kullanılabildiğini açıkça belirtir; aynı kilitlenme SharePoint ve Salesforce için de geçerlidir. Bu tek kısıt mimariyi iki yola ayırır; konnektörü bağlamadan önce seçim yapmak sizi yeniden yazımdan kurtarır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[HMAC: Nedir, Nasıl Çalışır ve Ne Zaman Yanlış Araçtır]]></title>
            <description><![CDATA[Webhook, imzalı URL ve servisler arası kimlik doğrulama için pratik bir HMAC-SHA-256 rehberi: üç dilde çalışan kod ve dijital imzaya geçmenin gerektiği sınır.]]></description>
            <link>https://sph.sh/tr/posts/hmac-explainer-when-to-use/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/hmac-explainer-when-to-use/</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[encryption]]></category>
            <category><![CDATA[webhooks]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[go]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Webhook alıcıları, imzalı indirme bağlantıları ve servisler arası iç çağrıların hepsi aynı soruya cevap arar: bu istek gerçekten paylaşımlı sırra sahip taraftan mı geldi ve bozulmadan mı ulaştı? Sabit zamanlı karşılaştırma, ham gövde üzerinden hash alma ve zaman kayması toleransının aynı anda doğru olması gerekir; aksi halde koruma süs olarak kalır. Her iki tarafın da aynı sırrı tutabildiği simetrik güven durumunda bütünlük ve özgünlük için doğru varsayılan, standart kütüphanenin sabit zamanlı karşılaştırma fonksiyonuyla birlikte HMAC-SHA-256'dır.</p>
<p><strong>HMAC'in tam tanımı</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kafka vs SNS/SQS/EventBridge: Ne Zaman ve Nasıl Geçmeli]]></title>
            <description><![CDATA[Yönetilen bir event bus'tan Kafka'ya geçişi hak eden sinyaller ve rip-and-replace yapmadan taşımak için outbox tabanlı dört aşamalı geçiş planı.]]></description>
            <link>https://sph.sh/tr/posts/kafka-or-event-bus-migration-signals/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/kafka-or-event-bus-migration-signals/</guid>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[sns]]></category>
            <category><![CDATA[sqs]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[migration]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>SNS+SQS, EventBridge, Pub/Sub veya Service Bus üzerinde çalışan ekipler eninde sonunda bir duvara çarpar ve "Kafka'ya geçmeli miyiz?" sorusunu sorar. Sorun şu: "duruma bağlı" cevapları hangi koşulların gerçekten önemli olduğunu sıralamadığı için karar, en son okunan dokümana doğru kayar. Kafka; dayanıklılık, replay, sıralama ve sürdürülebilir throughput sorunlarının cevabıdır. Yönetilen event bus'ta iki veya daha fazla somut sinyal ateşlenene kadar kalın, sonra rip-and-replace yerine transactional outbox ile aşamalı geçiş yapın.</p>
<p>Yedi sinyal geçişi haklı çıkarır, beş karşı sinyal geçişe karşı durur ve aşağıdaki geçiş planı event tiplerini tek tek taşır; böylece geri dönüş her adımda mümkün kalır.</p>
<p><strong>Kafka'ya İten Sinyaller</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Bedrock AgentCore'u CDK ile deploy etmek: hızlı başlangıç]]></title>
            <description><![CDATA[AgentCore Runtime üzerinde minimal bir Strands agent'ı CDK ile deploy etme rehberi: parametrize stack, arm64 build, deploy ve invoke, IAM ve Marketplace ön koşulları.]]></description>
            <link>https://sph.sh/tr/posts/agentcore-cdk-quickstart/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/agentcore-cdk-quickstart/</guid>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Çıkış noktası</strong></p>
<p>Önceki post AgentCore Runtime'ı mimari düzeyde anlatıyor: container, identity, memory, gateway. Deployment sorusu tam orada başlıyor: AgentCore artık @aws-cdk/aws-bedrock-agentcore-alpha üzerinden CDK'dan erişilebilir, peki uçtan uca çalışan bir trial neye benziyor? Kısa cevap: alpha L2'yi kullan ve sürümünü pin'le. Stack kodu kısa kalıyor çünkü ağırlığı construct taşıyor; ilk invoke sonuç dönmeden önce birkaç IAM ve Marketplace ön koşulunun yerine oturması gerekiyor.</p>
<p><strong>Ne kuruyoruz</strong></p>
<p>eu-central-1'de AgentCore Runtime üzerinde minimal bir Strands agent'ı deploy eden tek bir CDK stack'i; build script'i ve boto3 invoke yardımcısı dahil. Tam dosya yapısı:</p>
<p>[code block]</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude'u GitHub Action ile PR Reviewer Olarak Kurmak]]></title>
            <description><![CDATA[Anthropic'in claude-code-action'ını bir GitHub repo'suna eklemek için sıkılaştırılmış, kopyalanmaya hazır kurulum; güvenlik ve maliyet ayarlarıyla.]]></description>
            <link>https://sph.sh/tr/posts/claude-code-action-pr-reviewer-setup/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/claude-code-action-pr-reviewer-setup/</guid>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir GitHub repo'suna AI destekli code review eklemek tek bir seçimle başlıyor: geçici bir LLM entegrasyonu mu, bakımı yapılan bir action mı. Bakımlı yol erişim kontrolünü ve prompt injection temizliğini zaten üstleniyor; geçici yolda ikisi de size kalıyor. anthropics/claude-code-action v1 başlanmaya değer varsayılan: pull_request trigger'ı, salt okunur bir tool allowlist'i, sabitlenmiş bir model ve insanda kalan bir merge geçidi.</p>
<p>Workflow dosyasının kendisi kısa. Karar gerektiren kısım etrafındakiler: onu hangi trigger tetikliyor, hangi izinleri alıyor, modelin hangi tool'ları çağırmasına izin var ve büyük bir PR'ın review maliyeti ne oluyor.</p>
<p><strong>Önerilen kurulum</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript'te AWS Lambda Soğuk Başlatma Optimizasyonu: 5 Anti-Pattern]]></title>
            <description><![CDATA[DI container'lar, monolitik SDK'lar, god-handler'lar, modül üstü secret çağrıları ve ağır ORM'ler: soğuk başlatmada bedeli ve yerine geçen fonksiyonel yapı.]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-typescript-anti-patterns/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-typescript-anti-patterns/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[cold-start]]></category>
            <category><![CDATA[build-tools]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Ekipler NestJS, Spring veya .NET monolitlerinden AWS Lambda'ya geçerken uzun ömürlü servislerde işe yarayan kalıpları yanlarında getiriyor. Bundle'lar şişiyor, cold start uzuyor ve platformun ekonomisi bu kalıpları cezalandırıyor. Lambda bir mikroservis değil, fonksiyondur; monolit OO/DI kalıpları bundle'ı şişirir, cold start'ı uzatır.</p>
<p>Hasarın çoğunu beş alışkanlık üretiyor: DI container'lar, modüler olmayan AWS SDK import'ları, god-handler servis sınıfları, modül üstünde senkron secret çağrısı ve ağır ORM'ler.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cloudflare Workers'a WASM Görsel Yeniden-Boyutlama Modülü Yüklemek]]></title>
            <description><![CDATA[Rust + WASM ile yazılmış bir görsel boyutlama handler'ının Cloudflare Workers'ın binary, bellek ve CPU tavanlarına sığıp sığmayacağını inceleyen keşif.]]></description>
            <link>https://sph.sh/tr/posts/cloudflare-workers-wasm-image-resize/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cloudflare-workers-wasm-image-resize/</guid>
            <category><![CDATA[webassembly]]></category>
            <category><![CDATA[cloudflare]]></category>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[edge-computing]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Body'den JPEG alıp yeniden boyutlandırılmış JPEG döndüren bir POST /resize?w=800&q=85 handler'ı, Cloudflare Workers + WASM'ın bir görsel hattı sunucusu olarak en sade, oyuncak olmayan stres testidir. Tasarım üç edge-platform limitine aynı anda yüklenir: derlenmiş binary boyutu, isolate başına bellek ve istek başına CPU süresi. Sırayla okunduğunda yayınlanmış limitler sorunun büyük kısmını zaten çözer. Free tier tek başına CPU süresinden elenir; Paid tier'da ise tasarım, ikinci bir codec'e pek yer bırakmayan bir bundle bütçesi içinde, istek başına tek görsel için iş görür.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WebAssembly Kullanım Alanları: Tarayıcı, WASI Sunucu ve Edge Compute]]></title>
            <description><![CDATA[Stack'ten bağımsız bir WebAssembly haritası (tarayıcıda performans, sunucuda WASI, edge'de compute) hangi konuşmanın hangi bahisten gittiğini gösterir.]]></description>
            <link>https://sph.sh/tr/posts/webassembly-101/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/webassembly-101/</guid>
            <category><![CDATA[webassembly]]></category>
            <category><![CDATA[edge-computing]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>WebAssembly konuşmaları sürekli birbirini ıskalıyor; çünkü tek bir kelime üç çok farklı mimari bahsi örtüyor. Frontend geliştirici "web'i hızlandırır" diye düşünüyor, backend geliştirici "container'ların yerine geçer" diye okuyor, platform geliştirici "edge'i çalıştırır" diye varsayıyor ve üçü de kısmen haklı. Tek bir runtime'ı değerlendirmeden önce problemini bu üçünden birine oturt; hiçbiri mevcut mimarini tarif etmiyorsa Wasm'i şimdilik ertele.</p>
<p><strong>30 Saniyede WASM</strong></p>
<p><strong>Tek bytecode, üç ayrı bahis: tarayıcıda performans, sunucuda WASI runtime, edge'de compute.</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[EventBridge Hesaplar Arası Fan-Out: Tek Producer, İzole Consumer'lar]]></title>
            <description><![CDATA[Çok takımlı AWS organizasyonları için platform varsayılanı: tek event, birçok consumer, her biri kendi hesabında SQS ve DLQ'suyla; fan-out bus katmanında.]]></description>
            <link>https://sph.sh/tr/posts/event-fanout-isolated-consumer-accounts/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/event-fanout-isolated-consumer-accounts/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[multi-account]]></category>
            <category><![CDATA[sqs]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[platform-engineering]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir producer servisi yeni consumer'ları midye gibi üstüne toplar. Event isteyen her yeni takım başka bir if enabled(x) publish(x) dalı ekler ve her yeni consumer için producer'ın deploy edilmesi gerekir. Dallar, uygulama koduymuş gibi görünen bir anahtar kutusudur; herhangi bir hatanın etki alanı ise ödeme işlemleriyle aynı hesabın içindedir.</p>
<p>Bu dalları ortadan kaldıran varsayılan şudur: tek event, birçok consumer, her biri kendi AWS hesabında kendi SQS ve DLQ'suyla. Fan-out'u event bus katmanındaki kurallar taşır; producer'ın kodu bu işin dışında kalır. Audit, Customer Center, Marketing ve onlardan sonra gelen her consumer aynı topolojiyi kullanır. Farklı bir omurga ancak sıralama, replay veya ham throughput zorladığında yerini hak eder.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[wasmCloud ve NATS: Event Bus'ı Taşınabilir Kılmak]]></title>
            <description><![CDATA[Bir keşif tezi: event-driven sistemlerde vendor lock-in runtime'da değil bus topolojisinde yaşar; wasmCloud ve NATS bus'ı taşınabilir kılıyor.]]></description>
            <link>https://sph.sh/tr/posts/wasmcloud-nats-event-bus-portability/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/wasmcloud-nats-event-bus-portability/</guid>
            <category><![CDATA[webassembly]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[eventbridge]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Event-driven bir sistemde vendor lock-in runtime'da değil, bus topolojisinde yaşar. Runtime haftalar içinde değiştirilebilir; topoloji çeyrekler alır. Serverless kilitlenmesi tartışmaları bu ayrımı çoğunlukla atlar; Lambda'yı Cloud Functions'a, Workers'ı Containers'a karşı konumlandırır, event bus'ı da tesisat hanesine yazar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Web ve Mobil Uygulamalarda Uzun Süren API İsteklerini Yönetmek]]></title>
            <description><![CDATA[Tek bir backend üzerinde çalışan web SPA ve mobil uygulama için uzun süreli işlere dair tek bir varsayılan desen ve onu geçersiz kılmanız gereken durumlar.]]></description>
            <link>https://sph.sh/tr/posts/async-api-patterns-web-mobile/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/async-api-patterns-web-mobile/</guid>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[real-time]]></category>
            <category><![CDATA[webhooks]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[http]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Senkron İstek/Yanıt Nerede Tıkanır</strong></p>
<p>Çoğu ürün API'si düz senkron istek/yanıt ile başlar. Login için, bir kullanıcı kaydını okumak için, basit bir arama için çalışır. Sonra bir uç nokta gerçek iş yapmak zorunda kalır.</p>
<p>Altı ila on saniye süren bir ödeme yetkilendirmesini düşünün. Bu kadar uzun bir spinner checkout dönüşümünü düşürür; kullanıcılar butona tekrar basar ve altta bir idempotency katmanı olmadığında backend ikinci bir ücretlendirmeyi kabul eder.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code, Cursor, Copilot, Codex için Tek Yapılandırma]]></title>
            <description><![CDATA[Claude Code, Codex, Copilot, Cursor ve OpenCode'un aynı kuralları okumasını sağlayan pratik bir repo düzeni ve taşınabilirliğin kırıldığı noktaların dürüst bir özeti.]]></description>
            <link>https://sph.sh/tr/posts/model-agnostic-ai-coding-setup/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/model-agnostic-ai-coding-setup/</guid>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[github-copilot]]></category>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[ai-agents]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Ekipler nadiren tek bir AI kodlama aracında uzlaşır; yalnızca Claude Code, Codex, Copilot, Cursor ya da OpenCode'dan biriyle çalışan bir repo, farklı bir araç seçen her katkı sağlayıcıyı dışarıda bırakır. Aşağıdaki düzen tek bir dosyayı yetkili kılar: kaynak olarak AGENTS.md, diğer araçların beklediği her dosya adı için symlink ya da @-import, araçlar arası tool katmanı için MCP. Düzen üç yerde kırılır: skill'ler, slash komutları ve Windows symlink tuzakları.</p>
<p><strong>Problem</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Optimistic UI vs Decoupled Akış: Async Backend'ler için UX Desenleri]]></title>
            <description><![CDATA[Async backend'le çalışan tasarımcılar için pragmatik rehber: üç etkileşim şekli, hangisi ne zaman, ve karşı durmanız gereken dört anti-pattern.]]></description>
            <link>https://sph.sh/tr/posts/ux-event-based-backends-optimistic-to-decoupled/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ux-event-based-backends-optimistic-to-decoupled/</guid>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[state-management]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[mobile]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Event-based bir backend, işi istek/yanıt döngüsünün dışına taşır: istemci gönderir, sunucu kabul edip kuyruğa alır ve durum değişikliği bir süre sonra gerçekleşir. Spinner, sistemin bu oturum için aktif olarak sonucu ürettiği sinyalini verir; ancak event-based bir akışta client tarafında beklenen bir iş yoktur. UI iki farklı durumu birleştirir (backend işi sıraya aldı vs. backend şu anda sonucu hesaplıyor); oysa bu iki durum kullanıcıya farklı sözler verir.</p>
<p>Backend bir değişikliği kaydettiği an ile frontend'in bunu yansıttığı an arasındaki boşluk mimari olarak kaçınılmazdır. Bu boşluğu spinner ile kapatmak yanlış hamledir: spinner ya durum gelmeden biter (ve kullanıcı "oluşturuldu" yazısının ardından boş bir liste görür) ya da oturumun ötesine sarkar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Idempotency: API'lerde Güvenli Retry için Başlangıç Rehberi]]></title>
            <description><![CDATA[API, ödeme ve mesaj tüketicisi geliştirenler için idempotency'ye pratik giriş: HTTP metot semantiği, idempotency key'leri, upsert ve yaygın tuzaklar.]]></description>
            <link>https://sph.sh/tr/posts/idempotency-beginners-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/idempotency-beginners-guide/</guid>
            <category><![CDATA[idempotency]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[http]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Idempotency, aynı işlemin defalarca çalıştırılmasının bir kez çalıştırılmasıyla aynı sonucu üretmesi özelliğidir. Para, yan etki ya da dağıtık iş tutan her API için kritiktir. Altta yatan taşıma katmanları (HTTP, mobil şebekeler, mesaj aracıları) başarısızlık durumunda niyetten bağımsız olarak retry yapar ve idempotent olmayan bir endpoint, her retry'ı bir duplicate yazmaya çevirir: çift ücretlendirme, tekrarlanan siparişler, iki kez işlenen işler.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Abonelik Uygulamalarında Mobil Reklam Atıfı: SKAN 4 ve AdAttributionKit]]></title>
            <description><![CDATA[SKAN 4, AdAttributionKit ve ATT sonrası reklam tıklamasını ücretli aboneliğe bağlayan ölçüm hattına mühendislik rehberi: olay taksonomisi ve mutabakat desenleri.]]></description>
            <link>https://sph.sh/tr/posts/mobile-ad-attribution-subscription-conversion/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mobile-ad-attribution-subscription-conversion/</guid>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[in-app-purchase]]></category>
            <category><![CDATA[subscriptions]]></category>
            <category><![CDATA[marketing-analytics]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Abonelik uygulamalarında attribution, Meta, Google veya TikTok'taki bir reklam tıklamasını veri ambarındaki doğrulanmış bir ücretli abonelik olayına bağlamak zorundadır. Install, o olaya giden yolda yalnızca ara bir sinyaldir; SKAN 4 ile ATT ise click-to-install bağlantısını install-to-subscription bağlantısından çok daha zor gözlemlenir hâle getirir. Tek bir hattın, birbirinden bağımsız saatlerle gelen üç kaynağı (SKAN postback'leri, mobil uygulama olayları, ödeme sağlayıcı makbuzları) uzlaştırması gerekir ki pazarlama, finans ve ürün aynı sayılar üzerinde çalışabilsin.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2026'da RevenueCat Alternatifleri: Mobil Uygulamalar için Abonelik Platformu Seçimi]]></title>
            <description><![CDATA[RevenueCat, Adapty, Qonversion, Apphud, Chargebee ve Stripe Billing arasında 2026'da seçim için karar çerçevesi: fiyatlandırma matematiği ve DMA etkisi.]]></description>
            <link>https://sph.sh/tr/posts/revenuecat-alternatives-comparison-2026/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/revenuecat-alternatives-comparison-2026/</guid>
            <category><![CDATA[subscriptions]]></category>
            <category><![CDATA[payment-systems]]></category>
            <category><![CDATA[in-app-purchase]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mobil abonelik altyapısı katmanlı bir seçimdir: cihaz üstündeki SDK ve entitlement motoru, onun arkasındaki faturalama/katalog/vergi katmanı ve en üstteki paywall, deneyleme ve analitik araçları. İlk katmanda RevenueCat varsayılandır ve diğer iki katmanı da çoğu ekip için yeterince iyi karşılar. Brüt gelir üzerinden alınan %1 MTR ücreti yaklaşık 100 bin dolar MTR'ın üstünde matematiği değiştiriyor ve 2026 pazarında varsayılanı tek bir eksende geçen alternatifler var: paywall deneylemede Adapty, analitik/fiyat oranında Qonversion, win-back akışlarında Apphud, çapraz platform faturalamada Chargebee ve Stripe Billing.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zapier MCP İzin Kontrolü: AI Agent API Erişimi Sınırlama]]></title>
            <description><![CDATA[Zapier MCP'nin AI agent'lar için aksiyon bazlı beyaz liste, merkezi kimlik yönetimi ve insan onay mekanizması sunması. Özel proxy çözümlerine yönetilen bir alternatif.]]></description>
            <link>https://sph.sh/tr/posts/zapier-mcp-api-permission-control/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/zapier-mcp-api-permission-control/</guid>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[automation]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Doğrudan MCP sunucu entegrasyonları, AI agent'lara geniş ve çoğu zaman kontrolsüz API erişimi verir. Önceki yazıda en az yetki prensibini uygulamak için kapsamı sınırlı proxy'lerin nasıl yazıldığını göstermiştik. Zapier MCP yönetilen bir alternatif sunuyor: aksiyon bazlı beyaz liste, merkezi kimlik yönetimi ve insan onay mekanizması; hem de tek satır proxy kodu yazmadan.</p>
<p>Bir agent'ı standart işlemlerle üç ya da daha fazla uygulamaya bağlayan ekipler için varsayılan bu yönetilen katman. Elle yazılan bir proxy, bakım maliyetini ancak tek bir entegrasyon derin özelleştirme ya da 100ms altı bir bütçe istediğinde çıkarır.</p>
<p><strong>MCP'de Kontrolsüz API İzinleri</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mobil IAP ve Paywall Stratejileri - App Store, Play Store, RevenueCat]]></title>
            <description><![CDATA[Mobil uygulama içi satın alma kuralları, paywall kalıpları ve sunucu tarafı makbuz doğrulama ile RevenueCat entegrasyonu üzerine pratik bir rehber.]]></description>
            <link>https://sph.sh/tr/posts/mobile-iap-paywall-strategies/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mobile-iap-paywall-strategies/</guid>
            <category><![CDATA[in-app-purchase]]></category>
            <category><![CDATA[subscriptions]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[payment-systems]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Platformlar Arası Abonelik Yetkilendirmesi: Web, iOS ve Android Senkronizasyonu]]></title>
            <description><![CDATA[EventBridge ve idempotent işleme ile web, iOS ve Android genelinde abonelik erişimini tutarlı tutan güvenilir bir yetkilendirme senkronizasyon katmanı nasıl kurulur.]]></description>
            <link>https://sph.sh/tr/posts/omnichannel-entitlement-sync/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/omnichannel-entitlement-sync/</guid>
            <category><![CDATA[webhooks]]></category>
            <category><![CDATA[idempotency]]></category>
            <category><![CDATA[subscriptions]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[payment-systems]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir ürün web, iOS ve Android üzerinde abonelik sattığında, her platform kendi şemasında, kendi yaşam döngüsüyle ve kendi teslim gecikmesiyle abonelik olayları yayar. Yetkilendirme senkronizasyon katmanı, bu heterojen olayları "bu kullanıcı şu anda neye erişebilir?" sorusuna tek ve tutarlı bir cevaba dönüştüren parçadır. Platform başına naif bir handler, saatler içinde senkronizasyondan çıkar; asıl sorun webhook tesisatı değil, dağıtık durumun kendisidir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ödeme Sağlayıcıları ve Uyumluluk: Stripe, Adyen, Chargebee, Paddle, PayPal Karşılaştırması]]></title>
            <description><![CDATA[SaaS için ödeme sağlayıcılarının karşılaştırması: Merchant of Record ve Payment Processor modelleri, PSD2/SCA uyumluluğu, KDV ve sağlayıcı seçimi için karar çerçevesi.]]></description>
            <link>https://sph.sh/tr/posts/payment-providers-comparison-compliance/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/payment-providers-comparison-compliance/</guid>
            <category><![CDATA[payment-systems]]></category>
            <category><![CDATA[subscriptions]]></category>
            <category><![CDATA[compliance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Küresel ödeme kabulünün aynı şekilde davranmayan üç katmanı vardır: işlem işleme, vergi uyumluluğu ve satışın yasal sorumluluğu. Sağlayıcıyı yalnızca işlem ücretine bakarak seçen bir SaaS ekibi, diğer iki katmanı genellikle bir KDV denetimi, bir PSD2/SCA red oranı ya da bir chargeback politikası gün yüzüne çıkardığında fark eder. Asıl karar, ekibin hangi katmanları kendi yönettiği ve hangilerini dışarıya verdiğidir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Abonelik Yaşam Döngüsü Yönetimi: Yükseltmeler, Dunning ve Dolandırıcılık Tespiti]]></title>
            <description><![CDATA[Abonelik durum makineleri, proration stratejileri, dunning yönetimi ve dolandırıcılık tespit kalıpları için Stripe webhook'ları ve AWS EventBridge ile pratik bir rehber.]]></description>
            <link>https://sph.sh/tr/posts/subscription-lifecycle-management/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/subscription-lifecycle-management/</guid>
            <category><![CDATA[subscriptions]]></category>
            <category><![CDATA[payment-systems]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[eventbridge]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Abonelik faturalamasında mutlu yol kısadır; asıl uzun olan, sessizce gelir sızdıran uç durumlar kuyruğudur. Özensiz bir proration adımı plan yükseltmelerinde çift ücret keser; varsayılan bir yeniden deneme politikası dunning sırasında kartı boş yere arka arkaya dener; eksik dolandırıcılık sinyalleri sonunda chargeback olarak geri döner. Abonelikler tek bir işlem değildir; birer durum makinesidir ve her faturalama olayı tetiklenebilen, başarısız olabilen veya tekrarlayabilen bir geçiştir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code Skill'leri ve Bağlam Penceresi Şişmesi: Token Bütçesi Rehberi]]></title>
            <description><![CDATA[Claude Code konfigürasyonlarını kopyalamak context window şişmesine, araç seçiminin bozulmasına ve uyumsuz iş akışlarına yol açar; token bütçesiyle bilinçli kurun.]]></description>
            <link>https://sph.sh/tr/posts/why-copying-claude-code-skills-doesnt-work/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/why-copying-claude-code-skills-doesnt-work/</guid>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Claude Code ekosistemi artık 500'den fazla topluluk skill'i, 1.200'den fazla agent skill'i ve düzinelerce MCP sunucu dizini barındırıyor. Birinin "awesome" kurulumunu klonlamak cazip geliyor; yanlış varsayılan da tam olarak bu. Kopyalanan konfigürasyonlar üç sorunu aynı anda büyütür: context window şişmesi gerçek koda yer bırakmaz, araç kalabalığı modelin doğru aracı seçme yeteneğini düşürür ve kopyalanan iş akışları senin kod tabanınla uyuşmaz.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SaaS Yetkilendirme için AWS Cognito + Verified Permissions]]></title>
            <description><![CDATA[AWS Cognito ve Verified Permissions ile SaaS yetkilendirmeyi Cedar politikaları, çok kiracılı desenler, JWT akışı ve maliyet analiziyle TypeScript'te kurun.]]></description>
            <link>https://sph.sh/tr/posts/cognito-avp-saas-authorization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cognito-avp-saas-authorization/</guid>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[saas]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS üzerinde B2B SaaS kurarken kimlik doğrulama işin kolay yarısıdır. Cognito kullanıcıyı doğrular ve bir JWT döndürür; ancak geçerli bir token, A kiracısının B kiracısının belgelerini okuyup okuyamayacağı hakkında hiçbir şey söylemez. Bu ikinci soruyu AWS Verified Permissions (AVP) yanıtlar ve başlangıç için makul varsayılan pool modelidir: tek Cognito User Pool, tek AVP policy store ve her Cedar politikasının içine yerleştirilmiş bir kiracı kontrolü.</p>
<p>Ağırlığı üç karar taşır: Pre Token Generation trigger'ının access token'a hangi claim'leri yazacağı, kiracı izolasyonunun Cedar politikasında mı yoksa kiracı başına ayrı altyapıda mı duracağı ve her çağrı yolunun hangi AVP API'sini kullanacağı. Cedar politikalarının şekli, TypeScript entegrasyonu ve aylık fatura bu üç karardan çıka...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OpenFGA vs SpiceDB vs Cerbos vs OPA vs AWS Verified Permissions: Hangisini Seçmeli]]></title>
            <description><![CDATA[AWS Verified Permissions, SpiceDB, OpenFGA, Cerbos ve OPA gibi harici yetkilendirme platformlarını mimari, maliyet ve karar çerçevesi açısından tarafsızca inceliyoruz.]]></description>
            <link>https://sph.sh/tr/posts/external-authorization-management-systems/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/external-authorization-management-systems/</guid>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Özel yetkilendirme sistemleri geliştirmek birçok uygulama için işe yarıyor. Dağıtık sistemler ise politika değerlendirme, ilişki yönetimi ve ince taneli erişim kontrolünü servis olarak sunan özel yetkilendirme altyapılarından giderek daha fazla fayda görüyor. Makul bir başlangıç noktası: yetkilendirmeyi tek bir servisin içinde kaldığı sürece gömülü bir kütüphanede tutun, servis sınırını aştığı anda harici bir motora geçin.</p>
<p>Hangi motoru seçeceğiniz baskın modelinize bağlı. AWS üzerinde öznitelik ağırlıklı kararlar için Cedar ve AWS Verified Permissions uygun. Erişim, kullanıcı ile kaynak arasındaki ilişkilerden türüyorsa SpiceDB veya OpenFGA öne çıkıyor. Geri kalanını maliyet, operasyonel yük ve politika dili kilitlenmesi belirliyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cedar vs Rego vs OpenFGA: Politika Dili Karşılaştırması]]></title>
            <description><![CDATA[Cedar, Rego, OpenFGA DSL ve Cerbos YAML/CEL politika dillerini söz dizimi, performans, biçimsel doğrulama, araçlar ve TypeScript entegrasyonu açısından karşılaştırıyoruz.]]></description>
            <link>https://sph.sh/tr/posts/policy-language-comparison-cedar-rego-openfga/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/policy-language-comparison-cedar-rego-openfga/</guid>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Yetkilendirme için seçtiğin politika dili, güvenlik mimarinin geri kalanını şekillendirir: politikaların nasıl yazılacağını, test edileceğini, dağıtılacağını ve denetleneceğini belirler. Sonradan dil değiştirmek hepsini yeniden yazmak demek, bu yüzden seçimi baştan bilinçli yapmakta fayda var.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SpiceDB vs Auth0 FGA: İlişki Tabanlı Yetkilendirme Karşılaştırması]]></title>
            <description><![CDATA[SpiceDB ve Auth0 FGA (OpenFGA) karşılaştırması: şema, tutarlılık modelleri, dağıtım ve ölçeklenebilirlik açısından farklı tercihler yapan iki Zanzibar tabanlı sistem.]]></description>
            <link>https://sph.sh/tr/posts/spicedb-vs-auth0-fga/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/spicedb-vs-auth0-fga/</guid>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>SpiceDB ve Auth0 FGA, Zanzibar tabanlı iki önde gelen yetkilendirme sistemidir. Ancak temelde farklı tercihler yaparlar. SpiceDB, ZedToken'lar aracılığıyla güçlü tutarlılık garantileri sunan gRPC-öncelikli, kendi sunucunuzda barındırılabilen (veya Authzed üzerinden yönetilen) bir motordur. Auth0 FGA ise farklı bir tutarlılık modeli ile OpenFGA üzerine kurulu, REST-öncelikli, tamamen yönetilen bir hizmettir.</p>
<p>Çoğu takım için varsayılan Auth0 FGA'dır; altyapı bütçeniz yoksa kendi sunucunuzda OpenFGA. Bu varsayılanı SpiceDB'ye çeviren iki gereksinim vardır: bir sonraki okumada hemen geçerli olması gereken izin iptali ve kontrolünüzdeki altyapıdan çıkamayacak yetkilendirme verisi. Şema sözdizimi, API ergonomisi ve yayımlanan ölçek tavanları bu ikisinin yanında daha az belirleyicidir.<...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Müşteri Geri Bildirimi Nasıl Önceliklendirilir: RICE ve ICE]]></title>
            <description><![CDATA[Kanal karmaşasında triage, keşif ve önceliklendirme için uygulanabilir bir operasyon çerçevesi.]]></description>
            <link>https://sph.sh/tr/posts/customer-feedback-product-value/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/customer-feedback-product-value/</guid>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[decision-making]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Müşteri geri bildirimi nadiren tertemiz bir problem tanımı olarak gelir. Slack mesajları, destek yanıtları, satış notları, puanlar ve tek cümlelik özellik istekleri olarak gelir. Zor olan <strong>toplamak değil</strong>. Zor olan, o akışı <strong>en yüksek sesin veya en büyük logonun varsayılan olarak yol haritasını çekmesine izin vermeden</strong> kararlara dönüştürmektir.</p>
<p>Gerçek bir ekipte ayakta kalan halka kısadır: intake, triage, iş belirsizse keşif, teslimat ve müşteriye kapanan döngü. Her adımın destek SLA’larına, mühendislik kuyruklarına ve panelin gösterdiği kadar temiz olmayan metriklere rağmen çalışması gerekir.</p>
<p><strong>Geri bildirimin yükü</strong></p>
<p>Farklı ekiplerde tekrar eden birkaç örüntü:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kimlik Doğrulama vs Yetkilendirme: Temelleri ve İzin Sistemleri Neden Bozulur]]></title>
            <description><![CDATA[Authentication ve authorization farkı, yaygın izin sistemi tuzakları, fail-closed prensibi ve her izin sisteminin karşılaması gereken hedefler.]]></description>
            <link>https://sph.sh/tr/posts/scalable-permission-systems-101-authorization-fundamentals/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/scalable-permission-systems-101-authorization-fundamentals/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Broken access control, OWASP Top 10'da (2021, 2025 güncellemesinde de doğrulandı) bir numaralı güvenlik açığı. İzin hatalarının çoğunun kökeninde, kontrolleri unutmayı kolay ve tutarlı tutmayı zor kılan bir mimari var. Kod tabanı büyüdükçe, bir kontrolün sessizce eksik kalabileceği yerlerin sayısı da büyüyor.</p>
<p>İlk günden benimsenmeye değer varsayılan, tüm veri erişiminin üzerinden geçtiği izin farkında tek bir katmandır; kontrol tamamlanamadığında erişimi reddeden bir katman. Oraya giden yol, pek çok kod tabanının bulanıklaştırdığı bir ayrımla başlar.</p>
<p><strong>Kimlik Doğrulama ve Yetkilendirme</strong></p>
<p>Bu iki kavram genellikle tek bir "auth" kelimesi altında birleştiriliyor ve bu da karışıklığa yol açıyor. Temelde farklı konulardır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Service Layer ile Merkezi Yetkilendirme]]></title>
            <description><![CDATA[Dağınık izin kontrollerini merkezi bir service layer'a taşıyın, Next.js middleware guard'ları ekleyin ve derinlemesine savunma yetkilendirme mimarisi oluşturun.]]></description>
            <link>https://sph.sh/tr/posts/scalable-permission-systems-102-service-layer-centralization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/scalable-permission-systems-102-service-layer-centralization/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Post 101'de dağınık izin kontrollerinin kök sorunlarını teşhis ettik: tutarsız mantık, güvenlik açıkları ve bakım yükü. İlk çözüm service layer pattern: tüm yetkilendirme mantığı, uygulama kodunuz ile veritabanı arasındaki tek bir katmana taşınır.</p>
<p>Route koruması için Next.js middleware ve farklı seviyelerdeki guard'lar bu katmanın üzerine eklenir. İkisi birlikte derinlemesine savunma mimarisini oluşturur: izin kuralı tek bir yerde yazılır, veriye giden her yolda uygulanır.</p>
<p><strong>Dağınık Kontrollerin Kök Nedeni</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RBAC: TypeScript ile Type-Safe Rol Bazlı Erişim Kontrolü]]></title>
            <description><![CDATA[TypeScript ile type-safe bir RBAC sistemi oluşturun, birleşik bir can() fonksiyonu yazın, UI ve backend'de izinleri senkronize edin ve RBAC'ın sınırlarını anlayın.]]></description>
            <link>https://sph.sh/tr/posts/scalable-permission-systems-103-role-based-access-control/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/scalable-permission-systems-103-role-based-access-control/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Post 102 yetkilendirmeyi service layer'da merkezileştirdi; izin kontrollerinin <em>nerede</em> yapılacağı sorusunu çözdü. Ancak service layer içindeki izin kuralları hala sabit kodlanmış if/else zincirleri: if (session.role === 'admin') return true. Yeni bir rol eklemek, her servis dosyasındaki her yardımcı fonksiyonu değiştirmek anlamına geliyor.</p>
<p>O zincirlerin yerini RBAC (Rol Bazlı Erişim Kontrolü) alıyor. Modeli Ferraiolo ve Kuhn 1992'de biçimlendirdi, NIST ise INCITS 359-2004 olarak standartlaştırdı. Tek bir type-safe can() fonksiyonu sabit kodlanmış kontrollerin tamamını devralıyor. Hem sunucu hem istemci tarafında çalışıyor ve Post 102'nin açık bıraktığı izin mantığı tekrarını kapatıyor.</p>
<p><strong>RBAC Nedir?</strong></p>
<p><strong>NIST Modeli</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript'te Attribute-Based Access Control (ABAC): Policy Engine Oluşturma]]></title>
            <description><![CDATA[TypeScript'te builder pattern, koşullu izinler ve RBAC'ın sınırlarını aşan type-safe policy değerlendirmesi ile bir ABAC policy engine oluşturun.]]></description>
            <link>https://sph.sh/tr/posts/scalable-permission-systems-104-attribute-based-access-control/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/scalable-permission-systems-104-attribute-based-access-control/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Post 103 type-safe RBAC'ı can(role, resource, action) fonksiyonu ve deklaratif bir izin matrisi ile oluşturdu. Yeni bir rol eklemek tek satırlık bir değişiklik olarak kalıyor, sunucu ve istemci de tek bir doğruluk kaynağını paylaşıyor. Ancak bağlamsal kararlar (sahiplik, departman kapsamı, belge durumu) bu matrisin dışında özel yardımcı fonksiyonlar olarak kalıyor. canModifyDocument, canEditInDepartment ve canPublishInReviewStatus can() fonksiyonunun yanında çoğalıyor; her biri tip sisteminin doğrulayamadığı bir if/else zinciri.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[İleri ABAC: Field-Level İzinler ve Veritabanı Entegrasyonu]]></title>
            <description><![CDATA[ABAC'ı ortam bazlı kurallar, alan seviyesinde okuma ve yazma izinleri ve tekrar eden izin mantığını ortadan kaldıran otomatik sorgu filtrelemeyle genişletin.]]></description>
            <link>https://sph.sh/tr/posts/scalable-permission-systems-105-advanced-abac-field-level-db/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/scalable-permission-systems-105-advanced-abac-field-level-db/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Post 104 builder pattern ile type-safe bir ABAC policy engine oluşturdu. can(user, action, resource, data?) fonksiyonu özne, kaynak ve eylem niteliklerini deklaratif koşullar aracılığıyla değerlendiriyor. Sahiplik, departman kapsamı ve kaynak durumu artık policy kuralı; dağınık yardımcı fonksiyonlar ortadan kalktı. Geriye iki boşluk kalıyor ve ikisi de aynı builder genişletilerek kapanıyor; etrafına yeni bir kontrol katmanı eklemek gerekmiyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript'te Multi-Tenant Yetkilendirme: CASL vs Özel ABAC]]></title>
            <description><![CDATA[İzin sisteminize multi-tenant izolasyonu ekleyin, CASL'ı kütüphane alternatifi olarak değerlendirin ve doğru yetkilendirme mimarisini karar çerçeveleriyle seçin.]]></description>
            <link>https://sph.sh/tr/posts/scalable-permission-systems-106-multi-tenancy-libraries-decisions/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/scalable-permission-systems-106-multi-tenancy-libraries-decisions/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[saas]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Post 101 bir izin sistemi için yedi hedef belirledi ve dağınık kontrol anti-pattern'ini ortaya koydu. Post 102 yetkilendirmeyi bir service layer içinde merkezileştirdi. Post 103 type-safe RBAC ekledi. Post 104 rol-izin matrisini ABAC policy engine ile değiştirdi. Post 105 ABAC'ı çevre koşulları, alan düzeyinde okuma/yazma izinleri ve veritabanı sorgu filtreleme ile genişletti.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MCP vs Doğrudan API Erişimi: MCP Katmanını Ne Zaman Atlamalı]]></title>
            <description><![CDATA[Production takımları geniş MCP erişimini neden scoped API proxy'leriyle değiştirir? Atlassian, Google Workspace ve Notion için FastAPI, CLI ve n8n örnekleri.]]></description>
            <link>https://sph.sh/tr/posts/skip-mcp-layer-scoped-api-access/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/skip-mcp-layer-scoped-api-access/</guid>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Atlassian'ın Rovo MCP Server'ı yapay zeka agentlerini birkaç dakikada Jira ve Confluence'a bağlıyor; karşılığında kimlik doğrulayan kullanıcının görebildiği her şeyi agente açıyor. Onlarca proje ve alanın bulunduğu bir organizasyonda bunun anlamı şu: sunucu tarafında proje kapsamı kısıtlaması yok, araç şemaları iş başlamadan context window'u tüketiyor ve Jira, Confluence ile Compass işlemleri ya hep ya hiç açılıyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Control Tower Çoklu Hesap Stratejisi: Landing Zone'dan Kurumsal Governance'a]]></title>
            <description><![CDATA[AWS Control Tower çoklu hesap stratejisi için pratik rehber: OU yapısı, SCP, RCP, Account Factory for Terraform, IAM Identity Center ve merkezi güvenlik.]]></description>
            <link>https://sph.sh/tr/posts/aws-control-tower-multi-account-strategy/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-control-tower-multi-account-strategy/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[multi-account]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[iam]]></category>
            <category><![CDATA[compliance]]></category>
            <category><![CDATA[terraform]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS Control Tower, iyi governance'a sahip bir çoklu hesap AWS ortamının temelini oluşturur. Kolay kısım kurulum sihirbazı; asıl kararlar sonrasında başlar. Landing zone ayağa kalktığında OU ağacının şekli, koruma mekanizmalarının hangi sırayla açılacağı, hesap sağlama ve hesaplar arası erişim hâlâ açık sorulardır.</p>
<p>Çoğu organizasyonda şu dört varsayılan geçerlidir: OU sınırlarını politika sınırlarıyla hizala, preventive kontrollerden önce detective kontrolleri aç, merkezi loglamayı ilk günden kur ve Account Factory for Terraform'a yalnızca takım zaten Terraform kullanıyorsa yönel. Devamı, bu varsayılanların arkasındaki trade-off'lar ve onlardan sapmayı haklı çıkaran koşullarla ilgili.</p>
<p><strong>Çoklu Hesap Stratejisinin Önemi</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Maaş mı, Etki mi, Tatmin mi? Her Mühendisin Yüzleştiği Meslek Sorusu]]></title>
            <description><![CDATA[Maaş-etki-tatmin tartışmasının neden yanlış bir üçleme olduğu ve cevabınızın mesleki gelişim aşamanız hakkında ne söylediği.]]></description>
            <link>https://sph.sh/tr/posts/salary-impact-satisfaction-vocation/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/salary-impact-satisfaction-vocation/</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[psychological-safety]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Maaş-etki-tatmin tartışması mühendislik kariyer forumlarının değişmez gündem maddesi ve karışıklık tam da bu çerçevelemeden çıkıyor. Maaş, etki ve tatmin, mesleki gelişimin üç ayrı aşamasında öne çıkan ihtiyacı tarif ediyor. Bunları rakip öncelikler gibi ele almak, bir sıralama sorusunu sadakat testine çeviriyor; ardından gelen kararlar da hedefi ıskalıyor.</p>
<p>Örgütsel psikoloji bu aşamaları çoktan haritalamış durumda. Wrzesniewski'nin iş yönelimi araştırması, Öz-Belirleme Teorisi ve Dan Koe'nun Vocation (Meslek) kadranı aynı üç adımlı ilerlemede buluşuyor. Hangi adımda olduğunuzu bilmek, şu an hangi boyutun ilgiyi hak ettiğini ve hangisinin bekleyebileceğini söylüyor.</p>
<p><strong>Birbirini Duymayan Taraflar</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Organizasyon Düzeyinde Yeniden Kullanılabilir GitHub Actions Workflow'ları: Mimari, Güvenlik ve Benimseme]]></title>
            <description><![CDATA[Organizasyon düzeyinde paylaşımlı bir GitHub Actions platformu kurma rehberi: mimari kararlar, güvenlik yönetişimi, benimseme ve en maliyetli 7 hata.]]></description>
            <link>https://sph.sh/tr/posts/github-actions-platform-scale/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/github-actions-platform-scale/</guid>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[platform-engineering]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[compliance]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>GitHub Actions ile başlamak aldatıcı derecede basittir. Bir YAML dosyası kopyalarsınız, birkaç adım eklersiniz ve pipeline çalışır. Bu basitlik, farklı ekiplerin sahiplendiği düzinelerce repository kendi build, test ve deploy biçimini taşımaya başladığında ölçeklenmez. Sonuç orta ve büyük ölçekli mühendislik organizasyonlarında tanıdıktır: ince farklılıklar içeren yüzlerce workflow dosyası, tutarsız güvenlik uygulamaları, büyük farklılıklar gösteren build süreleri ve platform mühendislerinin platform yeteneği geliştirmek yerine "GitHub Actions'da X'i nasıl yaparım?" sorularını yanıtladığı bir destek kuyruğu.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Native Expo ile Sentry Entegrasyonu: Pratik Hızlı Rehber]]></title>
            <description><![CDATA[React Native Expo uygulamasına Sentry ekleme rehberi: SDK kurulumu, Expo Router enstrümantasyonu, session replay ve EAS için source map yükleme.]]></description>
            <link>https://sph.sh/tr/posts/sentry-react-native-expo-setup/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/sentry-react-native-expo-setup/</guid>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Sentry'nin kurulum wizard'ı bir React Native Expo projesini tek komutla hazırlar; çoğu uygulama için wizard ve bir development build yeterlidir. Saat kaybettiren kısımlar sonrasında başlar: Expo Go native crash'leri ve session replay'i sessizce devre dışı bırakır, EAS Update source map'leri kendiliğinden yüklemez ve app.json içinde unutulan bir auth token uygulamayı kuran her cihaza gider.</p>
<p>Aşağıdaki yapılandırma Expo SDK 50 ve üzeri ile @sentry/react-native paketini varsayar. Eski sentry-expo paketi SDK 50 ile birlikte kullanımdan kaldırıldı; yeni projelerde tercih edilmemeli.</p>
<p><strong>Ön Koşullar</strong></p>
<p>Başlamadan önce şunlara ihtiyacın var:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DevRel Nedir? Developer Relations Rolü, Beceriler ve Kariyer Yolu]]></title>
            <description><![CDATA[DevRel rolünün kapsamlı analizi: Marketing ve sales engineering'den farkları, gereken beceriler ve şirketlerin ne zaman developer relations'a yatırım yapması gerektiği.]]></description>
            <link>https://sph.sh/tr/posts/devrel-role-analysis/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/devrel-role-analysis/</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[engineering-culture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Developer Relations (DevRel) sıklıkla "geliştiriciler için marketing" veya "konferanslarda konuşup seyahat ederek para kazanma" olarak yanlış anlaşılıyor. Bu okuma stratejik değeri gözden kaçırıyor. DevRel, geliştiricilerin gerçek deneyimini sistematik olarak toplar ve ürün geliştirmeye geri aktarır. Aynı zamanda geliştirici eğitimini tek bir dokümantasyon ekibinin yetişemeyeceği ölçeğe taşır. Geri kalan her şey bu tanımdan çıkar: kimin bu rolde başarılı olduğu ve şirketin bu işe ne zaman bütçe ayırması gerektiği.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DynamoDB Throttling: Hot Partition Çözümleri, Write Sharding ve Retry Stratejileri]]></title>
            <description><![CDATA[Single Table Design'da DynamoDB throttling'i önleme ve yönetme: partition key tasarımı, write sharding, kapasite modları, DAX caching ve retry pattern'leri.]]></description>
            <link>https://sph.sh/tr/posts/dynamodb-rate-limit-strategies/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/dynamodb-rate-limit-strategies/</guid>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[caching]]></category>
            <category><![CDATA[monitoring]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>DynamoDB'yi ölçekte kullanırken throttling kaçınılmaz bir sorun haline geliyor. ProvisionedThroughputExceededException hatası, tablo seviyesinde yeterli kapasite olmasına rağmen sıkça karşılaşılıyor; çünkü DynamoDB kapasiteyi her partition için ayrı ayrı uyguluyor.</p>
<p>En çok fark yaratan kaldıraç partition key tasarımı. Write sharding, kapasite modları, DAX ve retry mantığı bu seçimin üzerine ek pay kazandırıyor. Single Table Design'da pratik sıra şöyle: önce yüksek kardinaliteli key'ler, yüksek kardinalite kurulamayan erişim pattern'leri için sharding, sonra geriye kalanın etrafına retry ve monitoring.</p>
<p><strong>DynamoDB'nin Throttling Mekanizmasını Anlamak</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MCP Sunucu RBAC, Araç Bileşimi ve Çoklu Ajan İş Akışı Kalıpları]]></title>
            <description><![CDATA[Model Context Protocol için kurumsal kalıplar: araç bileşimi, çoklu ajan orkestrasyonu, rol tabanlı erişim kontrolü ve production gözlemlenebilirlik.]]></description>
            <link>https://sph.sh/tr/posts/mcp-advanced-patterns-workflows-rbac/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mcp-advanced-patterns-workflows-rbac/</guid>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>MCP içeriklerinin çoğu ilk çalışan sunucuda duruyor: birkaç araç kaydet, bir istemci bağla, bitti. Asıl sorunlar sonra başlıyor; aynı sunucuya ikinci bir ekip bağlandığında ve kayıtlı araçlardan biri production'ı değiştirebildiğinde.</p>
<p>Bu boşluğu altı kalıp kapatıyor: araç anotasyonları, iş akışı orkestrasyonu, öznitelik koşullu RBAC, kademeli yetkilendirme, hata kurtarma ve gözlemlenebilirlik. Sadece birini seçecekseniz, denetim loglamayla desteklenmiş RBAC'ı seçin. İzinler ve denetim izleri, ajanlar araçları çağırmaya başladıktan sonra eklenmesi en pahalı katman; orkestrasyon ise karşılaştıracak iki iş akışınız olana kadar bekleyebilir.</p>
<p><strong>Ölçeklenirken Çıkan Sorunlar</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RAG Veri Hazırlama: Yapay Zeka Sisteminin Başarısını Belirleyen Temel]]></title>
            <description><![CDATA[RAG sistemleri için doküman parsing, chunking stratejileri, bağlamsal zenginleştirme ve embedding optimizasyonunu kapsayan kapsamlı kılavuz]]></description>
            <link>https://sph.sh/tr/posts/rag-data-preparation/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/rag-data-preparation/</guid>
            <category><![CDATA[rag]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[embeddings]]></category>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[vector-databases]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Çoğu RAG implementasyon başarısızlığı retrieval mimarisine değil, veri hazırlamaya dayanıyor. Ekipler retrieval parametrelerini haftalarca ayarlarken asıl problem kötü parse edilmiş dokümanlar veya uygunsuz chunking oluyor. Doğrulanmış parsing ve 512 token civarı recursive splitting, başlanacak varsayılan; semantik ve parent-child chunking ek maliyetini ancak ölçümler gösterdiğinde hak ediyor.</p>
<p><strong>RAG Pipeline'ının Kalite Tavanı</strong></p>
<p>RAG implementasyonlarında yaygın bir pattern var: sofistike retrieval mimarileri (hybrid search, reranking, CRAG) hala kötü sonuçlar üretiyor. Kök neden neredeyse her zaman veri hazırlama katmanında.</p>
<p>[code block]</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Forward Deployed Engineer Nedir? FDE, Solutions Architect ve TAM Karşılaştırması]]></title>
            <description><![CDATA[Forward Deployed Engineer rolünün Solutions Architect ve Technical Account Manager pozisyonlarından farkı ve AI implementasyonunun bu rolü neden vazgeçilmez kıldığı.]]></description>
            <link>https://sph.sh/tr/posts/forward-deployed-engineer-role-analysis/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/forward-deployed-engineer-role-analysis/</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[enterprise]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Forward Deployed Engineer (FDE), müşterinin altyapısında production kodu yazar ve o kod çalışana kadar sahada kalır. Sınır tam olarak burada: Solutions Architect, Solutions Engineer ve Technical Account Manager implementasyonu müşteriye devreder, FDE devretmez. FDE deployment'ı production'a kadar üstlendiği için rolün ücret bandı da tükenmişlik riski de komşu unvanlardakinden farklı seyrediyor.</p>
<p>Talep kurumsal AI ile birlikte arttı; çünkü bir AI sistemi işe yarar çıktı üretmeden önce müşteri bağlamına (tarihsel veri, iş akışları, iş kuralları) ihtiyaç duyar ve demo ortamı bu bağlamı sağlayamaz. Modelin bedeli açık: FDE ağırlıklı bir organizasyon derin entegrasyonu brüt marjdan feragat ederek satın alır ve bu takas yalnızca ürün kategorisi henüz yeniyken karşılığını verir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript AI SDK Karşılaştırması: Agent Geliştirme için Vercel AI SDK vs OpenAI Agents SDK]]></title>
            <description><![CDATA[Agent geliştirmek için TypeScript SDK karşılaştırması: Vercel AI SDK, OpenAI Agents SDK ve AWS Bedrock entegrasyonu, kod örnekleri ve karar frameworkleri ile.]]></description>
            <link>https://sph.sh/tr/posts/typescript-ai-sdk-agent-tooling/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/typescript-ai-sdk-agent-tooling/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>TypeScript'te AI agent geliştirmeye başlarken ilk karar sıkıcı olanı: tool çağrılarını, streamingi ve provider kimlik bilgilerini hangi SDK taşıyacak. Üç cevap öne çıkıyor ve her biri farklı bir şeyi optimize ediyor. Vercel AI SDK, providera özgü yüzeyi taşınabilirlik karşılığında bırakıyor; OpenAI Agents SDK multi-agent orkestrasyonunu çalışma zamanına gömüyor; direkt provider SDK'leri ise her ayarı açıkta bırakıyor.</p>
<p>Çoğu TypeScript ve Next.js kod tabanında varsayılan Vercel AI SDK. Asıl soru bu varsayılanın nerede yetersiz kaldığı: yoğun multi-agent orkestrasyonu ve hiçbir soyutlamanın henüz açmadığı bir özelliğe ihtiyaç duyan tek providerlı servisler.</p>
<p><strong>TypeScript AI SDK Ekosistemi</strong></p>
<p>Üçü de soyutlamayı farklı bir seviyeye yerleştiriyor:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RAG mi, Fine-Tuning mi, Hazır AI mi? Kurumsal Karar Rehberi]]></title>
            <description><![CDATA[Kurumsal AI entegrasyonu için pratik 6 seviyeli framework: ChatGPT, RAG, MCP agent veya fine-tuning ne zaman kullanılmalı, PII ve finans uyumluluğu odaklı.]]></description>
            <link>https://sph.sh/tr/posts/ai-integration-levels-enterprise-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-integration-levels-enterprise-guide/</guid>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[rag]]></category>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[compliance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Kurumsal AI benimseme süreci tahmin edilebilir bir patern izler: ekipler basit alternatifleri doğrulamadan sofistike mimarilere yönelir. L1'deki doğrudan sohbetten L6'daki fine-tuning'e uzanan altı seviyeli bir merdiven, bu seçenekleri arkalarındaki iş ihtiyacıyla karşılaştırmayı kolaylaştırır. Varsayılan, çoğu yol haritasının sandığından daha aşağıdadır. L2, yani yüklü bilgi dosyalarıyla bir sistem prompt'u, hak ettiğinden fazla dahili senaryoyu çözer; yukarı ancak ölçülmüş bir kısıtlama seni zorladığında çıkarsın.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI/LLM Sözlüğü: Her Geliştiricinin Bilmesi Gereken 82 Terim]]></title>
            <description><![CDATA[AI/LLM alanında pratik, implementation odaklı bir sözlük. Token'lardan agent'lara, RAG'dan fine-tuning'e, kod örnekleri ve dürüst değerlendirmelerle.]]></description>
            <link>https://sph.sh/tr/posts/ai-llm-glossary-developer-terms/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-llm-glossary-developer-terms/</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[rag]]></category>
            <category><![CDATA[embeddings]]></category>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AI terminolojisi çoğu dokümantasyonun takip edemeyeceği kadar hızlı gelişiyor. Her hafta yeni terimler ortaya çıkıyor - RAG, RLHF, LoRA, MCP, GGUF - ve genellikle farklı kaynaklar arasında tutarsız tanımlarla. Boşluk pratikte açılıyor. Vendor materyalleri kavramları birbirine karıştırıyor; bir terimin ne anlama geldiğini bilmek de onu ne zaman kullanacağını nadiren söylüyor.</p>
<p>Her madde tanımı implementation bağlamıyla birlikte veriyor: kavramın pratikte neye mal olduğu, en sık nerede yanlış anlaşıldığı ve ne zaman başka bir yola sapmak gerektiği. Bir PM'e embedding'i anlatmakla, knowledge base'i embed etmenin doğru karar olup olmadığını bilmek arasındaki farkı da bu bağlam yaratıyor.</p>
<p><strong>LLM Temelleri</strong></p>
<p><strong>LLM (Large Language Model)</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript Formatlama ve Linting Araçları Karşılaştırması: Biome, Oxlint, ESLint ve Prettier]]></title>
            <description><![CDATA[Modern TypeScript linting ve formatlama araçlarının karşılaştırması: ESLint, Prettier, Biome ve Oxlint için performans ölçümleri, konfigürasyon ve migration.]]></description>
            <link>https://sph.sh/tr/posts/compare-typescript-formatting-linting-tools/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/compare-typescript-formatting-linting-tools/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[code-quality]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>TypeScript araç ekosistemi, Rust tabanlı alternatiflerin sahneye çıkmasıyla değişti. Yeni bir projede makul varsayılan Biome: tek binary linting, formatlama ve import düzenlemeyi birlikte çözüyor ve ESLint + Prettier'a göre 15-25x daha hızlı çalışıyor. Çalışan bir ESLint kurulumu olan mevcut kod tabanlarında ilk adım, ESLint'in yanına Oxlint eklemek; güvendiğiniz konfigürasyona dokunmadan ölçülebilir bir hız kazancı sağlıyor.</p>
<p>Bu varsayılanın bir sınırı var. Rust tabanlı araçlar hız kazanırken ekosistem genişliğinden ve type-aware kural kapsamından ödün veriyor: Biome'un Biotype'ı typescript-eslint kurallarının yaklaşık %75-85'ini kapsıyor, Oxlint'in tsgolint'i ise 43 kural sunuyor. Bu boşlukların önem taşıdığı yerlerde doğru cevap hâlâ ESLint + Prettier.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Beklenti Uçurumu: İşe Alım Vaatleri İşyeri Gerçekliğiyle Karşılaştığında]]></title>
            <description><![CDATA[Bait-and-switch işe alım, güç dengesizlikleri ve eksik istihdam analizi; çalışanların kendini koruması ve işverenlerin güven inşası için uygulanabilir framework'ler.]]></description>
            <link>https://sph.sh/tr/posts/hiring-expectations-workplace-power-dynamics/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/hiring-expectations-workplace-power-dynamics/</guid>
            <category><![CDATA[hiring]]></category>
            <category><![CDATA[career]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[organizational-culture]]></category>
            <category><![CDATA[leadership]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>İşverenlerin işe alım sürecinde vaat ettikleri ile çalışanların işe başladıktan sonra yaşadıkları çoğu zaman keskin biçimde ayrışıyor; anket verileri bu farkın yaygın olduğunu gösteriyor. Maliyet iki tarafa da yansıyor: çalışan tarafında erken istifa, bağlılık kaybı ve beceri körelmesi; şirket tarafında yeniden işe alım gideri ve zarar gören işveren markası.</p>
<p>Bu farkı kapatan disiplin her iki taraf için de aynı. Vaatleri teklif imzalanmadan önce yazıya dökün, işe başladıktan sonra da uyumu sabit aralıklarla kontrol edin; iki adım da karşı tarafın iyi niyetine bağlı değil.</p>
<p><strong>Sorunun Boyutu</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Satın Alma Sonrası Kültürel Entegrasyon: Birleşmeler Neden Başarısız Olur]]></title>
            <description><![CDATA[Satın alan şirketler kültürel asimilasyonla ödedikleri değeri neden yok eder; M&A başarısızlık kalıpları, araştırmalar ve kanıtlanmış entegrasyon stratejileri.]]></description>
            <link>https://sph.sh/tr/posts/post-acquisition-cultural-erosion/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/post-acquisition-cultural-erosion/</guid>
            <category><![CDATA[business-strategy]]></category>
            <category><![CDATA[organizational-culture]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[hiring]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[industry-trends]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Satın alma sonrası kültürel erozyon, anlaşma kapandıktan sonra satın alınan şirketin ayırt edici yeteneklerinin, insan kaynağının ve karar kalıplarının kademeli olarak kaybolmasıdır. Gerçekleşmeyen M&A değerinin en büyük tek kaynağıdır ve pazar, ürün ya da finansal nedenlerden çok kültürel uyumsuzluğa dayanır. Kültürel erozyon rastgele bir kayma değil; etnosentrik liderlik, iç-grup ve dış-grup dinamikleri ve karar otoritesini satın alan tarafın mevcut normlarına akıtan bilinçsiz önyargı tarafından yürütülen sistematik bir süreçtir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda'da Bun ve Alternatif JavaScript Runtime'ları Çalıştırma]]></title>
            <description><![CDATA[Bun ve Deno'yu AWS Lambda'da custom runtime ile çalıştırma: performans benchmark'ları, maliyet analizi ve production deployment pattern'leri.]]></description>
            <link>https://sph.sh/tr/posts/bun-on-lambda-custom-runtimes/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/bun-on-lambda-custom-runtimes/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS Lambda resmi olarak Node.js'i destekliyor, ancak platformun custom runtime özelliği Bun ve Deno gibi alternatif JavaScript runtime'larına kapı açıyor. Bunu iki mekanizma mümkün kılıyor: Lambda Layer'ları ve container image'ları. İkisi de AWS'nin kendi yönetilen runtime'larına uyguladığı initialization ayarlarından vazgeçiyor ve bedeli cold start'ta ödeniyor.</p>
<p>Çoğu Lambda workload'ı için doğru varsayılan hâlâ yönetilen Node.js runtime'ı. Alternatif bir runtime'ın yerini hak etmesi için ölçülmüş bir kısıt gerekiyor; o noktada da cache'i önceden ısıtılmış Deno container image'ı iki yoldan daha öngörülebilir olanı.</p>
<p><strong>Custom Runtime Sorusu</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Production Sistemleri için Prompt Engineering: Sistematik Bir Mühendislik Yaklaşımı]]></title>
            <description><![CDATA[Kurumsal LLM uygulamaları için production-grade prompt engineering rehberi: sistematik tasarım, güvenlik, observability ve maliyet optimizasyonu.]]></description>
            <link>https://sph.sh/tr/posts/prompt-engineering-production/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/prompt-engineering-production/</guid>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Notebook'ta düzgün çalışan bir prompt, production'da genellikle aynı şekilde davranmıyor. Aynı template yük altında sapıyor, meraklı bir kullanıcıya system instruction'larını sızdırıyor ve token faturasını sessizce katlıyor. Bunların hiçbiri daha iyi cümle kurarak çözülmüyor. Güvenilir varsayılan, prompt'u sürümlenen bir altyapı parçası gibi ele almak: açık yapı, metadata'sıyla saklanan bir sürüm, her çağrıda tracing, girdi ve çıktıda katmanlı kontroller ve bir token bütçesi.</p>
<p>Bu varsayılandan beş karar çıkıyor: user data'yı veri olarak işaretleyip instruction'lardan ayıran bir prompt yapısı, değişikliklerin sürümlenmesi ve kademeli yayını, neyin trace edileceği, injection'a karşı savunma ve maliyetin gerçekte nereye gittiği.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JavaScript'te SOLID Prensipleri: TypeScript ve React ile Pratik Rehber]]></title>
            <description><![CDATA[SOLID prensiplerinin modern JavaScript'te uygulanışı: TypeScript, React hooks ve fonksiyonel pattern'lerle pratik örnekler, ayrıca ne zaman gereksiz.]]></description>
            <link>https://sph.sh/tr/posts/solid-principles-javascript/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/solid-principles-javascript/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[code-quality]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>SOLID prensipleri object-oriented programming için formüle edilmişti, ama modern JavaScript geliştirme farklı görünüyor: functional pattern'ler, React hooks, dynamic typing. Prensipler hâlâ geçerli, tek bir adaptasyonla. Her prensibi class hierarchy'ye değil bir composition sınırına (function, modül, hook, component'in prop listesi) bağlayın; beşi de bu geçişten sağ çıkıyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS ile Edge Computing: CloudFront Functions vs Lambda@Edge]]></title>
            <description><![CDATA[Global uygulamalar için AWS edge computing çözümlerini seçme ve uygulama üzerine pratik örnekler ve maliyet optimizasyonu stratejileri içeren kapsamlı teknik rehber.]]></description>
            <link>https://sph.sh/tr/posts/edge-computing-aws/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/edge-computing-aws/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cloudfront]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[edge-computing]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Edge computing, kod yürütmeyi merkezi data center'lardan kullanıcılara yakın konumlara taşıyor. AWS CloudFront dünya çapında geniş bir edge ağı işletiyor ve bu ağa kod yerleştirmek için iki yol sunuyor: CloudFront Functions ve Lambda@Edge. Varsayılan tercih CloudFront Functions olmalı: header işleri, redirect'ler ve cache key normalizasyonu burada çok daha düşük maliyetle çözülüyor. Lambda@Edge ise ancak request network erişimi, request body veya origin tarafındaki event'ler gerektirdiğinde bu maliyeti hak ediyor.</p>
<p><strong>Edge Kodunun Çalıştığı Noktalar</strong></p>
<p>Her iki servis de request'i origin yerine edge'de karşılayarak latency'yi düşürüyor, ancak request yaşam döngüsünde farklı noktalarda duruyor ve farklı sınırlar taşıyorlar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amazon Cognito Derinlemesine: Temel Authentication'ın Ötesinde]]></title>
            <description><![CDATA[Gelişmiş Amazon Cognito teknik rehberi: özel auth akışları, federation, multi-tenancy, migration stratejileri ve CDK ile production-grade güvenlik.]]></description>
            <link>https://sph.sh/tr/posts/cognito-deep-dive/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cognito-deep-dive/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[saas]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[graphql]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 24 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Amazon Cognito, sign-up ve sign-in tarafını çok az konfigürasyonla karşılıyor. Production sistemleri ise daha fazlasını istiyor: token'ın içinde taşınan tenant context, kurumsal SSO, mevcut bir sağlayıcıdan çıkış yolu ve AWS'nin region'lar arası kopyalamadığı bir dizin için yedekleme planı.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Effect Öğrenmek: TypeScript Geliştiricileri için Pratik Bir Rehber]]></title>
            <description><![CDATA[Effect'i adım adım öğrenmek ve AWS Lambda ile entegre etmek için pratik bir rehber: gerçek kod örnekleri, yaygın hatalar ve üretim desenleri.]]></description>
            <link>https://sph.sh/tr/posts/learning-effect-adoption-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/learning-effect-adoption-guide/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Effect, TypeScript'e fonksiyonel bir effect sistemi getiriyor: typed error'lar, dependency injection ve structured concurrency, hepsini compiler zorunlu tutuyor. Ekosistem zengin ama öğrenme eğrisi dik. Dokümantasyon Discord tartışmalarına, GitHub issue'larına ve farklı tarihlerden blog yazılarına dağılmış durumda; "Hello World"den production'daki bir Lambda'nın arkasına koyacağın koda giden yol bu yüzden belirgin değil.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Secrets Manager & Parameter Store: Güvenlik Best Practices]]></title>
            <description><![CDATA[Secrets Manager ve Parameter Store'u karşılaştıran teknik rehber: hangi servisi ne zaman seçmeli ve production implementation pattern'leri.]]></description>
            <link>https://sph.sh/tr/posts/secrets-manager/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/secrets-manager/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[secrets-management]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[encryption]]></category>
            <category><![CDATA[ecs]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS'de çalışan mühendisler sık sık aynı dilemmayla karşılaşır: secrets management için Secrets Manager mi yoksa Parameter Store mu kullanmalı? Her iki servis de sensitive data saklıyor ama farklı amaçlara hizmet ediyorlar ve farklı maliyet yapıları var. Kısa kural: statik config → Parameter Store; RDS şifreleri ve rotate etmesi gereken her şey → Secrets Manager. Bundan sonrası maliyete, cross-account erişime ve workload'ların secret'ı runtime'da nasıl okuduğuna bağlı.</p>
<p><strong>İki Servisin Farkları</strong></p>
<p>İki servisi üç eksen ayırıyor: maliyet, rotation desteği ve native entegrasyonlar. Dördüncüsü cross-account paylaşım. Orada Secrets Manager resource policy'leri daha esnek, Parameter Store için ise RAM (Resource Access Manager) kullanman gerekiyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[API Versioning Stratejileri: İlk Release'den Sunset'a Kadar]]></title>
            <description><![CDATA[Pratik bir API versioning rehberi: URL ve header yaklaşımları, breaking change'ler, Sunset header'larıyla deprecation, AWS API Gateway, GraphQL ve contract testing.]]></description>
            <link>https://sph.sh/tr/posts/api-versioning/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/api-versioning/</guid>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[migration]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>API versioning bir URL kuralı değil, bir sözleşme yönetimi problemidir. Bir sürüm, belirli bir istemci kümesine belirli bir kırıcı değişiklik kümesi hakkında verilen sözdür. Bu sözün arkasındaki strateji (URL yolu, header, content negotiation ya da sürümlenmiş kaynak grafı) her istemci migrasyonunun maliyetini, kullanımdan kaldırılan yüzeyin ne kadar süre deploy'da kalacağını ve geçiş boyunca altyapının ne kadar ikiye katlanacağını belirler. Çoğu versioning yeniden yazımı, ekibin sözleşmeyi örtük olarak ilettiğini fark ettiği anda başlar; asıl iş, o sözleşmeyi açık hale getirmektir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LaunchDarkly vs Unleash vs AWS AppConfig: Feature Flag Karşılaştırması]]></title>
            <description><![CDATA[Distributed sistemlerde feature flag için production rehberi: LaunchDarkly, Unleash ve AWS AppConfig karşılaştırması, rollout ve A/B testing örnekleri.]]></description>
            <link>https://sph.sh/tr/posts/feature-flags-scale/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/feature-flags-scale/</guid>
            <category><![CDATA[feature-flags]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[deployment]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Feature flag'ler, kodu production'a deploy ederken feature görünürlüğünü runtime'da kontrol etmeni sağlar. Bu kontrol olmadan, distributed bir sistemde feature deploy etmek iki kötü seçeneğe sıkıştırır: kesinti riski taşıyan big-bang release'ler ya da merge conflict biriktiren uzun ömürlü branch'ler. Her deployment, iş takvimine bağlanmış bir ya hep ya hiç olayına dönüşür.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Playwright vs Cypress: Modern Web Uygulamaları için E2E Test Stratejileri]]></title>
            <description><![CDATA[Playwright ve Cypress ile güvenilir, sürdürülebilir E2E suite'leri: framework seçimi, flaky test önleme, CI/CD entegrasyonu ve optimizasyon.]]></description>
            <link>https://sph.sh/tr/posts/e2e-testing-strategies/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/e2e-testing-strategies/</guid>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>E2E suite'ler her framework'te aynı birkaç sebeple çöküyor: testler arasında paylaşılan state, markup'a bağlanmış selector'ler ve gerçek bir koşulun yerine konan sabit bekleme süreleri. Framework debug deneyimini belirliyor. Mimari ise suite'in altı ay ve bir arayüz yenilemesi sonrasında hâlâ çalışıp çalışmayacağını belirliyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Caching Stratejileri: Yerel Bellekten Distributed Sistemlere]]></title>
            <description><![CDATA[Çok katmanlı caching için pratik rehber: in-memory, Redis ve CDN katmanları, cache-aside ve write-through, ElastiCache ve MemoryDB, stampede önleme.]]></description>
            <link>https://sph.sh/tr/posts/caching-strategies/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/caching-strategies/</guid>
            <category><![CDATA[caching]]></category>
            <category><![CDATA[redis]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cloudfront]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Etkili caching çok katmanlı bir problemdir. En hızlı katman süreç içi bir LRU, sonraki uzaktaki bir cache (Redis ya da Memcached), onun üstünde edge'de bir CDN. Her katmanın kendi geçersiz kılma semantiği, tutarlılık garantisi ve hata biçimi vardır. %15 hit rate'e sahip bir Redis cluster'ı genelde yanlış araç seçiminden çok, yanlış katmanda yapılan yanlış işi gösterir. Popüler bir anahtar expire olduğunda oluşan thundering herd ise bir sürü-koruma (stampede) problemidir ve tek katmanlı her cache bunu yaşar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Maliyet Optimizasyonu Araç Seti - Production Workload'lar için Pratik Stratejiler]]></title>
            <description><![CDATA[AWS maliyet çalışmasının sırası: önce Cost Explorer ve Budgets ile görünürlük, sonra Compute Optimizer ile right-sizing, ardından commitment kararı.]]></description>
            <link>https://sph.sh/tr/posts/aws-cost-optimization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cost-optimization/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS maliyet çalışmasının bir varsayılan sırası var: önce görünürlük, sonra right-sizing, en son commitment. Cost Explorer ve Budgets paranın nereye gittiğini gösterir, Compute Optimizer kimsenin kullanmadığı kapasiteyi işaretler, Savings Plans veya Reserved Instances de bu iki adımdan geriye kalanı indirime bağlar. Sırayı ters çeviren ekipler, aslında silmeleri gereken kapasiteyi indirimli fiyattan satın almış olur.</p>
<p>Ekipleri bu işe iten belirtiler production hesaplarında birbirine benziyor: trafikte karşılığı olmadan oynayan aylık faturalar, yalnızca mesai saatlerinde gerekirken 7/24 açık duran development kaynakları ve CPU'su boşta dururken tam kapasite faturalanan instance'lar.</p>
<p><strong>Tekrar Eden Beş Maliyet Sürücüsü</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mozilla SOPS: GitOps için Git'te Secret Şifreleme]]></title>
            <description><![CDATA[Git'te secret'ları şifrelemek için pratik Mozilla SOPS rehberi: age encryption, AWS CDK ve Lambda pattern'leri, production-ready serverless güvenlik.]]></description>
            <link>https://sph.sh/tr/posts/mozilla-sops-gitops-secrets/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mozilla-sops-gitops-secrets/</guid>
            <category><![CDATA[secrets-management]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[terraform]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[encryption]]></category>
            <category><![CDATA[career]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[aws-sam]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mozilla SOPS (Secrets OPerationS), her GitOps kurulumunun karşılaştığı tek bir soruya cevap veriyor: secret'ları yayınlamadan version control'de nasıl tutarsın? SOPS, YAML ve JSON dosyalarındaki value'ları şifreliyor, key'leri okunur bırakıyor; böylece dosya yapısı code review'da ayakta kalırken password'ler ve API key'leri ciphertext olarak duruyor. Secret'lar da onları okuyan kodla aynı pull request'ten geçiyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Transactional Outbox Pattern: Dağıtık Sistemlerde Güvenilir Event Publishing]]></title>
            <description><![CDATA[Transactional Outbox Pattern'in dağıtık sistemlerdeki dual-write problemini nasıl çözdüğünü, PostgreSQL, DynamoDB ve CDC araçlarıyla pratik implementasyonlarını öğren.]]></description>
            <link>https://sph.sh/tr/posts/outbox-pattern/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/outbox-pattern/</guid>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[reliability]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Her event-driven servis er ya da geç aynı anda iki şey yapmak zorunda kalıyor: kendi state'ini değiştirmek ve bunu sistemin geri kalanına duyurmak. Distributed transaction olmadan database write'ı ile broker publish'i atomik hale getirilemiyor; biri başarısız olurken diğeri başarılı olabiliyor. Geriye ya stoğu rezerve edilmemiş bir sipariş kalıyor ya da var olmayan bir sipariş için rezerve edilmiş stok.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tech Şirketlerinde Kariyer Seviyeleri - Entry'den Distinguished Engineer'a]]></title>
            <description><![CDATA[Büyük tech şirketlerinde kariyer ilerlemesini anlamak, seviye eşleştirmelerini çözmek ve mühendislik kariyerinde stratejik kararlar almak için pratik bir rehber.]]></description>
            <link>https://sph.sh/tr/posts/career-levels-tech-companies/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/career-levels-tech-companies/</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[industry-trends]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Kariyer seviyesi sistemleri şirketten şirkete o kadar farklı ki unvanlar karşılaştırılabilir olmaktan çıkıyor. Amazon'da Senior L6, Google'da Senior L5; 40 kişilik bir startup'taki Staff unvanı da Meta'daki Staff'ın taşıdığı scope'u nadiren taşıyor. Güvenilir karşılaştırma birimi scope, özerklik ve impact; numara ve etiket yalnızca her şirketin sonucu kaydetme biçimi. Eşdeğer seviyeni yanlış okumanın bir bedeli var: yeni bir rolde daha düşük bir banda razı olursun ya da bir yılı yanlış işin terfi dosyasını hazırlamakla geçirirsin.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RAG Mimari Desenleri: Temel Vector Search'ün Ötesinde]]></title>
            <description><![CDATA[Hybrid search, reranking, GraphRAG ve self-corrective pattern'ler dahil gelişmiş RAG tekniklerine dair kapsamlı rehber. Production AWS implementasyonu örnekleriyle.]]></description>
            <link>https://sph.sh/tr/posts/rag-architecture-patterns/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/rag-architecture-patterns/</guid>
            <category><![CDATA[rag]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[vector-databases]]></category>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[embeddings]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Retrieval-Augmented Generation (RAG) sistemleri genellikle düz vector similarity search ile başlar. Bu taban çizgisi üç noktada tıkanır: exact keyword eşleşmeleri, cevabı birkaç dökümana yayılan sorular ve relevance açısından kimsenin bakmadığı context.</p>
<p>İlk kurulacak varsayılan, hybrid search ile parent-child chunking birleşimi. Reranking, self-corrective retrieval (CRAG) ve knowledge graph'ler (GraphRAG) bunun üzerine binen birer üst basamak; ölçüm varsayılanın yetmediğini gösterdiğinde devreye girerler. Aşağıdaki pattern'lerin AWS Bedrock Knowledge Bases ve OpenSearch karşılıkları da var; hangi basamağın kendini amorti ettiğine RAGAS metrikleri karar veriyor.</p>
<p><strong>Temel RAG'in Problemleri</strong></p>
<p>Vector similarity tek başına production'da üç somut açık bırakır...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS AppSync & GraphQL: Production-Ready Real-time API'ler Geliştirmek]]></title>
            <description><![CDATA[AWS AppSync ile ölçeklenebilir real-time API'ler: JavaScript resolver'lar, subscription filtering, caching stratejileri ve infrastructure as code pattern'leri.]]></description>
            <link>https://sph.sh/tr/posts/appsync-graphql/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/appsync-graphql/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[real-time]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS AppSync; WebSocket subscription'ları, conflict resolution ve AWS data source'larına doğrudan bağlantı sunan yönetilen bir GraphQL endpoint veriyor. Çoğu ekip için geçerli kalan varsayılan dar olanı: resolver'ları JavaScript (APPSYNC_JS) runtime'ıyla doğrudan DynamoDB'ye bağla, Lambda'ya ancak bir field async I/O ya da runtime'ın ifade edemediği bir mantık istediğinde uzan.</p>
<p>Bu tek karar, latency ve maliyeti herhangi bir şema kararından daha fazla oynatıyor. Subscription filtering, caching katmanları, single-table ile multi-table modelleme ve bunların etrafındaki CDK bağlantıları hep bu kararın üzerine yapılan ince ayar.</p>
<p><strong>Real-time API'lerin Zor Tarafları</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Agent Güvenliği: Production Sistemler için Guardrail'ler ve Defense Pattern'leri]]></title>
            <description><![CDATA[Production'da AI agent'ları güvenli kılmak: AWS Bedrock Guardrails, defense-in-depth ve prompt injection, tool misuse ile multi-agent saldırılarına karşı pattern'ler.]]></description>
            <link>https://sph.sh/tr/posts/ai-agent-security/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-agent-security/</guid>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Otonom olarak tool çağıran ve harici API'lara erişen AI agent'ları, geleneksel uygulama güvenlik modellerinin karşılamak üzere tasarlanmadığı saldırı yüzeyleri ortaya çıkarır. Tek bir prompt injection veya yanlış yapılandırılmış bir tool izni; veri sızıntısına, yetkisiz eylemlere ya da kontrolden çıkan maliyetlere dönüşebilir.</p>
<p>Production'da tutan varsayılan, modelin dışına kurulan katmanlı zorlamadır: her invocation'da yönetilen bir guardrail, her tool çağrısında açık bir yetki kontrolü, her output'ta validation ve hepsinin arkasında sıkı bir token bütçesi. Prompt seviyesindeki talimatlar bu katmanların en zayıfı; bu yüzden önem taşıyan hiçbir şey yalnızca onlara bağlı kalmamalı.</p>
<p><strong>Agent'ın Saldırı Yüzeyi</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Platform Engineering: Geliştiricilerin Gerçekten Kullanmak İsteyeceği Internal Developer Platformları Oluşturmak]]></title>
            <description><![CDATA[Golden paths, self-servis altyapı ve product thinking ile Internal Developer Platform oluşturmanın pratik rehberi: Backstage, Port, AWS servisleri ve yaygın hatalar.]]></description>
            <link>https://sph.sh/tr/posts/platform-engineering-idp/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/platform-engineering-idp/</guid>
            <category><![CDATA[platform-engineering]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir Internal Developer Platform, mühendis ticket açmadan servisini production'a çıkarabildiği gün değerini kanıtlar. Oraya götüren varsayılan, çoğu platform yol haritasının varsaydığından dar: tek bir golden path, tek bir pilot ekiple kurulur, portal arayüzünden önce API veya CLI ile açılır ve zorunlu olduğu için değil en hızlı yol olduğu için benimsenir.</p>
<p>Catalog, self-servis aksiyonlar, IaC orchestration, metrikler ve araç seçimi bu varsayılanın etrafına asılır. Backstage, Port ve AWS bileşenleri, ilk golden path gönüllü benimseme kazandıktan sonra verilecek kararlardır.</p>
<p><strong>Ticket Kuyruğundan Self-Servise</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pact ile Contract Testing - Microservislerde API Uyumluluğunu Sağlama]]></title>
            <description><![CDATA[TypeScript microservislerde Pact ile consumer-driven contract testing: breaking API değişikliklerini deployment öncesi yakalayın, integration test yükünü azaltın.]]></description>
            <link>https://sph.sh/tr/posts/contract-testing-pact/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/contract-testing-pact/</guid>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[production]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Consumer-driven contract testing, geçen bir unit test ile çalışan bir entegrasyon arasındaki boşluğu kapatıyor. Her consumer, provider API'den neye ihtiyaç duyduğunu bildiriyor; provider bunu karşılayabildiğini doğruluyor; deployment gate ise bağımlı bir servisi bozacak release'i durduruyor. Ayrı team'lerin sahiplendiği TypeScript microservisler için varsayılan tercih, can-i-deploy gate'i olan bir Pact Broker'ın arkasındaki Pact. End-to-end suite'i yeniden büyütmeden önce bakılacak yer burası.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Custom MCP Server Geliştirme: Production-Ready Kılavuz]]></title>
            <description><![CDATA[TypeScript ile internal sistemleriniz için custom MCP server geliştirin: authentication, monitoring ve Kubernetes deployment örnekleriyle uçtan uca rehber.]]></description>
            <link>https://sph.sh/tr/posts/custom-mcp-servers/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/custom-mcp-servers/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Model Context Protocol (MCP), büyük AI sağlayıcıların ortak entegrasyon yüzeyi haline geldi. GitHub ya da Slack gibi açık servisler için hazır server'lar iş görüyor. Internal API'ler, proprietary database'ler ve legacy sistemler içinse böyle bir server yok; generic bir server da senin validation kurallarını, güvenlik gereksinimlerini ya da compliance ihtiyaçlarını encode edemiyor. Bu sistemlerde varsayılan, kendi server'ını yazmak. İş de göründüğünden küçük: bir TypeScript projesi, iyi tanımlanmış birkaç tool ve zaten her internal servise uyguladığın production disiplini.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SNS/SQS Cross-Account Fan-Out: AWS'de Multi-Account Event Dağıtımı]]></title>
            <description><![CDATA[Amazon SNS ve SQS ile güvenli cross-account event dağıtımı: IAM policy'leri, KMS şifreleme, AWS CDK kurulumu ve production'da karşılaşılan yaygın sorunlar.]]></description>
            <link>https://sph.sh/tr/posts/sns-sqs-cross-account-fanout/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/sns-sqs-cross-account-fanout/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[sns]]></category>
            <category><![CDATA[sqs]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Cross-account SNS/SQS fan-out, publisher hesabındaki tek bir SNS topic'in başka hesaplara ait SQS queue'lara event dağıtmasını sağlıyor; iki taraf da diğerine credential vermek zorunda kalmıyor. İşin büyük kısmı izin tarafında: bir topic policy, bir queue policy ve şifreleme devreye girdiğinde ikisiyle de uyumlu bir KMS key policy.</p>
<p>Tasarımı üç varsayılan taşıyor. Subscription'ı queue owner oluştursun, şifreli her queue customer-managed bir KMS key kullansın ve filtreleme SNS subscription seviyesinde yapılsın ki consumer'lar zaten atacakları mesajların ücretini ödemesin. CDK bağlantıları, FIFO sıralaması ve hesaplar arası dashboard'lar bu üç kararın üstüne biniyor.</p>
<p><strong>Pattern Ne Kazandırıyor</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Workload'ları için FinOps: Production'da LLM Maliyet Yönetimi]]></title>
            <description><![CDATA[Prompt caching, model routing, token budget'ları ve semantic caching: production LLM harcamasını kaliteden ödün vermeden öngörülebilir tutmanın yolları.]]></description>
            <link>https://sph.sh/tr/posts/finops-ai-workloads/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/finops-ai-workloads/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Production'da large language model çalıştırmak, çoğu cloud ekibinin güvendiği maliyet modelini bozuyor. Compute-hour faturalandırma öngörülebilir, token faturalandırma değil. Aynı özellik, prompt'un taşıdığı context'e, soruyu hangi modelin yanıtladığına ve agent'ın durmadan önce kaç tool çağırdığına bağlı olarak çağrı başına kuruşun altında da kalabiliyor, birkaç dolara da çıkabiliyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Agent Mimari Desenleri: ReAct, Plan-and-Execute, Multi-Agent]]></title>
            <description><![CDATA[Kural tabanlı chatbot'lardan otonom AI agent'larına mimari evrim: ReAct, Plan-and-Execute ve çoklu-agent desenleri TypeScript örnekleriyle anlatılıyor.]]></description>
            <link>https://sph.sh/tr/posts/chatbots-to-autonomous-agents/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/chatbots-to-autonomous-agents/</guid>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[design-patterns]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir chatbot intent'i sınıflandırır ve scriptli bir flow'u tekrar oynatır. Bir agent ise reasoning loop çalıştırır, tool'ları runtime'da seçer ve task'lar arasında memory taşır. Aradaki fark sonradan takılabilen bir yetenek yükseltmesi değil; state, control flow ve hata yönetiminin tasarımını baştan değiştirir.</p>
<p>Başlangıç için makul varsayılan, hybrid memory'li tek bir ReAct agent. Multi-agent bir sistemin koordinasyon yükü olmadan dinamik tool kullanımını karşılar ve geriye debug edilecek tek bir control loop bırakır. Plan-and-Execute, görev temiz şekilde parçalanabiliyorsa ve task başına maliyet bağlayıcı kısıtsa yerini hak eder. Uzmanlaşmış birden fazla agent ise ancak domain'ler gerçekten ayrıysa ve yanlış cevabın bedeli koordinasyon katmanını ödeyecek kadar yüksekse anlamlı ol...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Saga Pattern ile Dağıtık Transaction'lar: ACID Olmadan Consistency Sağlamak]]></title>
            <description><![CDATA[Microservices mimarisinde AWS Step Functions ve EventBridge kullanarak Saga pattern implementasyonu: idempotency, compensation logic ve production-ready pattern'ler.]]></description>
            <link>https://sph.sh/tr/posts/saga-pattern-distributed-transactions/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/saga-pattern-distributed-transactions/</guid>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[step-functions]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[eventbridge]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Microservices tek bir iş işlemini birden fazla database'e böler ve ACID garantileri servis sınırında biter. Saga pattern bu boşluğu local transaction'lar ve compensating transaction'larla dolduruyor: commit edilmiş her adım, sonraki bir adım başarısız olduğunda geri alınabiliyor ve sistem eventual consistency'ye oturuyor.</p>
<p>Sipariş benzeri akışlar için güvenli varsayılan AWS Step Functions ile orchestration: saga state'i ve hata yolları tek yerde görünür kalıyor. EventBridge choreography daha ucuz ve daha gevşek bağlı; üç-dört otonom servis zaten domain event paylaşıyorsa yerini hak ediyor. Hangi koordinasyon stilini seçersen seç, pattern'i retry'lar altında ayakta tutan şey idempotent step'ler, ters sırada compensation ve semantic locking.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Uygulamaları Test Etmek: Pratik Bir Strateji Rehberi]]></title>
            <description><![CDATA[AWS Lambda, API Gateway, DynamoDB ve Step Functions için hızlı geri bildirim ve production güvenilirliği sağlayan kapsamlı bir test stratejisi oluşturmayı öğrenin.]]></description>
            <link>https://sph.sh/tr/posts/testing-serverless-applications/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/testing-serverless-applications/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[aws-sam]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[step-functions]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[production]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 06 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Serverless uygulamaları deploy döngüsünü dakikalara sıkıştırır; bu, test ekonomisini değiştirir: eskiden uzun sürüm süreciyle yakalanan bir hata artık bir insan incelemesinden önce production'a ulaşır. Test stratejisi, deploy hızının artık yakalayamadığı şeyi yakalamak zorundadır. Serverless mimarisi yerel öncelikli testi de kırar; Lambda cold start'ları, IAM izinleri, event şemaları ve yönetilen servisler arasındaki sınırlar yerelde canlı bir hesaptakinden farklı davranır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Mesajlaşma Servisleri: SQS vs SNS vs EventBridge - Karar Verme Çerçevesi]]></title>
            <description><![CDATA[SQS, SNS ve EventBridge arasında özelliklere göre değil iletişim modeline göre seçim yap; çalışan CDK örnekleri ve net bir maliyet analizi ile.]]></description>
            <link>https://sph.sh/tr/posts/aws-messaging-comparison/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-messaging-comparison/</guid>
            <category><![CDATA[sqs]]></category>
            <category><![CDATA[sns]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[serverless]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>SQS, SNS ve EventBridge arasında seçim yapmak bir özellik karşılaştırması değil, iletişim modeli kararıdır. SQS bir noktadan noktaya iş kuyruğu, SNS pub/sub fan-out ve EventBridge şema farkında, replay destekli bir olay yönlendiricisidir. Özellik listesine bakarak seçim yapan ekipler uyumsuzluğu genellikle geç fark eder: yanlış servis modeli, doğru servisin doğal olarak sağladığı davranışı yeniden inşa eden özel bir katman yazmayı zorunlu kılar. AWS mesajlaşma yeniden yazımlarının çoğu buradan çıkar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Step Functions Derinlemesine: Dayanıklı Workflow Orchestration Geliştirme]]></title>
            <description><![CDATA[Step Functions ile production serverless workflow kur: Standard ve Express, Distributed Map, error handling ve CDK örnekleriyle maliyet optimizasyonu.]]></description>
            <link>https://sph.sh/tr/posts/step-functions-deep-dive/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/step-functions-deep-dive/</guid>
            <category><![CDATA[step-functions]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS Step Functions orchestration mantığını Lambda kodundan çıkarıp bir state machine'e taşıyor ama sonrasındaki her şeyi iki karar belirliyor: Standard mı Express workflow ve error handling'in ne kadarının state machine'e taşınacağı. Dakikalar içinde biten yüksek hacimli işler için doğru varsayılan Express. Standard'ın daha yüksek transition fiyatı ise workflow günlerce sürüyorsa, exactly-once semantiği gerekiyorsa veya audit trail bırakması gerekiyorsa kendini ödüyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LangChain Production'da: Çalışan Patternler ve İşe Yaramayan Anti-Patternler]]></title>
            <description><![CDATA[LangChain'i production'da çalıştırırken öğrenilen dersler: hataya yol açan anti-patternler, işe yarayan patternler, kod örnekleri ve maliyet optimizasyonu.]]></description>
            <link>https://sph.sh/tr/posts/langchain-production-patterns/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/langchain-production-patterns/</guid>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[monitoring]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Prototip ile Production Arasındaki Boşluk</strong></p>
<p>LangChain uygulamalarını prototipten production'a taşıdığında dokümantasyon örnekleri ile gerçek dünya gereksinimleri arasındaki fark ortaya çıkıyor. Development'ta mükemmel çalışan şeyler, production yükü altında pahalı, yavaş veya güvenilmez hale gelebiliyor.</p>
<p>Prototip iş yükleri yalnızca ölçekte görünen hata biçimlerini gizler: belirsiz girdiler üzerinde döngüye giren agent'lar, her konuşma turuyla artan token harcaması ve sana kullanıcı şikayeti olarak ulaşan sessiz hatalar. Framework'ün soyutlamaları prototyping'i hızlandırır ama production yükü altında ihtiyaç duyduğun maliyet, gecikme ve güvenilirlik kollarını gizler.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript ile MCP Sunucusu Geliştirme: Production Rehberi]]></title>
            <description><![CDATA[MCP'nin AI tool entegrasyonunu nasıl standartlaştırdığını, TypeScript örnekleriyle server geliştirme, güvenlik yönetimi ve production performans optimizasyonunu öğren.]]></description>
            <link>https://sph.sh/tr/posts/mcp-standard-ai-integration/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mcp-standard-ai-integration/</guid>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[llm]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Entegrasyon Problemi</strong></p>
<p>AI entegrasyonları tekrarlayan bir pattern ortaya koyuyor: her yeni AI modeli, her veri kaynağı ve tool için custom bağlantılara ihtiyaç duyuyor. Matematik acımasız; M model çarpı N tool, M×N custom implementation demek. Ekipler Slack, GitHub ve database'ler için haftalarca bespoke entegrasyon geliştiriyor ve AI provider değiştiğinde tüm süreci baştan tekrarlıyor.</p>
<p>Geleneksel API'ler bunun için tasarlanmamış. REST endpoint'leri tahmin edilebilir request pattern'leri bekliyor, ama AI agent'ları conversation başına yüzlerce request üretiyor, latency gereksinimleri çok farklı. GraphQL flexible query'lerde yardımcı olsa da, dynamic tool discovery veya multiple invocation'lar arası session management için built-in desteği yok.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Bedrock AgentCore ile Production-Ready AI Agentları Geliştirmek]]></title>
            <description><![CDATA[AWS Bedrock AgentCore'un agentic AI'ı ölçekte deploy etme altyapı zorluklarını runtime, memory, gateway ve multi-agent koordinasyonuyla nasıl çözdüğünü öğren.]]></description>
            <link>https://sph.sh/tr/posts/bedrock-agentcore-production/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/bedrock-agentcore-production/</guid>
            <category><![CDATA[aws-bedrock]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[production]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>LangChain veya CrewAI agentlarını production'a taşımak; session isolation, credential management, memory persistence ve observability gerektirir: sıfırdan doğru şekilde inşa etmek aylar alan bir altyapı. Bu olmadan agentlar kullanıcılar arasında güvenlik sınırlarından yoksun kalır ve oturumlar arası kalıcı durum tutamaz; bu da onları gerçek iş yükleri için yetersiz kılar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Aurora vs RDS: Amazon Aurora Ne Zaman Tercih Edilmeli (Mimari ve Maliyet)]]></title>
            <description><![CDATA[Aurora mimarisi, I/O maliyet analizi ve RDS yerine ne zaman seçilmesi gerektiğine dair rehber; migration stratejileri ve gerçek karar çerçeveleriyle.]]></description>
            <link>https://sph.sh/tr/posts/amazon-aurora-introduction/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/amazon-aurora-introduction/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Amazon Aurora ile standart RDS arasında seçim yapmak basit değil. Aurora, 5x MySQL ve 3x PostgreSQL performansı, 128TB'ye kadar otomatik storage scaling ve %99.99 availability vaat ediyor. Ama I/O pricing modeline aşina olmayan ekipleri şaşırtabilecek ek karmaşıklık ve maliyetle geliyor.</p>
<p>Karar; workload özelliklerine, operasyonel gereksinimlere ve maliyet kısıtlarına bakıyor. High availability ya da beşten fazla read replica gerektiren production MySQL veya PostgreSQL workload'ları için makul varsayılan Aurora Standard. I/O, faturanın kabaca dörtte birini aştığında I/O-Optimized'a geç; engine bunların dışındaysa ya da workload küçük, öngörülebilir ve bütçesi darsa RDS'te kal.</p>
<p><strong>Amazon Aurora Nedir?</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CloudFormation'un 500 Kaynak Sınırını Aşmak: Büyük Ölçekli Altyapı için Pratik Stratejiler]]></title>
            <description><![CDATA[CloudFormation'un 500 kaynak sınırını nested stack, cross-stack referans, SSM Parameter Store ve microstack mimarisiyle aşmayı TypeScript CDK örnekleriyle öğren.]]></description>
            <link>https://sph.sh/tr/posts/cloudformation-500-resource-limit-strategies/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cloudformation-500-resource-limit-strategies/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>CloudFormation her stack'i 500 kaynakla sınırlıyor ve bu sınır service quota talebiyle yükseltilemiyor. Serverless uygulamalar bu tavana çoğu takımın beklediğinden hızlı çarpıyor: tek bir Lambda function, role'ü, policy'si, log group'u, version'ı ve alarmlarıyla birlikte sekiz ila on iki kaynağa mal oluyor. Altmış function, daha tek bir tablo ya da kuyruk tanımlanmadan bütçenin tamamını tüketiyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DynamoDB Single-Table Design: Kapsamlı Modelleme Rehberi]]></title>
            <description><![CDATA[DynamoDB single-table design'da ilişki modelleme, GSI ve LSI seçimi, DAX optimizasyonu ve production'da yaygın hatalardan kaçınmayı pratik örneklerle öğren.]]></description>
            <link>https://sph.sh/tr/posts/dynamodb-single-table-design-comprehensive-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/dynamodb-single-table-design-comprehensive-guide/</guid>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>DynamoDB kullanırken relational tablo mantığıyla düşünmek sorun çözmekten çok sorun yaratır. Tipik yaklaşımda Users, Orders ve Products için ayrı tablolar oluşturulur; sonuç birden fazla round-trip, karmaşık uygulama mantığı ve öngörülemeyen maliyettir.</p>
<p>Single-table design, birden fazla entity type'ı generic partition ve sort key'ler kullanarak tek tabloda saklar. Bir customer'ı bir tablodan, order'larını başka bir tablodan çekmek yerine her şeyi tek request'te alırsın. Birlikte okunan entity'ler için varsayılan seçenek bu olsun; birlikte okunmayanlar için ayrı tablolarda kal. Pattern kendini az tablo sayısıyla değil, data locality ile amorti eder.</p>
<p><strong>Temel İlkeler</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS CDK Proje Yapısı: Service-Based ve Domain-Based Organizasyon]]></title>
            <description><![CDATA[AWS CDK projelerinde service-based, domain-based, feature-based ve layer-based organizasyon patternlerini karar çerçeveleri ve örneklerle ne zaman seçeceğini öğren.]]></description>
            <link>https://sph.sh/tr/posts/aws-cdk-code-organization-service-vs-domain-based/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cdk-code-organization-service-vs-domain-based/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[domain-driven-design]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir AWS CDK uygulaması aslında bir program; klasör ve stack düzenini framework sana dayatmaz, bu bir tasarım kararıdır. Karar verilmeyince bedeli sonra çıkar: tight coupling, stack'ler arasında circular dependency ve başka bir ekibe sormadan çalıştırılamayan deployment'lar. Ölçek büyüdükçe ayakta kalan düzen, ince bir foundation katmanıyla birlikte domain-based organizasyondur: bir business domain'in sahip olduğu her şey tek klasörde ve tek stack'te durur, VPC, security ve monitoring ise altlarında ortak bir stack'te kalır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tekrar Kullanılabilir AWS CDK Construct'ları: Factory Function, Builder ve Aspect'ler]]></title>
            <description><![CDATA[Factory function'lar, higher-order function'lar ve composition ile AWS CDK'yı type-safe, tekrar kullanılabilir bir infrastructure toolkit'e dönüştürmek.]]></description>
            <link>https://sph.sh/tr/posts/aws-cdk-functional-patterns-reusable-configurations/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cdk-functional-patterns-reusable-configurations/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS CDK, infrastructure'ı gerçek kod olarak ele almanı sağlar. Ortak pattern'ler olmadan ise takımlar duplicate konfigürasyonlarla, tutarsız ayarlarla ve type checker'ın yakalayabileceği deployment hatalarıyla baş başa kalır. Sorunun büyük kısmını iki hamle çözer: tekrarlayan her kaynağı bir factory function'ın arkasına koymak ve kimsenin unutmayı göze alamayacağı ayarları (RemovalPolicy, encryption, log retention) CDK Aspects ile enforce etmek. Builder'lar, composer'lar ve custom L3 construct'lar bu ikisinin uzantısıdır; sonradan eklenir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[IoT Lojistik Uygulamaları için Mesajlaşma Protokolü Seçimi: MQTT, AMQP, ZeroMQ, CoAP ve DDS Karşılaştırması]]></title>
            <description><![CDATA[IoT lojistik için MQTT, AMQP, ZeroMQ, CoAP ve DDS'nin teknik karşılaştırması: filo takibi, soğuk zincir izleme ve gerçek zamanlı cihaz iletişimi.]]></description>
            <link>https://sph.sh/tr/posts/iot-messaging-protocols-logistics-tracking/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/iot-messaging-protocols-logistics-tracking/</guid>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[industry-trends]]></category>
            <category><![CDATA[real-time]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>IoT lojistik yığınında protokol seçimi; teslimat garantisinin, latency'nin ve aylık bant genişliği faturasının tavanını belirliyor. Filo takibi ve soğuk zincir izleme için doğru varsayılan MQTT: güvenilmez hücresel bağlantılara dayanıyor, üç QoS seviyesi sunuyor, olgun broker ve istemci kütüphaneleri neredeyse her dilde hazır. AMQP, ZeroMQ, CoAP ve DDS'nin her biri MQTT'yi tek bir eksende geçiyor; asıl soru senin deployment'ının hangi eksende sıkıştığı.</p>
<p><strong>Seçimi Belirleyen Kısıtlar</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript'te Davranışsal Tasarım Kalıpları: Observer, Strategy, Command, State]]></title>
            <description><![CDATA[Observer, Strategy, Command, State ve Mediator TypeScript'te: hangisini dilin kendisi karşılıyor, RxJS, Redux ve XState ne zaman yerini hak ediyor.]]></description>
            <link>https://sph.sh/tr/posts/behavioral-patterns-reactive-programming/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/behavioral-patterns-reactive-programming/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[state-management]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Davranışsal (behavioral) kalıplar, nesnelerin nasıl iletişim kurduğunu ve sorumlulukların nasıl dağıtıldığını tanımlar. Gang of Four; Observer, Strategy, Command, State ve Mediator kalıplarını C++ ve Smalltalk için belgeledi. O dillerde her kalıp, işe yarar bir şey yapmadan önce bir sayfa boilerplate'e mal oluyordu. TypeScript bu hesabı değiştirdi: first-class function'lar, closure'lar ve discriminated union'lar bu kalıpların bir kısmını tek başına karşılıyor, kalanının çoğunu da RxJS, Redux ve XState framework convention'larına dönüştürdü.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript'te Creational Design Pattern'ler: Singleton, Factory, Builder, Prototype]]></title>
            <description><![CDATA[Singleton, Factory, Builder ve Prototype pattern'lerinin TypeScript'te evrimi: ES modülleri singleton'ı ne zaman, factory function'lar class'ı ne zaman geçer.]]></description>
            <link>https://sph.sh/tr/posts/creational-patterns-modern-typescript/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/creational-patterns-modern-typescript/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>TypeScript'te nesne yaratmak artık nadiren bir Gang of Four pattern'i gerektiriyor. Varsayılan, dilin kendi özelliği: tek bir paylaşılan instance için ES modülü, koşullu yaratım için factory function, kopyalama için object spread ya da structuredClone(). Bir modül export'unun zaten hallettiği işi class hiyerarşisiyle sarmalamak gereksiz soyutlama getirir, test edilebilirliği zedeler ve niyeti gizler.</p>
<p>Singleton, Factory, Builder ve Prototype hala yerini hak ediyor ama tetikleyici, ders kitaplarının anlattığından dar: birçok nesnenin tutarlı biçimde uygulaması gereken ortak konfigürasyon ya da adım adım doğrulanması gereken bir kurulum.</p>
<p><strong>Class Olmadan Singleton</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gang of Four'un Ötesinde Modern React ve TypeScript Tasarım Kalıpları]]></title>
            <description><![CDATA[JavaScript ve TypeScript ekosistemlerinden doğan modern kalıplar - hooks, compound components, render props ve GoF'un görmediği problemleri çözen repository pattern'leri.]]></description>
            <link>https://sph.sh/tr/posts/design-patterns-beyond-gof/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/design-patterns-beyond-gof/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[design-patterns]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Gang of Four, 1994'te C++ ve Smalltalk için pattern'leri dokümante etti; asenkron programlama, component composition ve reactive data flow uygulama yazma biçimini henüz değiştirmemişti. JavaScript ve TypeScript kendi cevaplarını üretti: stateful logic paylaşımı için React Hooks, esnek API'ler için Compound Components, data access için Repository pattern ve kapsülleme için ES module'ler. Front-end'de ya da Node tarafında TypeScript yazıyorsan işin ağırlığını tek bir varsayılan taşıyor: önce dilin veya framework'ün hazır özelliğine bak, pattern'i ancak adını koyabildiğin bir problemi ortadan kaldırıyorsa ekle.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React ve TypeScript'te Yapısal Design Pattern'ler]]></title>
            <description><![CDATA[Decorator, Adapter, Facade, Composite ve Proxy patternlerinin React ve TypeScript'te evrimi: HOC'lar ne zaman hook'lara yol verir, adapterler API'ları nasıl izole eder.]]></description>
            <link>https://sph.sh/tr/posts/structural-patterns-component-composition/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/structural-patterns-component-composition/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Yapısal patternler, objeler ve classlar arasındaki ilişkileri organize eder. Gang of Four, 1994'te Decorator, Adapter, Facade, Composite ve Proxy patternlerini C++ ve Smalltalk için belgeledi. Modern TypeScript ve React beşini de framework konvansiyonlarına, hook'lara ve type-safe wrapper'lara dönüştürdü.</p>
<p>Bir React kod tabanında asıl soru, wrapper'ın nereye ait olduğu. Kendi yazdığın kodda varsayılan composition: cross-cutting davranış için hook'lar, hiyerarşi için düz component'ler. Wrap etmek ise kontrol etmediğin sınırlarda yerini buluyor; third-party API'lar, SDK kurulumu ve erişim kuralları gibi.</p>
<p><strong>TypeScript'te Üç Farklı Decorator Anlamı</strong></p>
<p>"Decorator" terimi TypeScript ekosisteminde üç farklı şey ifade ediyor:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript'te Builder Pattern: Modern Uygulamalarda Tip Güvenli Konfigürasyon]]></title>
            <description><![CDATA[Builder pattern'in TypeScript tip sistemiyle serverless, veri katmanı ve testte güvenli, keşfedilebilir API'leri nasıl kurduğu, çalışan örneklerle.]]></description>
            <link>https://sph.sh/tr/posts/builder-pattern-typescript/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/builder-pattern-typescript/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[serverless]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>TypeScript'teki Builder pattern, geleneksel nesne yönelimli dillerdekinden farklı bir amaca hizmet eder. Java ve C# builder'ları çoğunlukla uzun opsiyonel parametre listelerini yönetmek için kullanır. TypeScript daha ileri gidebiliyor: generic'ler ve conditional type'lar sayesinde builder, kısıtlamaları compile time'da zorunlu kılabiliyor. Yanlış konfigürasyon deployment'ta patlamak yerine IDE'de tip hatası olarak görünüyor.</p>
<p>Bu da pattern'in işe yaradığı alanı daraltıyor. Konfigürasyon nesnesi birbirine bağımlı kısıtlamalar taşıyorsa builder'a geç; pratikte bu grup altyapı tanımları, query builder'lar ve test verisi fabrikalarından oluşuyor. Geri kalan her yerde düz nesne literali veya options parametresi yeterli.</p>
<p><strong>TypeScript'te Karmaşık Nesnelerin Sorunu</strong></...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Middy ve Zod: Type-Safe AWS Lambda Middleware Doğrulama]]></title>
            <description><![CDATA[Middy builder pattern, Zod validation, feature flags ve secrets management ile sürdürülebilir, type-safe Lambda middleware nasıl inşa edilir öğren.]]></description>
            <link>https://sph.sh/tr/posts/middy-builder-pattern-zod-validation/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/middy-builder-pattern-zod-validation/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[middleware]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[zod]]></category>
            <category><![CDATA[feature-flags]]></category>
            <category><![CDATA[secrets-management]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Lambda codebase'inde middleware zamanla dağılır. Proje birkaç fonksiyonu geçtiğinde her handler kendi Middy zincirini kuruyor: error handler'lar farklı pozisyonlara düşüyor, bazı endpoint'ler authenticate ediyor bazıları etmiyor ve handler imzasıyla artık uyuşmayan bir schema ancak trafik geldiğinde hata veriyor.</p>
<p>Middy'nin önüne konan ince bir builder bunu çözer. Middleware sırasını tek yerde sabitler, context type'larını ileri taşır (böylece TypeScript handler'ın ne aldığını bilir) ve validation için JSON Schema yerine Zod kullanır. Bedeli birkaç yüz satır glue kod ve biraz daha ağır bir cold start; birkaç endpoint'i geçen her API için bu takas kârlı.</p>
<p><strong>Standart Middleware Kurulumunun Sorunları</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OpenTelemetry Temelleri: Modern Observability için Başlangıç Rehberi]]></title>
            <description><![CDATA[Pratik örnekler, yaygın hatalar ve terminoloji sözlüğü ile OpenTelemetry'nin trace, metric ve log sistemlerini kapsayan başlangıç rehberi.]]></description>
            <link>https://sph.sh/tr/posts/opentelemetry-fundamentals-beginner-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/opentelemetry-fundamentals-beginner-guide/</guid>
            <category><![CDATA[opentelemetry]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Dağıtık sistemlerde tek bir kullanıcı request'i düzinelerce servisten geçer; bu yüzden bir hatayı ya da latency spike'ını sadece log'larla açıklamak çoğu zaman mümkün olmaz. Ortak bir telemetri standardı olmadan her servis kendi formatında veri üretir ve mühendisler trace, metrik ve log'ları uyumsuz backend'ler arasında elle eşleştirmek zorunda kalır. OpenTelemetry (OTel), bu uyumsuzluğu ortadan kaldıran açık kaynak framework'tür: telemetriyi üretmek, işlemek ve export etmek için dilden ve runtime'dan bağımsız tek bir yol.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[7 Az Bilinen TypeScript Özelliği: satisfies, Branded Types ve Daha Fazlası]]></title>
            <description><![CDATA[Production kodunu iyileştiren 7 az bilinen TypeScript özelliği: satisfies, noUncheckedIndexedAccess, branded types, discriminated unions ve daha fazlası.]]></description>
            <link>https://sph.sh/tr/posts/typescript-essential-underutilized-features/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/typescript-essential-underutilized-features/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[code-quality]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>tsconfig.json içinde strict açmak, type güvenliği meselesinin kapandığı hissini verir. Kapanmaz. Indexed access hâlâ undefined ihtimalini gizleyen bir type döndürür, bir UserID hâlâ OrderID bekleyen fonksiyona sorunsuz geçer, union'a eklenen yeni bir member da önceden yazdığın her switch bloğundan sessizce kaçar.</p>
<p>En yüksek getirili değişiklik noUncheckedIndexedAccess: strict modun açmadığı bir compiler flag'i. Önce onu ekle, ardından geri kalan boşlukları kapatan type seviyesindeki araçlara geç: satisfies, branded types, exhaustiveness kontrollü discriminated unions, type predicates, template literal types ve infer. Yedisi de yalnızca derleme zamanında var olur; runtime'a hiçbir maliyet çıkarmaz.</p>
<p><strong>Strict Mode'un Kapatmadığı Boşluklar</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Her Yazılım Geliştiricinin Bilmesi Gereken Ağ Temelleri]]></title>
            <description><![CDATA[Geliştiriciler için pratik bir ağ kavramları sözlüğü - protokollerden DNS'e, debugging araçlarından güvenlik temellerine.]]></description>
            <link>https://sph.sh/tr/posts/network-fundamentals-developers-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/network-fundamentals-developers-guide/</guid>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[http]]></category>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Distributed sistemlerdeki gizemli timeout'lar, yavaş API'lar ve TLS hataları neredeyse her zaman uygulama sorunu gibi görünen ağ sorunlarıdır. Geliştiriciler TCP, DNS ve HTTP'nin çalışma modelinden yoksun olduğunda teşhis yanlış katmanda takılır, düzeltmeler ise tahmine dayalı kalır.</p>
<p>Aşağıdaki kavramlar backend geliştirmede ve production troubleshooting'inde en sık karşılaşılanlar: protokoller, bağlantı yaşam döngüsü, debugging araçları ve güvenlik temelleri. Her başlık kavramın ne olduğunu, ne zaman önem kazandığını ve hangi komutun cevabı verdiğini anlatıyor.</p>
<p><strong>Ağ Bilgisi Nerede İşe Yarar</strong></p>
<p>Mükemmel uygulama kodu bile, verinin client ile server arasında nasıl hareket ettiği anlaşılmadığında yetersiz kalır. Geliştiriciler şu konularda zorlanır:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TypeScript için CloudEvents SDK: Serverless Mimarilerde Event Standardizasyonu]]></title>
            <description><![CDATA[CloudEvents spesifikasyonu ve TypeScript SDK'sı için pratik rehber: AWS Lambda ve EventBridge'de standart eventler oluştur, parse et ve doğrula.]]></description>
            <link>https://sph.sh/tr/posts/cloudevents-sdk-typescript-serverless/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cloudevents-sdk-typescript-serverless/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[nodejs]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 29 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Event-driven mimarilerde her event kaynağı event'leri farklı şekilde tanımlama eğilimindedir: bir Lambda { userId: string } beklerken, diğeri { user_id: string }, üçüncüsü ise { sub: string } kullanır. Bu heterojenliğin maliyeti, kaynak sayısıyla büyüyen entegrasyon kodu ve sistemler arasında event'leri ilişkilendiremeyen gözlemleme araçlarıdır. Standartlaştırılmış bir event zarfı her iki sorunu da çözer; karşılığında her üreticinin aynı şemayı benimsemesini gerektirir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Domain-Driven Design: Giriş ve Temeller]]></title>
            <description><![CDATA[Domain-Driven Design'a kapsamlı giriş: temel kavramlar, yapı taşları, stratejik desenler ve DDD'yi ne zaman ve nasıl uygulayacağına dair rehber.]]></description>
            <link>https://sph.sh/tr/posts/domain-driven-design-introduction/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/domain-driven-design-introduction/</guid>
            <category><![CDATA[domain-driven-design]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 29 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Domain-Driven Design (DDD), kodun yapısını hizmet ettiği business domain'iyle hizalar. Karmaşık ve uzun ömürlü sistemlerde bu hizalama karşılığını verir: sınıflar ve method'lar domain uzmanlarının zaten kullandığı isimleri taşıdığında, business kuralları controller'lara ve servislere dağılmak yerine tek bir yerde toplanır. Bedeli, işi bilen kişilerle birlikte harcanan modelleme zamanıdır.</p>
<p>Karar da tam olarak bu bedelin üzerine kuruludur. Sık değişen kurallar, yıllarca sahipleneceğiniz bir sistem ve sizinle oturmaya istekli domain uzmanları: bu üç koşul varsa yatırım kendini amorti eder. Yoksa sade bir katmanlı mimari daha iyi hizmet eder.</p>
<p><strong>Domain-Driven Design Nedir?</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Event Storming: Karmaşık Domain'leri Anlamak İçin Pratik Rehber]]></title>
            <description><![CDATA[Event Storming'in ne olduğu, oturumların nasıl etkili yönetileceği ve domain modelleme için bu workshop tekniğini ne zaman kullanacağına dair rehber.]]></description>
            <link>https://sph.sh/tr/posts/event-storming-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/event-storming-guide/</guid>
            <category><![CDATA[domain-driven-design]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir business süreci kâğıda dökülürken hep bir şeyler kayboluyor. Görüşmeler sürecin yalnızca tek bir kişiye görünen kısmını yakalıyor; o görüşmelerden yazılan requirement dokümanı da kimsenin söylemeyi akıl etmediği adımları atlıyor. Event Storming bu boşluğu bir workshop ile kapatır: business uzmanları ve developer'lar domain event'lerini kronolojik sırayla duvara dizer, süreç herkese aynı anda görünür hale gelene kadar.</p>
<p>Daha önce hiç oturum yönetmediysen Big Picture formatıyla başla ve business uzmanlarını baştan sona odada tut. Tekniğin sunduğu diğer her şey (detaylı süreç tasarımı, aggregate sınırları, servis sınırları) o ilk oturumun ürettiği ortak haritaya dayanır; domain uzmanı olmadan yapılan oturum ise developer'ların tahmin yürüttüğü bir tasarım toplantısına dönüşür.</p...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[VPS Üzerinde Dokploy ve Cloudflare Tunnel Kurulumu]]></title>
            <description><![CDATA[VPS, Dokploy deployment platformu ve Cloudflared tunnel kullanarak güvenli, uygun maliyetli private sunucu kurulumu için pratik bir rehber]]></description>
            <link>https://sph.sh/tr/posts/cost-effective-vps-dokploy-cloudflared-setup/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cost-effective-vps-dokploy-cloudflared-setup/</guid>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[cloudflare]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Private sunucu çalıştırmak için pahalı cloud faturalarına ya da karmaşık infrastructure'lara ihtiyacınız yok. En iyi çözüm genellikle kurumsal platformlar yerine basit, odaklanmış araçları birleştirmekte yatıyor.</p>
<p>Production-ready bir private sunucu üç parçadan oluşuyor:
- <strong>VPS</strong> uygun maliyetli compute için (~\$5-20/ay)
- <strong>Dokploy</strong> temiz bir UI ile Docker-tabanlı deployment'lar için
- <strong>Cloudflared</strong> port açmadan güvenli erişim için</p>
<p>Üçünün toplam maliyeti ayda yaklaşık \$6-8 ve bu bütçe birden fazla uygulamayı güvenli şekilde çalıştırmaya yetiyor.</p>
<p><strong>Gereksinimler</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Event-Driven Mimari ile CRM Sistemleri Geliştirmek]]></title>
            <description><![CDATA[Event sourcing, CQRS ve event-driven pattern'leri kullanarak müşteri ilişkileri yönetimi, marketing otomasyonu ve consent yönetimi için pratik bir rehber]]></description>
            <link>https://sph.sh/tr/posts/crm-event-driven-architecture/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/crm-event-driven-architecture/</guid>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[compliance]]></category>
            <category><![CDATA[marketing-analytics]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Geleneksel CRM sistemleri müşteri durumunu doğrudan saklar: müşteri başına bir kayıt, her etkileşimde yerinde güncellenir. Bu model; ürün aynı anda gerçek zamanlı kişiselleştirme, GDPR uyumlu denetim izi ve çok kanallı orkestrasyon istediğinde çöker. Güncel-durum satırının oraya nasıl geldiğine dair bir hafızası yoktur. Event-driven CRM bu modeli tersine çevirir: her etkileşim değişmez bir event olarak kaydedilir ve herhangi bir görüntü (profil, consent defteri, kanal geçmişi) bu event akışı üzerinde bir projeksiyon olur.</p>
<p>İşe yarayan varsayılan: AWS üzerinde EventBridge ve DynamoDB ile event sourcing, üstüne kişiselleştirme ve consent için CQRS projeksiyonları. Faturası da belli: depolama maliyeti, eventual-consistency bütçeleri ve replay pencereleri.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Strapi vs Contentful vs Storyblok vs Kontent.ai: Headless CMS Karşılaştırması]]></title>
            <description><![CDATA[Headless CMS çözümlerinin (Strapi, Contentful, Kontent, Storyblok) pratik karşılaştırması: Cloudinary ile görsel yönetimi ve framework entegrasyonu.]]></description>
            <link>https://sph.sh/tr/posts/multi-channel-content-management-headless-cms/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/multi-channel-content-management-headless-cms/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[mobile]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Headless CMS seçimi, tek bir içerik setinin hem web sitesini hem mobil uygulamayı hem de sıradaki kanalı beslemesi gerektiği anda zorlaşıyor. Kısa listeye genelde dört platform giriyor: Strapi, Contentful, Kontent.ai ve Storyblok. Depolayabildikleri içerik açısından birbirlerine yakınlar; asıl ayrıştıkları yer, kullanım maliyetini kimin üstlendiği. Karar da tek bir soruya iniyor: darboğaz içerik ekibiniz mi, geliştirme ekibiniz mi?</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Traefik vs Nginx: nginx Kullanıcıları İçin Giriş]]></title>
            <description><![CDATA[nginx bilen geliştiriciler için pratik Traefik rehberi: temel kavramlar, Docker kurulum örnekleri ve nginx'e kıyasla Traefik'i ne zaman seçeceğin.]]></description>
            <link>https://sph.sh/tr/posts/traefik-101-introduction/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/traefik-101-introduction/</guid>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Traefik, çalışırken değişen altyapılar için tasarlanmış bir reverse proxy ve load balancer. Container orchestrator'ünü izler ve routing kurallarını kendisi günceller; nginx ise config dosyasını düzenleyip reload etmeni bekler. Seçimin büyük kısmını bu tek fark belirliyor. Servislerin kendi takvimine göre gelip giden container'larsa, o kenara Traefik koy; topolojinin sabit olduğu yerde nginx'te kal.</p>
<p>Takas şu: operasyonel kolaylığa karşılık daha ince bir veri yolu. Traefik düzenle-test-et-reload döngüsünü ortadan kaldırıyor, bedelini de daha büyük bir runtime ayak izi ve daha az olgun bir rewrite/caching motoruyla ödüyor. Sabit bir upstream listesi statik dosya sunuyorsa bu kötü bir takas. Günde birkaç kez yeniden deploy edilen bir container filosu içinse kolay bir takas.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Yardım Spektrumu: Profesyonel Yazılım Geliştirmede Doğru Seviyeyi Seçmek]]></title>
            <description><![CDATA[Yazılımda kod incelemeden vibe coding'e altı seviye AI yardımını anlatan bir framework ve AI yardımını ne zaman artırıp azaltacağınıza dair rehber.]]></description>
            <link>https://sph.sh/tr/posts/ai-assistance-spectrum-professional-software-engineering/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-assistance-spectrum-professional-software-engineering/</guid>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[code-quality]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[github-copilot]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[developer-experience]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Profesyonel bir mühendislik workflow'una ne kadar AI yardımı girmeli? İşe yarayan cevap evet ya da hayır değil, bir seviye. Tamamen manuel bir baseline'ın üstünde altı seviye duruyor: sadece inceleme amaçlı sorgular, inline autocomplete, fonksiyon üretimi, çok dosyalı refactoring, otonom ajanlar ve kimsenin çıktıyı okumadığı "vibe coding". Her basamak hız kazandırır, anlama payından harcar.</p>
<p>Production kodunun çoğu için savunulabilir varsayılan fonksiyon seviyesi generation'dır. Signature'ı ve niyeti siz yazarsınız, model gövdeyi yazar, siz de onu her diff gibi incelersiniz. Regulated veya güvenlik açısından kritik yollarda bu seviyeyi düşürün; ancak test coverage modelin kaçırdıklarını yakalayacak kadar güçlüyse yükseltin.</p>
<p><strong>Temel Problem</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Geliştirici Araçları: Benimseme Verileri ve Trendler]]></title>
            <description><![CDATA[AI kodlama asistanlarının gerçekten işe yaradığı yerler, bireysel hız kazancının takım seviyesinde neden kaybolduğu ve yaygınlaştırmadan önce kurulması gerekenler.]]></description>
            <link>https://sph.sh/tr/posts/ai-tools-developers-part-1/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-tools-developers-part-1/</guid>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[github-copilot]]></category>
            <category><![CDATA[enterprise]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AI kodlama asistanları neredeyse evrensel bir benimsenmeye ulaştı: DORA'nın 2025 araştırması kullanım oranını teknoloji çalışanlarının yaklaşık %90'ı olarak veriyor. Aynı dönemde METR'in yürüttüğü randomize deney, deneyimli açık kaynak geliştiricilerinin AI araçlarını kullanmalarına izin verildiğinde görevleri %19 daha yavaş tamamladığını ölçtü. Aynı geliştiriciler araçların kendilerini %20 hızlandırdığına inanıyordu. İki bulgu aynı anda doğru olabilir ve birlikte, pek çok yaygınlaştırmanın neden tıkandığını açıklıyorlar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Kodlama Araçları Nasıl Benimsenir: Pilottan Üretime]]></title>
            <description><![CDATA[AI geliştirici araçlarını benimsemek için pratik rehber: hazırlık puanlaması, pilot kapsamı, güvenlik kontrolleri, inceleme kapasitesi ve izlenmeye değer metrikler.]]></description>
            <link>https://sph.sh/tr/posts/ai-tools-developers-part-2/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-tools-developers-part-2/</guid>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[code-quality]]></category>
            <category><![CDATA[production]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AI kodlama araçlarını mevcut bir mühendislik organizasyonuna yaymak, araçlar yüzünden değil ikincil maliyetler yüzünden tökezler. İnceleme kuyrukları uzar, insan eliyle yazılmış kod varsayımıyla kurulmuş güvenlik kontrolleri yeni yüzeyi kapsamaz ve verimlilik hikâyesi pilot sunumundaki gibi çıkmaz: METR'in randomize çalışması, deneyimli geliştiricilerin kendi depolarında AI yardımı kullanmalarına izin verildiğinde işleri %19 daha uzun sürede bitirdiğini ölçtü; üstelik geliştiriciler daha hızlı olacaklarını bekliyordu. METR o tahmini sonradan genişletti ve ters yöne işaret eden bir takip çalışması yayımladı. Verimlilik etkisinin büyüklüğünü tartışmalı kabul edin; planlayabileceğiniz kısım ikincil maliyetlerdir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Kodlama Araçlarında Güvenlik Riskleri ve Yönetişim]]></title>
            <description><![CDATA[AI geliştirici araçları için güvenlik riskleri, yönetişim ve güven inşası: 2025 CVE'leri, gölge AI keşfi ve sızan gizli bilgiler için olay müdahale oyun kitabı.]]></description>
            <link>https://sph.sh/tr/posts/ai-tools-developers-part-3/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-tools-developers-part-3/</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[compliance]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[incident-response]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AI kodlama asistanları kendine özgü bir güvenlik riski sınıfı ortaya çıkarır: eğitim verisinden gerçekmiş gibi görünen gizli bilgiler üretir ve standart secret scanning buluşsal yöntemlerini atlayan kalıpları normalleştirir. Bu riske karşı ayakta kalan varsayılan dar bir kural. Her AI önerisini güvenilmeyen girdi olarak kabul edin, commit'e ulaşmadan tarayın ve araca çalışabileceği en dar repo erişimini verin. Bir AI yönetişim programındaki diğer her şey, bu varsayılanı kurumsal ölçekte uygulatmanın yoludur.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Kodlama Araçlarında ROI: Gerçek İş Değerini Ölçmek]]></title>
            <description><![CDATA[AI geliştirici araçları için birinci yıl ROI modeli: satıcıların atladığı maliyet kalemleri, devam/durdur çerçevesi ve kararı değiştirmesi gereken koşullar.]]></description>
            <link>https://sph.sh/tr/posts/ai-tools-developers-part-4/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ai-tools-developers-part-4/</guid>
            <category><![CDATA[ai-adoption-strategy]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[industry-trends]]></category>
            <category><![CDATA[decision-making]]></category>
            <category><![CDATA[business-strategy]]></category>
            <category><![CDATA[product-management]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AI geliştirici araçlarının bütçeleri hep aynı yönde şaşar. Koltuk fiyatı kararın kendisi gibi görünür; oysa GitHub, Copilot'u Haziran 2026'da kullanıma dayalı faturalamaya geçirdiğinden beri o fiyat sabit bir sayı bile değil. Birinci yılın harcamasını asıl belirleyen kalemler hiçbir satıcı modelinde yer almaz: koltuğun üzerine binen ölçümlü kullanım, herkes araçları öğrenirken yaşanan verimlilik düşüşü, büyüyen PR kuyruğunu karşılayacak inceleme kapasitesi ve ilk olaydan sonra sonradan eklenen güvenlik kontrolleri.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lambda Layer Versiyon Yönetimi: Çok Ortamlı Deployment Stratejileri]]></title>
            <description><![CDATA[Dev, staging ve production ortamlarında Lambda Layer versiyonlarını AWS CDK ile yönetmek için pratik yaklaşımlar: otomatik pipeline ve rollback dahil.]]></description>
            <link>https://sph.sh/tr/posts/lambda-layer-versioning-multi-environment/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/lambda-layer-versioning-multi-environment/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS Lambda bir layer'a otomatik artan bir tam sayı veriyor, üstüne hiçbir şey vermiyor. Semantic versiyon yok, ortamlar arasında terfi yolu yok, hangi fonksiyonun hangi build'i çalıştırdığına dair kayıt yok. Takımlar bu boşluğu ellerinin altındaki en kolay yöntemle kapatıyor; dev, staging ve production'ın birbirinden farklı üç layer versiyonunda kalması ve hiçbirinin bir değişikliğe bağlanamaması da böyle oluyor.</p>
<p>Başlangıç için doğru varsayılan bir version manifest: repoda duran, her ortam için explicit bir layer ARN'i sabitleyen, commit ile terfi ettirilen ve revert ile geri alınan bir YAML dosyası. Git üzerinde tam bir audit trail veriyor, deploy sırasında hiçbir lookup gerektirmiyor. Elle düzenlenen bir dosyanın yetmediği durumlar için diğer üç strateji devreye giriyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Yazılım Ekiplerinde Rol Beklentileri: RACI ve DACI Çerçeveleri]]></title>
            <description><![CDATA[Belirsiz sahiplik yazılım teslimatını yavaşlatır. RACI ve DACI karar haklarını nasıl dağıtır, hangisi nerede işe yarar ve benimsemeyi ne öldürür.]]></description>
            <link>https://sph.sh/tr/posts/role-expectations-team-performance/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/role-expectations-team-performance/</guid>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[remote-work]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Yazılım takımlarında rol belirsizliği kendini rol tartışması olarak değil, duran iş olarak gösterir. Gallup'un 2024 ABD işyeri araştırmasına göre çalışanların %46'sı kendisinden ne beklendiğini söyleyemiyor. Mühendisler bir kararın kime ait olduğunu bilmediğinde iş ya bir toplantıyı bekler ya da iki ayrı branch'te iki kez yazılır.</p>
<p>İki hafif çerçeve bu sorunun büyük kısmını kapatır. Tekrar eden akışlar için (API tasarımı, deployment, gereksinimler) RACI'yi, tek seferlik kararlar için (mimari, araç seçimi) DACI'yi kullanın. Başlangıç için varsayılan dar tutulmalı: en çok yeniden iş doğuran iki üç akışı seçin, kararı kimin verdiğini yazın, geri kalanı size bir bedel çıkarana kadar informal bırakın.</p>
<p><strong>Rol Belirsizliğinin Maliyeti</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vercel Alternatifleri: Next.js Deployment Kapsamlı Rehberi]]></title>
            <description><![CDATA[Vercel dışında Next.js deploy etmenin kapsamlı rehberi: her hedef platform için maliyet profili, implementasyon detayları ve migration yolu.]]></description>
            <link>https://sph.sh/tr/posts/vercel-alternatives-nextjs-deployment/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/vercel-alternatives-nextjs-deployment/</guid>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cloudflare]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Vercel, Next.js için en pürüzsüz deployment deneyimini sunar; ama fatura trafikten daha hızlı büyür. Bandwidth aşımları GB başına \$0.15'e gelir ve function invocation'lar sessizce birikir; tek bir marketing zirvesi, tam da dönüşümlerin en kritik olduğu anda maliyeti katlayabilir. Deployment'ı kolaylaştıran platforma özel API'ler, aynı zamanda ileride taşınmayı zorlaştıran bir lock-in yaratır.</p>
<p>Çoğu Next.js uygulaması için ilk denenecek varsayılan, OpenNext adapter'ıyla Cloudflare Workers: bandwidth ölçülmüyor ve adapter uygulamayı taşınabilir tutuyor. Bu varsayılanın yetmediği durumları AWS üzerinde SST ve CDN arkasındaki Docker VPS karşılıyor. Her hedefin kendi maliyet profili ve dokümantasyonun atladığı kendi migration detayları var.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GitHub Spec Kit: Spesifikasyon Güdümlü AI Geliştirme Rehberi]]></title>
            <description><![CDATA[GitHub Spec Kit, başıboş AI kod üretimini dört aşamalı specify-plan-tasks-implement döngüsüyle yapılandırılmış ve sürdürülebilir koda nasıl dönüştürür.]]></description>
            <link>https://sph.sh/tr/posts/github-speckit-ai-specification-framework/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/github-speckit-ai-specification-framework/</guid>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[code-quality]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[ai-agents]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[github-copilot]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AI araçlarının ürettiği kod genellikle yerel bir smoke test'i geçer ama üretim çıtasını geçemez: belirsiz arayüzler, yukarı akış verisi hakkında doğrulanmamış varsayımlar, eksik hata yönetimi ve kod tabanının konvansiyonlarını değil prompt'u yansıtan bir yapı. Arayüzün, girdilerin, değişmezlerin ve hata modlarının açık, makine okunabilir bir spesifikasyonu, modelin tek satır üretmesinden önce bu boşluğun çoğunu kapatır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS CDK ve Serverless ile Geçici Preview Ortamları Oluşturma]]></title>
            <description><![CDATA[AWS CDK, Lambda ve GitHub Actions kullanarak otomatik preview ortamları oluşturmayı öğrenin - sorunsuz PR test ve inceleme süreçleri için]]></description>
            <link>https://sph.sh/tr/posts/ephemeral-preview-environments-aws-serverless-cdk/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/ephemeral-preview-environments-aws-serverless-cdk/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sun, 21 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Paylaşılan Staging Ortamlarının Problemi</strong></p>
<p>Paylaşılan tek bir staging ortamı, bir ekip günde birden fazla pull request açmaya başladığı an darboğaza dönüşür. Eşzamanlı PR'lar birbirlerinin veritabanı durumunu üzerine yazar, aynı feature flag'lerde çakışır ve aynı DNS kaydı için yarışır; test sinyali düşer çünkü bir hata, gerçek bir regresyon kadar "başka birinin PR'ı" anlamına da gelebilir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Key-Value Store Nedir? Doğru Çözümü Seçme Rehberi]]></title>
            <description><![CDATA[Key-value storage'a temel bir rehber: ne olduğu, nerede kullanıldığı, takımların neden seçtiği ve hangi tech stack'lerde hangi çözümlerin geldiği.]]></description>
            <link>https://sph.sh/tr/posts/redis-key-value-storage-fundamentals/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/redis-key-value-storage-fundamentals/</guid>
            <category><![CDATA[redis]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[caching]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Relational database pattern'lerini key-value erişim workload'larına (session storage, caching, sepet verisi) uygulamak önlenebilir gecikmeye ve şema karmaşıklığına yol açar. Yanlış storage modelini seçmek, takımları temel bir mimari uyumsuzluğu gideremeyen index ayarlama döngülerine sürükler. Key-value storage bu uyumsuzluğu ortadan kaldırır: veri modeli erişim pattern'iyle örtüşür, böylece bir lookup sorgu planı yerine tek bir hash probe'a iner.</p>
<p>Dağıtık workload'larda varsayılan Redis'tir; onu geçmek için somut bir gerekçe gerekir. İstisnalar dar ve tahmin edilebilir: configuration ve coordination için etcd, dalgalanan serverless trafik için DynamoDB, tek sunucu varsa in-process cache ve tüm deployment JVM üzerinde koşuyorsa gömülü Hazelcast.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code MCP Sunucuları: Kurulum ve Yapılandırma Rehberi]]></title>
            <description><![CDATA[Claude Code, AI agent'ları ve Model Context Protocol sunucuları hakkında geliştiricileri temel kullanıcıdan güç kullanıcısına dönüştüren kapsamlı bir rehber]]></description>
            <link>https://sph.sh/tr/posts/claude-code-mcp-ecosystem-mastery/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/claude-code-mcp-ecosystem-mastery/</guid>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[mcp]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Claude Code'un verimlilik tavanı, MCP (Model Context Protocol) sunucuları devreye girdiğinde belirgin biçimde yükselir. Onlar olmadan akış kopyala-yapıştır modunda kalır; doğru MCP sunucuları bağlandığında Claude Code altyapı, veritabanı ve servislerle doğrudan etkileşim kurabilir. Başlangıç için doğru kurulum küçüktür: filesystem sunucusu ve tek bir dokümantasyon sunucusu; geri kalanı göreve göre eklenir ve iş bitince kapatılır.</p>
<p><strong>Claude Code Nedir</strong></p>
<p>Claude Code, çoğu geliştiricinin hiç keşfetmediği yeteneklere sahip bir geliştirme ortamıdır. Bunların üçü diğerlerinden daha çok işe yarar.</p>
<p><strong>Üç Etkileşim Modu</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kültürel Körlüğün Gizli Maliyeti: Global Engineering Takımları Nasıl Başarısız Oluyor]]></title>
            <description><![CDATA[Kültürel yanlış anlaşılmalar global yazılım takımlarını sessizce başarısızlığa sürükler; geri bildirim, toplantı ve eskalasyonu kültüre uyarlamanın pratik çerçeveleri.]]></description>
            <link>https://sph.sh/tr/posts/cultural-misunderstandings-global-engineering-teams/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cultural-misunderstandings-global-engineering-teams/</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[remote-work]]></category>
            <category><![CDATA[organizational-culture]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Global engineering takımlarında kültürel körlüğün bedeli sessizce ödenir: her takım "hazır" derken farklı şeyler kasteder; bu uçurum kodda değil, entegrasyon aşamasında ortaya çıkar. İletişim tarzı, hiyerarşi beklentisi ve geri bildirim biçimi kültürler arasında keskin farklılaşır; bu farkları hiç adlandırmayan dağıtık bir takım bedelini yeniden çalışmayla, kaçırılan eskalasyonlarla ve susmayı seçen mühendislerle öder.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RACI ve DACI: Yazılım Ekiplerinde Rol Belirsizliği]]></title>
            <description><![CDATA[Net olmayan rol beklentileri yazılım ekibi verimliliğini sessizce tüketir; israfı ortadan kaldıran ve performansı artıran RACI, swim-lane ve eskalasyon çerçeveleri.]]></description>
            <link>https://sph.sh/tr/posts/hidden-cost-role-ambiguity-software-team-performance/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/hidden-cost-role-ambiguity-software-team-performance/</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[remote-work]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Rol belirsizliği (kararların ve çıktıların sahipliğinin net olmaması) sprint board'da hiç görünmeyen tekrarlayan iş, karar felci ve eskalasyon yüküyle mühendislik verimini sessizce tüketir. Çözüme kavuşturulmazsa, gayri resmi koordinasyonun artık boşlukları dolduramadığı dağıtık ekiplerde katlanarak büyür. Üç somut çerçeve, süreci ağırlaştırmadan bu israfın büyük kısmını ortadan kaldırır: RACI matrisleri, swim-lane tanımları ve eskalasyon protokolleri.</p>
<p>Tek bir tanesini seçeceksen RACI'yi seç ve tekrarlayan işlere uygula: API tasarımı, deployment, gereksinim onayı. DACI'yi tek seferlik mimari kararlara sakla. İkisinin altındaki kural aynı: bir karardan yalnızca tek bir kişi hesap verir, geri kalan herkes kendisine danışıldığını mı yoksa yalnızca bilgilendirildiğini mi bilir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Yazılım Ekiplerinde Zor Meslektaşlarla Çalışmak: Teorinin Ötesinde Pratik Çözümler]]></title>
            <description><![CDATA[Engineering'e özgü zor meslektaşlar için saha rehberi: kod review engelleyicilerinden hayalet meslektaşlara, her arketiple işe yarayan pratik stratejiler.]]></description>
            <link>https://sph.sh/tr/posts/managing-difficult-coworkers-software-engineering-teams/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/managing-difficult-coworkers-software-engineering-teams/</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[psychological-safety]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[remote-work]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[agile]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Zor meslektaşlar hakkındaki genel workplace tavsiyeleri yazılım ekiplerinde yetersiz kalır, çünkü sürtünmenin teknik kökleri vardır. Engellenen bir deployment, 47 mesajlık bir naming tartışmasına dönüşen kod review veya outage sırasında ortadan kaybolan bir takım arkadaşı; standart Kötümser, Pasif-Agresif ve Bilgiç reçetesiyle çözebileceğiniz kişilik çatışmaları değildir. Davranış; kod ownership'i, review yetkisi ve on-call baskısıyla büyür.</p>
<p>Bu uyumsuzluk, management literatürünün kapsamadığı arketipler üretir: mükemmeliyetçi engelleyici, teknik pürist, hayalet meslektaş. Her biri farklı bir karşılık ister ve bu karşılık çoğu zaman bir süreç değişikliğidir; doğrudan yüzleşme nadiren ilk adımdır.</p>
<p><strong>Yazılım Ekiplerindeki Beş Arketip</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Güvenlik Sözlüğü: Her Geliştirici Ekibinin Bilmesi Gereken 50+ Terim]]></title>
            <description><![CDATA[Ekiplerin tartıştığı authentication, token, erişim kontrolü ve Zero Trust terimleri için tanımlar, implementasyon bağlamı ve varsayılanlar.]]></description>
            <link>https://sph.sh/tr/posts/security-glossary-appendix/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/security-glossary-appendix/</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[oauth2]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Güvenlik terimlerindeki karışıklık mimari hataya dönüşür. Login'i yalnızca OAuth2 üzerine kuran bir ekip, haftalar sonra OAuth2'nin yetki verdiğini ama kimlik hakkında hiçbir şey söylemediğini fark eder. Çözüm OIDC'dir; o noktada token akışı hem client hem API tarafında yanlış kurulmuştur.</p>
<p>Aşağıdaki terimler authentication, token, erişim kontrolü ve tasarım incelemelerinde geçen Zero Trust sözlüğünü kapsıyor. Her madde tanımı, işe yarayıp yaramayacağını belirleyen implementasyon detayını ve genelde zaman kaybettiren yanlış anlamayı veriyor. Makul bir varsayılan varsa adı konuyor: yeni sistemlerde OIDC, birincil faktör olarak passkey, rotasyonlu refresh token ile kısa ömürlü access token.</p>
<p><strong>Authentication Temelleri</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Takım Çatışması Çözümü: Yüksek Performansa Giden Yol Haritası]]></title>
            <description><![CDATA[Yazılım takımlarında çatışmayı erken fark etme, yönetme ve çözme rehberi: pratik framework'ler, erken uyarı metrikleri ve sürtüşmeyi performansa çeviren kalıplar.]]></description>
            <link>https://sph.sh/tr/posts/team-conflict-resolution-field-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/team-conflict-resolution-field-guide/</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[remote-work]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[psychological-safety]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Çözümsüz kalan mimari kilitlenmeler, tırmanan code review thread'leri ve artan işten ayrılmalar aynı kök nedeni paylaşır: takımda sürtüşmeyi erken yüzeye çıkaracak ortak bir süreç ve verimli anlaşmazlığı toksik işlev bozukluğundan ayıracak bir ölçüt yoktur. Benimsenmeye değer varsayılan yaklaşım dar kapsamlı: müdahaleyi seçmeden önce çatışmayı türüne göre sınıflandırın ve bu sınıflandırmayı takımın kendi yazdığı bir çalışma anlaşmasına bağlayın.</p>
<p>Psikolojik güvenliğin olduğu bir takımda görev çatışması kararı keskinleştirir. Aynı anlaşmazlık bu güvenlik olmadan sertleşip ilişki çatışmasına dönüşür; çözmesi pahalı olan da ilişki çatışmalarıdır. Erken tespit ile yazılı bir karar framework'ü, birincinin ikinciye dönüşmesini engelleyen şeydir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[pnpm Catalogs: Monorepo'da Dependency Drift Çözümü]]></title>
            <description><![CDATA[pnpm catalog'ları monorepo'larda dependency drift'i nasıl durduruyor: paylaşılan versiyonlar için tek dosya, legacy paketler için named catalog, CI'da enforcement.]]></description>
            <link>https://sph.sh/tr/posts/pnpm-catalog-dependency-drift-solution/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/pnpm-catalog-dependency-drift-solution/</guid>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>JavaScript monorepo'larında dependency drift sessizce başlar. Bir service lodash'i ^4.17.20, diğeri ^4.17.21 olarak tanımlar; installer ikisini de kurar. Haftalar sonra ortak bir helper, hangi service'in import ettiğine göre farklı davranır ve hata beş makineden yalnızca birinde tekrarlanır.</p>
<p>pnpm catalog'ları bu açığı kaynağında kapatır. Paylaşılan her versiyon pnpm-workspace.yaml içinde bir kez tanımlanır, paketler ona catalog: ile referans verir ve bir paket versiyonu satır içinde yazdığında CI kontrolü build'i düşürür. Bedeli şu: tek bir dosya ortak bir darboğaza dönüşür. react için tam olarak istediğiniz şey budur; yalnızca tek bir service'in kullandığı bir parser için ise tam olarak istemediğiniz şeydir.</p>
<p><strong>Dependency Drift Sorunu</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Teknik RFC Nasıl Yazılır: Bölüm Bölüm Rehber]]></title>
            <description><![CDATA[Teknik RFC'ler için bölüm bölüm rehber: her parçanın neyi ortaya koyması gerektiği, değerlendiricilerin ne aradığı ve önerilerin nerede takıldığı.]]></description>
            <link>https://sph.sh/tr/posts/anatomy-of-technical-rfc/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/anatomy-of-technical-rfc/</guid>
            <category><![CDATA[rfc]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[decision-making]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Kritik bir sistem için yazılan bir RFC iki nedenden takılır: değerlendiriciler hangi problemi çözdüğünü anlayamaz ya da kendilerini ilgilendiren bölümü bulamaz. İkisi de yapısal sorundur ve ikisi de ilk inceleme yorumu gelmeden çözülebilir.</p>
<p>RFC'yi bir satış dokümanı gibi ele alın. Tek bir çözümü, öncelikleri çatışan dört kitleye satar: işi finanse eden yöneticiler, tasarımı denetleyen mimarlar, onu inşa eden uygulayıcılar ve sonrasında nöbeti tutan operasyon ekibi. Her kitle kendi cevabını dokümanın tamamını okumadan bulabilsin; cevapları da kitlelerin sorduğu sıraya koyun.</p>
<p><strong>Sırayı Kitle Belirler</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sektöre Göre Kimlik Doğrulama Stratejileri: Bankacılık, Sağlık, E-ticaret, SaaS]]></title>
            <description><![CDATA[Tek tip auth bir efsane: bankacılık, sağlık, e-ticaret ve SaaS kimlik doğrulama mimarisini birbirinden farklı biçimlendirir.]]></description>
            <link>https://sph.sh/tr/posts/authentication-authorization-strategies-by-business-domain/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/authentication-authorization-strategies-by-business-domain/</guid>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[oauth2]]></category>
            <category><![CDATA[compliance]]></category>
            <category><![CDATA[industry-trends]]></category>
            <category><![CDATA[enterprise]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Kimlik doğrulama ve yetkilendirme, iş alanına göre keskin biçimde farklılaşan dört girdinin üzerine oturur: düzenleyici kısıtlamalar, kullanıcı beklentileri, hata biçimleri ve denetim gereksinimleri. Bir bankacılık kimlik doğrulama akışı ile sosyal medya akışı aynı mekanik soruya ("bu istek iddia edilen kullanıcıdan mı geliyor?") cevap verir, ancak kabul edilebilir cevaplar oturum uzunluğu, çok faktörlü güç, kurtarma yolları ve bir kilitlemenin nasıl göründüğü noktalarında birbirinden ayrılır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Code Review Kültürü: Hatabulma'dan Bilgi Paylaşımına]]></title>
            <description><![CDATA[Code review'ları hata arama egzersizlerinden güçlü mentorluk ve öğrenme fırsatlarına nasıl dönüştürürüz. Psikolojik güvenlik yaratarak kod kalitesini artırma rehberi.]]></description>
            <link>https://sph.sh/tr/posts/code-review-culture-nitpicking-to-knowledge-sharing/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/code-review-culture-nitpicking-to-knowledge-sharing/</guid>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[organizational-culture]]></category>
            <category><![CDATA[mentorship]]></category>
            <category><![CDATA[psychological-safety]]></category>
            <category><![CDATA[knowledge-sharing]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[remote-work]]></category>
            <category><![CDATA[hiring]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Ekip retrospektiflerinde tekrar eden bir sinyal vardır: bir developer'ın kodu review için göndermek yerine iki hafta boyunca tek başına bir feature üzerinde çalışmayı tercih etmesi. Bu tercih, review kültüründe belirli bir başarısızlık moduna işaret eder.</p>
<p>Sıkı review'ların ardındaki niyet sağlamdır. Uygulama ise pull request'i çoğu zaman bir tez savunmasına çevirir; karşıda da kişinin başarılı olmasına yardım etmektense hata bulmakla ilgilenen bir kurul oturur.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GitHub Copilot ROI: Kurumsal Maliyet Analizi Çerçevesi]]></title>
            <description><![CDATA[Kurumsal ölçekte GitHub Copilot ROI'si nasıl modellenir: lisans ve inceleme maliyet kalemleri, önemli metrikler, takım büyüklüğüne göre geri ödeme ve anti-pattern'ler.]]></description>
            <link>https://sph.sh/tr/posts/copilot-to-production-cost-analysis/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/copilot-to-production-cost-analysis/</guid>
            <category><![CDATA[github-copilot]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[business-strategy]]></category>
            <category><![CDATA[code-quality]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[enterprise]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[migration]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir AI kodlama asistanının geri dönüşünü ölçmek, verimlilik-vekil metriklerini (tuş vuruşu hızı, tamamlama kabul oranı) aracın hareket ettirmesi gereken sonuçlardan (teslim döngü süresi, hata oranı, bakım maliyeti) ayırmayı gerektirir. Satıcı raporlarındaki rakamlar genellikle birinci kümedir; yatırımın kendini amorti edip etmediğini ikinci küme belirler. GitHub araştırmacılarının yürüttüğü kontrollü bir deney, dar kapsamlı bir görevde %55,8 daha hızlı tamamlanma ölçtü. Yaklaşık 5.000 yanıtlayanın teslimat sonuçlarını tarayan DORA'nın 2025 raporu ise AI benimsemesini teslimat verimiyle olumlu, teslimat kararlılığıyla hâlâ olumsuz ilişkili buluyor. İki bulgu aynı anda doğru olabilir ve bütçe tam da aradaki bu boşlukta erir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Veritabanı Query Profiling: Sistematik Optimizasyon Yolculuğu]]></title>
            <description><![CDATA[PostgreSQL ve MongoDB için sistematik profiling: gecikmeyi ve altyapı maliyetini yaratan query'ler nasıl bulunur, hangi düzeltmeler gerçekten işe yarar.]]></description>
            <link>https://sph.sh/tr/posts/database-query-profiling-100k-optimization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/database-query-profiling-100k-optimization/</guid>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Yavaş veritabanı query'leri, SaaS ürünlerinde altyapı maliyetlerinin kontrolden çıkmasının en yaygın nedenidir: 8 saniye süren ürün aramaları ve 45 saniyede yüklenen dashboard'lar semptomlar, kök neden değildir. Sunucu eklemek semptomları bastırırken faturayı büyütür. Önce profiling yapın, yalnızca profiling'in açıklayamadığı kısmı ölçekleyin. PostgreSQL tarafında bu pg<em>stat</em>statements ve EXPLAIN demek; MongoDB tarafında database profiler ve pipeline üzerinde explain planı demek.</p>
<p><strong>Çok Kiracılı Bir SaaS'ta Semptomlar</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mühendislik Takımlarında Lewis Deep Democracy: Sahte Konsensüsün Ötesinde]]></title>
            <description><![CDATA[Arnold Mindell'in Deep Democracy ilkelerinin teknik karar almayı nasıl dönüştürdüğü, psikolojik güvenlik yarattığı ve her sesin mimariyi güçlendirdiği.]]></description>
            <link>https://sph.sh/tr/posts/deep-democracy-engineering-teams/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/deep-democracy-engineering-teams/</guid>
            <category><![CDATA[psychological-safety]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[decision-making]]></category>
            <category><![CDATA[organizational-culture]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[leadership]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Oybirliğiyle alınmış gibi görünen teknik kararların arkasında çoğu zaman gerçek bir mutabakat yoktur. Sebep çoğunlukla mühendislik yetersizliğinden çok rütbe farkları ve zayıf psikolojik güvenliktir. Arnold Mindell'in Deep Democracy yaklaşımı burada işe yarar bir varsayılan sunar: muhalefeti tasarım girdisi say, kararın yanına yaz ve azınlık endişesi haklı çıktığında devreye girecek inceleme tetikleyicileri tanımla.</p>
<p><strong>Gölge Monolit</strong></p>
<p>Pek çok mimari incelemede herkes açıkça katılıyor görünür, sonra altı ay sonra kimse endişesini dile getirmediği için karar sessizce tersine döner. Sessizlik onay diye okunur ve bu okumanın doğruluğu neredeyse hiç sınanmaz.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI Kod İncelemesi ile İnsan İncelemesi: Hangisi Neyi Yakalar]]></title>
            <description><![CDATA[AI destekli kod incelemesinin neyi yakaladığı, insanların hangi alanlarda üstün kaldığı ve etkili insan-AI işbirliğinin kod incelemesinde nasıl kurulacağı.]]></description>
            <link>https://sph.sh/tr/posts/llm-code-review-ai-finds-what-humans-miss/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/llm-code-review-ai-finds-what-humans-miss/</guid>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[code-quality]]></category>
            <category><![CDATA[mentorship]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>İnsan kod incelemesi, öngörülebilir bir hata sınıfını kaçırır: tek başına bakıldığında düzgün görünen bir query builder içindeki ince SQL injection, kopyalandığı her serviste tekrarlanan aynı hatalı pattern, uzun bir haftanın sonunda atlanan güvenlik kontrolü. İnceleyiciler önlerindeki diff'e odaklanır; bu yüzden en deneyimli mühendis onaylasa bile sistemik ve kod tabanları arası sorunlar gözden kaçar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Microservislerden Modüler Monolite Geçiş]]></title>
            <description><![CDATA[Dağıtık monolitleri tanıma, stratejik servis konsolidasyonu ve karmaşıklık sürdürülemez olunca modüler monolite geri dönüşün gerçekleri.]]></description>
            <link>https://sph.sh/tr/posts/monolith-revenge-microservices-technical-debt/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/monolith-revenge-microservices-technical-debt/</guid>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Microservis mimarisi dağıtık monolit haline geldiğinde ekipler, kaçınmaya çalıştıkları sorunların tam ortasında kalır. Deployment coupling, veri tutarlılığı zorlukları ve koordinasyon yükü bunun görünen belirtileri.</p>
<p>Bu servisleri modüler monolite konsolide etmek geçerli bir mimari pattern. Yaklaşık 50 mühendis ve altındaki ekipler için makul varsayılan, ürün takımı başına iyi yapılandırılmış tek bir deployable. Bir modülü ancak ölçülebilir bir ihtiyaç operasyonel maliyeti karşıladığında servis olarak ayır.</p>
<p><strong>Sepete Ürün Eklemek 47 Servise Dokunduğunda</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Node.js'ten Go'ya AWS Lambda Geçişi: Pratik Rehber]]></title>
            <description><![CDATA[AWS Lambda'da Node.js'den Go'ya geçiş ne zaman kendini amorti eder, ne zaman etmez: karar çerçevesi, serverless Go pattern'ları ve maliyet matematiği.]]></description>
            <link>https://sph.sh/tr/posts/nodejs-to-go-serverless-migration-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/nodejs-to-go-serverless-migration-guide/</guid>
            <category><![CDATA[go]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[migration]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Serverless faturaları beklenenden hızlı büyüme eğilimindedir ve takımların ilk uzandığı kollardan biri dil seçimidir. Node.js'den Go'ya geçiş bu kolun alışılmış adayı: aynı Lambda platformunda, aynı event payload'larıyla çalışan, bellekte az yer kaplayan derlenmiş bir binary.</p>
<p>İşe yarayan varsayılan dar kapsamlı. Tek bir serviste ölçülebilir bir hacim, gecikme veya bellek maliyeti problemi yoksa Node.js'de kal; varsa yalnızca o servisi taşı. Go, mantığı basit ve trafiği yüksek handler'larda kendini amorti eder. İki yılda oturmuş karmaşık business logic servisinde ise nadiren amorti eder; kararın zor yarısı da zaten ne zaman taşımamak gerektiğini görmektir.</p>
<p><strong>Go Lambda'da Ne Zaman Mantıklı</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Moment.js Alternatifleri: Node.js Geçiş Rehberi ve Karşılaştırması]]></title>
            <description><![CDATA[Production zaman hatalarının kökleri, Moment.js'den Day.js ve date-fns'e geçiş ve her yerde UTC kullanıp dönüşümü görüntüleme sınırına bırakma.]]></description>
            <link>https://sph.sh/tr/posts/nodejs-zaman-yonetimi-zamana-hukmetmek/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/nodejs-zaman-yonetimi-zamana-hukmetmek/</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[migration]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Production sistemlerde zaman yönetimi, varsayılanların (yerel sistem saati, örtük timezone, new Date() ayrıştırması) düğümler, diller ve katmanlar arasında farklılaşması nedeniyle sessiz bir hata kaynağıdır. İstek güncel yerel bir tarih taşımasına rağmen "geçmiş tarihli işlem" hatası veren bir ödeme, genellikle istemcinin duvar saati, uygulama sunucusunun yorumu ve veritabanının saklama formatı arasında bir timezone-offset hatasıdır. Her yerde UTC kullanmak ve ofset dönüşümünü yalnızca görüntüleme sınırında yapmak bu hata sınıfını tamamen ortadan kaldırır; ancak her API, log, şema ve test fikstürü sınırında disiplin gerektirir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Metriklerin Ötesinde Observability: Sistem Hikaye Anlatıcılığı Sanatı]]></title>
            <description><![CDATA[Yeşil ışıklı dashboard'lardan, dağıtık izleme ile sistem davranışını ve iş etkisini anlatan observability sistemlerine geçişin yolu.]]></description>
            <link>https://sph.sh/tr/posts/observability-beyond-metrics-system-storytelling/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/observability-beyond-metrics-system-storytelling/</guid>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[opentelemetry]]></category>
            <category><![CDATA[incident-response]]></category>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bütün dashboard'lar yeşil, her metrik eşiğinin içinde, ama müşteriler checkout'un çalışmadığını söylüyor. Toplulaştırılmış metrikler bileşenleri tek tek anlatır; bileşenlerin arasındaki yolda yaşayan bir hata hiçbirine görünmez.</p>
<p>Distributed tracing bu boşluğu kapatır. Tek bir trace, bir isteği dokunduğu her servis boyunca takip eder ve olayların hangi sırayla gerçekleştiğini kaydeder. Varsayılan yaklaşım şu: uçtan uca enstrümente edilmiş tek bir kullanıcı yolculuğu ve her span'a iliştirilmiş iş bağlamı.</p>
<p><strong>Tek Bir Trace Neyi Gösterir</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ürün ve Teknoloji Ekipleri Arasında Derinlemesine Demokrasi: Deadline Diktatörlüğünden İşbirlikçi Teslimata]]></title>
            <description><![CDATA[Çekişmeli ürün-mühendislik ilişkilerini, muhalefeti açığa çıkaran ve burnout'u azaltan Deep Democracy prensipleriyle işbirlikçi teslimata dönüştürün.]]></description>
            <link>https://sph.sh/tr/posts/product-tech-deep-democracy/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/product-tech-deep-democracy/</guid>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[team-dynamics]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[remote-work]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[organizational-culture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Ürün ve Mühendislik aynı scope üzerinde sık sık zıt yönlere çeker. Ürün altı haftaya üç ayın feature'ını ister; Mühendisliğin tahminleri on iki hafta gösterir; toplantı, hiçbirini tatmin etmeyen bir "uzlaşma" ile biter, buggy kod sevkiyatına ve yangın söndürmeyle geçen bir sonraki çeyreğe yol açar. Eksik olan bir karar verme sistemi.</p>
<p>Bu kısır döngüden çıkan ekipler farklı bir karar süreci işletir. Buradaki varsayılan, Arnold Mindell'ın "Derinlemesine Demokrasi" yaklaşımı: grup karara bağlamadan önce muhalif olanlar dahil her ses masaya gelir. Ürün ve mühendisliğe uygulandığında sprint planlama, pazarlık olmaktan çıkıp gücün, varsayımların ve ödünleşimlerin açıkça konuşulduğu bir tasarım oturumuna dönüşür.</p>
<p><strong>Çekişmenin Faturası</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RFC'den Production'a: Implementation Hakkında Anlatmadıkları]]></title>
            <description><![CDATA[RFC tasarımlarının production'la karşılaşınca nerede saptığı, bildirim sistemi örneği üzerinden: faydalı uyarlamayı mimari sürüklenmeden ayırmanın yolu.]]></description>
            <link>https://sph.sh/tr/posts/rfc-to-production-implementation-reality/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/rfc-to-production-implementation-reality/</guid>
            <category><![CDATA[rfc]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>RFC'ler production'la temas ettikten sonra nadiren değişmeden kalır ve bu kendiliğinden bir başarısızlık sayılmaz. İncelemede temiz görünen mimari diyagramlar altı ay sonra karmaşıklaşır; timeline baskısı, eksik gereksinimler ve operasyonel gerçekler tasarımda hiç yer almayan trade-off'ları dayatır.</p>
<p>Sorunun kaynağı kötü tasarım ya da kötü mühendislik değil. Bu, iş kısıtları altında karmaşık sistem kurmanın olağan maliyeti. Asıl beceri, sinyali sürüklenmeden ayırmakta: bir boşluk, tasarımın inceleme sırasında bilemeyeceği bir gereksinimi karşılıyorsa sinyaldir; tasarıma uymak zahmetli geldiği için terk edilmişse sürüklenmedir. Bildirim sistemleri iyi bir örnek, çünkü spesifikasyonu kısa, operasyonel yüzeyi ise beklenenden geniştir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ölçeklenebilir Kullanıcı Bildirim Sistemi: Mimari ve Veritabanı Tasarımı]]></title>
            <description><![CDATA[Milyonlarca kullanıcıya hizmet veren kurumsal bildirim sistemleri için tasarım desenleri, veritabanı şemaları ve mimari kararlar]]></description>
            <link>https://sph.sh/tr/posts/user-notification-system-part-1-architecture/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/user-notification-system-part-1-architecture/</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[notifications]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[scalability]]></category>
            <category><![CDATA[enterprise]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Çok kanallı bildirim sistemleri, ekipler bunları şablon-ve-gönder pipeline'ı olarak modellediğinde başarısız olur. Bildirim aslında kullanıcı başına verilen bir yönlendirme kararıdır: e-posta, SMS, push ve uygulama içi kanallar arasında dağıtılabilir, birleştirilebilir, bastırılabilir veya ertelenebilir. Açık bir router katmanı olmadan teslim garantileri çöker, kullanıcı tercihleri göz ardı edilir ve uyumluluk denetimi imkânsız hale gelir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gerçek Zamanlı Bildirimler ve Çok Kanallı Teslimat: WebSocket, Push, Email ve Ötesi]]></title>
            <description><![CDATA[WebSocket, push bildirim, email, SMS ve webhook kanalları için üretimde test edilmiş gerçek zamanlı bildirim teslimat stratejileri]]></description>
            <link>https://sph.sh/tr/posts/user-notification-system-part-2-realtime-delivery/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/user-notification-system-part-2-realtime-delivery/</guid>
            <category><![CDATA[real-time]]></category>
            <category><![CDATA[notifications]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir bildirim sistemi aynı kişiye birbirine hiç benzemeyen kanallardan ulaşmak zorunda: dakikalarla ölçülen bir socket, iki gönderim arasında geçersizleşebilen bir push token, çoktan suppression listesine düşmüş olabilecek bir e-posta adresi.</p>
<p>WebSocket'te connection drain, push'ta token geçersizleşmesi, email'de bounce yönetimi: her mekanizmanın kendi sınırları, hata modları ve gecikme beklentisi var. WebSocket saniyenin altında teslimat isterken email için birkaç dakika kabul edilebilir. Aşağıda her kanalın teslimat desenleri ve hangi kanalın ne zaman devreye gireceğine karar veren koordinasyon katmanı var.</p>
<p><strong>WebSocket Bağlantı Yönetimi</strong></p>
<p><strong>Bağlantı Durumunu Saklamak</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ölçekte Bildirim Teslimatı Hatalarını Debug Etmek]]></title>
            <description><![CDATA[Yüksek riskli üretim ortamlarında bildirim sistemi hatalarından edinilen gerçek dünya debugging teknikleri, izleme stratejileri ve dersler]]></description>
            <link>https://sph.sh/tr/posts/user-notification-system-part-3-production-debugging/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/user-notification-system-part-3-production-debugging/</guid>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[notifications]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[incident-response]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bildirim sistemleri en kötü zamanlarda sessizce başarısız olur: yoğun yükte, bir lansman ya da kampanyanın bağımlı olduğu anda. Hoş geldin e-postaları gelmez, push timeout olur, uygulama içi alert'ler gecikir, ama dashboard'lar yeşil görünmeye devam eder, çünkü her alt-sistem izole bakıldığında sorunsuzdur.</p>
<p>İzleme sinyallerini kullanıcıya olan uzaklığına göre sırala ve kontrol etmediğin her bağımlılığın önüne bir circuit breaker koy, çünkü CPU ve memory alertleri enkazı anlatır ama hangi alt-sistemin başlattığını söylemez.</p>
<p><strong>Yoğun Trafik Altında Kademeli Hata</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bildirim Analitikleri ve Performans Optimizasyonu: A/B Testleri, Metrikler ve Ölçekte Ayarlama]]></title>
            <description><![CDATA[Milyonlarca kullanıcıya hizmet veren bildirim sistemleri için gelişmiş analitik stratejiler, A/B test framework'leri ve performans optimizasyon teknikleri]]></description>
            <link>https://sph.sh/tr/posts/user-notification-system-part-4-analytics-optimization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/user-notification-system-part-4-analytics-optimization/</guid>
            <category><![CDATA[marketing-analytics]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[notifications]]></category>
            <category><![CDATA[scalability]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bildirim sistemleri, kapsamlı analitikler, sistematik A/B testleri ve performans optimizasyonu ile temel teslimat mekanizmalarından büyüme altyapısına dönüşür.</p>
<p>Bildirim sistemleri temel işlevsellik ve kararlılığa ulaştığında, organizasyonlar yeni bir zorlukla karşılaşıyor: basit teslimat metriklerinin ötesine geçerek iş büyümesini yönlendirmek. Ürün ekipleri etkileşim oranları, optimal zamanlama ve içerik etkinliği hakkında yanıtlara ihtiyaç duyuyor. Engineering ekipleri hacim büyüdükçe performans darboğazlarıyla karşılaşıyor. Geleneksel izleme yaklaşımları, sistemlerin maliyet verimliliğini korurken milyonlarca kullanıcıyı desteklemesi gerektiğinde yetersiz kalıyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Etkili RFC Nasıl Yazılır: Mühendisler İçin Rehber]]></title>
            <description><![CDATA[RFC yapısı, stakeholder incelemesi ve teknik tartışmaları ekibin gerçekten uyduğu kararlara dönüştürme üzerine pratik rehber.]]></description>
            <link>https://sph.sh/tr/posts/writing-effective-rfcs-principal-engineer-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/writing-effective-rfcs-principal-engineer-guide/</guid>
            <category><![CDATA[rfc]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[decision-making]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[agile]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mimari anlaşmazlıklar geç ortaya çıkar: tam da feature yarı yapılmışken ve rotayı değiştirmenin maliyeti en yüksekken. Aynı karar üzerine Slack thread'leri haftalarca sürüklenir, iyi fikirler komitede ölür ve ekipler herkesin "anlaştığı" ama farklı yorumladığı sistemleri sevk eder. RFC süreci, bu tartışmayı implementasyon cevabı kilitlemeden önce ileri taşımak için vardır.</p>
<p>Etkili bir RFC dokümantasyon değildir; ekibi bir problemi sonuna kadar düşünmeye ve kalıcı bir karara varmaya zorlayan artefakttır. Biçimi organizasyon büyüklüğüne göre değişir: startup'ta bir-iki sayfa yeterken, enterprise daha fazla yapı ister. Buradaki örnek bir kullanıcı bildirim sistemi RFC'si; formatın neyi kazandırdığını da nerede tökezlediğini de aynı örnek üzerinden gösteriyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS CDK ile URL Kısaltıcı 3. Bölüm: Güvenlik ve Özel Alan Adları]]></title>
            <description><![CDATA[Custom domain, toplu işlem ve URL expiration ile production link shortener servisleri için defense-in-depth güvenlik önlemlerinin implementasyonu.]]></description>
            <link>https://sph.sh/tr/posts/aws-cdk-link-shortener-part-3/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cdk-link-shortener-part-3/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Production bir link shortener kurmak, kısa URL üretmekten fazlasını gerektirir. Meşru trafiği kaldırırken kötüye kullanımı engelleyen güvenlik önlemleri de gerekir. Link shortener'lar; zararlı içerik dağıtmak, güvenlik filtrelerini atlatmak ve phishing kampanyası yürütmek isteyen kötü niyetli aktörler için çekici hedeflerdir.</p>
<p>Modern link shortener servisleri, input validasyonu, rate limiting, authentication ve gerçek zamanlı monitoring'i birleştiren defense-in-depth koruma gerektirir. Bu yaklaşım hem servisinizi hem de kısaltılmış linklere tıklayan kullanıcıları korur.</p>
<p>1. Bölüm ve 2. Bölüm'de temel yapı ve redirect fonksiyonalitesini oluşturduk. Şimdi bir oyuncak projeyi production servisten ayıran gelişmiş özellikleri ve güvenlik önlemlerini ekleyelim.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS CDK URL Kısaltıcı Bölüm 4: Production Deployment]]></title>
            <description><![CDATA[Multi-environment deployment, ölçekte performans optimizasyonu, maliyet yönetimi ve sağlam incident response pattern'ları ile monitoring.]]></description>
            <link>https://sph.sh/tr/posts/aws-cdk-link-shortener-part-4/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cdk-link-shortener-part-4/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[cloudfront]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[testing]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Production optimizasyonu, gerçek trafik altında performansın tutmasıyla ilgilidir. Staging'de kusursuz çalışan bir infrastructure, trafik ilk kez sıçradığında ölçeklendirme darboğazlarını ortaya çıkarabilir.</p>
<p>En sık gözden kaçan nokta, database'in peak yük yerine steady-state trafiğe göre provisionlanmasıdır. Normal operasyona göre boyutlandırılmış bir DynamoDB table, kampanya veya ürün lansmanında trafik 10x arttığında darboğaza dönüşür.</p>
<p>Bölüm 1-3'te temel yapıyı, core fonksiyonları ve güvenliği kurduk. Sırada production katmanı var: environment konfigürasyonundan blue-green deployment'a kadar.</p>
<p><strong>Dört Deployment Ortamı</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS CDK URL Shortener Part 5: Ölçeklendirme ve Uzun Vadeli Bakım]]></title>
            <description><![CDATA[Multi-region deployment, veritabanı ölçeklendirme, felaket kurtarma ve production sistemleri için uzun vadeli bakım kalıpları.]]></description>
            <link>https://sph.sh/tr/posts/aws-cdk-link-shortener-part-5/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cdk-link-shortener-part-5/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[scalability]]></category>
            <category><![CDATA[technical-debt]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Tek bölgede çalışan bir CDK link shortener, trafik coğrafyalara yayıldıkça gecikme ve erişilebilirlik sorunları göstermeye başlar. DynamoDB tablosu da tek hata noktasına dönüşür. Multi-region replikasyon ve bir disaster recovery planı olmadan, tek bir bölgesel kesinti redirect servisinin tamamını devre dışı bırakır. Tercih edilmesi gereken varsayılan kurulum şu: global bir CloudFront dağıtımının arkasında DynamoDB Global Tables ve bir bölge tamamen düştüğünde devreye giren Route 53 failover yönlendirmesi.</p>
<p>1. Bölümde, link shortener altyapısının temelini kurmuştuk. Bu bölüm onu global ölçeğe taşıyor ve çalışır durumda tutan operasyonel katmanı ekliyor: kapasite planlaması, yedekleme otomasyonu ve uzun ömürlü bir sistemin biriktirdiği teknik borcun bakımı.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS API Gateway ve CDK ile API Versiyonlama Rehberi]]></title>
            <description><![CDATA[AWS API Gateway ve CDK ile yol tabanlı API versiyonlama: versiyon başına yaşam döngüsü kaydı, ayrı Lambda handler'ları, keşif endpoint'i ve sunset sinyalleri.]]></description>
            <link>https://sph.sh/tr/posts/api-versioning-aws-cdk-complete-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/api-versioning-aws-cdk-complete-guide/</guid>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Yol tabanlı versiyonlama (/v1/users, /v2/users) ve versiyon başına tutulan açık bir yaşam döngüsü kaydı, API Gateway üzerinde tercih edilmesi gereken varsayılan yaklaşımdır. Sürekli değişen tek bir endpoint'e göre daha fazla altyapı maliyeti getirir; buna karşılık sizin takviminize göre güncelleme yapamayan istemcilerle birlikte ayakta kalan yaklaşım budur.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Auth0 vs Firebase Auth vs Cognito vs Supabase Auth: Hangisini Seçmeli?]]></title>
            <description><![CDATA[Auth0, Firebase Auth, Supabase Auth, AWS Cognito ve özel JWT: hangisi varsayılan olmalı, fiyat modelleri nasıl ayrışıyor, hangi tuzaklara hazırlıklı olmalı.]]></description>
            <link>https://sph.sh/tr/posts/auth-providers-mobile-web-api-comparison/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/auth-providers-mobile-web-api-comparison/</guid>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[cloud-providers]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Kimlik doğrulama sağlayıcısı seçimi; geliştirme hızını, uyumluluk tavanını ve aylık faturayı yıllarca belirler. Sonradan sağlayıcı değiştirmek, bir ürünün göze alabileceği en riskli geçişlerden biridir. Başlangıç için doğru varsayılan, ana platformunuza zaten yerleşik olan yönetilen sağlayıcıdır: mobil öncelikli tüketici uygulamaları için Firebase Auth, PostgreSQL tabanlı ürünler için Supabase Auth, AWS-native serverless yığınlar içinde Cognito, SAML/SSO ve uyumluluk belgeleri sözleşme şartı olduğunda Auth0. Özel JWT bir öğrenme alıştırması olarak kalır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Auth0 ile Çoklu Audience: Micro Frontend'lerde Token Yönetimi]]></title>
            <description><![CDATA[Micro frontend'lerde Auth0 multi-audience authentication: token yönetim stratejileri ve React Native'de WebView tabanlı uygulamalarla silent authentication.]]></description>
            <link>https://sph.sh/tr/posts/auth0-multi-audience-micro-frontends-token-management/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/auth0-multi-audience-micro-frontends-token-management/</guid>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[oauth2]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Auth0 access token'ı tek bir audience taşır. Üç ayrı API ile konuşan bir micro frontend kümesi bu yüzden üç token'a ihtiyaç duyar ve kısıtın ilk okunuşu "üç kez login" der. Gerek yok. Auth0 session'ını shell application'da tek noktada tutun. Shell, bu session'ı istendiğinde audience başına access token'a çevirir ve token'ları origin'i doğrulanmış bir postMessage kanalıyla micro frontend'lere dağıtır. Diğer düzenlemeler (micro frontend başına ayrı Auth0 application, ince taneli scope'larla tek geniş audience, sunucu tarafında token değişimi) daha pahalıya mal olur ve daha azını verir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Native'de Auth0 Oturum Yönetimi ve Biyometrik Giriş]]></title>
            <description><![CDATA[Production React Native uygulamalarında Auth0, biyometrik kimlik doğrulama ve doğru token yaşam döngüsü ile güvenli oturum yönetimi için adım adım kılavuz.]]></description>
            <link>https://sph.sh/tr/posts/auth0-react-native-session-management-biometrics/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/auth0-react-native-session-management-biometrics/</guid>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mobil uygulamalarda oturum yönetimi, web geliştiricilerinin nadiren karşılaştığı zorluklar çıkarır. Bir mobil uygulama; arka plan durumlarını, ağ kesintilerini, biyometrik kimlik doğrulamayı ve platforma özgü güvenlik kısıtlamalarını, kullanıcı deneyimini bozmadan yönetmek zorundadır. React Native tarafında ayakta kalan varsayılan şu: refresh token rotasyonunu Auth0 tenant'ına bırakın, token'ları Keychain veya Keystore içinde biyometrik kapının arkasında tutun ve 401'e tepki vermek yerine süre dolmadan yenileyin.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS CDK Link Kısaltıcı Bölüm 1: Proje Kurulumu & Temel Altyapı]]></title>
            <description><![CDATA[AWS CDK, DynamoDB ve Lambda ile production-grade link kısaltıcı kurulumu. Mimari kararlar, proje yapısı ve ölçekte ayakta kalan şema seçimleri.]]></description>
            <link>https://sph.sh/tr/posts/aws-cdk-link-shortener-part-1/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cdk-link-shortener-part-1/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>AWS üzerinde link kısaltıcı yapmak; yönlendirme gecikmesi, URL doğrulama ve link bazlı analitik zorunlu hale gelene kadar kolay görünür. Aylık milyonlarca yönlendirmede her mimari karar (depolama motoru, caching katmanı, CDN konumu) hem maliyeti hem de kuyruk gecikmesini doğrudan etkiler.</p>
<p>Sağlam duran varsayılan şu: tek bir DynamoDB tablosu, her rota için ayrı ve küçük birer Lambda, yönlendirme yolunun önünde CloudFront. Proje yapısını ve tablo şemasını ilk günden doğru kurarsanız serinin sonraki bölümleri migration değil ekleme olur. Yönlendirme döngüleri, kötü niyetli URL'ler ve kötüye kullanım trafiği de sonraya bırakılacak başlıklar değil: create handler'ın yazmadan önce neyi doğrulayacağını bunlar belirler.</p>
<p><strong>Mimariye Genel Bakış</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS CDK Link Kısaltıcı Bölüm 2: Temel Fonksiyonlar & API Geliştirme]]></title>
            <description><![CDATA[Yönlendirme motoru, analytics toplama ve API Gateway yapılandırması: günlük milyonlarca yönlendirme için performans optimizasyonları ve debugging stratejileri.]]></description>
            <link>https://sph.sh/tr/posts/aws-cdk-link-shortener-part-2/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-cdk-link-shortener-part-2/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[marketing-analytics]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[debugging]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir link kısaltıcı aslında bir redirect motorudur. Kısa kod araması ve HTTP 301 yanıtı, kritik gecikme bütçesindeki tek işlemlerdir; her ikisinin de yüksek eşzamanlılıkta bile kullanıcının anlık algıladığı eşiğin (yaklaşık 200ms) altında kalması gerekir. Bu sıcak yolun etrafındaki iş mantığı (analitik, hız sınırlama, link süresinin dolması, özel slug'lar) redirect'i engellememelidir; redirect handler'a eklenen her özelliğin bedeli doğrudan gecikme olarak ödenir.</p>
<p>Bu serinin Bölüm 1'i temeli kurdu (DynamoDB tablosu, API Gateway, temel Lambda). Sıra çekirdek işlevsellikte: DynamoDB cache'li redirect Lambda'sı, kısa kod oluşturma ve yönetme API'si, yan kanal üzerinden analitik olay yayını ve upstream servisler bozulduğunda redirect'i hızlı tutan hata yönetimi desenleri.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Fargate 101: Serverless Container Nedir, Nasıl Çalışır?]]></title>
            <description><![CDATA[AWS Fargate'e pratik bir rehber: task definition, awsvpc network modu, maliyet dengesi ve serverless container'ların ne zaman mantıklı olduğu.]]></description>
            <link>https://sph.sh/tr/posts/aws-fargate-101-serverless-containers/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-fargate-101-serverless-containers/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[fargate]]></category>
            <category><![CDATA[ecs]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>EC2 üzerinde container çalıştırmak; OS yamalarını, cluster kapasitesini ve host düzeyindeki hataları yönetmek demektir. Bu iş, uygulama karmaşıklığıyla değil, host sayısıyla birlikte büyür. AWS Fargate bu katmanı ortadan kaldırır: AWS'ye bir container image'ı ile CPU/bellek çiftini verirsiniz, task'ı hiç giriş yapmayacağınız bir altyapıda çalıştırır.</p>
<p>Yeni container workload'ları için makul varsayılan Fargate'tir. Hesaplama birimi başına daha fazla ödersiniz, karşılığında host bakımını tamamen bırakırsınız. Bu takasın ters döndüğü durumlar bellidir: GPU iş yükleri, privileged container'lar ve Reserved Instance ya da Spot'un zaten ucuzlattığı sürekli yüksek kullanım. Kararın büyük kısmı, workload'un bu çizginin hangi tarafında durduğunu görmekten ibaret.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Fargate Production Pattern'leri: Maliyet, İzleme, Blue-Green]]></title>
            <description><![CDATA[Production workload'ları çalıştırırken öğrenilen gelişmiş Fargate pattern'leri. Maliyet optimizasyonundan stateful container'lara, dokümantasyonun size söylemeyecekleri.]]></description>
            <link>https://sph.sh/tr/posts/aws-fargate-102-advanced-patterns/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-fargate-102-advanced-patterns/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[fargate]]></category>
            <category><![CDATA[ecs]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Fargate 101'de temelleri ele aldık. Aşağıdaki pattern'ler, o temelden sonra bozulan şeylerden geliyor: fatura, Fargate'in sizden sakladığı altyapı katmanı ve geri dönüş yolu olması gereken deployment'lar. Sırasıyla maliyet optimizasyonu, stateful container'lar, monitoring ve blue-green deployment.</p>
<p><strong>Maliyet Optimizasyonu</strong></p>
<p>Fargate'in aynı compute için EC2'den daha pahalı olduğunu söylemiştik. Bu farkın büyük kısmını dört kaldıraç kapatır: Spot kapasite, right-sizing, ARM ve Savings Plans.</p>
<p><strong>Kesintiye Dayanıklı İşler için Fargate Spot</strong></p>
<p>Fargate Spot %70'e varan tasarruf sağlar; karşılığında AWS container'larınızı 2 dakikalık uyarıyla sonlandırabilir. Kulağa riskli gelse de, doğru kurgulandığında birçok workload için sorunsuz çalışır.<...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Fargate Sorun Giderme: ENI Limitleri, Timeout, Debugging]]></title>
            <description><![CDATA[Yeşil dashboard'ların gizlediği Fargate arızaları: ENI kotasının tükenmesi, subnet route sorunları, memory leak'ler ve her birini bulan kontroller.]]></description>
            <link>https://sph.sh/tr/posts/aws-fargate-103-production-lessons/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-fargate-103-production-lessons/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[fargate]]></category>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[incident-response]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[monitoring]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Fargate, ENI limitleri, memory leak'ler ve subnet tükenmesi gibi kaynak kısıtlarını yeşil dashboard'ların arkasında gizler; ta ki bir trafik artışı bunları görmezden gelmenin imkânsız hâle getirdiği ana kadar. Bu arızaların ortak bir örüntüsü var: temel neden standart CloudWatch metrikleriyle görünmez, bu yüzden task'lar yanıltıcı hatalarla takılır ya da çöker. Vakaların çoğunu beş arıza biçimi açıklar ve her birinin dakikalar içinde sonuç veren bir kontrolü vardır.</p>
<p>Bu serinin önceki bölümleri (101, 102) temelleri ve gelişmiş pattern'leri ele aldı. Serideki bir sonraki bölüm olan 104 Infrastructure-as-Code deployment pattern'lerini kapsar.</p>
<p><strong>ENI Tükenmesi</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Fargate Deploy Etmek: CDK vs Terraform vs SAM]]></title>
            <description><![CDATA[Fargate'i farklı IaC araçlarıyla nasıl etkin şekilde deploy edersiniz. Pratik pattern'ler, yaygın tuzaklar ve her yaklaşım için en iyi çalışan yöntemler.]]></description>
            <link>https://sph.sh/tr/posts/aws-fargate-104-iac-deep-dive/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-fargate-104-iac-deep-dive/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[fargate]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[terraform]]></category>
            <category><![CDATA[aws-sam]]></category>
            <category><![CDATA[infrastructure-as-code]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Fargate servislerini CDK, Terraform veya SAM ile deploy etmek çalışan bir altyapı üretir; ancak yanlış araç seçimi her yeni servisle katlanarak büyüyen bir bakım yükü yaratır. Yalnızca AWS üzerinde yaşayacak yeni bir servis için varsayılan CDK'dır: üst düzey construct'ları düzinelerce CloudFormation kaynağını birkaç satıra indirir. Terraform'a geçmek, aynı değişim yüzeyini birden fazla ekip paylaştığında ya da ikinci bir bulut ihtimali gerçekçiyse anlam kazanır. SAM ise ancak Fargate, Lambda'nın yanında küçük bir ayrıntı kaldığında uygundur.</p>
<p>Aradaki fark ilk deployment'ta pek görünmez. Bir yıl sonra görünür: bir değişiklik nasıl inceleniyor, drift nasıl fark ediliyor ve her yeni servis kaç satır koda mal oluyor.</p>
<p><strong>Fargate için IaC Araç Karşılaştırması</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda Cold Start Optimizasyonu: Production Dersleri]]></title>
            <description><![CDATA[Production ortamlarından öğrenilen AWS Lambda cold start optimizasyon stratejileri. Runtime seçimi, provisioned concurrency ve pratik optimizasyon teknikleri.]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-guide-101-cold-start-optimization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-guide-101-cold-start-optimization/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[cold-start]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Cold start gecikmesinin faturasını kullanıcı öder. İnteraktif bir API'nin arkasındaki bir Lambda function'ında en ucuz kazançlar üç yerden gelir: seçtiğin runtime, deployment package boyutu ve handler çalışmadan önce initialization kodunun yaptığı iş. Önce bu üçüyle uğraş.</p>
<p>Provisioned concurrency, kapsadığı isteklerin üstünden init maliyetini alır; latency SLA'i olan bir checkout endpoint'i için doğru cevap da budur. Provisioned sayısını aşan trafik on-demand environment'lara taşar ve orada yine cold start'a yakalanabilir; yani scaling policy en az rezervasyon kadar önemli. Yalnız faturayı, devreye almadan önce hesap yapmayı gerektirecek kadar değiştiriyor.</p>
<p><strong>Cold Start'ın Bedeli Nerede Ödenir</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda Memory Allocation ve Performance Tuning: Kapsamlı Rehber]]></title>
            <description><![CDATA[AWS Lambda performance tuning: memory-CPU modeli, Power Tuning ile benchmarking, maliyet analizi ve adaptive allocation pattern'ları.]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-guide-102-memory-performance-tuning/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-guide-102-memory-performance-tuning/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Serinin ilk bölümünde cold start'ları optimize ettikten sonra, sıradaki zorluk Lambda function'larınızın warm olduklarında verimli çalışmasını sağlamak. Memory allocation, etki alanı en geniş konfigürasyon ayarı; tek bir değer aynı anda CPU payını, execution süresini ve faturayı belirliyor.</p>
<p>Pratik varsayılan: 1024 MB ile başlayın, sonra yalnızca ölçülmüş bir eğrinin gösterdiği yöne doğru hareket edin. 128 MB varsayılanı hesaplama yapan hiçbir function için doğru değil; doğrudan 3008 MB'ye sıçrama refleksi ise çoğunlukla tek thread'li kodun harcayamayacağı bir kapasite satın alır.</p>
<p>Memory boyutu yalnızca bir girdi. Taşımaya değer model şu: ayrılan memory, onunla birlikte gelen CPU ve ikisinden doğan GB-saniye faturası.</p>
<p><strong>Lambda'nın Memory-CPU Modeli</strong></p>...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda Production Monitoring ve Debugging: Kanıtlanmış Stratejiler]]></title>
            <description><![CDATA[AWS Lambda'yı production için enstrümente edin: CloudWatch custom metrics, X-Ray tracing, structured logging ve business etkisini izleyen alert'ler.]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-guide-103-production-monitoring-debugging/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-guide-103-production-monitoring-debugging/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[observability]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Lambda function'ları production'da sessizce başarısız olur; varsayılan CloudWatch metrikleri, cold-start gürültüsü ve eksik distributed trace'ler bir araya geldiğinde kök nedeni gizler. Yapılandırılmış bir observability stratejisi olmadan debugging, veri odaklı analizden baskı altında tahmine kayar. Çoğu Lambda iş yükünde işe yarayan kurulum küçüktür: business sonuçlarına bağlanmış custom metrikler, X-Ray active tracing ve her satırında request ID taşıyan JSON log'lar.</p>
<p>Bu üç sinyal farklı işleri görür. Metrikler bir şeyin bozulduğunu, trace'ler nerede bozulduğunu, log'lar ise nedenini söyler. Birini eksik bıraktığınızda diğer ikisi en kötü anda ortaya çıkan bir boşluk bırakır: hata log'lamadan timeout'a düşen bir ödeme handler'ı ya da hiçbir alarmı tetiklemeyen bir retry fırtınas...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda Maliyet Optimizasyonu: VPC, Layers ve Advanced Pattern'ler]]></title>
            <description><![CDATA[Advanced AWS Lambda pattern'leri ve maliyet optimizasyonu: Lambda Layers, VPC konfigürasyonu, cross-account execution ve mimari kararlar.]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-guide-104-advanced-patterns-cost-optimization/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-guide-104-advanced-patterns-cost-optimization/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[vpc]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[migration]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Serverless faturaları ilk ayda kimseyi şaşırtmaz. Ölçek büyüdükçe şaşırtır. Fazla ayrılmış memory, boşta duran provisioned concurrency ve monolitik bir handler aynı invocation sayısını her ay yeniden çarpar; Lambda'nın invocation başına fiyatlandırması bu üç hatayı yapması ucuz, taşıması pahalı hale getirir.</p>
<p>Birkaç düzine function'dan sonra sorular değişir. Cold start'ı bozmadan dependency nasıl paylaşılır, VPC bağlantısı ne zaman maliyetine değer, hesaplar arası erişim nasıl güvenli kurulur ve fatura aslında nereye gider? Son sorunun yanıtı gösterişsiz: başka hiçbir şeye dokunmadan önce memory ve concurrency ayarlarını CloudWatch verisiyle denetleyin, çünkü konfigürasyon kayması genellikle kod seviyesindeki optimizasyonun kazandırdığından fazlasına mal olur.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Middy Alternatifleri: Özel AWS Lambda Middleware Framework'ü Geliştirme]]></title>
            <description><![CDATA[Bir Lambda filosu Middy'nin statik middleware modelini ne zaman aşar, projeye özel bir motor istek başına konfigürasyonu nasıl çözer, bakımı neye mal olur]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-middleware-middy-custom-framework/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-middleware-middy-custom-framework/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[middleware]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[migration]]></category>
            <category><![CDATA[production]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Middy, küçük bir Lambda filosunun tipik middleware ihtiyaçlarını karşılar ama jenerik middleware-zinciri modelinin dengeleri, bir servis ortak bir middleware yığınını paylaşan yaklaşık 50 fonksiyona ulaştığında ölçülebilir hale gelir: çağrı başına ek yük, middleware zincirinin cold-start maliyeti ve ortak bir wrapper'ın başka türlü bağlantısız fonksiyonlar arasında yarattığı kenetlenme. Bu ölçekte soru şuna döner: Middy'nin soyutlamaları üzerine katmanlamaya devam mı edilir, AWS Lambda Powertools ile değiştirilir mi, yoksa yalnızca filonun gerçekten kullandığı hook'lar için ödeme yapan projeye özel bir middleware framework'ü mü yazılır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda Middleware ile Middy - Temiz Kod ve En İyi Uygulamalar]]></title>
            <description><![CDATA[Middy'nin middleware kalıplarıyla Lambda geliştirmesini nasıl dönüştürdüğünü, tekrarlayan şablonlardan temiz, sürdürülebilir serverless fonksiyonlara geçişi keşfedin]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-middleware-middy-introduction/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-middleware-middy-introduction/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[middleware]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Lambda handler'ları zamanla aynı girişi biriktirir: JSON body'yi parse et, doğrula, hataları yakala, CORS ve güvenlik header'larını ekle. Her endpoint bunu yeniden yazar ve her kopya bir öncekinden biraz uzaklaşır.</p>
<p>Middy, API Gateway arkasındaki Node.js handler'ları için makul bir varsayılan. Handler'ı birbirine geçen middleware katmanlarıyla sarar; parse, doğrulama, hata biçimlendirme ve header'lar tek bir ortak zincirde toplanır, her fonksiyonda yeniden yazılmaz. Bedeli fazladan bir bağımlılık ve bir miktar cold start yükü, bu yüzden bazı fonksiyon tipleri Middy'siz daha iyi çalışır.</p>
<p><strong>Middy Nedir?</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda Performans Optimizasyonu: 10ms Altı Gecikme]]></title>
            <description><![CDATA[Runtime seçimi, connection reuse, bundle disiplini, caching ve memory ayarıyla AWS Lambda warm path gecikmesini 10 ms bütçesinin içinde tutun.]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-millisecond-optimization-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-millisecond-optimization-guide/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[go]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[redis]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Latency-kritik Lambda iş yükleri warm path'te kazanılır ya da kaybedilir. Dikkat çeken şey cold start olsa da, bir isteği tek haneli milisaniyede yanıtlayan fonksiyon aslında üç sorunun cevabıdır: handler'ı hangi runtime yüklüyor, invocation başına kaç network handshake yapılıyor ve fonksiyona ne kadar memory verilmiş.</p>
<p>Başlangıç için varsayılan: hot path'te derlenen bir runtime, handler dışında oluşturulan client'lar, arkada DynamoDB veya ElastiCache ve tahminle değil AWS Lambda Power Tuning ile seçilen memory. Node.js de aynı aralığa inebilir; ama bunun için bundle disiplini çok daha sıkı olmalı.</p>
<p><strong>Milisaniyeler Nereye Gidiyor</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[S3 Presigned URL ile Büyük Dosya Yükleme: Lambda ve CDK]]></title>
            <description><![CDATA[Lambda proxy yerine S3 presigned URL ile büyük dosya yükleme: eksiksiz CDK stack, iki handler, tarayıcı tarafı ve güvenlik ödünleşimleri.]]></description>
            <link>https://sph.sh/tr/posts/aws-lambda-s3-signed-urls-large-file-uploads/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-lambda-s3-signed-urls-large-file-uploads/</guid>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Dosya yüklemelerini Lambda üzerinden geçirmek ilk akla gelen tasarımdır ve dosyalar büyüyene kadar da iş görür. API Gateway bir REST API isteğinin gövdesini 10 MB, Lambda ise senkron çağrı payload'ını 6 MB ile sınırlar; dolayısıyla 2 GB'lık bir video fonksiyona hiç ulaşmaz. Payload sınırın altında kaldığında bile transfer sürdüğü her saniye için Lambda faturalanır.</p>
<p>Birkaç megabaytın üzerindeki dosyalarda daha iyi varsayılan S3 presigned URL'dir. Lambda bir URL imzalayıp döner, client byte'ları doğrudan S3'e PUT eder, nesne yerine oturunca S3 event notification bir işleme fonksiyonunu uyandırır. Bedeli şudur: Lambda'nın akış sırasında uyguladığı kontroller (dosya tipi, boyut limiti, virüs taraması) ya imzalama anına ya da sonraki event handler'a taşınmak zorundadır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda ve TypeScript: Production İçin En İyi Uygulamalar]]></title>
            <description><![CDATA[AWS Lambda, API Gateway ve TypeScript ile production-ready serverless projeleri oluşturmanın en iyi uygulamaları, maliyet ve performans ipuçları.]]></description>
            <link>https://sph.sh/tr/posts/aws-serverless-typescript-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/aws-serverless-typescript-guide/</guid>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>EC2 üzerinde çalışan geleneksel bir Express.js API'si sabit maliyet, öngörülebilir ölçeklendirme ve %99.9 uptime sunar. Lambda'ya geçiş kararı genellikle belirli bir uyumsuzluktan doğar: ayda bir kez, 10 dakikadan kısa sürede 50.000 webhook işlemesi gereken bir özellik.</p>
<p>Aylık 10 dakikalık bir yoğunluk için EC2 instance'larını 7/24 çalışır tutmak israftır; Lambda bu boşta bekleme maliyetini ortadan kaldırır. Karşılığında farklı bir hata kümesi getirir: hesap genelinde geçerli bir concurrency limiti, kritik yol üzerindeki cold start'lar ve dikkatsiz tek bir DynamoDB Scan'inin çevresindeki tüm compute'tan pahalıya geldiği bir faturalama modeli.</p>
<p><strong>Serverless'a Yaygın İtirazlar</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mühendislik Ekiplerinde Bus Factor: Bilgi Riski Nasıl Azaltılır]]></title>
            <description><![CDATA[Bilgi dağıtımı, dokümantasyon stratejileri ve sistematik risk yönetimi ile ekibinizi tek hata noktalarından nasıl koruyacağınızı öğrenin.]]></description>
            <link>https://sph.sh/tr/posts/bus-factor-knowledge-management-engineering-teams/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/bus-factor-knowledge-management-engineering-teams/</guid>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[knowledge-sharing]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[engineering-culture]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[mentorship]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir sisteme dair kritik bilgi tek bir kişinin kafasında toplandığında o kişi tek hata noktasına dönüşür. İşte bus factor riski budur. Asıl can yakan kısım bu bilginin çoğu zaman yazıya dökülmemiş olmasıdır. Ödeme akışları, dolandırıcılık tespitinin incelikleri ve herkesin güvendiği deploy adımları mühendisle birlikte kapıdan çıkar; toparlanma ise tam bir olay patlak verdiği anda yavaşlar. Kritik yollardan başlayın: önce onları belgeleyin, sonra bu dokümantasyonu sistemi kurmamış birine verip nerede takıldığına bakın.</p>
<p><strong>Kazara Oluşan Tek Hata Noktası</strong></p>
<p>"Bus factor" ekip dayanıklılığını ölçmenin biraz karamsar bir yolu: Projeniz sürdürülemez hale gelmeden önce kaç kişinin ayrılması gerekir? Bu sayı bir ise konumunuz tehlikelidir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Circuit Breaker Pattern: Zincirleme Hataları Önleyen Dayanıklı Mikroservisler]]></title>
            <description><![CDATA[TypeScript ile Circuit Breaker pattern implementasyonu: üç state, P99'a göre timeout ayarı ve bağımlılık tipine göre eşik değerleri]]></description>
            <link>https://sph.sh/tr/posts/circuit-breaker-pattern-resilient-microservices/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/circuit-breaker-pattern-resilient-microservices/</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Yavaş bir bağımlılık, çökmüş olandan daha tehlikelidir: 30 saniye timeout bekleyen request'ler thread pool'ları tüketir ve hatayı sağlıklı servisler üzerinden upstream'e yayar. Bir kapsama mekanizması olmadan, tek bir degraded downstream çağrısı tüm dağıtık sistemi saniyeler içinde doyurabilir. Circuit Breaker pattern'i bu hatayı üç state ve iki sayıyla kapsama alır: request timeout'u ve breaker'ı trip eden error rate. En kritik olanı timeout: client kütüphanesinin varsayılan değeri yerine P99 latency'nizin iki-üç katı. Böyle ayarlandığında breaker, thread pool tükenmeden önce trip eder.</p>
<p><strong>Problem: Yavaş Yanıt Veren Bağımlılıkların Bedeli</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Lambda, EventBridge ve DynamoDB ile CQRS]]></title>
            <description><![CDATA[AWS Lambda, EventBridge ve DynamoDB ile pratik bir CQRS uygulaması; event sourcing, eventual consistency ve dağıtık sistemde debug yöntemleri.]]></description>
            <link>https://sph.sh/tr/posts/cqrs-pattern-serverless-nodejs/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/cqrs-pattern-serverless-nodejs/</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[nodejs]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>CQRS (Command Query Responsibility Segregation), yazma işlemlerini (commands) okuma işlemlerinden (queries) ayıran bir mimari pattern'dir. Aynı modeli iki iş için birden kullanmak yerine her taraf kendi işine uygun bir şekil alır: yazma tarafı doğrular ve saklar, okuma tarafı soruları hızlıca yanıtlar.</p>
<p>Ayrımı, iki iş yükünün şekli gerçekten farklıysa yap: 10:1 veya daha yüksek okuma-yazma oranı, farklı gecikme bütçeleri ya da yazma için optimize edilmiş bir şemanın karşılayamadığı query pattern'leri. Aşağıdaki kurulum her taraf için ayrı bir DynamoDB tablosu, her yol için ayrı bir Lambda fonksiyonu ve read model'i güncel tutan event'leri taşıyan EventBridge kullanıyor. Okuma ile yazma birbirine benziyorsa pattern yalnızca hareketli parça ekler.</p>
<p><strong>Temel Prensip</stron...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Veritabanı Nasıl Seçilir: SQL, NoSQL, NewSQL ve Edge Karşılaştırması]]></title>
            <description><![CDATA[SQL, NoSQL, NewSQL ve edge seçenekleri arasında doğru veritabanını seçme rehberi: her kategorinin trade-off'ları, seçim kriterleri ve bir karar çerçevesi.]]></description>
            <link>https://sph.sh/tr/posts/database-selection-comprehensive-guide/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/database-selection-comprehensive-guide/</guid>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[redis]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[scalability]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir iş yükü için yanlış veritabanı motoru seçmek, ilerleyen süreçte pahalı migration'lara zemin hazırlar: MongoDB üzerinde 1.000 kayıtla sorunsuz çalışan bir ürün kataloğu, doğru şema ve index tasarımı olmadan 100.000 kayıtta tüm koleksiyon taramalarına dönüşebilir. Sorunun kökeni veri modeli ile erişim örüntüsü arasındaki uyumsuzluktur, veritabanının kendisi değil. SQL, NoSQL, NewSQL ve edge veritabanı kategorilerinin her biri, ilk migration zorunlu hale gelmeden doğru seçime yön veren somut trade-off'lar taşır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dead Letter Queue Stratejileri: Dayanıklı Olay-Güdümlü Sistemler için Production-Ready Kalıplar]]></title>
            <description><![CDATA[Event-driven sistemler için production-ready DLQ kalıpları: monitoring, circuit breaker, exponential backoff, recovery ve kaçınılması gereken anti-pattern'lar.]]></description>
            <link>https://sph.sh/tr/posts/dead-letter-queue-production-strategies/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/dead-letter-queue-production-strategies/</guid>
            <category><![CDATA[cloud-providers]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[monitoring]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Dead Letter Queue, bir tüketicinin retry bütçesini tükettikten sonra işleyemediği mesajları tutan kuyruktur. DLQ olmadan bir poison pill ya birincil kuyruğu baştan (head-of-line) tıkar ya da başarısız handler ile birlikte sessizce kaybolur; her iki sonuçta da hem event hem de bir şeylerin yanlış gittiğine dair operasyonel sinyal kaybedilir. DLQ, "işlenecek mesajlar" ile "insan ya da tool müdahalesi gerektiren mesajlar" arasındaki görev ayrımıdır ve yalnızca etrafındaki retry politikası, uyarı ve replay araçları birlikte tasarlandığında işe yarar.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Altyapı Olarak Dokümantasyon: Mühendislik Takımlarında Bilgiyi Ölçeklendirme]]></title>
            <description><![CDATA[Dokümantasyon borcu takımları teknik borçtan hızlı yavaşlatır. Dokümantasyonu kritik altyapı gibi ele alıp mühendislik takımlarında bilgiyi ölçeklendirme rehberi.]]></description>
            <link>https://sph.sh/tr/posts/documentation-as-infrastructure-scaling-knowledge/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/documentation-as-infrastructure-scaling-knowledge/</guid>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[rfc]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[knowledge-sharing]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[organizational-design]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Dokümantasyon borcu, mühendislik takımlarını yanlış kişi ayrılana kadar fark edilmeyen şekillerde yavaşlatır. Maliyet bir ödeme olayında, bir migration'da ya da bir denetimde ortaya çıkar: yazılı prosedür mevcuttur ama derin sistem anlayışı yoktur. O anı atlatan dokümantasyonun üç katmanı vardır: RFC ve ADR olarak yakalanan kararlar, sistemlerin kendisinden türetilen sistem referansı ve gerçek örneklerle yazılmış süreç dokümanları. Geri kalan her şey, bu üç katmanı güncel tutan araçlar ve inceleme alışkanlıklarıdır.</p>
<p><strong>Wiki Mezarlıkları ve README Ruleti</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kafka vs SQS vs EventBridge: Hangisini Seçmeli?]]></title>
            <description><![CDATA[Olay güdümlü araçlara derin bakış: Kafka, SQS ve EventBridge, mesaj teslimat kalıpları, DLQ stratejileri ve bunların AWS, Azure, GCP karşılıkları.]]></description>
            <link>https://sph.sh/tr/posts/event-driven-systems-tools-comparison/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/event-driven-systems-tools-comparison/</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[cloud-providers]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[edge-computing]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[sns]]></category>
            <category><![CDATA[sqs]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Olay güdümlü araç seçimi hype'tan çok üç şekilden birine oturtmakla ilgili: kuyruk, fan-out topic ya da router. O şekil için bulutunuzun zaten sunduğu yönetilen servisle başlayın. Kafka'ya ancak event replay, partition bazlı sıralama ya da yönetilen kuyruk kotasının karşılamadığı bir hacim gerektiğinde geçin.</p>
<p>Kararın geri kalanı teslimat garantilerine, mesaj boyutu limitlerine ve kimsenin işleyemediği bir mesaja ne olacağına bakar.</p>
<p><strong>Mesaj Kalıpları: Üç Temel Şekil</strong></p>
<p>Her pattern farklı araçlar ve trade-off'lar getirir:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Frontend Build Araçları Tarihi: jQuery, Grunt, Bower]]></title>
            <description><![CDATA[Webpack'ten önce dosyaları Grunt ile birleştirir, jQuery spagettisiyle boğuşurduk. Frontend tooling'in manuel dosya yönetiminden build sistemlerine evrimi.]]></description>
            <link>https://sph.sh/tr/posts/frontend-tooling-evolution-101-the-early-web-era/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/frontend-tooling-evolution-101-the-early-web-era/</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Frontend tooling, birleştir-ve-minify problemi olarak başladı: elle yönetilen script sırası, deploy için shell script'leri ve manuel sürecin aşılmasıyla gelen ilk task runner dalgası (Make, sonra Grunt, sonra Gulp). Bu erken tooling üzerindeki baskı build hızından değil, bağımlılık sıralaması ve tarayıcılar arası uyumluluktan geliyordu: yüklenen bir site ile sessiz JavaScript hataları üreten bir site arasındaki fark.</p>
<p>Hikâye, elle yazılmış script'lerin ve tarayıcıya özel hack'lerin build öncesi döneminde (1995-2006) başlıyor; jQuery'nin bir uyumluluk katmanı olarak gelişiyle devam ediyor ve 2012'de Bower'la, yani frontend tarafındaki ilk ciddi paket yönetimi denemesiyle bitiyor.</p>
<p><strong>jQuery Öncesi Karanlık Çağ (1995-2006)</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Grunt vs Gulp vs Webpack: Modern Bundling Nasıl Doğdu]]></title>
            <description><![CDATA[Grunt'ın build automation'ı nasıl dönüştürdüğü ve webpack'in dependency anlayışını nasıl değiştirdiği: manuel süreçlerden modern bundling'e zorlu geçiş.]]></description>
            <link>https://sph.sh/tr/posts/frontend-tooling-evolution-102-task-runners-and-bundlers/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/frontend-tooling-evolution-102-task-runners-and-bundlers/</guid>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[webpack]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Manuel shell-script build pipeline'ları makineden makineye sessiz sedasız bozulur, kabile bilgisi biriktirir ve anlayan tek developer ayrıldığında çöker. Belgelenmemiş build hataları deployment'ları bloke eder ve toolchain'in kendisini bir risk kaynağına dönüştürür. Grunt buna declarative task otomasyonuyla yanıt verdi, Gulp ise configuration bloklarının yerine code stream'leri koydu. Browserify ve webpack de modeli task orchestration'dan dependency-graph bundling'e taşıdı.</p>
<p>Grunt bu ortama net bir ilerleme olarak girdi. İlk kez takımların elinde, karmaşık projeleri handle edecek kadar configure edilebilirken sıkıcı ve hata eğilimli işleri otomatize eden bir tool vardı.</p>
<p><strong>Grunt Devrimi (2012-2015)</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[esbuild, SWC ve Vite: Native Araçlar Webpack'in Yerini Neden Aldı]]></title>
            <description><![CDATA[esbuild, SWC ve Vite gibi native tool'ların webpack'in hız sorunlarını nasıl çözdüğü: build süreleri saniyelerden milisaniyelere böyle indi.]]></description>
            <link>https://sph.sh/tr/posts/frontend-tooling-evolution-103-performance-revolution/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/frontend-tooling-evolution-103-performance-revolution/</guid>
            <category><![CDATA[esbuild]]></category>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[vite]]></category>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[go]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[webpack]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>webpack gibi JavaScript tabanlı bundler'lar sert bir performans tavanına çarptı: single-threaded çalışma, dosya başına AST parsing ve garbage collection duraklarıyla büyük React uygulamalarında production build'leri 60 saniyeyi aştı. Yavaş feedback döngüleri developer odağını kırıyor ve her merge'de CI maliyetlerini şişiriyor. esbuild, SWC ve Vite bu tavanı, kritik yolu native derlenmiş koda taşıyarak aştı.</p>
<p>Zorluklar takımlar büyüdükçe arttı. Build zamanları her şey için darboğaz haline geldi: local development, CI/CD pipeline'ları ve deployment processleri. Geliştirme takımları kod yazmaktan çok build beklemekle vakit geçiriyordu.</p>
<p>Frontend tooling'deki performans devrimini ateşleyen baskı buydu: JavaScript tabanlı tool'lardan native derlenmiş olanlara doğru bir kayış.</p>...</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gelecek Manzarası: Edge Computing ve Ötesi]]></title>
            <description><![CDATA[Edge computing, AI-destekli development ve platform entegrasyonunun frontend tooling'de neyi değiştirdiği ve hangi vaatlerini yayımlanmış rakamların desteklemediği.]]></description>
            <link>https://sph.sh/tr/posts/frontend-tooling-evolution-104-the-future-landscape/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/frontend-tooling-evolution-104-the-future-landscape/</guid>
            <category><![CDATA[edge-computing]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[cloudflare]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[industry-trends]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Frontend build tooling, bundler hızının artık geliştirici deneyimini sınırlayan asıl etken olmadığı bir eşiği geçti; sıradaki sınır, build tooling'in kodun nerede ve nasıl çalışacağıyla nasıl etkileşeceği. Edge runtime'lar, deployment platformları ve framework seviyesindeki temel yapılar (React Server Components, streaming SSR, partial hydration), build boru hattını artık bundler'ın kendisi kadar etkiliyor. "Build" ile "deploy" arasındaki sınır, tek bir sunucuyu değil bir runtime kümesini hedefleyen tek bir boru hattına dönüşüyor.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Git Branching Stratejileri: Farklı Takımlar ve Ürünler için Gerçek Dünya Dersleri]]></title>
            <description><![CDATA[Git branching stratejilerinin takım büyüklüğü, ürün tipi ve release temposuyla eşleşmesi. Varsayılan GitHub Flow; başka bir model yükünü ne zaman hak eder?]]></description>
            <link>https://sph.sh/tr/posts/git-branching-strategies-real-world/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/git-branching-strategies-real-world/</guid>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[team-management]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[deployment]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Takım büyüklüğüne ve release temposuna uymayan bir Git dallanma stratejisi seçmek koordinasyon yükü, kırılan main branch'ler ve tıkanan deployment'lar doğurur. Takım büyüdükçe bu uyumsuzluk katlanır: üç geliştirici için ayarlanmış bir strateji yirmi beşte gereksiz sürtüşme yaratır, tersi de geçerlidir. Takımların çoğu için doğru varsayılan GitHub Flow'dur: kısa feature branch'ler, tek bir pull request kapısı, main'e merge. Kalan dört model ise yükünü yalnızca belirli bir kısıt altında hak eder: sürekli deploy, QA onay kapıları, environment programları ya da compliance audit trail'leri.</p>
<p><strong>Sahada Kullanılan Beş Model</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google Closure Compiler: Mirası, Dersler ve Modern Alternatifler]]></title>
            <description><![CDATA[Google'ın 2009'da çıkardığı Closure Compiler'ın modern web araçlarını nasıl şekillendirdiğini ve bugünkü build araçlarına kalıcı etkisini inceliyoruz.]]></description>
            <link>https://sph.sh/tr/posts/google-closure-compiler-legacy-modern-web-development/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/google-closure-compiler-legacy-modern-web-development/</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[cloud-providers]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[webpack]]></category>
            <category><![CDATA[esbuild]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[technical-debt]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Google'ın Closure Compiler'ı 2009'da JavaScript'e tüm program kapsamında statik analizi getirdi: dosyalar arası dead code elimination ve JSDoc tabanlı type checking. Bu, webpack, esbuild ya da TypeScript bu yetenekleri yaygınlaştırmadan yıllar önceydi. Bu kökenin farkında olmayan ekipler aynı fikirleri sık sık yeniden keşfediyor ve yeni araçlara atfediyor.</p>
<p><strong>2009'da Tüm Program Kapsamında Analiz</strong></p>
<p><strong>Gelişmiş Dead Code Elimination</strong></p>
<p>Closure Compiler fonksiyon çağrılarını tüm codebase'iniz boyunca takip ediyor, hiçbir yerden referans verilmeyen kodu tamamen kaldırıyordu. Dönemin diğer araçları boşluk kaldırmak ve değişken yeniden adlandırmakla yetiniyordu:</p>
<p>[code block]</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mermaid Diyagram Tipleri: Her Grafik Türü için Örnekler]]></title>
            <description><![CDATA[Her Mermaid diyagram tipi için kopyalanmaya hazır örnek: akış şemaları, sıralı ve sınıf diyagramları, ER modelleri, Gantt grafikleri ve daha fazlası]]></description>
            <link>https://sph.sh/tr/posts/mermaid-diagram-showcase/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mermaid-diagram-showcase/</guid>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mermaid, düz metni diyagrama çevirir; böylece bir şema, belgelediği kodun yanında durabilir. Aşağıdaki her diyagram tipi, kopyalayıp uyarlayabileceğiniz çalışan bir örnekle geliyor. Diyagramı tam ekran açmak için üzerine tıklayın.</p>
<p><strong>1. Akış Şeması - Süreç Akışı Görselleştirme</strong></p>
<p>Akış şemaları süreçleri, karar ağaçlarını ve sistem akışlarını görselleştirmek için mükemmeldir.</p>
<p>Aşağıdaki stilli düğümler tek nötr dolgu (#1e293b) kullanır ve anlamı stroke renginde taşır; bu, yoğun bir diyagramı koyu zeminde okunur tutar.</p>
<p>[code block]</p>
<p><strong>2. Sıralı Diyagram - Etkileşim Zaman Çizelgesi</strong></p>
<p>API çağrıları, kullanıcı etkileşimleri ve sistem iletişimlerini belgelemek için mükemmel.</p>
<p>[code block]</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Micro Frontend'ler: İleri Düzey Pattern'ler, Performans ve Production Dersleri]]></title>
            <description><![CDATA[Micro frontend'lerde ileri düzey kalıplar: event sourcing ile paylaşımlı state, bundle bütçeleri, cross-app hata takibi, imzalı mesajlaşma ve strangler-fig geçişi.]]></description>
            <link>https://sph.sh/tr/posts/micro-frontends-advanced-patterns-debugging/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/micro-frontends-advanced-patterns-debugging/</guid>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[state-management]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Micro Frontend Serisi Navigasyonu</strong></p>
<p>- <strong>Kısım 1</strong>: Mimari temelleri ve uygulama türleri
- <strong>Kısım 2</strong>: Module Federation, iletişim kalıpları ve entegrasyon stratejileri
- <strong>Kısım 3 (Burada bulunuyorsunuz)</strong>: İleri düzey kalıplar, performans optimizasyonu ve production hata ayıklama</p>
<p><strong>Ön Koşullar</strong>: Kısım 1 temelleri ve Kısım 2 uygulama kalıpları.</p>
<p>---</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Micro Frontend Mimarisi Temelleri: Modern Web Uygulamaları İçin Eksiksiz Rehber]]></title>
            <description><![CDATA[Micro frontend kompozisyon stratejileri karşılaştırması: sunucu tarafı, build-zamanı, Module Federation ve iframe; ayrıca takasın karşılığını veren ekip ön koşulları.]]></description>
            <link>https://sph.sh/tr/posts/micro-frontends-architecture-fundamentals/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/micro-frontends-architecture-fundamentals/</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Micro frontend mimarileri, tek sayfalı bir frontend'i bağımsız olarak deploy edilebilen, bağımsız olarak sahiplenilen ve runtime'da birleşen dilimlere böler. Belirli bir dizi sorunu çözerler (ekip büyüklüğü ölçeklendirme, bağımsız sürüm temposu, teknoloji esnekliği) ve buna karşılık yeni bir dizi problem getirirler (runtime kompozisyon karmaşıklığı, paylaşılan bağımlılık yönetimi, dilimler arası state, dilimler arası performans). Benimseme kararı nadiren net bir kazançtır; koordinasyon yükünü sürüm bağımsızlığıyla değiş tokuş eder ve bu takas yalnızca belirli ekip büyüklüklerinde ve ürün yapısı sınırlarında kendini amorti eder.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Micro Frontend Uygulama Pattern'leri: Pratik Rehber]]></title>
            <description><![CDATA[Module Federation kurulumu, micro frontend'ler arası iletişim, routing stratejileri ve bölünmüş routing'i yük altında bozan yarış durumları.]]></description>
            <link>https://sph.sh/tr/posts/micro-frontends-implementation-patterns/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/micro-frontends-implementation-patterns/</guid>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[webpack]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Micro Frontend Serisi Navigasyonu</strong></p>
<p>- <strong>Bölüm 1</strong>: Mimari temelleri ve uygulama türleri
- <strong>Bölüm 2 (Şu anda buradasınız)</strong>: Module Federation, iletişim pattern'leri ve entegrasyon stratejileri
- <strong>Bölüm 3</strong>: İleri düzey pattern'ler, performans optimizasyonu ve production hata ayıklama</p>
<p><strong>Ön Koşullar</strong>: Aşağıdaki bölümler Bölüm 1'deki kavramları veri kabul eder. Micro frontend'lere yeniyseniz, önce oradan başlayın.</p>
<p>---</p>
<p>Bölüm 1 micro frontend'ler için temel mimari pattern'leri ele aldı. Module Federation, runtime entegrasyonunda baskın yaklaşımdır ve asıl pratik iş onun kurulumunda, etrafındaki iletişim pattern'lerinde ve production sistemlerinin gerektirdiği hata ayıklama stratejilerinde yatar....</p><p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Node.js'te Factory ve DI Yerine Saf Fonksiyonlar]]></title>
            <description><![CDATA[Lambda biçimli bir Node.js servisinde factory, service katmanı ve DI container'ı çoğu zaman fazladır. Yerlerine ne geçer, sınıflar nerede yerini korur?]]></description>
            <link>https://sph.sh/tr/posts/microservices-to-serverless-functions-nodejs/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/microservices-to-serverless-functions-nodejs/</guid>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir Node.js ödeme servisinde tek bir validation kuralını değiştirmek, kural bir factory'nin, bir dependency injection container'ının ve her biri tek implementasyonu olan bir yığın interface'in arkasında duruyorsa yarım günü yiyebilir. Maliyet, yapmak istediğiniz değişiklik ile o değişikliğin durduğu dosya arasındaki mesafedir. Xia ve arkadaşları bu zamanın nereye gittiğini IEEE Transactions on Software Engineering için yürüttükleri saha çalışmasında ölçtü: yedi proje, 79 profesyonel geliştirici, 3.244 çalışma saati. Kodu anlamak çalışma gününün %57,62'sini, dosyalar arasında gezinmek %23,96'sını, düzenleme ise %5,02'sini aldı.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Çapraz Platform Micro Frontend'lerde Re.Pack ve Rspack]]></title>
            <description><![CDATA[React Native ve WebView'lar ile mobil micro frontend'ler oluşturma. Çok kanallı uygulamalar için production stratejileri ve performans optimizasyonu.]]></description>
            <link>https://sph.sh/tr/posts/mobile-micro-frontends-multi-channel-production/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mobile-micro-frontends-multi-channel-production/</guid>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[re-pack]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[rspack]]></category>
            <category><![CDATA[vite]]></category>
            <category><![CDATA[mobile]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mobil öncelikli micro frontend mimarileri, ikinci bir kanalla (web, desktop) karşılaştıklarında değişmeden nadiren ayakta kalır. Mimariyi mobilde çalıştıran varsayımlar (WebView yaşam döngüsü, native köprü, native gesture'lar, kanal başına asset bundle'ları) ya web ve desktop'a hiç eşlenmez ya da kodu paylaşmanın amacını ortadan kaldıran bir performans maliyetine eşlenir. Gerçek çok kanallı micro frontend'ler (mobil, web, desktop Electron) sadece "bir kez yaz, her yere deploy et" değil, bir runtime soyutlama katmanı ve kanala özel kod yollarında bir disiplin gerektirir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mobil Micro Frontend'ler: React Native, Expo ve WebView'lar]]></title>
            <description><![CDATA[React Native ve Expo WebView'lar ile mobil micro frontend mimarisi oluşturma. Gerçek dünya örnekleri ve en iyi uygulamalar.]]></description>
            <link>https://sph.sh/tr/posts/mobile-micro-frontends-react-native-expo-webviews/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mobile-micro-frontends-react-native-expo-webviews/</guid>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[re-pack]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[rspack]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mobil takımlar giderek yaygınlaşan bir sorunla karşılaşır: her birinin kendi deployment döngüleri ve teknoloji stack'leri olan farklı takımlardan web tabanlı servisleri entegre etmek. Sıkı teslimat zaman dilimleri bu karmaşıklığı artırır; web takımları mobil entegrasyon için geliştirmelerini durduramaz.</p>
<p>Buradaki varsayılan yaklaşım, her web uygulamasını kendi WebView'ında barındıran native bir React Native kabuğu. Her web takımı kendi bundler'ını ve release temposunu korur. Bunun bedeli mobil tarafta ödenir: bellek baskısı, bundle boyutu ve elle yazmanız gereken navigasyon kodu.</p>
<p><strong>Mobil Micro Frontend Serisi</strong></p>
<p>Bu, mobil micro frontend serisinin <strong>1. Bölümü</strong>:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Native WebView İletişimi: postMessage Bridge Pattern'leri]]></title>
            <description><![CDATA[WebView-native iletişim pattern'leri: mesaj geçişi, servis entegrasyonu ve çalışan kodla tipli bir request-response bridge'i.]]></description>
            <link>https://sph.sh/tr/posts/mobile-micro-frontends-webview-communication-patterns/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/mobile-micro-frontends-webview-communication-patterns/</guid>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[build-tools]]></category>
            <category><![CDATA[re-pack]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[rspack]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Mobil micro frontend'lerde WebView-native iletişimi üç somut biçimde bozulur: mesajlar sırasız gelir, TypeScript tipleri web ve native tarafta ayrışır, WebView içindeki JavaScript istisnaları native crash reporter'larda stack trace bırakmaz. Yapılandırılmış bir bridge katmanı yoksa bu hatalar birbirini besler; mesaj geçişindeki bir race condition, ödeme onaylarını veya auth token'larını sessizce yutabilir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Node.js'te Monolitten Mikroservislere Geçiş Rehberi]]></title>
            <description><![CDATA[Node.js monolitlerini event-driven serverless fonksiyonlara ayrıştırma rehberi: migrasyon stratejileri, sınır kararları ve mimari kalıplar.]]></description>
            <link>https://sph.sh/tr/posts/monolith-to-microservices-nodejs-evolution/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/monolith-to-microservices-nodejs-evolution/</guid>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Monolitlerin Sürdürülemezliği</strong></p>
<p>Node.js monolitleri öngörülebilir biçimde bozulur. Tek bir ortak deployment sınırı, yavaş bir domain'in tüm release döngüsünü bloke etmesine izin verir; yoğun trafikte tek bir feature'da çıkan arıza aynı process'teki diğer her şeyi de birlikte götürür. Mimari çözüm monoliti yeniden düzenlemek değil; onu bağımsız olarak deploy edilebilen, event-driven fonksiyonlara ayrıştırmaktır.</p>
<p>Sonucu sınırlar belirler. Sınırları, kodun gerçekte nasıl değiştiğine ve nerede birlikte bozulduğuna bakarak seçin; bölme sürerken sistemi release edilebilir tutun. Böylece migrasyon her adımda geri alınabilir kalır.</p>
<p><strong>Monolit Nasıl Büyüdü</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Multi-Account AWS Mimarisi: Ölçeklenebilir Event-Driven Sistemler]]></title>
            <description><![CDATA[Dayanıklı event-driven sistemler için multi-account AWS pattern'leri: hesap yapısı, EventBridge routing ve servisler arası iletişim.]]></description>
            <link>https://sph.sh/tr/posts/multi-account-aws-event-driven-architecture/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/multi-account-aws-event-driven-architecture/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[eventbridge]]></category>
            <category><![CDATA[multi-account]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[iam]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Single-Account Mimarisinin Sınırları</strong></p>
<p>Multi-account AWS mimarisi, organizasyonlar belirli ölçek ve karmaşıklık eşiklerine ulaştığında gerekli hale gelir. Varsayılan olarak benimsenmeye değer yapı şu: servis takımı başına bir hesap, aralarında paylaşılan bir EventBridge bus'ı ve merkezi bir orchestrator yerine event choreography.</p>
<p>Dokuz geliştirme takımının aynı AWS hesabına deploy ettiği çok servisli bir platform düşünün. Bu yaklaşım küçük organizasyonlarda işe yarar, ancak ölçek arttıkça kritik sorunlar üretir.</p>
<p><strong>Yaygın Single-Account Anti-Pattern'leri</strong></p>
<p>Birden fazla takımın aynı AWS hesabını paylaşması kaynak çakışmalarına, güvenlik sorunlarına ve operasyonel karmaşıklığa yol açar. Örnek bir anti-pattern konfigürasyonu:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Native Uygulamalarda OpenTelemetry ve Firebase ile Gözlemlenebilirlik]]></title>
            <description><![CDATA[React Native uygulamalarında OpenTelemetry ve Firebase kullanarak kapsamlı gözlemlenebilirlik kurma. Tracing, metrics ve logging en iyi uygulamaları.]]></description>
            <link>https://sph.sh/tr/posts/opentelemetry-react-native-firebase-observability/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/opentelemetry-react-native-firebase-observability/</guid>
            <category><![CDATA[cloud-providers]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[opentelemetry]]></category>
            <category><![CDATA[react-native]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Birçok React Native ekibi production görünürlüğü olmadan yayına çıkar. Yerel ortamda bir türlü tekrarlanamayan çökmeler, arkasında zamanlama verisi bulunmayan performans şikayetleri, belirtiyi anlatan ama uygulamanın o anki durumunu anlatmayan destek kayıtları.</p>
<p>İşe yarayan varsayılan şu: uygulamanın içinde OpenTelemetry JavaScript SDK, OTLP üzerinden kendi işlettiğiniz bir collector'a export, ikinci sinyal olarak da Firebase Performance ve Crashlytics. Vendor SDK'ları daha hızlı kurulur; collector ise backend değiştirmenizi yeni bir sürüm yayınlamadan mümkün kılar ve APM kimlik bilgilerinin uygulama paketine girmesini engeller.</p>
<p><strong>Mobil Gözlemlenebilirlik Gereksinimleri</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Axios vs Fetch vs Undici: Node.js HTTP Client Karşılaştırması]]></title>
            <description><![CDATA[Node.js sunucudan sunucuya çağrılarda neden varsayılan undici olmalı, Axios, native fetch ve Effect ne zaman daha doğru tercih]]></description>
            <link>https://sph.sh/tr/posts/server-side-http-clients-comparison/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/server-side-http-clients-comparison/</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[http]]></category>
            <category><![CDATA[functional-programming]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[production]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Node.js sunucudan sunucuya çağrılar için HTTP client seçimi nadiren tek seferlik bir karar olur: native fetch, Axios, undici ve Effect, bağlantı baskısı, retry fırtınaları ve kısmi başarısızlıklar karşısında birbirinden farklı davranır. Gününü başka servisleri çağırarak geçiren bir servis için varsayılan tercih undici'dir. Kendi connection pool'unu yönetir, timeout'ları açıktır ve native fetch'in zaten üzerinde koştuğu motorun ta kendisidir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Framework mi AWS CDK mi? Geçiş Yapmalı mısınız? (Bölüm 1)]]></title>
            <description><![CDATA[Serverless Framework'ten AWS CDK'ya geçiş rehberinin ilk bölümü. Neden geçiş yapmalı, temel kavramlar ve ilk adımlar.]]></description>
            <link>https://sph.sh/tr/posts/serverless-to-cdk-migration-part-1/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-to-cdk-migration-part-1/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[migration]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Serverless Framework ve AWS CDK, örtüşen sorunları farklı felsefelerle çözer. Serverless Framework, Lambda merkezli bir deploy birimi üzerinde YAML güdümlü, sağlayıcıdan bağımsız bir soyutlamadır; CDK ise CloudFormation üzerinde tip güvenli, AWS-native bir sentez katmanıdır. Serverless Framework ücretli lisans modeline geçtiğinde, olduğun yerde kalmak artık bedelsiz varsayılan olmaktan çıktı ve karşılaştırmayı yeniden yapmak anlamlı hale geldi.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Framework'ten AWS CDK'ya Geçiş: Bölüm 2 - CDK Environment'ınızı Kurma]]></title>
            <description><![CDATA[Serverless uygulamalar için CDK projesini yapılandırın, Lambda için TypeScript'i ayarlayın ve Serverless Framework'ten geçişi kolaylaştıran pattern'leri kurun.]]></description>
            <link>https://sph.sh/tr/posts/serverless-to-cdk-migration-part-2/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-to-cdk-migration-part-2/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Tek bir geliştirici için işe yarayan bir CDK projesi, ekiple buluşunca nadiren ayakta kalır. Çoğu tutorial'daki düz, tek stack'li yapı; birden fazla mühendis aynı anda farklı environment'larda Lambda fonksiyonu deploy etmeye başlayınca çöker. Paylaşılan stack'ler merge conflict üretir, ownership bulanıklaşır ve yeni bir dosyanın nereye gideceği konusunda kimse anlaşamaz.</p>
<p>Çözüm, iş birimlerini birbirinden yalıtan bir proje yapısı: mühendisler paralel ilerlerken Serverless Framework kullanıcılarının zaten bildiği konvansiyonlar korunur. Serverless Framework'ten CDK'ya geçen ekipler için, ilk migration'dan production platformuna kadar ölçeklenen yapı budur.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Framework'ten AWS CDK'ya Geçiş: Bölüm 3 - Lambda Fonksiyonları ve API Gateway]]></title>
            <description><![CDATA[Lambda fonksiyonlarını ve API Gateway konfigürasyonlarını CDK'ya taşıma: bundling optimizasyonu, memory ayarı, hata yönetimi pattern'leri.]]></description>
            <link>https://sph.sh/tr/posts/serverless-to-cdk-migration-part-3/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-to-cdk-migration-part-3/</guid>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[migration]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Lambda fonksiyonları ve API Gateway konfigürasyonları, migration karmaşıklığının yoğunlaştığı yerdir. YAML'dan TypeScript'e geçiş mekanik bir iş gibi görünür; ta ki bundling, memory boyutlandırma ve hata yönetimi ayrı birer karara dönüşene kadar.</p>
<p>İşe yarayan yaklaşım tek bir ortak NodejsFunction construct'ıdır: runtime, architecture, memory, tracing ve bundling varsayılanları tek yerde durur, farklı davranması gereken fonksiyonlar için her prop override edilebilir kalır. API Gateway tarafında da aynı yöntem geçerlidir; validator'lar, authorizer'lar ve integration response'lar bir kez tanımlanıp route'lar arasında yeniden kullanılır.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Framework'ten AWS CDK'ya Geçiş: Bölüm 4 - Veritabanı ve Ortam Yönetimi]]></title>
            <description><![CDATA[Stateful infrastructure'ı CDK'ya taşıma: DynamoDB migration, secrets management, parameter store ve VPC konfigürasyonu.]]></description>
            <link>https://sph.sh/tr/posts/serverless-to-cdk-migration-part-4/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-to-cdk-migration-part-4/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[migration]]></category>
            <category><![CDATA[secrets-management]]></category>
            <category><![CDATA[data-storage-orm]]></category>
            <category><![CDATA[vpc]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir CDK migration'ında en yüksek risk database ve environment tarafındadır. Stateless Lambda fonksiyonlarının aksine bu bileşenler uygulamanın kalıcı durumunu ve konfigürasyonunu tutar. Yanlış bir adım tabloyu siler, veri kaybettirir veya staging'i hiçbir hata mesajı vermeden production key'ine bağlar.</p>
<p>Güvenli yol dar. Bir tabloyu import etmeden önce var olduğunu doğrulayın, environment değerlerini eksik key durumunda synth'i başarısız kılan type-safe bir builder'dan üretin ve her secret'ı tek bir stage'e kilitleyin. Aşağıdaki bölümler bu varsayılanı DynamoDB import'larına, Parameter Store'a, Secrets Manager'a ve VPC'ye bağlı fonksiyonlara uygular.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Framework'ten AWS CDK'ya Geçiş: Bölüm 5 - Authentication, Authorization ve IAM]]></title>
            <description><![CDATA[Serverless Framework'ten AWS CDK'ya geçerken Cognito ile güçlü kimlik doğrulama, API Gateway authorizer'lar ve ince taneli IAM politikaları uygulama.]]></description>
            <link>https://sph.sh/tr/posts/serverless-to-cdk-migration-part-5/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-to-cdk-migration-part-5/</guid>
            <category><![CDATA[authorization]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[iam]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Serverless Framework'ten AWS CDK'ya authentication ve authorization migrasyonu, genellikle birikmiş bir güvenlik borcunu ortaya çıkarır: organik büyüyen ve hiç gözden geçirilmemiş izinler ve authorization logic'i.</p>
<p>Yaygın pattern'lar arasında aşırı geniş IAM izinleri olan fonksiyonlar, multiple custom authorizer'lara dağılmış authorization logic'i ve erişim kontrol kararları için yetersiz audit trail'ler bulunur. Bu sorunlar migration değerlendirmeleri sırasında belirgin hale gelir ve compliance gereksinimlerini önemli ölçüde etkileyebilir.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Framework'ten AWS CDK'ya Geçiş: Bölüm 6 - Migration Stratejileri]]></title>
            <description><![CDATA[Serverless Framework'ten AWS CDK'ya geçişi planlayın: blue-green deployment, rollback prosedürleri, altyapı testleri ve performans ayarı.]]></description>
            <link>https://sph.sh/tr/posts/serverless-to-cdk-migration-part-6/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/serverless-to-cdk-migration-part-6/</guid>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir CDK migrasyonunun son aşamasında mesele, üretilen altyapının doğruluğu değildir. Mesele, geçiş anındaki operasyonel hazırlıktır: trafiği almak için bir plan, migrasyon production'ı bozarsa geri dönmek için bir plan ve canlı yük altında ortaya çıkan drift'i gidermek için bir plan. Onlarca Lambda fonksiyonu ve birden fazla DynamoDB tablosu içeren bir migrasyonda geçiş planı, migrasyon kodunun kendisinden daha büyüktür.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[DynamoDB Toolbox Rehberi: TypeScript Single-Table Tasarımı]]></title>
            <description><![CDATA[Raw AWS SDK karmaşıklığından üretime hazır single-table tasarımına. Pratik DynamoDB Toolbox desenleri, yaygın tuzaklar ve ölçeklenen mimari kararları.]]></description>
            <link>https://sph.sh/tr/posts/streamline-dynamodb-toolbox-serverless-typescript/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/streamline-dynamodb-toolbox-serverless-typescript/</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Raw DynamoDB SDK call'ları ile serverless API'lerin inşası önemli bakım yükü yaratır. Binlerce satır AttributeValue mapping'i, onlarca dağınık UpdateExpression string'i ve sıfır type safety kırılgan sistemlere yol açar. Schema değişiklikleri yanlışlıkla kullanıcı kayıtlarını bozduğunda, daha iyi bir yaklaşımın gerekli olduğu açık hale gelir.</p>
<p>Burada varsayılan olarak DynamoDB Toolbox'a uzanmak mantıklı. Kütüphane table'ı tipli entity tanımlarıyla sarar; key üretimi, default'lar ve marshalling artık her çağrı noktasında elle yazılmaz. İşin çoğu üç yerde toplanır: entity tasarımı, iş kurallarını üstlenen bir servis katmanı ve raw SDK'dan kademeli geçiş.</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Native'de Feature Flag: Stale-While-Revalidate Deseni]]></title>
            <description><![CDATA[Senkron feature flag yüklemesi checkout'u neden tıkar ve stale-while-revalidate cache React Native'de flag'leri arka planda tazeleyerek nasıl anında sunar.]]></description>
            <link>https://sph.sh/tr/posts/swr-style-feature-flags-react-native/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/swr-style-feature-flags-react-native/</guid>
            <category><![CDATA[feature-flags]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[state-management]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Feature flag'ler checkout akışının kritik yolunda durur; bu yüzden onları nasıl yüklediğiniz bir erişilebilirlik kararıdır. Senkron bir API çağrısı her render'a bir ağ gidiş dönüşü ekler. Cold start koşullarında bu gidiş dönüş saniyelere uzar, checkout timeout'a düşer ve kullanıcı sepeti terk eder. Stale-while-revalidate okumayı kritik yoldan çıkarır: cache'deki değer anında döner, taze değer arka planda çekilir. Cache'i varsayılan cevap, ağı ise bir arka plan tazelemesi olarak görün; asla bir kapı olarak değil.</p>
<p><strong>Senkron Flag Yüklemesinin Bedeli</strong></p>
<p>Temel bir flag implementasyonu her değere ihtiyaç duyulduğunda senkron API çağrısı yapar:</p>
<p>[code block]</p>
<p>Bu kurulumdan dört arıza biçimi doğar:</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Holakrasi vs Team Topologies: Takım Otonomisi Modelleri Karşılaştırması]]></title>
            <description><![CDATA[Holakrasi, Spotify modeli ve Team Topologies'den yararlanarak kaos yaratmadan takım otonomisini artırmak için pratik yapılar ve korumalar.]]></description>
            <link>https://sph.sh/tr/posts/team-autonomy-structures/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/team-autonomy-structures/</guid>
            <category><![CDATA[organizational-design]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[dora-metrics]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Liderliğin "takımlara daha çok otonomi veriyoruz" açıklaması her zaman karışık tepkilerle karşılanır, çünkü sınırları olmayan otonomi genelde çözdüğünden çok problem yaratır.</p>
<p>Senaryo tanıdıktır. Matriks proje takımlarından ürün moduna, akışa-hizalanmış takımlara geçiş hız kazanımı üretir; yanında istenmeyen sonuçları da getirir: daha fazla defekt, tekrarlanan çaba, takımların birbirinin ayağına basması.</p>
<p>Burada uygulanabilir varsayılan Team Topologies. Takım tiplerini ve etkileşim modlarını çerçeve olarak alın; sonra Holakrasi'den rol tüzüklerini, Spotify modelinden uygulama topluluklarının dilini ödünç alın. Bağlam değişir; ancak bu birleşim yeniden yapılanmanın deneme-yanılma maliyetini düşürür.</p>
<p><strong>Otonominin Tanımı</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kapsamlı Markdown Tipografi Rehberi]]></title>
            <description><![CDATA[Markdown'ın tüm tipografi ve formatlama öğeleri: başlıklardan tablolara, dipnotlardan tanım listelerine ve uyarı kutularına kadar.]]></description>
            <link>https://sph.sh/tr/posts/typography/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/typography/</guid>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Markdown işlemcileri başlıklar, listeler ve kod bloklarında hemfikir. Bunun ötesinde destek dağılır: dipnotlar, tanım listeleri, katlanabilir bölümler ve uyarı kutuları render motoruna göre farklı davranır. Aşağıdaki bölümler her özelliği kaynak sözdizimiyle birlikte gösterir; bir özelliğe güvenmeden önce kendi render motorunuzda çalışıp çalışmadığını görebilirsiniz.</p>
<p><strong>Başlıklar</strong></p>
<p><strong>Başlık 1 Stili (H1 = Yazı Başlığı)</strong>
<strong>Başlık 2 (H2)</strong>
<strong>Başlık 3 (H3)</strong>
<strong>Başlık 4 (H4)</strong>
<strong>Başlık 5 (H5)</strong>
<strong>Başlık 6 (H6)</strong></p>
<p><strong>Metin Formatlaması</strong></p>
<p><strong>Temel Formatlama</strong></p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zod + OpenAPI + AWS Lambda: CDK ile Şema Öncelikli API Geliştirme]]></title>
            <description><![CDATA[Lambda API'si ile OpenAPI sözleşmesini senkron tutmak için spec'i Zod şemalarından üretin ve bu üretimi CDK dağıtımına bağlayın.]]></description>
            <link>https://sph.sh/tr/posts/zod-openapi-aws-lambda-cdk/</link>
            <guid isPermaLink="true">https://sph.sh/tr/posts/zod-openapi-aws-lambda-cdk/</guid>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[aws-cdk]]></category>
            <category><![CDATA[lambda]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[zod]]></category>
            <dc:creator><![CDATA[sph.sh]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Bir Lambda API'si ile OpenAPI spec'i ayrı ayrı bakıldığında şema kayması kaçınılmazdır. Zod doğrulamasına eklenen bir alan, istemcilerin kod ürettiği sözleşmeden sessizce düşer ve aşağı yöndeki tüketiciler uyarı almadan bozulur. Çözüm tek bir doğruluk kaynağıdır: Zod şemalarını doğrudan OpenAPI spec üretimine ve CDK dağıtımına bağlarsanız, yayınlanan sözleşme her istekte çalışan doğrulamadan ayrışamaz.</p>
<p><strong>Dokümantasyon Kaymasının Bedeli</strong></p>
<p>Klasik serverless API geliştirme tuzağı, dört farklı doğruluk kaynağının sessizce birbirinden sapmasıdır:</p>
<p>[code block]</p>
<p><em>Continue reading...</em></p>]]></content:encoded>
        </item>
    </channel>
</rss>