今天一口气面了六轮实习生,早上九点到下午四点,中间休息一小时,最大的感受是,面试别人要比自己参加面试累多了。六位选手各有特长,五名研究生,一名本科生,一个人曾经参加过ACM拿过奖牌,两位研究生做人工智能并发了顶会,本科生参加超算的比赛在美国刷新了全球记录,一位信安的学弟做渗透。总的来说,看完简历的时候压力山大。

具体面试细节就不提了,除了规避公司policy之外,也怕各位学弟挖到这篇文章。论事不论人,这里对今天的面试做个小结。

基本功很重要

基础扎实不扎实一眼就能看出来,常见的数据结构那么多,常见的算法也就那么多,对于应届生找实习,面试的算法题所要求的,不会超出教科书里的那些基本概念。很多时候如果没见过那些题,就算把常见的数据结构和算法依次试一遍,或多或少也能找到些灵感,不至于愣在一遍不知如何下手。对于在校生而言,做过的项目如果缺乏实战打磨,很多代码设计和编码质量都有待商榷。微软跟很多国内的公司不一样,我们更看重的是学生的理论基础是否扎实以及是否聪明,所以这一点上我并不反对面试考算法题。

边界条件检验

边界条件除了输入参数的合法性、有效性检验之外,还在于各种循环、判断语句的条件是否存在安全隐患。比如,循环语句是否一定有机会终止?每一次循环是否会修改标志参数?循环结束后的那个index是否合法?会不会越界?在数组中按index取值前会不会判断越界?整形相加会不会越界?条件判断是否准确并切入要害?

其实,更加清晰的代码结构以及合理的数据结构的使用,可以很大程度上规避各种越界和额外检查,这个需要实际工作中去积累。

借助可视化手段简化问题

这个是今天一位同学在想算法的时候画草图给我的启示,他用了一种我之前没有见过的算法,我想了一些edge case,也完全符合题目要求。后来我仔细想了其中的不同之处,发现借助图形可以更直观的展示出题目的本质考察点,发现其精髓。人的思维何尝又不是这样,很多问题的背后本质上都是想通的,掌握了这种透过问题看本质的技巧后,很多事情都能找到更彻底的解决方案。

刷题并不是完全没有用

对应届毕业生,刷题很重要。对95%的普通人,刷题很重要。数据结构和算法两门课,别抄作业。

我自己也刷题,虽然600+的leetcode刷到现在也还没能破100,但是刷到50题左右的时候感觉很多题目都有迹可循,如果每道题的代码都手写一遍,那基本的数据结构和常用的API都会牢记于心。

交流

交流很重要,不要蒙在一遍只顾着想思路和写代码。今天六轮面试中没有一位同学主动跟我说他是在如何考虑。