我为什么从算法岗转 Java 开发?
数据结构和算法、操作系统、计算机网络、计算机组成原理
后台回复 “ 计算机基础” 即可获取下载链接。
欢迎关注 「CS指南」
最近发现许多同学对 算法岗
好奇。一部分准研究生在思考读研以后是该做 算法还是做开发 ,一部分做开发的同学则是想了解做算法的同学是在学什么、做什么。我情况比较特殊,开发和算法都做过,目前我也在做自然语言处理中知识图谱的相关工作。本期我就来给大家讲一讲算法和开发到底有什么区别。并且给面临选择做算法还是做开发的同学一点建议。
其实我在和学开发的同学聊天的过程中,发现大部分同学对于算法这个岗位挺不了解的,有的同学对算法及其崇拜,认为做算法的都是大神,但是其实他并不知道算法是在做什么。而有的同学则对算法不以为然,认为做算法的都是在吹,做算法的人代码能力也不强,在骗老板钱。这两种想法都是错误的。
我并不认为算法岗比开发岗强。目前外界总结的算法岗的优点有两条:
(1)算法岗的工资高。
嗯...这倒是真的,举例来说,美团21届校招算法开出的薪资普遍比开发高 3k。开发的月薪分别是白菜 21k,sp 24k,ssp 27k。算法的月薪分别是白菜 24k,sp 27k,ssp 30k。
(2)算法比开发的职业生涯长。
这我就不认同了,首先你的职业生涯长度完全是看你能力的发展,如果非要说哪个更容易被淘汰,我甚至认为算法比开发更容易淘汰。因为开发的技术栈相对稳定,但算法经常会有一些颠覆性的技术产生。
算法岗目前的情况
我再来介绍下算法岗目前的情况。随着算法泡沫的逐渐消退,以及凭借一腔热血扎进算法岗的人越来越多(我就是),算法岗位目前越来越卷。算法岗在 18年 以前是供小于求的,许多应届毕业生在校招前几个月拿着李航老师的《统计学习方法》这本书好好刷一刷,整理一个算法项目,再有点编程基础就能拿到不错的公司的算法岗 offer。但是随着时间迈过 18年-是否值得进入,19年-供大于求,20年-诸神黄昏,21年-灰飞烟灭后,目前算法岗的要求高的吓人。曾经一位大厂做算法的组长和我说,他们目前筛简历的条件是看以下三个条件是否具备其一:
(1)是否有顶级会议论文。
(2)是否有过重大开源项目。
(3)是否有过大厂的算法实习经历。
其实应该还有个隐藏的筛选条件,就是会卡你的毕业院校。上述仅仅是简历通过的条件~
算法是在做什么
其实算法岗中也分两个方向。一个方向是算法的落地应用,另一个是算法的研究。目前企业招聘的算法岗绝大多数是做算法的落地应用(博士可能会做算法研究),而在读研究生期间大部分是做算法的研究。算法研究要做的事情,说白了就是拿一个现有的比较先进的深度学习模型,看看他有什么缺陷,然后按着这个模型硬改,修改后的模型如果能比原模型在衡量指标上提升1.5个百分点以上,就可以发论文了(写论文也是在写八股文)。当然这个过程其实是很难也很枯燥无味的,许多人做实验很久模型的测试指标也没提升(比如我)。而算法的落地应用不需要你去在现有的模型上进行创新(偶尔也需要),需要的是你根据业务需求,在现有的模型中,选择出一个或多个模型来合适的解决业务需求,并且在实际的场景中可用。当然算法工程师本质上也是一个工程师,所以写代码肯定也少不了。
算法落地系统怎么做
现在算法岗在做一个落地系统时主要采用以下三种方法:
(1)基于模板。
基于模板的方法就是人为制定一套模板,如果输入能和模板匹配,那么就把相应的答案输出。比如对话系统中我检测到你说的是 “xxx,你好”,那么我就回你一个“Hello~”。
(2)基于机器学习方法。
基于机器学习的方法呢,就是根据一些数学的模型,去求一个可能性。现在我来举个手写数字识别的例子让大家体会下什么是机器学习。
我用一个最简单的机器学习模型 KNN
来处理下手写字体识别这个任务。
我们可以先收集 1,2,3,...,9 的标记数据。就像下面这样,这张图会被标记为 9:
我们把图像可以转换成一个二维数组,对应这张图的每一个像素点。有墨的地方为 1,没墨的地方为 0。就像下面这样。
当我们需要识别一张新的手写数字时,只需要同样转换为上面的二维数组,然后分别算一下和提前准备好的标记为数字 1 - 9 的二维数组哪个相同位置数字一致的最多,就说明这两个形状越像,也说明要识别的手写数字最有可能是几。当然这个方法看起来简单,但是漏洞很多,我只是为了让大家体会机器学习是什么,在实际应用过程中要比这复杂的多。
(3)基于深度学习方法。
我不确定大家看了我的讲解以后能否理解深度学习,深度学习是最玄学的一种方法。我还是举个例子吧,比如我们接到一个任务是要识别A、B两个句子是否相似。为了让学开发的同学容易懂,我在介绍上简化一些
A句:今天的天气不错。
B句:这是阳光明媚的一天。
大家会发现这两个句子其实是一个意思,但是这两个句子并没有几个字是一样的。如果简单的通过统计共同出现的汉字,绝对不会把这两句判断为相似句。这种情况下,深度学习就派上用场了。
一个深度学习模型解决相似句判断问题的步骤如下:
(1)为了将这两个句子能够输入到深度学习模型中(深度学习模型目前只接受数字输入),只能将这两个句子向量化。比如”老师“这个词,就会转换成一个向量,就像这样 [0.15,0.23,0.32.....,0.17],这个向量能表示词的意思,将”教师“这个词转换成向量时,应该和”老师“转换的词向量差不多,因为它两词义相近所以表示也相近。通过这样转换,就把 A句 和 B句 分别转换成各自的向量矩阵了。
(2)然后我们可以把这两个矩阵拼接,然后再用大量可训练的参数矩阵对这个拼接后的矩阵相乘,可能要用好几套参数乘很多次(不同的参数起到不同的作用),最后得到一个在 0 - 1 之间的值,数值大于 0.5 就说明两句是相似句,小于 0.5 就说明两句不是相似句。
(3)深度学习是怎么学习的呢?这就需要你标记大量的句子对,两个句子是相似句标记为 1,不是相似句标记为 0。比如通过上面说的一个相似的句子对经过大量参数相乘后得到的值为 0.3,和实际相似句的标记1数值上相差较远,那么就需要多调整一些参数,如果得到的值是 0.8,和 1 数值上接近,那么就少调整些参数。经过不断的重复这个过程,就训练出一组或多组参数,用相似的句子对和这些参数相乘得到的值就跟接近 1,不相似的句子和这组参数相乘,得到的值就更接近 0。这样任务就完成了。
什么情况下可以选择做算法
好的,算法岗是在做什么就介绍完了。接下来,通过我的经验来给一些建议,什么样的人适合搞算法。首先,由于现在算法就业的环境,对于本科就毕业准备找工作的,我就不建议做算法了(当然本科的一些有天赋的大佬另当别论,我读研的那个学校,有几位本科大佬在算法上完全吊打我)。然后下面主要聊一聊,准备读研的同学在什么情况下适合学算法。我认为需要具备的条件如下:
(1)你的学校不错,至少是 211 级别以上。
(2)你导师在算法领域有积累(发表过顶会或顶刊的论文,实验室显卡也够),如果你导师没积累的话看看你导师放学生出去实习不。
(3)你的数学要好,你的英语阅读能力要好。如果你做了算法,那么你需要阅读大量的学术论文,基本都是用英文写的,并且上面会有大量的数学公式推导。所以数学基础和英语基础是必备的。
做个总结
好了,上面这些条件应该劝退的差不多了。其实通过这篇文章,我是想让大家了解算法是在做什么,也想让大家在面临方向的选择时更为理性。面对现在快速变化的互联网形式,了解清楚各个方向的情况,并且了解清楚自身情况,扬长避短才能有更好的发展。
< END >数据结构和算法、操作系统、计算机网络、计算机组成原理
后台回复 “ 计算机基础” 即可获取下载链接。
欢迎关注 「CS指南」
扫描下方二维码加我微信一起交流呀