按照慣例,鐵人賽的最後一天寫這三十天的回顧與心得,應該是不會有太多痛苦與困難。今年是第二年參加鐵人賽,每年都覺得收穫最多的其實是自己。在每天截稿壓力的逼迫之下搜集資料、寫範例程式,等於逼迫自己每天都要超出自己原本慣習的領域之外一點點,三十天下來,不知不覺也走了一小段路。
主題所涵蓋的框架中,事實上是可以包含兩個維度的比較:精簡版框架(Sinatra)與完整MVC框架(Rails、Django、Laravel、Phoenix)之間,以及MVC框架之間的比較。理論在還可以拉出一個維度,也就是精簡版框架之間的比較:例如Sinatra、Flask(Python)、Lumen(PHP)、Go (Without web framework)之間的比較,但礙於能力與時間,加上我始終對於這個類別興趣缺缺而作罷。
網友Force曾留言表示:「語言只是工具啦,能作到事情比較重要。選自己所愛,愛自己所選就好。」言下之意是工具本身沒有好壞,對應不同情境選擇不同工具,最後順應自己的主觀喜好即可。這句話在我心中醞釀許久,最終只能同意一半,並將這樣的詰問作為今天的標題。在有些情況下確實如此,例如「精簡風格 vs 完整MVC」的比較。
我在之前「Sinatra 與 Rails 比較」中有這樣比較這兩者:
比較 | 精簡風格 | 完整MVC |
---|---|---|
範例框架 | Sinatra | Rails |
設計對白 | 只有開發者自己最懂得專案的需要 | 如果七成的專案都有這個需求,那我假設你也會有這個需求 |
特色描述 | 提供跑起伺服器的最低需求,其他都需要自己寫或安裝外掛 | 將大部份的最佳實踐作為預設 |
像是如果要寫一份新的履歷,有些人習慣從空白開始,有人會先找一些範例來改。這兩種習慣沒有對錯,速度上可能差別也不大,一樣都可以做出讓人嘆為觀止的傑作。因此在這種情境下,工具或許真的沒有明顯的好壞,有的就只是不同的開發精神差異,對應不同開發習慣與需求。
就像是物件導向與函數導向也屬於這個類型,網友taiansu表示:**「物件導向跟函數式編程是衝突的。這兩種 paradiam 各自的強項,剛好是對方的弱項。」**如果硬要寫一篇比較這兩者的優劣,意義不大。
但如果工具之間沒有好壞,難道我這三十天都在發廢文嗎?
將比較限縮到相同類型的框架,我認為比較就不只是習慣問題,而是有指標意義的。網路框架最常被人拿出來比較的執行效能與開發效能,如果有一款框架在這兩項指標都大幅落後,就算再怎麼有愛也很難替他護航。更不用說如果看單項指標,執行效能更是一翻兩瞪眼,數據跑出來大家都心服口服;不像開發效能,就算有很多的黑魔法與語法糖衣,這依然是一件很主觀的事,有人寫Laravel就是可以比Rails快,說Rails開發效能勝過Laravel他也很難服氣。
扣除這兩項,我在「現代網站框架重要元素整理」列出了我認為重要的指標,包括:
基本上都是目前的最佳實踐,除了RESTful router在Django並為實作之外,每一個框架都有採用,所以最終還是回到了執行效能與開發效能之上。因為跨語言的熟悉度關係,我不便評論Python與PHP,但Rails開發效能無疑是比Phoenix更佳,這點我可以掛擔保。執行效能上,Phoenix無疑是最快,海放其他三者。但剩下的三種比較我就不是很確定,網路上沒找到相關的資料。
用經濟學的觀點來解讀:資源有限,但慾望無窮。尤其是工程師是一個常常需要面臨選擇的職業:選擇作為新手入門的第一個程式語言、選擇走App還是Web、選擇Vue還是React(前端每十個月需要選擇一次)、選擇MySQL還是postgresql。解決相同情境的問題,有可替代性的兩個工具之間,在選擇之前自然需要比較。
工欲善其事,必先利其器。好工具自然影響工程師的表現,這是無庸置疑的。考量到選擇一項新工具所需要投入的時間成本,選擇就是一件大事,直接影響的生涯路徑。「如何選擇更優秀的工具」這樣的辨識眼光,跟分辨好工程師一樣,其實也是專業能力的一部分。
最後想引一段我在2017年TIOBE程式語言排行結果雜談所述:
論戰的初衷,是對於進步價值的不肯妥協
對進步價值的不斷追求是工程師的宿命。而未來的趨勢是工程師會越來越貴,機器運算成本卻逐漸下降。因此降低工程師的開發成本,我認為依舊是未來的王道。有鑑於此,為了速度我或許會考慮選擇Phoenix,但Rails與Ruby依然是我的最愛。
後記:今年的鐵人賽後半部都在寫Phoenix教學,但也尚未完成。剩下的部分包含完成的前作,我打算繼續編寫成為Phoenix新手教材,敬請期待。
人生就是各種 trade off,單兵作戰的時候考慮到的大概只有自己寫起來爽不爽,多人團戰的時候要考慮到團隊之間的學習、開發以及後續的維護成本。
沒有最完美的解決方案,只有當下相對適合的解決方案。
抱歉,這次是不得不來含扣更正一下。名字是 taiansu ,其實這是個中文名。 XD
抱歉抱歉,居然把重要的名字打錯了!