技术面试策略:假如只有一月/一周/一日/一时怎么办?北大学霸为你量身定制了几款,看看哪款适合你?
海上千帆竞发,我们该如何准备渡海,到达彼岸?
今年的互联网校招已经开始一个月有余,各大小门派招兵买马的宣传已经如火如荼,各类网申、笔试、面试等等也已经提上日程。在技术面试陆续到来的时候,根据拥有的时间资源,安排合理的日程,选择高效的方式来准备面试是非常有必要的。这里分享一下关于如何准备校招技术面试的个人经验,总体思路可以总结为:在时间充裕的情况下,考虑系统性;而在时间紧迫的时候,强调针对性。说得顺口直白一些,那就是「长线钓大鱼,临时抱佛脚」。
一、如果我还有一个月时间,我该如何准备技术面试?
一个月的时间,对于准备面试来说不算短也不算长,但是操作空间还是有的。当然也可以选择先玩个 20 多天,在还剩一周时间的时候再开始准备。不过,在时间还比较多的情况下,更系统性的进行准备,拥有更大的概率成就一个更好的选择。
技术面试的覆盖范围,包括简历项目经历、计算机基础知识、编程语言基础知识、数据结构与算法、系统设计以及陪面试官「谈人生」。下面分开论述。
简历项目经历
这一部分,可以放到最后一周进行准备,并且这一部分事实上会在不断面试的过程中得到练习:可能刚开始的几次面试,项目经历说得磕磕绊绊,但是身经百战之后变得越来越熟练,前期说项目的实战经验让我们能够充分了解面试官的关注重点以及可能提出的问题。这种情况同样适用于「谈人生」类的问答。
因而,系统性准备技术面试的主要关注点在于计算机及编程语言基础知识、数据结构与算法、系统设计三大方面。在此强烈推荐可以读一读《 Cracking the code interview 》这本书。作为广为人知、被学子们推崇备至的经典书籍,近年还出了中文翻译版《程序员面试金典》。而它之所以能够成为经典的内在原因是,这本书前半部分系统地总结了技术面试流程、面试的幕后决策、面试前的准备工作、对面试结果的处理等内容,使得技术面试的「软」技巧变得有迹可循;而后半部分归类整理了一些知名公司的面试真题,数量虽不多但基本覆盖全了所有的面试题类型,给出了技术面试题的综合概览,可以作为准备计算机及编程语言基础知识、数据结构与算法、系统设计这三方面内容的提纲。
计算机及编程语言基础知识
计算机基础知识的准备,更多有用的内容来源于课程学习过程中的积累,这让我们在写代码解决问题的时候,能够站在计算机系统的层面来考虑处理器、Cache、内存、通信等的细节,以更好地完成任务或者进行性能调优。同样,编程语言知识的准备,往往来源于平日做项目过程中编程经验的积累,写代码踩坑是从熟悉、掌握到精通一门编程语言的必需过程。但是可以说是幸运也可以说是不幸,技术面试的考察点并不完全在于此。幸在于,这让我们有空间去进行更节省时间的应试化准备,基础不好或者专业并不是计算机科学的同学,也能够在短时间内得到临时抱佛脚提高的机会;不幸在于,这让我们必须去进行应试化的准备。
应试化准备的针对点,可以从往年的面经中获得。比如某杭州游戏大厂和大鹅厂在面试中会涉及许多 C/C++ 语言知识,并且大鹅厂还特别热衷于经典七层网络协议栈、TCP 三次握手四次挥手等等网络方面基础知识。此外继承、多态等面向对象的语言特性,单例、工厂等设计模式,线程安全,Map、Set 等容器的底层实现方式,操作系统进程调度策略等等基础知识的考察,也成为各公司以往面经中的常客。
数据结构与算法
这部分的准备,就是传说中的「刷题」。在线刷题的网站现在有许多,像最知名的 LeetCode 等等,已经将面试题按照难度、类型进行了分类。刷题的目的,不是去记代码,去背下来某个具体题目最优的方法是什么,而是去训练自己思考分析、从相似问题迁移、甚至是暂时找不到最优方法但可以使用怎样的基础方法等等解决问题的能力。刷题的时候常常问自己以下问题:
相似的问题是否见过?
它的最优算法是什么,可否用于这个题目中?
题目给出了哪些条件?
是否都充分使用了这些条件?
最朴素算法中存在哪些冗余的计算?
在时间充裕的情况下,刷题可以做到三种境界。
第一种境界:最优。找到最优的算法解决问题。可以先按照自己的思路解题,在做完或者没有思路的时候点开题目的讨论区,找到最优算法读懂并独立实现一遍。
第二种境界:无错。写出没有 BUG 的代码。可以尝试使用只提供缩进的文本编辑工具写代码,完成之后复制粘贴到IDE 中,检查是否存在错误。
第三种境界:完美。达到优美规范的代码风格,并尽可能地避免写代码过程中对代码的修改。因为有些时候面试是要在纸上或者白板上写代码的,良好的代码风格和没有涂涂划划修改的整洁纸面可以帮助面试官更好地理解你的算法思路,并留下更好的印象。
这三种境界的刷题,可以通过刷多遍来逐渐达到。所以,那些学霸大神经常说自己要面试了 LeetCode 还没刷完,实际上可能说的是 LeetCode 第三遍还没刷完。
系统设计
这部分的准备,一方面可以了解一些经典系统,另一方面可以参考往年的面经中都涉及了哪些内容。比如分布式存储、分布式消息同步、消息队列、索引表等等拥有经典解决方案的系统,都可以摇身一变成为一道系统设计题。积累一些经典系统设计的思路,能够带给我们发挥聪明才智去解决面试中系统设计题目的操作空间。
在准备面试的过程中,和同样在准备面试的小伙伴之间的交流是非常重要的。交流包括共享申请投递内推信息、分享面经、讨论疑难面试题等等。一些同学,特别喜欢藏着掖着自己了解到的各种信息,而又热衷于向别人打听各种小道消息和经验。当然,校招的竞争确实激烈,个人的权衡取舍也无可厚非,这也只是个人行为方式的一种选择,但是,别人也有权利选择对这种行为方式的态度。互联网的精神在于开放与共享,靠着不对称的信息挣钱那是金融活动信奉的准则。个人觉得对于准备进入互联网技术行业的人来说,希望还是更多地抱着一颗开放共享的心吧。
二、如果现在剩一周时间,我该如何准备技术面试?
一周的时间对于准备技术面试来说,是显得有些捉襟见肘的。因而,在时间有限不能做完所有事情的条件下,这一阶段准备面试的关键词是针对知识体系薄弱环节,有的放矢,各个击破。
首先,复习简历上的项目经历。可以围绕以下问题来准备项目经历环节:
如何用一句话描述这个项目?它解决了一个什么样的问题?
在这个项目之前是否存在这个问题?
当时是怎样解决的,现在的解决方案优秀在何处?
自己参与了这个项目的什么部分?
使用了什么方法,为什么考虑使用这个方法?
是否有可替代的方法?
各个方法的优缺点是什么?
参与的部分存在什么样的难点,是如何解决的?
团队协作方面是否存在问题,是如何处理的?
是否有可以演示的 demo ?
可以把这些一条一条一一列出,到时候面试官怎么问都不虚。
其次,整理一些经典算法。比如排序、二分检索、树的各种遍历、字符串相关算法、图相关算法等等。对于自己熟悉程度不那么高的算法,试着在纸上写一写。
再次,多刷面经。对于面经上的问题,尝试完整地思考并解决一遍,并限制自己的用时。对于不确定的基础知识点,查书找到相关的内容;对于熟悉程度欠缺的算法题,在刷题平台上找到相关类型的题目刷一下。
最后,伙伴之间模拟面试。有一句话说的好,「纸上得来终觉浅,绝知此事要躬行」。作为模拟面试者时,体会在限时情况下,在纸上写出正确的代码,并有效地解释清楚自己的思路;作为模拟面试官时,体会选择面试题、给出提示、阅读代码等一系列过程中面试官的思路,并且在模拟面试结束之后告诉对方面试过程中值得改善的地方,并且自己也引以为戒。模拟面试不需要选择很难的面试题,但是流程一定要规范,控制好时间,排除各种干扰。从个人体会看来,模拟面试是最有效准备面试的方法之一。这也是在准备面试的过程中,和小伙伴交流的方式之一。
三、如果明天要面试了,今天我该如何准备?
在面试安排较为密集的时候(一般是在九月到十一月之间),往往一周有好几场面试,这是对连续作战能力的考验,也需要我们在不同的公司之间快速切换思路。一天的时间,已经足够我们用来针对性的准备特定公司高概率考察的内容。这种做法比较投机,但是在很多时候是相当有效的。
可以找到特定公司的往年面经,进行针对性准备。此外,公司面试总有先后,也可以找先面试的小伙伴咨询,获得面试的题目。这要求大家拥有足够的开放与共享精神,并且自己在作为「先面试」的角色的时候,也要能够乐于分享经验。从概率上来说,一个人在投递的许多公司中不可能总是「先面」或者总是「后面」,做到「我为人人」,自然就有「人人为我」。
另外,可以尝试刷几道水题,或者手写个简单的算法代码来缓解一下紧张的心情。保持一个良好的心态,比熬夜多看几个知识点,可能是更加重要的。
四、如果我正在赶去面试的路上,还有一小时面试开始?
难道说,状态不好,撤退?
当然不是。此时只需要相信自己。稳住,我们能赢。
什么,还没稳住?那就听听下面这首歌吧
好了,这次的分享就到这里,欢迎大家订阅「技艺丛谈」,阅读后续精彩分享。正如上文所说,互联网的精神在于开放与共享,如果大家觉得本文有帮助,欢迎转发分享给其他需要的同学。
以下是北大学霸的几篇面经,以及久经沙场的面试官的面试经验分享,欢迎点击阅读。
☞实习与校招全攻略 | 这一次,面试官和面试者搞了个深度对谈
假如你在实习中,或者计划实习,那么以下分享应该对你有帮助。
☞实习经验分享之一 | 在小公司,实习生和职场新人,学什么?怎么学?
☞实习经验分享之二 | 记我呆过的牛人密度最高的技术团队
题图:来自互联网
iOS和安卓用户终于在赞赏上和谐共处了