左耳听风——笔记三:面试技巧

面试前做准备

学习了《程序员练级攻略》以后,我觉得你应该来学习一下“如何面试”了。在我的职业生涯中,我应聘过很多公司,小公司、中型公司、大公司、国内的公司、国外的公司都有。我有成功获得 offer 的经历,也有过不少失败的经历。

我从 2007 年做管理以来,面试过至少 1000 多人次的工程师。这十多年来,我发现有一些事情没什么变化,我们一代又一代的年轻人在应聘时的表现和我 20 年前没什么两样,连简历都没什么改进,更不要说程序员在表达能力方面的长进了。如果只看面试表现的话,感觉世界停止了 20 年似的。

我一直在想,为什么应聘、与人沟通、赚钱等这些重要的软技能,学校里不教呢?这么重要的技能居然要你自己去学,不得不说是教育上的一种失败。另外,关于如何应聘的事,估计你也看过一些文章了,我这里只分享一些我的实实在在的经验和相关的技巧。一定你和看过的不太一样。相信一定能帮得到你!

应聘是需要准备的,下面这些点你需要好好地准备一下。如果你没有准备的话,那么被 pass 掉的概率会非常大。

怎样写简历

首先你要准备的是简历。简历很重要,这是别人了解你的第一个地方,所以简历要好好写。当然,我们知道真正的好简历是要用自己的经历去写的,比如,有人的简历就是一句话:我发明了 Unix。

当然,并不是所有的人都有这样的经历,但这依然告诉我们,自己的经历才是简历最大的亮点。所以,你要去那些能让你的简历有更多含金量的公司工作,要做那些能让你的简历更闪亮的工作。这是写简历的最佳实践——用自己的经历聊,而不是用文字写。

但从另一方面来说,简历这个文本也是要好好写的,况且,我们不是每个人都会有很耀眼的经历,所以,还是要好好写简历。基本上来说,简历上的信息不要写太多,信息太多相当于没有信息,不要单纯地罗列,要突出自己的长处和技能。一般来说,简历需要包括以下几项内容。

  • 自我简介。这个自我简介是用最简单的话来说明自己的情况,不超过 200 字。比如:10+ 年的软件开发经验(说明你的主业),4+ 年的团队 leader 经验(说明你的领导力),擅长高可用高性能的分布式架构(说明你的专业和专攻),多年互联网和金融行业背景(说明你的行业背景),任职于 XXX 公司的 XX 职位(说明你的职业),负责 XXX 平台或系统(说明你的业务场景)……
  • 个人信息。这里有几点需要注意。
    • 基本信息。电子邮箱建议用 Gmail,千万不要用 QQ 邮箱,要让人感觉职业化一些。
    • 个人网站。如果你有个人主页、博客、GitHub 或是 Stack Overflow,请一定附上,这是加分项。如果个人主页或博客有独立域名,那更好,这会给人一种你爱动手做事的感觉。页面也要干净有美感,这样会让人感觉你有品味。
    • 网站内容。一般来说这些项都会被面试官点看浏览,所以,里面的内容你需要小心组织和呈现,千万不要造假。另外,除了技术上的一些知识总结(不要太初级,要有深度的、原理型的、刨根问底型的文章),你也可以秀一秀自己的技术价值观(比如,对代码整洁的追求,对一些技术热点事件的看法),这会让你更容易获得面试官的好感。面试官的好感很重要。
    • 作品展。如果你有一些作品展现,会更好。当然,对于前端程序员来说,这是比较容易的。而对于后端程序员来说,这会比较难一些,只能展示一下自己的 GitHub 了。如果你有一些比较不错的证书或奖项(如微软的认证、Oracle 的认证),也可以展示一下。
  • 个人技能。个人信息下面你应该罗列几条个人的技能。这些内容要能很明显地让对方了解你掌握的技术和熟悉的领域。
    • 技术技能栈。其中包括你擅长和会用的编程语言(如 Java、Go、Python 等),编程框架或一些重要的库(如 Spring Boot、Netty、React.js、gRPC 等),熟悉的一些技术软件(如 Redis、Kafka、Docker 等),设计或架构(如面向对象设计、分布式系统架构、异步编程、高性能调优等)。
    • 技术领域。前端、算法、机器学习、分布式、底层、数据库等。
    • 业务领域。一方面是行业领域,如金融、电商、电信等,另一方面是业务领域,如 CRM、支付、物流、商品等。
    • 经验和软技能。带过多少人的团队、有多少年的项目管理经验、学习能力如何、执行力怎么样、设计过什么样的系统。(不要太多,几句话就好)

