İçeriğe Atla
Mustafa Erbay
Yaşam · 11 dk okuma · görüntülenme Read in English
100%

Geçici Çözümlerin Kalıcı Yükü: Bir SRE'nin Günlüğü

SRE bakış açısıyla geçici çözümlerin sistemler ve ekipler üzerindeki uzun vadeli etkilerini ve teknik borcun kaçınılmaz yükünü inceliyoruz.

Geçici Çözümlerin Kalıcı Yükü: Bir SRE'nin Günlüğü — kapak görseli

Hızla değişen teknoloji dünyasında, çoğu zaman kendimizi anlık sorunlara “geçici çözümler” bulmaya çalışırken buluruz. Bu pratik, ilk bakışta krizi yönetmenin ve acil durumları aşmanın en hızlı yolu gibi görünse de, bir Site Reliability Engineer (SRE) olarak biliyorum ki bu tür yaklaşımların uzun vadede kalıcı ve ağır yükleri olur. İşte bu yazıda, Geçici Çözümlerin Kalıcı Yükü kavramını bir SRE’nin gözünden, günlük deneyimlerimiz ve sistemler üzerindeki derin etkileriyle ele alacağım.

Acil durumlar karşısında hızlıca devreye alınan, “şimdilik işimizi görsün” mantığıyla geliştirilen bu çözümler, zamanla birikerek sistemin temelini sarsan, operasyonel karmaşıklığı artıran ve ekiplerin moralini bozan bir yığına dönüşebilir. Bu durum, sadece teknik bir sorun olmaktan öte, bir yaşam ve kültür meselesidir; çünkü nihayetinde insanları ve onların iş yapış biçimlerini doğrudan etkiler.

SRE Gözünden “Geçici Çözüm” Nedir?

Bir SRE olarak “geçici çözüm” terimi, benim için çoğu zaman bir kırmızı alarm anlamına gelir. Bu terim, genellikle bir sistemdeki arızayı, performans sorununu veya eksik bir özelliği, kök nedeni ele almadan, hızlıca ve genellikle manuel müdahalelerle giderme çabasını ifade eder. Örneğin, yetersiz kaynak ayrılmış bir servisin sürekli restart edilmesi, veritabanı yavaşlamasını geçici bir cache katmanıyla maskelemek veya kritik bir iş akışını karmaşık bir shell script’i ile elle tetiklemek gibi durumlar geçici çözüm örnekleridir.

Bu tür çözümler, genellikle yüksek baskı altında, dar zaman çizelgeleriyle ve kısıtlı kaynaklarla mücadele ederken ortaya çıkar. Amacımız, anlık krizi atlatmak, servisi ayağa kaldırmak veya belirli bir functionality’yi bir an önce sunmaktır. Ancak bu “acil servis” müdahaleleri, genellikle daha sonra dönüp iyileştirme yapma vaadiyle birlikte gelir; ne yazık ki bu vaatler çoğu zaman unutulur ya da ertelenir.

Geçici çözümler, sistemin mimarisine ve operasyonel modeline entegre olmadıkları için genellikle izlemesi, yönetmesi ve ölçeklendirmesi zordur. Bu da SRE ekiplerinin üzerine ekstra bir yük bindirir; çünkü bu “yapay” çözümlerin sürekli denetlenmesi, bakımının yapılması ve potansiyel arızalarının öngörülmesi gerekir. Kök neden analizi yapılmadan uygulanan her geçici çözüm, sistemin genel güvenilirliğini ve anlaşılabilirliğini düşürür.

Teknik Borç ve Bir SRE’nin Kabusları

Geçici çözümlerin en belirgin ve en acı verici sonuçlarından biri, “teknik borç” birikimidir. Teknik borç, yazılım mühendisliğinde, daha hızlı teslimat için “doğru” veya “en iyi” çözüm yerine, daha kolay veya daha hızlı bir çözüm seçmenin maliyetini ifade eder. Bu borç, zamanla faiz yürütür ve sistemin bakımını, geliştirmesini ve operasyonunu giderek zorlaştırır.

