如何揀library而不中伏

 Gordon Lau 劉偉中

Gordon Lau 劉偉中

2021-05-12

在世上大多數的技術行業,工作之箇中技術都往往是行業機密,因為這關乎商業利益,斷不會隨便公開予大眾。例如著名廚師的食譜、半導體的生產技術、礦產開採技術等等,誠然在今日互聯網世代,這些技術之相關知識很多時亦可在網上窺得端倪,但往往只是在表面輕輕帶過,箇中奧妙,都不足為外人道。在這一點Programmer則與其他行業不太相同,因為有開源軟件(Open source software)之存在。對世上數千萬Programmer 而言,閱讀、使用、參考其他Programmer的工作是很稀鬆平常的事,即使是世界級Programmer所編寫之程式碼,也很容易在Github 等網站閱讀得到,基本上不存在知識壁疊。很大部份日常Programming常用之程式庫(Programming library),正是以開源的方式,在社群之中共享,在各種技術行業之中,這是一個相當獨特的技術生態。

npm_packages_wombat.png

NPM Wombat Reference

就以筆者最熟悉的Npm packages為例,NPM上2019年就有超過一百萬個packages,每月總下載次數達500億次,因此可以肯定地說,不論一個軟件工程師是如此出類拔萃,使用他人所寫的程式庫乃是不可避免。

既然使用他人所寫之程式如此必要,我們更應有一套行之有效的方法,去判斷一個library是否適合手頭上之專案,否則當專案太依賴該library之後,造成與程式庫間之依賴耦合(Dependency Coupling),到時想再改回來,就已經恨錯難返了。

既然活用他人之程式這樣重要,那有何原則可以判斷應該如何挑選library呢?筆者在下筆這篇文章之前,都在網絡上搜尋過類似文章,發覺這個重要問題,竟然很少人談及過,筆者就斗膽在此分享一些個人經驗,希望可以幫到正在閱讀的你。

筆者看來,揀選library 可遵從以下五大原則,並將一一以例子詳加解釋:

  • 受歡迎程度 (Popularity)
  • 開發活躍程度 (Project activeness)
  • 質素高下及文檔齊全程度 (Code Quality and Documentation)
  • 許可證及使用成本 (License and cost)
  • 多平台支援程度 (Multi-platform support)

程式庫是否受歡迎呢?

正所謂「西瓜靠大邊」,大多數開發者使用的程式庫必然有其優勝之處,其中一個好例子是Twitter BootstrapTwitter Bootstrap自2011推出而來,一直大受歡迎經常,是Github上最多星星(Stars)的頭數位。開發者在揀選CSS框架的時候,Twitter Bootstrap每每是首選,正因有大量開發者使用,更保證了不論有任何問題、任何漏洞,你都能夠輕易在網上找到解決方法,因為類似問題通常早已為數目龐大的用戶測試得非常通透。

bootstrap_github.png

Github Link

Bootstrap在介紹裏也開宗明義,說是The Most popular HTML, CSS, JavaScript framework...,強調The most popular,其中原理,就是「盛名之下無虛事」,都已經是最受歡迎了,質素當然有保證吧,不然大家都轉會了。

比較之下,Bootstrap的其他競爭對手則顯然無法以受歡迎作招徠: 例如近年很受歡迎的Tailwind,就以Utility-first的哲學來與BootstrapComponent-first哲學來作分野。

tailwind_css.png

另一競爭對手Bulma則以簡單易用作招徠,例如強調just worksNo CSS Knowledge required。也是為了與Bootstrap作明顯分野。

bulma_easy_to_use.png

因為這些程式庫都須要回答一個很重要的問題,就是為何我有Bootstrap不用,要用這個程式庫呢?,可見僅僅是受多人歡迎,已使一個程式庫獲揀選之機會大增。

程式庫開發者有活躍開發嗎?

只是受歡迎並不足夠,程式庫永遠都在變化,不會一成不變,所有程式庫必須不斷推出新版本,以提供新功能、修補問題、改善開發者體驗(Developer Experience)。假如有一個很受歡迎的程式庫,在過去一年都接近完全無任何開發活動(No active development)的話,筆者認為是一個很大的警號(Red Flag)。

一個好例子就是JQuery UI,在現今單頁面應用框架如ReactVueAngular興起之前,JQuery UI曾經是一個相當廣泛使用的程式庫,因為JQuery UI提供了不少可以直接使用的部件(Widget)。但走到JQuery UI的github,你會發覺JQuery UI 對上一個穩定版本已是2016年9月推出,已有超過4年無新版本推出,即使在香港從事軟件開發的公司中,依然有在使用JQuery UI的痕跡,也掩蓋不了JQuery UI已經「死亡」的命運。

