Sistem ve Arka Uç Mühendisliği Perspektifinden Go Dilinin 5 Tasarım Özelliği

Giriş
Programlama dilleri, ürün geliştirmek için kullanılan araçlardır. Yalnızca hangi dilin kullanıldığı, geliştiricinin becerisini belirlemez. Ancak hangi dilin seçildiği ve bu dilin nasıl kullanıldığı, geliştiricinin düşünce biçimini ve gelişim yönünü doğrudan etkileyebilir. Özellikle mevcut kullanılan dilin dışına çıkarak diğer dillerle karşılaştırma yapmak, teknik bakış açısını genişletmeye ve özü kavrama duygusunu geliştirmeye büyük katkı sağlar. Bu yazıda, Go dilini neden seçtiğimi ve bunun geliştiricinin gelişimine hangi yönlerden katkıda bulunduğunu beş başlık altında anlatmaya çalışacağım.
1. Go, performans ile üretkenliği dengeleyen bir dildir.
Dünyada çok sayıda programlama dili vardır ve her dil, özelliklerine bağlı olarak avantaj ve dezavantajlara sahiptir.
- C, üstün performans ve düşük seviyeli kontrol imkânı sunar; ancak bellek yönetimini geliştiricinin doğrudan yapması gerekir ve üst seviye özelliklerin eksikliği nedeniyle üretkenliği düşük, bakımı zordur.
- C++ ve Rust, nesne yönelimli programlama, şablonlar ve metaprogramlama gibi çeşitli ileri düzey özellikleri destekler; ancak sözdizimi karmaşıktır, öğrenme eğrisi diktir ve yavaş derleme hızı nedeniyle sık dağıtım yapmak için uygun değildir.
- Java ve C#, platform bağımsızlığı ve kararlılık sağlayarak büyük ölçekli hizmetlerde yaygın olarak kullanılır; ancak ağır bir sanal makinede çalıştıkları için dağıtım ve çalıştırma ortamları karmaşıktır ve kaynak gereksinimleri yüksektir.
- Python ve JavaScript, sade sözdizimi ve zengin ekosistemleri sayesinde hızlı geliştirme için uygundur; ancak çalışma performansları düşüktür ve ekosistemin güvenilirliği sınırlı olduğu için büyük ölçekli sistemlerde yapısal sınırlamalar ortaya çıkar.
Buna karşılık Golang, performans ile üretkenlik arasında üstün bir denge kuran bir dildir. Go, C gibi derlenen bir dil olduğu için yüksek çalışma performansı garanti ederken, hızlı derleme süresiyle yorumlanan dillerin dağıtım esnekliğini de sunar. Yani Go, belirgin bir zayıflığı olmadan çoğu ortamda istikrarlı biçimde kullanılabilen dengeli bir dildir.
2. Go, kargo kült programlamayı engeller.
İkinci Dünya Savaşı sırasında Müttefik kuvvetler, savaşa destek vermek amacıyla Pasifik adalarında hava üssü inşa etti. Büyük miktarda ikmal malzemesi ve askeri ekipman desteği, askerlerin ve yerlilerin yaşamını önemli ölçüde değiştirdi. Adalı halk, uçakların üretilmiş giysileri, konserve gıdaları ve diğer eşyaları taşıyarak geldiğini ilk kez gördü. Savaş bittiğinde üs terk edildi ve kargo artık gelmedi. Bunun üzerine ada halkı askerleri taklit etmek amacıyla hava trafik kontrolörü, asker ve denizci gibi giyinip, bir pist benzeri alan oluşturdu ve uçaklara iniş işareti vermek için sopalar kullandı. Uçaklardan kargonun paraşütlerle inmesini sağlamak için yürüyüşlerini sürdürdü. Ancak bekledikleri uçaklar hiçbir zaman gelmedi.
Kargo kült programlama, kodun veya teknolojinin ilkesini anlamadan yalnızca dış görünüşünü taklit eden geliştirme alışkanlığını ifade eder. Modern geliştiriciler, özellikle web geliştirme alanında, bu anlamı bilmeden taklit etme alışkanlığıyla sıkça karşılaşır. React, Next, Spring ve Django gibi çerçeveler sayesinde iç yapıyı bilmeden geliştirme yapmak mümkün hale gelmiştir; ancak küçük bir hatayla bile etkili biçimde başa çıkamayan durumlar çoktur. Buna son dönemdeki yapay zekâ destekli kod üretim araçları da eklenince, kodu doğrudan yazmak veya ilkesini anlamak yerine yalnızca sonucu kopyalayıp yapıştırma geliştirme biçimi daha da yaygınlaşmaktadır.
Go, bu sorunu dil felsefesi düzeyinde kökten reddeder. Go, çerçeve merkezli değil, standart kütüphane merkezli tasarlanmış bir dildir. Geliştirici, yalnızca net/http ve database/sql gibi temel kütüphanelerle gerçek hizmet düzeyinde bir web sunucusu kurabilir ve bu sayede ağ, veritabanı, G/Ç gibi düşük seviyeli yapılara dair sezgi ve anlayış doğal olarak gelişir. Çerçevelere bağımlı olmadan temelleri sağlam biçimde öğrenilebilen bu yapı, geliştiricinin teknolojinin özünü kaybetmeden sürekli gelişebilmesi için sağlam bir zemin oluşturur.
3. Go, güçlü bir eşzamanlılık modeli sunar.
Modern işlemciler, tek çekirdeğin hızını artırmak yerine birden fazla çekirdeği paralel kullanarak performansı yükseltme yönünde gelişmektedir. Buna bağlı olarak, bir programın birden fazla işi aynı anda işleyebilmesi olan eşzamanlılık vazgeçilmez hale gelmiş ve bunu verimli biçimde tasarlayıp uygulayabilen dillerin önemi giderek artmıştır. Go, bu ortama uygun olarak optimize edilmiş bir dildir. goroutine, Go'nun sunduğu hafif bir iş parçacığıdır; birkaç KB düzeyindeki bir yığınla oluşturulabilir ve binlercesi aynı anda çalıştırıldığında bile sistem kaynaklarını neredeyse hiç tüketmez. Go çalışma zamanı, kendi M:N zamanlayıcısı aracılığıyla çok sayıda goroutine'i OS iş parçacıklarına verimli biçimde dağıtır ve bu süreç geliştirici müdahalesi olmadan otomatik olarak optimize edilir. Böylece geliştirici, karmaşık senkronizasyon mantığı veya özel zamanlama olmadan da güvenli ve tutarlı bir biçimde eşzamanlılık mantığını tasarlayabilir.
Ayrıca Go, mutex, waitGroup gibi senkronizasyon araçlarını; channel ve context kullanan modern eşzamanlılık tasarımlarını etkin biçimde destekler. Bu yapı sayesinde geliştirici, karmaşık kuramlara takılmadan eşzamanlılık ve paralellik konusunda pratik bir sezgi kazanabilir ve sıfırdan kullanılabilecek üst düzey soyutlama ve tasarım becerilerine ulaşabilir.
4. Go, seçkin geliştiricilerin ilkeli bir yaklaşımla oluşturduğu bir dildir.
Go, Google bünyesinde Robert Griesemer, Rob Pike ve Ken Thompson gibi efsanevi geliştiricilerin öncülüğünde ortaya çıkmış bir dildir. Özellikle bu isimler, Unix ve C dilinin yaratıcıları ve derleyici ile sistem yazılımı alanının ustaları olarak Go'nun teknik güvenilirliğini kendiliğinden kanıtlar. Buna ek olarak, çok sayıda Google mühendisinin pratik deneyimleri ve büyük ölçekli hizmet işletme bilgisi de dile yansımış; böylece Go, baştan itibaren gerçekçi sorun çözmeyi hedefleyerek tutarlı bir felsefe ve yönelimle gelişmiştir.
Diğer diller ise zaman zaman geriye dönük uyumsuzluklar, tasarım değişiklikleri, belirsiz lisans politikaları ve standartlaştırılmamış ekosistemler nedeniyle topluluklarda ve kullanıcılarda karışıklığa yol açabilmektedir. Örneğin Python, 2 ve 3 sürümleri arasındaki uyumsuzluk nedeniyle ekosistemi yıllarca ikiye bölünmüş yaşamıştır; Java ise Oracle'ın satın almasının ardından lisans politikalarının istikrarsızlaşması sonucu kurumsal benimsemede çekingenlik yaşanan örneklerin artmasına neden olmuştur. Ayrıca Node.js, CJS ve ESM'nin birlikte var olmaya devam etmesi nedeniyle tutarlı bir modül sistemi sunamamaktadır.
Buna karşılık Go, tutarlılık ve kararlılığı en önemli değer olarak benimseyen bir dildir. Go ekibi, geriye dönük uyumluluğu titizlikle korur ve yeni özellikler eklenirken mevcut kodla çakışmayacak şekilde kademeli bir entegrasyon yöntemini benimser. Sözdizimi de gereksiz anahtar kelimelerden kaçınır ve aşırı soyutlamayı sınırlandırarak dilin gereksiz yere karmaşıklaşmasını önler. Ayrıca go fmt, go mod, go build ve go test gibi tutarlı resmi araç zinciri, tüm Go projelerinin aynı geliştirme ortamına ve yapıya sahip olmasını sağlar; güçlü ve pratik standart kütüphane ise ayrı bir çerçeveye ihtiyaç duymadan web sunucusu, dosya işleme, veritabanı entegrasyonu gibi gerçek geliştirme için gereken işlevlerin çoğunu eksiksiz biçimde destekler.
5. Gopher sevimlidir.


