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ı
- 21 yazı
- proje
- 5 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
RAG'e karar verdiniz. Asıl iş şimdi başlıyor
RAG mı fine-tuning mi sorusu her yerde cevaplanıyor. Kararın ardından kalan üç soru — anahtar, model seçimi ve bütçe — hiçbir yerde.
18.750 istek/sn: kesin, tekrarlanmış ve üç kat yanlış
Aynı koşunun iki fazı aynı servisi üç kat farklı ölçtü. Yanlış olanı yakalayan şey daha iyi bir istatistik değil, aynı şeyi ölçen ikinci bir yöntemdi.
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ı.
Bu alandaki ölçümler
64 goroutine, dört çekirdekte Mutex ile kanal aynı hızda, ama Mutex'in p99'u beş kat yüksek
Aynı paylaşılan sayaca G goroutine ve P çekirdekle saldırıldığında sync.Mutex, sahip-goroutine kanalı ve tamponlu kanal saniyede kaç işlem yapıyor, beklemenin kuyruk gecikmesi ve adilliği nasıl değişiyor?
Bulgu
64 goroutine ve dört çekirdekte sync.Mutex ile tek yönlü kanal aynı hızda (7,69 ve 7,94 milyon işlem/sn) ama Mutex'in p99 beklemesi 5 kat yüksek. Sekiz çekirdekte Mutex 2,4 ve 4,0 kat hızlı (15,96 milyon işlem/sn; kanallar 6,65 ve 3,97 milyon); oranlar bayraksız hücrelerden.
5 gün önce ölçüldü
Bir çekirdek Go'da 14.330, PHP-FPM'de 5.152 OAuth2 isteği taşıyor
Her istekte RS256 bearer token doğrulayıp PostgreSQL'e bir satır yazan ya da okuyan aynı API, bir, iki ve dört çekirdekte Go, PHP-FPM ve FrankenPHP worker ile saniyede kaç karma istek taşıyor?
Bulgu
Dört çekirdekte Go 57.321, FrankenPHP 25.659, PHP-FPM 20.606 karma istek taşıdı; çekirdek başına 14.330, 6.415 ve 5.152. Kapasite planına giren sayı bu değil, istek başına uygulama CPU'su: Go 66,8, FrankenPHP 110,7, PHP-FPM 187,7 mikrosaniye. FrankenPHP doyduğunda dört çekirdeğin ancak 2,84'ünü kullanabiliyor — Go 3,83, PHP-FPM 3,87. Darboğaz veritabanı değil: aynı dört çekirdekte PostgreSQL tek başına saniyede 68.212 satır yazıyor, yani en hızlı adayın karma tavanının üstünde.
17 gün önce ölçüldü
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
Seviye: Ana OdakCommitBrief, 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 11 soru yanıtlandı.
Kanal tampon boyutu seçimi backpressure sorunlarını gizler mi, nasıl karar vermeliyim?
Kanal kapasitesini worker sayısına yakın tutun, bloklamanın Kafka poll döngüsüne yansımasına izin verin, lag artınca buffer'ı değil worker'ı büyütün.
Container'daki Go worker'ım SIGTERM almıyor ve graceful kapanmıyor, bu bir PID 1 sorunu mu?
`CMD`'yi exec form'a çevirin ve `os.Interrupt` yerine `signal.NotifyContext(..., syscall.SIGTERM)` kullanın; tini yalnız fork varsa gerekir.
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.
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 21 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 5 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.