好書一起讀(151):抽象和分層
人類想解決問題,但問題複雜,腦力有限,所以使用抽象。也就是說,抽象是一種工具,這工具的用途是幫助人類以有限的腦力解決複雜的問題。
人的思考能力有局限,大腦能同時處理的問題數量很少,但人面對的問題卻可以無限複雜,為了解決複雜的問題,必須重視主幹、捨棄細節,把一個複雜問題提煉為大腦能夠容納的有限個數的子問題,並給子問題取個名稱以方便理解和溝通,這就是抽象。
抽象是多層次的,越高層問題數量越少,粒度也越粗,越宏觀,越抽象,而越低層則數量越大,粒度越細,越微觀,越具體。在高層上思考問題,可以稱為戰略,在低層上思考問題,可以稱為戰術,在底層思考問題,可以稱為技術。韓信這種帶兵「多多益善」的指揮官,是跨層次人才,從技術到戰術到戰略樣樣擅長,是極難得的,所以叫「國士無雙」。
人類的活動,其本質是通過做出行為,讓世界從一個狀態變成另一個狀態,這就是所謂的改造世界。為了改造世界,首先要認識世界,即了解世界當前的狀態。這與計算機做的工作是完全一樣的。抽象這種工具,或者用於對狀態(數據)抽象,或者用於對行為(過程)抽象。對狀態抽象,目的是認識世界,世界太複雜,我們只能根據具體需要,選擇一個特定的抽象層次來獲得認知。對行為抽象,目的是改造世界,面對的任務太複雜,我們也只能根據具體需要,選擇一個特定的抽象層次來思考決策。
抽象大大降低了問題的複雜度,其理論往往是普適的。但簡化的代價就是丟失信息,普適的另一面就是不夠具體、不能直接用來解決問題,需要一個「落地」的過程。例如兵法講「正合奇勝」,這四個字是真理,而且極為普適,用到任何一個領域都能適用,但光會背這四個字顯然一場仗都打不贏,還需要知道更下層的知識。林彪元帥打仗常指揮到師,從野戰軍司令的工作內容層次看,這算是很細緻了,但從師長的層次看,他下的命令又是非常宏觀的,怎樣把命令變成具體的動作,需要師長及以下各級別指揮官的知識來填補。在程序設計里,這種由粗到細的任務細化,被稱為自頂向下的設計(如果是從具體到抽象,就是自底向上了),從整體到部分,從概括到細節,從宏觀到微觀,在解決每個問題時,認知負擔都較輕,只需要掌握本層和下一層的知識即可,這就是把過於複雜的問題拆分成一個個簡單的問題,使人類的能力足夠解決。在工程上,這也形成了分工和專註,所謂分工,就是不同問題交給不同人處理,所謂專註,就是每個人只負責一類問題,這就是高內聚低耦合的思想在社會運轉中的應用,其效果是非常顯著的,大大提高了生產率,這也是管理學上的經典案例。
對事物的抽象,減輕了認知負擔,簡化了問題,其代價就是丟失了信息,抽象出的結果,必然是失真的——例如近期阿爾法狗用輝煌的戰績證明了人類的所謂棋感有其偏差之處,但只要這樣做划算,就不能因噎廢食。這正如經驗和歸納得出的信息不能保真,但人總需要有個認識來幫助做事,有時候我們可以接受我們對世界的認識不那麼的真,只要這認識帶來的好處超過其失真的壞處,我們就願意用它。
這很功利主義,很重視實效,因為生產和生活本來就是實踐的過程,考慮的是應然問題(HOWTO)而不只是實然問題(WHAT IS),重視的是利益、價值、方法、策略、效率、成本、收益這些詞。常聽有人說「你說得太抽象了,不實際」,其實抽象的目的本來就是解決實際問題,而且每個人每時每刻都在抽象——有誰生活中在原子層面考慮問題嗎——只是不同人的抽象層次不同。如果高層次抽象不能落地,那固然是不能解決問題,還不如能解決問題的低層次抽象,但如果高層次抽象能落地,幫助解決問題,其解決問題的效果會遠遠好於只使用低層次抽象的方式。理論和實踐要結合,不要只顧理論變成教條主義,也不要仇視理論變成經驗主義,這兩者都是毛澤東同志早就批判過的。
務虛和務實要結合起來。會抓脈絡,才能提綱挈領,精通細節,才能掌上觀文。高層次抽象和低層次抽象並不天然抵觸,相反對任何一者的理解都有助於對另一者更好的理解。理解了高層次抽象,有助於在研究低層次抽象時有位置感,知道自己當前所處於問題的哪個局部。理解了低層次抽象,則有助於在進行高層次抽象思考時,理解底層原理,從而做出更好的思考和判斷。
高談闊論、以空對空固然不好,但只在底層思考,也有蒙眼拉磨的風險。能上能下、多多益善是最好,但如果才具一般,能力只能勝任某層之內的工作,至少也該對其他各層略有了解,以知道自己所做的工作其意義為何,而不是解決了任務領到薪水就心滿意足。畢竟,我們除了有某一崗位的職務,還有做為一個有血有肉的人的身份,我們有求知慾並渴望進步,因為只有進步能讓人感到幸福,而進步,意味著對世界擁有更透徹的認知,這些認知,讓我們充滿喜悅。
推薦閱讀:
※go語言 reflect: Call with too few input arguments?
※你希望 Go 2 有哪些改善和新特性?
※R語言第一戰之數據結構初體驗
※小鳥的live——畫畫與編程
※大家閱讀過的編程經典書籍有哪些?