其实和用人单位发布的招聘信息中的职位技能需求很相似。有时候我都在想,明明用人单位的职位需求里写成那样,为什么应聘人还不依葫芦画瓢呢?所以,对应于你的简历,如果能和职位需求看齐有相类似的描述,这样可以快速地让人觉得你和要应聘的职位很匹配

  • 工作经历和教育经历
    • 列一下你的工作经历。每份工作完成的主要项目(不要列一大堆项目,挑重要的),主要突出项目的难度、规模、挑战、职责,以及获得的认可和荣誉。
    • 工作经历和教育经历,主要是对上述的个人技能的印证。不要东拉西扯,要紧紧地围绕着你的技能、特长和亮点来展开。

一般来说,你简历中的内容最好控制在两页 A4 纸以内,最好有中英文版,简历不要是 Word 版的,最好是 PDF 版,然后简历的格式和风格请参考 LinkedIn 上的(在 微软的 Office 模板网站 上也能找到一些不错的简历模板)。简历的内容不要太多,内容太多,重点就不明显了。写简历的目的是呈现自己的特长、亮点和特点。只要你能呈现出 2-3 个亮点和特长,就可以吸引到人了。

简历只是一块敲门砖。一些热门的公司和项目能够吸引到很多很多人的简历,所以,你要在众多的简历中脱颖而出。除了自己的经历和能力有亮点外,你还需要有吸引用人单位的方法。

有很多公司都是 HR 先来筛一遍简历,HR 其实并不懂技术,她们只会看你的过往经历、能力是否和职位描述上的匹配。如果简历上的经历和技术亮点不足的话,那么你可以在简历的版式和形式的制作上花些心思,以及在简历的自我描述中加上一些“虚”的东西。

比如“工作态度积极,不分份内和份外的事,只要对公司和个人有利,都会努力做好;勤奋踏实,热爱学习,喜欢做一个全栈工程师;善于发现问题,并解决问题……”表示我虽然现在的经历和技能不足以打动你,但是我的态度端正,潜力巨大,你不能错过……

技术知识准备

一般来说,你的简历上写什么,面试官就会问什么,所以,不要打自己的脸,精通就是精通,熟悉就是熟悉,了解就是了解。然后对于你列出来的这些技术,你一定要把其最基本的技术细节给掌握了。面试官一般也会逐步加大问题的难度和深度,看看你到底在哪个层次上。所以,你还是需要系统地看看书,才能应对面试官的问题。比如:

  • 你写上了 Java,那么 Java 的基本语法都要了解,并发编程、NIO、JVM 等,你多少要有点儿了解,Spring、Netty 这些框架也要了解。
  • 你写上了 Go,那么至少得把官网上的 Effective Go 给看了。
  • 你写上了 Redis,那么除了 Redis 的数据结构,Redis 的性能优化、高可用配置、分布式锁什么的,你多少也要把官网上的那几篇文章读一读。
  • 你写上了面向对象,那么怎么着也得把《设计模式》中的 23 个模式了解一下。
  • 你写上了分布式架构,那么 CAP 理论、微服务架构、弹力设计、Spring Cloud、Cloud Native 这些架构就要做到心里有数。
  • 你写上网络编程,那么 TCP/IP 的三次握手,四次挥手,两端的状态变化你得知道吧,Socket 编程的那几个系统调用,还有 select、poll、epoll 这些异步 IO 多路复用的东西,你得知道。

总之,无论你在简历里写什么技术,这些技术的基础知识你都得学一下。本质上来说,这跟考试一样啊。你想想你是怎样准备期末考试的,是不是得把教科书上所有章节中的关键知识点都过一下?你不见得要记住所有的知识点,但是 80% 以上的关键知识点,你多少得知道吧。

算法题准备

国外的公司一般还会面算法题,他们用算法题来过滤掉那些非计算机专业出身的人。国内的一些公司也一样,尤其是一些校招面试,也有很多算法题。所以,算法是很重要的,是你需要努力学习和准备的。

LeetCode 是一个不错的地方。如果你能完成其中 50% 的题,那么你基本上可以想面哪里就面哪里了。这里,你要知道,一些面试官也是新手,他们也是从网上找一些算法题来考你。所以,你不用太害怕算法题,都是有套路的。比如:

  1. 如果是数据排序方面的题,那基本上是和二分查找有关系的。
  2. 如果是在一个无序数组上的搜索或者统计,基本上来说需要动用 O(1) 时间复杂度的 hash 数据结构。
  3. 在一堆无序的数据中找 top n 的算法,基本上来说,就是使用最大堆或是最小堆的数据结构。
  4. 如果是穷举答案相关的题(如八皇后、二叉树等),基本上来说,需要使用深度优先、广度优先或是回溯等递归的思路。
  5. 动态规划要重点准备一下,这样的题很多,如最大和子数组、买卖股票、背包问题、爬楼梯、改字符……这里有一个 Top 20 的动态规划题的列表
  6. 一些经典的数据结构算法也要看一下,比如,二叉树、链表和数组上的经典算法,LRU 算法,Trie 树,字符串子串匹配,回文等,这些常见的题都是经常会被考到的。

