算法工程师需要掌握的技能有下面五个方面:
1、编程:Python,Java,C
2、数据结构与算法
3、机器学习算法
4、Paper阅读能力
5、造轮子的能力
接下来和大家聊一聊本文的主题:算法工程师是什么样子的。这里仅以我当前的岗位以及公司内部对算法工程师的要求为基准,给大家作为一个参考。每个公司对算法的岗位定义都不一样,所以无法千篇一律。
对于算法工程师,有别于数据挖掘工程师的第一个区别就是对于传统的算法和数据结构的要求。 我自身不是计算机科班出身,在我工作的第一年压根没有接触过这一块,也从没打算去学这一块。 我第一次知道数据结构和算法的时候是去面试一家英语流利说的公司,当时面试官让我写一下斐波那契数列的伪代码,我听都没有听说过,于是面试官又让我写一下如何从一组数列当中最快的寻找出中位数,我依旧不知所措,因为平时都是习惯用函数,还从没想过真正的实现方式是怎样的。面试官很疑惑也很遗憾的当场就对我说:我觉得你可能不适合我们的岗位。
那个时候我才知道原来还有数据结构和算法这么个东西,而后的面试有爱奇艺,百度,滴滴等各大公司,基本上第一轮就是抛出几个数据结构和算法题,写出伪代码,只有通过这层考验,才能继续接下来的面试。这些面试经历让我下定决心必须学一次数据结构和算法。
我的学习过程比较曲折,可能是底子太弱,学起来略微费劲,但好在坚持下来了,leetcode磕磕绊绊至今刷了90题,不过好处也是显而易见的。面试的时候竟然遇到了原题,比如说字符串翻转,二叉树搜索,链表节点查询等。
我用的算法第一本书就是著名的橙色封面《算法》来自于普林斯顿大学,使用Java语言描述,这本书甚至在coursera上都有作者讲解的配套课程,分为上下两部。
数据结构和算法应该是必备的技能,算法工程师应该对用常用的知识点有深入理解,能够在面对不同项目场景的时候灵活选择数据机构和算法。
第二点是机器学习算法,这个地方肯定会比之前的数据挖掘算法要求高很多。除了常用机器学习算法能够手推之外,还要对算法本身有更深入的思考。我记得我面试阿里的时候面试官抛出这么几个问题,说如果boosting算法不使用决策树,而使用SVM会怎样,或者说每一轮迭代都使用不同模型,比如第一次是决策树,第二次是SVM,那么会怎样? 还有一个就是logistic regression这些算法为何没有使用ada、mone这些方法,能不能用?有什么优缺点等等。
这些东西书本上还真不一定会有,需要你自己对算法本身有过深的理解,需要阅读很多前沿的文章来加深自己对于模型的思考。
同时,在面试的时候,面试官没有让我写算法推导,而是让我在白纸上写出代码,不是伪代码,是真真实实的可运行的代码。这一点要求就非常高了。我在面试结束后,问了一下面试官:难道你们工作中算法都是裸写的么?他的回答是:我们需要改写算法。而后在工作的第一个星期我就发现,真的是对着论文改写算法。所以说算法工程师对机器学习的要求能力更高!
第三点是Paper阅读和造轮子的能力。接上面讲的说,在第一个星期对外项目的时候,使用了一个叫做iforest(独孤森林)模型,这是一个无监督的检测异常数据的模型。内部平台没有该算法,开源工具库是单机版本,于是组内的同事照着周志华的论文用Java写了一个分布式的算法,而且还根据业务需求做了一些改进以及增添了新功能。在工作中我们也时常探讨已有开源工具库的不足,不足以满足当前业务的需要,比如说随机森林模型,很多工具库并没有提供样本点是如何在树上进行分裂的,这就要求我们自己来写函数,记录数据的分裂过程。
同时,读Paper是一个能让你与时俱进的最佳方式,新算法或者改进的算法层出不穷,你很难再从书籍中及时的捕获,只有阅读各大会议的热门Paper才能追踪当前最新热点。
最后一个并不太重要,但是确是必须的,也就是编程能力。算法工程师三板斧:Python,Java,C/C++。至少在我们部门,这些都是必须要会的语言,是必备的工具。简单的说一下,Python不用解释太多,适合各种数据处理,快速实验的时候用。Java需要写Map Reduce, udf , 部署jar包等等,用处实在太多。C语言用来改进算法,C++暂时没用过。
给出一些参考书籍和学习资源,仅供大家参考:
1、《算法》
2、coursera 算法
3、JAVA核心思想
4、《机器学习》by 周志华
5、《Pattern Recognition and Machine Learning》
6、《C语言程序设计》
最后,做一个小小的说明。我并没有在本文中过多的讲解项目经验,但这并不代表这不重要。相反,这是很重要的一个考核指标,你所有学到的技能都应该在项目中检验效果,不是做题,也不是造轮子写个玩具功能。