前言
一位应聘者 (interviewee) 在我面前写下了这样的几行程序:
while (true) {
if (busy) i++;
else
}
然后就陷入了沉思,良久,她问道:那else 怎么办?怎么能让电脑不做事情?
我说:对呀,怎么才能让电脑闲下来?你平时上课,玩电脑的时候有没有想过?这样吧,你可以上网查查资料。
她很快地在搜索引擎中输入“50% CPU 占用率”等关键字,但是搜索并没有返回什么有用的结果。
在她忙着搜索的时候,我又看了一遍她的简历,从简历上可以看到她的成绩不错,她学习了很多程序设计语言,也研究过“设计模式”、“架构”、“ SOA”等,她对Windows、Linux 也很熟悉。我的面试问题是:“如何写一个短小的程序,让Windows的任务管理器显示CPU 占用率保持为50%?”这位应聘者尝试了一些方法,但是始终没有写出一个完整的程序。 面试的时间到了,她看起来比较遗憾,我也一样,因为我还有一系列的后续问题没有机会问她:
· 如何能通过命令行参数,让CPU 的使用率在保持任意位置, 如90%?
· 如何能让CPU 的使用率表现为一条正弦曲线?
· 如果你的电脑是双核(dual-core),那你的程序会有什么样的结果?为什么?
作为面试者,我最希望看到应聘者能给出独具匠心的回答,这样我也能从中学到一些“妙招”。遗憾的是看到“妙招”的时候并不多。 自从2005年回到微软亚洲研究院担任开发经理一职以来,我面试过不少应聘者,也为微软校园招聘出过考题,做过员工和实习生的培训。微软的入职考试和面试一直是计算机专业的学生关注的话题。我也了解到不少同学认为软件开发的工作没意思,是“IT 民工”、“软件蓝领”。我和其他同事也听到一些抱怨,说一些高校计算机科学的教育只停留在原理,而忽视了对计算机原理和技术的理解和运用。
写程序真的没有意思?为什么许多微软的员工乐此不疲? 我和一些喜欢编程的员工和实习生编了这本书,这本书想通过分析微软面试中经常出现的题目,来展示编程的乐趣,体会编程之美。编程的乐趣在于探索,而不是在于背答案。面试的过程就是展现分析能力、探索能力的过程,在面试中展现的巧妙的思路,简明的算法,严谨的数学分析就是编程之美。
还有不少同学问:“你们是不是有面试题库?”言下之意是每个应聘者都是从“库”中抽出一道题目,如果答对了,就中了,如果答错了,就bye-bye 了。书中的一些关于面试的问答,能回答这样一些疑惑。
本书的题目,一部分来源于各位作者平时自己的实践,例如有一次一位面试者滔滔不绝地讲述自己如何在某大型项目中进行CPU压力测试,我一边听一边琢磨,后来就有了上面提到的“CPU使用率”的面试题。有些题目在网上流传较广,但是能得到正解的不多, 我们加上了详细的分析。有些题目在一些教科书和专业书籍中有更完整的分析和解答,读者可以参考。
书中的大多数题目都能在四十五分钟左右内解决,这也是微软一次技术面试的时间。 本书不是一个“答案汇编”,很多题目并没有给出完整的答案,有些题目还有更多的问题要读者去解答。这是这本书和其他书籍不一样的地方。 面试不是闭卷考试,如果大家都背好了“井盖为什么是圆的”的答案来面试,但是却不会变通,那结果肯定是令人失望的。
由于我们的水平有限,书中收录的题目并不能代表程序设计各个方面的最新进展,不少解法都可能有漏洞或错误,希望广大读者能给我们指正。我们计划在微软亚洲研究院的门户网站( www.msra.cn) 上开辟专栏和读者交流。
本书的内容分为下面几个部分:
Ø 实际问题:编程的目的在于解决一个个实际问题。这一部分列举了作者们在实际工作中碰到的有趣问题,并且加以分析和总结。希望其中化繁为简的有趣思路能够对读者解决其它复杂问题有所帮助。
Ø 字符串和常用数据结构问题:对字符以及常用数据结构的处理几乎是每个程序中必然会涉及到的问题,这一部分汇集了常用的对字符串以及链表、栈、队列以及树等操作的题目。
Ø 数字问题:编程的过程实际上就是和数字以及字符的打交道的过程。如何提高掌控这些数字和字符的能力对提高编程能力至关重要。这一部分收集了一些好玩的对数字进行处理的题目。
Ø 数学问题:书中还列了一些不需要写具体程序的数学问题,但是其中显示的原理和解决问题的思路对于提高程序设计水平是很重要的,我们把它们单独列出。
Ø 关于笔试,面试,职业选择的一些问答,书中提到的问题都可能在面试中碰到,微软的笔试和面试又是很多学生关心的内容,因此我们把一些相关的介绍和讨论也收录了进来。
我们希望《编程之美》的读者是:
1. 计算机系、软件学院或相关专业的大学生、研究生,可以把这本书当作一个习题集。
2. 面临求职面试的IT从业人员,不妨把这本书当作“面试真题”,演练一下。
3. 编程爱好者,可以平时随便翻翻,重温数学和编程技能,开拓思路,享受思考的乐趣。
《编程之美》由下面几位作者协同完成,如果把这本书比作一个软件项目,它有下面的各个阶段,每个阶段有不同的目标和角色:
1. 构想阶段:邹欣
2. 计划阶段:邹欣,刘铁锋,莫瑜。
3. 实现阶段/里程碑(一):上述全部人员,加上李东,张晓,陈远,高霖 (负责封面设计)。
4. 实现阶段/里程碑(二): 上述全部人员,加上梁举,胡睿。
5. 稳定阶段:上述全部人员,加上博文视点的编辑们。
6. 发布阶段:邹欣,刘铁锋,和博文视点的编辑们。
这本书从2007年2月构思,到2007年11月底交出完整的第一稿,花费的时间比每一个人预想的要长得多,一方面是大家都有日常的工作和学习任务要完成;更重要的是,美的创造和提炼,是一个漫长和痛苦的过程。要把“编程之美”表达出来,不是一件容易的事,需要创造力、想象力和持久的艰苦劳作。就像沈向洋博士经常讲的一句话——Nothing replaces hard work。
这本书的各位作者,都是利用自己的业余时间参与这个项目,他们的创造力、热情、执着和专业精神让这本书从一个模糊的构想变成了现实。 通过这次合作,我从他们那里学到了很多,借此机会,对所有参与这个项目的同仁们说一声: 谢谢!
在本书编写过程中,作者们得到了许多微软亚洲研究院的同事和实习生的帮助,具体请参见“致谢”。
我们希望书中展现的题目和分析,能像海滩上美丽的石子和漂亮的贝壳那样,反映出造化之美,编程之美。
邹欣
2007.11.26
北京 微软亚洲研究院