zl程序教程

您现在的位置是:首页 >  其他

当前栏目

老生常谈:想做算法工程师,到底要学什么?

工程师算法 什么 到底 要学 老生常谈
2023-06-13 09:11:30 时间

作者 | 梁唐

大家好,我是梁唐。

今天和大家聊一个老生常谈的话题:想做算法工程师,到底要学什么

这个问题时常有人问我,单单是知乎里的付费咨询就很多次。最近新增了许多关注,所以今天再拿出来聊一聊,相当于给大家画一个学习路线,帮助大家更好入门。

思维导图

首先上一个思维导图,这也是我在B站里面分享的内容。

如果觉得文章里看不清楚的,可以在公众号回复“算法工程师入门”,我会把这张图发给你。

说是完整版,其实应该是精简版,因为我省略了许多不太实用,或者是意义不大的内容。图上所列举的,基本上都是算法工程师在面试或者是实际工作当中会用到的技能。

不着急,我们一个一个来说。

基础部分

首先是基础部分,这里我简单划分成了两个部分:语言基础和基本技能

语言基础不必多说,不管什么岗位,只要需要写代码,那么需要学习一到两门语言是毋庸置疑的。对于算法工程师来说,Python肯定是第一语言。早年间还有R系的算法工程师,这几年基本上都绝种了,只在一些特殊岗位(国企、银行等)当中还存在。

凡是互联网公司的算法工程师,几乎清一色都是Python流,所以Python是肯定要学的。

除了Python之外还有一门语言是少不了的,就是C++。C++主要是用来应付面试中的算法编程题,首先一个是C++默认是各大高校的必修课,另外一个是C++是默认的竞赛语言。几乎所有的online judge(在线评测平台)都一定支持C++,但支持Python的很少。

像是LeetCode虽然支持Python,但是有些题目使用Python是过不了的,因为Python天生效率低,而平台没有针对Python放宽题目的限制,就会导致有些题目同样的算法C++秒过,但是Python就是卡着超时的情况。

另外一个是网上能找到的算法大牛的解题报告也几乎都是C++写的,为了避免麻烦,建议还是使用C++刷题。由于C++只是刷题使用,所以也不需要特别深入,了解基本的编程语法即可。

除了Python和C++之外,最好还需要会一门后端语言,比如Java、go等。

因为在实际工作当中,算法工程师同样会承担一定的开发工作。比如一些算法系统的开发、一些训练脚本、搜索引擎、推荐系统的相关插件等等。这些工作不会对开发能力有过高的要求,但是基本的开发能力还是要有的,最起码,需要熟悉语法,能够做简单的开发。

除了语言之外,程序员必备的基本技能也不能少。像是git、shell基本命令、docker等,同样不需要非常精通,能满足工作需要,会用就可以了。

基础部分这一块都是在实际工作当中会有相应能力要求,一般不会作为面试考察的重点。

算法、数据结构

接下来是算法、数据结构部分,算法和数据结构其实是两个领域,只不过这两个领域相辅相成,所以经常放在一起讲。

这一块如果用一句话来概括的话,就是LeetCode前300题所有知识点。但是我这么说,真正能去把这三百题踏实刷完的人估计凤毛菱角。并且光光刷题也是不够的,也需要进行总结、整理。

所以我帮助大家做了这么个简单的总结,常见的基础算法有:二分、递归、搜索、动态规划和贪心,进阶一些的算法有:two pointers、最短路、最小生成树、动态规划进阶、数学(gcd、筛法等)。

数据结构基础包括:数组、队列、堆栈、表,以及STL(set、map),进阶部分包括:单调栈、树状数组、并查集、线段树。

一般来说外企(谷歌、亚马逊)之流对于数据结构的考察往往比较难,甚至还会问红黑树、B+树之类的。国内的企业往往考算法比较多,知识点并不多,就是我刚刚列举的这些。但是这些知识点之间彼此可以组合,以及嵌套各种解题的技巧, 所以衍生出来的题目的种类是非常多的,也是不可预测的。

某种程度上来说企业喜欢问算法题也有这个因素在,因为这块很难提前准备,比较考验临场的解题能力。

大数据

众所周知,一个好的算法模型一定是基于大量数据训练的基础上的。所以大数据的相关知识也是这行的入门必备技能,同样,由于通常是作为工具使用,所以很难会在面试当中做要求,主要还是在实际工作当中使用。

大数据这个部分往往没有一个统一的规范或者是标准,有些大公司(如阿里)甚至有自己完全造的轮子。一般来说主流还是基于hadoop家族,只不过各个公司的侧重点可能不同。有些偏好spark,有些喜欢hive,还有些可能还是更早的MapReduce。

但不管怎么说,MapReduce的思想,以及SQL语法这两块是必备的,也是基础知识。spark、flink这些用法学不学其实不是非常关键,因为语法相对来说比较简单,使用也不复杂。哪怕之前从没用过,问题也不大。

这块的内容不多,对有过工作经验的人来说不是问题,学生党们建议了解一下。

机器学习

前面都是铺垫和基础,到现在正式进入正题。

说到机器学习,很多人第一反应往往是买本书来看或者是看看Andrew NG的公开课。这并没有问题,但老实说业内技术这几年发展很快,变化很大,许多新的模型诞生,也有许多老的模型被扫进了垃圾桶。

