微软中国每年都会举行几次技术笔试,2006年的笔试结束后,主持笔试的经理回答了学生提出的很多问题,小飞把这些问答整理如下
Q:我会C#、VB.NET,为什么微软的笔试时偏偏要求用C语言答题?
A:对于微软的工程师来说,C语言是基本功。
看起来好像很明智,“基本功”多么神圣的字眼。但是再从另一个角度看“C语言作为基本功”呢?Joel Spolsky的博客:
A very senior Microsoft developer who moved to Google told me that Google works and thinks at a higher level of abstraction than Microsoft. "Google uses Bayesian filtering the way Microsoft uses the if statement," he said.
...
If Microsoft doesn't shed this habit of "thinking in if statements" they're only going to fall further behind.
这也难怪,想想Microsoft是怎么发家的-- 把GUI硬塞进CPU慢的几乎跑不动内存少的几乎没有的破PC。不能不说这是一个杰作,要完成这样的杰作,C语言自然是要练到汇编的效率的。Google靠的是什么呢?MapReduce。MapReduce不是仅靠基本功扎实的C程序员想得出来的。Microsoft的搜索引擎如此suck,是和要求“C语言基本功”,源出于同一企业文化。
写到这里,我估计我已经被误解成C语言不行吃不到葡萄说葡萄酸了。天地良心,首先我深知“C语言 基本功”的意义,第二我也多多少少有一点基本功,我甚至还学习过《Writing Solid Code》这种如今已经不热门的东西。我真正的意思是:编程的要务,是尽量提高抽象级。好像考查“C语言基本功”的招聘题,除了C的语法、语义,这些基本的基本功,以及C的一些traps&pitfalls以外,很多的一类题就是sequence operation,比如写个memcpy、memmove什么的,然后为了增加难度,在“src和dst部分重叠时的行为”上搞出点花样,要不然就是binary search,quicksort(quicksort相当难哦,我记得前两年有人发现《Programming Pearls》里的quicksort有个bug,但是找了半天找不到那篇文章了)。不知道那些招聘的经理们意识到没有,当一个程序员写if-then-else和循环的时候,他已经犯下罪过了:
If-then-else makes a binary choice, which is fine when there are really exactly two cases to consider; but often there are more than two possibilities, in which case if-then-else imposes a kind of “Boolean bottleneck” that requires complex case analysis to be reduced to a tree of binary decisions. This decision tree then imposes an arbitrary time ordering of decisions that may not be relevant to the description of the computation.
Loops connote sequential execution of successive iterations, and furthermore rely on side effects in the loop body to make progress, making it difficult for a compiler to recognize potential parallelism.
--Guy Steele, Thoughts on language design, DDJ Jan 2006
也就是说如果程序员用C语言写程序,他只是写了一个解决方案,一个众多方案中并不高明的一个,而没有把问题本身写进程序。把问题本身写进程序有什么好处呢?编译器和执行环境看到他的问题,它们可以设法并行计算他的问题,把他的问题分一部分出去到网络上另外一台计算上分布计算,用GPU而不是CPU来算,甚至把他的问题简化后再计算,而这一切都不需要程序员的任何努力。听起来像科学幻象?过不了几年就会成为现实。
结论就是:C语言基本功很重要,但是在训练C语言能力的时候,不要让C代表的计算模型固定了我们思维。
update:
终于回忆起来了,原来是《Programming Pearls》 里的binary search有个bug:
http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html
相当雷人。