最近俗務纏身,瑣事連連,睡前頗不寧靜,坐下來寫一點隨筆,收斂心神。


世界是變化的,無論是誰,永遠也無法窮盡這個世界的每一個實體,永遠也無法追蹤這個世界的每一個變化。可是最神奇的是,這個世界是可以被認知的。我不禁問自己,既然無法窮盡世界上的每一個實體,我們是怎麼認識這個世界的呢?

原始人類鑽木取火,結繩記事,從那時起就不斷在認知世界的道路上不斷前進。有人狩獵打來了一隻野豬,人們也許在洞窟巖壁上畫一道槓;有人捕撈打到了一條魚,人們也許在草繩上打一個結。一隻野豬和一條魚,明明是不同的兩個實體,可是都對應了「一」這個概念。在這種財產分配的場景中,人們慢慢積累認識到了「一、二、三、四……」這樣的數字的概念。有了數字的概念,再也不用專門針對每一種實體建立對應關係,一隻野豬是一,一條魚是一,一個野果是一……一下子就對這個世界的認知往前垮了一大步。

人對世界的認知就是這樣的過程。回想起來,小學的時候,老師總會教一些特殊的題目,什麼雞兔同籠啊,什麼水池抽水啊,什麼相遇問題啊……每一種問題都有特定的解法,依照解法按部就班,就能順利解決問題。到了初中,我們發現老師不再教新的題目類型了,直接教了一招二元一次方程,瞬間解決了上面所有問題。在二元一次方程的幫助下,不僅上面這些特殊的題目都可以解決了,即使遇到新的問題,相遇改成追擊,水池改成商店庫存,雞兔同籠變成包子饅頭,也一樣輕鬆化解。更進一步,老師新教的招式也都是三角函數、因式分解……每一招使出來都可以打開一片天地。

這就是「抽象」,憑藉這樣一把終極的武器,人們才能在認知世界的道路上不斷前進。每當人們對一大類實體進行總結提煉,進而抽象出一個概念之後,人們對世界的認知就加深一層。在這個概念下,即使遇到沒見過的實體也仍然能把握他的性質,找出應對之法。這就是抽象的威力。在我看來,這也是人之具備智慧,從而與動物有著根本區別之處。

知乎上有個問題《如何理解「觀點越高,事情越顯得簡單」這句話?》在我看來這句話就是一個簡單總結,是對人們通過不斷抽象來認知世界的一個簡單註解。當觀點不夠高的時候,就像我們小學時候知識積累不夠,只能想到對雞兔同籠、水池抽水來各個擊破;而當我們知識積累更深厚,觀點提升之後,從方程的角度,這些紛繁的問題全部都用方程的思路解決。相比死記硬背各種解題套路,方程顯得簡潔明瞭。物理學家為什麼追求大一統理論?因為大家都相信,在極高的抽象層次下,世界運行應當遵循一個統一的理論。至今仍有無數絕頂聰明的科學家在這條道路上拼搏奮鬥。

且不說如今的頂級科學家,古人也早已在實踐中掌握了抽象的武器。子曰君子務本,本立而道生,表達的也是這樣的思想。可惜千年後的今天,仍然有許多的人捨本逐末,把一腔熱情投入到無限細節中,最後事倍功半,甚至碌碌無為。

在這個問題《為什麼大多公司不要培訓班培訓出來的JAVA程序員?》下,很多人討論了培訓班的課程設置不合理,教的內容不實用。我也遇到過很多培訓班出身的程序員,在我看來,培訓班做的最不好的地方,就是捨本逐末。他會教你很多技術細節、步驟,可是你不明白背後的原理。當環境稍有變化,你就無法做出調整。

