Uzmanlık
Go geliştiricisi — performans ve dayanıklılığın dili
Go, başka bir dilin alternatifi değil — bir problem sınıfının cevabı. Cross-platform derlenen, performanslı, hafif ve kararlı bir araç ya da servis geliştirmem gerektiğinde ilk başvuru noktam.
- Başlangıç
- 2018 Başlangıç
- yıl
- 8 yıl
- yazı
- 19 yazı
- proje
- 4 proje
Go ekosisteminde ben
Go benim için başka bir dilin alternatifi değil, belirli bir problem sınıfının cevabı. Karşı tarafta kurulum istemeyen, uzun süre ayakta kalan ve kaynağı ucuz kullanan bir servis ya da araç gerektiğinde ilk başvuru noktam burası.
Dili probleme göre seçiyorum, sevdiğim için değil. Sistem tasarımının kendisini maliyetleriyle birlikte sade.dev tarafında yazıyorum.
Go ile ne geliştiriyorum
Ortak noktaları tek işi olan, uzun süre ayakta kalan ve kaynağı ucuz kullanan süreçler olmaları.
-
Mikroservisler
Tek sorumluluğu olan, kendi başına ölçeklenen ve ayrı dağıtılan servisler.
-
Consumer ve worker'lar
Kuyruktaki işi günlerce kesintisiz tüketen, arka planda çalışan süreçler.
-
HTTP API'lar
Web ve mobili aynı anda besleyen servisler; önce standart kütüphane, gerektiğinde Gin ya da Fiber.
-
Komut satırı araçları
Tek dosya olarak dağıtılan, karşı tarafta kurulum gerektirmeyen programlar.
Neden Go
- 01 Tek dosya
- go build tek bir çalıştırılabilir üretiyor. Karşı tarafta ayrıca kurulması gereken bir yorumlayıcı ya da bağımlılık dizini kalmıyor — ne sunucuda, ne konteyner imajında, ne de bir başkasının makinesinde.
- 02 Cross-platform
- Aynı kaynak Linux, macOS ve Windows için tek komutla derleniyor. Hedef değiştiğinde kod değişmiyor.
- 03 Eşzamanlılık dilin içinde
- goroutine ve channel modeli, paralel çalışan bir consumer'ı üçüncü parti bir kütüphaneye devretmeden yazmayı mümkün kılıyor.
- 04 Öngörülebilirlik
- Sade sözdizimi ve açık hata yönetimi, kodu altı ay sonra okuyan kişinin işini kolaylaştırıyor — ki bu kişi çoğu zaman işi devralan ekip oluyor.
Standart kütüphaneyle çözülen işe paket almıyorum
Go tarafındaki işlerin ömrü çoğu zaman yazıldıkları günden uzun oluyor ve bunu mümkün kılan şey yalnızca dil değil, kısa tutulan bağımlılık listesi. Her bağımlılık, ileride başkasının bakmak zorunda kalacağı bir yüzey demek; davranışı gizleyen bir yapı da aynı sınıfta bir borç.
Teslim işin diğer yarısı
Bir servisi ya da aracı yazmak yarısı; ikinci yarısı olmadan yazılan şey yalnız benim makinemde çalışır. Go tarafındaki işlerde bu ikinci yarıyı da kuruyorum.
-
Çapraz derleme
Aynı kaynaktan üç hedef için çıktı — Linux, macOS, Windows.
-
Sürüm gömme
Sürüm bilgisi derleme anında ldflags ile ikilinin içine giriyor.
-
İmzalı çıktı
Dağıtılan ikili imzalanıyor; karşı taraf ne indirdiğini doğrulayabiliyor.
-
Kurulum yolu
Kurulum bir dosya indirme adımı değil, paket yöneticisine düşen tek komut.
Aracın karşı tarafı
Aracı kullanan kişi çoğu zaman onu yazan kişi değil; yüzeyi ona göre kuruyorum.
-
Okunabilir komut ağacı
Komutun ne yaptığı, yardım metnine bakmadan adından anlaşılmalı.
-
Tahmin edilebilir bayraklar
Aynı bayrak her komutta aynı anlama geliyor; sürpriz davranış bir hata sınıfıdır.
-
Ne yapılacağını söyleyen hata
Hata mesajı neyin yanlış olduğunu değil, kullanıcının bundan sonra ne yapması gerektiğini söylüyor. Aynı ölçü servis tarafında da geçerli.
Her işin dili Go değil
Ağır iş kuralları, olgun bir yönetim paneli ya da geniş bir paket ekosistemi isteyen bir ürün için PHP ve Laravel hâlâ daha hızlı yol aldırıyor. Dili probleme göre seçiyorum, sevdiğim için değil — polyglot çalışmanın asıl maliyeti yeni dil öğrenmek değil, bağlam değiştirmek.
Bu alandaki son yazılar
Go ile yazdığım bir komut satırı aracını paketlemek ve dağıtmak
Bir Go CLI aracını yazmak işin yarısı; onu sürümlemek, çapraz derlemek ve başkalarının kolayca kurabileceği biçimde dağıtmak diğer yarısı.
archlint: mimari sınırları CI'da deterministik olarak zorlamak
Mimari kararlar wiki'de doğru kalır, kodda çürür. archlint'i yazdım: architecture.json'daki katman+kural sınırlarını her commit'te go/parser ile, modelsiz, CI'da zorlayan bağımsız bir Go CLI. Niye böyle kurduğumu anlatıyorum.
Tek mimari kuralı, üç dil: archlint artık Go + TypeScript + Python
Polyglot bir repoda 'domain altyapıyı import etmesin' kuralı her dilde aynı; değişen, import'un nasıl çözüldüğü. archlint'e TypeScript ve Python ekledim — tek architecture.json üç dilin sınırlarını CI'da zorluyor.
Bu alanda geliştirdiklerim
Diff'i makineden çıkarmadan bir modele denetleten, sağlayıcıdan bağımsız Go CLI; CommitBrief ürününe dönüştü.
Şu an ne yapıyor
Diff hiç makineden çıkmadan yerel kod incelemesi yapıyor; `Provider` arayüzü sayesinde Anthropic, OpenAI, Gemini ve Ollama aynı sözleşmeyle takılıyor. İmzalı binary'ler yayında — diff'ini bir bulut sağlayıcısına vermek istemeyen herkes kurabilir.
Bu alanda üretime çıkan işler
CommitBrief
Devam ediyorFounder & Developer
CommitBrief, git diff'leri üzerinde LLM destekli yerel kod incelemesi yapan, sağlayıcıdan bağımsız bir Go CLI aracıdır. Staged/unstaged değişikliklerden tek bir commit'e ya da PR tarzı üç noktalı aralıklara kadar her kapsamı; terminalden çıkmadan, diff'i dışarı sızdırmadan ve özelleştirilebilir proje kurallarıyla denetler.
Bu alanda sorulanlar
Bu eksende 9 soru yanıtlandı.
Birbirine bağımlı birden fazla işi, ilk hata hepsini iptal edecek şekilde errgroup ile mi yürütmeliyim?
`errgroup.WithContext`'e geçip üstüne request-level bir timeout koyun ve ctx'i her HTTP/DB çağrısına geçirin; ihmal edilen ctx, iptali sessizce öldürür.
İç içe geçmiş servis çağrılarında context iptalini doğru şekilde nasıl yayarım?
İptalin yayılması için `r.Context()`'i her downstream çağrıya geçirin, zincirde `context.Background()` bırakmayın, side-effect'e `WithoutCancel` verin.
Goroutine sızıntılarını uzun süre çalışan bir Go servisinde nasıl tespit edip önlerim?
NumGoroutine()'i dışa açıp zirvede pprof goroutine dökümü alın, binlerce kopyalı park etmiş stack'in spawn noktasını ctx.Done()'a uydurun, goleak ekleyin.
Birlikte kullandığım teknolojiler
-
Cobra
Komut ağacı ve flag yüzeyi.
-
go-git
Commit tabanlı işlemler; çalışma ağacı gerektiğinde git binary'sine düşüyorum.
-
Goreleaser
Çapraz derleme, imzalı binary ve Homebrew/Scoop dağıtımı.
-
Gin
HTTP servisi standart kütüphaneyi aşınca ilk baktığım router.
-
Fiber
Aynı işin Express alışkanlığından gelenlere tanıdık gelen alternatifi.
Sık sorulanlar
7 soru
-
Go'yu kaç yıldır kullanıyorsun?
2018'den bu yana, 8 yıldır. Bu sürenin tamamı PHP'nin yanında geçti: Go bende bir dilin yerini almadı, belirli bir problem sınıfının cevabı olarak duruyor.
-
Go'yu neden öğrendin?
Polyglot olmak bir hedef değildi; belirli bir problem sınıfı için doğru cevabın elimde olmamasıydı. Go statically typed, derleniyor, standart kütüphanesi geniş ve sözdizimi kasıtlı olarak sade. PHP'yi onunla değiştirmeyi hiç düşünmedim — derinliğim orada kaldı, Go genişliği temsil etti.
-
Go ile ne geliştiriyorsun?
Mikroservisler, kuyruktan iş tüketen consumer ve worker'lar, HTTP API'lar ve komut satırı araçları. Ortak noktaları tek işi olan, uzun süre ayakta kalan ve kaynağı ucuz kullanan süreçler olmaları. Bu sitede Go etiketli 19 yazı var.
-
Web servisi de yazıyor musun, yoksa yalnız CLI mı?
İkisini de. HTTP tarafında önce standart kütüphaneyle başlıyorum; `net/http` bir API'yi üretime çıkarmaya çoğu zaman yetiyor. Middleware zinciri, rota gruplama ya da hazır bağlama gerektiğinde Gin veya Fiber giriyor.
-
Teslim tarafında ne yapıyorsun?
İşin yarısı orada. Çapraz derleme, sürüm bilgisinin ldflags ile ikiliye gömülmesi, imzalanmış çıktı ve kurulum yolu — bunlar olmadan yazılan şey yalnız benim makinemde çalışır.
-
Go ile PHP arasında nasıl geçiş yapıyorsun?
Bedeli var ve onu yazdım: polyglot bir kod tabanını sürdürmenin asıl maliyeti dil öğrenmek değil, bağlam değiştirmek. İki dilin aynı anda açık olduğu günlerde hata oranım yükseliyor.
-
Kaç projede Go kullandın?
Bu sitede kayıtlı projelerin 4 tanesinde Go var: kimisinde baştan sona, kimisinde servis ya da SDK tarafında.
Birlikte çalışalım
Bu ekosistemde bir işiniz varsa, ne yaptığınızı anlatın; nasıl kurulacağını konuşalım.