正文

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)
评论
目前还没有任何评论
登录后才可评论.