- Araçları bağımsız çalıştırılabilir statik binary olarak dağıtmak, kullanıcıların ayrı bir geliştirme ortamı veya araç zinciri kurmadan hemen kullanabilmesini sağlar
- Derleme süreci, hatalı çalışan kodun dağıtılma olasılığını azaltan ek bir güvenlik katmanı görevi görür
- Yorumlayıcı diller tabanlı araçlar; çeşitli bağımlılık kurulumları ve disk alanı israfı, yükseltmeler sırasında tekrar tekrar yeniden kurulum gibi bakım yükleri taşır
- Bağımlılık sayısı arttıkça güvenlik açıkları ve saldırı yüzeyi büyür; bu da saldırı riskini ve bakım sorunlarını artırır
- Derlenen dil tabanlı statik binary'ler dış ortam değişikliklerinden etkilenmediği için, dağıtımdan sonra da kararlı kullanılabilirlik sağlar
Bağımsız statik binary dağıtımının avantajları
Kurulum olmadan anında kullanım
- Open AI'nin Codex'i Rust ile yeniden inşa edip TypeScript'i bırakması örneğinde olduğu gibi, derlenen bir dille yazılmış tek bir binary dağıtıldığında kullanıcılar ek bir araç zinciri kurmadan doğrudan çalıştırabilir
- En büyük avantaj hız ya da verimlilik değil, kurulum yapmadan aracı hemen kullanabilme imkânıdır
Derleyicinin ek güvenlik katmanı
- Derleme aşamasındaki kontroller sayesinde hatalı kodun dağıtılma ihtimali azalır
- Örneğin Google Cloud CLI, Python tabanlı olduğu için birkaç kez çalıştırılamaz durumda dağıtıldı
- Büyük ekipler bile bu tür sorunlardan kaçınmakta zorlanırken, küçük ekiplerin yorumlayıcı diller tabanlı araçları kararlı biçimde dağıtması daha da zordur
Araç zinciri bağımlılığı gerekmez
- Derlenen dil tabanlı araçlarda yalnızca tek bir binary dağıtmak yeterliyken, Python, Ruby, TypeScript gibi yorumlayıcı dil araçlarında ilgili geliştirme ortamı zorunludur
- Ruby ile yazılmış mdl (markdown linter) örneğinde olduğu gibi, geliştirme ortamı (Ruby) her yükseltildiğinde yeniden kurulum gerekir
- JavaScript tabanlı markdownlint kullanıldığında npm ve 44'ten fazla bağımlılığın kurulması gerekir
Disk alanı israfı sorunu
- Popüler FOSS kodlama asistanı aider, Python ile yazıldığı için Homebrew üzerinden kurulduğunda ek olarak 51 paket kurar
- Gerçek disk kullanımı 3GiB'den fazla artar; bu, çoğu Linux dağıtımının boyutundan daha büyüktür
- Buna karşılık Rust ile yazılmış uv paket yöneticisi, 35MiB'lik tek bir binary ile kurulabilir; Rust'ın kendisi ya da rustup da gerekmez
Artan güvenlik açıkları
- Aracın bağımlılıkları arttıkça saldırı yüzeyi genişler ve güvenlik açıklarına maruz kalma olasılığı artar
- OpenAI'nin Codex paketi 24 doğrudan, 184 dolaylı bağımlılığa sahiptir
- OpenAI tüm bağımlılıkları denetlese bile, bağımlılık sürümleri sabitlenmediği için gelecekteki güncellemeler nedeniyle açıklar, kötü amaçlı paketler veya çalışmanın bozulması gibi sorunlar ortaya çıkabilir
Bakım kolaylığı
- JavaScript, TypeScript, Python gibi yorumlayıcı diller tabanlı araçlar, bağımlılıklar kaldırılırsa çalışmaz hale gelir
- left-pad vakasında olduğu gibi, tek bir paketin silinmesi büyük ölçekli servisleri ve araçları felç edebilir
- Derlenen diller yalnızca derleme anında bağımlılığa ihtiyaç duyduğu için, sonradan dış depolar ortadan kalksa bile araç normal şekilde çalışmaya devam eder
Yazarın deneyimi
- Yazar geçmişte adb-enhanced gibi araçları Python ile geliştirdi, ardından gabo, wp2hugo gibi çeşitli araçları Go ile açık kaynak olarak yayımladı
- Python, TypeScript gibi dillerle bağımsız çalıştırılabilir araç geliştirmeyi artık düşünmüyor
- Mutlaka statik bağlı binary dağıtımı yapılabilen dillerle (Rust, Go, C++ vb.) yazılmasını öneriyor
Sonuç
- Bağımsız araçlar Rust, Go, C++ gibi derlenen dillerle geliştirilmeli
- Mümkün olan en az dış bağımlılığa sahip statik binary biçiminde dağıtılmalıdır
3 yorum
Disk alanı israfı sorunukonusunda epey empati kurmamak elde değil...AKS işletiyorum; konteyner imaj boyutu 1GB'ı aşan Python uygulamalarını her gördüğümde başım ağrıyor.
Şu anda Dockerfile'ı alıp boyutunu tekrar ben küçültüp yüklüyorum; 500MB'nin altına indiremezsem de artık vazgeçiyorum haha
pytorch+cudabağımlılıkları nedeniyle yalnızca sürümü farklı olan paketler var... tam bir felaket.Pek bir işlevi de olmayan şeyler ama her küçük daemon için neredeyse 2 GB bağımlılık kuruluyor..
Sadece basit çıkarım için kullanılan bir CPU runtime ise durum biraz daha iyi, ama bugünlerde gereken LLM servisleri yüzünden hem trafik hem de kapasite arttıkça maliyet hesabı yaparken kahkaha atasım geliyor lol