5 puan yazan GN⁺ 2025-08-23 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Go dilinin tasarımındaki çeşitli kararlar gereksiz biçimde alındı ya da mevcut deneyim görmezden gelinerek verildi
  • Hata değişkenlerinin kapsamını yönetme sorunu, kodun okunabilirliğini ve hata ayıklamayı zorlaştırıyor
  • nil'in ikili doğası, bellek kullanımı, kod taşınabilirliği gibi birçok alanda sezgisel olmayan ve gerçek dünyaya uymayan tasarımlar görülüyor
  • defer deyiminin sınırlamaları ve standart kütüphanenin istisna işleme yaklaşımı, istisna güvenliğini sağlamayı zorlaştırıyor
  • Bellek yönetimi ve UTF-8 işleme yetersizlikleri gibi biriken sorunlar, Go kod tabanlarının kalitesini uzun vadede olumsuz etkiliyor

Go diline yönelik uzun vadeli eleştiri

  • Daha önceki yazılarda (Why Go is not my favourite language, Go programs are not portable) belirttiğim gibi, 10 yılı aşkın süredir Go dilinin çeşitli sorunlarına dikkat çekiyorum
  • Özellikle, zaten bilinen iyi örnekleri görmezden gelen gereksiz tasarım kararları zamanla daha da hayal kırıklığı yaratıyor

Hata değişkeni kapsamının sezgisel olmaması

  • Go sözdizimi, hata değişkeninin (err) kapsamını gereksiz yere genişleterek hata olasılığını artırıyor
    • Örnek kodda err değişkeni tüm fonksiyon boyunca hayatta kalıyor ve yeniden kullanılıyor; bu da kodun okunabilirliğini ve bakımını kötüleştiriyor
    • Deneyimli geliştiriciler, bu kapsam sorunu nedeniyle hata ayıklarken yanlış yönlendirme ve zaman kaybı yaşayabiliyor
    • Değişkenleri uygun biçimde daha yerel sınırlara çekmenin sözdizimsel olarak izin verilen bir yolu yok

nil'in iki farklı biçimi

  • Go'da interface türü ile işaretçi türünde nil'in farklı davranması kafa karıştırıcı bir durum yaratıyor
    • Aşağıdaki örnekte olduğu gibi, s'ye (işaretçi) ve i'ye (interface) nil atansa bile s==i farklı değerlendirilebiliyor; yani tutarsız davranış sergiliyor
    • Bu, null işlemede normalde kaçınılmak istenen bir problem ve tasarımda yeterince düşünülmediğinin izini taşıyor

Kod taşınabilirliğinin sınırları

  • Koşullu derleme için yorum kullanmak, bakım ve taşınabilirlik açısından belirgin biçimde verimsiz
    • Gerçekten taşınabilir yazılım geliştirmiş biriyseniz, bu yaklaşımın ne kadar uğraştırıcı ve hata üretmeye açık olduğunu bilirsiniz
    • Tarihsel olarak birikmiş deneyim (kod taşınabilirliği, pratik örnekler) göz ardı ediliyor
    • Ayrıntılar için Go programs are not portable yazısına bakılabilir

append sahipliğinin belirsizliği

  • append fonksiyonu ile slice sahipliği arasındaki ilişki net olmadığı için kodun davranışını öngörmek zorlaşıyor
    • Örneklerde, foo fonksiyonunda bir slice'a append yapıldığında bunun özgün veri üzerinde gerçekte nasıl bir etkisi olacağını önceden anlamak zor
    • Dilde bilinmesi gereken bu tür 'quirk'lerin çoğalması hatalara yol açıyor

defer deyiminin yetersiz tasarımı

  • RAII (Resource Acquisition Is Initialization) ilkesindeki gibi, kaynak serbest bırakmayı açık biçimde desteklemiyor
    • Java ve Python'daki yapısal kaynak yönetimi sözdizimlerine kıyasla, Go'da hangi kaynağın defer ile serbest bırakılması gerektiği açık değil
    • Örnekte olduğu gibi dosya işlemlerinde, double-close sorununu bile doğrudan ele almak gerekiyor; doğru serbest bırakma sırası ve yöntemi belirsiz kalıyor

Standart kütüphanede istisna işleme

  • Go açık istisna (exception) desteği sunmayan bir yapıya sahip olsa da, panic gibi istisnai durumlar yine de ortaya çıkıyor
    • Bazı durumlarda panic, programı tamamen sonlandırmak yerine sinsice yayılabiliyor
    • Standart kütüphanede (fmt.Print, HTTP sunucusu vb.) istisnaları yok sayan örüntüler bulunduğundan, gerçek istisna güvenliğini garanti etmek mümkün değil
    • Sonuç olarak istisna güvenli kod yazmak zorunlu, fakat istisnaları doğrudan kullanmak mümkün değil

UTF-8 işleme ve string'ler

  • string türüne keyfi ikili veri konsa bile Go özel bir doğrulama yapmadan çalışıyor
    • Geçmişte UTF-8 kodlamasından önce oluşturulmuş dosya adları gibi örneklerde, verilerin sessizce atlanmasıyla karşılaşabilirsiniz
    • Yedekleme gibi senaryolarda önemli veriler kaybolabilir; bu da gerçek çalışma koşullarını yansıtmayan aşırı basit bir yaklaşım

Bellek yönetiminin sınırları

  • RAM kullanımını doğrudan denetlemek zor ve GC'nin (garbage collection) güvenilirliğinin de sınırları var
    • Go'nun bellek kullanımı artarak uzun vadede maliyet ve performans sorunlarına dönüşebiliyor
    • Birden çok instance ve container ortamında maliyet ve ölçeklenebilirlik sorunları pratikte gerçekten yaşanıyor

Sonuç: Daha iyi bir yol vardı

  • Halihazırda etkililiği kanıtlanmış dil tasarımları varken, Go birçok noktada bunlara sırt çevirdi
    • Java'nın ilk taslaklarındaki sorunlardan farklı olarak, Go piyasaya çıktığında daha iyi yaklaşımlar zaten mevcuttu

Kaynaklar

Henüz yorum yok.

Henüz yorum yok.