基本上来说,算法题主要是考察应聘者是否是计算机专业出身的,对于基本的数据结构和算法有没有相应的认识。你做得多了,就是能感觉得到其中的套路和方法的。所以,本质来说,还是要多练多做。

工作项目准备

无论什么公司的面试,都会让你说一个你做过的项目,或是你过去解决过的一个难题。但我很好奇怪,这种必问的题,为什么很多应聘者都没有好好准备一下。

一般来说,会有下面这样的几个经典的面试问题。

  1. 说一个你做过的最自豪的项目,或是最近做过的一个项目。
  2. 说一个你解决过的最难的技术问题,或是最有技术含量的问题。
  3. 说一个你最痛苦的项目,或最艰难的项目。
  4. 说一个犯过的最大的技术错误,或是引发的技术故障。

对于上面这四个问题:第一个问题,主要是想看看你过去工作中做过的最高级的事是什么,还有你的兴趣点和兴奋点是什么;第二和第三个问题,主要是想看看你解决难题的能力,以及面对压力和困难时的心态;第四个问题,主要是想了解一下你面对错误时的态度,还要了解你是否会对错误有所总结和改进。

这些问题都会伴随着对各种细节的不停追问,因为这样的问题太容易造假了。所以,面试官会不停地追问细节,就像审问一样。因为一个谎言需要用更多的谎言来掩盖,如果没有经过高强度和专业的训练的话,最好不要撒谎。因此对于业余的不是做特工或是间谍的人来说,谎言是经不起追问的。

怎样准备这样的题,我这里有几个提示。

  • 要有框架。讲故事要学会使用 STAR 。Situation - 在什么样的环境和背景下,Task - 你要干什么样的事,Action - 你采取了什么样的行动和努力,Result - 最终得到了什么样的效果。这是整个语言组织的框架,不要冗长啰嗦。
  • 要有细节。没有细节的故事听起来就很假,所以,其中要有很多细节。因为是技术方面的,所以,一定要有很多技术细节。
  • 要有感情。讲这些故事一定要带感情。要让面试官感受到你的热情、骄傲、坚韧和顽强。一定要是真实的,只有真实的事才会有真实的感情。
  • 要有思考。只有细节和故事还不够,还要有自己的思考和得失总结,以及后续的改进。

要做到上述,是不容易的。一般来说,你也是需要训练的。首先,你要形成及时总结的习惯,对自己的日常工作和经历做总结,否则难免会有“书到用时方恨少”的感觉。另外,你还需要训练自己的语言组织能力。最后,你还要有对这些事件的思考,这需要和其他人进行讨论和总结。

对此,如果你想有一个比较好的面试回答效果,这不是你能临时准备出来的,工夫都是花在平时的。而训练这方面能力的最好方式就是在工作中写文档 ,在工作之余写博客。只有写得多了,写得好了,你这样的能力才能训练出来。

小结

总结一下今天的内容。面试前的准备该怎样做,对面试成功与否至关重要。在这篇文章中,我分享了自己总结一些经验和相关技巧。首先是怎样写简历,我认为,简历上的信息不要写太多,信息太多相当于没有信息,不要单纯地罗列,要突出自己的长处和技能。

然后是技术知识的准备,我强调,无论你在简历里写什么技术,这些技术的基础知识你都得学一下。即便不能记住所有的知识点,但是 80% 以上的关键知识点,你多少得知道吧。随后是算法题的准备,我推荐了 LeetCode,并给出了好几种经典算法题的解题套路。

最后是工作项目的准备,给出了几种经典的面试问题及应答思路,并分享了该如何做准备。我认为,想有一个比较好的面试回答效果,是临时准备不出来的,要将工夫花在平时。

面试中的技巧

答不出来

面试中有一些问题很难,但是不要放弃,要不断尝试。很多时候,面试官并不期待你能在很短的时候内解出一道难题,他只是想看一下你遇到难题时的态度和思维方式。如果你能证明给面试官看,你解决问题的方向和方法是正确的,就算是没有找到答案,也是很不错的。因为只要方向走对了,剩下的就是时间问题了。

如果实在解不出来,或是被问了不懂的知识性问题,那么就直接说不懂就好了。记下来,回去多看多练,下次记住了就好。