Bir SRE olarak, teknik borcun faizini çoğu zaman gece yarıları çalan alarmlar, beklenmedik arızalar ve saatler süren manuel müdahalelerle öderiz. Eski, kötü tasarlanmış veya geçici bir çözüm üzerine inşa edilmiş bir sistem, her yeni özellik eklenişinde veya her yeni yük testinde daha fazla kırılganlık gösterir. Bu durum, ekipler arasında tükenmişliğe yol açar ve sistemlerin genel güvenilirliğini ciddi şekilde tehlikeye atar.

Bir SRE’nin günlük kabusları arasında, “neden böyle yapılmış?” sorusuna cevap bulamamak, karmaşık ve belgelenmemiş sistemlerin içinde yolunu kaybetmek ve basit gibi görünen bir değişikliğin domino etkisiyle tüm sistemi çökerttiğini görmek yer alır. Bu tür durumlar, teknik borcun sadece kodda değil, aynı zamanda operasyonel süreçlerde ve hatta ekip kültüründe de nasıl kök saldığını gösterir. Teknik borç, operasyonel mükemmeliyet hedeflerimizi baltalayan ve bizi sürekli bir yangın söndürme modunda tutan görünmez bir yüktür.

Geçici Çözümlerin Sistem Üzerindeki Etkileri

Geçici çözümlerin anlık rahatlığı, uzun vadede sistemler üzerinde yıkıcı etkilere yol açar. Bu etkiler, sadece performans düşüşleriyle sınırlı kalmayıp, güvenilirlik, operasyonel karmaşıklık ve hatta geliştirme hızını da olumsuz etkiler.

Performans Düşüşleri

Başlangıçta küçük bir iyileştirme gibi görünen geçici bir çözüm, zamanla birikerek sistemin genel performansını olumsuz etkileyebilir. Örneğin, bir veritabanı sorgusunu optimize etmek yerine, sürekli olarak aynı verileri bellekte tutan geçici bir cache mekanizması kurmak, başlangıçta performansı artırabilir. Ancak bu cache’in tutarsızlığı, yanlış yapılandırılması veya ölçeklenememesi durumunda, asıl sorunu çözmediği için daha büyük performans darboğazlarına yol açar.

Bu tür yaklaşımlar, sistemin altında yatan gerçek sorunları maskeler ve zamanla daha da kötüleşmelerine neden olur. Yetersiz tasarlanmış bir ağ yapılandırması üzerine kurulan geçici router kuralları veya manuel olarak yönetilen yük dengeleme ayarları, trafik arttıkça sistemin tepki süresini uzatır ve kullanıcı deneyimini doğrudan etkiler. SRE olarak, bu tür durumları tespit etmek ve kök nedenine inmek, çoğu zaman bir dedektiflik hikayesine dönüşür.

Güvenilirlik Sorunları

Geçici çözümlerin belki de en kritik etkisi, sistemin güvenilirliğini ciddi şekilde tehlikeye atmalarıdır. Bu çözümler genellikle standart güvenlik testlerinden geçmez, belgelenmez ve beklenmedik durumlar için tasarlanmamıştır. Sonuç olarak, küçük bir değişiklik veya artan yük karşısında beklenmedik bir şekilde çökebilirler.

Bir sistemin güvenilirliği, onun öngörülebilirliği ve kriz anlarında nasıl tepki verdiğiyle ölçülür. Geçici çözümler, bu öngörülebilirliği ortadan kaldırır ve sistemin davranışını tahmin etmeyi zorlaştırır. Bu da SRE’lerin proaktif olmak yerine reaktif olmalarına, yani sürekli yangın söndürmeye odaklanmalarına neden olur.

Operasyonel Karmaşıklık

Her yeni geçici çözüm, sistemin operasyonel karmaşıklığına bir katman daha ekler. Bu çözümler genellikle özel izleme gereksinimleri, manuel müdahale adımları ve benzersiz hata işleme senaryoları yaratır. Zamanla, bu durum, sistemin genel mimarisinin anlaşılmasını ve yönetilmesini imkansız hale getirir.

