本文最初發布於 Nils Norman Haukås 的個人博客。
我認為,我們的眼光不應局限於庫和框架,而應該重新發現模式和原則的價值,這樣可以減少破壞性變化,讓我們構建的東西更持久。
一段時間以來,我一直秉持「編寫庫而非框架」的理念。最近,我開始思考,似乎可以對這個觀點做一個富有成效的擴展,即原則勝過模式,模式勝過庫,庫勝過框架。
讓我們澄清一下這幾個術語:
框架:這(通常)是別人的代碼調用你的代碼。為了實現這樣的調用,你的代碼需要符合框架所定義的約束。通常,這些約束有非常明確的界限,編碼時很難繞過。反過來說,在框架的約定和規範下編碼,你往往會獲得很多有用的功能,加快編碼速度。
庫:這(通常)是從你的代碼中調用別人的代碼。與框架相比,庫對你的代碼施加的限制比較少。通過使用一個或多個庫,你可以重用別人的代碼來解決自己的問題。庫更容易組合和互換,而同時使用不同的框架可能會帶來麻煩。
模式:這是一種描述性的、可重用的代碼編寫方法(見:軟件設計模式)。模式在模糊性、適用性和規定性方面有很大的差異。舉例來說,有儘早返回模式、構建者模式、行為者模型、模型 - 視圖 - 控制器、洋蔥架構、微服務、宏單體、單庫和流式架構等。這些只是我能想到的一些模式,涉及編程模式的書很多。
原則:這是一些一般指導原則或是以規則形式表達的理念(如經驗法則),可以幫助你寫好代碼。儘管與幾千年來一直在建造房屋的木工領域相比,編程是一個非常年輕的領域,但是開發人員已經設法提煉出一些有用的原則來幫助他們開展工作。舉例來說,有 SOLID 原則、不要重複代碼(DRY)、不要過度設計(YAGNI)、敏捷宣言、迪米特法則、海勒姆法則。還有很多,在我寫這篇文章的時候,我剛剛發現了這個收集編程原則的網站,很不錯!
這裡我必須得補充一句:不要過度使用和 / 或在不適合的情況下使用它們(見:工具法則)。例如,這裡有一篇題為「錯誤的抽象」的文章,開發者 Sandi Metz 對開發人員不惜一切代價應用 DRY 原則的傾向做了精彩的點評。
我在這裡並不是說我們應該停止使用框架和庫,但我們應該認識到,使用它們是一種權衡,我們付出一些成本並獲得一些功能。比如說,保持更新的成本。代碼庫更新滯後可能會遭受漏洞攻擊。相反,如果你不加辨別地安裝最新的更新,就為供應鏈攻擊(惡意代碼被插入到一個或多個軟件包中)打開了大門。
除了與安全有關的成本外,還有一個風險是,你所依賴的代碼會因為作者倦怠或內部團隊變化而被廢棄。顯然,一直都有各種各樣的東西被停止使用。對此,你可能會反駁說:「它是開源的,我們可以創建分叉。」這倒是,但你會維護它嗎?我認為,在添加任何特定的依賴時,問問自己:放棄這個依賴的可能性有多大?如果出現了這樣的情況,我應該怎麼做?維護它還是換掉它?至少,庫往往更容易替換。
我們如何衡量一些代碼項目是否有被放棄的風險?我們傾向於看最近的活動,只要試着在 Github 上搜索」is this dead「。面對問題的衝擊,作者要麼宣布項目破產並將其歸檔,要麼不對問題做出回應並逐步淡出人們的視線,要麼加速推出新的功能並擴大代碼的適用範圍,解決任何用戶遇到的任何問題。屈服於這樣的功能熱,很快就會導致破壞性的變化,需要重構代碼,記錄升級路徑,並對那些拼命想跟上所有變化的開發者的問題做出回應。任何成熟穩定的技術都有可能被宣布「死亡」,並被這個超級敏感的行業所剔除。關於這一點,我在文章「好代碼之死」中提到過。
使用他人的代碼也會帶來隱性的變更成本,升級或放棄都會很痛苦。框架和庫通常會引入它們特有的概念。換句話說,如果你決定轉到另一個框架或庫,那麼你通過使用和調試這個工具所積累的所有經驗可能都將變得毫無用處。而且,眨眼之間,你所依賴的框架就會發布一個重要的版本升級,刪除舊版本中特有的概念,使你辛苦積累的所有經驗都失去意義。再加上沉沒成本悖論,這種成本很容易在不知不覺間加劇。
我覺得,在我們尋找新的、更好的方法構建技術時,我們不應該把我們的思維局限在從庫和框架中尋找答案。
但是,除此之外還有什麼呢?
在開始回答這個問題之前,我想指出我在網絡上偶然發現的一些有趣的暗流。首先,Adrian Holovaty 有一個有趣的演講,題目是「一個框架作者的反框架故事」。他認為,在沒有框架的情況下也完成可以構建出功能豐富的 Web 應用。其次,當讀到 Remix Run 框架的理念時,我感到萬分驚喜:
這句話讀起來就像是我上面提到的變更成本的解藥。學習一些技術意味着學習可轉移的知識,這是一個加分項。
第三,我了解了「Stackless Way」的概念,並閱讀了 Elise Hein 寫的一篇非常有趣的文章。她探討了這種非正統的想法,即追求不設置構建步驟、不使用框架的「無棧(stackless )」。
當我創立網絡組件工作室時,我也選擇探索一下自己可以在多大程度上採用無棧方法。我發現,現代瀏覽器功能非常強大,可以在不引入外部代碼的情況下編寫出豐富的功能。我感覺這相當令人振奮和自由。是的,這種方法仍有一些不完善的地方。不過,這裡所缺少的可能不是成熟的框架或庫,而是一本模式和原則手冊。
想象一下,因為我們投入時間去發現和建立模式與原則,而使得一個行業不再那麼依賴庫和框架。我相信,這樣的未來可以減少維護者的倦怠,減少破壞性的變化,為我們帶來更優秀、更長久的程序。
今後,你仍然會發現我在使用框架和庫,我甚至會編寫一些新的框架和庫。不過,這種無棧方法、有用的模式和原則、可轉移的知識,是我要尋求和探索的。
作者 Nils Norman Haukås 是 Netlife Bergen 的首席技術官,他負責刪除代碼,打造技術卓越的安全空間,並研究減少會議的新方法。
查看英文原文:
https://nilsnh.no/2022/04/09/innovating-beyond-libraries-and-frameworks/