一、对于技术面试的基本认知
观念如下:
1、不是所有的技术面试都是公平、客观的,相反,很多的技术面试,都是主观的、片面的,甚至是荒诞的。
这句话的意思是,让我们摆好心态,不要太计较。同时,做好各种各样的准备。
举个例子(我的切身之痛),曾经我做了3年Java开发工程师,年年评优秀,同时主持多个项目,自认为项目内外的重难点问题,都能轻松解决,然而我去参加第一次面试的时候,问了一堆JVM问题,让我很郁闷,我哪里记得住(或者知道)这么“冷门”的知识啊!虽然,JVM是面试的“热门”知识点,但是在工作中,这些知识对很多人来说是冷门的。对于冷门知识,只有遇到时,我才会去快速的研究和学习,平时我并不会系统地去阅读和记忆它,这并不代表我不爱学习、不爱研究,更不能说明我不能胜任工程师的岗位,相反,我每天都学很多东西,而且工作业绩和能力也是得到公司认可的。某大牛(朱伟杰)曾说:“我不认为为了使用好Java必须去了解Java底层的实现。许多没有深入理解JVM的开发者也开发出了很多非常好的应用和类库”。
但是如果当时,我能对技术面试,有一个更好的认识和准备,也不会在面试时落得那样的下场。还是拿JVM来说,虽然,我的项目中很少遇到JVM的问题,但是我可以提前了解和准备啊,哪怕花了大力气去学习,却一直用不上,至少面试的时候能应付啊,即便我不去面试,至少也能在技术群里聊天时装装逼啊(PS:这不是我说的,是写这篇博客的同学说的,逃~)
2、技术面试单纯,套路不多,几乎都千篇一律,或者有章可循,面霸甚至可以押对80%的题,对比应试教育中的高考恐怕简单得多。
多准备,多总结,可以做到“知己知彼,百战百胜”。看看这位在校生,准备了一年,几乎横扫各大IT公司的Offer:https://www.nowcoder.com/discuss/147806。
是的,他准备得很充分,学的知识也几乎都是面试的热门知识点,所以他去面试时,几乎都是把常见面试题倒背如流。难道,我一个工作8年的架构师、优秀员工,同事眼中的技术尖子,还赶不上这位在校学生?细思恐极!!论“应试”能力,还真赶不上!写数据结构相关的算法肯定不是他的对手,侃JVM原理、MySQL原理、Redis设计与实现,都侃不过他,毕竟我不会专门去学习、去记忆、去背这些知识,看过也就忘了。但是论知识的广度,以及实际工作能力和经验,恐怕是远远胜之,毕竟我8年都在不断的学习(但不是为了“应试”),参加过的项目、见过的问题、经历的挑战,各种各样,形成了我好几百篇的博客文章(参见:http://blog.zollty.com),这些实际的经验,那位应届生能比吗?
3、是金子,不一定能发光。不是技术好、工作能力强,技术面试就能顺顺利利。技术面试对那些有充分准备的人,以及口才好的人,更有优势。
在技术面试面前,人人平等,过往的优秀工作经历、背景,可能丝毫没有作用,也许能加一点分,也许反而把你带入坑中(我就被面试官带入过坑中,因为懂的越多,不懂的也就越多,知识是一个无底洞。何况现状是,记忆能力有限,每天都用脑过度,设计程序、设计方案、排查故障、解决棘手技术问题等)。
4、技术面试非常重要,可以说是所有面试里面最重要的,它从很大程度上能决定你是否被录用,以及岗位级别和薪酬。
相比非技术面试,技术面试官的评价和打分,很多时候能决定你的岗位和评级,进而影响定薪。
二、我的面试准备方案
1、第一版计划
起初,大概计划如下:
1、整理一个提纲,分类列出所有知识点
2、制定复习/学习路线,从哪里开始
3、学习时,记录笔记,并整理和记忆相关的面试题
4、练习口语,平时工作时几乎不说话,需要练习说话
这个计划实际执行下来,有很多的缺点:
1、整理一个提纲,分类列出所有知识点
整理提纲,花了1个多月,原因是我想整理得“大而全,细而精”。
——改进方式:不用列提纲,每次复习/学习时选择一个重要知识点就行,当重要知识点都被选完后,再考虑接下来要选择的次重要内容。
2、制定复习/学习路线,从哪里开始
没详细计划,就是跟着提纲和感觉去复习/学习。我从Java的JVM开始的,大概计划就是,先整理有哪些内容,然后一边学习一边做笔记,并且熟悉这一块儿的面试题。
——缺少学习方法,时间限制,可持续性。
3、学习时,记录笔记,并整理和记忆相关的面试题
我把JVM知识点分了几个大类,每个大类又详细整理JVM官方英文文档和多篇第三方参考文档,力求把它写得非常准确详细。结果复习了1个多月,JVM的内容都没整理完。按照这个进度,要把我提纲里的内容挨个详细学习并整理一遍,估计得花几千个小时吧。学习和整理的时间花了95%以上,纯记忆的时间5%都不到。
——整理笔记太费时,直接跳过这个,学习笔记上,只用列title,内容直接参考网上的文档/文章,复习时侧重知识点的记忆和练习题的实战。
4、练习口语,平时工作时几乎不说话,需要练习说话
因为第三步还未完成,练习口语迟迟未开始,但是根据之前的情况来看,我说话断断续续,思维非常不连贯,回答问题时模糊不清、一会儿说东一会儿说西、思维断断续续。原因是,平时养成了一个人静静思考、记录的习惯,平时说话少,不习惯说话时思考。
2、第二版计划
优化后的计划如下:
1、省掉耗时的整理提纲和笔记的过程,直奔主题——直接选取一个重要知识点,然后直接整理面试题,且不花时间去整理准确的答案,直接放上答案的参考文章链接即可。(不追求大而全,而且知识点的学习不要求连续,可以中途插入其他知识点)
2、把面试题用语音自问自答,练习记忆能力和说话能力,直到对自己的回答满意为止,此时可以选择把语音的答案转换成文字答案。
简而言之,如下:
第一步:收集面试题;
第二步:每个题给出几个参考阅读的链接;
第三步:熟读参考文章后,自己尝试回答这个问题,为了锻炼说话能力,用语音记录下来(每段语音控制在1分钟内)。
3、第三版计划
第二版计划,确实能减轻压力,平时收集一下面试题,再看看参考文章就行了。但是自问自答,锻炼说话能力,这一项不好执行。而且这个计划,总是不能持续和坚持。
改进思路如下:
怎样才能 让一件事件,克服一定困难,持续不断的做下去?
需要监督?克服惰性?趣味性?激起奋斗的心?自尊心理?
参考背单词的APP,比如 百词斩,利用比拼、PK的心理,让你坚持背完、斩完一个个的词库。
再比如“爱阅读” “英语说”等,利用每天学习完发朋友圈,“立据为证”,让大家监督和见证自己每天都完成。
还比如斗地主等小游戏,连续7天、30天,每天上线都可以领欢乐豆、领奖品,利用“贪利”心理,让你坚持。
曾想过在今日头条或极客时间上,以语音的形式每日分享,但是分享内容需要成专题和体系,甚至要配套课件,都很费精力。也想过在自己的个人网站“猿题库”上分享,但是既然有文字版,还要语音版做什么??
思来想去,有两点结论:
1、锻炼记忆和说话能力,是很随意轻松的事情,但要将其变成语音分享,比较费精力,况且这不是目的。
2、关于监督和克服惰性,暂时没有好的办法,只能先立项,再坚持,变成习惯,直到完成目标。
要习惯从安静思考、写代码,变成习惯当着人面谈经验和想法。从习惯作为实施者,变成习惯作为指挥者。从习惯写博客、写研究报告,变成习惯做演讲和当面交流。
3、IT技术知识绝大多数都是阶段性的,由于时代发展或自己环境的变化,很难预测现在所学所用的知识能在未来几年、十几年后还被用到。所以,以短期目的为向导,快速达成目标和短暂的所谓的 “具有时效性的技术专家”。
优化后的计划如下:
在第二版的基础上,大量增加口才训练,模拟以讲师的身份把每个知识点讲解一遍,并录音用于自我改进,暂不考虑分享。
每天晚上固定时间练习,不需要督促,不需要证明给谁看,自己设定一个目标,达成后立即终止,没达成时想办法按时达成。
实施计划:
1、每天至少整理出10~20个面试问题,并背下来、记忆熟练,然后录成语音。(后期有空时将题和语音上传到题库上)
2、每隔一天复习上前天的题。
计划实施细节:
1)问题用有道云笔记记录,标题为当天日期。
2)答案用手机录音,录好后修改好录音对应题目的名称。
3)每天晚上12点前,一定完成计划任务,风雨无阻。
补充一些操作细节:
收集的不一定是面试题,也可能是自己觉得重要的知识点。
收集到问题和答案时,使用“有道云笔记”(或类似的支持多终端同步的笔记)快速记录,不在乎格式和排版。
记录笔记时,只分几个大类就行。
有地方记录就行,不需要别人看得懂,暂停自己的“猿题库”网站更新,因为记录只是暂时性的,达成目标要紧(达成目标之后再考虑要不要更新到“猿题库”吧)。
知识模块及耗时预估(单位-天):
Java核心及源码:5
Java线程及并发:4
JVM及工具:5
Spring专题:5
Java框架和组件:5
算法与设计:5
中间件:4
Kubernetes及容器:3
数据库:3
系统架构设计:2
前端技术:2
技术工具:1
Linux:1
网络:1
其他语言和技术:1
计算机原理与基础:1
这样算下来,保守估计要 48天。架构师要掌握的知识太多了,难怪我头疼~
临时抱佛脚是不行的,看似48天,实际上建议拿出3~6个月的时间准备。