SRE ekipleri, bu karmaşık yapıyı anlamak, izlemek ve sorun gidermek için daha fazla zaman ve çaba harcamak zorunda kalır. Yeni ekip üyelerinin sisteme adaptasyonu zorlaşır, çünkü öğrenmeleri gereken sadece standart bileşenler değil, aynı zamanda yüzlerce “geçici” veya “özel” durum da vardır. Bu durum, operasyonel verimliliği düşürür ve otomasyon çabalarını baltalar.

Geliştirme Hızında Yavaşlama

Geçici çözümlerin birikimi, geliştirme ekiplerinin de hızını keser. Yeni bir özellik geliştirmek veya mevcut bir özelliği iyileştirmek isteyen geliştiriciler, sık sık bu geçici çözümlerin yarattığı kısıtlamalarla karşılaşır. Mevcut “bandajların” üzerine yeni kod yazmak, genellikle daha fazla hataya, uyumluluk sorunlarına ve beklenmedik yan etkilere yol açar.

Bu durum, geliştiricilerin yeni özellikler üzerinde çalışmak yerine, eski sorunları çözmek veya mevcut geçici çözümleri desteklemek için zaman harcamasına neden olur. Proje teslim tarihleri aksar, inovasyon yavaşlar ve ekipler arasında hayal kırıklığı artar. Bir SRE olarak, geliştirme ekipleriyle omuz omuza çalışırken, bu tür “teknik borç” duvarlarının nasıl yükseldiğini ve herkesin ilerlemesini nasıl engellediğini bizzat deneyimlerim.

İnsan Faktörü: Ekip Üzerindeki Yük

Geçici çözümlerin kalıcı yükü, sadece sistemler üzerinde değil, aynı zamanda onları yöneten ve geliştiren insanlar üzerinde de derin etkiler yaratır. Bir SRE’nin günlüğünde, bu insan faktörünün olumsuz etkileri sıkça yer alır.

Moral Bozukluğu ve Tükenmişlik

Sürekli olarak geçici çözümlerin yarattığı sorunlarla uğraşmak, SRE ve geliştirme ekiplerinin moralini ciddi şekilde düşürür. Sürekli olarak “yangın söndürme” modunda olmak, gerçek, kalıcı çözümler üretme fırsatı bulamamak, mühendisler arasında bir amaçsızlık hissi yaratabilir. Yapılan işin değerini sorgulamalarına ve kendilerini sürekli olarak aynı sorunları tekrar tekrar çözerken bulmalarına neden olabilir.

Bu durum, zamanla tükenmişliğe yol açar. Gece yarıları çalan alarmlar, hafta sonu mesaileri ve sürekli bir kriz hissi, mühendislerin kişisel yaşamlarını da olumsuz etkiler. Yaptıkları işin kalitesinden ödün vermek zorunda kalmaları, profesyonel tatminlerini azaltır. Bir SRE olarak, ekiplerde bu yorgunluğu ve hayal kırıklığını gözlemlemek, en zorlayıcı deneyimlerden biridir.

Bilgi Birikimi Kaybı

Geçici çözümler genellikle hızlıca uygulanır ve çoğu zaman düzgün bir şekilde belgelenmez. Bu durum, çözümü uygulayan kişinin bilgisiyle sınırlı kalmasına neden olur. Eğer o kişi ekipten ayrılırsa veya başka bir projeye geçerse, o geçici çözümün nasıl çalıştığına dair kritik bilgi de onunla birlikte kaybolur.

Bu durum, “kurumsal hafıza kaybına” yol açar. Bir sorun tekrar ortaya çıktığında, yeni bir ekip üyesi veya farklı bir SRE, aynı geçici çözümü yeniden keşfetmek veya tamamen yeni bir çözüm geliştirmek zorunda kalır. Bu döngü, hem zaman kaybına hem de gereksiz çaba harcanmasına neden olur. Sistemin karmaşıklığı artarken, onu anlayan insan sayısı azalır, bu da operasyonel riski yükseltir.

İşe Alım ve Eğitim Zorlukları

Teknik borcun ve geçici çözümlerin yoğun olduğu bir ortam, yeni işe alımlar için de caydırıcı olabilir. Yetenekli mühendisler, sürekli olarak eski sorunları çözmeye odaklanmak yerine, yeni teknolojilerle çalışmak ve anlamlı projeler üretmek isterler. Bir şirketin sistemlerinin karmaşıklığı ve bakımsızlığı, dışarıdan gelen adaylar için negatif bir izlenim yaratabilir.

