# Muhammet Şafak > Muhammet Şafak’ın kişisel marka sitesi — polyglot geliştirici ve sistem mimarı. 2008’den bu yana yazılım geliştiren bir mühendisin portfolyosu ve 2014’ten bugüne uzanan dönemsel geliştirme günlüğü. Blog, uygulamalı bir geliştirme günlüğüdür: PHP, Laravel, JavaScript, TypeScript, Go ve web geliştirme üzerine, bir geliştiricinin yıllar içindeki gelişimini yansıtan yazılar ve kariyer üzerine düşünceler. Sitede ayrıca açık kaynak projeler ve profesyonel özgeçmiş bilgileri yer alır. Yazılım mimarisi ve sistem tasarımı üzerine derinlemesine içerikler ise yazarın diğer sitesi sade.dev’dedir. İngilizce sürüm / English version: https://www.muhammetsafak.com.tr/en/llms.txt ## Site - [Ana Sayfa](https://www.muhammetsafak.com.tr/) - [Hakkımda](https://www.muhammetsafak.com.tr/hakkimda/) [md](https://www.muhammetsafak.com.tr/hakkimda.md): Muhammet Şafak kimdir, ne yapar. - [Blog](https://www.muhammetsafak.com.tr/blog/) [md](https://www.muhammetsafak.com.tr/blog.md): Tüm blog yazıları. - [Portfolyo](https://www.muhammetsafak.com.tr/portfolyo/) [md](https://www.muhammetsafak.com.tr/portfolyo.md): Projeler. - [Uzmanlık](https://www.muhammetsafak.com.tr/uzmanlik/) [md](https://www.muhammetsafak.com.tr/uzmanlik.md): Ekosistem başına ne yaptığım ve kanıtı. - [Labs](https://www.muhammetsafak.com.tr/labs/) [md](https://www.muhammetsafak.com.tr/labs.md): Geliştirme odaklarına göre ürünleşme yolundaki işler; her kaydın bugün ne yaptığı, türü, olgunluğu ve durumu yazılı. - [Research](https://www.muhammetsafak.com.tr/research/) [md](https://www.muhammetsafak.com.tr/research.md): Ölçüm, analiz, tarama ve derleme kayıtları; her kayıtta yöntem, ortam ve geçerlilik tarihi yazılı. - [Sor Bakalım](https://www.muhammetsafak.com.tr/sor-bakalim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim.md): Ziyaretçilerin sorduğu, tek tek yanıtlanan sorular. - [Özgeçmiş](https://www.muhammetsafak.com.tr/ozgecmis/) [md](https://www.muhammetsafak.com.tr/ozgecmis.md): Deneyim, eğitim, yetenekler. - [İletişim](https://www.muhammetsafak.com.tr/iletisim/) [md](https://www.muhammetsafak.com.tr/iletisim.md) Her yazının, sorunun, Labs/Research kaydının ve projenin düz Markdown sürümü, adresin sonuna `.md` eklenerek alınabilir — örneğin https://www.muhammetsafak.com.tr/blog/php-oldu-mu-2026-tablosu-veriyle.md Yayınlanmış içeriğin TAMAMI tek dosyada (bu harita değil, metnin kendisi): https://www.muhammetsafak.com.tr/llms-full.txt ## Projeler Bu bölümün tamamı düz Markdown olarak: https://www.muhammetsafak.com.tr/portfolyo.md - [Parantaj: kişisel ve kurumsal finans platformu](https://www.muhammetsafak.com.tr/portfolyo/parantaj/) [md](https://www.muhammetsafak.com.tr/portfolyo/parantaj.md) [sürüyor]: Gelir-gider takibi, bütçe planlama ve çoklu hesap yönetimi sunan finans platformu; web, iOS ve Android'de aynı API'den besleniyor. — Rol: Owner — Sınıf: SaaS Ürünü — Yığın: PHP, Laravel, Go, PostgreSQL, Redis, RabbitMQ, Expo, React Native, Vite, iOS, Android — Başlangıç: 2024-10-18 - [BabelQueue: dilden bağımsız kuyruk standardı](https://www.muhammetsafak.com.tr/portfolyo/babelqueue/) [md](https://www.muhammetsafak.com.tr/portfolyo/babelqueue.md) [sürüyor]: PHP, Python, Go ve Node.js'in aynı kuyruğu serileştirme kilidine takılmadan paylaşması için dondurulmuş JSON zarfı. Redis ve RabbitMQ üzerinde. — Rol: Founder & Developer — Sınıf: Amiral Gemisi — Yığın: JSON, Redis, RabbitMQ, PHP, Python, Go, Node.js, Java, .NET — Başlangıç: 2026-06-15 - [CommitBrief: yerel LLM kod inceleme CLI'ı](https://www.muhammetsafak.com.tr/portfolyo/commitbrief/) [md](https://www.muhammetsafak.com.tr/portfolyo/commitbrief.md) [sürüyor]: Git diff'lerini terminalden çıkmadan ve diff'i dışarı sızdırmadan inceleyen, sağlayıcıdan bağımsız Go CLI'ı: Anthropic, OpenAI, Gemini, Ollama. — Rol: Founder & Developer — Sınıf: Amiral Gemisi — Yığın: Go, Cobra, go-git, Anthropic Claude, OpenAI, Google Gemini, Ollama, YAML, Goreleaser, Astro, Tailwind CSS — Başlangıç: 2026-04-07 - [QueryProxy: SQL onay portalı](https://www.muhammetsafak.com.tr/portfolyo/queryproxy/) [md](https://www.muhammetsafak.com.tr/portfolyo/queryproxy.md) [sürüyor]: Üretim veritabanına giden ad-hoc SQL'i onaya, yazma anında maskelemeye ve değiştirilemez bir denetim izine bağlayan self-hosted portal. — Rol: Founder & Developer — Sınıf: Amiral Gemisi — Yığın: PHP, Laravel, Livewire, Blade, Tailwind CSS, Vite, CodeMirror, phpMyAdmin SQL Parser, Pest, Docker, GitHub Actions, PostgreSQL, MySQL, MariaDB, SQL Server, SQLite — Başlangıç: 2026-09-08 - [InitPHP: 30+ modüler PHP kütüphanesi](https://www.muhammetsafak.com.tr/portfolyo/initphp/) [md](https://www.muhammetsafak.com.tr/portfolyo/initphp.md) [sürüyor]: Router, Database, Cache, Mailer ve Socket dâhil 30+ modüler PHP paketi ve minimalist MVC çatısı Framework3; Packagist'te MIT lisansıyla. — Rol: Founder & Developer — Sınıf: Eski / Hobi Projesi — Yığın: Composer, Git, PHPUnit, PHP — Başlangıç: 2022-08-12 - [SignalLock: Bluetooth yakınlık kilidi](https://www.muhammetsafak.com.tr/portfolyo/signallock/) [md](https://www.muhammetsafak.com.tr/portfolyo/signallock.md) [sürüyor]: Yanından ayrıldığında bilgisayarını, taşıdığın Bluetooth cihazıyla otomatik kilitleyen gizlilik odaklı menü çubuğu uygulaması. — Rol: Owner — Sınıf: Eski / Hobi Projesi — Yığın: Swift, SwiftUI, CoreBluetooth, CoreLocation, C#, .NET 8, WinForms — Başlangıç: 2026-05-20 - [Looplio: periyodik iş ve bakım otomasyonu](https://www.muhammetsafak.com.tr/portfolyo/looplio/) [md](https://www.muhammetsafak.com.tr/portfolyo/looplio.md) [sürüyor]: Tekrar eden işleri, bakımları ve kontrolleri yeniden kullanılabilir şablonlara ve otomatik checklist'lere çeviren platform; web, iOS, Android. — Rol: Owner — Sınıf: SaaS Ürünü — Yığın: PHP, Laravel, Go, PostgreSQL, Redis, Expo, React Native, iOS, Android — Başlangıç: 2026-05-01 - [Regnarium: tek oturumluk 4X oyunu](https://www.muhammetsafak.com.tr/portfolyo/regnarium/) [md](https://www.muhammetsafak.com.tr/portfolyo/regnarium.md) [sürüyor]: 480 altıgenlik haritada azami 60 turda biten, tarayıcıda çevrimdışı ve hesapsız oynanan zarsız bir strateji oyunu. — Rol: Designer & Developer — Sınıf: Eski / Hobi Projesi — Yığın: TypeScript, Next.js, React, React Native, Expo, Vitest, MDX, IndexedDB, CSS Modules — Başlangıç: 2026-09-13 - [sakinkal: kanıta dayalı kriz hazırlığı](https://www.muhammetsafak.com.tr/portfolyo/sakinkal/) [md](https://www.muhammetsafak.com.tr/portfolyo/sakinkal.md) [sürüyor]: Türkiye'de kriz hazırlığını korkudan ve abartıdan arındıran, çevrimdışı erişilebilir, reklamsız kaynak. 'Panik yok, hazırlık var.' — Rol: Founder & Editor — Sınıf: Yayın — Yığın: Astro, Tailwind CSS, TypeScript, Markdown, Pagefind, Cloudflare Pages — Başlangıç: 2026-05-30 - [TB1MSK: amatör telsiz istasyonu ve blogu](https://www.muhammetsafak.com.tr/portfolyo/tb1msk/) [md](https://www.muhammetsafak.com.tr/portfolyo/tb1msk.md) [sürüyor]: Çatalca/İstanbul (KN41ff) merkezli amatör telsiz istasyonum; VHF/UHF'te FM, tekrarlayıcı ve APRS, acil durum haberleşmesi üzerine Türkçe içerik. — Rol: Operatör & Geliştirici — Sınıf: Yayın — Yığın: Astro, TypeScript, Markdown, Cloudflare Pages — Başlangıç: 2026-03-20 - [Erkekse: erkeklere özel çevrimiçi dergi](https://www.muhammetsafak.com.tr/portfolyo/erkekse/) [md](https://www.muhammetsafak.com.tr/portfolyo/erkekse.md) [tamamlandı]: Moda, stil, bakım ve sağlık üzerine abonelik temelli çevrimiçi dergi; 2016–2022 arasında WordPress üzerinde yayınladım. — Rol: Founder — Sınıf: Yayın — Yığın: PHP, WordPress, MariaDB, Linux — Başlangıç: 2016-07-20 — Bitiş: 2022-12-30 ## Uzmanlık — Ekosistemler - [PHP Geliştirici](https://www.muhammetsafak.com.tr/uzmanlik/php/) [md](https://www.muhammetsafak.com.tr/uzmanlik/php.md): 2008'den beri PHP geliştiricisiyim: Laravel, Symfony ve CodeIgniter ile üretime çıkan işler, framework'süz kütüphaneler ve framework kararı. - [Backend Geliştirici](https://www.muhammetsafak.com.tr/uzmanlik/backend/) [md](https://www.muhammetsafak.com.tr/uzmanlik/backend.md): API sözleşmesi, kuyruk, veritabanı ve sunucu tarafında ne yaptığım — teslim garantisi, idempotency ve ölçülmüş index kararları. - [Go Geliştirici](https://www.muhammetsafak.com.tr/uzmanlik/go/) [md](https://www.muhammetsafak.com.tr/uzmanlik/go.md): Go ile ne geliştiriyorum: mikroservisler, kuyruk tüketen consumer'lar, HTTP API'lar ve komut satırı araçları — Go'yu hangi işte neden seçtiğim. - [JavaScript Geliştirici](https://www.muhammetsafak.com.tr/uzmanlik/javascript/) [md](https://www.muhammetsafak.com.tr/uzmanlik/javascript.md): Web ve mobili aynı API'den beslemek: React Native ile mağazaya çıkan uygulamalar, TypeScript'le taşınan sözleşme ve değişen araç zinciri. - [Python Geliştirici](https://www.muhammetsafak.com.tr/uzmanlik/python/) [md](https://www.muhammetsafak.com.tr/uzmanlik/python.md): Python'u nerede kullanıyorum ve nerede kullanmıyorum: betik, veri dönüştürme, otomasyon — ve iddia etmediğim yerler. ## Labs — Geliştirme Bu bölümün tamamı düz Markdown olarak: https://www.muhammetsafak.com.tr/labs.md - **AI destekli geliştirme** — LLM'in geliştirme sürecine girdiği yer: kod inceleme, statik analizle model karışımı, prompt yerine deterministik süzgeçler. - **Dağıtık sistem & mesajlaşma** — Kuyruklar, outbox, idempotent tüketim ve dilden bağımsız mesaj sözleşmeleri. - **Geliştirici araçları & CI** — CLI'lar, mimari sınırların derlemede zorlanması, kod sağlığını ölçen otomasyon. - **Eğitim ve Araştırma** — Bilgiyi öğretilebilir ve araştırılabilir kılan platformlar: sıralı müfredat, kaynak metin, dile duyarlı tam metin arama ve ölçme. - **Otomasyon & veri işleme** — Periyodik işler, entegrasyon hatları ve operasyonel veri akışları: toplama, dönüştürme ve zamanlama. - **Güvenlik & doğrulanabilirlik** — Sunucunun doğrudan göremediği olayların — fiziksel yakınlık, istemcide hesaplanan sonuç — kanıtlanabilir hâle getirilmesi. - **Topluluk & platform** — Topluluğun forumun dağınıklığına düşmeden bölünmesi: konu-özelinde kulüpler, paylaşılan veri modeli, web ve mobilin paralel yürümesi. - **Erişim yönetişimi & veri koruma** — Üretim verisine kimlik bilgisi paylaşmadan erişim: onay zinciri, yazma anında maskeleme ve değiştirilemez denetim izi. - **Oyun & simülasyon** — Deterministik kural sistemleri: tohumlu simülasyon, zarsız çözüm ve tarayıcıda çevrimdışı yürüyen tur tabanlı oynanış. - [Bir oturumda biten 4X: kapsamı kısıt seçti](https://www.muhammetsafak.com.tr/labs/regnarium-lab/) [md](https://www.muhammetsafak.com.tr/labs/regnarium-lab.md) [ürün oldu]: 480 altıgende 60 turda biten, tarayıcıda çevrimdışı çalışan zarsız strateji oyunu çekirdeği; Regnarium olarak yayına çıktı. — Şu an ne yapıyor: 480 altıgenlik haritada azami 60 turda biten bir 4X eli yürütüyor; kurallar, harita üretimi ve rakip yapay zekâ tek bir saf TypeScript çekirdeğinde, savaş zarsız. Elinde yarım saati olan ve strateji oynamak isteyen herkes tarayıcıdan açabilir. — Tür: web uygulaması — Odak: Oyun & simülasyon - [Üretim verisine erişim: parolayı paylaşmak tek seçenek değil](https://www.muhammetsafak.com.tr/labs/queryproxy-lab/) [md](https://www.muhammetsafak.com.tr/labs/queryproxy-lab.md) [ürün oldu]: Üretim veritabanına giden ad-hoc SQL'i onaya, maskelemeye ve değiştirilemez bir ize bağlayan self-hosted portal; QueryProxy ürününe dönüştü. — Şu an ne yapıyor: Geliştiricinin yazdığı SQL'i üretim veritabanında doğrudan değil, bir onaydan geçirerek çalıştırıyor; sonuçlar diske yazılırken maskeleniyor ve her istek değiştirilemez bir kayda düşüyor. Prod erişimi tek kişide toplanmış ekipler kurabilir. — Tür: açık kaynak, web uygulaması — Odak: Erişim yönetişimi & veri koruma - [academia.sh: teori ile sahadan gelen problem aynı derste durabilir mi?](https://www.muhammetsafak.com.tr/labs/academia/) [md](https://www.muhammetsafak.com.tr/labs/academia.md) [geliştiriliyor]: Ücretsiz ve herkese açık, metin merkezli öğrenme platformu; ders kitabı teorisiyle sektörde karşılaşılan problemleri tek ders akışında tutuyor. — Şu an ne yapıyor: Ücretsiz ve kayıt duvarı olmayan bir öğrenme platformu olarak yayında: alan-müfredat-kurs-ünite-ders hiyerarşisi, tam metin arama, ilerleme takibi ve doğrulanabilir sertifika çalışıyor. Bilgisayar bilimleri müfredatını okumak isteyen herkes bugün kullanabilir. — Tür: web uygulaması — Olgunluk: beta — Odak: Eğitim ve Araştırma - [Qurandia: numarası tutmayan iki veri setini metnin parmak iziyle eşleştirmek](https://www.muhammetsafak.com.tr/labs/qurandia/) [md](https://www.muhammetsafak.com.tr/labs/qurandia.md) [geliştiriliyor]: Kur'an okumak, anlamak ve öğrenmek isteyenler için açık ve ücretsiz bir kaynak; Kur'an ve hadis merkezli araştırmayı tek çatı altında topluyor. — Şu an ne yapıyor: Kur'an ve hadis metinlerini birlikte okumaya ve aramaya açık, ücretsiz bir kaynak olarak yayında; harf düzeyinde parmak izi eşlemesi hadis koleksiyonlarında %91–99 kapsam veriyor. Kaynağa doğrudan bakmak isteyen okuyucu ve araştırmacı bugün kullanabilir. — Tür: web uygulaması — Olgunluk: alpha — Odak: Eğitim ve Araştırma - [Swipenor: skoru istemci hesaplarsa sunucu neye güvenir?](https://www.muhammetsafak.com.tr/labs/swipenor/) [md](https://www.muhammetsafak.com.tr/labs/swipenor.md) [geliştiriliyor]: Kaydırmalı doğru/yanlış bilgi yarışması; asıl mesele oyun değil, istemcinin ürettiği skoru imzayla doğrulanabilir kılmak. — Şu an ne yapıyor: Kaydırmalı doğru/yanlış bilgi yarışması bir mobil uygulama olarak çekirdek döngüsüyle uçtan uca çalışıyor; skoru istemci üretse de server_nonce ve HMAC imzasıyla sunucu tarafında doğrulanıyor. swipenor.com uygulamanın tanıtım sayfasıdır, oyunun kendisi değil. — Tür: mobil uygulama — Olgunluk: beta — Odak: Güvenlik & doğrulanabilirlik - [Garajdaş: model-özelinde topluluk, forumun dağınıklığı olmadan](https://www.muhammetsafak.com.tr/labs/garajdas/) [md](https://www.muhammetsafak.com.tr/labs/garajdas.md) [geliştiriliyor]: Her araç marka-modelinin kendi kulübü olduğu, ICE ile EV'yi aynı çatıda tutan Reddit-benzeri topluluk platformu; API, web ve mobil paralel yürüyor. — Şu an ne yapıyor: Her araç marka-modelinin kendi kulübü olduğu topluluk platformu; kimlik, içerik, bildirim ve moderasyon akışları tek şemalı API üzerinde yürüyor, web ve mobil istemciler aynı şemayı paylaşıyor. Aracının modeline özel bir topluluk arayan kullanıcı bugün katılabilir. — Tür: web uygulaması, mobil uygulama — Olgunluk: beta — Odak: Topluluk & platform - [SentryFixer: Sentry hatasını koda karşı okuyup düzeltme planı çıkarmak](https://www.muhammetsafak.com.tr/labs/sentryfixer/) [md](https://www.muhammetsafak.com.tr/labs/sentryfixer.md) [kararlı]: Bir Sentry issue'sunu çalışan koda karşı analiz eden, düzeltmeyi diff ve regresyon testiyle sunan, onay almadan dosyaya dokunmayan Claude Code skill'i. — Şu an ne yapıyor: Bir Sentry issue'sunu çalışan koda karşı okuyup kök neden analizi ve düzeltme planı çıkarıyor; onay alınmadan tek bir dosyaya dokunmuyor. Claude Code kullanan ve prodüksiyon hatasını triyaj etmek isteyen herkes skill'i kurabilir. — Tür: açık kaynak — Olgunluk: sürüm adayı — Odak: AI destekli geliştirme - [Devrazzi: geliştirici haberini model katmanlarına eletmek](https://www.muhammetsafak.com.tr/labs/devrazzi/) [md](https://www.muhammetsafak.com.tr/labs/devrazzi.md) [kararlı]: Yazılım ve AI haberini yerel Ollama ile eleyip üst katmanlarda büyük modellere devreden, TR/EN sentezini uçtan uca üretip yayınlayan içerik hattı. — Şu an ne yapıyor: Yazılım ve AI haberini yerel Ollama ile eleyip üst katmanlarda büyük modellere devrediyor, TR/EN sentezi kendi üretip yayınlıyor; web ve App Store sürümü canlı. Günlük geliştirici haberini tek akıştan takip etmek isteyen okuyabilir. — Tür: web uygulaması, mobil uygulama — Olgunluk: sürüm adayı — Odak: Otomasyon & veri işleme - [Aynı kuyruğu iki dilin serileştirme kilidine takılmadan paylaşması](https://www.muhammetsafak.com.tr/labs/babelqueue-lab/) [md](https://www.muhammetsafak.com.tr/labs/babelqueue-lab.md) [ürün oldu]: Dile özgü serileştirme yerine dondurulmuş bir JSON zarfı; polyglot kuyruk standardı BabelQueue'ya dönüştü. — Şu an ne yapıyor: Dondurulmuş JSON zarfı dört dilde — PHP, Python, Go, Node.js — aynı baytları okutuyor; sidecar ya da broker eklentisi gerekmiyor. Polyglot kuyruk kuran ekipler spesifikasyonu ve SDK'ları bugün kullanabilir. — Tür: açık kaynak — Odak: Dağıtık sistem & mesajlaşma - [Bluetooth yakınlığıyla ekran kilidi: 'var/yok' yetmiyor](https://www.muhammetsafak.com.tr/labs/signallock-lab/) [md](https://www.muhammetsafak.com.tr/labs/signallock-lab.md) [ürün oldu]: Yanındaki cihaz uzaklaşınca bilgisayarı kilitleyen yakınlık kilidi; menü çubuğu uygulaması SignalLock'a dönüştü. — Şu an ne yapıyor: Yanındaki cihaz uzaklaşınca macOS ekranını kilitliyor; karar ham "var/yok" sinyaline değil bir yakınlık değerlendirmesine dayandığı için sinyal dalgalanması yanlış kilit üretmiyor. Menü çubuğu uygulaması yayında, indirilip kullanılabilir. — Tür: açık kaynak — Odak: Güvenlik & doğrulanabilirlik - [Diff'i dışarı sızdırmadan yerel kod incelemesi](https://www.muhammetsafak.com.tr/labs/commitbrief-lab/) [md](https://www.muhammetsafak.com.tr/labs/commitbrief-lab.md) [ürün oldu]: Diff'i makineden çıkarmadan bir modele denetleten, sağlayıcıdan bağımsız Go CLI; CommitBrief ürününe dönüştü. — Şu an ne yapıyor: Diff hiç makineden çıkmadan yerel kod incelemesi yapıyor; `Provider` arayüzü sayesinde Anthropic, OpenAI, Gemini ve Ollama aynı sözleşmeyle takılıyor. İmzalı binary'ler yayında — diff'ini bir bulut sağlayıcısına vermek istemeyen herkes kurabilir. — Tür: açık kaynak — Odak: AI destekli geliştirme - [Kişisel ve kurumsal finansın aynı veri modelinde durması](https://www.muhammetsafak.com.tr/labs/parantaj-lab/) [md](https://www.muhammetsafak.com.tr/labs/parantaj-lab.md) [ürün oldu]: Çok hesaplı gelir-gider takibini tek modelde toplayan finans çekirdeği; web + iOS + Android'de çalışan Parantaj'a dönüştü. — Şu an ne yapıyor: Tek hesap/işlem modeli çoklu hesap yönetimini, bütçeyi, hedefleri ve raporlamayı aynı çekirdekte taşıyor; web, iOS ve Android istemcileri yayında. Kişisel ve kurumsal finansını tek yerden takip etmek isteyen kullanabilir. — Tür: açık kaynak, web uygulaması, mobil uygulama — Odak: Otomasyon & veri işleme - [Tek başına da çalışan, birlikte de çalışan PHP paketleri](https://www.muhammetsafak.com.tr/labs/initphp-lab/) [md](https://www.muhammetsafak.com.tr/labs/initphp-lab.md) [ürün oldu]: Framework'e bağlanmadan çalışan modüler PHP kütüphaneleri; 39 paketlik InitPHP ekosistemine ve Framework3'e dönüştü. — Şu an ne yapıyor: 39 paketlik bir PHP kütüphane ailesi: Router, Database, Cache, Mailer, Socket ve diğerleri hem tek başına hem birlikte çalışıyor, hepsi Composer/Packagist üzerinden MIT lisansıyla dağıtılıyor. Framework'e bağlanmadan parça kullanmak isteyen PHP geliştiricisi bugün kurabilir. — Tür: açık kaynak — Odak: Geliştirici araçları & CI ## Research — Kayıtlar Bu bölümün tamamı düz Markdown olarak: https://www.muhammetsafak.com.tr/research.md - **Dil & çalışma zamanı** — Sürüm yükseltmelerinin, derleyici ve çalışma zamanı ayarlarının aynı iş üzerindeki farkı: JIT, opcache, GC ve bellek davranışı. - **Veritabanı & sorgu** — Index stratejisi, sorgu planı ve bağlantı yönetiminin gerçek veri hacmi altında ödettiği bedel; şema ve migration kararları dâhil. - **Servis & yük** — Yük altında gecikme dağılımı, doyma noktası ve kuyruk davranışı — ortalama değil p95/p99; backpressure ve circuit breaker dâhil. - **Araç karşılaştırması** — Aynı işi yapan iki aracın ölçülebilir farkı: derleme süresi, çıktı boyutu, bellek ve geliştirici döngüsü; ekosistem taraması dâhil. - **Arayüz performansı** — Gönderilen JS, ilk boya ve etkileşim gecikmesi: bir kolaylığın kullanıcıya kaç kilobayta mal olduğu; tarayıcı desteği dâhil. - **Maliyet & kaynak** — Bir kararın faturaya yansıyan tarafı: CPU-saat, bant genişliği, depolama ve istek başına gerçek maliyet. - [PHP ile Go'yu aynı OAuth2 API'de ölçtüm: 10.000 yazmada fark yok, 50.000 okumada var](https://www.muhammetsafak.com.tr/research/php-go-oauth2-postgres-yuk-testi/) [md](https://www.muhammetsafak.com.tr/research/php-go-oauth2-postgres-yuk-testi.md): Her istekte OAuth2 token'ı doğrulayıp PostgreSQL'e yazan ya da okuyan aynı API, dört çekirdekte PHP-FPM, FrankenPHP worker ve Go ile saniyede 10.000 yazmayı ve 50.000 okumayı kaç CPU'yla karşılıyor? — Tür: Ölçüm — Bulgu: Saniyede 10.000 yazmada üç aday da hedefi beş tekrarın beşinde tutturdu, p99 üçünde de 2,5 ms'yi aşmadı: bu yükte dil bir kapasite kalemi değil. Saniyede 50.000 okumayı dört çekirdekte yalnız Go tutturdu (p99 6,45 ms); PHP-FPM 23.528'de, FrankenPHP 22.859'da kaldı. İstek başına CPU okumada Go'da 64, FrankenPHP'de 117, PHP-FPM'de 168 mikrosaniye. 50.000 okuma için instance hesabı Go'ya 3,4, iki PHP adayına 8,2–8,8 çekirdek yazdırıyor. FrankenPHP'nin CPU tasarrufu kapasiteye dönmüyor: doygunken dört çekirdeğin birini boşta bırakıyor. — Metrikler: 10.000 yazma/sn · üç aday da tuttu: p99 ≤ 2,50 ms · 50.000 okuma/sn · yalnız Go tuttu: p99 6,45 ms · Okuma başına CPU · Go → PHP-FPM: 64 → 168 µs · Doğrulama tavanı · Go / en iyi PHP: 83.526 / 32.953 — Yöntem: Aynı sözleşme üç kez yazıldı ve her istekte RS256 bearer token doğrulandı (imza, iss, aud, exp, nbf, scope). Adaylar Go 1.27.1 (net/http, pgx, golang-jwt), nginx + php-fpm üzerinde PHP 8.5.10 ve FrankenPHP 1.12.7 worker modunda PHP 8.5.10; framework yok ve iki PHP adayı aynı sınıfı çalıştırıyor. Her aday dört sabitlenmiş çekirdek, 1 GiB bellek ve en fazla 32 veritabanı bağlantısı aldı; php-fpm'in nginx'i de bu bütçenin içinde. PostgreSQL 17.11 ayrı dört çekirdekte, oha 1.15.0 ayrı dört çekirdekte koştu. Her blok, önbelleğe çekilmiş 1.000.000 satırlık tablonun birebir kopyasıyla ve taze bir aday konteyneriyle başladı. Sabit hız fazı open loop modunda koştu (oha -q, latency correction, 256 bağlantı, 60 sn, 5 tekrar) ve medyan raporlandı. Tavan fazı closed loop modunda 16/64/128/256 bağlantıyla koştu (15 sn, 3 tekrar) ve en iyi tekrar raporlandı. CPU ve bellek her koşuda cgroup sayaçlarından okundu. Her bloktan önce uygulama kodu çalıştırmayan bir nginx, adayın çekirdeklerinde 50.000/sn ile sınandı; 24 bloğun hepsinde en az 49.980/sn verdi. Toplam 153 yük ölçümü, 123 milyon yanıt, sıfır non-2xx. — Güven: Orta güven — Ölçüm tarihi: 2026-09-16 — Servis & yük - [Partial index on beş dakikada üç yüz beş kat şişti — ve autovacuum bir kez bile gelmedi](https://www.muhammetsafak.com.tr/research/kuyruk-tablosunda-bloat-ve-autovacuum/) [md](https://www.muhammetsafak.com.tr/research/kuyruk-tablosunda-bloat-ve-autovacuum.md): Sürekli churn altındaki bir kuyruk tablosunda partial index'in küçüklüğü kalıcı mı, ve varsayılan autovacuum ayarları ona yetişiyor mu? — Tür: Ölçüm — Bulgu: Canlı küme beş bin satırda sabit dururken partial index 0,125 MB'dan 38,2 MB'a çıktı — üç yüz beş kat. Küçüklüğü canlı satır sayısından geliyor, şişme hızı iş hacminden, ve ikisi arasında hiçbir bağ yok. Composite index oransal olarak daha az şişti (%42) ama mutlak olarak daha çok (+126 MB) ve şişerken belleğe sığmayı bıraktı: gecikmesi 0,52 ms'den 61 saniyeye çıktı, kuyruğu 126 bine tırmandı. On beş dakikada 1,75 milyon ölü satır birikti ve autovacuum **bir kez bile koşmadı** — varsayılan eşik tablonun tamamına göre ölçekleniyor (50 + 0,2 × 10 milyon ≈ 2 milyon), churn ise küçük canlı kümede oluyor. — Metrikler: Partial index, 15 dakikada: 0,125 → 38,2 MB (305×) · Composite index, aynı sürede: 301 → 427 MB (+%42) · Autovacuum koşma sayısı: 0 · Composite gecikmesi, 900. saniye: 61.533 ms — Yöntem: Partial index ölçümüyle aynı tezgâh, aynı Postgres 17 ayarları, aynı 10 milyon ölü + 5.000 canlı satırlık tablo. Üç fark var, üçü de bu soruyu sorabilmek için zorunlu. Tüketici satırı `pending`'e geri koymuyor, `done` işaretliyor — sınanan iddia satırın index'ten DÜŞMESİYLE ilgili ve hiç düşmeyen satırda ölçülemez. Yanında sabit varış hızında (2.000/sn) bir üretici koşuyor, yani tablo önceki kaydın eksik ilan etmek zorunda kaldığı insert trafiğini de görüyor. Ve talep, `\gset` yerine alt sorgulu `UPDATE` biçiminde: kısıtsız bir tüketici kuyruğu bir saniyenin altında boşaltıyor ve `\gset` boş sonuçta istemciyi öldürüyor. Tüketici de üretici hızına bağlandı, böylece kuyruk derinliği sabit kalıyor — ve sabit kaldığı örneklenerek doğrulanıyor, varsayılmıyor. On beş saniyede bir tablo boyutu, index boyutu, kuyruk derinliği, ölü satır sayısı ve autovacuum sayaçları kaydedildi; strateji başına 60 örnek. — Güven: Yüksek güven — Ölçüm tarihi: 2026-08-22 — Veritabanı & sorgu - [Laravel'in preload eğrisi: 123 dosya, 1.912 dosyadan sekiz kat fazla kazandırıyor](https://www.muhammetsafak.com.tr/research/laravel-preload-egrisi/) [md](https://www.muhammetsafak.com.tr/research/laravel-preload-egrisi.md): Laravel için elle seçilmiş bir preload nereye kadar iner, ve her dilim ne kadar açılış bedeline mal olur? — Tür: Ölçüm — Bulgu: Eğri hacimle orantılı değil. İlk 1.592 dosya (Laravel çekirdeği) 30 ms kazandırıyor ve açılışa 1,2 saniye ekliyor. Sonraki 1.094 Symfony dosyası 9,5 ms kazandırıyor, bedava. Ondan sonraki **123 dosya** (psr, carbon) 15,7 ms kazandırıyor — kendinden önceki 1.094 dosyadan fazla. Ve son 1.912 dosya yalnız 1,8 ms kazandırıp açılışa 1,2 saniye daha yazıyor. Yani önceki kaydın tavan olarak ölçtüğü "hepsini derle", eğrinin başlangıç noktası dışındaki en kötü fiyat/performans bölgesi: 2.809 dosyada durmak 12,77 ms ve 1.514 ms açılış verirken, 4.721 dosya 10,96 ms için 2.691 ms istiyor. — Metrikler: Tatlı nokta: 2.809 dosya: 12,77 ms (−%81) · Aynı noktanın açılış bedeli: +1.132 ms · 123 dosyalık dilimin kazancı: 15,7 ms · Son 1.912 dosyanın kazancı: 1,8 ms — Yöntem: opcache ölçümüyle aynı imajlar, aynı PHP 8.4 derlemesi, aynı ölçüm noktası — konteynerin sunduğu ilk istek. Küratörlük elle seçilmiş bir sınıf listesi değil, Composer classmap'i üzerinde bir **yol filtresi**: elle seçilmiş liste tekrar edilemez, filtre edilebilir. Beş varyant kasıtlı olarak iç içe (framework ⊂ +symfony ⊂ +psr/carbon ⊂ hepsi), böylece eğri "şunu da ekleyince" diye okunuyor, dört bağımsız nokta olarak değil. Her varyant için taze konteyner, üç tekrar, medyan. Preload php-fpm'in master sürecinde koştuğu için bedeli konteynerin ilk 200 yanıtı verene kadar geçen sürede ölçülüyor; bu pencere nginx'in açılışını da içeriyor ama beş varyantta da aynı sabit. — Güven: Yüksek güven — Ölçüm tarihi: 2026-08-22 — Dil & çalışma zamanı - [Partial index kuyruk tablosunu kırk bir kat küçültüyor — planner onu seçtiği sürece](https://www.muhammetsafak.com.tr/research/partial-index-kuyruk-tablosu/) [md](https://www.muhammetsafak.com.tr/research/partial-index-kuyruk-tablosu.md): Milyonlarca ölü satır biriken bir Postgres kuyruk tablosunda partial index ne kazandırıyor, ve planner onu ne zaman seçmiyor? — Tür: Ölçüm — Bulgu: 10 milyon ölü satırda partial index saniyede 11.537 iş çıkarıyor, index'siz tablo 7. Composite index'le hız farkı küçük (%6,9) ama boyut farkı değil: 7,6 MB'a karşı 310,4 MB, ve partial tabloyla birlikte büyümüyor çünkü yalnız 5.000 canlı satırı indeksliyor. Asıl bulgu bunların hiçbiri: planner hazırlanmış bir deyimde generic plana geçtiği anda partial index tamamen devre dışı kalıyor — 11.752 tps 7'ye, 0,68 ms 1,1 saniyeye düşüyor. Bin altı yüz otuz beş kat. Aynı koşulda composite index etkilenmiyor. — Metrikler: Partial index, 10M ölü satır: 11.537 tps · Aynı tablo, index yokken: 7 tps · Index boyutu, partial / composite: 7,6 / 310,4 MB · Generic plana geçince: 11.752 → 7 tps (−1.635×) — Yöntem: Postgres 17, tek konteyner, sabitlenmiş ayarlar (shared_buffers 1 GB, work_mem 64 MB, autovacuum açık — kapatmak sayıları güzelleştirir ve cevabı bozardı). `jobs` tablosunda canlı küme her kademede sabit 5.000 `pending` satır; ölü satır 100 bin, 1 milyon ve 10 milyon. Her boyut bir kez seed edilip **template veritabanı** olarak donduruluyor ve her koşu ondan kopyalanıyor: her stratejiyi yeniden seed etmek ölçümlerden uzun sürer ve her seferinde farklı karışmış bir tablo verir, yani sayılar stratejinin etkisini değil seed'in gürültüsünü taşırdı. Seed yüklerken `ORDER BY random()` ile karıştırıyor — sıralı tek geçiş, fiziksel düzeni `created_at`'e eşitleyip her index taramasını neredeyse sıralı okumaya çevirir ve dört stratejiyi de eşit biçimde kayırır. Tüketici pgbench: Postgres'le geliyor, gecikmeyi ortalama değil yüzdelikle veriyor, ve standart araç olduğu için tartışma tezgâha değil index'e kalıyor. 8 istemci, 30 saniye, üç tekrar, medyan. Talep edilen satır `done` yerine yeni bir `created_at` ile `pending`'e dönüyor: kuyruğunu kurutan bir tüketici koşunun ikinci yarısında boş tablo ölçerdi. Her koşuda throughput'un yanında `EXPLAIN` planı, index boyutu, gerçekleşen index tarama sayısı ve bırakılan ölü satır kaydediliyor — tek başına throughput, seçilmiş index ile yok sayılmış index'i ayırt edemez. — Güven: Yüksek güven — Ölçüm tarihi: 2026-08-22 — Veritabanı & sorgu - [Postgres partial index'i generic plana çevirmedi: kırk çalıştırma, kırk custom plan](https://www.muhammetsafak.com.tr/research/planner-generic-plana-ne-zaman-geciyor/) [md](https://www.muhammetsafak.com.tr/research/planner-generic-plana-ne-zaman-geciyor.md): Hazırlanmış bir deyimde Postgres partial index'li sorguyu kendiliğinden generic plana çeviriyor mu — yoksa bin altı yüz otuz beş katlık uçuruma ancak elle mi düşülüyor? — Tür: Ölçüm — Bulgu: Postgres geçişi reddediyor. Partial index'te kırk çalıştırmanın kırkı da custom plan — sayaç 40/0. Reddetmesinin sebebi tam olarak felaketin kendisi: generic plan partial index'i kullanamaz, bu yüzden tahmini maliyeti yüksek çıkar ve planner onu seçmez. Composite index ise ders kitabındaki gibi altıncı çalıştırmada geçiyor (5/35) ve hiçbir şey kaybetmiyor. Yani bin altı yüz otuz beş katlık uçurum gerçek ama çitli: ona düşmek için `plan_cache_mode = force_generic_plan` yazmak gerekiyor. — Metrikler: Partial index, generic plan: 0 / 40 çalıştırma · Composite index, geçiş: 6. çalıştırma · Partial, ilk 5 → son 5: 0,36 → 0,20 ms · Uçuruma düşmek için gereken: force_generic_plan — Yöntem: Aynı tezgâh, aynı 10 milyon ölü + 5.000 canlı satırlık tablo, üç index stratejisi. Her strateji için tek bir psql oturumunda tek bir hazırlanmış deyim kırk kez çalıştırıldı ve her çalıştırmadan sonra `pg_prepared_statements` sorgulandı — sayaçlar oturuma özgü olduğu için bu ölçüm pgbench'ten yapılamaz. Karar zamanlamadan çıkarsanmıyor, sayaçtan okunuyor: `custom_plans` ve `generic_plans` alanları planner'ın o çalıştırmada ne seçtiğini doğrudan söylüyor. Zamanlamalar çift geliyor (deyimin kendisi, sonra sayaç sorgusu) ve ayrıştırıcı yalnız ilkini alıyor. psql'in hizalı çıktısı sayaç değerini boşlukla dolduruyor; çıktı bu yüzden hizasız moda alındı — ilk koşu bu yüzden boş seri üretmişti. — Güven: Yüksek güven — Ölçüm tarihi: 2026-08-22 — Veritabanı & sorgu - [Chart.js'i nasıl import ettiğin, ziyaretçiye kaç kilobayt gönderdiğini belirliyor](https://www.muhammetsafak.com.tr/research/chartjs-import-stratejisi/) [md](https://www.muhammetsafak.com.tr/research/chartjs-import-stratejisi.md): `chart.js/auto` ile seçmeli `Chart.register()` arasındaki fark, gerçek bir üretim derlemesinde kaç kilobayt? — Tür: Ölçüm — Bulgu: Seçmeli register, `chart.js/auto` yerine 9,7 kB gzip tasarruf ettiriyor (67,8 → 58,1 kB, %14,3). Asıl büyük düşüş kütüphanenin kendisinde değil, hiç kullanılmayan controller'ları dışarıda bırakmakta: yalnız çubuk grafiği kaydeden bir sayfa 46,0 kB'a iniyor — auto'nun üçte ikisi. — Metrikler: Seçmeli register: 58,1 kB (-14,3%) · chart.js/auto: 67,8 kB · Yalnız çubuk: 46,0 kB (-33,9%) · Sayfanın ada maliyeti: 65,3 kB — Yöntem: Aynı depo, aynı grafik bileşeni ve aynı içerik dosyasıyla dört ayrı `npx astro build` koşuldu; her koşuda yalnız `chart-render.ts`'in import/register satırları değiştirildi. Ölçülen şey Rolldown'ın ürettiği `dist/_astro/chart-render.*.js` parçasının `gzip -9` boyutudur. Derleme deterministik olduğu için tek koşu yeterli: aynı girdi aynı baytı üretti, dört strateji de iki kez koşulup aynı sonuç doğrulandı. — Güven: Yüksek güven — Ölçüm tarihi: 2026-08-19 — Arayüz performansı - [opcache preload deploy faturasını on dört kata kadar siliyor — ama yedi framework'ün beşi onu size vermiyor](https://www.muhammetsafak.com.tr/research/opcache-preload-deploy-faturasi/) [md](https://www.muhammetsafak.com.tr/research/opcache-preload-deploy-faturasi.md): `opcache.preload` açıkken yedi PHP framework'ünün deploy sonrası ilk isteği ne kadar sürüyor, bu kazanç neye mal oluyor, ve kimler ona erişebiliyor? — Tür: Ölçüm — Bulgu: Preload, soğuk ilk isteği 3,5 ile 14,2 kat arasında kısaltıyor: Symfony 35,58 ms'den 2,50 ms'ye, yani Phalcon'un çıplak seviyesine iniyor. Ama yedi adayın yalnız ikisi (Symfony, CodeIgniter) resmî bir preload dosyası yayınlıyor; kalan beşinde kazanç masada duruyor ve kullanıcının kendi yazmasını bekliyor. Yazmak da göründüğü kadar kolay değil: classmap'ten körlemesine üretilen preload Symfony'yi hiç ayağa kaldırmıyor, CodeIgniter'da ise elle seçilmiş resmî dosyadan (3,13 ms) daha kötü sonuç veriyor (5,29 ms). Ve bedel kaybolmuyor: Laravel'in classmap preload'ı ziyaretçiden aldığı 62 ms'yi php-fpm'in ayağa kalkışına 2.340 ms olarak yazıyor. — Metrikler: Symfony, soğuk ilk istek: 2,50 ms (−%93) · Resmî preload taşıyan aday: 2 / 7 · Laravel classmap, fpm bedeli: +2.340 ms · Elle seçim vs hepsini derle: 3,13 → 5,29 ms — Yöntem: Ayak izi ve yük ölçümleriyle birebir aynı imajlar, aynı PHP 8.4 derlemesi, aynı nginx + php-fpm yığını. Hiçbir imaj yeniden derlenmedi: opcache `conf.d`'yi sırayla okuduğu için çalışma anında mount edilen bir `02-*.ini`, imaja gömülü `00-bench-opcache.ini`'yi eziyor. Aday başına üç varyant koşuldu — preload yok, framework'ün kendi dosyası (konteyner içinde aranarak bulunur, elle yazılmaz), ve Composer classmap'indeki her sınıfı `opcache_compile_file` ile derleyen tek tip bir dosya. Her varyant için taze konteyner ayağa kaldırıldı ve **konteynerin sunduğu ilk istek** ölçüldü; hazırlık yoklamasının kendisi o istektir, çünkü ayrı bir yoklama ilk isteği harcayıp geriye sıcak bir ölçüm bırakıyor. Üç tekrar, medyan raporlanıyor. Preload'ın bedeli php-fpm'in ilk 200 yanıtı verene kadar geçen süreyle ölçülüyor; bu pencere nginx'in kendi açılışını da içeriyor ama üç varyantta da aynı sabit. Doğrulama: `preload yok` varyantı 20 Ağustos'ta yayınlanan bağımsız koşunun soğuk sayılarını ±%6 içinde yeniden üretiyor. — Güven: Yüksek güven — Ölçüm tarihi: 2026-08-22 — Dil & çalışma zamanı - [PHP ekosistemi yeni sürümü beklemiyor — ama desteklediğini de söylemiyor](https://www.muhammetsafak.com.tr/research/php-surum-destegi-beyani/) [md](https://www.muhammetsafak.com.tr/research/php-surum-destegi-beyani.md): Bir PHP sürümü çıktıktan sonra en çok kurulan 500 Composer paketi onu desteklediğini ne zaman beyan ediyor, ve o beyan ne kadar bilgi taşıyor? — Tür: Tarama — Bulgu: Kurulumların %43,5'i üst sınırı hiç yazmayan bir kısıtla geliyor — `symfony/console` bugün `>=8.4.1` diyor, yani PHP 12'yi de desteklediğini iddia ediyor. Üst sınır yazan 280 paketin 247'si taahhüdünü sürüm daha doğmadan vermiş: `guzzlehttp/guzzle` 8.4'ü Ekim 2020'de, dört yıl önceden kapsamış. Geriye gerçekten bekleyen 33 paket kalıyor, medyanları 325 gün. Ham sayılar sürümden sürüme düşüp 'ekosistem hızlanıyor' diye okunuyor; eşit gözlem penceresinde bakınca trend tersine dönüyor (238 → 215 → 325 gün). — Metrikler: Üst sınırsız kısıtla gelen kurulum: %43,5 · Önceden taahhüt eden: 247 / 280 paket · Gerçekten bekleyenlerin medyanı: 325 gün · Eşit pencerede 8.2 → 8.4: 238 → 325 gün (+%37) — Yöntem: Packagist'in popülerlik uçlarından en çok kurulan 500 paket alındı, her birinin bütün kararlı sürümleri `repo.packagist.org/p2` metadata ucundan çekildi ve her sürümün taşıdığı `require.php` kısıtı okundu. Kısıtlar el yazımı bir okuyucuyla çözülüyor: npm'in `semver`'i Composer'la aynı sözdizimini farklı okuyor (`~8.1` Composer'da `>=8.1 <9.0`, semver'de `>=8.1.0 <8.2.0`), o yüzden ödünç alınmadı; okuyucu çözemediği kısıtı yutmuyor, fırlatıyor ve koşu sayıyor (bu turda 0). Bir kaydın hangi kovaya düştüğü üç elemeden geçiyor: sürümden sonra doğan paketler dışarıda (beklemiş olamazlar), kısıtsız sürümler her PHP'yi kabul ediyor sayılıyor (Composer'ı engellemiyorlar), ve gecikme yalnız üst sınır yazan kısıtlarda ölçülüyor. Sürümler arası karşılaştırma en kısa gözlem penceresine (639 gün) kırpılıyor. Tarama deterministik: aynı gün tekrar koşulduğunda aynı sayıları veriyor. — Güven: Yüksek güven — Doğrulama tarihi: 2026-08-22 — Dil & çalışma zamanı - [Bir PHP framework'ünü kurmanın sabit maliyeti: disk boyutu hiçbir şey söylemiyor](https://www.muhammetsafak.com.tr/research/php-framework-ayak-izi/) [md](https://www.muhammetsafak.com.tr/research/php-framework-ayak-izi.md): Yedi PHP framework'ü kurulduğunda diskte kaç megabayt, istek başına kaç dosya ve ilk istekte kaç milisaniye tutuyor — ve bu sayılardan hangisi gerçekten yük altındaki hızı öngörüyor? — Tür: Ölçüm — Bulgu: Disk boyutu hiçbir şey öngörmüyor: Yii2 en büyük vendor'a sahip (34,1 MB) ama istek başına yalnız 62 dosya yüklüyor — sahanın en azlarından. İstek başına dosya sayısı da öngörmüyor: CodeIgniter 96 dosya yükleyip 6.431 istek/sn veriyor, Symfony 224 dosya yükleyip 13.067 veriyor. Gerçekten ayrışan tek şey opcache soğukken ödenen ilk istek: Phalcon 2,2 ms, Laravel 72,2 ms — otuz üç kat. Bu, her deploy'dan sonra ilk ziyaretçinin ödediği derleme faturasıdır ve framework başına birkaç kilobayt değil, onlarca milisaniye tutuyor. — Metrikler: Soğuk ilk istek, en yavaş: 72,2 ms · Soğuk ilk istek, en hızlı: 2,2 ms · En büyük vendor: 34,1 MB · En çok yüklenen dosya: 359 — Yöntem: Yük ölçümüyle aynı imajlar, aynı PHP 8.4.24 derlemesi ve aynı production kurulumu. Her aday için taze bir konteyner ayağa kaldırıldı ve ölçülenler: `composer.lock` paket sayısı, `du -sb vendor`, `find vendor -type f | wc -l`, taze konteynerin karşıladığı **ilk** isteğin süresi (opcache boş — soğuk), ardından 5 saniyelik ısıtmadan sonra aynı isteğin süresi (sıcak), o istekte `get_included_files()` sayısı ve `memory_get_peak_usage(false)`. Boot süresi front controller'ın ilk satırından yanıt üretimine kadar ölçülüyor. `composer install` süresi, paket önbelleği önceden ısıtılmış bir konteynerde `--no-dev --optimize-autoloader --classmap-authoritative` bayraklarıyla üç kez koşulup medyanı alındı; ölçülen şey indirme hızı değil kurulum işi. Sayaçların hepsi deterministik ve tekrar edildiğinde aynı çıkıyor; tek gürültülü değer kurulum süresidir. — Güven: Yüksek güven — Ölçüm tarihi: 2026-08-20 — Araç karşılaştırması - [Yedi PHP framework'ü aynı yükte ölçtüm: fark, istek gerçek iş yaptıkça küçülüyor](https://www.muhammetsafak.com.tr/research/php-framework-yuk-testi/) [md](https://www.muhammetsafak.com.tr/research/php-framework-yuk-testi.md): Aynı donanımda, aynı PHP sürümünde ve aynı yedi rotayla, Laravel, Symfony, CodeIgniter, Yii2, Phalcon, Laminas ve Slim saniyede kaç isteği ne gecikmeyle karşılıyor? — Tür: Ölçüm — Bulgu: Boş bir rotada en hızlı ile en yavaş arasında 4,4 kat var (Slim 25.975, Laravel 5.966 istek/sn). Ama istek gerçek iş yapmaya başlayınca fark kapanıyor: veritabanından tek satır çeken bir istekte 3,7 kata, yirmi satır çekende 3,5 kata iniyor. Phalcon boş rotada üçüncüyken veritabanı isteğinde beşinciye düşüyor — C eklentisi olmak, sorgu beklerken bir işe yaramıyor. Asıl pahalı olan şey framework seçimi değil: Laravel'in kendi varsayılan web middleware grubu, aynı yanıtı 5.858'den 2.176 istek/sn'ye düşürüyor — yani tek bir varsayılan, framework'ler arasındaki farkın çoğundan daha pahalı. — Metrikler: Boş rota, en hızlı: 25.975 istek/sn · Boş rota, en yavaş: 5.966 istek/sn · Fark: boş rota → veritabanı: 4,4× → 3,7× · Laravel web grubu: −%63 — Yöntem: Yedi aday tek bir PHP 8.4.24 derlemesinde, birebir aynı opcache/php.ini/php-fpm havuzunda (pm=static, 8 worker) ve tek bir nginx server bloğunda koştu. Her aday kendi resmî iskeletinde, kendi dokümante ettiği production kurulumuyla (route/config/view cache, APP_ENV=prod, YII_DEBUG=false, Volt önderlenmiş) ve aynı composer bayraklarıyla kuruldu. Yedisi de tam elli rota kaydediyor; parametreli rota her zaman 47. sırada. Ölçüm sırasında yalnız tek bir aday koşuyor; php-fpm 0-3, nginx 4-5, MySQL 6-7 ve yük üreteci 8-11 çekirdeklerinde, ayrık. Her senaryo 64 bağlantıyla 15 saniye, 9 tekrar; adayların sırası her turda karıştırılıyor. Her ölçümün önünde ve arkasında, PHP'ye hiç uğramayan sabit bir nginx referansı örneklenerek o anda makinenin verdiği kapasite kaydediliyor. Raporlanan değer tekrarların en iyisidir: makine sakinleştirilemediği için girişim throughput'u yalnız aşağı çekebilir, donanım tavanının üstüne çıkaramaz. Toplam 546 yük ölçümü, 150 host örneklemesi, sıfır non-200 yanıt. — Güven: Orta güven — Ölçüm tarihi: 2026-08-20 — Servis & yük ## Sor Bakalım — Soru & Cevap Ziyaretçiler soruyor, yazar tek tek yanıtlıyor. Her kayıt tek bir soruya ayrılmış, kendi içinde anlamlı bir sayfadır. Bu bölümün tamamı düz Markdown olarak: https://www.muhammetsafak.com.tr/sor-bakalim.md - [Container'daki Go worker'ım SIGTERM almıyor ve graceful kapanmıyor, bu bir PID 1 sorunu mu?](https://www.muhammetsafak.com.tr/sor-bakalim/containerdaki-go-workerim-sigterm-almiyor-pid-1-sorunu/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/containerdaki-go-workerim-sigterm-almiyor-pid-1-sorunu.md): `CMD`'yi exec form'a çevirin ve `os.Interrupt` yerine `signal.NotifyContext(..., syscall.SIGTERM)` kullanın; tini yalnız fork varsa gerekir. - [API hata gövdelerimi RFC 7807 problem+json biçimine mi taşımalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/api-hata-govdelerimi-rfc-7807-problem-json-tasimaliyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/api-hata-govdelerimi-rfc-7807-problem-json-tasimaliyim.md): 7807 yerine onu güncelleyen RFC 9457'yi baz alın, üretimi tek bir exception handler'a toplayın ve `type` URI'sini sözleşme gibi yönetin. - [Heap erişimini önlemek ve index-only scan almak için covering index'e (INCLUDE) ne zaman geçmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/index-only-scan-covering-indexe-ne-zaman-gecmeliyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/index-only-scan-covering-indexe-ne-zaman-gecmeliyim.md): Sıcak sorguda `EXPLAIN (ANALYZE, BUFFERS)` baskın maliyet olarak heap erişimini gösteriyorsa `INCLUDE` ekleyin, `Heap Fetches: 0` için autovacuum'u sıkın. - [Birbirine bağımlı birden fazla işi, ilk hata hepsini iptal edecek şekilde errgroup ile mi yürütmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/birbirine-bagimli-birden-fazla-isi-ilk-hata-hepsini-iptal-edecek-sekilde/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/birbirine-bagimli-birden-fazla-isi-ilk-hata-hepsini-iptal-edecek-sekilde.md): `errgroup.WithContext`'e geçip üstüne request-level bir timeout koyun ve ctx'i her HTTP/DB çağrısına geçirin; ihmal edilen ctx, iptali sessizce öldürür. - [İşlediğim satırları aynı anda güncellerken chunk yerine chunkById mı kullanmalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/isledigim-satirlari-ayni-anda-guncellerken-chunk-yerine-chunkbyid-mi-kullanmaliyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/isledigim-satirlari-ayni-anda-guncellerken-chunk-yerine-chunkbyid-mi-kullanmaliyim.md): Satır başına gerçek iş varsa `chunkById()` kullanıp cursor kolonuna dokunmayın; iş yalnız bir kolonu güncellemekse tek bir set-based `UPDATE`'e geçin. - [readonly value object'lerimde "withX" tarzı kopyalama metotlarını nasıl temiz yazarım?](https://www.muhammetsafak.com.tr/sor-bakalim/readonly-value-objectlerimde-withx-tarzi-kopyalama-metotlarini-nasil-temiz-yazarim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/readonly-value-objectlerimde-withx-tarzi-kopyalama-metotlarini-nasil-temiz-yazarim.md): `readonly`'de withX yeni instance döndürür: taşınabilir yol `new self` + named arguments, PHP 8.5'te doğrulama basitse `clone($this, [...])`. - [Senior'dan staff'a geçişte işin doğası nasıl değişiyor?](https://www.muhammetsafak.com.tr/sor-bakalim/seniordan-staffa-geciste-isin-dogasi-nasil-degisiyor/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/seniordan-staffa-geciste-isin-dogasi-nasil-degisiyor.md): Org seviyesinde sahipsiz bir problemi üstlenip çözümü yazılı bir tech strategy'ye dökün, etkiyi commit'lerinizle değil ekiplerin çıktısıyla gösterin. - [Correlation ID'yi HTTP isteğinden kuyruğa düşen job'lara kadar nasıl taşımalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/correlation-idyi-http-isteginden-kuyruga-dusen-joblara-kadar-nasil-tasimaliyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/correlation-idyi-http-isteginden-kuyruga-dusen-joblara-kadar-nasil-tasimaliyim.md): ID'yi W3C `traceparent` olarak üretip SQS message attribute'unda taşıyın, her sınırda OTel propagator ile enjekte edin, logger'a `trace_id` verin. - [Container'ı non-root çalıştırınca mount edilen storage dizinine yazamıyorum, izinleri nasıl çözerim?](https://www.muhammetsafak.com.tr/sor-bakalim/containeri-non-root-calistirinca-mount-edilen-storage-dizinine-yazamiyorum-izinleri-nasil/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/containeri-non-root-calistirinca-mount-edilen-storage-dizinine-yazamiyorum-izinleri-nasil.md): Kullanıcıyı build-time `ARG UID` ile sabitleyin, `COPY --chown` kullanın, named volume'de entrypoint yalnız `storage` ve `bootstrap/cache`'i chown etsin. - [OpenAPI şemasını önce mi yazmalıyım yoksa koddan mı üretmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/openapi-semasini-once-mi-yazmaliyim-yoksa-koddan-mi-uretmeliyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/openapi-semasini-once-mi-yazmaliyim-yoksa-koddan-mi-uretmeliyim.md): `openapi.yaml`'ı tek doğru kaynak yapıp contract-first gidin; drift'i bitiren şey yön değil, CI'da spec'i koda karşı doğrulayan yeşil contract testtir. - [Sadece 'pending' satırları taranan bir kuyruk tablosunda partial index kullanmalı mıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/sadece-pending-satirlari-taranan-bir-kuyruk-tablosunda-partial-index-kullanmali-miyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/sadece-pending-satirlari-taranan-bir-kuyruk-tablosunda-partial-index-kullanmali-miyim.md): `WHERE status='pending'` partial index'ine `ORDER BY` kolonunu da katın, `FOR UPDATE SKIP LOCKED` ile eşleyin ve `'pending'`'i sorguya literal geçin. - [İç içe geçmiş servis çağrılarında context iptalini doğru şekilde nasıl yayarım?](https://www.muhammetsafak.com.tr/sor-bakalim/ic-ice-gecmis-servis-cagrilarinda-context-iptalini-dogru-sekilde-nasil-yayarim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/ic-ice-gecmis-servis-cagrilarinda-context-iptalini-dogru-sekilde-nasil-yayarim.md): İptalin yayılması için `r.Context()`'i her downstream çağrıya geçirin, zincirde `context.Background()` bırakmayın, side-effect'e `WithoutCancel` verin. - [Integer cent olarak sakladığım para alanları için custom cast mı yoksa accessor/mutator mı kullanmalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/integer-cent-olarak-sakladigim-para-alanlari-icin-custom-cast-mi-yoksa/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/integer-cent-olarak-sakladigim-para-alanlari-icin-custom-cast-mi-yoksa.md): DB'de integer cent, modelde immutable `Money`: eşlemeyi tek bir `CastsAttributes` sınıfına toplayın, currency'yi aynı cast'ta ikinci kolon yapın. - [Tip güvenli koleksiyonlar için PHPStan generics mi kullanmalıyım, yoksa her tür için ayrı sınıf mı yazmalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/tip-guvenli-koleksiyonlar-icin-phpstan-generics-mi-kullanmaliyim-yoksa-her-tur/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/tip-guvenli-koleksiyonlar-icin-phpstan-generics-mi-kullanmaliyim-yoksa-her-tur.md): `list` docblock'ları ve CI'da katı PHPStan'ı varsayılan yapın; davranış gerekince tek generic `Collection`, güven sınırında concrete sınıf. - [Orta seviyeden senior'a geçerken beklenen "daha geniş etki"yi nasıl gösteririm?](https://www.muhammetsafak.com.tr/sor-bakalim/orta-seviyeden-seniora-gecerken-beklenen-daha-genis-etki-yi-nasil-gosteririm/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/orta-seviyeden-seniora-gecerken-beklenen-daha-genis-etki-yi-nasil-gosteririm.md): Terfiyi soyut bir hedef değil somut bir hamle yapın: kimsenin sahiplenmediği bulanık bir problemi bir çeyrek boyunca tanımından yayılmasına dek üstlenin. - [Loglarımda WARN ile ERROR seviyelerini ne zaman kullanacağıma dair net bir kural nasıl belirlerim?](https://www.muhammetsafak.com.tr/sor-bakalim/loglarimda-warn-ile-error-seviyelerini-ne-zaman-kullanacagima-dair-net-bir/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/loglarimda-warn-ile-error-seviyelerini-ne-zaman-kullanacagima-dair-net-bir.md): Bir satır gece 3'te birini uyandırmayı gerektiriyorsa ERROR, gerektirmiyorsa WARN yazın; hatayı sınırında bir kez loglayıp alert'i ERROR oranına bağlayın. - [Container'daki healthcheck'i Dockerfile'a mı yazmalıyım yoksa Kubernetes probe'larına mı bırakmalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/containerdaki-healthchecki-dockerfilea-mi-yazmaliyim-yoksa-kubernetes-probelarina-mi-birakmaliyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/containerdaki-healthchecki-dockerfilea-mi-yazmaliyim-yoksa-kubernetes-probelarina-mi-birakmaliyim.md): Readiness, liveness ve startup'ı Kubernetes probe'ları olarak tanımlayın; HEALTHCHECK'i yalnız imaj Compose'da da koşuyorsa tutup aynı endpoint'e bağlayın. - [Public API'mde bir endpoint'i kullanımdan kaldırırken sunset sürecini nasıl yönetmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/public-apimde-bir-endpointi-kullanimdan-kaldirirken-sunset-surecini-nasil-yonetmeliyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/public-apimde-bir-endpointi-kullanimdan-kaldirirken-sunset-surecini-nasil-yonetmeliyim.md): Kullanımı partner bazında ölçün, her yanıta Sunset ve Deprecation başlığı koyun, tarihli sunset duyurup brownout yapın, kullanım sıfıra yaklaşınca kesin. - [Sürekli güncellenen bir sessions tablosunda staging'de Index Scan alan sorgu production'da neden Seq Scan'e düşüyor, EXPLAIN ile nasıl teşhis ederim?](https://www.muhammetsafak.com.tr/sor-bakalim/surekli-guncellenen-bir-sessions-tablosunda-stagingde-index-scan-alan-sorgu-productionda/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/surekli-guncellenen-bir-sessions-tablosunda-stagingde-index-scan-alan-sorgu-productionda.md): Production'da EXPLAIN (ANALYZE, BUFFERS) çekip tabloyu ANALYZE edin ve n_dead_tup'a bakın; sessions için autovacuum'u sıkılaştırıp partial index ekleyin. - [Goroutine sızıntılarını uzun süre çalışan bir Go servisinde nasıl tespit edip önlerim?](https://www.muhammetsafak.com.tr/sor-bakalim/goroutine-sizintilarini-uzun-sure-calisan-bir-go-servisinde-nasil-tespit-edip/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/goroutine-sizintilarini-uzun-sure-calisan-bir-go-servisinde-nasil-tespit-edip.md): NumGoroutine()'i dışa açıp zirvede pprof goroutine dökümü alın, binlerce kopyalı park etmiş stack'in spawn noktasını ctx.Done()'a uydurun, goleak ekleyin. - [Eloquent'te N+1'i erken yakalamak için Model::preventLazyLoading'i yalnızca lokalde mi yoksa production'da da mı açmalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/eloquentte-n-1i-erken-yakalamak-icin-model-preventlazyloadingi-yalnizca-lokalde-mi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/eloquentte-n-1i-erken-yakalamak-icin-model-preventlazyloadingi-yalnizca-lokalde-mi.md): Lokal ve CI'da tam katı (throw) çalıştırın; production'da ayarı açık tutup ihlali handleLazyLoadingViolationUsing ile isteği çökertmeden log'layın. - [PHP durum sabitlerimi backed enum'a taşımak kod tabanıma ne kazandırır, neyi zorlaştırır?](https://www.muhammetsafak.com.tr/sor-bakalim/php-durum-sabitlerimi-backed-enuma-tasimak-kod-tabanima-ne-kazandirir-neyi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/php-durum-sabitlerimi-backed-enuma-tasimak-kod-tabanima-ne-kazandirir-neyi.md): Aynı integer değerleriyle backed enum ekleyin, sınırlarda tryFrom() kullanın ve eski sabitleri deprecated alias tutup çağrıları kademeli taşıyın. - [API sunucumu Cloudflare Tunnel arkasına alıp 443'ü internete kapatmalı mıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/api-sunucusunu-cloudflare-tunnel-arkasina-mi-almali/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/api-sunucusunu-cloudflare-tunnel-arkasina-mi-almali.md): Tünel sağlam bir desen ama tek yol bağımlılığıdır; mevcut Caddy kurulumunda kalıp origin'i Cloudflare IP'lerine kilitleyin ve origin pulls ekleyin. - [Hata oranı artınca otomatik rollback yapan (self-healing) deploy altyapısını nasıl tasarlarım?](https://www.muhammetsafak.com.tr/sor-bakalim/hata-artisinda-otomatik-rollback-ve-kendi-kendini-iyilestiren-deploy/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/hata-artisinda-otomatik-rollback-ve-kendi-kendini-iyilestiren-deploy.md): Yeni sürümü canary ağırlığında bir bake süresi boyunca 5xx ve latency eşiğine karşı ölçün; eşik aşılırsa son kararlı sürüme dönüp ekibi yalnızca uyarın. - [Fintek API'si için Canary mi, Blue-Green deployment mı?](https://www.muhammetsafak.com.tr/sor-bakalim/canary-mi-blue-green-mi-fintek-api-icin-deploy-stratejisi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/canary-mi-blue-green-mi-fintek-api-icin-deploy-stratejisi.md): Rutin sürümlerde Canary'yi varsayılan yapın, instant rollback istediğiniz büyük cutover'lara Blue-Green'i saklayın; ikisi de geriye uyumlu şema şart koşar. - [CI/CD'de OIDC ve IAM Role ile şifresiz (secretless) AWS erişimini nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/ci-cd-de-secret-yonetimi-ve-oidc-ile-sifresiz-erisim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/ci-cd-de-secret-yonetimi-ve-oidc-ile-sifresiz-erisim.md): GitHub Secrets'taki uzun ömürlü AWS anahtarlarını silip repo ve branch'e scope'lu bir IAM role'ü OIDC ile üstlenin; bulut dışı secret'ı runtime'da çekin. - [CI/CD'de veritabanı göçlerini (migrations) güvenli nasıl çalıştırırım?](https://www.muhammetsafak.com.tr/sor-bakalim/ci-cd-de-veritabani-goclerini-guvenli-calistirmak/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/ci-cd-de-veritabani-goclerini-guvenli-calistirmak.md): Kolonu nullable ekleyip backfill'i ayrı throttle'lı bir adıma alın, migration'ı deploy'dan ayrı bir aşamada koşturun, eskiyi sonraki release'te düşürün. - [DeployerPHP zero-downtime deploy'da OPcache'ten gelen 500 hatalarını nasıl engellerim?](https://www.muhammetsafak.com.tr/sor-bakalim/deployerphp-ile-sifir-kesinti-deploy-ve-opcache-temizligi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/deployerphp-ile-sifir-kesinti-deploy-ve-opcache-temizligi.md): Symlink'i çevirdikten sonra PHP-FPM'i graceful reload edin (restart değil); Octane'deyseniz worker'lar için octane:reload şart, opcache_reset isteğe bağlı. - [Docker imaj boyutunu multi-stage build ve distroless ile nasıl küçültürüm?](https://www.muhammetsafak.com.tr/sor-bakalim/docker-imaj-boyutunu-multi-stage-ve-distroless-ile-kucultmek/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/docker-imaj-boyutunu-multi-stage-ve-distroless-ile-kucultmek.md): Build araçlarını builder aşamasında bırakın: final aşama Go için distroless ya da scratch, PHP için fpm-alpine olsun; container'ı non-root çalıştırın. - [Gitflow'dan Trunk-Based'e geçerken feature flag mimarisini nasıl konumlandırırım?](https://www.muhammetsafak.com.tr/sor-bakalim/gitflow-mu-trunk-based-mi-ve-feature-flag-mimarisi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/gitflow-mu-trunk-based-mi-ve-feature-flag-mimarisi.md): Uzun ömürlü dalları kaldırıp değişiklikleri küçük parçalar hâlinde main'e alın, bitmemiş işi kapalı bir flag arkasında tutun ve biten flag'i temizleyin. - [Go CLI aracını GoReleaser ve Homebrew ile çoklu platforma nasıl dağıtırım?](https://www.muhammetsafak.com.tr/sor-bakalim/go-cli-aracini-goreleaser-ve-homebrew-ile-dagitmak/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/go-cli-aracini-goreleaser-ve-homebrew-ile-dagitmak.md): Tag push'unda tetiklenen tek bir workflow cross-compile edip Release'i yayımlasın, homebrew_casks: bloğu tap'i güncellesin; tap için ayrı bir PAT şart. - [Hassas finansal veriyi şifrelerken anahtarı .env'de tutmak neden riskli — KMS/Vault ne sağlar?](https://www.muhammetsafak.com.tr/sor-bakalim/hassas-finansal-veriyi-sifrelemek-ve-anahtar-yonetimi-kms/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/hassas-finansal-veriyi-sifrelemek-ve-anahtar-yonetimi-kms.md): Anahtarı .env'den çıkarıp KMS ya da Vault'ta tutun ve envelope encryption kullanın; kimlik ve kart verisinde mümkünse tokenization tercih edin. - [Self-hosted CI/CD runner'larını nasıl izole eder, her çalışmadan sonra temizlenen (ephemeral) ortamı nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/self-hosted-ci-cd-runner-izolasyonu-ve-ephemeral-ortam/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/self-hosted-ci-cd-runner-izolasyonu-ve-ephemeral-ortam.md): Runner'ı kaydol-çalış-yok ol modeline geçirip job'ları unprivileged çalıştırın; Docker soketini vermeyin ve fork PR'larını bu runner'da hiç koşturmayın. - [Terraform state'i S3 + DynamoDB locking ile nasıl güvenli yönetirim?](https://www.muhammetsafak.com.tr/sor-bakalim/terraform-state-yonetimi-s3-ve-dynamodb-ile-locking/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/terraform-state-yonetimi-s3-ve-dynamodb-ile-locking.md): Versiyonlu, şifreli bir S3 backend'e geçip DynamoDB lock tablosu ekleyin (deprecated ama çalışır), state'i ortam başına ayırın, apply'ı CI'dan koşturun. - [WAL arşivleme ve PITR ile felaketten saniyeler öncesine nasıl dönerim?](https://www.muhammetsafak.com.tr/sor-bakalim/veritabani-pitr-ve-wal-arsivleme-ile-felaket-oncesine-donmek/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/veritabani-pitr-ve-wal-arsivleme-ile-felaket-oncesine-donmek.md): Periyodik base backup alıp WAL'ı sürekli S3'e arşivleyin, recovery_target_time ile hatalı ifadenin saniyeler öncesine dönün ve restore'u prova edin. - [Canlı tabloda dual-write ile sıfır kayıplı şema geçişini nasıl koordine ederim?](https://www.muhammetsafak.com.tr/sor-bakalim/canli-tabloda-dual-write-ile-sifir-kayipli-sema-gecisi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/canli-tabloda-dual-write-ile-sifir-kayipli-sema-gecisi.md): 20M satırda bloklayan `ALTER TABLE` yerine expand/contract yürütün: kolonları nullable ekleyin, dual-write edin, throttled batch'lerle backfill edin. - [Zaman serisi verisi için TimescaleDB mi, InfluxDB mu?](https://www.muhammetsafak.com.tr/sor-bakalim/zaman-serisi-verisi-timescaledb-mi-influxdb-mu/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/zaman-serisi-verisi-timescaledb-mi-influxdb-mu.md): Günde 100M satır düz bir tabloda patlar: hypertable ile zamana göre parçalayın, ortalamaları continuous aggregate'e alın, eski chunk'ları sıkıştırın. - [Redis'te canlı leaderboard için neden Sorted Set kullanmalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/redis-veri-tipleri-leaderboard-icin-sorted-set/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/redis-veri-tipleri-leaderboard-icin-sorted-set.md): Skorları String'de tutup uygulamada sıralamak yerine Sorted Set kullanın: `ZADD` O(log N) günceller, `ZREVRANGE 0 99` ilk 100'ü zaten sıralı döner. - [CQRS'i ne zaman uygulamalı ve okuma/yazma modellerini nasıl senkronlamalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/cqrs-ne-zaman-uygulanir-ve-okuma-yazma-senkronizasyonu/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/cqrs-ne-zaman-uygulanir-ve-okuma-yazma-senkronizasyonu.md): Raporlamayı bir read-replica'ya taşıyın, tam CQRS'e ancak sorgu şekilleri tek şemaya sığmadığında geçin ve okuma modelini outbox event'leriyle besleyin. - [Bakiye güncellemede race condition: Pessimistic Lock mı, Redlock mı?](https://www.muhammetsafak.com.tr/sor-bakalim/bakiye-guncellemede-race-condition-pessimistic-lock-mu-redlock-mu/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/bakiye-guncellemede-race-condition-pessimistic-lock-mu-redlock-mu.md): Parayı DB'nin garantisinde tutun: atomik koşullu `UPDATE ... WHERE balance >= 40` ya da `SELECT ... FOR UPDATE` kullanın, Redlock'u DB dışına bırakın. - [Esnek ürün nitelikleri için NoSQL mu, PostgreSQL mi seçmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/esnek-urun-nitelikleri-icin-nosql-mu-postgresql-mi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/esnek-urun-nitelikleri-icin-nosql-mu-postgresql-mi.md): İlişkisel çekirdeği (ürün, fiyat, sipariş) PostgreSQL'de tutup değişken nitelikleri GIN index'li tek bir `JSONB` kolonuna koyun; raporlama bölmeye karşı. - [Kuyrukta poison pill (zehirli mesaj) ve Dead Letter Queue'yu nasıl yönetirim?](https://www.muhammetsafak.com.tr/sor-bakalim/kuyrukta-poison-pill-ve-dead-letter-queue-yonetimi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/kuyrukta-poison-pill-ve-dead-letter-queue-yonetimi.md): İşe `tries` ve `backoff` verin: sınır dolunca Laravel işi `failed_jobs`'a taşır, `JobFailed` listener'ı alert eder, düzelen işi `queue:retry` geri oynatır. - [Health check tasarımı: Liveness ve Readiness ayrımını nasıl yaparım?](https://www.muhammetsafak.com.tr/sor-bakalim/health-check-tasarimi-liveness-ve-readiness-ayrimi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/health-check-tasarimi-liveness-ve-readiness-ayrimi.md): Liveness'ı bağımlılıksız tutun, bağımlılıkları readiness'ta cache'li yoklayın: liveness fail pod'u restart eder, readiness fail yalnız trafiği keser. - [PostgreSQL tablo partitioning'e sıfır kesinti ile nasıl geçerim?](https://www.muhammetsafak.com.tr/sor-bakalim/postgresql-tablo-partitioning-sifir-kesinti-ile-gecis/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/postgresql-tablo-partitioning-sifir-kesinti-ile-gecis.md): `created_at` üzerinde aylık RANGE declarative partitioning kurun, geçmişi batch'lerle backfill edip isimleri tek transaction'da takaslayın. - [Veritabanı deadlock'larını önlemek için hangi kurallara dikkat etmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/veritabani-deadlock-tespiti-ve-onleme-kurallari/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/veritabani-deadlock-tespiti-ve-onleme-kurallari.md): Kilitleri tek bir global sırada, artan PK gibi, alın; transaction'ı kısa ve dar tutun, hedefli `FOR UPDATE` kullanın, kalanı backoff ile retry edin. - [Go HTTP sunucusunda panic'i recovery middleware ile nasıl yönetirim?](https://www.muhammetsafak.com.tr/sor-bakalim/go-da-panic-yonetimi-ve-recovery-middleware/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/go-da-panic-yonetimi-ve-recovery-middleware.md): Zincirin en dışına `defer recover()` koyun, stack'i request id ile loglayıp generic 500 dönün, metrik basın, her goroutine'e kendi recover'ını verin. - [Felaket kurtarma: RTO ve RPO'ya göre aktif-pasif senaryoyu nasıl kurgularım?](https://www.muhammetsafak.com.tr/sor-bakalim/felaket-kurtarma-rto-rpo-ve-aktif-pasif-senaryo/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/felaket-kurtarma-rto-rpo-ve-aktif-pasif-senaryo.md): RPO 5 dakika sürekli cross-region replikasyon ve PITR, RTO 30 dakika ise IaC ile hazır bekleyen sıcak yedek ve Route 53 failover demek; düzenli prova edin. - [Log storm ve disk dolma krizini nasıl önlerim?](https://www.muhammetsafak.com.tr/sor-bakalim/log-storm-ve-disk-dolma-krizini-onlemek/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/log-storm-ve-disk-dolma-krizini-onlemek.md): Tekrarlı logu uygulamada sayaçla tek satıra indirin, retry'a backoff koyun, logrotate'e boyut ve sayı sınırı verin, `/var/log`'u kök diskten ayırın. - [Dağıtık brute force ve DDoS'a karşı akıllı rate limiting'i nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/dagitik-brute-force-ve-ddos-icin-akilli-rate-limiting/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/dagitik-brute-force-ve-ddos-icin-akilli-rate-limiting.md): IP limiti dönen proxy'lere yenilir: Redis sliding-window'u hesap + IP + ASN'de anahtarlayın, hesap kilidi ekleyin, volumetrik seli edge'e bırakın. - [Graceful degradation: kritik olmayan servisleri yük altında nasıl izole ederim?](https://www.muhammetsafak.com.tr/sor-bakalim/graceful-degradation-kritik-olmayan-servisleri-izole-etmek/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/graceful-degradation-kritik-olmayan-servisleri-izole-etmek.md): Kritik akışı (gez, sepet, ödeme) lüks bileşenlerden ayırın, lüksleri kısa timeout'lu feature flag arkasına koyun, kill-switch'i kriz gelmeden prova edin. - [Dağıtık sistemde Saga Pattern ile eventual consistency'yi nasıl tasarlarım?](https://www.muhammetsafak.com.tr/sor-bakalim/dagitik-sistemde-saga-pattern-ile-eventual-consistency/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/dagitik-sistemde-saga-pattern-ile-eventual-consistency.md): Tek atomik işlemi telafi aksiyonlu yerel işlemlere bölün: adımları orchestrator kuyruktan sürsün, her adım idempotent olsun, olaylar outbox'tan çıksın. - [PostgreSQL split-brain'i quorum ve mutabakat ile nasıl önlerim?](https://www.muhammetsafak.com.tr/sor-bakalim/postgresql-split-brain-quorum-ve-mutabakat-ile-onlemek/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/postgresql-split-brain-quorum-ve-mutabakat-ile-onlemek.md): Failover'ı elle yazmayın: Patroni + etcd ile terfiyi quorum'a bağlayın, çoğunluktan kopan eski primary fencing ile kendini replica'ya düşürsün. - [Üçüncü parti API bağımlılığında Circuit Breaker'ı nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/ucuncu-parti-api-icin-circuit-breaker-deseni/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/ucuncu-parti-api-icin-circuit-breaker-deseni.md): Breaker tek başına yetmez: `connect_timeout` ve `timeout`'u 800ms-2s'ye çekin, bağımlılığı bulkhead ile izole edin, cache'li bir fallback tanımlayın. - [CDN'de asset sürümleme: hash'leme ve cache stratejisini nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/cdn-asset-surumleme-hashleme-ve-cache-stratejisi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/cdn-asset-surumleme-hashleme-ve-cache-stratejisi.md): Query-string busting'i bırakın: asset'i content-hash'li adla `immutable` cache'leyin, HTML'i kısa ömürlü tutun, canlıya geçmeden önce yükleyin. - [Elasticsearch'te 'search-as-you-type' performansını edge n-gram ile nasıl optimize ederim?](https://www.muhammetsafak.com.tr/sor-bakalim/elasticsearch-anlik-arama-edge-ngram-ile-optimizasyon/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/elasticsearch-anlik-arama-edge-ngram-ile-optimizasyon.md): Autocomplete'te wildcard kullanmayın; önekleri edge_ngram ile yazma anında üretip arama tarafında standart analyzer bırakın, sorgu term lookup'a insin. - [2-5 GB dosyaları PHP belleğini şişirmeden stream ile nasıl indirtirim?](https://www.muhammetsafak.com.tr/sor-bakalim/buyuk-dosyalari-php-bellegini-sismeden-stream-ile-indirmek/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/buyuk-dosyalari-php-bellegini-sismeden-stream-ile-indirmek.md): 2-5 GB dosyayı presigned URL ya da X-Accel-Redirect ile PHP'nin dışından servis edin; zorundaysanız readStream ile chunk'layıp buffering'i kapatın. - [HTTP/2 ve HTTP/3 (QUIC) API performansını nasıl etkiler?](https://www.muhammetsafak.com.tr/sor-bakalim/http-2-ve-http-3-quic-api-performansina-etkisi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/http-2-ve-http-3-quic-api-performansina-etkisi.md): HTTP/2'yi hemen açın; çoklama ekran başına 4-5 isteği tek bağlantıya indirir, mobil kitle ağırlıktaysa HTTP/3 ekleyin ve domain sharding'i kaldırın. - [PgBouncer'da Session/Transaction/Statement modlarından hangisini seçmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/pgbouncer-session-transaction-statement-modu-ve-prepared-statement/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/pgbouncer-session-transaction-statement-modu-ve-prepared-statement.md): Web filosunda Transaction modunu seçin; bedeli protokol seviyesi prepared statement'lardır, onları kapatın ya da PgBouncer 1.21+ desteğini açın. - [Yeni bir projeye mikroservislerle mi başlamalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/yeni-projeye-mikroservisle-mi-baslamali/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/yeni-projeye-mikroservisle-mi-baslamali.md): Sıfırdan başlayan çoğu üründe modüler monolitle başlayıp sınırları kodda zorlayın; bir modülü ancak ayrı ölçeklenmesi gerektiğinde servise terfi ettirin. - [Autoscaling scale-in sırasında SIGTERM ile graceful shutdown'ı nasıl sağlarım?](https://www.muhammetsafak.com.tr/sor-bakalim/autoscaling-sirasinda-sigterm-ile-graceful-shutdown/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/autoscaling-sirasinda-sigterm-ile-graceful-shutdown.md): SIGTERM'de önce load balancer'dan çıkıp yeni isteği kesin, açık işleri server.Shutdown(ctx) deadline'ında bitirin ve grace süresini drain'e hizalayın. - [PostgreSQL'de composite index kolon sırasını nasıl seçerim?](https://www.muhammetsafak.com.tr/sor-bakalim/postgresql-composite-index-kolon-sirasi-nasil-secilir/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/postgresql-composite-index-kolon-sirasi-nasil-secilir.md): Tek bir (user_id, status, created_at DESC) composite index kurun: eşitlik kolonları başa, sıralama kolonu sona; kapsanan tekli indeksleri silin. - [Redis cache stampede'i (thundering herd) nasıl önlerim — mutex lock mı, XFetch mi?](https://www.muhammetsafak.com.tr/sor-bakalim/redis-cache-stampede-mutex-lock-mu-xfetch-mi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/redis-cache-stampede-mutex-lock-mu-xfetch-mi.md): Çoğu durumda single-flight lock ve TTL jitter yeter; XFetch'i recompute gerçekten pahalıyken açın ve her iki hâlde stale-while-revalidate ekleyin. - [Go'da GC baskısını sync.Pool ve escape analizi ile nasıl azaltırım?](https://www.muhammetsafak.com.tr/sor-bakalim/go-da-gc-baskisini-sync-pool-ve-escape-analizi-ile-azaltmak/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/go-da-gc-baskisini-sync-pool-ve-escape-analizi-ile-azaltmak.md): Duraklamaların ardındaki düşman tahsis hızıdır: pprof ile en çok tahsis edeni öldürün, hot path'i sync.Pool ile havuzlayın, GOGC ayarını en sona bırakın. - [Laravel Octane (FrankenPHP) altında bellek sızıntısını nasıl debug ederim?](https://www.muhammetsafak.com.tr/sor-bakalim/laravel-octane-frankenphp-bellek-sizintisi-nasil-debug-edilir/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/laravel-octane-frankenphp-bellek-sizintisi-nasil-debug-edilir.md): Önce memory_get_usage eğrisini çıkarın, service provider'ları bisect edip suçluyu daraltın, stateful singleton'ları Octane hook'larında sıfırlayın. - [Multi-tenant SaaS'ta veritabanı izolasyonu: ayrı DB mi, şema mı, tenant_id mi?](https://www.muhammetsafak.com.tr/sor-bakalim/multi-tenant-saas-veritabani-izolasyon-stratejisi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/multi-tenant-saas-veritabani-izolasyon-stratejisi.md): 10.000 tenant'ta database-per-tenant operasyonel olarak ölçeklenmez; her tabloda tenant_id tutup izolasyonu Postgres Row-Level Security'ye gömün. - [Ödeme webhook'u aynı bildirimi tekrar gönderiyor; idempotency'i nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/webhook-mukerrer-bildirim-idempotency-ve-hmac/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/webhook-mukerrer-bildirim-idempotency-ve-hmac.md): HMAC'i ham gövdede constant-time doğrulayın, hızlı 200 dönüp işi kuyruğa alın ve tekilliği event_id üzerindeki UNIQUE constraint'e yaptırın. - [PHP monolitten ödeme modülünü Strangler Fig ile nasıl koparırım?](https://www.muhammetsafak.com.tr/sor-bakalim/monolitten-mikroservise-strangler-fig-ile-kademeli-gecis/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/monolitten-mikroservise-strangler-fig-ile-kademeli-gecis.md): Ödemeyi gateway'de 5/20/100 ağırlıkla kaydırıp önce shadow'da doğrulayın; asıl iş tabloları ayırmak, arkasında anti-corruption layer ve outbox durur. - [Cloudflare Workers + KV ile edge cache kurarsam invalidation'ı nasıl yaparım?](https://www.muhammetsafak.com.tr/sor-bakalim/cloudflare-workers-kv-ile-edge-cache-ve-invalidation/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/cloudflare-workers-kv-ile-edge-cache-ve-invalidation.md): Fiyat değiştiği an aynı transaction ya da outbox içinde KV'ye write-through yapın veya key'i silin; kısa TTL ve versiyonlu key yalnızca emniyet ağıdır. - [Mikroservislerde dağıtık izlemeyi (OpenTelemetry) nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/mikroserviste-dagitik-izleme-opentelemetry-ile-nasil-kurulur/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/mikroserviste-dagitik-izleme-opentelemetry-ile-nasil-kurulur.md): W3C Trace Context'te standartlaşıp propagation'ı OTel SDK'ya bırakın ve traceparent'ı kuyruk mesajının header'ına koyun; zincir orada kopuyor. - [WireGuard ile Docker ağları çakışıyor; routing'i nasıl stabilize ederim?](https://www.muhammetsafak.com.tr/sor-bakalim/wireguard-ile-docker-agi-ip-cakismasi-ve-routing/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/wireguard-ile-docker-agi-ip-cakismasi-ve-routing.md): Çakışma runtime hatası değil adresleme planı sorunudur: Docker havuzunu daemon.json'da pinleyin, AllowedIPs'i DB subnet'ine kısın, rotaları kalıcı yapın. - [LLM sağlayıcısını (Ollama → Bedrock/OpenAI) nasıl soyutlamalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/ollama-dan-uretimde-bedrock-openai-a-gecerken-llm-soyutlamasi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/ollama-dan-uretimde-bedrock-openai-a-gecerken-llm-soyutlamasi.md): Tek bir dar arayüz (complete(prompt, opts)) ve config ile seçilen üç implementasyon kurun; context penceresi, gecikme ve maliyeti config olarak taşıyın. - [Yerel diskteki dosyaları S3'e taşırken EFS ara çözüm olur mu?](https://www.muhammetsafak.com.tr/sor-bakalim/yerel-diskten-s3-e-gecerken-efs-ara-cozum-mu/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/yerel-diskten-s3-e-gecerken-efs-ara-cozum-mu.md): EFS'i ara durak yapmayın; Flysystem'in s3 diskine geçip okuma ve yazmayı Storage::disk() üzerinden yapın ve dual-read ile kesintisiz taşıyın. - [Laravel ve Go servisleri arasında mesaj şeması için Protobuf mu, JSON Schema mı?](https://www.muhammetsafak.com.tr/sor-bakalim/laravel-ve-go-arasinda-mesaj-semasi-protobuf-mu-json-schema-mi/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/laravel-ve-go-arasinda-mesaj-semasi-protobuf-mu-json-schema-mi.md): Yoğun Laravel-Go trafiğinde Protobuf ve bir schema registry seçin; JSON Schema'yı hafif trafiğe bırakın ve gevşek array'i sınırda tipli DTO'ya çevirin. - [Logları OpenSearch'e gönderirken Fluent Bit ile arasına Kafka/Redis buffer koymalı mıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/loglari-opensearch-e-gonderirken-araya-kafka-buffer-koymali-miyim/) [md](https://www.muhammetsafak.com.tr/sor-bakalim/loglari-opensearch-e-gonderirken-araya-kafka-buffer-koymali-miyim.md): Önce Fluent Bit'in filesystem buffer'ını açın; 40k/s kalıcıysa Kafka'ya geçin, Redis listesini yalnızca kaybını göze aldığınız loglarda kullanın. ## Blog — seçilmiş yazılar Kategori başına en güncel üç yazı. Arşivin tamamı aşağıda, `## Optional` altında. - [Oyun geliştirmek planımda yoktu — kapsamı kısıt seçti](https://www.muhammetsafak.com.tr/blog/oyun-gelistirmek-planimda-yoktu-regnarium/) [md](https://www.muhammetsafak.com.tr/blog/oyun-gelistirmek-planimda-yoktu-regnarium.md): Tek başına bir strateji oyunu yapmanın tek yolu kapsamı kesmekti. Kısıt listesi, oyunun bütün mekaniklerini kendiliğinden seçti. - [Prod erişimi tek kişideydi, o kişi izne çıktı](https://www.muhammetsafak.com.tr/blog/prod-erisimi-tek-kisideydi-queryproxy/) [md](https://www.muhammetsafak.com.tr/blog/prod-erisimi-tek-kisideydi-queryproxy.md): Üretim veritabanına erişimi olan tek kişi tatile gidince geliştirme durdu. İhtiyaç dört cümleye indi; her biri bir tasarım kararına dönüştü. - [Hangi şirket size uygun? Bu bir kimlik değil, bir dönem kararıdır](https://www.muhammetsafak.com.tr/blog/hangi-sirket-size-uygun-bir-donem-kararidir/) [md](https://www.muhammetsafak.com.tr/blog/hangi-sirket-size-uygun-bir-donem-kararidir.md): Doğru şirket tipi yok, yanlış eşleşme var. Dizinin kapanışı: hangi dönem neyi öğretir ve bir sonraki mülakatta soracağınız sekiz soru. - [Şirket büyürken ne kırılır: patron şirketinden kurumsala geçiş](https://www.muhammetsafak.com.tr/blog/sirket-buyurken-ne-kirilir-patron-sirketinden-kurumsala-gecis/) [md](https://www.muhammetsafak.com.tr/blog/sirket-buyurken-ne-kirilir-patron-sirketinden-kurumsala-gecis.md): Büyüme basamaklıdır ve her basamakta kırılan şey aynı: enformel koordinasyonun kapasitesi. Kurucu, yeni yönetici ve erken çalışan gözünden. - [Partial index'i hız için seçmeyin](https://medium.com/@muhammetsafak/partial-indexi-hiz-icin-secmeyin-d47f71da2b30): 10 milyon ölü satırlı bir Postgres kuyruk tablosunda dört index stratejisi: kazanan beklediğim gerekçeyle kazanmadı, bir ayar onu 1.635 kat yavaşlattı. - [Go ile yazdığım bir komut satırı aracını paketlemek ve dağıtmak](https://www.muhammetsafak.com.tr/blog/go-ile-komut-satiri-aracini-paketlemek-ve-dagitmak/) [md](https://www.muhammetsafak.com.tr/blog/go-ile-komut-satiri-aracini-paketlemek-ve-dagitmak.md): Bir Go CLI aracını yazmak işin yarısı; onu sürümlemek, çapraz derlemek ve başkalarının kolayca kurabileceği biçimde dağıtmak diğer yarısı. - [TypeScript'in yeni derleyicisi ve build hızının önemi](https://www.muhammetsafak.com.tr/blog/typescriptin-yeni-derleyicisi-ve-build-hizi/) [md](https://www.muhammetsafak.com.tr/blog/typescriptin-yeni-derleyicisi-ve-build-hizi.md): TypeScript derleyicisinin Go'ya port edilmesi ve hızlı geri bildirim döngüsünün bir geliştirici için neden bu kadar değerli olduğu. - [Modern CSS'i yeniden keşfetmek](https://www.muhammetsafak.com.tr/blog/modern-cssi-yeniden-kesfetmek/) [md](https://www.muhammetsafak.com.tr/blog/modern-cssi-yeniden-kesfetmek.md): Yıllarca JavaScript ve önişlemciyle çözdüğümüz şeyler artık CSS'in kendisinde: container query, :has() ve yerel nesting. - [PHP Öldü mü? 2026 Tablosu, Veriyle](https://www.muhammetsafak.com.tr/blog/php-oldu-mu-2026-tablosu-veriyle/) [md](https://www.muhammetsafak.com.tr/blog/php-oldu-mu-2026-tablosu-veriyle.md): 18 yıllık bir PHP geliştiricisinin gözünden: W3Techs, Stack Overflow, JetBrains ve Packagist verileriyle PHP'nin 2026 fotoğrafı ve zayıf yanları. - [Production'da Git: Senior'ın Pratik Rehberi](https://www.muhammetsafak.com.tr/blog/production-git-senior-pratik-rehberi/) [md](https://www.muhammetsafak.com.tr/blog/production-git-senior-pratik-rehberi.md): Workflow seçiminden bisect ile bug avına, rebase disiplininden worktree ve signed commit'lere — Git'i bir yıllarca kullandıktan sonra fark ettiklerim. - [Laravel'le on iki yıl: bir framework'le büyümek](https://www.muhammetsafak.com.tr/blog/laravelle-on-iki-yil-bir-frameworkle-buyumek/) [md](https://www.muhammetsafak.com.tr/blog/laravelle-on-iki-yil-bir-frameworkle-buyumek.md): 2014'ten 2026'ya Laravel ile geçirilen on iki yıl: bir araçla birlikte olgunlaşmanın, onu aşmanın ve yeniden benimsemenin hikâyesi. - [React 19 ve form'ların yeni hali (actions)](https://www.muhammetsafak.com.tr/blog/react-19-ve-formlarin-yeni-hali-actions/) [md](https://www.muhammetsafak.com.tr/blog/react-19-ve-formlarin-yeni-hali-actions.md): React 19'un kararlı sürümüyle gelen form actions modelini, mevcut yaklaşımlarla kıyaslayarak değerlendiriyorum. - [Laravel 12: sürüm ritmi olgunlaşırken](https://www.muhammetsafak.com.tr/blog/laravel-12-surum-ritmi-olgunlasirken/) [md](https://www.muhammetsafak.com.tr/blog/laravel-12-surum-ritmi-olgunlasirken.md): Laravel 12 ile gelen değişiklikleri ve framework'ün yıllık sürüm temposunun proje planlamasına etkisini değerlendiriyorum. - [Tailwind CSS 4: yeni motor ve yapılandırma](https://www.muhammetsafak.com.tr/blog/tailwind-css-4-yeni-motor-ve-yapilandirma/) [md](https://www.muhammetsafak.com.tr/blog/tailwind-css-4-yeni-motor-ve-yapilandirma.md): Tailwind CSS 4 ile gelen Oxide motoru ve CSS-öncelikli yapılandırma yaklaşımını, büyük bir sürüm geçişinin gerektirdiği sakinlikle değerlendiriyorum. - [Basic Authentication](https://www.muhammetsafak.com.tr/blog/basic-authentication/) [md](https://www.muhammetsafak.com.tr/blog/basic-authentication.md): HTTP Basic Authentication nedir, nasıl çalışır ve ne zaman kullanılır? Temel kimlik doğrulama yönteminin işleyişi. - [JWT Authentication](https://www.muhammetsafak.com.tr/blog/jwt-authentication/) [md](https://www.muhammetsafak.com.tr/blog/jwt-authentication.md): JWT (JSON Web Token) ile kimlik doğrulama: token yapısı, çalışma mantığı ve tipik kullanım senaryoları. - [API'de idempotency: aynı isteği güvenle tekrar etmek](https://www.muhammetsafak.com.tr/blog/api-de-idempotency-ayni-istegi-guvenle-tekrar-etmek/) [md](https://www.muhammetsafak.com.tr/blog/api-de-idempotency-ayni-istegi-guvenle-tekrar-etmek.md): Tekrarlanan API isteklerinin yan etki üretmemesini tasarlamak; idempotency anahtarları ve uygulama katmanında pratik çözümler. - [Laravel 11 ile gelen yeni, ince iskelet yapısı](https://www.muhammetsafak.com.tr/blog/laravel-11-ile-gelen-yeni-ince-iskelet-yapisi/) [md](https://www.muhammetsafak.com.tr/blog/laravel-11-ile-gelen-yeni-ince-iskelet-yapisi.md): Laravel 11'in sadeleşen iskelet yapısı, kaldırılan varsayılanlar ve bunların günlük geliştirme pratiklerine somut etkisi. ## Optional Blog arşivinin geri kalanı. Daha kısa bir bağlam gerekiyorsa bu bölüm atlanabilir; yukarıdaki bölümler sitenin ne olduğunu tek başına anlatır. ### Blog — Diller - [PHP'de Sabit, Enum ve Readonly: 10 Aracın Tek Karar Ağacı](https://www.muhammetsafak.com.tr/blog/php-sabit-enum-readonly-sekiz-aracin-karar-agaci/) [md](https://www.muhammetsafak.com.tr/blog/php-sabit-enum-readonly-sekiz-aracin-karar-agaci.md): define'dan asymmetric visibility'ye — modern PHP'de değişmezliği doğru kurmak için üç eksende bir mental model ve somut karar matrisi. - [2026'da PHP ile uygulama geliştirmek: ekosistemin hali](https://www.muhammetsafak.com.tr/blog/2026da-php-ile-uygulama-gelistirmek-ekosistemin-hali/) [md](https://www.muhammetsafak.com.tr/blog/2026da-php-ile-uygulama-gelistirmek-ekosistemin-hali.md): PHP'nin 2026'daki gerçek durumu: dil olgunluğu, ekosistem sağlığı ve 'öldü' söyleminin neden hâlâ yanlış olduğu. - [PHP 8.5 yolda: dilin olgunlaşan yüzü](https://www.muhammetsafak.com.tr/blog/php-85-yolda-dilin-olgunlasan-yuzu/) [md](https://www.muhammetsafak.com.tr/blog/php-85-yolda-dilin-olgunlasan-yuzu.md): PHP 8.5 henüz çıkmadı; ama gündemde olan önerilere bakarak on yılı aşkın bir dilin nasıl evrildiğini okuyorum. - [Go'nun standart kütüphanesiyle ne kadar uzağa gidilir](https://www.muhammetsafak.com.tr/blog/gonun-standart-kutuphanesiyle-ne-kadar-uzaga-gidilir/) [md](https://www.muhammetsafak.com.tr/blog/gonun-standart-kutuphanesiyle-ne-kadar-uzaga-gidilir.md): Go'nun zengin standart kütüphanesinin gerçekte ne kadar yol kat ettirdiğini, harici bağımlılık ekleme kararını somut örneklerle tartıyorum. - [PHP 8.4 yolda: property hook'lar ve asimetrik görünürlük](https://www.muhammetsafak.com.tr/blog/php-8-4-yolda-property-hooklar-ve-asimetrik-gorunurluk/) [md](https://www.muhammetsafak.com.tr/blog/php-8-4-yolda-property-hooklar-ve-asimetrik-gorunurluk.md): PHP 8.4 ile gelen property hook'lar ve asimetrik görünürlük; bu eklemelerin sınıf modellemesini nasıl değiştireceği. - [Go'da test yazmak: tablo testleri (table-driven tests)](https://www.muhammetsafak.com.tr/blog/go-da-test-yazmak-tablo-testleri-table-driven-tests/) [md](https://www.muhammetsafak.com.tr/blog/go-da-test-yazmak-tablo-testleri-table-driven-tests.md): Go'nun standart test kütüphanesi ve tablo testi (table-driven test) desenini uygulamalı olarak kavramak; dilin sade test felsefesini benimsemek. - [PHP 8.3: typed class constants ve gelen eklemeler](https://www.muhammetsafak.com.tr/blog/php-8-3-typed-class-constants-ve-gelen-eklemeler/) [md](https://www.muhammetsafak.com.tr/blog/php-8-3-typed-class-constants-ve-gelen-eklemeler.md): PHP 8.3 ile gelen tipli sınıf sabitleri, json_validate, #[Override] ve dinamik sabit erişimi; dilin tutarlılık yönündeki adımları. - [TypeScript'te tip düzeyinde programlama: utility types](https://www.muhammetsafak.com.tr/blog/typescriptte-tip-duzeyinde-programlama-utility-types/) [md](https://www.muhammetsafak.com.tr/blog/typescriptte-tip-duzeyinde-programlama-utility-types.md): TypeScript'in yerleşik utility type'ları ve tip dönüştürme mekanizmaları: tip sistemini bir araç olarak ileri düzeyde kullanmak. - [PHP'de tasarım desenlerini abartmadan kullanmak](https://www.muhammetsafak.com.tr/blog/phpde-tasarim-desenlerini-abartmadan-kullanmak/) [md](https://www.muhammetsafak.com.tr/blog/phpde-tasarim-desenlerini-abartmadan-kullanmak.md): Tasarım desenleri amaç değil araç. PHP'de hangi deseni ne zaman kullanmak gerektiği ve ne zaman gereksiz karmaşıklık yarattığı üzerine. - [PHP de Trait Nedir? Ne İçin Kullanılır?](https://www.muhammetsafak.com.tr/blog/php-trait-nedir-ne-icin-kullanilir/) [md](https://www.muhammetsafak.com.tr/blog/php-trait-nedir-ne-icin-kullanilir.md): PHP'de trait nedir, ne için kullanılır? Çoklu kalıtım ihtiyacını trait'lerle çözmeyi örneklerle anlatıyorum. - [PHP 8.2 yolda: readonly sınıflar ve yeni tipler](https://www.muhammetsafak.com.tr/blog/php-8-2-yolda-readonly-siniflar-ve-yeni-tipler/) [md](https://www.muhammetsafak.com.tr/blog/php-8-2-yolda-readonly-siniflar-ve-yeni-tipler.md): PHP 8.2 ile gelen readonly sınıflar, DNF tipler ve tek başına tip bildirimleri; bu eklemelerin domain modellemesine etkisi. - [Kod tabanında isimlendirme: bir mimari mesele](https://www.muhammetsafak.com.tr/blog/kod-tabaninda-isimlendirme-bir-mimari-mesele/) [md](https://www.muhammetsafak.com.tr/blog/kod-tabaninda-isimlendirme-bir-mimari-mesele.md): İsimlendirme neden salt stil meselesi değil, tasarım kararının kendisidir. Yıllar içinde gözlemlediğim örüntüler. - [TypeScript ile uçtan uca tip güvenliği: API'den arayüze](https://www.muhammetsafak.com.tr/blog/typescript-ile-uctan-uca-tip-guvenligi-apiden-arayuze/) [md](https://www.muhammetsafak.com.tr/blog/typescript-ile-uctan-uca-tip-guvenligi-apiden-arayuze.md): Tip sözleşmesini backend API'den frontend arayüzüne kırılmadan taşımak ve bu süreçteki pratik yöntemler. - [Python ile otomasyon: tekrarlayan işleri betiğe dökmek](https://www.muhammetsafak.com.tr/blog/python-ile-otomasyon-tekrarlayan-isleri-betege-dokmek/) [md](https://www.muhammetsafak.com.tr/blog/python-ile-otomasyon-tekrarlayan-isleri-betege-dokmek.md): Manuel iş akışlarını güvenilir Python betiklerine taşımak: hangi işler betiklenmeye değer ve bunu nasıl doğru yaparsınız. - [Modern PHP'de value object tasarlamak](https://www.muhammetsafak.com.tr/blog/modern-phpde-deger-nesneleri-value-object-tasarlamak/) [md](https://www.muhammetsafak.com.tr/blog/modern-phpde-deger-nesneleri-value-object-tasarlamak.md): İlkel tipler yerine anlamı koda gömmek: PHP'de value object tasarımının neden ve nasılı üzerine. - [Go 1.18 generic'ler: uzun bekleyişin sonuna doğru](https://www.muhammetsafak.com.tr/blog/go-1-18-genericler-uzun-bekleyisin-sonuna-dogru/) [md](https://www.muhammetsafak.com.tr/blog/go-1-18-genericler-uzun-bekleyisin-sonuna-dogru.md): Go 1.18 ile gelen generic desteği bir dilin nasıl yeniden şekillenebileceğini gösteriyor. İlk izlenimler ve trade-off'lar. - [PHP 8.1 yolda: enum'lar ve readonly ile daha güvenli modeller](https://www.muhammetsafak.com.tr/blog/php-8-1-yolda-enumlar-ve-readonly-ile-daha-guvenli-modeller/) [md](https://www.muhammetsafak.com.tr/blog/php-8-1-yolda-enumlar-ve-readonly-ile-daha-guvenli-modeller.md): PHP 8.1 henüz çıkmadı; ama gelen enum ve readonly özelliklerinin domain modellemesine nasıl etki edeceğini inceliyorum. - [PHP'de Veri Türleri Dönüşümü ve Tür Dayatma İşlemleri](https://www.muhammetsafak.com.tr/blog/php-veri-turleri-donusumu-tur-dayatma-islemleri/) [md](https://www.muhammetsafak.com.tr/blog/php-veri-turleri-donusumu-tur-dayatma-islemleri.md): PHP'de veri türü dönüşümü ve tür dayatma: gettype, settype, var_dump ve dönüşüm işlemleri. - [TypeScript'te generic'ler ve tip çıkarımı](https://www.muhammetsafak.com.tr/blog/typescriptte-genericler-ve-tip-cikarimi/) [md](https://www.muhammetsafak.com.tr/blog/typescriptte-genericler-ve-tip-cikarimi.md): TypeScript'te generic'leri kullanarak yeniden kullanılabilir, tip-güvenli soyutlamalar kurmak ve tip çıkarımından yararlanmak. - [Go'da hata yönetimi: error değeriyle yaşamak](https://www.muhammetsafak.com.tr/blog/goda-hata-yonetimi-error-degeriyle-yasamak/) [md](https://www.muhammetsafak.com.tr/blog/goda-hata-yonetimi-error-degeriyle-yasamak.md): İstisna (exception) mekanizması olmayan Go'da hata yönetimini dil deyimi olarak benimsemenin pratik yolu. - [PHP'de enum ihtiyacı: 8.1 öncesi çözümler](https://www.muhammetsafak.com.tr/blog/phpde-enum-ihtiyaci-8-1-oncesi-cozumler/) [md](https://www.muhammetsafak.com.tr/blog/phpde-enum-ihtiyaci-8-1-oncesi-cozumler.md): PHP 8.1 native enum getirmeden önce sabit kümeleri nasıl temsil ediyorduk ve her yaklaşımın trade-off'ları nelerdi. - [PHP 8.0 ile kod yazmak: attribute'lar ve nullsafe operatör](https://www.muhammetsafak.com.tr/blog/php-8-0-ile-kod-yazmak-attribute-lar-ve-nullsafe-operator/) [md](https://www.muhammetsafak.com.tr/blog/php-8-0-ile-kod-yazmak-attribute-lar-ve-nullsafe-operator.md): PHP 8.0 çıktı. Attribute'ları ve nullsafe operatörü gerçek kodda nasıl kullandığımı, ne kazandırdığını paylaşıyorum. - [PHP 8.0'a hazırlık: union types, match, named arguments](https://www.muhammetsafak.com.tr/blog/php-8-0-a-hazirlik-union-types-match-named-arguments/) [md](https://www.muhammetsafak.com.tr/blog/php-8-0-a-hazirlik-union-types-match-named-arguments.md): PHP 8.0 henüz çıkmadı ama RFC'ler ve beta sürümleri okunabilir. Üç önemli özelliği şimdiden anlamak için notlarımı paylaşıyorum. - [Python ile veri işleme betikleri yazmak](https://www.muhammetsafak.com.tr/blog/python-ile-veri-isleme-betikleri-yazmak/) [md](https://www.muhammetsafak.com.tr/blog/python-ile-veri-isleme-betikleri-yazmak.md): Tekrarlayan dönüştürme işlerini Python'a devretmenin pratik gerekçesini ve somut betik örneklerini paylaşıyorum. - [PHP'de İstisnalar ve Hata Yönetimi](https://www.muhammetsafak.com.tr/blog/php-istisna-hata-yonetimi/) [md](https://www.muhammetsafak.com.tr/blog/php-istisna-hata-yonetimi.md): PHP'de istisnalar (exception) ve hata yönetimi: try-catch-finally yapıları ve özel istisnalar. - [Go'da HTTP servisi yazmak: standart kütüphane yeter mi](https://www.muhammetsafak.com.tr/blog/go-da-http-servisi-yazmak-standart-kutuphane-yeter-mi/) [md](https://www.muhammetsafak.com.tr/blog/go-da-http-servisi-yazmak-standart-kutuphane-yeter-mi.md): Go'nun net/http paketiyle küçük bir HTTP servisi kurarken neyin geldiğini, neyin gelmediğini ve framework eşiğini tartışıyorum. - [PHP 7.4 ile gelen typed properties ve ok fonksiyonları](https://www.muhammetsafak.com.tr/blog/php-7-4-ile-gelen-typed-properties-ve-ok-fonksiyonlari/) [md](https://www.muhammetsafak.com.tr/blog/php-7-4-ile-gelen-typed-properties-ve-ok-fonksiyonlari.md): PHP 7.4 Kasım 2019'da yayınlandı. Typed properties ve arrow function'lar, dilin tip sistemini ve sözdizimini önemli ölçüde güçlendiriyor. - [Go'da eşzamanlılık: goroutine ve channel pratiği](https://www.muhammetsafak.com.tr/blog/goda-eszamanlilik-goroutine-ve-channel-pratigi/) [md](https://www.muhammetsafak.com.tr/blog/goda-eszamanlilik-goroutine-ve-channel-pratigi.md): Go'nun eşzamanlılık modelini — goroutine ve channel'ı — uygulamalı kavramak. PHP'nin süreç modelinden gelince ne değişiyor? - [TypeScript'e geçiş: JavaScript'te tip güvenliği](https://www.muhammetsafak.com.tr/blog/typescripte-gecis-javascriptte-tip-guvenligi/) [md](https://www.muhammetsafak.com.tr/blog/typescripte-gecis-javascriptte-tip-guvenligi.md): Büyüyen bir frontend kod tabanını TypeScript ile korumaya başlamanın pratik deneyimi: ne kazandım, ne kaybettim ve ne zaman gerçekten değer verdi? - [Go'da ilk CLI aracımı yazmak](https://www.muhammetsafak.com.tr/blog/goda-ilk-cli-aracimi-yazmak/) [md](https://www.muhammetsafak.com.tr/blog/goda-ilk-cli-aracimi-yazmak.md): Yeni öğrendiğim Go'yu gerçek bir CLI aracı yazarak pekiştirdim: dilin pratikteki hissi ve standart kütüphaneyle ne kadar uzağa gidilebildiği. - [PHP 7.3: esnek heredoc ve liste atamaları](https://www.muhammetsafak.com.tr/blog/php-7-3-esnek-heredoc-ve-liste-atamalari/) [md](https://www.muhammetsafak.com.tr/blog/php-7-3-esnek-heredoc-ve-liste-atamalari.md): PHP 7.3'ün getirdiği esnek heredoc sözdizimi ve liste atamalarının okunabilirliğe katkısını gerçek örneklerle değerlendiriyorum. - [JavaScript'te async/await ile okunur asenkron kod](https://www.muhammetsafak.com.tr/blog/javascriptte-async-await-ile-okunur-asenkron-kod/) [md](https://www.muhammetsafak.com.tr/blog/javascriptte-async-await-ile-okunur-asenkron-kod.md): Promise zincirlerinin yerini alan async/await sözdiziminin JavaScript'teki asenkron kodu nasıl okunabilir kıldığını örneklerle açıklıyorum. - [PHP 7.2 ve modern PHP alışkanlıkları](https://www.muhammetsafak.com.tr/blog/php-7-2-ve-modern-php-aliskanlikari/) [md](https://www.muhammetsafak.com.tr/blog/php-7-2-ve-modern-php-aliskanlikari.md): PHP 7.2 ile gelen yenilikleri ve dilin bugün geldiği noktayı günlük kod yazım alışkanlıklarıma nasıl yansıttığımı anlatıyorum. - [JavaScript'te Promise ve asenkron akış](https://www.muhammetsafak.com.tr/blog/javascriptte-promise-ve-asenkron-akis/) [md](https://www.muhammetsafak.com.tr/blog/javascriptte-promise-ve-asenkron-akis.md): JavaScript'te Promise nedir, callback yığınından nasıl kurtulunur; then, catch zincirleme ve temel asenkron akış kalıpları. - [PHP'de closure ve use ile değişken yakalama](https://www.muhammetsafak.com.tr/blog/phpde-closure-ve-use-ile-degisken-yakalama/) [md](https://www.muhammetsafak.com.tr/blog/phpde-closure-ve-use-ile-degisken-yakalama.md): PHP'de closure (anonim fonksiyon) nedir, use anahtar kelimesiyle değişken yakalama nasıl çalışır; günlük kullanım örnekleri. - [PHP 7.1: nullable tipler ve void dönüş tipi](https://www.muhammetsafak.com.tr/blog/php-7-1-nullable-tipler-ve-void-donus-tipi/) [md](https://www.muhammetsafak.com.tr/blog/php-7-1-nullable-tipler-ve-void-donus-tipi.md): PHP 7.1 ile gelen nullable tip bildirimleri ve void dönüş tipi, fonksiyon imzalarını daha okunur ve net kılıyor. - [PHP'de arayüz (interface) ve bağımlılık enjeksiyonu pratiği](https://www.muhammetsafak.com.tr/blog/php-de-arayuz-interface-ve-bagimlilik-enjeksiyonu-pratigi/) [md](https://www.muhammetsafak.com.tr/blog/php-de-arayuz-interface-ve-bagimlilik-enjeksiyonu-pratigi.md): PHP'de interface tanımlayarak ve bağımlılık enjeksiyonu uygulayarak sınıfları nasıl gevşek bağlı hale getirdiğimi örneklerle aktarıyorum. - [SOLID'i PHP'de pratiğe dökmek: tek sorumluluk ilkesi](https://www.muhammetsafak.com.tr/blog/solid-i-php-de-pratige-dokmek-tek-sorumluluk-ilkesi/) [md](https://www.muhammetsafak.com.tr/blog/solid-i-php-de-pratige-dokmek-tek-sorumluluk-ilkesi.md): SOLID'in SRP ilkesini soyut kalmadan PHP sınıflarına nasıl uyguladığımı somut örneklerle anlatıyorum. - [PHP 7'de skaler tip bildirimleri ve dönüş tipleri](https://www.muhammetsafak.com.tr/blog/php-7-de-skaler-tip-bildirimleri-ve-donus-tipleri/) [md](https://www.muhammetsafak.com.tr/blog/php-7-de-skaler-tip-bildirimleri-ve-donus-tipleri.md): PHP 7 ile gelen skaler tip bildirimleri ve dönüş tipi tanımlamalarını pratikte nasıl kullandığımı anlatıyorum. - [PHP 7.0: yıllardır beklenen sürümle gelen hız ve tip bildirimleri](https://www.muhammetsafak.com.tr/blog/php-7-0-yillarca-beklenen-surum-hiz-ve-tip-bildirimleri/) [md](https://www.muhammetsafak.com.tr/blog/php-7-0-yillarca-beklenen-surum-hiz-ve-tip-bildirimleri.md): PHP 7.0 bu hafta yayımlandı. Performans artışı, skaler tip bildirimleri ve dönüş tipleriyle ilk izlenimlerimi paylaşıyorum. - [ES6 ile tanışma: let, const ve ok fonksiyonları](https://www.muhammetsafak.com.tr/blog/es6-ile-tanisma-let-const-ve-ok-fonksiyonlari/) [md](https://www.muhammetsafak.com.tr/blog/es6-ile-tanisma-let-const-ve-ok-fonksiyonlari.md): JavaScript'in yeni standardı ES6 ile gelen let, const, ok fonksiyonu ve şablon dizelerini örneklerle anlattım. - [PHP 5.6 yenilikleri: variadic fonksiyonlar ve ** operatörü](https://www.muhammetsafak.com.tr/blog/php-5-6-yenilikleri-variadic-fonksiyonlar-ve-ust-uste-operatoru/) [md](https://www.muhammetsafak.com.tr/blog/php-5-6-yenilikleri-variadic-fonksiyonlar-ve-ust-uste-operatoru.md): PHP 5.6 ile gelen değişken sayıda argüman (variadic) desteği ve üs alma operatörünü örneklerle anlattım. - [MVC'yi gerçekten anlamak: controller'ı şişirmeyi bırakmak](https://www.muhammetsafak.com.tr/blog/mvci-gercekten-anlamak-controlleri-sisirmeyi-birakmak/) [md](https://www.muhammetsafak.com.tr/blog/mvci-gercekten-anlamak-controlleri-sisirmeyi-birakmak.md): MVC'nin her katmanının gerçekte ne iş yaptığını ve controller'ı nasıl ince tutabileceğinizi anlatıyorum. - [PHP 5.5 generator (yield) ile büyük veri kümelerini gezmek](https://www.muhammetsafak.com.tr/blog/php-55-generator-yield-ile-buyuk-veri-kumelerini-gezmek/) [md](https://www.muhammetsafak.com.tr/blog/php-55-generator-yield-ile-buyuk-veri-kumelerini-gezmek.md): Belleği şişirmeden büyük döngüler kurmanın dil düzeyindeki yolu: PHP 5.5 generator ve yield kullanımı. - [PHP'de namespace ile kodu düzenli tutmak](https://www.muhammetsafak.com.tr/blog/phpde-namespace-ile-kodu-duzenli-tutmak/) [md](https://www.muhammetsafak.com.tr/blog/phpde-namespace-ile-kodu-duzenli-tutmak.md): İsim çakışmalarını bitiren, kütüphane çağına uygun kod organizasyonu: PHP namespace kullanımı ve use ifadesi. - [PSR-4 ve otomatik yükleme: include zincirinden kurtulmak](https://www.muhammetsafak.com.tr/blog/psr-4-ve-otomatik-yukleme-include-zincirinden-kurtulmak/) [md](https://www.muhammetsafak.com.tr/blog/psr-4-ve-otomatik-yukleme-include-zincirinden-kurtulmak.md): Sınıfları elle dahil etmeyi bırakıp standart otomatik yüklemeye geçmek: PSR-0 ve PSR-4 farkı, Composer entegrasyonu. ### Blog — Framework & Kütüphane - [Laravel Queue ve Supervisor ile Asenkron İşlemler](https://www.muhammetsafak.com.tr/blog/laravel-queue-ve-supervisor-ile-asenkron-islemler/) [md](https://www.muhammetsafak.com.tr/blog/laravel-queue-ve-supervisor-ile-asenkron-islemler.md): Laravel'de Queue ve Supervisor ile asenkron iş kuyruğu kurulumu ve arka plan işlemleri. - [Laravel 10: daha sıkı tipler ve Process katmanı](https://www.muhammetsafak.com.tr/blog/laravel-10-daha-siki-tipler-ve-surec-process-katmani/) [md](https://www.muhammetsafak.com.tr/blog/laravel-10-daha-siki-tipler-ve-surec-process-katmani.md): Laravel 10'un getirdiği tip disiplini ve yeni Process facade'i: framework'ün olgunlaşan kod tabanını günlük geliştirmeye yansıtmak. - [Laravel 9: yeni sürüm ritmi ve PHP 8 uyumu](https://www.muhammetsafak.com.tr/blog/laravel-9-yeni-surum-ritmi-ve-php-8-uyumu/) [md](https://www.muhammetsafak.com.tr/blog/laravel-9-yeni-surum-ritmi-ve-php-8-uyumu.md): Laravel 9 ile yerleşen yıllık sürüm temposunun proje planlamasına etkisi ve PHP 8 uyumunun kod tabanına yansımaları. - [Laravel Octane: kalıcı süreçle gelen performans](https://www.muhammetsafak.com.tr/blog/laravel-octane-kalici-surecle-gelen-performans/) [md](https://www.muhammetsafak.com.tr/blog/laravel-octane-kalici-surecle-gelen-performans.md): Laravel Octane'in istek başına önyükleme maliyetini nasıl ortadan kaldırdığı ve bunun beraberinde getirdiği trade-off'lar. - [Laravel'de eylem (action) sınıflarıyla controller'ı inceltmek](https://www.muhammetsafak.com.tr/blog/laravelde-eylem-action-siniflariyla-controlleri-inceltmek/) [md](https://www.muhammetsafak.com.tr/blog/laravelde-eylem-action-siniflariyla-controlleri-inceltmek.md): İş mantığını controller'dan tek amaçlı action sınıflarına taşıyarak nasıl daha test edilebilir ve bakımı kolay kod yazılır. - [Inertia.js ile monolitten modern arayüze](https://www.muhammetsafak.com.tr/blog/inertia-js-ile-monolitten-modern-arayuze/) [md](https://www.muhammetsafak.com.tr/blog/inertia-js-ile-monolitten-modern-arayuze.md): Inertia.js'in ayrı bir API yazmadan SPA hissi verme modelini, Laravel ile entegrasyonunu ve ne zaman doğru seçim olduğunu anlatıyorum. - [Laravel 8: model factory'leri ve yeni dizin yapısı](https://www.muhammetsafak.com.tr/blog/laravel-8-model-factory-leri-ve-yeni-dizin-yapisi/) [md](https://www.muhammetsafak.com.tr/blog/laravel-8-model-factory-leri-ve-yeni-dizin-yapisi.md): Laravel 8'in sınıf tabanlı factory yapısını ve yeni dizin düzenini, test ve tohum verisi üretimi odağıyla anlatıyorum. - [Laravel Livewire ile JavaScript yazmadan etkileşim](https://www.muhammetsafak.com.tr/blog/laravel-livewire-ile-javascript-yazmadan-etkilesim/) [md](https://www.muhammetsafak.com.tr/blog/laravel-livewire-ile-javascript-yazmadan-etkilesim.md): Livewire'ın sunucu odaklı etkileşim modelini, hangi durumlarda doğru seçim olduğunu ve sınırlarını anlatıyorum. - [Laravel 6 ve LTS'in anlamı: sürüm stratejisi](https://www.muhammetsafak.com.tr/blog/laravel-6-ve-ltsin-anlami-surum-stratejisi/) [md](https://www.muhammetsafak.com.tr/blog/laravel-6-ve-ltsin-anlami-surum-stratejisi.md): Laravel 6 LTS sürümü ne anlama geliyor? Uzun süreli destek kararını proje ömrüne göre değerlendirmek ve sürüm stratejisi nasıl olmalı? - [Laravel'de servis sağlayıcı ve container'ı doğru kullanmak](https://www.muhammetsafak.com.tr/blog/laravelde-servis-saglayici-ve-containeri-dogru-kullanmak/) [md](https://www.muhammetsafak.com.tr/blog/laravelde-servis-saglayici-ve-containeri-dogru-kullanmak.md): Laravel'in bağımlılık çözüm mekanizmasını gerçekten anlamak: servis sağlayıcı ve IoC container'ı doğru kullanmanın pratik rehberi. - [Laravel 5.4 ve Blade ile bileşen düşünmek](https://www.muhammetsafak.com.tr/blog/laravel-5-4-ve-blade-ile-bilesen-dusunmek/) [md](https://www.muhammetsafak.com.tr/blog/laravel-5-4-ve-blade-ile-bilesen-dusunmek.md): Laravel 5.4'te Blade şablon motoruna gelen @component direktifi ile görünümleri yeniden kullanılabilir parçalara bölmek. - [Laravel'de olaylar (events) ve dinleyiciler](https://www.muhammetsafak.com.tr/blog/laravel-de-olaylar-events-ve-dinleyiciler/) [md](https://www.muhammetsafak.com.tr/blog/laravel-de-olaylar-events-ve-dinleyiciler.md): Laravel'in olay sistemiyle yan etkileri ana akıştan nasıl ayırdığımı ve pratikte ne kazandığımı örneklerle anlatıyorum. - [Laravel 5.2: çoklu kimlik doğrulama ve route grupları](https://www.muhammetsafak.com.tr/blog/laravel-5-2-coklu-kimlik-dogrulama-ve-route-gruplari/) [md](https://www.muhammetsafak.com.tr/blog/laravel-5-2-coklu-kimlik-dogrulama-ve-route-gruplari.md): Laravel 5.2 ile birden fazla kullanıcı tipini tek uygulamada nasıl yönettiğimi; guard ve route gruplarını anlatıyorum. - [Laravel middleware ile isteklere ortak davranış eklemek](https://www.muhammetsafak.com.tr/blog/laravel-middleware-ile-isteklere-ortak-davranis-eklemek/) [md](https://www.muhammetsafak.com.tr/blog/laravel-middleware-ile-isteklere-ortak-davranis-eklemek.md): Laravel'de middleware nedir, nasıl yazılır ve kimlik doğrulama gibi kesişen ihtiyaçları nasıl tek yerde toplarım anlattım. - [Eloquent ilişkileri: hasMany, belongsTo ve eager loading](https://www.muhammetsafak.com.tr/blog/eloquent-iliskileri-hasmany-belongsto-ve-eager-loading/) [md](https://www.muhammetsafak.com.tr/blog/eloquent-iliskileri-hasmany-belongsto-ve-eager-loading.md): Laravel Eloquent'te hasMany ve belongsTo ilişkilerini kurmayı ve N+1 sorgusunu eager loading ile çözmeyi anlattım. - [Laravel 5'e geçiş: yeni dizin yapısı ve .env](https://www.muhammetsafak.com.tr/blog/laravel-5e-gecis-yeni-dizin-yapisi-ve-env/) [md](https://www.muhammetsafak.com.tr/blog/laravel-5e-gecis-yeni-dizin-yapisi-ve-env.md): Laravel 4'ten 5'e geçerken dizin yapısı, .env dosyası ve uygulama yapısındaki değişiklikleri anlattım. - [Eloquent ORM ile veritabanı işlemlerini sadeleştirmek](https://www.muhammetsafak.com.tr/blog/eloquent-orm-ile-veritabani-islemlerini-sadestirmek/) [md](https://www.muhammetsafak.com.tr/blog/eloquent-orm-ile-veritabani-islemlerini-sadestirmek.md): SQL'i elle yazmaktan model tabanlı erişime: Laravel Eloquent ORM'in uygulama tarafından görünümü ve günlük kullanımı. - [Blade şablon motoru: tekrar eden HTML'i bitirmek](https://www.muhammetsafak.com.tr/blog/blade-sablon-motoru-tekrar-eden-htmli-bitirmek/) [md](https://www.muhammetsafak.com.tr/blog/blade-sablon-motoru-tekrar-eden-htmli-bitirmek.md): Görünüm katmanını mantıktan ayırmanın pratik kazancı: Blade layout, section ve partial kullanımı. - [Laravel 4 ile ilk projeme başlarken](https://www.muhammetsafak.com.tr/blog/laravel-4-ile-ilk-projeme-baslarken/) [md](https://www.muhammetsafak.com.tr/blog/laravel-4-ile-ilk-projeme-baslarken.md): Ham PHP'den bir framework'e geçişin getirdiği düzen: Laravel 4 ile ilk izlenimler, kurulum ve temel yapı. ### Blog — Web Geliştirme - [Laravel'de gerçek zamanlı özellikler: WebSocket ve broadcasting](https://www.muhammetsafak.com.tr/blog/laravelde-gercek-zamanli-ozellikler-websocket-ve-broadcasting/) [md](https://www.muhammetsafak.com.tr/blog/laravelde-gercek-zamanli-ozellikler-websocket-ve-broadcasting.md): Laravel Broadcasting ile anlık güncelleme eklemek: olay tabanlı yayın, Pusher entegrasyonu ve istemci tarafında dinlemek. - [API'leri OpenAPI ile belgelemek](https://www.muhammetsafak.com.tr/blog/apileri-openapi-ile-belgelemek/) [md](https://www.muhammetsafak.com.tr/blog/apileri-openapi-ile-belgelemek.md): Belgeyi koddan türetmek ve istemcilerle tek doğru kaynağı paylaşmak: OpenAPI spesifikasyonunu günlük geliştirme akışına entegre etmek. - [API tasarımını sözleşme öncelikli (contract-first) yürütmek](https://www.muhammetsafak.com.tr/blog/api-tasarimini-sozlesme-oncelikli-contract-first-yurutmek/) [md](https://www.muhammetsafak.com.tr/blog/api-tasarimini-sozlesme-oncelikli-contract-first-yurutmek.md): Önce sözleşme, sonra kod yaklaşımının ekipler arası beklentiyi nasıl hizaladığı ve pratikte ne anlama geldiği. - [REST'ten sonra: GraphQL'i denemek](https://www.muhammetsafak.com.tr/blog/restten-sonra-graphqli-denemek/) [md](https://www.muhammetsafak.com.tr/blog/restten-sonra-graphqli-denemek.md): Gerçek bir over-fetching sorununu GraphQL ile çözerken REST'in nerede yeterli, GraphQL'in nerede anlam kazandığını tartıyorum. - [API hata sözleşmesi: istemciye anlamlı hata döndürmek](https://www.muhammetsafak.com.tr/blog/api-hata-sozlesmesi-istemciye-anlamli-hata-dondurmek/) [md](https://www.muhammetsafak.com.tr/blog/api-hata-sozlesmesi-istemciye-anlamli-hata-dondurmek.md): API hata yanıtlarını tutarlı bir sözleşmeye bağlamak, istemci geliştirmeyi ve hata ayıklamayı nasıl kolaylaştırır. - [Laravel 7 ve Sanctum ile SPA kimlik doğrulama](https://www.muhammetsafak.com.tr/blog/laravel-7-ve-sanctum-ile-spa-kimlik-dogrulama/) [md](https://www.muhammetsafak.com.tr/blog/laravel-7-ve-sanctum-ile-spa-kimlik-dogrulama.md): Laravel Sanctum'un SPA kimlik doğrulamasını nasıl çözdüğünü, token tabanlı yaklaşımdan farkını somut örneklerle anlatıyorum. - [API yanıtlarını standartlaştırmak: tutarlı bir sözleşme](https://www.muhammetsafak.com.tr/blog/api-yanitlarini-standartlastirmak-tutarli-bir-sozlesme/) [md](https://www.muhammetsafak.com.tr/blog/api-yanitlarini-standartlastirmak-tutarli-bir-sozlesme.md): Her uçta aynı yanıt yapısını döndürmek istemci kodunu nasıl sadeleştirir ve hataları nasıl öngörülebilir kılar? - [API tasarımında sürümleme (versioning) kararları](https://www.muhammetsafak.com.tr/blog/api-tasariminda-surumleme-versioning-kararlari/) [md](https://www.muhammetsafak.com.tr/blog/api-tasariminda-surumleme-versioning-kararlari.md): İstemcileri kırmadan bir API'yi nasıl evrimleştirirsiniz? Sürümleme stratejilerini trade-off'larıyla karşılaştırıyor, gerçek deneyimlerimi paylaşıyorum. - [Laravel'de zamanlanmış görevler (task scheduling)](https://www.muhammetsafak.com.tr/blog/laravelde-zamanlanmis-gorevler-task-scheduling/) [md](https://www.muhammetsafak.com.tr/blog/laravelde-zamanlanmis-gorevler-task-scheduling.md): Laravel'in görev zamanlayıcısıyla sunucudaki tek bir cron satırından birden çok görevi kod içinde okunur biçimde nasıl planladığımı anlatıyorum. - [Laravel'de çok dilli (i18n) uygulama](https://www.muhammetsafak.com.tr/blog/laravelde-cok-dilli-i18n-uygulama/) [md](https://www.muhammetsafak.com.tr/blog/laravelde-cok-dilli-i18n-uygulama.md): Laravel'de çok dilli destek eklemek için dil dosyalarını düzenlemek, metinleri koddan ayırmak ve dil geçişini yönetmek üzerine pratik notlar. - [Laravel'de bildirimler (notifications): e-posta ve SMS](https://www.muhammetsafak.com.tr/blog/laravelde-bildirimler-notifications-e-posta-ve-sms/) [md](https://www.muhammetsafak.com.tr/blog/laravelde-bildirimler-notifications-e-posta-ve-sms.md): Laravel Notification sınıflarıyla aynı bildirim mantığını e-posta, SMS gibi birden çok kanaldan nasıl gönderdiğimi anlatıyorum. - [Laravel API kaynak (resource) sınıflarıyla yanıt biçimlemek](https://www.muhammetsafak.com.tr/blog/laravel-api-kaynak-resource-siniflariyla-yanit-bicimlemek/) [md](https://www.muhammetsafak.com.tr/blog/laravel-api-kaynak-resource-siniflariyla-yanit-bicimlemek.md): Laravel API Resource sınıflarıyla veritabanı modelini istemciye doğrudan sızdırmadan temiz yanıtlar nasıl üretilir, örneklerle anlatıyorum. - [Laravel policy ve gate ile yetkilendirme](https://www.muhammetsafak.com.tr/blog/laravel-policy-ve-gate-ile-yetkilendirme/) [md](https://www.muhammetsafak.com.tr/blog/laravel-policy-ve-gate-ile-yetkilendirme.md): Laravel'de Gate ve Policy ile yetkilendirme mantığını tek yerde toplamak; 'kim neyi yapabilir' kararlarını temiz kurmak. - [Üçüncü parti API tüketmek: Guzzle ile HTTP istemcisi](https://www.muhammetsafak.com.tr/blog/ucuncu-parti-api-tuketmek-guzzle-ile-http-istemcisi/) [md](https://www.muhammetsafak.com.tr/blog/ucuncu-parti-api-tuketmek-guzzle-ile-http-istemcisi.md): PHP'de Guzzle HTTP istemcisi ile dış servislere bağlanmak; timeout, hata yönetimi ve güvenilir istek yapısı kurmak. - [Laravel ile e-posta gönderimi ve şablonları](https://www.muhammetsafak.com.tr/blog/laravel-ile-e-posta-gonderimi-ve-sablonlari/) [md](https://www.muhammetsafak.com.tr/blog/laravel-ile-e-posta-gonderimi-ve-sablonlari.md): Laravel Mailable sınıfı ve Blade e-posta şablonları ile işlemsel e-postaları güvenilir ve bakımı kolay şekilde kurmak. - [REST API'de sayfalama, filtreleme ve sıralama](https://www.muhammetsafak.com.tr/blog/rest-api-de-sayfalama-filtreleme-ve-siralama/) [md](https://www.muhammetsafak.com.tr/blog/rest-api-de-sayfalama-filtreleme-ve-siralama.md): Büyüyen veri kümelerini istemciye yönetilebilir sunmak için API'de sayfalama, filtreleme ve sıralama parametrelerini nasıl tasarladığımı anlatıyorum. - [Laravel ile dosya yükleme ve görsel işleme](https://www.muhammetsafak.com.tr/blog/laravel-ile-dosya-yukleme-ve-gorsel-isleme/) [md](https://www.muhammetsafak.com.tr/blog/laravel-ile-dosya-yukleme-ve-gorsel-isleme.md): Laravel'de dosya yükleme, doğrulama ve görseli yeniden boyutlandırma adımlarını kapsayan uçtan uca akışı anlatıyorum. - [Laravel ile JSON API uçları yazmak](https://www.muhammetsafak.com.tr/blog/laravel-ile-json-api-uclari-yazmak/) [md](https://www.muhammetsafak.com.tr/blog/laravel-ile-json-api-uclari-yazmak.md): Laravel'de arayüzden bağımsız JSON API uç noktaları oluşturmanın pratik yollarını anlattım. - [RESTful API tasarımının temelleri](https://www.muhammetsafak.com.tr/blog/restful-api-tasariminin-temelleri/) [md](https://www.muhammetsafak.com.tr/blog/restful-api-tasariminin-temelleri.md): Kaynak, HTTP yöntemi ve durum kodu üçgeninde bir API'yi tahmin edilebilir kılmanın pratik kurallarını anlattım. - [Laravel ile form doğrulama (validation) pratiği](https://www.muhammetsafak.com.tr/blog/laravel-ile-form-dogrulama-validation-pratigi/) [md](https://www.muhammetsafak.com.tr/blog/laravel-ile-form-dogrulama-validation-pratigi.md): Kullanıcı girdisini güvenle karşılamanın tekrar edilebilir kalıbı: Laravel doğrulama kuralları ve hata mesajları. ### Blog — Arayüz - [Frontend'de durum yönetimi: Pinia ile Vuex sonrası](https://www.muhammetsafak.com.tr/blog/frontendde-durum-yonetimi-pinia-ile-vuex-sonrasi/) [md](https://www.muhammetsafak.com.tr/blog/frontendde-durum-yonetimi-pinia-ile-vuex-sonrasi.md): Vue ekosisteminde Pinia'nın Vuex'in yerini alması: daha az şablon kod, daha iyi TypeScript desteği ve olgunlaşan durum yönetimi anlayışı. - [React 18 ve concurrent render](https://www.muhammetsafak.com.tr/blog/react-18-ve-eszamanli-concurrent-render/) [md](https://www.muhammetsafak.com.tr/blog/react-18-ve-eszamanli-concurrent-render.md): React 18'in eşzamanlı render modeli uygulamanın hangi davranışlarını değiştiriyor ve bu değişimi pratikte nasıl karşılamak gerekiyor. - [Tek sayfa uygulamada SEO sorunu ve SSR seçenekleri](https://www.muhammetsafak.com.tr/blog/tek-sayfa-uygulamada-seo-sorunu-ve-ssr-secenekleri/) [md](https://www.muhammetsafak.com.tr/blog/tek-sayfa-uygulamada-seo-sorunu-ve-ssr-secenekleri.md): İstemci taraflı render'ın arama motorları için yarattığı görünürlük sorununu ve sunucu taraflı render seçeneklerini karşılaştırıyorum. - [Vue 3 Composition API: neden ve ne zaman](https://www.muhammetsafak.com.tr/blog/vue-3-composition-api-neden-ve-ne-zaman/) [md](https://www.muhammetsafak.com.tr/blog/vue-3-composition-api-neden-ve-ne-zaman.md): Vue 3 ile gelen Composition API'nin Options API'ye göre ne getirdiğini, ne zaman tercih edilmesi gerektiğini somut örneklerle tartışıyorum. - [Alpine.js: küçük etkileşimler için hafif bir seçim](https://www.muhammetsafak.com.tr/blog/alpine-js-kucuk-etkilesimler-icin-hafif-bir-secim/) [md](https://www.muhammetsafak.com.tr/blog/alpine-js-kucuk-etkilesimler-icin-hafif-bir-secim.md): Alpine.js'i ne zaman seçmeli, ne zaman seçmemeli? Tam framework gerektirmeyen arayüz ihtiyaçları için doğru ölçeği tartışıyorum. - [Tailwind CSS: utility-first yaklaşımına neden geçtim](https://www.muhammetsafak.com.tr/blog/tailwind-css-utility-first-yaklasimina-neden-gectim/) [md](https://www.muhammetsafak.com.tr/blog/tailwind-css-utility-first-yaklasimina-neden-gectim.md): Tailwind CSS v1.0 ile utility-first CSS paradigmasını neden benimsedim, hangi trade-off'larla karşılaştım ve ne zaman gerçekten işe yarıyor? - [React hooks ile bileşen yazmanın değişen yüzü](https://www.muhammetsafak.com.tr/blog/react-hooks-ile-bilesen-yazmanin-degisen-yuzu/) [md](https://www.muhammetsafak.com.tr/blog/react-hooks-ile-bilesen-yazmanin-degisen-yuzu.md): React 16.8 ile gelen hooks API'si, sınıf bileşeninden fonksiyon bileşenine geçişi nasıl değiştirdi? Avantajları ve dikkat edilmesi gereken noktalar. - [Frontend'de Axios ile API tüketmek](https://www.muhammetsafak.com.tr/blog/frontendde-axios-ile-api-tuketmek/) [md](https://www.muhammetsafak.com.tr/blog/frontendde-axios-ile-api-tuketmek.md): Axios kütüphanesiyle istek/yanıt katmanını arayüzde temiz tutmak için interceptor, hata yönetimi ve ortak yapılandırma üzerine pratik notlar. - [Vue ile bileşen tabanlı arayüz mimarisine geçiş](https://www.muhammetsafak.com.tr/blog/vue-ile-bilesen-tabanli-arayuz-mimarisine-gecis/) [md](https://www.muhammetsafak.com.tr/blog/vue-ile-bilesen-tabanli-arayuz-mimarisine-gecis.md): Sayfa odaklı düşünmekten bileşen (component) odaklı düşünmeye geçişi ve Vue.js'in bunu pratikte nasıl sağladığını anlatıyorum. - [Responsive tasarım: mobil öncelikli CSS](https://www.muhammetsafak.com.tr/blog/responsive-tasarim-mobil-oncelikli-css/) [md](https://www.muhammetsafak.com.tr/blog/responsive-tasarim-mobil-oncelikli-css.md): Mobil öncelikli (mobile-first) CSS yaklaşımı nedir, media query ile tek arayüzü farklı ekran boyutlarında düzgün tutmak nasıl sağlanır. - [Vuex ile Vue uygulamasında durum yönetimi](https://www.muhammetsafak.com.tr/blog/vuex-ile-vue-uygulamasinda-durum-yonetimi/) [md](https://www.muhammetsafak.com.tr/blog/vuex-ile-vue-uygulamasinda-durum-yonetimi.md): Vuex ile bileşenler arası paylaşılan durumu tek bir kaynakta toplamak; state, mutation, action ve getter kavramları. - [Sass ile sürdürülebilir CSS yazmak](https://www.muhammetsafak.com.tr/blog/sass-ile-surdurulebilir-css-yazmak/) [md](https://www.muhammetsafak.com.tr/blog/sass-ile-surdurulebilir-css-yazmak.md): Büyüyen stil dosyalarını Sass değişkenleri, iç içe kurallar ve parçalara bölme ile nasıl düzene soktuğumu anlatıyorum. - [Vue Router ile tek sayfa uygulama (SPA) mantığı](https://www.muhammetsafak.com.tr/blog/vue-router-ile-tek-sayfa-uygulama-spa-mantigi/) [md](https://www.muhammetsafak.com.tr/blog/vue-router-ile-tek-sayfa-uygulama-spa-mantigi.md): Vue Router ile sayfa geçişlerini istemci tarafına taşırken karşılaştığım temel kavramları ve pratik kurulumu aktarıyorum. - [Vue.js ile ilk reaktif bileşen](https://www.muhammetsafak.com.tr/blog/vue-js-ile-ilk-reaktif-bilesen/) [md](https://www.muhammetsafak.com.tr/blog/vue-js-ile-ilk-reaktif-bilesen.md): jQuery ile DOM manipülasyonundan Vue.js'in veri odaklı yaklaşımına geçiş deneyimimi ve ilk reaktif bileşeni nasıl yazdığımı anlatıyorum. - [Bootstrap 3 ile hızlı ve tutarlı arayüz kurmak](https://www.muhammetsafak.com.tr/blog/bootstrap-3-ile-hizli-ve-tutarli-arayuz-kurmak/) [md](https://www.muhammetsafak.com.tr/blog/bootstrap-3-ile-hizli-ve-tutarli-arayuz-kurmak.md): Tasarımcı olmadan düzgün görünen arayüz üretmenin yolu: Bootstrap 3 grid sistemi ve hazır bileşenler. - [jQuery ile AJAX: sayfayı yenilemeden veri göndermek](https://www.muhammetsafak.com.tr/blog/jquery-ile-ajax-sayfayi-yenilemeden-veri-gondermek/) [md](https://www.muhammetsafak.com.tr/blog/jquery-ile-ajax-sayfayi-yenilemeden-veri-gondermek.md): Form gönderimini sayfa yüklemeden ayırmanın 2014'teki standardı: jQuery $.ajax kullanımı ve pratik örnekler. ### Blog — Araçlar & Teknolojiler - [Biri Github Actions mı dedi?](https://www.muhammetsafak.com.tr/blog/biri-github-actions-mi-dedi/) [md](https://www.muhammetsafak.com.tr/blog/biri-github-actions-mi-dedi.md): GitHub Actions ile CI/CD'ye giriş: iş akışları (workflow) nasıl kurulur ve süreçler nasıl otomatikleştirilir? - [ElasticSearch ve Kibana ile Büyük Veriye Giriş](https://www.muhammetsafak.com.tr/blog/elasticsearch-ve-kibana-ile-buyuk-veriye-giris/) [md](https://www.muhammetsafak.com.tr/blog/elasticsearch-ve-kibana-ile-buyuk-veriye-giris.md): Elasticsearch ve Kibana ile büyük veriye giriş: metin arama, analiz ve görselleştirmenin temelleri. - [RabbitMQ (PHP ile)](https://www.muhammetsafak.com.tr/blog/php-rabbitmq/) [md](https://www.muhammetsafak.com.tr/blog/php-rabbitmq.md): PHP ile RabbitMQ kullanımı: mesaj kuyruğu oluşturma, mesaj gönderme (publish) ve tüketme (consume). - [Docker sanallaştırma: kurulum ve temel kullanım](https://www.muhammetsafak.com.tr/blog/docker-sanallastirma-teknolojisi-kurulum-kullanim/) [md](https://www.muhammetsafak.com.tr/blog/docker-sanallastirma-teknolojisi-kurulum-kullanim.md): Docker'ın container mimarisini, temel komutlarını ve volume/network kavramlarını uygulamalı olarak anlatan bir başlangıç rehberi. - [Laravel'de test yazma alışkanlığı: Pest'e geçiş](https://www.muhammetsafak.com.tr/blog/laravelde-test-yazma-aliskanligi-peste-gecis/) [md](https://www.muhammetsafak.com.tr/blog/laravelde-test-yazma-aliskanligi-peste-gecis.md): PHPUnit'ten Pest'e geçerken test yazmayı külfetten alışkanlığa çeviren sözdizimi ve yapı farklarını anlatıyorum. - [MySQL Depolama Motorları (InnoDB vs MyISAM)](https://www.muhammetsafak.com.tr/blog/mysql-depolama-motorlari-innodb-vs-myisam/) [md](https://www.muhammetsafak.com.tr/blog/mysql-depolama-motorlari-innodb-vs-myisam.md): MySQL depolama motorları: InnoDB ile MyISAM arasındaki farklar, avantajlar ve hangi durumda hangisi seçilmeli? - [Vite ile geliştirme sunucusunu saniyelere indirmek](https://www.muhammetsafak.com.tr/blog/vite-ile-gelistirme-sunucusunu-saniyelere-indirmek/) [md](https://www.muhammetsafak.com.tr/blog/vite-ile-gelistirme-sunucusunu-saniyelere-indirmek.md): Webpack tabanlı bir geliştirme ortamından Vite'a geçince derleme sürelerinin neden bu kadar kısaldığını inceliyorum. - [Vue bileşenlerini test etmek](https://www.muhammetsafak.com.tr/blog/vue-bilesenleri-test-etmek/) [md](https://www.muhammetsafak.com.tr/blog/vue-bilesenleri-test-etmek.md): Vue bileşenlerinin arayüz davranışını otomatik olarak doğrulamanın pratik yolu: Vue Test Utils ile gerçek senaryolar üzerinden test yazımı. - [npm ve modern JavaScript paket ekosistemi](https://www.muhammetsafak.com.tr/blog/npm-ve-modern-javascript-paket-ekosistemi/) [md](https://www.muhammetsafak.com.tr/blog/npm-ve-modern-javascript-paket-ekosistemi.md): npm ile JavaScript bağımlılıklarını yönetmek, package.json dosyasını doğru yapılandırmak ve paket ekosisteminde karşılaşılan pratik sorunları anlatıyorum. - [PHPUnit ile ilk testlerimi yazmak](https://www.muhammetsafak.com.tr/blog/phpunit-ile-ilk-testlerimi-yazmak/) [md](https://www.muhammetsafak.com.tr/blog/phpunit-ile-ilk-testlerimi-yazmak.md): PHPUnit kurulumundan başlayarak ilk birim testlerimi nasıl yazdığımı, hangi şeylerin işe yaradığını ve hangi tuzaklara düştüğümü anlatıyorum. - [Git akışı: branch, merge ve pull request disiplini](https://www.muhammetsafak.com.tr/blog/git-akisi-branch-merge-ve-pull-request-disiplini/) [md](https://www.muhammetsafak.com.tr/blog/git-akisi-branch-merge-ve-pull-request-disiplini.md): Git ile dallanma (branching) alışkanlıkları, merge stratejileri ve pull request ile izlenebilir bir değişiklik geçmişi kurmak. - [Laravel Mix ile varlık derlemeyi basitleştirmek](https://www.muhammetsafak.com.tr/blog/laravel-mix-ile-varlik-derlemeyi-basitlestirmek/) [md](https://www.muhammetsafak.com.tr/blog/laravel-mix-ile-varlik-derlemeyi-basitlestirmek.md): Laravel Mix, Webpack yapılandırması yazmadan JavaScript ve CSS varlıklarını derlemenizi sağlayan akıcı bir API sunuyor. - [Postman ile API geliştirmeyi hızlandırmak](https://www.muhammetsafak.com.tr/blog/postman-ile-api-gelistirmeyi-hizlandirmak/) [md](https://www.muhammetsafak.com.tr/blog/postman-ile-api-gelistirmeyi-hizlandirmak.md): API uçlarını tarayıcı olmadan denemek, koleksiyonlar oluşturmak ve Postman'i iş akışına dahil etmek hakkında öğrendiklerimi paylaşıyorum. - [Webpack'e geçiş: Gulp'tan modül paketlemeye](https://www.muhammetsafak.com.tr/blog/webpack-e-gecis-gulp-tan-modul-paketlemeye/) [md](https://www.muhammetsafak.com.tr/blog/webpack-e-gecis-gulp-tan-modul-paketlemeye.md): Gulp ile kurduğum derleme hattını neden terk ettiğimi ve Webpack'e geçerken karşılaştığım zorlukları ve kazanımları aktarıyorum. - [Composer ile kendi paketimi Packagist'te yayımlamak](https://www.muhammetsafak.com.tr/blog/composer-ile-kendi-paketimi-packagistte-yayimlamak/) [md](https://www.muhammetsafak.com.tr/blog/composer-ile-kendi-paketimi-packagistte-yayimlamak.md): Bir PHP paketini sıfırdan yapılandırıp Packagist'e göndererek başkalarının kullanımına açtım; adımları aktarıyorum. - [Gulp ile front-end derleme hattı kurmak](https://www.muhammetsafak.com.tr/blog/gulp-ile-front-end-derleme-hatti-kurmak/) [md](https://www.muhammetsafak.com.tr/blog/gulp-ile-front-end-derleme-hatti-kurmak.md): Gulp ile Sass derleme, JavaScript birleştirme ve tarayıcı yenilemeyi otomatikleştiren bir front-end iş akışı kurdum. - [Laravel Homestead ile herkeste aynı geliştirme ortamı](https://www.muhammetsafak.com.tr/blog/laravel-homestead-ile-herkeste-ayni-gelistirme-ortami/) [md](https://www.muhammetsafak.com.tr/blog/laravel-homestead-ile-herkeste-ayni-gelistirme-ortami.md): Laravel Homestead'ı kurup ekipte 'bende çalışıyordu' sorununu nasıl çözdüğümü adım adım anlattım. - [Git'e geçiş: FTP ile dosya atmayı bırakmak](https://www.muhammetsafak.com.tr/blog/gite-gecis-ftp-ile-dosya-atmayi-birakmak/) [md](https://www.muhammetsafak.com.tr/blog/gite-gecis-ftp-ile-dosya-atmayi-birakmak.md): Sürüm kontrolüyle gelen güven: FTP'den Git'e geçişin değiştirdiği geliştirme alışkanlığı, temel commit ve branch kullanımı. - [Composer'a geçiş: PHP bağımlılıklarını elle yönetmeyi bırakmak](https://www.muhammetsafak.com.tr/blog/composera-gecis-php-bagimliliklarini-elle-yonetmeyi-birakmak/) [md](https://www.muhammetsafak.com.tr/blog/composera-gecis-php-bagimliliklarini-elle-yonetmeyi-birakmak.md): require yığınından modern bağımlılık yönetimine geçişin pratiği: composer.json, autoload ve paket kurma. ### Blog — Günlük - [Yabancı bir kod tabanını devralmak](https://www.muhammetsafak.com.tr/blog/yabanci-bir-kod-tabanini-devralmak/) [md](https://www.muhammetsafak.com.tr/blog/yabanci-bir-kod-tabanini-devralmak.md): Hiç bilmediğiniz bir kod tabanına hızlı ve sağlam biçimde hâkim olmanın yolu: erken refactor değil, önce anlamak. - [Kriz anı: şirketin karakteri orada belli olur](https://www.muhammetsafak.com.tr/blog/kriz-ani-sirketin-karakteri-orada-belli-olur/) [md](https://www.muhammetsafak.com.tr/blog/kriz-ani-sirketin-karakteri-orada-belli-olur.md): Production yandığında sorulan ilk soru şirketin kültürünü yıllarca belirler. Krizin insan tarafı: korku, sessizlik ve sonra değişen şey. - [Toplantı, raporlama ve görünürlük tiyatrosu](https://www.muhammetsafak.com.tr/blog/toplanti-raporlama-ve-gorunurluk-tiyatrosu/) [md](https://www.muhammetsafak.com.tr/blog/toplanti-raporlama-ve-gorunurluk-tiyatrosu.md): Statü toplantısı bir bilgi aracı değil, bir sigortadır. Toplantının neden var olduğunu ciddiye alan bir eleştiri ve üç ayrı masadan bakış. - [Performans, terfi ve zam: sistem olsa da olmasa da bir pazarlık var](https://www.muhammetsafak.com.tr/blog/performans-terfi-ve-zam-sistem-olsa-da-olmasa-da-bir-pazarlik-var/) [md](https://www.muhammetsafak.com.tr/blog/performans-terfi-ve-zam-sistem-olsa-da-olmasa-da-bir-pazarlik-var.md): Zam kurumsalda bir tabloya, patron şirketinde bir hatıraya bağlıdır. Sistemin varlığı sonucu değiştirmiyor; sadece pazarlığın dilini değiştiriyor. - [Sıfırdan hızlı, mevcut sistemde yavaş: agent çağında brownfield'in gerçek maliyeti](https://www.muhammetsafak.com.tr/blog/sifirdan-hizli-mevcut-sistemde-yavas/) [md](https://www.muhammetsafak.com.tr/blog/sifirdan-hizli-mevcut-sistemde-yavas.md): Agent'la günlerde biten iş, yıllardır çalışan bir sistemde bir hafta sürüyor. Çünkü orada asıl maliyet kod üretmek değil; kuralı bulmak ve doğrulamak. - [Bilgi nasıl akar: koridor mu, doküman mı?](https://www.muhammetsafak.com.tr/blog/bilgi-nasil-akar-koridor-mu-dokuman-mi/) [md](https://www.muhammetsafak.com.tr/blog/bilgi-nasil-akar-koridor-mu-dokuman-mi.md): Bilgi bir kişinin kafasında da kalsa, kimsenin okumadığı bir wiki'de de dursa aynı yere çıkıyor: kararın gerekçesi erişilemez. İnsan tarafından bir bakış. - [Aynı mesaj, farklı sonuç: event-driven mimaride determinizm](https://www.muhammetsafak.com.tr/blog/event-driven-mimaride-determinizm/) [md](https://www.muhammetsafak.com.tr/blog/event-driven-mimaride-determinizm.md): Event-driven mimaride aynı mesaj neden farklı sonuç üretir? Gerçek bir fatura akışından: determinizmi bozan gizli girdiler ve geri kazandıran dört hamle. - [Rol sınırları: iş tanımı olmayan yerde herkes her şeydir](https://www.muhammetsafak.com.tr/blog/rol-sinirlari-is-tanimi-olmayan-yerde-herkes-her-seydir/) [md](https://www.muhammetsafak.com.tr/blog/rol-sinirlari-is-tanimi-olmayan-yerde-herkes-her-seydir.md): Rol boşluğu bireysel fedakârlıkla kapatıldığı anda görünmez olur, görünmeyen arıza da asla düzelmez. Sınır çizmenin yolu ve üç masadan bakış. - [Süreç ne zaman zırh, ne zaman pranga?](https://www.muhammetsafak.com.tr/blog/surec-ne-zaman-zirh-ne-zaman-pranga/) [md](https://www.muhammetsafak.com.tr/blog/surec-ne-zaman-zirh-ne-zaman-pranga.md): Süreç bir erdem değil, ödediğiniz bir koordinasyon vergisi. Ne zaman eklenmeli, neden hiç kaldırılmıyor ve üç ayrı masadan nasıl görünüyor? - [Karar nasıl alınır: onay zinciri mi, tek imza mı?](https://www.muhammetsafak.com.tr/blog/karar-nasil-alinir-onay-zinciri-mi-tek-imza-mi/) [md](https://www.muhammetsafak.com.tr/blog/karar-nasil-alinir-onay-zinciri-mi-tek-imza-mi.md): Şirketler kararı hızlandırmayı ya da yavaşlatmayı değil, yanlış kararı yanlış hızda almayı beceriyor. Tersinirlik çerçevesi ve üç ayrı masadan bakış. - [Kurumsal mı, patron şirketi mi? Ayıran şey büyüklük değil](https://www.muhammetsafak.com.tr/blog/kurumsal-mi-patron-sirketi-mi/) [md](https://www.muhammetsafak.com.tr/blog/kurumsal-mi-patron-sirketi-mi.md): Şirket tiplerini ayıran çalışan sayısı değil; kararın nerede alındığı ve ne kadarının yazıya döküldüğü. Dört eksen, üç ayrı masadan bakış. - [Dual-write'tan outbox'a: idempotent tüketim ve alan-seviyesi şifreleme günlüğü](https://www.muhammetsafak.com.tr/blog/outbox-idempotent-tuketim-ve-alan-sifrelemesi/) [md](https://www.muhammetsafak.com.tr/blog/outbox-idempotent-tuketim-ve-alan-sifrelemesi.md): Kaybolan event'ler beni transactional outbox'a, at-least-once teslim de idempotent tüketime götürdü; GDPR alanlarını satır seviyesinde şifreledim. - [archlint: mimari sınırları CI'da deterministik olarak zorlamak](https://www.muhammetsafak.com.tr/blog/archlint-mimari-sinirlari-ci-da-zorlamak/) [md](https://www.muhammetsafak.com.tr/blog/archlint-mimari-sinirlari-ci-da-zorlamak.md): Mimari kararlar wiki'de doğru kalır, kodda çürür. archlint, architecture.json'daki sınırları her commit'te go/parser ile, modelsiz zorluyor. - [Tek mimari kuralı, üç dil: archlint artık Go + TypeScript + Python](https://www.muhammetsafak.com.tr/blog/archlint-tek-kural-uc-dil/) [md](https://www.muhammetsafak.com.tr/blog/archlint-tek-kural-uc-dil.md): Polyglot repoda 'domain altyapıyı import etmesin' kuralı her dilde aynı; tek architecture.json artık üç dilin sınırlarını CI'da zorluyor. - [CommitBrief'e flaky-test dedektörü: AI'ın yazdığı kararsız testleri commit'te durdurmak](https://www.muhammetsafak.com.tr/blog/commitbrief-flaky-test-dedektoru/) [md](https://www.muhammetsafak.com.tr/blog/commitbrief-flaky-test-dedektoru.md): CommitBrief'e deterministik bir flaky-test süzgeci ekledim: sabit sleep'leri ve seed'siz rastgeleliği commit'te, modelsiz yakalıyor. - [CommitBrief'e summary ve remote: değişikliğin brifini almak, PR'ı terminalden incelemek](https://www.muhammetsafak.com.tr/blog/commitbrief-summary-ve-remote/) [md](https://www.muhammetsafak.com.tr/blog/commitbrief-summary-ve-remote.md): İki yeni komut: summary değişikliğin brifini çıkarıyor, remote pr ise PR'ı terminalden inceleyip yorumu insandan önce bırakıyor. - [Vibe coding mi, AI destekli geliştirme mi — ve neden hâlâ bir senior'a ihtiyaç var](https://www.muhammetsafak.com.tr/blog/vibe-coding-mi-ai-destekli-gelistirme-mi/) [md](https://www.muhammetsafak.com.tr/blog/vibe-coding-mi-ai-destekli-gelistirme-mi.md): Vibe coding ürün çıkarmayı kolaylaştırdı; ama mimari bilmeyenin production'a çıkardığıyla senior'ın çıkardığı aynı şey değil. Üç seviye. - [Bir e-fatura entegrasyonunda numara çakışmasını çözmek](https://www.muhammetsafak.com.tr/blog/e-fatura-entegrasyonunda-numara-cakismasi/) [md](https://www.muhammetsafak.com.tr/blog/e-fatura-entegrasyonunda-numara-cakismasi.md): Üretimde iki worker aynı fatura numarasını üretti. Race condition ile yasal 'gap' arasındaki ikilemi gerçek bir projede nasıl çözdüğümün günlüğü. - [AI ile self-review — neyi hızlandırıyor, nerede yetmiyor](https://www.muhammetsafak.com.tr/blog/ai-ile-self-review-neyi-hizlandiriyor-nerede-yetmiyor/) [md](https://www.muhammetsafak.com.tr/blog/ai-ile-self-review-neyi-hizlandiriyor-nerede-yetmiyor.md): 'Niye' değil 'ne kadar' yazısı: tool workflow'a hangi katmanlarda giriyor, hangi bug pattern'lerini yakalıyor ve nerede sınırına dayanıyor. - [Hangi Projede Hangi Metodoloji? — 18 Yıllık Bir Geliştiricinin Notları](https://www.muhammetsafak.com.tr/blog/hangi-projede-hangi-metodoloji-karar-matrisi/) [md](https://www.muhammetsafak.com.tr/blog/hangi-projede-hangi-metodoloji-karar-matrisi.md): Waterfall mı, Agile mı, Hybrid mi? Soru yanlış. 18 yıllık production tecrübesinden bir karar matrisi, üç gerçek vaka ve metodoloji dininden çıkış. - [Kendi diff'imi bir tool'a soruyorum — CommitBrief'i niye yazdım](https://www.muhammetsafak.com.tr/blog/kendi-diffimi-bir-tool-a-soruyorum-commitbrief/) [md](https://www.muhammetsafak.com.tr/blog/kendi-diffimi-bir-tool-a-soruyorum-commitbrief.md): Self-review körlüğüyle yüzleştiğim bir öğleden sonra terminalden çıkmadan kendi diff'imi denetleyen bir tool yazdım: CommitBrief. - [Bu günlüğün on iki yılı: geriye dönüp bakmak](https://www.muhammetsafak.com.tr/blog/bu-gunlugun-on-iki-yili-geriye-donup-bakmak/) [md](https://www.muhammetsafak.com.tr/blog/bu-gunlugun-on-iki-yili-geriye-donup-bakmak.md): 2014'ten 2026'ya bu günlükte yazılan her şey bir araya geldiğinde anlattığı gelişim hikâyesi ve kapanış. - [Görünür olmak: yazmak neden bir kariyer yatırımıdır](https://www.muhammetsafak.com.tr/blog/gorunur-olmak-yazmak-neden-bir-kariyer-yatirimidir/) [md](https://www.muhammetsafak.com.tr/blog/gorunur-olmak-yazmak-neden-bir-kariyer-yatirimidir.md): Yazmak, düşünceyi netleştirir ve zamanla birikim sağlar. Kişisel marka değil, dürüst bir iz olarak görünür olmanın kariyer değeri üzerine. - [Polyglot olmak bir hedef değil bir sonuçmuş](https://www.muhammetsafak.com.tr/blog/polyglot-olmak-bir-hedef-degil-bir-sonucmus/) [md](https://www.muhammetsafak.com.tr/blog/polyglot-olmak-bir-hedef-degil-bir-sonucmus.md): Çok dilli geliştirici olmak nasıl bir hedefe dönüştü, neden aslında hiç öyle olmadığını ve buna nasıl ulaştığımı düşünüyorum. - [On bir yılın ardından: bir geliştiricinin değişen önceliği](https://www.muhammetsafak.com.tr/blog/on-bir-yilin-ardindan-bir-gelistiricinin-degisen-onceligi/) [md](https://www.muhammetsafak.com.tr/blog/on-bir-yilin-ardindan-bir-gelistiricinin-degisen-onceligi.md): Bu günlüğün on bir yılında bir geliştiricinin önceliklerinin hızdan dayanıklılığa, koddan karara nasıl kaydığının değerlendirmesi. - [Yapay zeka çağında kod yazmanın değişen el becerisi](https://www.muhammetsafak.com.tr/blog/yapay-zeka-caginda-kod-yazmanin-degisen-el-becerisi/) [md](https://www.muhammetsafak.com.tr/blog/yapay-zeka-caginda-kod-yazmanin-degisen-el-becerisi.md): Yapay zeka araçları kod yazmanın ne kadarını devraldı, geliştiriciye ne kaldı? Değişen el becerisi üzerine bir değerlendirme. - [Mentorluk ve bilgi paylaşımı: başkasını büyütürken büyümek](https://www.muhammetsafak.com.tr/blog/mentorluk-ve-bilgi-paylasimi-baskasini-buyuturken-buyumek/) [md](https://www.muhammetsafak.com.tr/blog/mentorluk-ve-bilgi-paylasimi-baskasini-buyuturken-buyumek.md): Mentorluğun bir fedakârlık değil, kıdemli bir geliştirici için kendi gelişiminin de aracı olduğu üzerine bir kariyer yazısı. - [Bir özelliği fikirden üç platforma: uçtan uca akışım](https://www.muhammetsafak.com.tr/blog/bir-ozelligi-fikirden-uc-platforma-uctan-uca-akisim/) [md](https://www.muhammetsafak.com.tr/blog/bir-ozelligi-fikirden-uc-platforma-uctan-uca-akisim.md): Bir özelliği API, web ve mobilde aynı anda teslim ettiğimde izlediğim olgunlaşmış, tekrarlanabilir süreci anlatıyorum. - [Uzman mı, genelci mi: T-tipi bir kariyer](https://www.muhammetsafak.com.tr/blog/uzman-mi-genelci-mi-t-tipi-bir-kariyer/) [md](https://www.muhammetsafak.com.tr/blog/uzman-mi-genelci-mi-t-tipi-bir-kariyer.md): Derin uzmanlaşma ile geniş genelcilik arasındaki gerilimi ve T-tipi kariyer modelinin bu denklemi nasıl çözdüğünü aktarıyorum. - [Expo'da güncellemeleri OTA ile yönetmek](https://www.muhammetsafak.com.tr/blog/expoda-guncellemeleri-ota-ile-yonetmek/) [md](https://www.muhammetsafak.com.tr/blog/expoda-guncellemeleri-ota-ile-yonetmek.md): Expo Updates ile mağaza döngüsünü beklemeden hızlı düzeltme yayınlamanın pratiklerini ve sınırlarını aktarıyorum. - [Polyglot bir kod tabanını sürdürmek: bağlam değiştirme maliyeti](https://www.muhammetsafak.com.tr/blog/polyglot-bir-kod-tabanini-surdurumek-baglan-degistirme-maliyeti/) [md](https://www.muhammetsafak.com.tr/blog/polyglot-bir-kod-tabanini-surdurumek-baglan-degistirme-maliyeti.md): Birden çok dilde aynı anda çalışmanın görünmeyen bilişsel bedeli ve bunu nasıl yönettiğimi aktarıyorum. - [Kendi ürününü tek başına kurmak: Looplio deneyimi](https://www.muhammetsafak.com.tr/blog/kendi-urununu-tek-basina-kurmak-looplio-deneyimi/) [md](https://www.muhammetsafak.com.tr/blog/kendi-urununu-tek-basina-kurmak-looplio-deneyimi.md): API, web ve mobili tek başına yürüten bir geliştiricinin dürüst günlüğü; tek kişilik ürün geliştirmenin getirdiği ve götürdükleri. - [Bir özelliği üç katmanda (API, web, mobil) birden teslim etmek](https://www.muhammetsafak.com.tr/blog/bir-ozelligi-uc-katmanda-api-web-mobil-birden-teslim-etmek/) [md](https://www.muhammetsafak.com.tr/blog/bir-ozelligi-uc-katmanda-api-web-mobil-birden-teslim-etmek.md): Tek bir özelliği API, web ve mobil katmanlarında birlikte teslim etmenin uçtan uca akışı; Looplio üzerinde edindiğim pratik. - [Home (Cloud) Server Pi5 Upgrade](https://www.muhammetsafak.com.tr/blog/home-cloud-server-pi5-upgrade/) [md](https://www.muhammetsafak.com.tr/blog/home-cloud-server-pi5-upgrade.md): Raspberry Pi 5 ile ev bulut sunucusu kurulumu: CasaOS, NextCloud, RAID depolama ve Cloudflare Tunnel. - [Expo ile mobil uygulamayı mağazaya göndermek](https://www.muhammetsafak.com.tr/blog/expo-ile-mobil-uygulamayi-magazaya-gondermek/) [md](https://www.muhammetsafak.com.tr/blog/expo-ile-mobil-uygulamayi-magazaya-gondermek.md): Expo ve EAS Build ile bir React Native uygulamasını App Store ve Google Play'e gönderme sürecinin gerçek deneyimi ve hazırlık adımları. - [React Native'de performans: liste render'ı](https://www.muhammetsafak.com.tr/blog/react-native-de-performans-liste-renderi/) [md](https://www.muhammetsafak.com.tr/blog/react-native-de-performans-liste-renderi.md): React Native'de büyük listeleri akıcı tutmanın somut teknikleri; FlatList, memo ve keyExtractor kullanımı ile gerçek deneyimler. - [Yan projeler ve açık kaynak: kariyere kattıkları ve gerçek maliyeti](https://www.muhammetsafak.com.tr/blog/yan-projeler-ve-acik-kaynak-kariyere-kattiklari-ve-gercek-maliyeti/) [md](https://www.muhammetsafak.com.tr/blog/yan-projeler-ve-acik-kaynak-kariyere-kattiklari-ve-gercek-maliyeti.md): Yan projelerin ve açık kaynağın kariyere etkisini dürüstçe değerlendirmek: getiri, maliyet ve bir projeyi ne zaman arşivlemenin doğru olduğu. - [Mobil ve web'i aynı takvim mantığıyla beslemek (Looplio günlüğü)](https://www.muhammetsafak.com.tr/blog/mobil-ve-webi-ayni-takvim-mantigiyla-beslemek-looplio-gunlugu/) [md](https://www.muhammetsafak.com.tr/blog/mobil-ve-webi-ayni-takvim-mantigiyla-beslemek-looplio-gunlugu.md): Looplio'da tek bir iş mantığını hem React Native hem web istemcisine tutarlı biçimde sunmanın pratik kararları ve öğretileri. - [React Native'de gezinme (navigation) ve ekran mimarisi](https://www.muhammetsafak.com.tr/blog/react-native-de-gezinme-navigation-ve-ekran-mimarisi/) [md](https://www.muhammetsafak.com.tr/blog/react-native-de-gezinme-navigation-ve-ekran-mimarisi.md): React Native Navigation Stack, Tab ve Drawer yapılarını Looplio bağlamında kurmanın pratik kararları ve ekran mimarisi yaklaşımı. - [İş değiştirme kararı: kalmak mı, gitmek mi](https://www.muhammetsafak.com.tr/blog/is-degistirme-karari-kalmak-mi-gitmek-mi/) [md](https://www.muhammetsafak.com.tr/blog/is-degistirme-karari-kalmak-mi-gitmek-mi.md): Ayrılma ya da kalma kararını duygusal tepkiden ölçülebilir bir değerlendirmeye çevirmek; meşru sinyalleri geçici hayal kırıklığından ayırt etmek. - [Bir yılda dört dil: polyglot pratiğin getirdiği zihin esnekliği](https://www.muhammetsafak.com.tr/blog/bir-yilda-dort-dil-polyglot-pratigin-getirdigi-zihin-esnekligi/) [md](https://www.muhammetsafak.com.tr/blog/bir-yilda-dort-dil-polyglot-pratigin-getirdigi-zihin-esnekligi.md): Bir yıl içinde PHP, Go, Python ve TypeScript arasında gidip gelmenin düşünme biçimine etkisi üzerine bir değerlendirme. - [Hype'ı filtrelemek: her yeni teknolojiyi öğrenmek zorunda değilsin](https://www.muhammetsafak.com.tr/blog/hypei-filtrelemek-her-yeni-teknolojiyi-ogrenmek-zorunda-degilsin/) [md](https://www.muhammetsafak.com.tr/blog/hypei-filtrelemek-her-yeni-teknolojiyi-ogrenmek-zorunda-degilsin.md): Sürekli yeni araç baskısı karşısında öğrenme bütçesini yönetmek: hangi teknolojiyi ne zaman öğreneceğinize karar vermek için pratik bir yaklaşım. - [React Native ve Expo ile mobil uygulamaya ilk adım](https://www.muhammetsafak.com.tr/blog/react-native-ve-expo-ile-mobil-uygulamaya-ilk-adim/) [md](https://www.muhammetsafak.com.tr/blog/react-native-ve-expo-ile-mobil-uygulamaya-ilk-adim.md): Web geliştiricisinin mobil dünyaya geçiş deneyimi: Looplio'yu React Native ve Expo ile kurarken öğrendiklerim ve beklentilerimin nasıl değiştiği. - [2014'teki kendime: ilk yıllara dair tavsiyeler](https://www.muhammetsafak.com.tr/blog/2014-teki-kendime-ilk-yillara-dair-tavsiyeler/) [md](https://www.muhammetsafak.com.tr/blog/2014-teki-kendime-ilk-yillara-dair-tavsiyeler.md): Bu günlüğün başladığı yıla, 2014'e dönüp bakmak: erken kariyer yıllarında neye fazla, neye az önem verdiğim ve değiştirmek istediğim şeyler. - [Yapay zekanın kod yazmaya etkisini ilk kez ciddiye almak](https://www.muhammetsafak.com.tr/blog/yapay-zekanin-kod-yazmaya-etkisini-ilk-kez-ciddiye-almak/) [md](https://www.muhammetsafak.com.tr/blog/yapay-zekanin-kod-yazmaya-etkisini-ilk-kez-ciddiye-almak.md): ChatGPT'yi aylardır kullanıyorum; ama bu ay bir şey değişti. Bir merakı, çalışma biçimimi sorgulatan gerçek bir gözleme dönüştüren an. - [ChatGPT'yi bir geliştirici olarak ilk kez kullanmak](https://www.muhammetsafak.com.tr/blog/chatgpti-bir-gelistirici-olarak-ilk-kez-kullanmak/) [md](https://www.muhammetsafak.com.tr/blog/chatgpti-bir-gelistirici-olarak-ilk-kez-kullanmak.md): OpenAI'nin yeni çıkan ChatGPT aracını birkaç gün denedikten sonra bir geliştiricinin dürüst ilk izlenimleri: nerede etkileyici, nerede güvenilmez. - [Kıdem: ünvanla gelmeyen sorumluluk](https://www.muhammetsafak.com.tr/blog/kidem-unvanla-gelmeyen-sorumluluk/) [md](https://www.muhammetsafak.com.tr/blog/kidem-unvanla-gelmeyen-sorumluluk.md): Ünvan çoğu zaman gerçek kıdemden önce gelir. Kıdemin teknik bilgi değil belirsizlik altında karar verme kapasitesi olduğu üzerine. - [Polyglot bir geliştirici olmak: dili probleme göre seçmek](https://www.muhammetsafak.com.tr/blog/polyglot-bir-gelistirici-olmak-dili-probleme-gore-secmek/) [md](https://www.muhammetsafak.com.tr/blog/polyglot-bir-gelistirici-olmak-dili-probleme-gore-secmek.md): Birden çok programlama diline hâkim olmanın bir kimlik meselesi değil, araç seçimi meselesi olduğu üzerine kişisel notlar. - [Bir yazılımcı olarak araç setimi sadeleştirmek](https://www.muhammetsafak.com.tr/blog/bir-yazilimci-olarak-arac-setimi-sadestirmek/) [md](https://www.muhammetsafak.com.tr/blog/bir-yazilimci-olarak-arac-setimi-sadestirmek.md): Senior'dan staff seviyesine geçerken araç yığınımı gözden geçirdim. Daha az araç, daha net karar aldığımı fark ettim. - [Python'a giriş: bir betik dili daha neden](https://www.muhammetsafak.com.tr/blog/python-a-giris-bir-betik-dili-daha-neden/) [md](https://www.muhammetsafak.com.tr/blog/python-a-giris-bir-betik-dili-daha-neden.md): Polyglot pratiğimde Python'un doldurduğu boşluğu, öğrenme sürecimi ve PHP geliştiricisinin Python'a bakışını anlatıyorum. - [Polyglot'a ilk adım: neden Go öğrenmeye başladım](https://www.muhammetsafak.com.tr/blog/polyglota-ilk-adim-neden-go-ogrenmeye-basladim/) [md](https://www.muhammetsafak.com.tr/blog/polyglota-ilk-adim-neden-go-ogrenmeye-basladim.md): On yılı aşkın PHP deneyiminin ardından neden ikinci bir dil öğrenmeye karar verdim? Go'yu seçmemin gerekçesi ve bu süreçten beklentilerim. - [2018'in muhasebesi: bir PHP geliştiricisi nereye geldi](https://www.muhammetsafak.com.tr/blog/2018in-muhasebesi-bir-php-gelistiricisi-nereye-geldi/) [md](https://www.muhammetsafak.com.tr/blog/2018in-muhasebesi-bir-php-gelistiricisi-nereye-geldi.md): 2018 boyunca öğrendiklerimi, değişen alışkanlıklarımı ve önümüzdeki dönem için belirlediğim hedefleri dürüstçe değerlendiriyorum. - [Laravel ile takvim/etkinlik özelliği kurmak](https://www.muhammetsafak.com.tr/blog/laravel-ile-takvim-etkinlik-ozelligi-kurmak/) [md](https://www.muhammetsafak.com.tr/blog/laravel-ile-takvim-etkinlik-ozelligi-kurmak.md): Tarih, tekrar kuralı ve zaman dilimi içeren bir takvim özelliğini Laravel'de uçtan uca kurma deneyimimi paylaşıyorum. - [Laravel ile ödeme entegrasyonu (iyzico) deneyimi](https://www.muhammetsafak.com.tr/blog/laravel-ile-odeme-entegrasyonu-iyzico-deneyimi/) [md](https://www.muhammetsafak.com.tr/blog/laravel-ile-odeme-entegrasyonu-iyzico-deneyimi.md): Laravel projelerinde iyzico ödeme entegrasyonu yaparken karşılaşılan gerçek sorunlar ve çözümleri; deneyim anlatısı.