另外,对于没有答上来的问题,有的人会在面试后请教一下面试官。但是我觉得更好的方式是,问面试官要个他的邮箱或微信,回去后,努力搞懂,举一反三,然后写个东西再发回去。这样做是有可能让你起死回生的。多少可以暗示对方:“你看,我有不懂的,但是我能下工夫很快就搞懂了,你看我的学习能力还不错哦。你就不再考虑一下了吗?”

尖锐问题

应聘的时候,你有可能会被问到几个尖锐的问题,这时你要小心做答。一般来说,你会遇到这几个常见的比较尖锐的问题。

  • 你为什么要离开现在的公司?这种问题一般都是来问你的离职动机的,招聘方有理由相信,你是怎样离开前东家的,就会怎样离开我。另外,从这个问题上,招聘方想了解你真实的动机,对工作的想法和个人的喜好。一般来说,永远不要说之前公司的坏话,最标准的外交词令是:“我离开现有公司的原因是我太喜欢你们公司了”。

    这样的回答,对于招聘方来说毫无破绽可言,而如果你开始抱怨你现在的公司了,很可能会引出很多问题把你问到最后都抬不起头来。当然,你也可以说前公司的问题,比如:自己心爱的项目被公司废弃了、公司转型了、公司业绩下滑了、在现有的公司没有成长空间了…… 这些都还是可以说的。

  • 说一下你的缺点?并给出几个例子。这个问题也是很难很难回答的。但是,我想说,人无完人,是个人总是会有缺点的,但是有的缺点也有点不好意思说。所以,这个问题是比较难的。这个问题不能说套话,说套话会显得特别假。这个问题还是要说实话,也不能说一些不痛不痒的小毛病,这样会让他觉得你避重就轻。

    只要你认识到任何性格的人都有问题,那么这个问题你就好回答了。比如,对我来说,我个是比较着急的人,急性子,而且是个做事的人。所以,我最大的问题就是在推进一些事的时候,会忽略别人的感受。当压力变大的时候,我甚至会说出一些别人难以接受的话(俗话说的情商为零)。这个没什么不好意思承认的,我这么多年来也在改进自己。

    总之,我想说的是,我们每个人都应审视一下自己,思考一下自己光明面的后面。而回答这个问题的最佳方法,就是想想附着在正面事件上的阴暗面,那就是你的答案。比如,我对事情的要求太高了,跟我在一起工作人的压力太大。我太内向了,所以别人和我沟通起来有点费劲。我太过关心团队了,所以,有时候会忽略了项目成本和时间进度……

    最后还要补一句,我知道我的缺点,我也在努力改正,我正在通过什么样的方式改正。这非常关键,因为这基本上是面试官最喜欢看到的答案了,就是你不仅能正视自己的缺点,而且还能不断地改正

    另外,与这个问题相对应的是,说一下你的优点。这个问题是比较坑的,你的优点是需要用证据来说明的。比如,我通常的回答是,我的优点就是学习能力强,因为我掌握的技术面很广,而且,我什么样的技术都学,比如最新的 Cloud Native 技术。作为后端人员我还学前端方面的技术如 React.js 和 Vue.js,这一切都来源于我扎实的基础知识……

    回答这个问题的时候,一般都会反衬出你的价值观,HR 就是想了解你的价值观。比如,我比较踏实,我想把技术一直做到老。再比如,我有韧性,我受过哪些挫折、失败、不公、无奈和无助,我没有当逃兵……

  • 你为什么换工作换得这么勤?很多公司的 HR 都会对应聘者频繁换工作持比较负面的评价。频繁换工作在职业生涯中真不是一件好事,因为用人方会觉得要么是你太不踏实了,要么是你太不行了。所以,工作不要换得太频繁。但是如果换得太频繁了,我给你一个建议,在简历里面写上离职原因。

    另外,在面试时被问到这个问题时,你需要给出合理的解释,以消除用人方的疑惑。怎么给出合理的解释呢?一方面,你还是需要诚恳一点儿,另一方面,你在解释时需要承认频繁换工作也不是自己想的,自己何尝不想在一份工作上干得时间长一点儿。

    无奈,要么是公司有变化,要么就是自己没选好。一方面表达自己也厌倦了频繁换工作这种事,另一方面,你要把这个话题引到另外一个方向上——什么样的工作自己可以干很久?自己所期望的工作内容和工作环境是什么样的?这样就转而去谈你所向往的工作内容和环境了,并再表达一下在这样的工作环境下,是可以很长时间做下去的,并愿意和公司一起发展。

    但是,先不要说得太理想了,不然,用人方也会觉得自己是做不到的。正确的说法是,自己并不担心公司有各种各样的问题,只要有一起扛事的队友一起拼搏,这才是最关键的。

  • 你在一家公司呆了接近 10 年为什么没有做到管理层?你又是怎么保持竞争力的?一般来说,不想做管理的程序员也挺多的,在技术的方向上勤勤恳恳深耕细作,会是一个非常难得的优秀工程师。专注于技术,不分心,不断地在技术上的深度和广度上钻研,这就是保持竞争力最好的方式。所以,其实这个问题挺好回答的。

    但另一个更难的问题是:你工作满 5 年了,为什么还不是一个高级程序员?对于国外的顶尖公司来说,如果你有 5 年的工作经验,但还不能胜任高级程序员(Amazon 的 SDE2)的职位,那么你这个人就基本会被 pass 掉了,包括在职的员工也是一样的。于是,对于工作年限超过 5 年的程序员,如果你还不能证明你可以独当一面,你的能力能够驾驭复杂难题,那么国外的顶尖公司都不会问你这个问题的。

    国内的公司可能会问你这个问题,对此,我个人认为比较好的回答是要分几方面来谈。一方面,过去因为什么原因耽误了些时间(环境因素、客观条件因素),另一方面,要表示同样也有主观因素,不然显得有点找借口的感觉,不诚恳。

    接下来,要表明自己心里面也比较慌(表明自己不用别人提醒可以自己意识到自己的问题),所以,近一年来一直在学习,罗列一下学过哪些东西,最好还有学习目标和学习计划(表明自己除了有意识外,还有行动)。当然,厉害的面试官会不断地追问你一些细节,以此来确定你没有说假话,对此,你要有充足的准备。

  • 你为什么换了一个方向?你觉得你有什么优势? 这个问题其实并不难回答,实话实说就好了。但是不要让招聘方感受到你浮燥的内心,或是朝三暮四的性格,更不要让人感觉到你像“小猫钓鱼”那样一边不行又来搞另一边。

    我觉得回答这个问题有两种方式:一种是非常自信的回答——“我从来没有改变我的方向,因为种种原因,我没能得到我想要的方向,虽然现在很残酷,但是我一直都没有放弃我的方向,我一直都在努力学习……”如果你要这么回答了,你就要真的是这样的,在新的方向有所研究和建树,不然会被识破的。

    另一种回答则常规一点,首先说明一下,自己的兴趣爱好,为什么这个方向要比之前的那个方向更适合自己。可以用几个例子来说明,但其中要有一些细节,比如,自己试过这个新方向 ,发现干得比原来那边更好,更容易出成绩,自己的兴奋点更大,所以觉得新方向更适合自己。然后,承认换一个方向短期内并没有优势。但是,因为自己的某某特质,比如,学习能力强、勤奋、聪明等特质,未来一定是可以胜任的。

    但是,你要用证据证明你的学习能力强,你比一般人勤奋,比一般人聪明。不然如果对方追问下去,会让你破绽百出的。总之,回答这样的问题,需要一定的证据作为补充,而且还要伴随着以降职降薪为代价。所以,一般来说,选定方向最好不要再变了,如果一定要变的话,你也要有必胜的信心和先下后上的心态,而且这些信心和心态要让招聘方看到。

  • 对于技术的热情或初心体现在你生活和工作中的哪里?这个问题其实是想了解一下你的性格,以及对生活和工作的态度。这个问题会伴随着很多细节上的追问。所以,你要小心回答,而且是要带感情的,但一定要是真实的。

    一般来说,热情和初心不是停留在嘴上的,而是要表现在行动上的,你需要给出几个曾经发生过的示例。这些示例可以是:你死磕某个事解决某个难题不认输的精神;你坚持做某件事,无论风吹雨打,无论有没有激励;你在某个逆境中依然没有放弃依然努力的态度;在面对压力时,你勇于承担责任的精神;你严谨细心、精益求精的做事风格;面对诱惑能沉得住气,不浮躁……

    总结一下,对技术的热情或初心,需要表现在这么几个特质上:执着、坚持、坚韧、不服输、担当、不妥协、不浮燥……我说一句,我相信每个人或多或少都会有这些特质,这是你的亮点,要小心呵护。不然,你跟一条咸鱼就没什么两样了。

  • 你觉得你比男性程序员有什么优势?这种问题一看就带有性别歧视。我的建议是,首先从更高的维度教育一下对方,放出观点,性别不能算优势,人与人的不同和差距是体现在工作技能和态度上的。然后,把回答转向到自己的工作技能和工作态度上来,随后从诸如想象力、品味、沟通能力、严谨细心、承受压力等方面说明自己的长处。

    当然,能问得出这样问题的公司一定不是好公司,千万不要去了。所以,可以放心地怼回去。需要注意的是,职场中的怼人是要用数据和事实打脸的。

    比如:世界上第一个程序员就是女的叫 Ada,她不仅预言了通用计算机的可能,还发明了世界上第一个计算机程序。世界上第一台通用计算机 ENIAC 的编译和部署工作是由 6 位女程序员组成的团队完成的。把阿波罗送到月球的程序员也是女的,叫 Margaret Hamilton。微软 Halo 游戏引擎的主程也是女的,还是中国香港人,叫余国荔……另外,在中国的运动比赛上,女性运动员比男性运动员的成绩要好……

    在各个公司,我看到更多的男性除了在使蛮力和搬砖上比女性要强,也没什么其他长项。如果认为写程序是劳动密集型的工种,当然是男性比女性好用。对了,你们这里是劳动密集型的公司吗?最后,我认为,就对女性尊重方面还是国外公司做得好。所以,建议女程序员还是要去国外公司工作。

