GO’nun Güzelliği

Hüseyin GÜZEL

Hüseyin GÜZEL

EEE / PM / MSc / huseyinguzel.net

                                          Gopher – Go’nun Simgesel Maskotu
Kısa bir süre önce Go’yu keşfetmeye başladım ve gerçekten güzelliğinden etkilendim. Kullanım kolaylığı ile performans ve güvenlik arasında bir denge kurmanın ne kadar güzel olduğunu fark ettim.
Bunların yanı sıra iki özelliği daha modern sistem geliştirmesi açısından Go’yu mükemmel bir dil haline getiriyor. Bu özelliklerin her ikisine de aşağıda Güçlü Yönler bölümünde daha ayrıntılı olarak açıklanmıştır.
Bunlardan biri dilde eşzamanlılık. Eşzamanlılık tasarımı CPU hızını verimli kullanmanızı sağlar. İşlemcinizin sadece bir çekirdeği olsa bile, eşzamanlılık tasarımı, bir çekirdeği etkin ve verimli bir şekilde kullanmanıza olanak tanır. Bu nedenle, genellikle tek bir makinede çalışan yüz binlerce eşzamanlı goroutin (hafif iş parçacığı) sahibi olabilirsiniz. Kanallar ve goroutinler, üretici-tüketici mesajlaşma paradigmasını özetlediğinden, dağıtılan sistemlerin merkezinde yer alıyorlar. 
Go’da gerçekten sevdiğim diğer özellik: arabirimler. Arabirimler, sistemleriniz için gevşek şekilde birleşmiş veya ayrıştırılmış bileşenleri etkinleştirir. Kodunuzun bir bölümünün yalnızca arabirim türüne güvenebileceği anlamına gelir. Arabirimi kimin uyguladığı yada nasıl uyguladığı gerçekte önemli değildir. 
Denetleyiciniz daha sonra, bu kodu arabirimi (arabirimdeki tüm işlevleri uygular) karşılayan bir bağımlılık sağlayabilir. Bu aynı zamanda birim testleri için gerçekten temiz bir mimari sağlar. Şimdi, denetleyiciniz doğru olup olmadığını, işe yarayıp yaramadığını test edebilmek için kodun gerektirdiği arabirimin sahte bir uygulamasını ekleyebilir. 
Bütün bu özellikleri göz önünde bulundurduğumuzda, Go’un harika bir dil olduğunu düşünüyorum. Özellikle bulut sistemleri geliştirmede (web sunucuları, CDN’ler, önbellekler vb.), dağıtımlı sistemler, mikro servisler vb. alanlarda. Dolayısıyla, keşfetmek veya deneyimlemek istediğiniz bir yazılım diline karar vermeye çalışan bir mühendis iseniz ve bir başlangıç yapıyorsanız, Go’a ciddi olarak düşünmenizi tavsiye ediyorum. 
Bu yazıda, Go’nun aşağıdaki dil özelliklerini anlatacağım:
1) Tanıtım

2) Go’ya neden gerek duyuldu?

3) Hedef Kitle

4) Go’nun güçlü yönleri

5) Go’nun zayıf yönleri

6) Go2’ye Doğru

7) Go’nun tasarım felsefesi

8) Nasıl başlanır?

9) Go’yu kim kullanıyor?

1) Tanıtım

Go, Robert Griesemer, Rob Pike ve Ken Thompson tarafından Google’da oluşturulmuş açık kaynak kodlu bir dildir. Buradaki açık kaynaktan kasıt olarak, herkesin yeni özelliklere ilişkin önerileri sunarak, hataları düzelterek vb. katkıda bulunabileceği anlamına gelir. Dilin kodu GitHub’da mevcuttur. Dile nasıl katkıda bulunabileceğinize ilişkin dokümanlar burada verilmektedir.

2) Go’ya neden gerek duyuldu?

Yazılımcılar, yeni bir dil tasarlamak için birincil nedenin Google’daki yazılım mühendisliği sorunlarını çözmek olduğunu ifade ettiler. Ayrıca, Go’un C ++’a alternatif olarak geliştirildiğini de belirttiler.
Rob Pike, Go programlama dilinin amacından şöyle bahsediyor:

