Tüm yazılar

Spacestocks neden Go ile yazılıyor

Go'yu Python, Node, Java, Rust ve C# ile karşılaştırdık. Kararı ne belirledi ve Go bize neye mal oluyor.

Uluslararası Uzay İstasyonu'ndan görülen, Namibya üzerinde Dünya'nın ufkundan doğan güneş.
Fotoğraf: NASA

Kod yazmaya başlamadan önce bir soru üzerinde epey durduk: bu borsayı doğru yazmayı, doğru olduğunu kanıtlamayı ve anlatmayı en kolay hangi dil sağlar? Genel olarak en iyi dili aramıyorduk. Bir borsanın kaldıramayacağı hataları varsayılan olarak yüksek sesle reddeden dili arıyorduk.

Borsa neyi affetmiyor

  • Kesin olmayan sayılar. Her fiyat, miktar ve bakiye 64 bite sığan bir tam sayıdır. 10.5 gibi bir fiyat sessizce yuvarlanmamalı, reddedilmeli.
  • Yanlış sırada hatalar. Geçerli bir token’ı olmayan ve gövdesi bozuk bir istek 400 değil 401 almalı. Kontrollerin sırası sözleşmenin parçası.
  • Yarışlar. Aynı nakde uzanan iki emir, bir eşleşmeyle yarışan bir iptal.
  • Yavaş toparlanma. Kullanıcılar çalışırken sunucu defalarca öldürülüyor.

Go bize ne veriyor

  • Varsayılan olarak katı sayılar. JSON’u bir int64 içine çözmek, hiçbir ek kod olmadan 10.5, "10" ve 1e2 değerlerini reddeder.
  • Kontrol sırası bizim elimizde. Önce kimlik doğrulama, sonra ayrıştırma, sonra arama, sonra iş kuralları; hepsi düz kodda. Bunu bizim yerimize bir framework belirlemiyor.
  • Tasarıma doğal bir biçim. Her varlık için bir goroutine ve ona kanal üzerinden gelen komutlar, Go’da tek yazıcı kurmanın standart yolu. Ayrıca go test -race her test çalışmasında veri yarışlarını denetler.
  • Hızlı yeniden başlama. Sunucu bir çökmeden sonra milisaniyeler içinde geri gelir.
  • Tek bir dosya. Yanına hiçbir şey kurmak gerekmez, her sunucuda aynı şekilde çalışır.

Diğerleri nerede kaybetti

Python ve FastAPI yazması en hızlı olan; özellik tabanlı test araçları da çok iyi. Ama FastAPI, JSON gövdesini kimlik doğrulamadan önce ayrıştırıyor; bu yüzden token’sız ve bozuk gövdeli bir istek 401 yerine 422 alıyor. Varsayılan sayı işleme de "10" ve true değerlerini tam sayı olarak kabul ediyor. Her biri ayarlarla düzeltilebilir, ama her biri bilmeniz gereken bir tuzak.

Node üzerinde TypeScript her şey için tek bir dil sunardı. Ama JavaScript’te her JSON sayısı 64 bitlik bir ondalık sayı, yani 2^53’ten büyük tam sayılar tek kelime etmeden yuvarlanıyor. İlk kuralı “asla para yaratma ya da kaybetme” olan bir sistemde bu, her yerde yönetmek istemediğimiz bir risk.

Java ve Spring Boot sektörde backend için varsayılan seçim ve bu önemli. Ama JSON kütüphanesi varsayılan olarak 10.5 değerini 10 olarak kabul ediyor, MCP kütüphanesi güncel protokolü yalnızca bir ön sürümde destekliyor ve framework işin çoğunu görünmeden yapıyor. Kodumuzun her satırının kolayca anlatılabilmesini istiyoruz; gizli davranış bunu zorlaştırır.

Rust veri yarışlarını derleme anında engellerdi, ama iyi öğrenmek, borsanın kendisine ayırmayı tercih ettiğimiz haftalar ister.

C# en yakın geleniydi. Katı, hızlı ve araçları iyi. Ekibimizin en az bildiği dil de o; kararı bu belirledi.

Go bize neye mal oluyor

Go da tuzaksız değil. Tam sayı taşması sessizce başa sarıyor, bu yüzden her fiyat × miktar çarpımını bir testle birlikte kendimiz kontrol ediyoruz. Boş bir liste, açıkça oluşturmazsak null olarak yazılıyor. Toplam türleri (sum types) yok, bu yüzden emir yönleri ve durumları üzerindeki her switch’in her durumu ele aldığını bir linter denetliyor. Hata yönetimi de uzun.

Bu bedelleri bilerek seçtik. Her biri kodda görünüyor ve her birini kontrol altında tutan bir test ya da linter kuralı var.

Görünüm

Tema
Yazı boyutu
Satır aralığı
Okuma
Görme
Hareket ve gezinme
Sayfa yapısı

Başlıklar

    Bölgeler

      Yalnızca bu tarayıcıda saklanır.