有近2个月没有更新博客,主要精力放在了投递会议论文和秋招找工作方面。这里简单总结一下秋招面试的几点建议和感受。


投递的主要是NLP算法工程师岗位,主要参加过面试的公司有腾讯(春招),蚂蚁金服(春招),追一科技,猿辅导,作业帮,依图科技,京东、拼多多、星图科技(校园宣讲面试,是否通过以及后续面试安排需要到10月份)、明略科技、还有工商银行(校内宣讲面试,银行正式笔试面试要到10月份)。

这些公司的笔经面经牛客网等很多网站上有前辈的分享,我也不再赘述,只是总结一下自己的感想。

1.要有自己的东西


应聘算法工程师非常重要的一点是要有自己的东西。我把这点放在第一点来说,是想强调它的重要性。我了解的很多同学,包括我自己,前期花费了很多精力去看别人的论文和算法模型,去了解这些模型可能work的原因,甚至看有些书、面经之类的把它们当做“标准答案”来记,和"应试"差不多。

但是,你看的再多,也都是别人的东西,自己的东西呢?很简单的道理,看论文就和看小说一样简单,但是
思考、形成自己的算法模型、验证、试错、改进、完善的整个过程于自己才是真实的收获,这更是能力的体现。在我看来,这也是一位算法工程师的本分,那就是不仅要有学习能力,更要有的是
分析、思考、形成解决方案的能力。而不是知道很多别人的模型,生搬硬套的能力。

这点在面试中很重要,面试官会感兴趣你做了什么,解决或改进了什么,怎么做的,这么做的道理在哪里,有没有其他可能的方法,这些方法各自的优缺点是什么...?
当然看似这一串问题,都很简单,如果是自己认真思考反复验证过的算法,这些都是已经考虑过验证过的问题。那么这些看起来难的问题,实则是自己算法能力、实践能力的体现,逻辑清晰、实验充分的回答会为自己加分。(另外把这些都分析到位,会占用大量的面试时间,也会给面试官留下一个好印象;并且如果后面考代码或者逻辑问题、底层问题面试官要求也不会非常苛刻。第一印象很重要。)


另外我想说的是,有一些书籍、面经、博客中对于经典算法的理解也可能是错误的,学习时候要有自己的思考,让算法思想为我所用,而不是当做标准答案来背,这是非常遗憾的,甚至浪费时间、产生算法思路上误导的。有这些背答案的时间还不如让大家多思考做好自己的工作。(举个简单的例子,XGBoost,与GDBT的对比,GBDT是率先使用二阶导数的,XGBoost沿用了GDBT的算法思想也采用了二阶导数,并不是面经中讲的
"GDBT只使用了一阶导XGBoost用了二阶"。建议直接看论文。)

2. 知道公司需要什么


并不是很多公司都像大学一样抱着教育你、培养你、发现你未知的潜能的态度来招人,除非这个岗缺人,否则很多公司很看重你现在是否具备直接干活的能力。这是公平合理的。如果想拿到公司付的薪水,需要知道公司需要什么,自己可以做什么,即使研究生期间没有深入研究公司现主要业务内容,在面试前也需要提前做好准备。即使没能非常expert
in,也最好对最基本的架构、常用的算法、模型、工具有了解。

比如,追一科技现阶段NLP的主要业务时对话系统,考虑企业产品上线可交付性等,一般并不会采用端到端模型而是pipe
line,那么前期可以对对话系统各模块要解决的问题、主要算法等有所了解;京东商城主要做商品评价打分,主要用到情感分析、文本分类等,面试前可以了解一些,另外二面面试官问到了正则化、调参、spark,其实面试官喜欢问的一般都是他们业务中经常用的,如果前期了解他们的业务可以有针对性做更好的准备。依图科技只参加了一面,公司更注重算法编程能力,就是手撕代码的能力,对于应聘者的项目经历一笔带过。依图面试官问的我本科时期做的涉及CV的项目,我感觉很奇怪,自以为是认为体现不出NLP能力,问面试官换了讲NLP的内容。后来发现他并不了解,原来面试官是做CV的... 


讲这么多,是想说,要站在面试官的角度看问题。面试不是自己作秀,是为自己找买家。无论是第1点“有自己的东西”说的再好,也是为第2点服务的,那就是如果体现自己能胜任这份工作。知道公司需要什么,自己有什么,没有的话前期补一些什么,需要做好充足的准备。在交流方面,面试官一般会优先挑你所做的课题中和业务更相关的课题问,不仅因为业务需要,更因为他懂。大部分人会倾向于了解自己已经了解过一点的东西,面试官也有这个心理。

3. 基本功扎实

面试时主要考察的基本功包括,(1)对NLP或是深度学习基本算法的理解深度,这个一般从自己的课题介绍中延伸出来;(2)有的公司还会涉及到机器学习的算法;(3)
还有C++(腾讯),python(追一);(4) 手撕代码 (基本都撕了); (5) 其他题目(依图考了智力题,拼多多考了概率题)。


这些都是日积月累的,对于(1)深度学习和(2)机器学习算法,问的也都是常用且重要的部分,如果平时注意积累,把论文模型搞清楚,这部分基本没有问题,有个别比较难的答不上就诚实地说自己没有深入考虑,面试官也是本着想听一下你对这个问题的看法的态度来讨论,并不会为难。