我自己作為程序員,深知代碼就是對世界的一個建模,寫代碼就是對世界的一個認知。自從計算機誕生至今,人們發明瞭無數的編程語言,創造出一個又一個的演算法,無非也是對這個世界進行不同程度的抽象。程序員們的工作,時刻都在處理「變」與「不變」。對世界萬物抽絲剝繭,分離變的部分,歸納不變的部分,這就是抽象的過程;通過抽象,才能更好的認識世界。

在那個問題下有個回答中提到:

當時我還特別難熬在培訓機構用的是win+ssm+svn體系,而我公司用了OS X+springboot+git體系,整個兩套都不一樣。

在經過系統培訓的程序員看來,上面這個描述,很類似於「我們只學過相遇問題,結果考試的時候兩個人居然是同方向走,一個去追另一個,整個兩套都不一樣」。這就是觀點還不夠高,抽象還不夠,才產生了這樣的困惑。可惜的是,培訓班從自身的立場出發,是不可能從高層次的抽象概念出發進行教學的,這是大學裡計算機科學技術專業乾的事。所以從培訓班出來,如果自身不花費巨大的努力進行總結提高,在視野上是很難達到科班出身的同學平均水平的。

抽象是人們認知世界的武器,對於個人來說,則是一整套方法論。怎麼對已知的實體進行總結歸納,進而提取出抽象的概念,甚至在不同的抽象概念之間產生聯繫,進而生長出進一步更高抽象層次的概念,這是需要長時間的鍛煉才能熟練掌握的。在熟練掌握之前,往往需要遵循前人趟過的道路前行。

比如這個問題《怎麼從本質上理解面向對象的編程思想?》,這裡的面向對象編程(OOP),實際上就是前人趟過的一條比較好走的路,通過「對象」這個概念,簡化了很多思維工作量,依照面向對象編程思想的指導,可以花比較少的思維負擔,來構建比較複雜的系統。面向對象編程就是一種思想方法,和你用的語言完全沒關係,甚至和有沒有「封裝、繼承、多態」這些概念也沒有關係(培訓班的老師往往最喜歡強調這些名詞),用純 C 語言也可以寫出非常面向對象的代碼來,而用 Java 也可以寫出譚浩強式的代碼。

儘管面向對象編程是前人趟過的一條比較好走的路,也不意味著只有這一條路可以走,甚至對於熟練掌握抽象思維的大神來說,完全無所謂有沒有路,自己走的地方就是路。如果仔細研讀 Linux 核心的一些代碼,會發現這些用純 C 寫的代碼,比好多人用 Java/C++ 這種所謂面向對象語言寫的代碼還更「面向對象」。從面向對象編程的觀點看,用 C 也好用 Java 也好,具體的語言就是細枝末節了;而從更高的角度,對具體事物的抽象的觀點看,面向對象也好,函數式編程也好,編程思想也變成細枝末節了。

這很像金老先生的武俠世界觀,獨孤求敗一生經歷的「利劍-軟劍-重劍-無劍」的階段,正是抽象程度逐步提高,對武功的理解逐步加深,自身功力修為不斷上升的過程。世界是不斷變化的,敵人的劍招也是無窮無盡的,即使慕容家的還施水閣也不過窺探天下武功一角,遇到新的招數怎麼辦?即使強如張無忌,在面對波斯三使詭異的波斯武功時也縛手縛腳。而獨孤求敗卻說料敵機先,無招勝有招。以不變應萬變,萬變不離其宗。這就是境界的高低不同,對世界抽象層次的高低有別,對新事物的認知結果就大大不同。

大道至簡,萬法歸一。

P.S. 雖說是篇隨筆,在末尾也稍稍給我自己做個廣告。我的專欄《光怪陸離》,裡面的文章,都是從我自身的理解出發而寫成,我希望站在盡量高的角度,對一些光學方面問題進行解釋、論述,甚至在一些抽象的層面上跟其他學科產生一些聯繫,希望大家讀後有高山流水之感。囿於我自己知識有限、文筆艱澀,往往不能盡善,還望海涵。


推薦閱讀:
相關文章