这篇来其他书本,我在书上看见的!
程序员的核心技能是短期记忆力 (short term memory [wikipedia] - Short-term memory is the capacity for holding a small amount of information in mind in an active, readily available state for a short period of time.),这也是区别一个优秀程序员和普通程序员的重要指标。
程序员需要学习很多新东西:程序语言的原理、语法、基本库和框架的了解,以及领域知识等等;还要在工作中积累包括程序架构上、工程上、工作方法上的各种经验。但是我觉得这些都不是核心,如果把一个程序员比作一台计算机,上面提到的东西都是数据,都是可以录入的(或许录入速度有快慢之分);而衡量一台计算机的优劣,真正关键的是处理能力的参数,例如处理器的主频和内存的大小等等,这些硬件指标映射到程序员身上代表着什么呢?对于程序员来说,一定有一些核心的思维能力起到决定性作用,换句话说,如果把智商看作一个多维向量,其中一定有某一个或一些维度是对程序员是至关重要的。
程序员在编写代码的时候,要在头脑中构建好一个程序的模型,包括数据结构和算法,再把这个模型转化成代码。在此过程中,这个模型一直存于头脑的短期记忆中,并且可能需要不时地刷新。一旦受到外界干扰,这个模型就可能消失,必须花很大力气重新加载,有人把这个模型比作纸牌屋,因为它实在太容易坍塌。所以程序员编程的时候都很怕干扰,因为一旦受到中断,再次恢复原来的工作效率需要一段预热的时间。更加困难的地方在于,这个模型并不是静态的,它是会随时间演变的,程序员要经常思考程序执行的过程(用自己的大脑扮演CPU的角色),根据不同的条件对模型作出变更。编程序这个脑力劳动,其实就是在大脑的易失存储中,维护和完善一个具有时间和空间维度的模型的过程。
所以我猜想,一个合格的程序员和其他脑力劳动者的一个主要区别可能就在短期记忆这一块:或者程序员的短期记忆空间较大(一般人是 7+2/-2样东西,但程序员有时需要把一个庞大的系统放在脑子里),或者短期记忆维持时间较长(写代码常常是连续多个小时的工作,在这样长的时间里在脑中维持一个模型是很耗费能量的),或者这块记忆体的读写速率高(优秀的程序员想到一个问题时,能很快定位到程序模型中的具体位置)。当然,这些纯属猜测,需要心理学的实验来证明。
我最近读了Coders At Work,这是一本国际上最顶尖的15位程序员(或者叫大师)的访谈录,看完以后,我发现这些人有一个特点,就是都对软件工程的某些方法(比如设计模式等)嗤之以鼻。我觉得这不是巧合,软件工程的一些方法就是为了让各种水平参差不齐的的程序员都能理解复杂的代码,以便他们能在一个软件项目中合作。我们采用各种抽象方法(面向对象、设计模式等等)来降低每个代码单位的复杂性,就是为了让每一个这样的单位(类,对象等)都能装载到我们的短期记忆中而不溢出。而对于那些大师,这些抽象毫无必要,他们能把一大块程序载入大脑,理解得清清楚楚,摆弄地游刃有余。在我看来,他们和普通人的差异就在这里。
当然,也有人说过脑子笨的程序员才能成为好程序员,因为他们短期记忆小,所以不会写那种上百行的函数(spaggetti code),代码的模块性自然都比较好。这里的“好程序员”,应该指的是软件项目里的模范代码工人,而不是Coders At Work中那些天赋异秉的大神们,而软件业要发展,可能还是要靠这些有着超强存储能力的大脑吧。