14 poin oleh GN⁺ 2025-02-26 | 6 komentar | Bagikan ke WhatsApp
  • Saat meluncurkan Dagger Cloud v3, UI baru ditulis dengan WebAssembly (WASM) dan Go
  • Go umumnya tidak digunakan untuk pengembangan web UI, tetapi pendekatan ini dipilih demi "penyatuan codebase dan optimasi performa"
  • Artikel ini membagikan "latar belakang keputusan, tantangan selama implementasi, dan hasil akhirnya"

Masalah sebelumnya: inefisiensi akibat dua codebase

  • Dagger berjalan berbasis DAG (Directed Acyclic Graph), dan memvisualisasikannya melalui TUI (terminal UI) dan dashboard web (Dagger Cloud)
  • Sebelumnya, TUI dibuat dengan Go, sedangkan web UI dibuat dengan React/TypeScript
  • Namun sinkronisasi antara kedua UI sulit dilakukan, dan khususnya web UI mengalami masalah performa saat memproses data besar secara real-time
  • Saat menangani event stream OpenTelemetry yang kompleks (ratusan ribu span), penurunan performa dan masalah kecepatan pada React UI menjadi sangat terlihat
  • Fitur yang sama harus diimplementasikan dua kali, yang menjadi beban pengembangan besar bagi tim kecil
  • Karena itu, mereka mempertimbangkan pendekatan baru dengan tujuan menyatukan codebase dan mengoptimalkan performa

Solusi yang dipilih: Go + WebAssembly

  • Menyatukan codebase dengan Go
    • Karena TUI sudah dibuat dengan Go, web UI juga bisa dibuat dengan Go agar kode dapat digunakan ulang
    • Banyak pengembang Go di dalam tim, sehingga produktivitas tim meningkat dan maintenance menjadi lebih mudah
  • Memanfaatkan WebAssembly (WASM)
    • WebAssembly diadopsi agar kode Go bisa dijalankan langsung di browser
    • Namun, ekosistem Go + WASM masih belum matang sehingga ada beberapa tantangan:
      • Kekurangan library komponen → UI harus diimplementasikan sendiri
      • Batas memori WASM di browser (2GB) → perlu optimasi saat menangani data besar
      • Namun, optimasi memori ini juga bisa memberi manfaat untuk TUI maupun web UI

Strategi meminimalkan risiko proyek

  • Menggunakan framework Go-app
    • Memilih framework berbasis Go untuk pengembangan PWA (Progressive Web App)
    • Menyediakan model berbasis komponen yang mirip React sehingga transisinya lebih mudah
  • Membuat dan memverifikasi prototipe
    • Mengimplementasikan ulang UI yang ada semaksimal mungkin dengan Go-app untuk mengidentifikasi isu utama
    • WASM sendiri sudah merupakan standar terbuka yang terdokumentasi, dan sebagian besar pertanyaan utama dapat dijawab melalui dokumentasi Go-app
    • Masalah terbesar adalah batas penggunaan memori, sehingga dibutuhkan desain dan optimasi untuk mengatasinya

Proses transisi dari prototipe ke production

Strategi optimasi performa

  • Optimasi rendering log skala besar
    • Perlu peningkatan performa rendering saat memproses data log lebih dari 200 ribu baris
    • Untuk itu, mereka mengoptimalkan library rendering virtual terminal (midterm),
      → meningkatkan performa TUI maupun web UI
  • Meningkatkan kecepatan parsing JSON
    • Go WASM lambat dalam parsing JSON → mereka merancang backend pintar berbasis WebSocket
    • Transfer data dioptimalkan menggunakan encoding/gob milik Go
  • Optimasi ukuran file WASM
    • Ukuran awal file WASM: 32MB
    • Setelah menerapkan kompresi Brotli → turun menjadi 4.6MB
    • Karena sulit menangani kompresi di CDN, kompresi diterapkan langsung dalam proses build

Peningkatan lainnya

  • Di luar masalah memori yang sudah diperkirakan, sebagian besar kekhawatiran ternyata tidak terbukti
  • Menulis komponen UI tidak terlalu sulit, dan integrasi dengan layanan lain (Tailwind, Auth0, dll.) juga tidak bermasalah
  • Paket NPM dapat digunakan di WebAssembly → interoperabilitas dengan JavaScript tetap terjaga
  • Cara Go-app memperbarui komponen lebih fleksibel dibanding React, sehingga memberi keleluasaan optimasi yang lebih besar
  • Analisis performa bisa dilakukan dengan tool profiling Go (pprof) dan profiler bawaan browser
  • Berkat dukungan PWA, aplikasi dapat dijalankan sebagai aplikasi desktop/mobile, sehingga bisa digunakan tanpa harus membuka browser

