15 puan yazan tsboard 2024-12-30 | 12 yorum | WhatsApp'ta paylaş

Yaklaşık 7 ay önce TSBOARD projesini ilk kez tanıtmıştım.

O zaman hem frontend hem de backend TypeScript ile yazılmıştı ve backend’i çalıştırmak için Bun runtime’ı kullanılıyordu.

Ancak çeşitli nedenlerle backend’i baştan yeniden yapmak zorunda kaldım ve mevcut TSBOARD projesinden ayrılmış bir GitHub deposuna yükleyip yayımlıyorum. Bu yeni backend Go diliyle yazıldı ve TSBOARD’un resmi sürümünde ikili dosya biçiminde birlikte sunulacak.


Backend’i neden yeniden yaptım?

  • Bun runtime gerçekten etkileyici bir performans gösteriyor. Ancak hepsi bir arada araç seti olarak tanıtılmasına rağmen paket yönetimi hâlâ npm’in seviyesine ulaşmış değil.
  • Bu yüzden TSBOARD’u kullanmak için Node.js ve Bun olmak üzere iki ayrı runtime gerekiyordu. Hem karmaşıktı hem de kullanıcı açısından rahatsız ediciydi.
  • Şimdi düzeltilmiş olsa da, ilk dönemlerde sanal CPU’da çalışmama sorunu yüzünden geliştirici olarak ben bile başka bir sunucuya taşıyamıyordum; bu ciddi bir sorundu.
  • (Başkalarının da belirttiği gibi) orkestrasyon yapılabilir deniyor ama tek iş parçacığı kısıtını doğası gereği taşıyan bir JS runtime’ının sınırlarını aşarak birden fazla thread kullanmak istedim.
  • Daha fazla tipe ihtiyacım vardı. TypeScript tek başına bu açlığı gidermeye yetmedi.

Neden Go dilini seçtim?

  • Yeni backend’in 1) derlenebilir olması, 2) bellek yönetimini kendi başına halletmesi ve 3) ayrıca runtime benzeri bir şey kurmayı gerektirmemesi gerekiyordu.
  • Rust, Kotlin, Python, PHP ve Go arasında düşündükten sonra, bu üç koşulun hepsini karşılayan ama benim için yeni olan Go dilini seçtim. (Üzgünüm PHP)
  • En çok Go’nun sadeliğini beğendim; ayrıca TypeScript ile benzerlikleri de seçimde önemli bir etkendi. Özellikle eşzamanlılık yönetimi ve bellek yönetimi açısından diğer alternatiflere göre iyi bir tercih olduğunu düşünüyorum.