最后,我想说一下,回答尖锐问题你会有两种方法,一般是比较官方的,像外交或是政治词令,另一种是比较诚恳的、真实的。虽然两者都可以,但是我觉得后者更好一些。因为那是能打动人的。对于一些不礼貌的问题,我觉得你要站在更高的维度教育他们,这样才会显得他们的 low。

结尾问题

一般来说,面试结束的时候,都会问你有没有什么问题。不要放弃这个机会。

  • 如果你面得比较好,这个时候可以问几个尖锐的问题,这样有利于后面谈 offer 和岗位(抓住机会反转被动为主动)。比如,我就问过国外某一线公司的面试官下面两组问题:

    • 你们公司有多少一线开发经理还在写代码?你们的一线经理都没有时间来写代码了,不知道细节怎么做好管理?另外是不是说明你们公司有大量的内耗?
    • 任何公司都有好的有不好的,你能不能分享一下你最喜欢这个公司的地方和最不喜欢的地方?

    基本上来说,面试官都会被我问住,然后开始语塞。能让说英语母语的老外在我这个英文一般的人面前说不清话,我还是很满足的。哈哈哈。当然,也不一定是非要像我这么尖锐地问问题,你也可以设计几个柔和一点儿的问题。总之,问这样问题的目的是,暗示一下对方,我来不来还不一定呢,也别想压低我的 offer,你们公司也不是什么都好,要想让我来,得再加点……(嘿嘿嘿)

  • 如果你面得一般,这个时候你也可以问些加分的问题。比如:目前贵公司或是贵团队最需要解决什么样的问题?我能帮贵公司做些什么?能不能给我一些资料我先了解一下,这样我后面如果能进来,就能上手更快一些了。因为你面得一般的话,面试官会比较犹豫和纠结,此时你需要让面试官不要犹豫,所以,你可以表现得更加热情和主动一点。你看,竟然一副通过面试明天就要上班的“无耻嘴脸”也会为你加点分的……(哈哈哈)

  • 如果你面得很不行,基本挂掉了。这个时候,也要问问题。但最好问一下面试官对你的评价,并且让他指出你的不足和需要改进的地方。面试本来就是一次经历和一次学习,你也可以把其当作是一种受教育的过程。所以,不要放过自己可以成长的机会。通过面试官给你的评价,你日后就知道自己需要努力的地方和方向了。这是多好的一件事儿啊。