“Go’un amacı: programlama dili tasarımı konusunda araştırma yapmak değil; tasarımcılar ve onların iş arkadaşları için çalışma ortamını iyileştirmektir. Go, programlama dili araştırmala-rından çok yazılım mühendisliği ile ilgilidir. Veya başka bir şekilde ifade etmek gerekirse; yazılım mühendisliği hizmetinde dil tasarımı ile ilgilidir.”

3) Hedef kitle

Go, bir sistem programlama dilidir. Go, bulut sistemleri (web sunucuları, önbellekler), mikroişlemciler, dağıtılmış sistemler (eşzamanlılık desteği nedeniyle) gibi şeyler için gerçekten giderek yükselen bir değer haline geliyor. 

4) Go’nun Güçlü Yönleri

a) Go, statik olarak yazılmış: Bu, derleme zamanında tüm değişkenleriniz ve işlevden bağımsız değişkenleriniz (dönüş değişkenleri) için tür bildirmek zorunda olduğunuz anlamına gelir. Bu uygunsuz gibi gelse de, derleme zamanında bir sürü hatalar bulunacağı için büyük bir avantajdır bu. Bildirilen türler, işlevleri ve kitaplıkları daha okunaklı ve anlamayı daha kolay hale getirdiğinden, bu faktör ekip kapasiteniz arttıkça çok önemli bir rol oynar. 
b) Derleme Hızı: Go kodu gerçekten hızlı derlenir, böylece kodunuzun derlenmesini beklemeye gerek yoktur. Aslında, ‘go run’ komutu Go programınızı çok hızlı bir şekilde harekete geçirir, böylece kodunuzun derlendiğini hissetmezsiniz bile. Tercüme edilmiş bir dil gibi gelir. 🙂
c) Çalışma Hızı: Go kodu, derlemeye alınan makinenin CPU komut kümesi mimarisine bağlı olarak doğrudan makine koduna derlenir. Yani, gerçekten hızlı çalışır. 
d) Taşınabilir: Kod doğrudan makine koduyla birleştirildiğinden, ikili dosyalar taşınabilir hale gelir. Makinenizden (x86-64 için) ikili dosyayı alıp direk olarak sunucunuzda çalıştırabilirsiniz (sunucunuz da x86-64 mimarisinde çalışıyorsa tabi :).
Bu, bir veri merkezinde birden fazla makineye programlarınızın yerleştirilmesi için büyük bir imkandır. Veri merkezinizde 100 makine varsa, program ikili dosyalarınızı hepsini, sadece ‘scp’ komutu ile değiştirebilirsiniz. Hangi Linux sürümünü kullandığınızın bir önemi yoktur ve İkili dosyalar basitçe çalışır. 
e) Eşzamanlılık: Go, eşzamanlılık için birinci sınıf desteği sağlar. Eşzamanlama, Go’un en önemli satış noktalarından biridir. Dil tasarımcıları, eşzamanlılık modelini Tony Hoare’nin “İletişimsel Ardıl Süreçler” araştırması etrafında tasarladı.
Go çalışma zamanı, bir makinede yüz binlerce eşzamanlı goroutini çalıştırmanıza izin verir. Goroutine (Go rutin) hafif bir iş yürütme parçacığıdır. Go çalışma zamanı bu goroutine’leri işletim sistemi iş parçacıkları üzerinde çoğaltır. Bu, birden fazla goroutinin tek bir OS iş parçacığında aynı anda çalışabileceği anlamına gelir. 
f) Arabirimler: Arabirimler, gevşek bağlı sistemlere izin verir. Go’daki bir arabirim türü, bir dizi işlev olarak tanımlanabilir. Bu kadar. Bu işlevleri örtük olarak uygulayan herhangi bir tür arabirim, kendi arabirimini uygular. Yani hangi türün arabiriminin uyguladığını belirtmeniz gerekmez. Bu, derleyici tarafından derleme yapılırken otomatik olarak kontrol edilir.
g) Gereksiz Verileri Toplama: C’den farklı olarak, Pointerlardan kurtulmayı veya Go’daki sallantıdaki pointerlar hakkında endişelenmeniz gerekmez. Çöp toplayıcısı (garbage collector) bu işi otomatik olarak yapar. 
h) İstisna yok, hataları kendiniz giderin: Go’nun diğer dillerin sahip olduğu standart istisna mantığına sahip olmamasını çok seviyorum. Go geliştiricileri, kodlarını bir deneme yakalama bloğunda tamamlamasına izin vermek yerine ‘dosya açılamadı’ gibi temel hataları işlemeye zorlar. Bu aynı zamanda geliştiricilere bu hata senaryolarını çözmek için yapılması gerekenleri düşünmeye zorlar.
i) Hayret Verici Kalıplar: Go’nun en iyi özelliklerinden biri, kalıplar oluşturmasıdır.
j) Harika Yerleşik Kütüphaneler: Go’un modern gelişimine yardımcı olacak büyük dahili kütüphaneler vardır.

