架構師是否應該重複發明輪子

如果把“重複發明輪子”這個比喻放到計算機領域,也不見得太恰當,因為有很多廣泛流傳的軟件本身就是被重複發明的“輪子”,不能說它們是無謂的重複勞動。

Linux 是對 Unix 的重新發明,MariaDB 是對 MySQL(MySQL 是對 PostgreSQL 和 Oracle 的重新發明,而 PostgreSQL 是對 Oracle 的重新發明)的重新發明,現代 C++ 是對老版 C++ 的重新發明,C++ 是對 C 語言(C 語言是對 B 語言的重新發明,而 B 語言是對 BCPL 的重新發明)的重新發明,Rust 是對 C++ 和 C 語言的重新發明,Clojure 是對 LISP 的重新發明,LISP 是對 IPL 和 Lambda Calculus 的重新發明,Haskell 是對 System FC 的重新發明,System FC 是對 System F 的重新發明,System F 是對 Labmda Calculus 的重新發明,DOT 是對 OO 的重新發明,Kotlin 是對 Java 的重新發明……我可以舉無數個這樣的例子。Vim 是對 Vi 的重新發明,Wayland 是對 Xorg 的重新發明,Ubuntu 是對 Debian 的重新發明。

很多優秀的軟件並不只是簡單地往已有代碼庫中添加新特性而已,而是通過不斷迭代,創造出比以往更好的東西。GitHub 上很多流行的代碼庫都有數百個分支,而對於每一類軟件工具,我們又有很多不同的選擇。

人們經常說“不要重複發明輪子”,但他們忽略了這樣的一個事實:大部分優秀的計算機軟件實際上就是被重複發明的輪子,而並非是全新的東西。

這些變化是循序漸進的,我們基於已有的概念逐步迭代,慢慢修改它們,讓它們變得更好。這是個無窮盡的過程,甚至我們忘記了自己是從哪裡出發的,也不知道終點在哪裡。我們唯一要付出的是時間,也許這就是計算機編程的神奇之處。在這裡,沒有所謂的資源短缺,也不管我們如何瘋狂,我們總能創造出一些東西。

重複發明輪子不是罪,只是我們要知道在何時以及如何重複發明輪子。

當沒有合適的輪子可用時

在找不到可用的工具時,就自己開發一個,而不是基於已有的庫開發一個不那麼好用的“次品”。或許其他人也有同樣的需求,那麼就可以把你開發的工具分享給他們。自己開發可能需要更長時間,但會更有趣,而且開發出來的工具可能更好用。

當然,具體要怎麼做,完全取決於你自己。你可以“勤快”得像某些 C 語言開發者一樣,連 list 和 vector 都要自己實現,也可以“懶惰”得像某些 JavaScript 開發者一樣,連最簡單的判斷奇數的函數都要從網上下載(比如日下載量超過十萬的“is_odd”包,地址如下:

https://www.npmjs.com/package/is-odd。

以 Julia 為例,Julia 是一門與 Python 非常像的編程語言,只是它更容易部署,不需要虛擬環境就可以運行,它運行更快,而且支持大規模的併發。Julia 就是一個被重複發明的輪子,因為從理論上說,它所能做的事情,Cython 也能做到,只要使用恰當的 C/C++ 庫,修改一點代碼,再加上一點耐心就可以。但 Julia 與生俱來就提供了便利性,為開發人員節省了大量時間,還讓開發變得更有趣。或許,它會是 21 世紀最讓人矚目的編程語言之一。

當現有的輪子停滯不前時

當很久沒有人重複發明輪子,就可以考慮重新發明一個。出現這種情況,可能是因為現在的輪子已經夠好了,沒必要做出大的改進,但更有可能是因為大多數人希望有更好的輪子,只是他們沒有時間去做。比如,有些問題雖然暫時得到了解決,但並不完美,因為當前的技術或框架無法提供更好的解決方案。這就留有餘地,等待更好的時機出現。數年之後,或許技術發展到可以更好地解決這些問題。

以圖像識別為例,圖像識別屬於經典的分類器問題。人們在分類器問題上不斷努力改進,直到 2010 年,通過使用 Fisher Kernel 這類算法才讓分類器得到了非常精確的結果。當然,這些成果還不足以用於檢測癌症腫瘤或汽車自動駕駛,從精確度和訓練時間方面來看,它們的水平還只是處在鸚鵡和大象之間。直到有人重新發明了並不太流行的卷積神經網絡,還使用了現代的 GPU 來訓練那些早在 90 年代就開發出來的圖像識別模型。2012 年出現了著名的 AlexNet&Co,而幾年之後,圖像識別技術發展到令人驚詫的地步,在中型數據集上訓練出來的分類器甚至可以打敗人類。

當輪子受到所有權限制時當你覺得這樣做很有趣時

對一個已經很完美的軟件來一次重新發明,這樣做也沒什麼錯。你可能會失敗,但你會從中學到很多。儘管別人已經解決了大部分問題,但你仍然能夠從解決同樣的問題中獲得有趣的體驗。數百萬人想證明勾股定理或重新發明新的 LISP,雖說他們最終不過是在重複發明相似的輪子,但他們所做的並沒有什麼錯,只要他們能夠從中獲得樂趣。而如果你重新發明的輪子哪怕只是比原先的好那麼一點點,都算是在造福人類。

架構師是否應該重複發明輪子


分享到:


相關文章: