微软亚洲研究院创新工程中心的开发经理邹欣讲述他在招收实习生过程中的体会。邹欣于1991年获得北京大学计算机软件学士学位,随后去美国韦恩州立大学留学并获得计算机硕士学位。毕业后加入微软公司参与了Outlook, Visual Studio Team System等重要产品的开发工作。他精心筹备、出版了《移山之道——VSTS软件开发指南》第1版&第2版、《编程之美——微软技术面试心得》。下面让我们一起来看看邹欣对“三好”实习生的理解。

文:邹欣 

       每年有许多大学生申请到微软亚洲研究院实习或工作,很多同学问:研究院选择实习生和员工的标准是什么?我要如何准备,才能进入研究院,才能做出很好的成绩?沈向洋院长把好实习生和员工的标准归纳为“三好”:即数学好,编程好,态度好。下面我谈谈我粗浅的理解,和大家探讨:
(邹欣与实习生们一起讨论问题)

一.数学好

       数学是一切自然科学的基础,计算机科学和数学的各门分支都有紧密的联系。没有一个坚实的数学基础,是很难做出很好的研究。我想很多同学一看到这个要求,就会摇头,说:“完了,我大学里数学考得不好。”我觉得这里讲的“好”,并不完全决定于考试的分数,或者说碰巧学了某一门数学课,能背得出某一个公式。我们更看重的是能否运用数学这一工具,去分析问题,解决问题。另一个重要的能力是学习,特别是自学的能力,当你发现在研究中需要一些你并不熟悉的数学知识,怎么办?要靠自己学习,这里没有任课老师给你布置作业,规定哪些部分是在考试范围内,哪些是在考试范围外。你要自己学习,问问题(这里有很多数学‘牛人’会帮助你),然后把学到的知识运用到研究实践中去。

二.编程好

       由于我在大学的时候学的是软件专业,后来在工作中写了比较多的程序。因此我对这一点有比较多的体会。一提到编程,很多同学也有很多问题,比如:
我学的是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,对于这个问题已经有很多精辟的论述,比如普林斯顿大学贡三元教授写的这一篇《青年人如何获得成功、自信与快乐》。我简单讲讲我观察到的成功的实习生的一些共性——好奇心和“我能做”的态度。
       这个研究成果是怎么做出来的?这个游戏为什么这么让人着迷?计算机科学有无数的问题等着人们去问、去解答。好奇心驱使人们去刨根问底,发现隐藏在表面现象后面的真相,而不是想当然,人云亦云。有了好奇心还不够,还要有“我能做”的态度。临渊羡鱼之后,要有积极的态度回去织一张更大的网——我就要试试看,如果别人能做到,我为什么做不到,甚至做得更好?