我个人觉得,写博客就是一种很好的展示自己不断学习积累,并且对问题有自己深入思考的很好的方式。写博客于我而言是很有益的。很多时候,自以为会的或是理解正确的内容,在再次思考并整理写下来的过程中,发现自己很多地方并没有弄懂,或者之前的理解不正确,又会刨根问题再搜集资料再思考整理。这个过程中,自己也会理清思路,理解的更深入;在动笔写下来的过程中也要想着怎样组织话语、利用图示能让不懂的人也能看懂,自己也在锻炼表达的能力;回答网友问题过程中还会收获一些友谊~;另外意想不到的收获是,把博客链接贴在简历上,真的有面试官愿意来翻一翻!他会看到你不断的努力,会乐意就某些问题和你交流,倾听你的理解,这个过程中确实自己也能学到很多东西。并且这样也可以将“平时成绩”引入进来,将面试“一考定终生”的高风险分散开来。当然博客只是其中一种方式,比如github项目等等,都是展现个人长期努力的方式,也都可以帮助别人在短时间内更充分全面的了解自己。

对于(3) c++可以看 《c++
primer》的一些章节,当然还有一些编程中的常出错的点,比如野指针、内存泄露等需要平时积累一下;python是平时遇到问题顺手查,主要理解清楚可变对象不可变对象、进程线程、听说有的公司还考了装饰器;本科时入门python朋友推荐看
廖雪峰的python 博客, 这些都讲的很清楚,简单易懂,也可以过一遍。

对于(4) 基本的是《剑指offer》, leetcode 刷题;听说有的公司会考手撕k-means这种机器学习算法的,也要做好积累。

对于(5) 看面经。

4. 了解环境


HR面可能涉及的问题:你应聘的职位?为什么选择这个方向?工作城市在xx可以吗?为什么想来xx城市?家乡哪里?为什么选择这个公司?有师兄师姐在公司吗,对公司的了解?知道NLP工程师主要做什么吗?你的三个优点和三个缺点?抗压能力如何?期望薪资?是否接受调剂?

建议就是,前期多了解,了解公司的发展前景、业务工作、上班(加班)情况等。


对于涉及自己的部分:不需要说的“完全真实”,但需要自圆其说,核心就是要体现热爱并适合这个行业、可以胜任这份工作,而不是体现对自己的剖析有多么到位;抗压能力不要仅说“很好”,最好举例子出来体现自己的能力;


薪资:需要根据自己对NLP算法工程师岗位行业平均薪资水准、该公司基本水准有了解,说一个自己认为合理的数值,不用贱卖自己。如果HR面通过进入最后谈薪资阶段,这时候可以根据自己对行业情况的了解看看这份薪资水平是否合理;如果薪资低,可以试着根据行业水准和自己能力和HR谈一谈调薪,为自己争取一份更为理想的薪资;当然如果薪资高,意味着公司对你的期望或是要求也高,需要做的更好。

5. 知道自己要什么

(1) 要不要转岗?

真正厉害的人都是offer收割机,但是对于更为广泛的同学,今年算法岗并不好找。在前面碰壁之后,周围很多朋友选择了转岗。

今年需求量大的岗位:

1) 客户端 ->
要求:不会没关系,可以进来学。但是需要有扎实的Java基础(对于安卓)和基本的编程能力(手撕代码)。另外涉及客户端的内容可以看面经学习和了解。有朋友应聘该岗位时,直言不会客户端,面试官直接说,你会什么可以讲一下,然后朋友就介绍了自己准备的一些内容,表达清楚也可以。

2) 测试开发 ->
同上,依旧需要有Java基础,和对测试工作的一定了解。还是抱有不会可以进来学的态度。但是有的公司还是比较严,面试官会一眼看出,你是否做过这项工作,以及会说,面经中的内容在实际工作中并不会用等。

其实做以上两份工作,在一些公司的薪资也很高,甚至有的公司的客户端的工资比某些公司开发岗甚至算法岗更高。所以,不是说薪资一定是 算法 > 开发 > 客户端 &
测开。


所以,你是否愿意冒着找不到工作的风险坚持算法岗?还是转岗?去国网?去银行?公务员?读博?这是个人的选择。这里就是优先级排序的问题了,因人而异,没有对错。错的也许只有自己固有的执念,认为某个行业一定怎样怎样,其实各行各业都在进行自己的发展,所以不仅要看现在,也要看未来。

(2) 找不到工作怎么办?


自己找工作挂了一串,挂到怀疑自己;但是我想,读书不是为了将自己囚禁在某一个固定的方向,所谓“君子不器”,会想到自己仍有很多不错的能力,即使失业也仍能凭借自己的本事谋生,所以不用害怕。能力不足可以学呀。而对于有能力但面试官没看到的,想着自己的智力和体魄依旧在,公司不要,是公司的损失,自己有什么损失呢?

其实很多人都是在经历很多次被拒绝后,仍不放弃,才最终有一份结果。如果值得期待,也就值得坚守。希望大家都能有一份满意的工作,并且在工作中做得出色!