Yeni işe alınanların sisteme adaptasyon süreci de uzar. Belgelenmemiş geçici çözümleri anlamak ve onlarla başa çıkmak, öğrenme eğrisini dikleştirir ve yeni mühendislerin verimli olmaya başlaması için gereken süreyi artırır. Bu durum, hem şirketin büyümesini yavaşlatır hem de yeni yeteneklerin potansiyelini tam olarak kullanmasını engeller.

Geçici Çözümlerden Kalıcı Stratejilere Geçiş

Geçici çözümlerin kalıcı yükünü hafifletmek ve daha sürdürülebilir bir operasyonel model oluşturmak mümkündür. Ancak bu, sadece teknik bir çaba değil, aynı zamanda kültürel bir değişim gerektirir. Bir SRE olarak, bu geçişte kilit rol oynadığımıza inanıyorum.

Farkındalık ve İletişim

İlk adım, sorunun varlığını kabul etmek ve bunun maliyetini tüm paydaşlara açıkça iletmektir. Geçici çözümlerin sistem üzerindeki etkilerini (performans, güvenilirlik, güvenlik) ve ekip üzerindeki yükünü (moral, tükenmişlik, verimlilik kaybı) somut verilerle ortaya koymak önemlidir. Bu, yönetim katmanında ve diğer ekiplerde farkındalık yaratmanın ilk adımıdır.

SRE ekipleri, bu verileri toplayarak ve düzenli raporlar sunarak, teknik borcun “görünmez” doğasını “görünür” hale getirmelidir. Arıza sonrası incelemelerde (post-mortems), geçici çözümlerin nasıl bir rol oynadığını vurgulamak, bu farkındalığı artırmanın etkili bir yoludur. Açık ve şeffaf iletişim, sorunu ortak bir düşman olarak tanımlamaya yardımcı olur.

Teknik Borç Yönetimi

Geçici çözümlerin yarattığı teknik borcu yönetmek için proaktif bir stratejiye ihtiyaç vardır. Bu, teknik borcun izlenmesini, önceliklendirilmesini ve düzenli olarak “ödenmesini” içeren yapılandırılmış bir süreç anlamına gelir. Teknik borç, sprint planlamalarına dahil edilmeli ve belirli bir yüzdelik dilim, bu borcun kapatılmasına ayrılmalıdır.

Teknik borç, bir backlog’da diğer özelliklerle birlikte yönetilmeli ve risk, maliyet ve iş değeri açısından değerlendirilmelidir. En kritik ve en yüksek etkiye sahip borç kalemlerinin önceliklendirilmesi, operasyonel iyileştirmeyi hızlandıracaktır.

Otomasyon ve Sürekli İyileştirme

Bir SRE’nin temel felsefelerinden biri olan otomasyon, geçici çözümlerin kalıcı yükünü azaltmada kritik bir rol oynar. Manuel olarak yapılan, tekrarlayan ve hataya açık tüm geçici işlemler, otomatikleştirilmelidir. Bu, sadece verimliliği artırmakla kalmaz, aynı zamanda insan hatasını azaltır ve sistemin öngörülebilirliğini artırır.

Sürekli iyileştirme kültürü, geçici çözümlerin kalıcı hale gelmesini engeller. Her arıza veya operasyonel zorluk, bir öğrenme fırsatı olarak görülmeli ve kök nedenine inilerek kalıcı bir çözüm geliştirilmelidir. Bu, “hata bütçesi” (error budget) gibi SRE prensiplerini uygulamakla da desteklenebilir; bu prensip, sistemin ne kadar hata yapabileceğine dair bir sınır belirler ve bu sınır aşıldığında, yeni özellik geliştirmek yerine güvenilirlik çalışmalarına odaklanılmasını teşvik eder.

Sağlam Tasarım Prensipleri

Yeni sistemler tasarlanırken veya mevcut sistemler yeniden yapılandırılırken, sağlam mühendislik ve tasarım prensiplerine öncelik verilmelidir. Ölçeklenebilirlik, esneklik, izlenebilirlik ve güvenilirlik gibi özellikler, tasarım aşamasında göz önünde bulundurulmalıdır. “Geleceğe dönük” çözümler geliştirmek, uzun vadede geçici çözümlerin ortaya çıkmasını engeller.