5) Go’nun Zayıf Yönleri

a) Jenerik eksikliği: Jenerikler, daha sonra belirtilecek olan türler etrafında algoritmalar tasarlamamıza izin veriyor. Diyelim ki, tamsayıların bir listesini sıralamak için bir fonksiyon yazmanız gerekiyor. Daha sonra, dizelerin bir listesini sıralamak için başka bir fonksiyon yazmanız gerekir. O anda, kodun hemen hemen aynı görüneceğini fark ettiniz, fakat orijinal fonksiyonu kullanamazsınız çünkü fonksiyon, tamsayı tipinde bir liste veya bir tür bağımsız değişken olarak bir tür liste dizisi alabilir. Bu kod çoğaltma gerektirir. Bu nedenle jenerikler, daha sonra belirtilebilecek türler etrafında algoritmalar tasarlamanıza izin verir. T tipi listesini sıralamak için bir algoritma tasarlayabilirsiniz. Daha sonra, o türe ait bir sıralama işlevi olduğu düşünüldüğünde, aynı işlevi tamsayılar / dizeler / diğer türlerle arayabilirsiniz. Derleyicinin bu türün bir değerinin o türün başka bir değerinden büyük olup olmadığını kontrol edebileceği anlamına gelir (sıralama için bu gerekli olduğu için).
Go, dilin boş arabirimini ({} arabirimi) kullanarak bir tür genel mekanizmayı uygulamak mümkündür. Ancak, ideal değildir. 
Jenerik son derece tartışmalı bir konudur. Bazı programcılar onun yüzünden küfrederler 🙂 Diğerleri ise, genellikle jeneriklerin derleme zamanı ile çalışma zamanı arasında bir değiş-tokuş olması nedeniyle programlama dilinde olmalarını istemezler. 
b) Bağımlılık yönetiminin eksikliği: Go dilinin ve kitaplığının, Go’nun ömrü boyunca API’larını değiştiremeyeceği anlamına gelir. Bu, kaynak kodunuzun hem Go 1.5 hem de Go 1.9 için derlemeye devam edeceği anlamına gelir. Bu nedenle, çoğu 3. parti Go kütüphanesi de aynı durum söz konusudur. 
GitHub’dan üçüncü parti bir kütüphaneye ulaşmanın birincil yolu ‘Go get’ aracıdır, bu nedenle ‘go get github.com/vendor/library’ seçeneğini yaptığınızda, en yeni kodun ana dalındaki kütüphane API’lerini değiştirmez. 

6) Go 2.0’a Doğru

Yazılımcıların böyle açık kaynaklı bir yaklaşımı, programlama diline uyarlama biçimini çok seviyorum. Go 2.0’a bir özellik uygulanmasını istiyorsanız, aşağıdakileri yapmanızı gerektiren bir belge yazmanız gerekir:
– kullanım durumunuzu veya probleminizi tanımlayın

– Go’yu kullanarak kullanım örneğini / sorununu nasıl çözemediğinizi gösterin

