İçeriğe Atla
Mustafa Erbay
Yaşam İnsan tarafından yazıldı · 9 dk okuma · görüntülenme Read in English
100%

Side Project Çöplüğü: Hangi Projeyi Ne Zaman Fişten Çekmeli?

Yıllardır biriken, sunucularda RAM tüketen ve domain yenileme faturası çıkaran ölü projeleri ayıklama rehberim.

Sunucu kabloları arasında tozlanmış eski bir bilgisayar kasası ve üzerinde 'deprecated' yazan bir etiket

Bilgisayarımdaki /home/mustafa/dev/projects dizini bir dijital mezarlık gibi. İçinde 2012’den kalma, yarım bırakılmış PHP scriptlerinden tutun, 2021’de “bu kesin tutar” dediğim ama sadece 3 kişinin (biri annem) kullandığı Golang backend’lerine kadar her şey var. 20 yıllık saha tecrübem bana şunu öğretti: Bir projeyi başlatmak heyecan verici, büyütmek zor, ama fişini çekmek gerçek bir profesyonellik göstergesi.

Çoğu zaman duygusal bağ kuruyoruz. “Oraya 3 hafta sonumu gömdüm,” “O PostgreSQL şemasını tasarlamak için sabahladım,” ya da “Domain çok jenerik, bir gün lazım olur” gibi bahanelerle kendimizi kandırıyoruz. Gerçekte ise o proje sadece docker stats çıktısında boşuna yer kaplayan 120 MB RAM ve her yıl kredi kartından çekilen 15 dolarlık bir domain ücretinden ibaret. Bugün, kendi projelerimde uyguladığım “öldürme kriterlerini” ve teknik temizlik sürecimi anlatacağım.

Altyapı Maliyeti ve “Idle” Çalışan Kaynaklar

Bir yan ürünün (side project) maliyeti sadece para değildir; zihinsel yükü paradan çok daha pahalıdır. Kendi VPS’imde çalışan küçük bir finansal hesaplayıcı vardı. Günde topu topu 5-10 kişi giriyordu ama arkada çalışan bir PostgreSQL instance, bir Redis ve bir de Nginx reverse proxy vardı. Bir gün top komutuyla baktığımda, bu projenin boşta dururken bile sistem kaynaklarının %15’ini sömürdüğünü gördüm.

Özellikle Docker konteynerleri “nasılsa izole” diyerek her şeyi dolduruyoruz. Ancak her bir systemd unit’i veya Docker konteyneri, log yazıyor, journald üzerinde yer kaplıyor ve kernel seviyesinde context switching yükü yaratıyor. Geçen yıl, artık trafik almayan 4 farklı küçük projeyi kapattığımda, sunucudaki Load Average değerinin 0.85’ten 0.12’ye düştüğünü gördüm. Bu, ana işim olan ve gerçek para kazandıran uygulamalar için daha stabil bir ortam demekti.

# Boşta yatan projeleri tespit etmek için kullandığım basit bir izleme yöntemi
# Son 30 günde Nginx loglarında istek almayan upstream'leri buluyorum
grep "14/Apr/2026" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr

Eğer bir proje son 3 ayda organik bir büyüme göstermediyse ve teknik olarak “maintenance mode” bile değil, bildiğin “terk edilmiş” durumdaysa, o VPS maliyetini hak etmiyordur. Ben artık 10 dolarlık bir sunucuda 20 tane “belki” projesi tutmak yerine, 2 tane “çalışan” projeye yatırım yapıyorum.

Bağımlılık Cehennemi ve Kodun Çürümesi (Bit Rot)

Kod yazıldığı gün tazedir, ertesi gün bayatlamaya başlar. Bir yan ürünümü (bir Android spam engelleyici uygulamasıydı) 6 ay boyunca güncellemedim. Geçen hafta bir bug fix için projeyi açtığımda, Gradle versiyonunun artık desteklenmediğini, kullandığım 3 farklı kütüphanenin “deprecated” olduğunu ve API seviyesinin Play Store standartlarının altında kaldığını gördüm.

İşte “fişten çekme” kararının en net verildiği an budur: Maintenance (Bakım) maliyeti, geliştirme maliyetini geçtiği an. Eğer basit bir text değişikliği yapmak için 4 saatlik bir dependency hell içine giriyorsanız, o proje artık sizin için bir değer değil, bir ayaktır. Projeyi ayağa kaldırmak için npm install yazdığınızda çıkan 45 tane critical vulnerability uyarısı, size “beni artık göm” diyen bir mesajdır.

Kendi sistemlerimde, özellikle Python tabanlı backend projelerinde, pip freeze çıktısının zamanla ne kadar kirlendiğini görüyorum. Bir noktadan sonra requirements.txt dosyasındaki sürümler arasındaki uyumsuzluk, projeyi bir “dokunulmaz” haline getiriyor. Dokunmaya korktuğunuz kod, ölü koddur.

Domain Yenileme Tuzağı: “Bir Gün Lazım Olur”

