Architecture Decision Record

Active theme: Light

← 決策記錄例子

程式語言

內容:

摘要

問題

我哋需要為軟件揀選程式語言。我哋有兩大需求:一種適合網頁應用程式嘅前端程式語言,同一種適合伺服器應用程式嘅後端程式語言。

決策

前端我哋揀選 TypeScript。

後端我哋揀選 Rust。

狀態

已決定。如果有新嘅替代方案出現,我哋持開放態度。

詳情

假設

前端應用程式屬於典型類型:

  • 典型用戶同互動

  • 典型瀏覽器同系統

  • 典型開發同部署

前端應用程式很可能快速演進:

  • 我哋想確保開發、部署、迭代等快速簡單。

  • 我哋重視可證明性(例如類型安全),而且我哋願意多做少少工作去達成。

  • 我哋唔需要舊版兼容。

後端應用程式嘅要求高過典型:

  • 對質素(尤其係可證明性、可靠性、保安等)有高過典型嘅目標。

  • 對近乎即時有高過典型嘅目標,即係我哋唔想因為虛擬機垃圾回收而出現停頓。

  • 對函數式編程有高過典型嘅目標,尤其係並行化、多核心處理同記憶體安全。

我哋接受較慢嘅編譯速度,以換取編譯時安全同運行時速度。

限制

我哋對可配合主要雲端供應商函數服務(例如 Amazon Lambda)使用嘅語言有強烈限制。

立場

我哋考慮過以下語言:

  • C

  • C++

  • Clojure

  • Elixir

  • Erlang

  • Elm

  • Flow

  • Go

  • Haskell

  • Java

  • JavaScript

  • Kotlin

  • Python

  • Ruby

  • Rust

  • TypeScript

論據

各語言摘要:

  • C:因為安全性低而被否決;Rust 幾乎所有方面都做得更好。

  • C++:因為一團糟而被否決;Rust 幾乎所有方面都做得更好。

  • Clojure:出色嘅建模;最接近嘅 Lisp;喺 JVM 上有極佳嘅運行時。

  • Elixir:出色嘅運行時,包括可部署性同並行;出色嘅開發者體驗;生態系統相對較細。

  • Erlang:出色嘅運行時,包括可部署性同並行;具挑戰性嘅開發者體驗;生態系統相對較細。

  • Elm:看來非常有前途;IBM 正發表取得良好成果嘅重要案例研究;生態系統較細。

  • Flow:比 JavaScript 有趣嘅改進;不過,開發人員正逐漸離棄佢。

  • Go:出色嘅開發者體驗;出色嘅並行;但有一連串削弱語言嘅壞決策記錄。

  • Haskell:最好嘅函數式語言;開發者社群較細;未有足夠已發表嘅生產成功案例。

  • Java:出色嘅運行時;出色嘅生態系統;開發者體驗欠佳。

  • JavaScript:史上最受歡迎嘅語言;最廣泛嘅生態系統。

  • Kotlin:修正咗 Java 好多問題;JetBrains 強力支持;有由 Java 移植到 Kotlin 嘅良好已發表案例。

  • Python:系統管理最受歡迎嘅語言;出色嘅分析工具;良好嘅網頁框架;但被 Google 放棄,轉用 Go。

  • Ruby:史上最佳開發者體驗;最佳網頁框架;最友善嘅社群;但非常慢;有啲難打包。

  • Rust:最佳新語言;強調零抽象;強調並行;不過生態系統相對較細;而且對某些編譯器加速設有刻意限制,例如直接存取記憶體需要明確標示為 unsafe。

  • TypeScript:為 JavaScript 加入類型;出色嘅轉譯器;開發人員越來越著重由 JavaScript 移植到 TypeScript;Microsoft 強力支持。

我哋決定,虛擬機有一組我哋目前唔需要嘅取捨,例如提供運行時能力而帶來嘅額外複雜度。

我哋相信,我哋嘅核心決策受兩個橫切關注點驅動:

  • 如果要最快運行時速度同最緊密嘅系統存取,我哋會揀 JavaScript 同 C。

  • 如果要接近最快運行時速度同接近最緊密嘅系統存取,我哋揀 TypeScript 同 Rust。

如果我哋想要虛擬機語言,以下虛擬機語言同網頁框架值得一提:

  • Clojure 同 Luminus

  • Java 同 Spring

  • Elixir 同 Phoenix

影響

前端開發人員需要學習 TypeScript。如果開發人員主要經驗係用 JavaScript,學習曲線很可能容易。

後端開發人員需要學習 Rust。如果開發人員主要經驗係用 C/C++,學習曲線很可能適中;如果主要經驗係用 Java、Python、Ruby 或者類似嘅記憶體管理語言,學習曲線就很可能困難。

TypeScript 同 Rust 都相對較新。意味住好多工具未有呢啲語言嘅文件。例如,devops 管線需要為呢啲語言設置,而到目前為止,我哋評估緊嘅 devops 工具都冇呢啲語言嘅預設例子。

TypeScript 同 Rust 嘅編譯時間相當慢。部分可能係由於語言較新。我哋可能想研究點樣紓緩緩慢嘅編譯時間,例如按需編譯、編譯並行等。

對呢啲語言嘅 IDE 支援仲未普及,亦未達一流水平。例如,JetBrains 出售 PyCharm IDE 為 Python 提供一流支援,但就冇出售為 Rust 提供一流支援嘅 IDE;反而,JetBrains 可以用 Rust 外掛,相對 Python 語言支援,提供大約 80% 嘅 Rust 語言支援。

相關

相關決策

我哋會朝住同呢啲語言配合嘅生態系統選擇進發。

例如,我哋想揀選對呢啲語言有良好能力嘅 IDE。

例如,對於前端網頁框架,我哋更可能決定採用傾向 TypeScript 嘅框架(例如 Vue),而唔係傾向純 JavaScript 嘅框架(例如 React)。

相關需求

我哋整條工具鏈都必須支援呢啲語言。

相關工件

我哋預期可能會將一些機密匯出到環境變數。

相關原則

量兩次,建一次。我哋將一定程度嘅安全優先於一定程度嘅速度。

運行時比編譯時更有價值。我哋將客戶使用優先於開發人員使用。

備註

呢度寫任何備註。