– Bir problemin gerçekte ne kadar büyük olduğunu açıklayın (bazı problemler yeterince büyük değildir ya da zaman içinde belirli bir anda çözmek için öncelik sırasına gelecek kadar yeterince önem taşımazlar).

– isteğe bağlı olarak, sorunun nasıl çözüleceğine ilişkin bir çözüm önerisinde bulunun.

7) Go’nun tasarım felsefesi

Rob Pike’nin bana basit gibi gelen ama karmaşık konuşmasından bir kaç şeyi tuttum. Özellikle, sevdiğim şeyler şunlardı:
1) Geleneksel olarak, diğer diller sadece yeni özellikler eklemeye devam etmek istemektedir: Bu yolla tüm diller şişirilmiş, derleyicilerinde ve özelliklerinde çok fazla karmaşıklık yaratılmıştır. Bu devam ederse de, her dil gelecekte aynı gibi görünecek, çünkü her dil sahip olmadığı özellikleri eklemeye devam edecekler. Örneğin, Nesne yönelimli özellikler ekleyen JavaScript. Go yazılımcıları kasıtlı olarak pek çok özelliği dile eklemiyorlar. 

2) Çözüm alanında dikey vektörlere benzer özellikler var. Önemli olan, kullanım durumunuz için farklı vektörleri seçme ve birleştirme becerisidir. Ve bu vektörler doğal olarak birbirleriyle çalışmalıdır. Bu, dilin her özelliğinin diğerleriyle öngörülebilir şekilde çalışması gerektiği anlamına gelir. Bu şekilde, bu özellik seti tüm çözüm alanını kapsar. Birbirleriyle çok doğal çalışan bu özelliklerin hepsini uygulamak, dilin uygulanmasını oldukça karmaşık bir hale getirir. Ancak dil, karmaşıklığı özetler ve sana basit, anlaşılması kolay bir arabirim sağlar. Bu nedenle basitlik, karmaşıklığı gizleme sanatıdır 🙂

3) Okunabilirliğin önemi çoğunlukla azdır. Okunabilirlik, programlama dillerini tasarlarken tartışmasız en önemli şeylerden biridir; yazılımın bakım ve maliyeti yüksektir okunabilirlik az ise. Aşırı fazla özellik, bir dilin okunabilirliğine zarar verir.

4) Okunabilirlik aynı zamanda güvenilirlik anlamına gelir. Bir dil karmaşıksa, kodu okumak ve üzerinde çalışmak için daha fazla şey anlamalı ve çok çalışmalısınız. Benzer şekilde, hata ayıklamak ve onu düzeltmek için de. Bu, aynı zamanda, ekibinizdeki yeni geliştiricilerin, dil hakkındaki anlayışlarını kod tabanınıza katkıda bulunabilecekleri noktaya kadar çıkarmak için daha büyük ölçekli çalışma sürelerine ihtiyaç duyacakları anlamına gelir.

8) Nasıl başlanır?

Go’yu buradan indirebilir ve kurulum talimatlarını izleyebilirsiniz.
İşte bu da Go’yu kullanmaya başlamak için resmi kılavuz.
Go’yu öğrenmek için iyi bir örnek
Toplulukla etkileşim kurmak ve dil etrafındaki tartışmalara katılmak için Gophers Slack Kanalına katılabilirsiniz

9) Kimler Go’u kullanıyor

Birçok şirket Go’ya çok yatırım yapmaya başladı. İşte bazı büyük isimler:
Google 

BaseCamp

CloudFlare

CockroachDB 

CoreOS

DataDog 

DigitalOcean o

Docker 

Dropbox

Parse 

Facebook 

Intel 

Iron.IO 

MalwareBytes 

Medium 

MongoDB

Mozilla 

Netflix 

Pinterest 

Segment 

SendGrid 

Shopify

SoundCloud 

SourceGraph

Twitter 

Uber 

Medium Blogger, Kanishk Dudeja 

Yorumlar (0) Yorum Yap

/
Exit mobile version