Hepimizin bir “domain mezarlığı” var, biliyorum. 2018’de “akıllı tarım otomasyonu” yaparım diye aldığım domaini 2024’e kadar her yıl yeniledim. Toplamda 90 dolar ödemişim ama ortada ne bir sensör var ne de bir satır kod. Domain yenileme maili geldiğinde o anki adrenalinle “bu sene kesin yapacağım” diyoruz.

Benim artık bir kuralım var: Eğer domainin altında çalışan bir index.html bile yoksa ve son 1 yılda o domain üzerine tek bir commit atmadıysam, yenileme mailini gördüğüm an “Auto-renew” butonunu kapatıyorum. Domaini bırakmak, projeyi kafada bitirmenin en somut adımıdır.

VPS maliyetlerini optimize etme yazımda da bahsettiğim gibi, gereksiz her asset (varlık), zihninizde bir “tamamlanmamış iş” klasörü açar. Bu klasörler ne kadar çoksa, asıl odaklanmanız gereken işlere o kadar az RAM (beyin gücü) ayırırsınız.

KriterÖlüm Kararı (Kill)Yaşat (Keep)
TrafikSon 90 gün < 100 tekil ziyaretçiDüzenli artış veya stabil kitle
GüvenlikUnpatched CVE’ler, eski kernel modülleriGüncel bağımlılıklar
MaliyetAylık > $10 (hiç kazanç yoksa)Gelir > Gider veya yüksek öğrenme değeri
MotivasyonKodunu açmaya korkuyorsunYeni özellik eklemek için sabırsızsın

Fişten Çekme Protokolü: Güvenli İmha

Bir projeyi kapatmaya karar verdiğimde, “delete” tuşuna basıp geçmiyorum. 20 yıllık sistemci refleksi işte, her zaman bir “exit strategy” (çıkış stratejisi) olmalı. Bir gün o koddaki bir algoritma veya o veritabanındaki 3-5 satır veri lazım olabilir.

Uyguladığım standart “Kill Protocol” şu şekilde:

  1. Veritabanı Dump: PostgreSQL kullanıyorsam pg_dump ile şemayı ve veriyi alırım. Veri küçükse JSON olarak da export ederim ki ileride başka bir dille (mesela FastAPI yerine Go ile) bir şey yaparsam parse etmesi kolay olsun.
  2. Statik Arşiv: Eğer bir web sitesiyse, wget --mirror ile sitenin statik bir kopyasını alırım. En azından “neye benziyordu” diye bakmak için.
  3. Code Archive: Proje klasörünü tar.gz yapıp S3 üzerinde çok ucuz bir “Glacier” bucket’ına veya fiziksel bir harici diske atarım. GitHub’da “Archived” işaretlerim.
  4. Cleanup: Sunucudaki systemd unit’ini silerim, Docker imajlarını docker rmi ile temizlerim ve Nginx konfigürasyonunu kaldırırım.
# PostgreSQL yedeği alıp sıkıştırma örneği
pg_dump -U mustafa_user -h localhost my_dead_project_db | gzip > my_dead_project_db_$(date +%Y%m%d).sql.gz

# Docker sistem temizliği (dikkatli kullanın)
docker system prune -a --volumes

Bu süreçten sonra gelen o hafifleme hissi paha biçilemez. Sunucuda fazladan 400 MB RAM açılması, diskteki %85 doluluk oranının %60’a düşmesi size yeni ve daha mantıklı projeler için alan açar.

Kurumsal Yazılım Bakış Açısı ve “Opportunity Cost”

Bir üretim ERP’si geliştirirken gördüğüm en büyük hata, “her modül her zaman çalışmalı” takıntısıydı. Bazı raporlar vardı ki, 5 yıl önce bir müdür istemiş, müdür işten ayrılmış ama o rapor her gece 03:00’te SQL sunucusunu yorarak çalışmaya devam ediyordu. Side project’lerde de aynı hatayı yapıyoruz.

“Opportunity Cost” (Fırsat Maliyeti) kavramını iyi anlamak lazım. Ölü bir projeyi ayakta tutmak için harcadığınız her saat, aslında potansiyeli olan yeni bir fikirden çaldığınız zamandır. Eğer bir uretim planlama algoritması üzerinde çalışıyorsam ve eski bir “hava durumu botu” hata verdiği için alarm çalıyorsa, o botu tamir etmek benim için bir zaman kaybıdır.

Bir keresinde kendi yan ürünümün backend’inde bir memory leak (bellek sızıntısı) oluşmuştu. Her 12 saatte bir OOM-killer devreye girip süreci öldürüyordu. Ben de üşendiğim için her 6 saatte bir restart atan bir cron job yazmıştım. İşte bu, bir projeyi fişten çekmeniz gerektiğinin teknik kanıtıdır. Sorunu çözmek yerine etrafından dolanmaya başladıysanız, o proje artık sizin için bir yük haline gelmiştir.

Mezarlıktan Çıkarılan Dersler