Manfaat yang diperoleh setelah transisi

  • Konsistensi UI meningkat
    • Karena TUI dan web UI memakai codebase yang sama, UX yang dihasilkan menjadi lebih konsisten
  • Performa dan penggunaan memori membaik
    • Saat menangani data besar, kecepatan rendering meningkat dan penggunaan memori menurun
  • Produktivitas tim meningkat
    • Sebelumnya, web UI dan TUI harus dioptimalkan secara terpisah,
      sekarang satu kali optimasi bisa diterapkan ke kedua antarmuka sekaligus
    • Hasilnya, mereka bisa lebih fokus mengembangkan fitur baru

Apakah perlu beralih ke Go + WASM?

  • Secara umum tidak direkomendasikan, tetapi bisa berguna dalam kondisi tertentu:
    • Tim dengan banyak pengembang Go
    • UI kompleks di mana TypeScript/React menunjukkan batas performa
    • Ada kebutuhan berbagi kode antara TUI dan web UI
    • Lingkungan yang menuntut kecepatan pengembangan semaksimal mungkin
  • Jika sesuai dengan kondisi di atas, Go + WASM bisa menjadi alternatif yang baik
    Namun, dalam kebanyakan kasus, teknologi web yang ada (React, TypeScript, dll.) tetap lebih cocok

6 komentar

 
minho2da 2025-02-27

Apakah ini seperti GWT yang dulu?

 
bbulbum 2025-02-26

Hmm... saya penasaran apakah pengembangannya akan jadi lebih type-safe dibanding TS.

 
colus001 2025-02-26

Bagaimanapun dilihat, ini terasa seperti menyelesaikan masalah yang mudah dengan cara yang lebih rumit...

 
riki3 2025-02-26

Frontend berbasis Go ternyata lebih efektif daripada yang saya kira. Ternyata ada alasan mengapa use case-nya terus bertambah.

 
halfenif 2025-02-26

Tetap saja, saya ingin mencobanya.

 
GN⁺ 2025-02-26
Komentar Hacker News
  • Ada pendapat bahwa sebagai tim kecil, mereka perlu merilis dengan cepat

    • Namun, disebutkan bahwa mereka menghabiskan hampir sebulan membuat prototipe, harus menulis sendiri komponen UI Go-app, dan arsitekturnya berubah besar karena Go WASM lambat dalam mem-parsing JSON
    • Ada pendapat bahwa ini terdengar seperti pemrograman yang berpusat pada resume
  • Mereka memiliki tim engineer Go yang kuat dan UI kompleks yang sulit diskalakan dengan TypeScript/React

    • Dari demonya, muncul kesan bahwa tim ini kurang berpengalaman dengan frontend web
    • Halaman pendaftaran tidak pas dengan layar, dan saat mengklik di dalam dashboard, spinner layar penuh muncul lalu halaman dimuat ulang
    • Saat ikon sedang dimuat, alt-text ditampilkan
    • Ada pendapat bahwa untungnya bukan React yang gagal diskalakan
  • Ada kekhawatiran apakah ini framework yang "merender ke canvas", tetapi ternyata tidak

    • Positifnya, interoperabilitas antara WASM dan DOM sudah cukup cepat
    • Namun, binary 32MB adalah kelemahan besar
  • Mereka memutuskan membangun frontend menggunakan <a href="https://go-app.dev/" rel="nofollow">https://go-app.dev/</a>;

    • Go-app adalah paket untuk membangun PWA menggunakan Golang dan WebAssembly
  • Ada pendapat bahwa Go tidak cocok untuk jenis pekerjaan seperti ini

    • Disebutkan bahwa hasil yang lebih baik didapat dengan menggunakan Rust
    • Binary wasm yang dibuat dengan Rust rata-rata berukuran 240kb dan terkompresi dengan baik saat ditransfer
  • Akan menarik melihat laporan lanjutan beberapa bulan ke depan tentang apakah perpindahan dari stack yang lebih berat ke stack yang lebih performant namun agak tidak biasa ini membawa hasil positif

    • Merekrut developer frontend untuk proyek seperti ini kemungkinan tidak akan semudah mencari developer React
  • Pencipta go-app menemukan postingan ini dan merasa terkejut, sambil mendoakan kesuksesan produknya

  • Karena Go WASM lambat dalam mem-parsing JSON, mereka mengubah arsitektur dan membuat "backend pintar" untuk pemuatan data bertahap melalui WebSockets

    • Ada kekhawatiran soal masalah keamanan pada data gob
  • Ada pendapat bahwa WASM cocok untuk use case ceruk tertentu, tetapi kurang tepat untuk membangun web app umum

    • Aplikasi yang dibuat dengan go-app memuat kode WASM sebesar 3.6MB
    • Blazor juga serupa, bahkan aplikasi sederhana pun memerlukan setidaknya lebih dari 1MB pada muatan awal
  • Ada yang menganggap penggunaan bahasa yang sama untuk semua komponen (frontend/backend/app) memiliki nilai yang besar

    • Sebaliknya, ada juga yang memakai pendekatan "Typescript everywhere", dengan React di frontend, NodeJS di backend, dan Capacitor untuk app