小结

总结一下今天的内容。我认为,形象和谈吐对于面试成功与否非常重要。着装方面一定要大方得体,干净整洁;谈吐方面一定要自信从容,能够清楚准确地表达自己的观点和想法。随后是如何面对一些答不上来的问题,如何回答尖锐问题,以及在面试结束之后,如何提问,为自己争取福利或者机会。

国内公司面试风格

对于在基层干活的程序员来说,国内的公司,小公司不说了,诸如 BAT 这样的公司,基本上来说,都是比较好面的。一般来说,都会问你一些技术知识,比如:Java 语言的一些特性啊,会不会用 Spring 和 Netty 啊,JVM 怎么配置怎么调试啊,并发编程是怎么玩的……

这些问题基本上来说都是知识性的问题,都是可以 Google 的,通过查手册查文档就可以知道的。所以,这些问题是很容易准备的,只要你老老实实地看几本我在《程序员练级攻略》里推荐的书就好了。当然,还是有很多人连这些基本的问题都回答不上来,这只能怪自己了。

回答完这些知识性的问题,就是项目经历描述了。你可以随便讲你做过的项目,把这个项目用到的一些技术架构都说清楚就好了,还有怎么上线的,怎么运维的,怎么加班的,怎么苦逼的,怎么带人的,怎么管理项目的。面试官也很少追问技术细节,因为可能面试官自己都不懂(哈哈)。

只要你按照我前面说的那个讲项目的方式来,面试官一看你用到的技术栈和我这边的很类似,他就开始想要你了。当然,国内的公司更多的是缺劳动力,所以,只要你能让他们感到你很能吃苦耐劳、任劳任怨,而且能很快上手干活就好了。

