正文

manage complexity - 知識的表麵麵積 (surface area of knowledge)

(2015-01-05 12:00:39) 下一個
小馬哥的話題,重新開一個帖子 #13698
 
一直想寫一個 manage complexity 的係列,隻是還沒有到厚積薄發的程度,要寫也隻是趕鴨子上架。在思考 complexity 這個問題的時候,有一個想法我覺得很有意思,我把它叫做 surface area of knowledge。
 
所謂 surface area of knowledge,就是要理解一個問題,我需要多少 knowledge?需要 knowledge 的多少,往往跟這個問題在表層暴露出來的細節成正比。
 
有一次一個同事休假,他把自己做的一個 task 交代給我。他這個 task 有7個步驟,每一步還有細節。所以他這個 task,對我來說,surface area of knowledge 就很大。 
 
如果他寫一個 script,把他的這7個步驟寫進去,我到時候隻需要 push 一個 button,那麽他的事,對我來說,surface area of knowledge 就幾乎為0。
 

 
一個道理,說出來了大家都同意,但是到了實際問題,大家又反其道而行之,為什麽?我覺得還是因為大家沒有真正體會出這個道理。
 
我做 Java,每到一個新公司,都要寫一些非用不可的函數,比如把一個文件讀成 String[] 或者 Map<String, String>。有了這些函數,做這些常用事情需要的 surface area of knowledge 就會很小。沒有它們,你就需要熟悉很多IO class,很多 Exception class,以及正確的資源管理方法。這些看起來是小事,需要的 surface area of knowledge 其實很大。 
 
Java 雖說是一種高級語言,但是在很多方麵其實相當低級。Java 已經快20歲了,語言本身還是沒有這些層次高一些的函數,為什麽?我覺得整個Java行業都沒有深刻真正地體會到 surface area of knowledge 這個道理。 
 

 
找到了原因,問題就容易解決。減小 surface area of knowledge,辦法就是把細節包起來。design pattern 裏有一個 pattern 叫 facade,就是這個意思。
 
細節一般都是怎麽做,包起來就剩下了重點,那就是做什麽。用英文說,細節是 how,重點是 what。Java 讀文件的例子,what 是 file -> String[],剩下的都是 how to,都可以包起來藏起來。 
 
減小 surface area of knowledge, 有一個宏觀的 architecture 很有效,它的名字叫 layered architecture。layered 係統分好幾個層次,每一個層次把自己的細節(how to)包起來,為高一級的層次提供更抽象的詞匯(what)。英文有一個說法,叫 different level of abstraction,就是這個意思。
 
layered architecture,最著名的例子就是計算機網絡的7層 model。這7層裏,最低的一層是物理層麵,比如電子,光纖,無線電信號。最高級的一層是用戶層麵,比如互聯網的 HTTP。大家熟知的 IP address,在第三層。
 

 
係統的層次,是一個很重要的概念。人與人之間的溝通問題,往往都是因為爭論的雙方處在兩個不同的層次。一個"內行"嘲笑別人外行,往往是因為這個"內行"處在低級層次,把自己的層麵看得很重要,看不到或者不理解對方的那個高級層次,所以隻見樹木,不見森林。
 
surface area of knowledge 和層次論,不光宏觀上有用,微觀上也有用。即使是一個 Java class,好的碼工寫出來的,有層次感,理解任何一小塊需要的 knowledge 小。不好的碼工的代碼沒有層次,理解任何一小塊往往都需要讀懂整個 class。 
 
這兩個概念,對 manage complexity 也很重要。係統顯得複雜,往往是沒有分層次,或者把不同的層次攪和在一起了。小馬哥說他碰到架構問題一片混沌,沒有思路,可能也是因為沒有分層次,把注意力過早地集中到低級層次了。
 

 
我做麵試,喜歡問的一個問題是什麽是好code,什麽是壞code。我覺得好code,壞code,很多都可以從 surface area of knowledge 來解釋。
 
計算機軟件裏麵有一個很重要的概念,名字叫 coupling。所謂 coupling,就是把不相關的事情放在一起。A和B不相關,你把它們放在一起,做A的時候你也要理解B,憑空的就加大了 surface area of knowledge。
 
這個 coupling 的概念,也是很多人都不懂。我麵試別人的時候,這個也是經常問的問題之一,大部分人都答不好。
 
答不好,也就做不好。記得以前看BMO的code,有一個函數去後台拿股票的quote。這個函數從前台的web application,經過了無數個層次,到了後台最後一個層次,那個 HttpRequest 的參數仍然在。
 
這個HttpRequest,無端地加大了每一層的 surface area of knowledge。
 
有時候我經常想,這些人是怎麽通過麵試的?
[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.