jquery_ui.png

相較之下,React Material UI的對上一個穩定推出版本是4.11.4,距離本文寫作日期僅是13日之差,塾優塾劣,一目了然。

material_ui.png

軟件活躍開發,代表新概念、新想法會得到採用,使用之開發者工作效率自然更高。

程式庫開發者是否着重軟件質素及文檔?

筆者自己平常做軟件開發,對軟件的要求自然不只是「能運行」就可以,軟件質素(Software Quality)及軟件文檔(Software Documentation)也是必須考慮的問題。對應用要採用的程式庫要求也相類似,要選用軟件質素夠高的程式庫。一個量度軟件質素的方式,就是用自動測試覆蓋度(Automated Test Coverage)。我們常常在軟件的Github 看見一個Badge,寫著Coverage 95%的意思,就是代表自動測試已覆蓋了九成五程式碼。所以這其實是一個代表程式庫高質素之「勳章」呢!

github_badges.png

文檔(Documentation)是另一個很重要的因素,程式庫(Library)與普通應用軟件(Application Software)不同,文檔的高下往往直接影響程式庫的成敗。Facebook的React是最受歡迎的單頁面應用框架,筆者認為文檔清晰簡潔是一大原因,即使是初學者,亦容易上手。

react_docs.png

相較之下,另一個單頁面應用框架Ember.js的文檔則複雜得多,更在同一頁面內有版本123之別,即使是前端開發老手,也很容易覺得混淆。何謂Ember Data呢?2.X的版本又有一個概念名為Controller?Ember Object又是甚麼呢? 有興趣者多看幾頁已頭昏腦脹,又怎會在自己的專案採用呢?

ember_docs.png

在單頁面應用之競爭之中,React受歡迎程度遠勝Ember.js,也不言而喻。

react_vs_ember_trend.png

NPMTrends 網站

程式庫是否開源?

世上絕大多數常用之程式庫,都是開源軟件(Open source software),因此也是用開源許可證(Open source licenses)發行,也有少數程式庫會有收費功能(Premium Features),但不是主流做法。對軟件開發者而言,開源軟件之最大好處,就是容許開發者直接閱讀程式碼,幫助程式庫除錯、改善功能、擴充文檔。對專案管理人(Project Manager) 而言,使用一個開源程式庫也有好處,就是縱使程式庫原作者荒廢了,只要有足夠技術人手,大可以自行繼續維持,不必怕失去軟件支援的困境,因此開源程式庫獲廣泛認為是未雨綢繆的選擇。

相反,閉源/商業程式庫則自帶這個「停止支援」的風險。一個閉源的軟件停止支援,所有與之相關的軟件都需重寫(Revamp)。大家記得的話,數年前Windows XP「壽終正寢」的時候,連銀行櫃員機也面臨安全風險了。因此,使用閉源軟件,本身就有軟件未來無法繼續使用的風險。

Windows-xp-atm.jpg

來源

程式庫是否支援多平台?

筆者是長期的Linux使用者,對應用是否支援多平台非常重視。筆者認為一個優質之程式庫,必然是支援多平台(Multi-Platform)的。開發者往往各有喜好,根據2020 StackOverflow全球開發者統計,三大操作平台WindowsMacOSLinux都備受開發者喜愛,分別有45%27.5%26.6%的開發者使用。

developer_survey_os.png

一個只在Windows可用的程式庫,就失去 53%的開發者青徠,一個只在Mac可用的程式庫,更是失去73%的開發者份額。很多程式庫因此都是三大平台一併支援,以「大包圍」的策略盡量拓展使用者基礎。 例如人工智能框架Tensorflow,就同時支援WindowsMacLinux三個平台。

tensorflow_installation.png

除了操作系統之外,一個能夠在不同程式語言中使用的程式庫,也是多平台支援的表現。例如Microsoft推出的瀏覽器自動化工具Playwright,就能夠在JavaScriptTypeScriptPythonJavaC#多種語言中使用,比之前的Puppeteer只能在JavaScript/Typescript使用,又是更勝一籌了。

playwright_page.png

總結

開源的程式庫在網上數以萬計,要選擇好,殊不容易,以上都是筆者的一些心得,大多數時間都可以選到一個不錯的程式庫,也不太容易與本文所言一樣「中伏」了,編程起上來就事半功倍。 不知大家又有何原則去選擇程式庫呢?

留言

延伸閱讀

SQL首部曲:NoSQL? No! SQL!

學好手勢 == 學好Coding

軟件工程師成長手冊

專家級新手