然后就是 HR 和老板的面试了,HR 和老板不懂技术,也不会问你技术问题,他们主要是看看你的性格和态度等。只要你表现能吃苦耐劳,踏实肯干,如果还有一点“灵性”(脑子转得快,与人好沟通,一来一回有问有答,性格外向点儿),在国内的面试你是很容易通过的。

基本上来说,国内公司喜欢快进快出,也就是说,不在面试上花太多的精力,进来就干活,不行就开掉,基本上是找工人找劳动力的玩法,也不关心员工的成长。所以,面试过程基本上来说,都是围绕你干什么,我这边这些事你会不会干,你会不会加班、能不能吃苦耐劳,听不听话等这样的内容进行的。

当然,对于架构师或是高级别的技术人员,又是另一种面试方式,这在国内的大公司中得分两种。

  • 一种是业务型部门的高级技术人员,基本上来说,不会再问你一些技术的细节,只会问你一些架构方面、项目管理方面,以及技术方面的事,或者一些业务架构上的事情。相对来说,业务或应用方面的架构师和高级工程师需要对业务和行业比较了解,有丰富的业务项目经验就好了,技术上倒不需要有多深的知识。我觉得,在一个行业呆久了,只要你对业务有思考,再加上有技术把持,基本上来说,只要平时多读一些不错的业务上的想法,还是比较好过的(因为不会问及细节问题)。
  • 另一种是偏技术部门的架构师和高级工程师,比如核心基础技术,或是云计算之类的。那就会问你很多技术细节上的东西了,而且问得还很深,需要你有相应的项目经验,或是开源社区里的工作经验。你需要有过相当的经历才有可能面过。但是,回过头来说,就算是这样的岗位,本质上还是会回到面知识型问题的方法,所以,无非就是你能钻研的知识深一点儿罢了。知识是死的,只要你努力,你总有一天能学会的。

总体来说,与国外公司相比,国内的公司不管是哪个层级上的面试都是比较好通过的。

专注实力

对于后端程序员来说,C、C++ 和 Java 是一定要学好的,TCP 网络和 Linux 系统编程也是需要学好的。《练级攻略》中那些资料如果你能全部吃透和掌握的话(也就是“编程语言”和“系统知识”这两个章节),那么,中国的所有公司你都可以进,包括 BAT,职位可以面到一级的高级工程师。年薪至少 30 万左右。

如果你要更为底层的话,那么需要掌握高手篇中的“Linux 系统、内存和网络”、“异步 I/O”、“Lock-Free”,以及“Java 的底层知识”,把里面的那些资料都看懂学透,那么,你可以面过年薪 50 万的职位。这是没有问题的。

如果你要往架构师方面发展,一方面你需要有足够多的经验,以及相关的项目实施经验,这需要在相当的大公司里做过相应的项目和架构。再辅助以高手篇中的分布式架构的三篇:入门、经典图书和论文、工程设计,以及微服务和容器化这些内容,我保证你至少可以拿到年薪 60 万以上的工作。

前端的东西如果要学习好的话,并不难。攻略中也有三篇和前端相关的文章,那三篇文章学习个 3-5 年,你也是一个非常厉害的前端工程师了,能找到 30 万 - 50 万的工作应该没什么问题。只不过,如果你还想更好的话,你需要走两个方向,一个是设计(不是软件设计,而是 UI/UX 设计),另一个是后端架构技术。

你一定要明白,真正解决用户的问题的不是前端技术,而且是后端的业务逻辑和数据计算。前端并不是计算机的本质,计算机提升社会运作效率并不是靠前端完成的,而是靠自动化来完成的,前端只是辅助。

另外,如果你今天还在做支持性的工作,那么你要赶快转到有产出性的工作上去,不然的话,你未来也危险了。比如像测试、运维、项目管理等,这些都是支持性的工作。我个人建议你转到开发工作上,比如开发测试工具,开发运维系统和工具,开发项目管理软件……只有到了开发上,你才会有更好的发展空间。

多唠叨一句,学习不要图快,要学会找到掌握知识的方法,而不是死记硬背。学习要细嚼慢咽,一天吃不成个胖子。

面试的训练

对面试来说,比较好的训练就是要经常出去面试,所以还是应该隔三岔五就出去面试一下的。一方面可以攒攒经验值,可以训练一下自己的语言表达能力和应对各种问题的回答。另一方面更重要,可以了解一下目前市场的需求(技术、技能和业务),同时了解一下自己的身价。