Go dilini kullanmak nasıldı?

  • Sadece avantajlardan oluşan bir dil olmadığını Go da kanıtlıyor, bunu fark ettim. if err != nil { } kesinlikle gerekli ama gerçekten çok yorucu. Bazen try catch finally özlüyorum.
  • Muhtemelen go-mysql-driver kaynaklı bir sorun ama DB I/O gibi darboğazların bulunduğu gerçek geliştirme ortamında o kadar da hızlı çalışmadı. (Burada GeekNews’e gönderdiğim yazıya bakın: https://tr.news.hada.io/topic?id=18048)
  • Örtük arayüz uygulaması hâlâ bana biraz garip geliyor. implements ya da extends gibi anahtar sözcükleri kullanmak istemediler mi?
  • Pointer’lar hoşuma gitti. Özellikle de belleğin ne zaman serbest bırakılacağını düşünmek zorunda olmamak!
  • Çeşitli tipler, basit ama güçlü struct’lar ve slice’lar harika. Anahtar sözcük sayısı az olduğu için hızla öğrenip kullanabilmek en sevdiğim tarafı.
  • go anahtar sözcüğüyle sihir gibi hafif thread’ler kullanabilmek...! Çok mutluyum!

Backend’i JS runtime tabanından Go’ya geçirmenin ardından...?

  • Böyle bir şeyi bir kez yapmak yeter de artar.
  • DB I/O kısmını benchmark ederken çeşitli testler yaptım ama performans açısından bakınca aslında JS runtime ile Go ikilisi arasında büyük bir fark hissetmek zor. Örneğin JS tarafında çok kullanılan sharp görüntü kütüphanesi de sonuçta libvips kullanıyor ve DB I/O’su olmayan web uygulaması da yok denecek kadar az.
  • Buna rağmen, çok zorlanmış olsam da iyi ki bu değişikliği yaptım diye düşünüyorum ve bundan sonra backend’de yalnızca Go kullanmayı planlıyorum.
    • Bellek kullanımı gerçekten anlamlı ölçüde azalıyor. Elbette Rust ile geliştirilse daha fazla optimizasyon yapılabilir ama GC kullanabilmenin karşılığında bu seviye benim için fazlasıyla tatmin edici.
    • Dilin sadeliği gerçekten çılgın seviyede iyi. Ezberlenmesi gereken anahtar sözcük sayısı az, kullanım kalıpları da çoğunlukla belli; bu yüzden öğrenmesi kolay. (Tabii iyi kullanmak ayrı mesele.) Çeşitli primitive type’ların hazır sunulmuş olması da çok hoşuma gitti.
    • En tatmin edici nokta ise, derleme sonrasında yalnızca binary dosya varsa çalışmasının yeterli olması. Backend’i ayağa kaldırmak için ayrıca bir şey kurup sonra kodu onunla tekrar çalıştırmak zorunda kalmak artık istemediğim bir şey.

Nasıl kullanılır?

  • Ne yazık ki Windows ortamı desteklenmiyor. Linux/Mac ortamında binary dosyayı çalıştırmanız gerekiyor.
  • Kullandığınız sunucuda libvips kütüphanesinin önceden kurulmuş olması gerekiyor. Çünkü binary, görüntü işleme için bu kütüphanenin işlevlerini kullanıyor.
  • Ayrıntılı bilgiler README.md dosyasında açıklanmıştır.

Hâlâ çok eksiği var ve diğer geliştiricilerin değerli görüşlerini beklemeyi sürdürüyorum. GeekNight etkinliğinde çekingen davranmış olmam yüzünden kendime kızacak kadar oldum. Hata bildirimi, iyileştirme önerisi ya da farklı görüşlerin hepsi memnuniyetle karşılanır.

Bu yıl Aralık ayı özellikle ağır geçiyor ama yine de yeni yılda daha iyi bir geleceğin olmasını diliyorum. Uzun yazıyı okuduğunuz için teşekkür ederim. Son olarak, TSBOARD v1.0.0 sürüm notları bağlantısını aşağıda paylaşıyorum.

https://tsboard.dev/board/free/47

12 yorum

 
angkr 2025-02-03

Damoang'da gördüm.
Umut vadeden bir CMS. Teşekkürler.

 
tsboard 2025-02-04

Ben de Damoang'da beni hatırlayan birilerinin olmasına şaşırdım. haha Beklentileri karşılayabilmek için daha çok çalışacağım! 😊

 
dongho42 2025-01-03

Faydalı!

 
tsboard 2025-02-04

Geç oldu ama yorumunuz için teşekkür ederim! 😃

 
jongyeol 2025-01-02

Örtük arayüz uygulaması hâlâ biraz garip geliyor. implements ya da extends gibi anahtar kelimeleri kullanmak istememişler miydi?

Artıları ve eksileri var ama artı tarafında, standart/harici kütüphane kodunu değiştirmeden, başka birinin yaptığı bir implementasyonu kullanırken onun bir kısmını benim oluşturduğum bir interface gibi ele alabilmek bazen gerçekten avantajlı hissettiriyor. Tıpkı Java'daki FunctionalInterface gibi ya da duck typing'in derlemeli bir dile uygulanmış hâli gibi. Buna karşılık implements/extends'in mutlaka bildirildiği bir yöntemde, benim oluşturduğum interfacee bağlamak için araya bir Adapter implementasyonu eklemek gerekiyor.

Eksi tarafında ise, interfacee metot eklerken/silerken/değiştirirken, diğer statik tiplemeli dillere kıyasla hatanın gösterildiği yer farklı olduğu için biraz kullanışsız oluyor.

 
tsboard 2025-01-02

Ah, öyleymiş! Hiç aklıma gelmeyen bir avantajı varmış. Neyse ki hata mesajlarını sanırım gopls muydı? VS Code’un Go dil eklentisi iyi yakaladığı için, atladığım ya da yanlış uyguladığım şeyleri hızlıca bulabildim. Biraz daha alışınca ben de bir gün daha iyi kullanabileceğimi düşünüyorum. haha Yorumda açıklama yaptığınız için teşekkür ederim! Mutlu yıllar, yeni yılda bol şanslar~!

 
ifmkl 2025-01-02

Emeğinize sağlık! Ben de test sunucuma kurup deneyeceğim! 2025 yeni yılında da bol başarılar dilerim!

 
tsboard 2025-01-02

Teşekkürler! Test edin; eğer bir şey düzgün çalışmazsa ya da merak ettiğiniz bir nokta olursa lütfen istediğiniz zaman söyleyin! Mutlu yıllar~!

 
channprj 2025-01-01

Destekliyorum~ 👍🏻

 
tsboard 2025-01-02

Desteğiniz için teşekkürler!!! Mutlu yıllar~!

 
zihado 2024-12-31

Destekliyorum!

 
tsboard 2025-01-02

Teşekkürler!!! Mutlu yıllar!!