"Sadece npm install yap"
Bir uygulama geliştirmeye karar verdiniz. Modern, açık kaynak araçlar kullanacaksınız. Ücretsiz, özgür, topluluk destekli. Harika.
İlk komutunuzu yazıyorsunuz:
npm install
Ve başlıyor. Ekran dolup taşıyor. Yüzlerce paket, onlarca uyarı, birkaç hata. Beş dakika sonra hâlâ kurulum yapıyor. On dakika sonra bir şeyler ters gidiyor.
Hoş geldiniz. Dependency hell'e düştünüz.
Bu nasıl bir yer?
Bir Node.js projesi açın, node_modules klasörüne bakın. Siz 5 paket istediniz. Ama orada 1.500, belki 2.000 paket vardır. Geri kalanı ne?
Onların bağımlılıkları. Onların bağımlılıklarının bağımlılıkları. Onların bağımlılıklarının bağımlılıklarının bağımlılıkları.
Bir paket "A" ister, A paketi "B v2.x" ister, başka bir paket "B v3.x" ister, ikisi uyuşmaz, Metro bundler çöker, ekran kırmızıya döner. Günün geri kalanı bu hatayla geçer.
npm ekosisteminde 2 milyondan fazla paket var. Bu sayı her gün büyüyor. Hiçbir merkezi denetim mekanizması yok. Herkes her şeyi yayınlayabiliyor.
left-pad: İnternetin 11 Satıra Bağlı Olduğu Gün
2016 yılında Azer Koçulu isminde bir geliştirici, npm'deki "left-pad" adlı paketini sildi. Bir hukuki anlaşmazlık yüzünden kızmıştı, paketi çekti.
left-pad ne yapıyordu? Bir string'in soluna boşluk ekliyordu. 11 satır kod.
Sonuç: React çöktü. Babel çöktü. Binlerce proje build edilemez hale geldi. Dünyanın dört bir yanında CI/CD pipeline'ları durdu. Şirketler saatler içinde milyonlarca dolar kaybetti.
İnternetin önemli bir kısmı, tek bir insanın sinirli bir öğleden sonrasına bağlıydı.
event-stream: Hacker'ın Hediyelik Paketi
2018'de daha da ürkütücü bir şey yaşandı.
"event-stream" popüler bir npm paketiydi. Geliştirici paketi artık aktif olarak sürdürmediğini, devretmek istediğini açıkladı. "right9ctrl" isimli biri gönüllü oldu ve paketi devraldı.
Haftalarca kimse fark etmedi. Ta ki bir araştırmacı, paketin içine gizlenmiş kod parçasını bulana kadar.
O kod ne yapıyordu? Kullanıcıların kripto para cüzdanlarını arıyor, özel anahtarları çalıyordu. Hedef spesifikti: Copay isimli bir Bitcoin cüzdan uygulaması.
Paket bu sürede milyonlarca kez indirilmişti.
Peki kim fark etti? Bir GitHub kullanıcısı. Gönüllü, ücretsiz çalışan biri.
Kim Denetliyor?
Kısa cevap: Kimse.
npm'in otomatik tarama sistemleri var. Bilinen zararlı yazılım imzalarını arıyor. Ama sıfırıncı gün saldırıları için, özellikle hazırlanmış hedefli kötü kod için bu taramalar kör.
Büyük şirketler kendi çözümlerini üretmiş durumda. Google, Meta, Microsoft kritik paketleri fork edip kendi güvenlik ekiplerinden geçiriyor. Ama bu lüks her şirkete nasip olmuyor.
Snyk, Dependabot, Socket gibi araçlar bilinen açıkları takip ediyor. CVE veritabanlarıyla karşılaştırıyor. Faydalılar, ama reaktifler: açık önce bulunuyor, sonra işaretleniyor, sonra siz güncelliyorsunuz. Bu arada ne kadar süre geçiyor?
Açık Kaynak'ın Trajedisi
Burada bir paradoks var.
Açık kaynak, yazılım dünyasını demokratikleştirdi. Bir öğrenci, dünyaca kullanılan bir kütüphane yazabiliyor. Küçük şirketler, enterprise araçları ücretsiz kullanabiliyor. Bilgi paylaşılıyor, ilerleme hızlanıyor.
Ama bu ekosistem, gönüllü emeği üzerine kurulu. Ve gönüllü emek tükeniyor.
"left-pad" geliştiricisi yoruldu, bıraktı. "event-stream" geliştiricisi yoruldu, devretti. Her gün onlarca kritik paket, hayatının farklı bir dönemine geçmiş, artık ilgilenemeyen biri tarafından "sürdürülüyor."
Siz o paketi kullanıyorsunuz. Onun bağımlılığının bağımlılığı olarak. Habersizce.
Microsoft'un Kapalı Dünyası mı Daha İyiydi?
Nostalji tehlikeli. Eski Microsoft dünyasının da bedelleri vardı.
Her şey Windows'a kilitliydi. Lisanslar pahalıydı. Topluluk katkısı neredeyse sıfırdı. "Linux bir kanser" diyen bir şirketten bahsediyoruz. Yenilik yavaştı, her şey Microsoft'un roadmap'ine bağlıydı.
O dünya güvenliydi çünkü dardı. Bugünkü dünya özgür ama kaotik.
İkisi arasında sağlıklı bir denge henüz bulunamadı.
Ne Yapmalı?
Bağımlılıklarınızı tanıyın. npm ls ile dependency tree'ye bakın. Her paketin ne yaptığını en azından kabaca bilin.
Sürümleri kilitleyin. package-lock.json'u commit edin. ^ ve ~ versiyonlarına dikkat edin, her npm install'da farklı bir şey kurulabilir.
Güvenlik taraması yapın. npm audit çalıştırın. Snyk veya Dependabot entegre edin. Mükemmel değil ama hiç yoktan iyi.
Az bağımlılık, daha az risk. Her şey için paket kurmak yerine zaman zaman kendiniz yazın. 11 satırlık bir şey için left-pad kurmayın.
Büyük, aktif topluluğa sahip paketleri tercih edin. Son commit tarihi 4 yıl önceyse, o paket için iki kez düşünün.
Son Söz
Bugün bir uygulama kurarken Node versiyonu uyumsuzluğu, Expo SDK çakışması, TurboModule hatası, babel-preset eksikliği derken saatler harcadım.
Şikâyet etmek kolay. Ama şunu da söylemek lazım: bu kaotik, güvensiz, yorucu ekosistemi gönüllüler inşa etti. Ücretsiz. Bazen gecenin üçünde. Karşılıksız.
Belki de asıl sorun, milyar dolarlık şirketlerin bu gönüllü emeğin üzerine ticari ürünler inşa etmesi ve o emekçilere yeterince geri vermemesi.
Ama bu başka bir yazının konusu.
Bu yazıyı bir React Native uygulaması kurulum hatasının 15. dakikasında yazmaya karar verdim. Uygulama 1.5 saatte çalıştı.