记得我刚开始从事软件开发工作的时候,当时的领导曾经给我推荐过一本很薄很经典的90年代的书,书名我已经记不起来了,讲的是微软开发小组里面的一些优秀的开发实践,如TRACE, ASSERT, bound check 的一些美妙之处,看后对我的编程风格有很深的影响,有些习惯可能一直延续至今。微软亚洲研究院的《编程之美》给我第一印象应该是这样一本书,然而看了几个小时之后,稍微觉得有点失望。一般程序员看后可能会对有些应试的用途,但对提升自身价值没有任何帮助。
也顺便说说我对开发人员能力如何衡量。
1. 90%以上公司需要的都是知识型人才,比重占70%,
拿Java来说
a) 基础知识类:如jdk, collection, thread, jdbc, jsp, servlet
b) 专业技术类,如Struts, Spring, Hibernate
2) 综合知识类,如TCP/IP, socket, linux, web service, xml, sql, ajax
2. 协作能力/EQ, 比重占20%
比如协作,沟通,态度,责任心,积极心等
3. IQ(智力题,数学题) 10%
这个很难衡量需要多少,按应用类型来说
a) 以功能为主的应用, 国内大部分是这种情况,开发就是怎样用程序来完成业务系统,这种类型知识面更重要
b) 以性能为主的应用, 如 nginx
c) 两者兼顾,如 mysql
b/c可能是对智力方面要求稍高,但我觉得任何一个数学能打80分以上的在1,2达到要求之后都可以胜任。
在大部分软件开发中,纯算法占的比例很少,甚至没有。一个有趣的现象就是《数据结构》(严蔚敏的那本经典教材不怎样)这本书大部分程序员只是在面试前阶段有机会看看,工作中根本没需要查阅。
比如Java中
常用数据结构:ArrayList, LinkList, Queue, Hashtable, HashSet
常用排序:SortedSet, SortedMap, TreeMap
数据结构中描述的那些东西基本上JDK都有了,对于Java程序员只要理解这些工具库的使用场合,能够使用恰当就非常合格了。
再讲个纯数学算法优化是否重要的问题,书中有例子,如2.10 寻找1个数组中最大值和最小值。这个题通常的解法的时间复杂度是2*N,实际上可以很容易优化到1.5*N。如果从一个产品的角度来考虑,如果一个程序员提交的代码复杂度是2*N, 我觉得这样就足够了。因为
1) 大部分应用的电脑CPU占用5%都不到
2) 这样纯算法的问题在目前大部分Web系统通常不会成为瓶颈,瓶颈通常在IO, 网络及架构设计及语言本身上。比如你用Ruby写,某个算法再优化可能也只有C语言效率的1/100
3) 产品负责人更关心代码质量,可维护性,可扩展性等方面。
4) 产品负责人更关心更关注知识型/经验型的层面,比如程序员原来用Java IO实现的,可能用Java NIO更合适。
可能上面这个例子是此书里面离开发最近的,大部分题目比这个离实际开发更远,比如“
数独”问题等,用来做做头脑游戏可能更适合。如果一个程序员花了1天,写出了一个构造数独的程序,他的能力就得到了提高吗?
后记中其中一个现任职于微软研究院的作者提到,“作为一个曾经的求职者,当时自己能够做的,就是搜集和整理能够在网络上搜刮到的所有题目。算法题、智力题以及各种面经。把各种题目做到让自己条件反射为止……(
原文)”。如果真是这样,我对微软亚洲研究院的这种“高考式”的面试方法表示担心。擅长做数学题和智力题跟能否够给软件企业和社会创造价值未必能划上等号。