Kapatılan her proje bir başarısızlık değil, bir veri noktasıdır. Android tarafında geliştirdiğim o spam engelleyiciyi kapattığımda şunu öğrendim: “Mobil tarafta native bridge kurmak çok maliyetli, bir dahaki sefere daha basit bir mimari seçmeliyim.” Veya bir finansal hesaplayıcımı kapattığımda: “İnsanlar karmaşık formlar yerine tek tıkla sonuç görmek istiyor.”

Side project çöplüğünüzü temizlemekten korkmayın. O çöplük aslında sizin tecrübe kütüphanenizdir. Sadece tozlu rafları boşaltmanız gerekiyor ki yeni kitaplara yer açılsın. Ben her 6 ayda bir “Project Audit” (Proje Denetimi) yapıyorum. Eğer bir proje benim uykumdan, cebimden veya asıl işimden çalıyorsa, onunla vedalaşıyorum.

Sonuçta, 20 yıldır bu sektördeyim ve gördüğüm en başarılı insanlar, neyi yapacaklarını bilenlerden ziyade, neyi yapmaktan vazgeçeceklerini bilenlerdi. Sunucunuzdaki o atıl docker-compose.yml dosyasına bir bakın; belki de bugün onun son günüdür.

Bir sonraki yazıda, bu temizlikten sonra kazandığımız kaynaklarla nasıl daha efektif “production-ready” sistemler kurduğumuzu anlatacağım.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Sıkça Sorulanlar

Bu makale ile ilgili okurların sorduğu yaygın sorular.

Bir yan projenin ölü olduğunu nasıl tespit edip kapatmaya karar vermeliyim?
Ben önce projenin kullanım istatistiklerini toplarım; `docker stats`, `top` ve erişim loglarıyla günlük aktif kullanıcı sayısını ve CPU/RAM tüketimini ölçerim. Eğer bir ay içinde ortalama 5'ten az aktif kullanıcı ve %5'in altında kaynak tüketimi görürsem, projenin hâlâ işlevsel olduğuna dair somut bir kanıt yok demektir. Ardından maliyet analizine geçerim: domain, VPS, veri tabanı yedekleme gibi sabit giderleri toplarım. Bu iki veri setini birleştirip, hem maddi hem de zihinsel yükün faydasını aşan bir eşik belirlerim. Eşik aşılmışsa, bir haftalık kapanış bildirimini yayınlayıp, verileri yedekleyerek fişi çekerim.
Hangi araçları kullanarak “idle” kaynakları ve gizli maliyetleri tespit edebilirim?
Ben genellikle `docker stats` ile konteyner bazlı RAM ve CPU kullanımını, `htop` ile sistem genelini ve `journalctl --disk-usage` ile log birikimini izlerim. Ayrıca `psql` üzerinden veri tabanı oturum sayısını `SELECT count(*) FROM pg_stat_activity;` ile kontrol eder, `redis-cli info memory` komutuyla Redis hafıza tüketimini ölçerim. VPS sağlayıcısının faturalama API'siyle domain ve sunucu ücretlerini otomatik çekip bir Google Sheet’e dökerim. Bu kombinasyon bana hem anlık hem de tarihsel perspektifte “boşta” harcanan kaynakları gösterir ve karar sürecini somut veriye dayandırmamı sağlar.
Bir projeyi tutmanın avantajları ve dezavantajları neler? Kapanışa karar verirken hangi faktörleri ağırlıklandırmalıyım?
Benim deneyimime göre tutmanın tek avantajı, gelecekte ani bir ihtiyaca cevap verebilmek ve mevcut kod tabanını yeniden kullanma potansiyelidir. Ancak dezavantajları çok daha ağırdır: sürekli domain yenileme, güncel güvenlik yamaları, log birikimi ve en önemlisi zihinsel enerji tüketimi. Karar verirken öncelikle finansal maliyeti (aylık/ yıllık) ve kullanım oranını (aktif kullanıcı / istek) birleştiririm; ardından bakım süresi ve teknik borç seviyesini (eski PHP, deprecated kütüphaneler) değerlendiririm. Eğer maliyet/yarar oranı 1:5’in altındaysa, kapanış kaçınılmazdır; aksi takdirde projenin bir kısmını yeniden yapılandırmak daha mantıklı olur.
Domain ismi saklamak her zaman akıllıca bir hamle midir? Bu konuda yaygın bir mit var mı?
Ben uzun yıllar “Domain'i bir gün lazım olur diye saklarım” diye bir mitle yaşadım ve her yıl 15‑20 dolar kaybettim. Gerçekte, bir domain’in değeri sadece marka veya SEO potansiyeline bağlıdır; aktif bir proje olmadan sadece isim hakkı kalır. Ben domain’i saklamaya karar verirken iki soruyu sorarım: 1) Bu isim hâlâ benim iş modelime hizmet ediyor mu? 2) Alternatif bir isimle aynı işlevi görebilir miyim? Eğer ikisi de hayırsa, domain’i satmak ya da bırakmak daha mantıklıdır. Böylece hem finansal hem de zihinsel yükten kurtulmuş olurum.
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