Neden Go Dili?
Giriş
Programlama dilleri, ürün yaratmak için kullanılan araçlardır. Sadece belirli bir dil kullanmakla bir geliştiricinin becerisi belirlenmez. Ancak hangi dilin seçildiği ve nasıl ele alındığı, geliştiricinin düşünce yapısını ve gelişim yönünü doğrudan etkileyebilir. Özellikle şu anda kullanılan dilin ötesine geçerek diğer dillerle karşılaştırma yapmak, teknik ufku genişletmek ve özsel duyarlılığı geliştirmek için büyük fayda sağlar. Bu yazıda, neden Go'yu seçtiğimi ve bunun bir geliştiricinin gelişimine hangi açılardan yardımcı olduğunu beş farklı yönden ele alacağım.
1. Go, performans ve üretkenlik arasında bir denge kuran bir dildir.
Dünyada sayısız programlama dili bulunmaktadır ve her dilin özelliklerine göre avantajları ve dezavantajları vardır.
- C, üstün performans ve düşük seviye kontrol sağlasa da, bellek yönetimini geliştiricinin doğrudan yapması gerekir ve yüksek seviye özelliklerin eksikliği nedeniyle üretkenliği düşüktür ve bakımı zordur.
- C++ ve Rust, nesne yönelimli programlama, template'ler ve meta programlama gibi çeşitli gelişmiş özellikleri desteklese de, sözdizimleri karmaşıktır, öğrenme eğrileri diktir ve yavaş derleme süreleri nedeniyle tekrarlayan dağıtımlar için uygun değildir.
- Java ve C#, platform bağımsızlığı ve kararlılık sağlayarak büyük ölçekli servislerde yaygın olarak kullanılsa da, ağır sanal makinelerde çalıştıkları için dağıtım ve yürütme ortamları karmaşıktır ve kaynak gereksinimleri yüksektir.
- Python ve Javascript, basit sözdizimleri ve zengin ekosistemleri sayesinde hızlı geliştirme için uygun olsa da, yürütme performansları düşüktür ve ekosistemlerinin güvenilirliği düşüktür, bu da büyük ölçekli sistemlerde yapısal sınırlamaları ortaya çıkarır.
Buna karşılık, Golang, performans ve üretkenlik arasında üstün bir dengeye sahip bir dildir. Go, C gibi derlenmiş bir dil olduğu için yüksek yürütme performansı sağlarken, hızlı derleme süreleriyle yorumlayıcı düzeyinde dağıtım esnekliği sunar. Yani, Go, belirgin bir dezavantajı olmadan çoğu ortamda istikrarlı bir şekilde kullanılabilen dengeli bir dildir.
2. Go, kargo kültü programlamayı engeller.
İkinci Dünya Savaşı sırasında Müttefik kuvvetler, savaşa yardımcı olmak için Pasifik adalarına hava üsleri inşa ettiler. Büyük miktarda ikmal ve askeri teçhizat desteği, askerlerin ve yerli halkın yaşamlarını büyük ölçüde değiştirdi. Ada sakinleri, uçakların üretilmiş giysiler, konserve yiyecekler ve diğer eşyaları taşıdığını ilk kez gördüler. Savaş bittiğinde, üsler terk edildi ve kargolar artık gelmedi. Bunun üzerine ada sakinleri, askerleri taklit etmek için hava trafik kontrolörleri, askerler ve denizciler gibi giyindiler, pist benzeri yerler yaptılar ve çubukları kullanarak uçaklara iniş sinyalleri gönderdiler. Uçaklardan kargoların paraşütle düşmesi için yürüyüşlerine devam ettiler. Ancak bekledikleri uçaklar gelmedi.
Kargo kültü programlama, kod veya teknolojinin prensiplerini anlamadan sadece dış görünüşünü taklit eden bir geliştirme alışkanlığını ifade eder. Modern geliştiriciler, özellikle web geliştirme alanında, bu tür anlamadan taklit etme alışkanlığı sıkça görülür. React, Next, Spring, Django gibi framework'ler sayesinde iç yapıyı bilmeden geliştirme yapmak mümkün hale gelmiş olsa da, küçük bir hatayla bile doğru şekilde başa çıkılamayan durumlar sıklıkla yaşanır. Buna son zamanlarda AI kod üretim araçlarının da eklenmesiyle, kodu doğrudan yazmak veya prensiplerini anlamak yerine sadece sonucu kopyala-yapıştır yapan geliştirme yöntemi daha da yaygınlaşmıştır.
Go, bu tür sorunları dil felsefesi düzeyinde kökten reddeder. Go, framework merkezli değil, standart kütüphane merkezli olarak tasarlanmış bir dildir. Geliştiriciler, net/http, database/sql gibi temel kütüphanelerle bile gerçek servis düzeyinde bir web sunucusu kurabilirler ve bu sayede doğal olarak ağ, veritabanı, I/O gibi düşük seviye yapılar hakkında sezgi ve anlayış geliştirirler. Framework'lere bağımlı kalmadan temel becerileri sağlam bir şekilde öğrenmeyi sağlayan bu yapı, geliştiricinin teknolojinin özünü kaybetmeden sürekli gelişebilmesi için bir temel oluşturur.
3. Go, güçlü bir eşzamanlılık modeli sunar.
Modern CPU'lar, tek çekirdek hızını artırmaktan ziyade, birden fazla çekirdeği paralel olarak kullanarak performansı artırma yönünde gelişmektedir. Buna bağlı olarak, tek bir programın birden fazla görevi aynı anda işleyebilmesi olan eşzamanlılık bir zorunluluk haline gelmiş ve bunu verimli bir şekilde tasarlayabilen ve uygulayabilen dillerin önemi giderek artmaktadır. Go, bu ortama optimize edilmiş bir dildir. goroutine, Go'nun sağladığı hafif bir iş parçacığıdır ve sadece birkaç KB'lık yığın ile oluşturulabilir; binlercesi aynı anda çalıştırılsa bile sistem kaynaklarını neredeyse hiç tüketmez. Go runtime'ı, kendi M:N zamanlayıcısı aracılığıyla sayısız goroutine'i OS iş parçacıklarına verimli bir şekilde dağıtır ve bu süreç, geliştiricinin doğrudan müdahale etmesine gerek kalmadan otomatik olarak optimize edilir. Bu sayede geliştirici, karmaşık senkronizasyon mantığı veya özel zamanlama olmaksızın, güvenli ve tutarlı bir şekilde eşzamanlılık mantığı tasarlayabilir.
Ayrıca Go, mutex, waitGroup gibi senkronizasyon araçlarını, channel ve context kullanarak modern eşzamanlılık tasarımını aktif olarak destekler. Bu yapılar sayesinde geliştirici, karmaşık teorilere takılıp kalmadan eşzamanlılık ve paralellik hakkında pratik bir duyarlılık kazanabilir ve sıfırdan kullanılabilir seviyede yüksek soyutlama ve tasarım yeteneğine ulaşabilir.
4. Go, büyük geliştiriciler tarafından merkez alınarak oluşturulmuş bir dildir.
Go, Google ve Robert Griesemer, Rob Pike, Ken Thompson gibi efsanevi geliştiricilerin öncülüğünde ortaya çıkmış bir dildir. Özellikle bu kişiler, Unix ve C dilinin yaratıcıları, ayrıca derleyici ve sistem yazılımı alanında ustalar olup, Go'nun teknik güvenilirliğini kendi başlarına kanıtlarlar. Buna ek olarak, sayısız Google mühendisinin pratik deneyimi ve büyük ölçekli servis işletme bilgisi yansıtılarak, Go en başından itibaren gerçek dünya problemlerini çözmeyi hedeflemiş, tutarlı bir felsefe ve yönelimle gelişmiştir.
Diğer diller genellikle uyumluluk kopuklukları, tasarım değişiklikleri, kararsız lisanslar ve standart dışı ekosistemler nedeniyle topluluklara ve kullanıcılara karışıklık yaşatır. Örneğin, Python'da 2 ve 3 arasındaki uyumluluk kopukluğu nedeniyle ekosistem yıllarca ikiye bölünmüş, Java'nın Oracle tarafından satın alınmasından sonra lisans politikaları istikrarsızlaşarak şirketlerin benimsemekten kaçındığı durumlar artmıştır. Ayrıca Node.js'de hala CJS ve ESM birlikte var olarak tutarlı bir modül sistemi sağlayamamaktadır.
Buna karşılık Go, tutarlılık ve istikrarı en öncelikli değer olarak gören bir dildir. Go ekibi, geriye dönük uyumluluğu titizlikle sürdürür ve yeni özellikler getirirken bile mevcut kodla çakışmaması için aşamalı bir entegrasyon yöntemini benimser. Sözdizimi de gereksiz anahtar kelimelerden kaçınır ve aşırı soyutlamayı sınırlayarak dilin gereksiz yere karmaşıklaşmasını önler. Ayrıca, go fmt, go mod, go build, go test gibi tutarlı resmi araç zinciri, tüm Go projelerinin aynı geliştirme ortamına ve yapısına sahip olmasını teşvik eder ve güçlü ve pratik standart kütüphane, ayrı bir framework'e gerek kalmadan web sunucusu, dosya işleme, veritabanı entegrasyonu gibi gerçek dünya geliştirmesinde ihtiyaç duyulan çoğu özelliği eksiksiz destekler.