Bu, “önce düşün, sonra yap” felsefesini benimsemek anlamına gelir. Kapsamlı mimari incelemeleri, güvenlik değerlendirmeleri ve performans testleri, tasarım sürecinin ayrılmaz bir parçası olmalıdır. SRE ekipleri, tasarım aşamasında aktif rol alarak operasyonel gereksinimlerin ve güvenilirlik endişelerinin baştan ele alınmasını sağlamalıdır.

Kültürel Değişim

En önemlisi, bir organizasyon içinde kültürel bir değişim yaratmaktır. Bu değişim, “hızlıca halledelim” zihniyetinden “doğru ve sürdürülebilir bir şekilde yapalım” zihniyetine geçişi ifade eder. Bu, liderlikten başlayarak tüm ekiplere yayılması gereken bir yaklaşımdır. Güvenilirliğin ve kalitenin bir iş önceliği haline gelmesi, bu değişimin temelini oluşturur.

Bu kültürel değişim, mühendislerin teknik borcu dile getirmeleri, kalıcı çözümler önermeleri ve bu çözümler için zaman talep etmeleri konusunda kendilerini güvende hissetmelerini sağlamayı içerir. Aynı zamanda, ürün ve iş birimlerinin de bu uzun vadeli bakış açısını benimsemeleri ve kısa vadeli kazançlar uğruna uzun vadeli istikrardan ödün vermemeleri gerektiğini anlamalarını gerektirir.

Bir SRE’nin Günlüğünden Notlar: Vaka Çalışmaları

Bir SRE olarak kariyerimde, geçici çözümlerin nasıl kalıcı birer yüke dönüştüğüne dair pek çok örnekle karşılaştım. İşte bunlardan bazıları, bu sorunun gerçek dünya üzerindeki etkilerini daha iyi anlamamızı sağlayacak.

Vaka 1: Manuel Restart Bağımlılığı

Bir zamanlar, kritik bir mikroservisin belirli aralıklarla (örneğin her 24 saatte bir) manuel olarak yeniden başlatılması gereken bir durumla karşılaştık. Servis, bellek sızıntısı veya kaynak tükenmesi nedeniyle zamanla yavaşlıyor ve sonunda yanıt vermeyi durduruyordu. Geçici çözüm, bir SRE’nin her gün belirli bir saatte sisteme SSH ile bağlanıp servisi yeniden başlatmasıydı.

Bu durum, haftalarca devam etti. Başlangıçta “birkaç güne bakarız” denilen sorun, yoğunluktan dolayı sürekli ertelendi. Sonuç: Bir SRE’nin her gün aynı sıkıcı ve risksiz görevi yapması gerekiyordu. Bir kez bu restart unutulduğunda veya SRE izinli olduğunda, servis çöktü ve üretimde kesinti yaşandı. Bu “çözüm,” hem operasyonel maliyeti artırdı hem de SRE’nin zamanını daha değerli işlerden çaldı. Nihayetinde, kök neden (bellek sızıntısı) tespit edilip giderildiğinde, ekip büyük bir yükten kurtulmuştu.

Vaka 2: Script Yığınıyla Ayakta Duran Sistem

Başka bir vakada, kritik bir veri işleme pipeline’ı, yıllar içinde geliştirilmiş, belgelenmemiş ve farklı mühendisler tarafından yazılmış bir dizi karmaşık shell script’i ile ayakta duruyordu. Bu script’ler, verileri bir kaynaktan alıp, birden fazla işlemden geçirip, başka bir veritabanına yüklüyordu. Her script’in kendine özgü bağımlılıkları, hata işleme mekanizmaları (çoğu zaman yoktu) ve çalışma zamanları vardı.

