程序員啟示錄
最近因為項目需要在看一個開源項目的源碼,這個開源項目據說在內部開發孵化了 6 年之久,前幾年才開源出來。 我在看設計文檔和源碼中發現,它的高層設計的一致性是比較好的,但到了源碼實現就顯得凌亂了些。 既然是時間跨度如此長的項目,想必參與這個項目的程序員也不止一批人了,處于不同階段的程序員都有可能參與,這樣也能理解實現上的凌亂了。 看著這些有一定時間沉淀的代碼,有些代碼可能誕生于差不多我剛工作的年頭,有些又是最近才加上的。 不免讓我回想起作為程序員,與這些代碼一起在時間中的成長與沉淀。
剛工作的第二年,我接手了一個比較大的項目中的一個主要模塊。 在我熟悉了整個模塊后,開始往里面增加功能時,有點受不了原本的 DAO 層,那是基于原生的 JDBC 封裝的。 每次新增一個 DAO 都需要復制粘貼一串看起來很類似的代碼,久了難免生出厭煩的情緒。
當時 Hibernate 剛興起,覺得它的設計理念優雅,代碼寫出來也簡潔,所以說干就干就決定用 Hibernate 的實現取代原本的實現。 重新實現原來所有的 DAO 層類,這說多不多說少不少也有好幾百個 DAO 類,導致連續加了一周的班。 這是個純粹的搬磚體力活,弄完了還沒松口氣又有了新問題,Hibernate 在某些場景下又出現了性能問題。 斷斷續續把這些新問題處理好,著實讓我累了一陣子,后來反思這個決策感覺確實不太妥當。 替換帶來的好處僅僅是每次新增個 DAO 時少寫幾行代碼,卻帶來很多當時未知的風險。
年輕的程序員對新技術充滿好奇,而且有顆沖動的心。 對新技術,我知道,我了解、我熟悉、我深諳,但我還是需要克制,等待合適的時機。 寫到這里,想起了《勇敢的心》梅爾·吉普森看著對方沖過來,喊著 Hold~Hold~ 的場景。
在更早的時候,我在廣東省中國銀行寫過一個小程序,就是給所有廣東省中國銀行的信用卡客戶發郵件賬單。 按現在各大銀行信用卡客戶上億的規模,即使只是每月發賬單郵件的程序也不能算小了。 只是當時廣東中行信用卡剛起步,***個月只有不到 10 萬客戶,所以算小程序。
那個年代都是全棧工程師啊,連賬單頁面模板的樣式都是我自己設計的,***次還犯了個小錯誤就是金額展示沒有靠右對齊。 而且程序就部署在信用卡部的一個業務人員的獨立配置的辦公電腦上。 每月出賬,核心交易系統下發賬單格式文件,業務人員手工導入格式文件生成模板郵件,然后就開始發送了。 所以,這個小程序就是個單機程序,為了方便業務人員操作,我寫了個 GUI 界面。 ***次用 Java swing 寫 GUI,為了展示發送進度,后臺線程每發送成功一封郵件,通知頁面線程更新進度條。
當時正在學 Java JDK 還沒有標配 concurrent 包,都是原生的,覺得 java 線程編程很高端。 所以我選擇線程間通信的方案來讓后臺發送線程和前臺頁面刷新線程通信,一股濃濃的炫技心理。 后來導致了界面動不動就卡住等一系列問題,因為各種線程提前通知,遺漏通知等情況,代碼越改越難懂。 其實用個共享狀態,定時輪詢即可滿足的,而且代碼實現會簡單的多。 回頭想想,成長的路上不免見獵心喜、手上拿個錘子看到哪里都是釘子。 話說回來,我還挺懷念當初設計的那個賬單模板,可惜現在找不到了。 感覺比現在建行給我發的那個傻大黑粗的表格看起來好些吧,傳統銀行在用戶體驗上的路上還有多遠的路要走?
我現在正看的開源代碼也看到一些炫技的痕跡,具體說就是關于狀態機的使用。 狀態機程序是不符合直線邏輯思維的,類似 GOTO 語句,程序會突然發生跳轉,所以理解狀態機程序比一般程序要難。 而狀態機程序又通過自定義的的內存消息來驅動,更加一層復雜性。 在我理解,狀態機程序最適合的場景有真實映射領域狀態變遷,什么叫真實領域狀態?比如,你紅綠燈就表達了真實領域的三種狀態。 另外一個主要用途就是做協議解析,反應解析器當前的運行狀態。 凡是使用狀態機來表達程序設計實現中的偽狀態,往往都添加了不必要的復雜性。
有時我經常會在一些開源項目中看到一些過度設計和實現的復雜性,而這些項目還都是一些行業***的大公司開源的。 在程序員的成長路徑上,越是高階的晉升中,行業里喜歡采用專家評審制,評委會傾向性的關注項目中的技術難點以及技術含量。 制度的傾向性也有可能導致人為制造技術含量,而不一定是匹配項目的***方案。 所以程序的技術含量和深度未必體現在表面,我「看山是山看水是水,看山不是山看水不是水,看山還是山看水還是水」。 轉了一圈回來,機鋒盡斂,大巧若拙,深在深處,淺在淺處,這也是我所理解的 KISS 原則。
在很多科幻小說和電影中都有很多關于未來假設,多分支可能的存在。 在科幻電影《Coherence》中假設了一種一個人存在的多版本可能,碰巧在某天重疊了。 我挺喜歡這個設定的,它來自于「薛定諤的貓」的理論實驗,就是關于未來已經存在很多可能版本,我們走過的部分就形成了唯一的穩定版本。 我走了很遠,停下來回顧時間線上很早的自己,得到這星星點點的啟示。 而現在的駐足與回顧,都不過是借此啟示幫助我們更好的邁出不論或大或小的下一步。