在这节课里,我想通过对刷题、简历、面试这几方面的探讨,跟大家分享自己在面试准备过程中的切身体会和经验总结,希望能对大家有所帮助。
#### 刷题
刷题是必不可少的环节。
无论你是刚刚毕业的计算机系的学生,还是已经有了很多年工作经验的工程师,你即将要面对的是高强度的面试。每个公司平均都有好几轮技术面试,包括电话面试和现场面试,每轮面试的时间是 45 分钟到 1 个小时,除去聊天谈话的时间,每一轮留给你的时间大概就是 30 分钟,要能拿到优秀的结果,一般都必须解答出两个算法题,而你要面试的公司可能不止一家。那么,要让自己始终保持良好的水准,没有一个强化训练的辅助,你是很难过关的,因此刷题就是必不可少的环节。
但是在刷题之前,必须要先弄清楚一个问题:你要选择什么编程语言?
#### 选择编程语言
这往往取决于你的求职岗位是什么。
如果你要做一名前端的网络工程师,那么你必须要能熟练地用 JavaScript 去解算法题。如果你要做一名后端的工程师,那么可以选择的就很多了,其中 Java,Python 和 C++ 都是首选。如果你想要做一名数据分析工程师或者涉及机器学习和人工智能方向的,Pyhton 是不二选择。
我个人在刚开始刷题的时候用的是 Java,虽然我平时的工作并不用它,但是我发现,用 Java 刷题有几个好处。
1. Java 是强类型语言,它能帮助我更好地理解输入输出的要求,对于每个变量的类型我都要清楚。
2. Java 提供丰富的类库,比如 Deque、PriorityQueue、LinkedList、Stack 等,有了这些,我可以更加专注于对算法本身的思考,而不用考虑如何去实现这些数据结构。这些库拿来用就好,节省了我很多时间。
3. LeetCode 上的很多题目都有 Java 的解法,如果一道题目我做不出来,就会看看 LeetCode 的解法,比较方便。
后来我明确地知道自己要做一名前端的网络工程师,在决定跳槽去大厂的时候,不得不用 JavaScript 去重新刷题,这样一来,我浪费了不少时间。所以在选择语言的时候,多考虑自己的求职方向和岗位要求。我的方法是大量联系大厂的招聘专员,获取专业的建议。
**刷题方法
**
选择好了编程语言后,接下来要考虑的就是怎么合理地刷题了。
现在 LeetCode 上面有上千道题目,究竟要刷多少道题才行呢?其实最关键的不是量的问题,而是质的问题,而且由时间决定。
首先,根据自己平时的刷题速度,预留足够的刷题时间。
我在刷题的时候,会给自己至少三个月的时间专心刷题,周一到周五每晚分配 2 个小时,周末也会刷。有时候由于要兼顾工作,平时晚上没有太多时间,我就会多留点时间到周末,把平时没有刷的题在周末补回来。根据平时的刷题速度,我可以计算出在这三个月的时间内,自己能一共做多少题。
然后,刷题时可以有选择性地分类做题。
接下来,我按照 LeetCode 的题目分类去做。先做树的题目,然后是图论,因为图论可以看作是树的一种扩展,然后是递归、回溯,之后是 DFS、BFS,然后是动态规划,最后是字符串和数组。分类刷题有如下几个好处。
1. 能有效地巩固知识点。
2. 帮助整理解题的思路和归纳方法。
3. 能有效地提高解题的速度。
另外,要练习如何在白板上写代码。
很多大厂都要求你在白板上写代码,大家不要小看了这点,很多人都认为用电脑做了几百道题之后,还怕在白板上写代码么?在白板上写代码的感觉跟敲键盘是完全不同的,有几点需要注意。
1. 字迹要清晰。这样一来面试官才能很好地跟你探讨代码,更重要的是,面试官要记录下你写的代码,然后原封不动地递交给招聘委员会的成员或者其他人审核,如果因为字迹不清导致记录失真就很不好了。
2. 间距要把握好。有些白板并不大,要能够在一块小白板上挤下很多代码是不可能的,这就要看你如何规划代码的书写了,这些都要通过不断地练习。
3. 思路清晰。写白板,是你和面试官沟通的一个重要环节,你的任务是要清晰地展现自己的思路,将它们转变为代码,并且,你要确保面试官能跟上你的节奏。如果你东写一点函数,西写一点结构定义,那就会很凌乱。
锻炼写白板的能力,最好的方法就是找一块白板,在它上面练习。一般这个可以在你拥有了一定的刷题量的基础上进行,不必一开始就这样练习。另外,也可以在纸上练习,把纸想象成白板,也能达到很不错的效果,尤其对锻炼清晰的笔迹有很大的帮助。
为了避免遗忘,养成整理回顾的习惯。
刷题的时候,会出现一种情况,之前刷过的题目一下就忘记了。要克服这种情况的出现,我用下面的办法。
1. 周末的时候回顾一下这一周做过的题目,主要是整理思路。
2. 把这周里出现的难啃的题目单独拿出来,记录到难题笔记里,反复看。
3. 刷题的时候,尽量把思路理清,而不是记代码。
最后,一定要把自己刷过的题目和最好的解法写下来。
我的方法是写到 GitHub 上,这样可以帮助我反复查阅。如果大家有兴趣,可以到我的 GitHub 上看看我的 JavaScript 刷题详解,链接如下。
https://github.com/jeantimex/javascript-problems-and-solutions
以上就是我对刷题的一些经验。
#### 简历
简历就是你的门面,好的简历能让你在众多的求职者中脱颖而出。很多公司的职位都是很有限的,如果招聘人员能够快速准确地从你的简历里找出他们想要的东西,比如你的技术,经验,或者研究成果等,那么你就会有更大地机会进入到面试的环节,另外,最重要的一点,想一想你为了能面试这家公司,付出了那么多的心血去刷题,最后因为简历没能被看上而与机会失之交臂,那是多么多么的不应该啊!可以说,好的简历是打开面试机会的大门。
* [ ] 怎么样去写好一份简历呢?
一、要有针对性
你的简历必须要凸显出你才是适合这个职务的不二人选。
每个职务的招聘一般都会有一些基本的要求,比如某个职务要招的是前端网络工程师,要求有 5 年以上的工作经验,精通 JavaScript,HTML5,CSS3,熟悉 React 框架等,那么你的简历必须要想办法体现出你能满足上面的基本要求。
可以通过你的工作履历表来体现出你有 5 年以上的工作经验,通过罗列出与前端相关的技术名词作为你所拥有和掌握的技术来体现你适合这个岗位的技术需求。有些人既懂得 Java,SQL,也懂得 JavaScript,但是在简历当中却把 JavaScript 罗列在了后面,有时候会让人觉得 JavaScript 也许并不是你的强项,也许你更适合做后端的工程师。换句话说,你的简历必须要能投其所好。
二、写好工作履历
招聘人员会把大部分时间花在阅读你的工作履历上。对于一个要谋求软件工程师职务的人的简历,必须要做到以下几点。
1. 对于以往的每一份工作,都必须写明公司的名称,起始时间和终止时间。
2. 针对每份工作,言简意赅地罗列出自己做过的项目,以及你在项目中扮演的角色。
3. 最好能体现出每个项目最终的结果以及所带来的影响。
在罗列项目的时候,最好能写明,你在这个项目中扮演的角色是什么,采用了什么样架构,使用了什么编程语言,解决了什么问题,达到了什么效果或者产生了什么样的影响。
三、控制页数
大厂的招聘人员,一般都会在每天分配出固定的时间来审阅大量的简历,你的简历一般都是以电子版的形式存储在系统中,招聘人员通过关键字搜索来找出合适的简历,然后加以阅读。通常,你的简历最好不要超过两页,最好能控制在一页。
#### 面试
当你拿到面试通知的时候,离成功就差最后一步了,只需要你在面试中好好表现,发挥出你的水平。
面试不光是脑力活,同时也是体力活,如何让你的脑力和体力都能跟上高强度的大厂技术面试呢?一种比较行之有效的方法就是多拿一些中小型公司练手。
中小型公司有时候比较倾向于考察你的经验,这是一个锻炼你跟面试官交流经验的绝佳机会,更重要的是,通过这些练手,能让你更好地梳理自己的技术经验,总结出适合你自己的交谈风格,这样,当你在大厂里被问到工作经验相关的问题时,就能脱口而出,而且条理清晰,这些其实跟刷题一样,都是要通过不断地练习的。
另外,中小型公司也会考察算法题,但是难度一般来说不会特别难,这是一个检验你算法和数据结构知识水平以及能不能写出高质量代码的难得的训练机会。有些中小型公司的技术面试也是出了名的难,如果你在这些面试中失败了,这是好事,你要从中吸取教训,把答得不好的题反复思考一下,在哪里跌倒就在哪里爬起来。
总之,通过一些真刀真枪地实战,可以帮助你迅速地调整面试的状态,记住,你的最终目标是你心仪的公司,不要被中间的一两个失利的战斗影响到自己,找出问题所在,为下一个面试做好准备。
下面我想说一下现场面试,现场面试真正要考察的是下面几个方面。
1. 你的技术水平够不够硬。
也就是说,你能不能在 30 分钟之类写出一道简单的题目以及一道中等甚至更难的题目。如果你的知识点不够牢固,写题的速度不够快,是非常难过这关的。但是,只要你努力刷题,一定会有好的结果。
2. 你分析问题的能力。
当面试官给你出问题的时候,他最希望的,并不是看到你拿到题目立即写出答案,而是希望你能跟他交流,把你的想法说明白。就好比你和面试官是同事,你们在一起讨论问题一样,只不过他对这个问题早已有了自己的想法,他想听听你的意见,说不定你的方法更好。
3. 你将思想变为代码的能力。
如果你和面试官的交流过程中,能始终呈现出一种状态,迅速地将自己的思考转变为代码,然后清晰地写在白板上。就算你不能完美地写出一道题目的答案,我相信面试官也一定会满意的,因为这要比那些只能夸夸其谈而写不出代码的人要强太多。
4. 检查和分析代码的能力。
一般在你写出了代码后,面试官会让你举几种情况来考虑看看你的算法是否行得通。最好的做法就是你自己要主动地提出来,然后给出几个比较有代表性的测试输入,然后过一遍你的程序,分析出结果。最后,一定要去分析一下时间和空间复杂度。
以上就是我的一些面试经验。
#### 结语
到这里,我们的算法课正式结束。老话说,“书山有路勤为径,学海无涯苦作舟“,衷心地祝大家都能如愿以偿,找到自己最喜欢的工作!