技術雜談:如何挑選網頁框架 (web framework)?

PUBLISHED ON FEB 11, 2018
FacebookTwitter LinkedIn LINE Skype EverNote GMail Yahoo Email

    有許多想做網頁的程式設計者都會想問:如何挑選 web framework (網頁應用框架)?這個問題其實不會有唯一的解答,因為網頁的技術不斷地推陳出新。如果我們把 CGI (Common Gateway Interface) 程式當成網頁程式的濫觴,那麼網頁程式至少有 25 年的歷史了;雖然這是一個老議題,但是每隔一陣子,我們又會有一些新的方法可以用來撰寫網頁程式,好像永遠都有學不完的新技術。

    我們對 web framework 最大的誤解就是「我們一定要用 web framework 才能寫網頁程式」。在 Rails 和 Django 出現後,我們仍然可以用 vanilla PHP (即用純 PHP,不用任何框架) 來撰寫網頁;在 React 和 Vue.js 出現後,jQuery 仍然是有效的 JavaScript 函式庫。實際上,筆者蠻鼓勵第一次寫網頁的程式設計者先用 PHP 或 jQuery 這類基本的工具,或者是 Sinatra 或 Flask 之類的微框架,試著寫些小東西;之後再用 web framework 寫程式時,比較會知道為什麼在某個時候要這樣寫 code。

    不過,使用 web framework 仍然是有好處的。因為 framework 預先挑選一些撰寫網頁程式會用到的套件,並且會給予專案初始的架構,讓程式設計者不用重造輪子,可以專心在撰寫核心功能上。理論上,一個專案約 20% 的內容是從頭撰寫,而 80% 是使用已有的套件;實際上的比例會有所變化,不過,大概可以從此得知使用 framework 的好處。

    說實在的,web framework 百百種,要怎麼挑選呢?以下是一些可以考慮的因素:

    • 開發時間
    • 執行效率
    • 框架提供的特性
    • 開發者過去的經驗和喜好

    去除掉口水戰 (flame war) 等情感因素,其實 web framework 就像是其他的 framework,就是一些預先寫好的程式碼,待我們去填入所需的功能。沒有那個框架是屌打全世界,也甚少框架完全無用;基本上,就是綜合考慮上述因素後,選出最適合自己的 web framework。在下文中,我們會逐一討論各項因素,讓讀者可以進一步思考。

    理論上,在同樣的演算法下,C 語言是最快的,大部分的程式也可以用 C 來撰寫。但是,我們卻用 C (或 C++) 發明其他更高階但更慢的語言,只有在要寫延伸套件時才回頭用 C (或 C++) 寫程式。對於等效的工作,使用較高階的語言來撰寫,就可以使用較短的行數來完成;理論上,同樣的時間,用較高階的語言,就可以完成更多的工作。對於 start-up (新創企業) 來說,能夠在較短的時間內,推出第一個可用的產品,不論對於募資或上市,都是相當重要的;雖然 Ruby 執行速度較慢,但先前 Rails 在國外很紅,基本上就是這樣的思維。

    然而,在網站上線後,執行效率的好壞,就會造成成本的高低。同樣的使用者數量,如果使用更有效率的語言和框架,就可以用更少的運算資源來滿足。臉書為了在儘量不更動程式碼的前提下增加效率,自製 HACK/HHVM 這套新的程式語言和虛擬機器。推特將其服務由 Ruby 轉為 Java,也是為了取得更佳的執行效率。開發時間和執行效率就像是翹翹板般,很難兼顧,但開發者們仍然試著找出更好的方案,於是有 Node 和 Go 等新的網頁後端語言出現。

    對於 web framework 來說,其特性就是可用的功能,包括模板語言、資料庫連接、權限管理、session 管理等,該框架所能提供的特性,也是相當的重要。我們要先知道該框架的特性是否能滿足自己的需求,若無法滿足,至少要有好的第三方方案或是自己能夠處理。由於現在 web framework 的選擇相當多,如果發現某個框架缺東缺西,有著重造輪子的感覺,那還不如換另一個更好的框架。對於終端使用者來說,其實無法得知網站內部使用什麼 web framework 撰寫,通常也不會在意;因此,不需要對 web framework 有太深的情結,選擇適合專案的工具比較重要。

    如果在前述的各項條件都滿足時,程式設計者還是可以選自己喜歡的工具。Rust 在各項檢測 (benchmark) 中,顯著地比 Go 來得快,但 Go 目前很明顯比 Rust 受歡迎,不僅是 Go 在網頁程式相關的函式庫比較完整,Go 本身也比 Rust 來得易學易用。筆者先後接觸這兩種語言,並分別寫成入門教程 (Go 可看這裡,Rust 可看這裡),的確也有相似的感受。

    要使用那個 web framework,通常是技術長要去煩惱的;如果要維護現有的專案,其實也不會在沒有強烈好處下任意砍掉重練。不過,如果沒有包袱的話,倒是可以幫自己選一下 web framework。如果想要沿用自己現有的語言,通常就是從該語言中選框架即可;像是 PHP 大概會選 Laravel 或 Symfony,Ruby 通常還是會選 Rails,Java 目前可選 Spring Boot 等。如果願意學新語言的話,Go 倒是可以考慮;有些程式設計者會選用某個 Go web framework,但 Go 其實可不依賴框架的情形下做網頁程式。再過幾年,可能這些答案又會改變,但本來就沒有絕對性的答案。