「100offer 大咖说」是我们策划的一版全新栏目。
每期,我们会邀请一位在技术圈有一定知名度的大咖,给大家分享自己的职场经验、成长故事,或对技术圈热议话题的观点和看法。
算法工程师在 AI 火爆的这几年,成为了招聘市场最抢手的对象之一。一时间,大家都在纠结要不要转型算法工程师。那么,企业需要怎样的算法工程师?普通程序员又该如何转型成为一名优秀的算法工程师?
本期,我们请到了知乎 28K 粉丝,目前担任一家初创数据公司的算法技术总监的 SimonS,用自身经验告诉大家:程序员如何成长为一名出色的算法工程师。
在本次 100offer 邀约的内容中,我想聊聊算法工程师这个看似高大上的岗位,为不熟悉这个岗位又抱有较大兴趣了解的同学解开这层神秘的面纱。在如今到处吹捧大数据的时代里,看看目前互联网热缺的算法工程师究竟需要完成怎么样的任务,以及岗位背后高薪的秘密。
除此之外,我还会结合我的一些个人经历,分享给大家一些实用的经验,如何快速成长为一名出色的算法工程师。
在本文介绍算法工程师当中,我分为以下三个部分来为大家做简单的讲解和梳理:
1)什么是算法工程师
2)如何入门并成为一名出色的算法工程师
3)算法相关学习资料推荐
4)企业喜欢招聘怎么样的算法工程师
Part I 什么是算法工程师
在了解如何成为一个合格算法工程师之前,我们需要先定义什么是算法工程师。很多人会问我算法工程师、数据挖掘工程师和数据分析之间到底有什么关系。
其实从我个人理解来看,算法工程师和数据挖掘工程师还是比较接近的,在大部分中小公司中是不做区分的,在大厂里的话算法工程师相对数据挖掘工程师而言更偏底层一些,需要自己动手造一些高性能计算相关的轮子,提供给数据挖掘工程师使用。但这毕竟是我自己的看法,我们不妨通过各大企业的算法 JD 开始了解这个岗位。
(100offer上某BAT 发给算法工程师的面试邀请JD)
这是 100offer 上,某 BAT 发给算法工程师的面试邀请JD,从这份 JD 可以看出,资深算法工程师的普遍要求是 3 年以上工作经验,提供 30k-60k 的基础月薪。在岗位描述中主要介绍了具体的业务场景,其实主要做的还是数据挖掘和搜索相关工作。在岗位要求中,罗列了一些常见的机器学习技术,并对编程开发的能力有较高的需求。
总的来说,这整份 JD 侧重细节方面比较多,要求也比较细,属于比较典型的招码农的 JD,碰到这样的 JD 一般说明这个部门的老大比较厉害,但是对自身而言晋升空间就相对较小了。
关于怎么定义一个算法工程师这块,除了我拍脑袋给你们下的定义外,我还抓取了上近千份算法岗位的 JD,并粗糙地做了一个关键词词云图,仍有不少噪音没有去除掉。虽然粗糙,但我们也能从中抓住几个明显的重点。
主要是 Python、算法、数据、业务、C++、Java、数据挖掘、广告、数学、硕士等等。其中计算广告方面的专业词汇较多,如 CTR 和 DSP,但并不是本文重点。所以如果单从 JD 的这个词云上来看,如果真心想往这个方向走,那么修炼好 Python 和 C++,读个硕士,努力学好数学还是很有必要的。
Part 2 如何入门并成为一名出色的算法工程师
曾经的我也只是一个只懂 ACM 竞赛相关算法的普通程序员,误打误撞接触到了数据挖掘之后才开始系统地了解机器学习相关知识。
最早接触到的一个 case 是把从淘宝抓下来的商品按名称进行分类,进行了一番研究之后知道了有一个叫做朴素贝叶斯的分类器可以完成这样的工作。抱着试试看的心态,我又通过垂直类目抓取了一部分商品作为我分类器的训练集,第一版分类器交叉验证的准确率就达到了 97%,这对我来说就是打开了一扇新世界的大门,原来分类问题可以被如此优雅地解决,同样我也感受到了大数据带来的魅力。
在经过一些调整和对朴素贝叶斯的深入研究之后,准确率成功提升到 99% 以上,并没有出现明显的过拟合现象。
在这个入门的练手 case 中,我最深的体会就是实践是最快的学习方式。虽然只是完成了一个简单得不能再简单的分类器,但是我知道了如何去判断模型的好坏、如何去针对模型来预处理数据、如何根据结果来修正模型、如何判断模型过拟合等等机器学习中的常识。
再之后我买了相关书籍来学习,发现第一章普遍都是在教会你如何去评估一个模型并罗列了许多统计学方法,如果我通过这本书籍入门的话,可能就会因为繁琐的统计证明而丧失兴趣。但在我通过一些实践之后再来阅读这部分内容,顿时让我觉得获益匪浅。
所以怎么样才算是一名出色的算法工程师呢?按目前市面上普遍的用人需求来看,大致要从以下几个方面来考察:
a) 编程能力
这个就很好理解了,毕竟作为工程师还是需要编程来解决问题。根据工作内容来说,越是偏底层的开发,对编程能力的要求就越高。如果只是用 Python 或者 R 来做数据挖掘,那对编程能力的要求就相对较低了。
但如果一旦涉及到高性能的计算中间件、高并发的业务场景时,对编程能力的要求就会陡升,而目前大厂基本都会有这样的业务场景,所以大厂对各岗位的工程师都有较高的编程能力要求,我们不妨从最早就踏实打好语言基础,无论是 C/C++/Java 编译型语言,还是像 Python 这样的解释型语言,都应该由浅入深了解语言底层的相关知识。
b) 算法和数据结构
这是一个老生常谈的内容了,从最早 Google 面试喜欢考算法题的作风开始,算法和数据结构的重要性渐渐为人所知。当然这里的算法和算法工程师工作时所用的算法还是有一点差别的,传统算法往往有一个标准的输入和输出,然后利用不同的数据结构和策略来降低算法的时空复杂度,如果读者有幸参与过信息学奥林匹克竞赛或者 ACM 竞赛的话应该会非常了解。
在算法工程师的工作中,我们同样会遇到类似的情况,譬如我自己就在做计算广告的时候,遇到过二分图最大权值匹配的经典场景:
我们手头有 n 个广告主参与竞价,同时有 m 个广告位可供展示,但我们不能拿相同广告主的广告进行重复竞价,这就构成了经典的二分图匹配,在这个约束下,我们还得优化我们的最终目标,即通过机器学习模型预测每一种匹配情况下的点击率,这个点击率转化为这个二分图上的权值,要求计算该二分图的最大权值匹配。
c) 数学
我们知道所谓算法工程师,目前其核心还是在机器学习,而机器学习的学习中,数学知识是必不可少的。
在大数据人工智能概念越炒越热的时代,有越来越多的人加入到了这个大军中来,然而却有不少同学因为数学能力不足望而却步,或者止步于一些现有机器学习开源库的调用。这样的内功情况会对未来的职业生涯造成比较大的负面影响,成为一个比较尴尬的瓶颈,也会更容易触及到自己职业生涯的天花板。
那么这里的数学又具体是哪些呢?简单来说,就是微积分、概率与统计、线性代数这三板斧,这三门课程在大部分理工科专业的本科阶段都可以接触到,所以如果遇到了这些课,就请务必认真听讲,如果已经错过了认真听讲的时光,也不用太懊悔,多花一点时间从网上各路的公开课中重新学习即可。
d) 机器学习实践经验
这一点中,我主要强调的是实践经验。我见过不少面试者,简历上写了一堆自学的公开课课程,甚至是 Coursera 机器学习相关的各种证书。但在实际对话中,往往摸不清特征工程的意义是什么,也无法对不同类型的数据做出甄别并采用合适的特征选择方式和模型评估方式。
很多人在学习的时候往往会一门心思钻研如何实现并证明逻辑回归、SVM 核展开、各种神经网络的原理等等,我这里并不是否认这些知识的价值,而是对于大部分初学者来说,这些相对底层的知识其实仅做了解即可,等到工作若干年后再回头来了解才会更有收获,而特征工程、模型评估等实践经验,往往才是用人公司最为看重的点,毕竟我们的目标是成为一名工程师,而不是一名科学家。
Part 3 算法相关学习资料推荐
聊完这些,我想各位应该已经对算法工程师有一个比较清晰的了解了,那接下来就介绍一些比较方法论的干货了,首先是编程,如果仅针对数据挖掘而言,学习好 Python 并能加以灵活运用就够了,这里推荐的是《集体智慧编程》一书,在这本书中,语言文字都是非常浅显易懂的,书中的例子源码都是 Python 事先,并能帮助我们快速熟悉 Python 相关的各种计算库。
其次就是数学了,围绕概率与统计来学习会是非常快的学习方式,推荐阅读李航教授的《统计学习方法》,这本书非常地精炼,第一遍阅读可能会有不少障碍,日后需要反复阅读巩固才能更深入地理解背后的知识点。如果有同学对线性代数感到陌生,可以去看 MIT 的线性代数公开课,这门课中对基础概念的讲解和教学流程。
有了以上这些基础后,基本就可以无压力敲开机器学习的大门了。首推依然还是吴恩达教授的机器学习公开课。在这门课中你会把所学的数学知识应用到机器学习领域中,并对底层的知识原理会有一定了解。
可以配合周志华教授的《机器学习》一并阅读,这本书还是有一定难度的,初读同样可能会有一些障碍,但目前这本书基本可以封为机器学习的中文圣经了,非常值得一读。
到这里,已经可以放手大胆地去实践了,算法的基本功可以从 LeetCode 上充分汲取,机器学习的基本训练可以在 Kaggle 历史赛事中完成。除此之外,我们还有必要去训练自己快速阅读 paper 的能力,推荐关注 ICML、NIPS、AAAI、CVPR 等顶级学会发布的相关论文。
Part 4 企业喜欢招聘怎么样的算法工程师
招聘用人是一个非常繁琐的过程,由于这是一个对个人素质要求较高的岗位,所以从我的角度出发,首先是需要可塑性高的人。
说得再通俗一点,就是学得快用得好,能比较容易对知识点举一反三的人。对于以上我提到的所有内容,其实每个人只要用心学下去,终是可以学会的,聪明与否只是决定了学习的时间长度而已。
所以从这点出发来看的话,和大部分大企业的招聘方向还是比较一致的。有不少同学可能会认为大厂出一些工作中几乎用不到的算法面试题完全就是在刁难面试者,其实不然,面试官往往就是通过这一类问题能了解到你在面对一个相对陌生的问题时,能否给出一个精练、合理、高效的解决方案,这和之后工作时的表现是息息相关的。对此,我有这么几点建议:
训练自己思维
不要为了面试而去刷 LeetCode 等题库,而是保持一个稳定的节奏,可以是一周 2-3 道 Hard 难度的题目,保持自己的思维不会因为一些重复劳动的工作而固化,同样方式可以适用于 Kaggle 来训练自己。
练习表达能力
清晰并富有逻辑的谈吐会给面试官带来极大的加分,这表明即使当你遇到问题了你也可以无障碍和你的同事、主管沟通,这在创业公司显得尤为重要,好的沟通下才能让产品快速迭代,完成所谓的精益创业目标。
针对这点来说,平常可能比较难练习,可以多写技术类博客,多用文字来总结自己所学的知识,业余时间可以多参与像狼人杀、阿瓦隆一类言语类游戏。
练习白板编程
这点有不少同学存在争议,但我认为还是有一定必要的。白板编程考查的内容点一般不会太难,例如像链表基本操作、反转二叉树等都应该是手到擒来的。
不少人认为编程既然有 IDE、有各种 API 文档和参考资料,没有必要去这方面的训练。但我在面试中经常会遇到面试者来来回回涂改花了十分钟写完了其实只要十来行代码的反转二叉树,这就是自身缺乏对编程思维的理解,没有经过大量的编程训练。
所以这也是大厂为什么青睐 ACM 竞赛经历同学的原因之一,因为能参与竞赛并获奖的同学,往往都已经积累了大量的编程训练。
最后,关于学历这一块,我个人并没有强求。但往往由于简历过多且面试时间开销过大,只能优先考虑面一些名校毕业的硕士生或在著名学术期刊发表论文的学生来降低招聘的时间成本。
但如果没有以上这些的同学也不要气馁,可以通过一些其它经历来弥补,比如算法类的 ACM、数据挖掘类的 Kaggle 等竞赛成绩都可以说明你在这方面有一定的努力和天赋,实在不行你还可以罗列自己丰富的实践经验,总之好过一句对算法和机器学习充满热情」对吧。
如果你看到了这里,就抓紧时间去完成自己的小目标吧!
网友评论
推荐了相关书单,侧重点为编程能力与表达能力,
给出了练习工具leetCode和Kaggle。
点个赞。