Bu yığın, bir SRE ekibinin en büyük kabusuydu. Herhangi bir aşamada meydana gelen bir hata, tüm pipeline’ı durduruyor ve sorunu tespit etmek, hangi script’in nerede takıldığını bulmak saatler sürüyordu. Ayrıca, bu script’ler otomatize bir şekilde çalışmasına rağmen, beklenmedik durumlar için manuel müdahaleler gerektiriyordu ve bu da operasyonel riski artırıyordu. Yeni bir özellik eklemek veya mevcut bir akışı değiştirmek, her zaman “acaba neresi kırılır?” sorusuyla yapılıyordu. Bu durum, sonunda daha modern, izlenebilir ve hataya dayanıklı bir veri işleme platformuna geçişle çözüldü, ancak bu geçiş yıllar sürdü ve yoğun kaynak gerektirdi.

Vaka 3: Veritabanı Optimizasyonu Yerine Geçici Cache

Bir e-ticaret uygulamasında, ürün listeleme sayfasının yavaşladığı fark edildi. Kök neden olarak, veritabanındaki karmaşık sorguların ve yetersiz indekslemenin olduğu ortaya çıktı. Ancak, geliştirme ekibi, veritabanı şemasını ve sorgularını optimize etmek yerine, ürün listelerini belirli aralıklarla bir Redis cache’ine yazan geçici bir çözüm geliştirdi. Bu, anlık olarak sayfa yükleme hızını artırdı.

Ancak, bu geçici çözüm, ürün verileri güncellendiğinde cache’in nasıl invalidate edileceği sorununu beraberinde getirdi. Cache’in eski verilerle çalışması, müşterilere yanlış bilgiler sunulmasına neden oldu. Ayrıca, Redis sunucusunun ölçeklenmesi ve bakımı da ayrı bir operasyonel yük oluşturdu. Sonunda, veritabanı optimizasyonları ve doğru indeksleme yapılarak, bu cache katmanının karmaşıklığı ortadan kaldırıldı. Bu durum, gerçek sorunu çözmeden uygulanan geçici çözümlerin nasıl yeni ve daha karmaşık sorunlar yarattığının güzel bir örneğiydi.

Bu vaka çalışmaları, geçici çözümlerin sadece teorik bir kavram olmadığını, aksine gerçek sistemler ve gerçek insanların üzerinde somut, yıkıcı etkiler yarattığını göstermektedir. Bir SRE olarak, bu tür durumlarla sürekli yüzleşmek, “geçici” kelimesinin aslında ne kadar aldatıcı olabileceğini bize acı bir şekilde öğretir.

Sonuç

Bir SRE’nin günlüğü, “Geçici Çözümlerin Kalıcı Yükü” başlığı altında, uzun ve meşakkatli bir mücadeleyi anlatır. Anlık rahatlama getiren bu çözümlerin, zamanla nasıl bir teknik borç yığınına dönüştüğünü, sistemlerin performansını ve güvenilirliğini nasıl düşürdüğünü, operasyonel karmaşıklığı nasıl artırdığını ve en önemlisi, mühendislerin moralini ve verimliliğini nasıl olumsuz etkilediğini defalarca deneyimledik.

Bu yük, sadece kodda değil, aynı zamanda süreçlerde ve en önemlisi ekip kültürü içinde de kök salar. Ancak umutsuzluğa kapılmak yerine, bu sorunla yüzleşmek ve proaktif adımlar atmak mümkündür. Farkındalık yaratmak, teknik borcu sistematik olarak yönetmek, otomasyonu benimsemek, sağlam tasarım prensiplerini uygulamak ve kültürel bir değişimi teşvik etmek, bu kalıcı yükü hafifletmenin anahtarlarıdır.

Unutmayın, bir sistemin güvenilirliği, sadece teknik bir başarı değil, aynı zamanda bir organizasyonun olgunluğunun ve mühendislik kültürünün bir göstergesidir. Gelecekteki arızaları önlemek, ekiplerimizin tükenmesini engellemek ve gerçekten yenilikçi çözümler üretmek için, geçici çözümlerin kalıcı yükünden kurtulmalıyız. Bu, her SRE’nin ve her mühendislik liderinin ortak sorumluluğudur.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Haftalık özet — AI değil, bizzat ben seçiyorum

Haftada bir mail: o haftanın en önemli yazısı, perde arkası notları, ve "bu hafta gerçekten kullandığım araç" bölümü. Az gürültü, çok sinyal.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar