文:邹欣
每年有许多大学生申请到微软亚洲研究院实习或工作,很多同学问:研究院选择实习生和员工的标准是什么?我要如何准备,才能进入研究院,才能做出很好的成绩?沈向洋院长把好实习生和员工的标准归纳为“三好”:即数学好,编程好,态度好。下面我谈谈我粗浅的理解,和大家探讨:
(邹欣与实习生们一起讨论问题)
一.数学好
数学是一切自然科学的基础,计算机科学和数学的各门分支都有紧密的联系。没有一个坚实的数学基础,是很难做出很好的研究。我想很多同学一看到这个要求,就会摇头,说:“完了,我大学里数学考得不好。”我觉得这里讲的“好”,并不完全决定于考试的分数,或者说碰巧学了某一门数学课,能背得出某一个公式。我们更看重的是能否运用数学这一工具,去分析问题,解决问题。另一个重要的能力是学习,特别是自学的能力,当你发现在研究中需要一些你并不熟悉的数学知识,怎么办?要靠自己学习,这里没有任课老师给你布置作业,规定哪些部分是在考试范围内,哪些是在考试范围外。你要自己学习,问问题(这里有很多数学‘牛人’会帮助你),然后把学到的知识运用到研究实践中去。
二.编程好
由于我在大学的时候学的是软件专业,后来在工作中写了比较多的程序。因此我对这一点有比较多的体会。一提到编程,很多同学也有很多问题,比如:
“我学的是Java,这个是不是比C# 好?”,
“我学了VB ,asp.net, 正在学C,到底要学多少才够?”,
“我的计算机专业课分数不高,但是我很喜欢写程序,能来实习么?”
我觉得和上面的“数学好”类似,问题不在于你碰巧学了什么语言,或者考试的分数如何,关键在于你对于计算机的理解。程序设计语言,是用来控制计算机的动作。那一个语言的语句是如何最终控制了计算机的动作的呢?这就要牵涉到如何把语句变化成计算机能“懂”的命令——这是《编译原理》课上讲到的,计算机如何执行这些动作——这是《操作系统》的内容,程序到底能做什么,不能做什么,这是《形式语言与自动机》中要讲到的,我们怎样能高效地用程序来解决问题,这时《数据结构》、《算法》就很重要。真正掌握了这些知识,同学们就不会太担心“到底要学多少种语言”这样的问题了。
接下来,我猜大家很想问,又不是特别好意思问的,就是“你们面试都考些什么题?”“有没有传说中的题库?”,这个没有什么好保密的,我们没有所谓“题库”,我们一般问的都是基础的算法以及和实际相关的问题。有一次我面试一位同学,从简历上可以看到她的成绩非常好,她学习了很多语言,也研究过“设计模式”、“架构”等,她对Windows,Linux 也很熟悉。我的问题是:如何写一个短小的程序,让计算机的任务管理器显示CPU 占用率保持为50%?。
她考虑了很久,最后写了:
while (true)
if (busy) i++;
else
她问:那else 怎么办?怎么能让电脑不做事情?
我说:对呀,怎么才能让电脑闲下来?你可以上网查查资料。
她很快地在搜索引擎中输入“50% CPU 占用率”等关键字,但是没有返回任何结果(这篇文章出来之后,也许情况会好一点)。
电脑的CPU 是怎么被调度的?CPU 占用率是通过什么方法得到的?程序员如何能通过程序控制?要解决这个问题,需要上面提到的各个专业课的知识,更重要的是,在实践中学到的经验和技巧。
好的程序员的另一个标准是,能很快地学以致用。对于上面的问题,很多同学都能快速地查找MSDN,研究API,找到了不止一种正确而优美的解法。遗憾的是,上面提到的那位同学到面试结束时仍然停留在空白的else 那里。从我的观察来看,她似乎从来没访问过www.msdn.com网站。
总之,我们的程序面试没有传说中的那么神秘,都是简单,实际的问题。如果大家感兴趣,我想我们可以在这里分享更多的所谓“微软面试题”。下面是一个实习生写的程序的结果,他用不多的代码,让CPU 的占用率呈现出一个优美的正弦曲线:
三.态度好
态度好,这个“好”的定义有时候相当主观,很多人会想到EQ,对于这个问题已经有很多精辟的论述,比如普林斯顿大学贡三元教授写的这一篇《青年人如何获得成功、自信与快乐》。我简单讲讲我观察到的成功的实习生的一些共性——好奇心和“我能做”的态度。
这个研究成果是怎么做出来的?这个游戏为什么这么让人着迷?计算机科学有无数的问题等着人们去问、去解答。好奇心驱使人们去刨根问底,发现隐藏在表面现象后面的真相,而不是想当然,人云亦云。有了好奇心还不够,还要有“我能做”的态度。临渊羡鱼之后,要有积极的态度回去织一张更大的网——我就要试试看,如果别人能做到,我为什么做不到,甚至做得更好?