iT邦幫忙

2025 iThome 鐵人賽

DAY 1
0

Emacs 是一台 Lisp 機器,但偽裝成文字編輯器。

(Emacs 社群諺語)

身為一位 Clojure Programmer,我一直有個遺憾:Clojure 社群最流行的編輯器是 Emacs(約 40% 使用率),但我始終學不會它。

Emacs 的特別之處在於,它的插件語言是 Elisp——一種 Lisp。這對 Lisp 開發者來說就像生產力的外掛,能輕鬆改造編輯器。

https://ithelp.ithome.com.tw/upload/images/20250901/20161869AVVleJhrpt.png

問題是:我實在不習慣 Emacs,而 Neovim 雖然支援 Lua 與 VimScript,卻沒有 Lisp。直到我發現 Fennel——一種可以編譯成 Lua 的 Lisp,Neovim 才真正有了 Lisp 選項。

我用 Fennel 開發了幾個插件之後,發現它不只是幫我解決了 Emacs 的問題,更讓我重新思考:在 AI 時代,程式語言與開發範式的選擇,對生產力還有什麼影響?

AI 時代的軟體開發

2025 年,應該很多工程師都用 AI 來輔助軟體開發了,我也不例外。在應用 AI 開發軟體的過程之中,我發現我長年使用的程式語言、編程範式,不僅沒有過時,反而更加顯出它們的價值。它們本來就是改進編程瓶頸的絕佳工具,用了 AI 之後,編程活動既有的瓶頸比起過去還更加顯著。

一般來講,工程師開發軟體,粗略來看,時間用於下列四項活動:

  1. 編碼之前的研究、包含研讀程式碼、討論需求
  2. 實際編碼
  3. 測試與除錯
  4. 調整與重構

上述四件事的時間分配很可能依人與專案而有不同的統計分布,先假設為 20%: 30%: 30%: 20% 之分布。而應用了 AI 之後,往往是第二項『實際編碼』的時間大幅減少。在有些研究甚至指出,用了 AI 之後,有時候第二項的時間大幅減少,但是第三項的時間反而增加了,因為 AI 寫得快但是品質不穩定。

Clojure 因為是 Lisp 的關系,它支援互動式開發 (interactive development),所以可以做到邊寫邊測。95% 的 programmer 都沒有看過互動式開發,你可以想象成,它是一種不用寫測試的測試驅動開發 (TDD)。換言之,光是互動式開發就可以有效地讓測試的時間縮短。

函數式編程 (Functional Programming) 則可以有效地減少 Bug ,因而進一步減少除錯的時間,而這點已經有一些學術界論文支持。

假設工程師的開發時間分布,分配於「測試除錯」項目的時間約為總開發時間之 30% 。即,在沒有 AI 時,互動式開發與函數式編程能幫你省下最多 30% 的測試與除錯時間;而在 AI 已經大幅減少「實際編碼」時間的情況下,互動式開發與函數式編程的效果會更顯著,省下的時間甚至可能逼近總開發時間之 40%。

Fennel 讓互動式開發/函數式編程的進入門檻下降

真的要講的話,Clojure 真的不容易入門,僅管這件事不少 Clojure Programmers 都死不承認。(編按:你們就乾脆地承認自己 beating the averages 吧!生產力是別人的三到五倍,薪水只多領 20% 不到,這沒有什麼好羞恥的,只不過是 underpaid 而已。)《獨角獸專案》的作者 Gene Kim 也有公開寫文章陳述這件事

Without doubt, Clojure was one of the most difficult things I’ve learned professionally, ...

Clojure 的難,難在很多方面:

  • 網頁應用程式開發,本來就不簡單。
  • Clojure 的 core lib 有 700 個函數與巨集。想象一個超級豐富的標準函式庫。
  • Clojure 運作在 JVM 上,所以你總是會遇到要使用 Java Library 的時刻。
  • 有些 Clojure programmer 還會捨棄 SQL based RDBMS,改投 Datomic 的懷抱

相較之下,對於初學者的話,如果從 Fennel 切入,上述每一項都簡化許多:

  • 編輯器插件的變化有限。
  • Fennel 的 core syntax + core lib 加一加,還不到 50 個。
  • Fennel 運作在 Lua 的 VM 上,所以你會需要學一些 Lua 。Lua 也比 Java 簡單的多。
  • 編輯器插件很多時候都沒有用到資料庫,就算有用,也只是 SQLite 而已。

來看一段 Fennel 語言的 Hello World! 吧:

(fn greet [name]
  (.. "Hello, " name "!"))

(print (greet "world"))
; => Hello, world!

再過幾年,我女兒的學校搞不好也要開始教 programming 了,我都有點想帶著 Fennel 語言去應徵國小電腦課的代課老師了。

小結

如果這篇文章讓你心生嚮往,想一探 Lisp 與函數式編程的魅力,那麼,你不用再觀望了。Fennel 正是那把通往新世界的大門鑰匙,它的低門檻,讓你可以在熟悉的 Neovim 環境中,無痛體驗互動式開發的效率與函數式編程的優雅。

準備好了嗎?讓我們一起開始這趟 Lisp 的輕量級冒險吧!


系列文
在 Neovim 中探索 Fennel 與函數式編程1
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言