尤其是深度学习兴起以来,大量的机器学习模型开始吃灰,所以对于我们学习者来说,可以做一个适当的扬弃。

这里我把机器学习的模型分成了三个部分:线性模型、统计模型和树模型

线性模型主要指线性回归和逻辑回归(LR)这两块,SVM这几年已经越来越少提到了。虽然线性模型很简单,但是它意义很大,几乎包括了机器学习所有的概念和思想。像是LR模型曾经在推荐、广告领域大规模使用,影响非常深远,在推荐的面试当中经常会问关于LR的衍生和思考。

其次是统计模型,其实主要也就是指朴素贝叶斯。朴素贝叶斯模型也非常简单,我们一篇文章就能讲完。但同样,它当中包含的内容也不浅。只要真正动手从贝叶斯定理往朴素贝叶斯模型推导一次,你就会发现这里面涉及的细节很多,能把这个模型吃透,需要扎实的统计学知识,所以也是面试常客。

最后是树模型,像是决策树、GBDT、随机森林、XGBoost等等。这一系列模型既包含了树模型,也包含了集成模型,这些模型吃透了,对集成学习也就有了基本概念。更不用说XGBoost模型是各种比赛拿奖的常客,学会了它,也方便去撸一个kaggle比赛放到简历里。

我面试的时候发现,很多同学对于模型掌握地还可以,但是对于机器学习的概念却并不牢。像是梯度下降、损失函数、评估指标、学习率调整等等,这些东西只有一个粗浅的概念。

实际上这块内容至关重要,可以说是它才是机器学习的核心。目前所有的模型,无论机器学习、深度学习,说穿了都是围绕损失函数评估模型,梯度下降调整参数展开的。这两块知识是“道”,那些模型的原理只不过是应用,是“术”。

把“道”吃透了,无论是自己设计模型,还是理解其他人的模型,都不在话下。相反,学了一堆“术”,对根本的“道”没有概念,都是空中楼阁,只能当调参侠了。

深度学习

说完了机器学习再来说是深度学习。

其实不客气地说,深度学习兴起之后,基本上没有机器学习什么事了。当今大部分的算法应用都是基于深度学习展开的,很少很少再有公司、团队还在坚持使用机器学习了。真有的话往往都是有一些特殊性的要求,比如追求模型可解释性(金融行业)等等。

说到深度学习就不得不提框架,当今主流的框架不少,常用的只有两个。一个是谷歌家的TensorFlow,另外一个是Facebook家的Pytorch。

相对来说工业界使用TensorFlow比较多,学术界使用Pytorch比较多。如果是初学者的话,其实学哪个都一样,因为没有岗位会把这个作为硬性标准的。有过一个框架的使用经验再学另外一个也很快。我两个框架都使用过,个人非常推荐初学者学Pytorch,真的要比TensorFlow好用很多。

说完了框架再来说说模型,深度学习领域的模型非常多,这些模型都和领域强相关,所以在学习之前我们需要先找到方向。

目前,工业界主要有三个技术方向:NLP、CV和排序。

NLP就是自然语言处理,前几年以RNN、LSTN这类时序模型为主,这几年流行各种BERT和Transformer的变种。

CV指的是计算机视觉,主要是图像、视频相关。像是人脸识别、鉴黄等领域都算在CV当中。主要是一些CNN(卷积)模型,绝对卷中卷。

排序是一个笼统的概念,包括搜索、推荐、广告三种不同业务场景的排序。主要是CTR预测模型,模型结构以Embedding和DNN、attention为主。

这三块领域用到的技术和能力是完全不同的,所以什么都学没有意义。最好的做法就是选定一门方向,然后深入钻研,研读各类前沿的paper,思考、实验,形成自己的理解。

深度学习这块看书、看视频学习是不够的,一定要结合论文学习。前沿的模型书上都是没有的,因为和领域绑定得太深了,比较小众,加上技术迭代的速度非常快,两三年一个潮流。所以一定要看论文,追技术潮流,不然面试的时候必然被问成筛子。

面试技巧

最后是一些面试技巧,主要是两块,一块是问答技巧,一块是白板编程的技巧

问答相关的技巧主要有两个,一个是提前准备,比如自我介绍、最后的提问、交流,这些都是可以提前想好的。自我介绍的话,千万不要照着简历读,着重介绍一些简历之外没有的东西,可以用经历体现自己的特点和能力。你简单描述一个凸显学习能力的小故事小经历,比生硬地说自己学习能力强、抗压能力强有效果得多。

另外一个是应付难题的技巧,很多人被面试官问住就呆住了。其实有很多化解的方法,比如你可以主动说我对这块了解不多,我主要是钻研XX领域,要不我给你介绍一下这块?总而言之,可以适当主动展现自己的亮点和强项,而不是等待对方来提问。

最后一个是白板编程,很多同学在IDE里写代码很溜,但是一到了白板上就一片空白,没了代码补全写代码磕磕绊绊。所以最好提前练习、熟悉一下白板编程的环节,有一个准备。尤其是代码风格千万要注意,可以提前花几分钟了解一下谷歌命令规范,很容易写出很规范很漂亮的代码,这是非常大的加分项。

好了,关于算法工程师的入门介绍,就分享到这里。祝大家都能找到心仪的工作。