我记得以前我在一家公司埋头干了 4 年不问外界的事。有一天,被朋友推荐到某公司,去面了一把。那家公司问我要多少钱,我说,8 千一个月。对方说,你要少了,你这样的能力,市场价至少一万五了(我在当时所在的公司才拿 6 千)。所以,我开始更新简历,面了好些公司,发现我的薪资、岗位以及我的能力,果然与市场价严重不匹配……

你之所以会紧张,会不知所措,会感到不适,会觉得难,大多数情况下是因为你不熟悉这个环境,你对这个环境还很陌生。只要你面得多了,你就会熟悉这个环境,你也就能驾轻就熟了。“老司机”之所以能成为“老司机”,还不是因为经常跟女孩子聊天交谈,时间长了,就成老司机了。

另外,对于语言组织的训练,除了多多与人交流,还有就是你平时需要多看多写,喜欢看书和写作的人通常在语言表达能力方面也不会差,而反之则通常会比较差。所以,写 blog,表达自己的想法是很重要的。

跳槽和升职

有人说,跳槽是升职加薪最好的手段,这么说也有一定道理,因为只有用人单位在竞争你,你的职位和薪资才能提得上去。如果你想靠公司的良心,这是比较难的,除非你非常非常出色。很多人都是会以跳槽来作为升职或加薪的手段的。

我认为,对于一个人来说,适当的跳槽还是很有必要的。有些时候,在一个地方做得再好,也要出去看看外面的世界是什么样的。一方面,有了对比后,你才会更明白自己要什么,另一方面,想把握趋势和行业动态,也需要你跳槽。只是跳槽不宜太频繁,最好不要低于两年换一次,而且最好承前启后,不要有太多的过渡。

如果你想在一家公司内从普通员工升职到公司高管这个可能还是有点难的,所以,通过跳槽的方式来达到这一目标还是可能的。但是,这需要一定的策略。比如,你需要先去世界顶尖公司,在里面做到高级技术人员的级别,甚至可能你先要去读书深造。总之,你需要先进入国外一流公司(比如微软),然后,在里面升 1 或 2 级,然后可以跳到另一家相当的公司(比如谷歌或亚马逊)。

此时,你的简历会非常亮眼了,只要你的级别是高级程序员(对应于亚马逊的 SDE3),你会成为国内各大公司追捧的人才,你回国到 BAT 这样的公司里做个高级管理人员是没有任何问题的。然而,如果你一开始不是去这些顶尖公司,而是直接到 BAT 里做个程序员,我觉得未来能上到中高层的机会不会多。

总之,如果你决定在职场大展宏图的话,那么在年轻的时候,让自己的简历变得越漂亮越好。最好是先去国外,然后在需要职业成长的时候,被国内公司重金请回来,会比直接在国内的公司里发展要好一些。这是我个人觉得比较好的方式。

最重要的事

程序员面试中,最重要的事还是自己技术方面的能力,国内会注重你的项目经验,国外会注重你的基础知识、项目经验、解题思路,以及软件设计能力。所以,要努力提高自己的这些技术技能和见解。

在《程序员练级攻略》这一系列文章中,除了一个大型的地图,以及很多技术的学习资料和资源外,我也给出了很多公司的最佳实践和解题思路。就算你没有实际工作经验,通过思考和研究这些前人的经验,站在巨人的肩膀上,会为你开启更大的舞台。当你去到这些大公司后,就可以把你学习到的这些知识立马用上。

当然,计算机软件开发是一件动手能力很强的事,所以,你需要不断地动手。好在这个世界有开源项目,加入开源项目会比加入一个公司的门槛要低得多。你完全可以到开源项目中攒经验,这可能会比在工作中攒到的经验更多。

总之,我想说的是,要应付并通过面试并不难,但是,千万不要应付你的人生,你学技术不是用来面试的,它至少来说是你谋生的技能,要尊重自己的谋生技能,说不定,哪天你还要用这些技能造福社会、改变世界的。

小结

总结一下今天的内容。《程序员练级攻略》系列文章,对于面试成功与否是非常重要的,但内容太多,所以在本文一开始,我总结概述了其中的重点内容,方便你能提纲挈领地掌握关键知识点。

随后,我强调要想取得良好的面试效果,也是需要多加练习的,隔三岔五就出去面试一下,积累面试经验的同时,也了解一下市场行情。然后探讨一个有些敏感的话题“跳槽和加薪”,我认为,先去国外,然后在需要职业成长的时候,被国内公司重金请回来,会比直接在国内的公司里发展要好一些。

最后分享的是程序员面试过程中最重要的事:技术能力,国内会注重你的项目经验,国外会注重你的基础知识、项目经验、解题思路,以及软件设计能力。所以,要努力提高自己的技术技能和见解。但是你要记住,学技术不是用来面试的,它只是你谋生的技能,要尊重自己的谋生技能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值