1 引言
算法岗比开发岗好,开发岗比测试岗好。
上面这句话,你认同吗?
我在秋招的时候,身边大把人告诉我“我技术不行,能做个测试就不错了”、“算法岗竞争太激烈了,我比不过大佬,能找个开发就可以了”,我相信你身边也不缺这样的同学。
2 岗位从来没有高低之分
我这里针对算法、开发和测试三种岗位的特点,总结了一个表格,如下:
岗位 | 工作重点 | 所需技术 | 薪资特点 | 求职难度 | 未来发展 |
---|---|---|---|---|---|
算法岗 | 开发速度快、准确度高的模型 | 较强的数学能力、英文能力、编程能力 | 近两年都相对较高 | 近两年竞争较激烈,对学历、论文、专利、比赛等要求越来越高 | 深度学习目前还处在蓬勃发展阶段,算法人才依然吃香 |
开发岗 | 应用各种技术完成产品经理需求 | 超强的编程能力,依据细分岗位不同对计算机系统、网络、数据库等各有需求,涉及技术往往更广泛 | 相比算法稍低 | 总的来看坑位较多,不同语言岗位数量有所差异 | 横向发展面较宽,转型测试、算法、管理、产品都有相应渠道 |
测试岗 | 配合开发完成软件测试工作,保证代码健壮可用无明显bug或隐患 | 较强的逻辑思维能力,一定的编程能力,由于测试涉及的产品范围往往较大因此也需要测试对各种技术都要懂一些 | 和开发相近 | 岗位数量比开发岗少,但目前的机会仍然较多 | 发展面相比开发较窄,尤其对于编程技术较差的同学更为严峻 |
那么现在我们就来具体分析一下,算法岗、开发岗、测试岗,有没有技术上的高低难易之分。
2.1 算法岗
算法岗是近几年非常火爆的岗位,大多数情况特指机器学习或深度学习算法岗位,一度非常紧缺,主要工作是研究各种新论文并实现模型、调试参数,以得到较好的深度学习网络结构,或者利用现有和改进的人工智能算法进行人脸识别、图像预测等实际使用。
似乎从15年开始,以深度学习为代表的算法岗开始引爆秋招,薪资不断上升,但随着“种地都要懂AI”的风潮兴起之后,懂得调参的同学也如雨后春笋般不断涌现。
如果把调参比作炼丹的话,现在各大公司的AI部门已经不缺调参的“炼丹童子”了,他们缺的是懂C++懂OpenCV懂CUDA甚至懂底层驱动的“太上老君”。譬如Google发了一个新模型,你用python实现了,那边用C++甚至C实现了,而且还自己开发了各种专用的算子。你觉得上面这两种实现哪个效率更高呢?如果你是一个懂代码的算法,记得联系我内推,一推一个offer。
2.2 开发岗
不同于算法岗较明确的工作内容,开发岗的工作内容千差万别,从IOS移动端开发到数据库开发,都属于开发的范围。一般来说,开发岗就是专门负责承接产品经理或客户的需求、根据需求功能撰写代码、将代码提交测试的同学。
一般大公司的开发流程比较规范,项目在交给测试同学之前都要先进行自测,这是需要开发同学有测试同学一样全面、细致、耐心的能力的,否则一旦测试同学发现你的代码里有过多太低级的缺陷,可以直接拒绝测试并打回让你重新开发。
一个懂测试的开发同学,他能够对自己的项目提供一个完整的测试思路,能够对自己每个接口提供完备的测试方案,能够帮助测试同学完善测试流程、降低上线风险。这是大公司规范化的流程,如果是小公司,往往开发同学自己就是半个测试,如果不懂得如何设计测试样例,一旦上线出bug,这个苦果还是要自己吃。
2.3 测试岗
最后是测试岗,首先一定要声明一点。那些<stron>,而且那些“点点点”的工具往往都是测试人员自己开发的。这里要解释一下,所谓的“点点点”就是指在测试的时候借助一些测试工具,不用编写任何代码就轻松的完成测试。
现在的测试岗往往更像是测试开发岗,他们除了需要对开发提交的项目进行功能、接口等测试外,还要承担自动化测试框架、版本校验工具等测试相关的开发工作,对编程能力也具有较高的要求。
我在实习的时候做的是测试岗位,最开始两周确实一直在“点点点”。但是随着业务的深入,开始需要测试一些接口,这个时候就必须要写代码。甚至,在测试正式开始之前,要先去review一下开发提交的代码,在这个阶段,测试的工作并不仅限于“不出错”,而是要发现代码中的“不合适”。举个简单的例子,开发提交了这样一段代码。
</stron>
int FuncA(int x) { if (x>0) { return x; } if (x<0) { return -x; } if (x==0) { return 0; } }
这段代码很简单,功能是求整数的绝对值,代码出现的问题很浅显:没有必要的if判断、分离的if else。这段代码在功能上完全没有问题,但作为一个合格的测试同学,一定会告诉开发者这段代码过不了,单从工程的可维护性就足够否决这段代码了。我目前从事一些开源框架工作,写的代码直接暴露给所有用户,这个时候函数命名的不规范都会导致代码被测试打回。
一旦测试同学不去看代码,只满足于功能的实现,很容易陷入一个误区,那就是开发同学为他设下的陷阱,这是什么意思呢?我们在接收测试的时候,往往会同时收到产品经理的需求文档和开发同学的技术文档,就像买了一台新电器,你照着说明书肯定是很难出错,但问题就是测试同学一定要学会反其道而行之,除了按照说明书按部就班测试外,还要学会制造特殊情况,而往往看代码就是制造特殊情况的必要基础。因此,作为一个合格的测试,一定是一个懂代码、懂优化的同学。
2.4 技术岗的共通之处
以上所说更像是不同岗位的技术区别,根据自己掌握的知识可以进行选择。不同于这些客观条件,性格和兴趣更抽象和主观一些。
我接触过很多不同岗位的同学,他们的性格多种多样,但我总结了一个共同的特点:一个能做好技术的人,一定是一个热爱技术,渴望用技术作出改变的人。这样的人无论是开朗或内敛,在谈论技术的时候,眼神都是发光的。互联网薪资相对很多行业都比较高,但如果不是因为热爱技术,一定不要选择技术岗。
岗位没有技术高低之分,只有侧重各有不同。你选择某个岗位,一定是因为更擅长做这个,而不是因为不擅长做别的。在选择之前,先把自己的能力、性格、兴趣都列出来,根据这些信息来决定究竟选择哪个岗位。
3 一个合格的C++开发同学应该具备的能力
这个专栏是针对C++开发岗的同学的,下面就重点介绍一下这个岗位的要求,同学们不妨看一看自己是不是真的适合做C++开发。当然,不少公司在招聘的时候,岗位描述是C++开发工程师,但进去可能会换语言,如Go、Java等,尽管我一直觉得语言都是大同小异的,但为了描述准确,下面还是主要针对C++开发岗进行介绍。
3.1 合格的内存掌控者
一个合格的C++开发工程师,一定是一个内存掌控者。他一定会了解每个语句会导致的内存变化,一定会熟悉每个变量的存储方式。简而言之,他能够像熟悉自己口袋里有什么东西一样熟悉内存分布。
内存管理,是C++效率高于其他语言的重要原因。我个人觉得,离开了内存管理的C++,变得越来越像Java。诚然,随着新标准的兴起,随着硬件的提升,对效率的要求不再像以前那样苛刻,C++也确实越来越简单易用,甚至可以像Java一样在一定程度上忽略内存管理。但如果你对内存不感兴趣,那我建议最好还是学Java或者python,就业面更广。
对内存管理做到心中有数还有一个非常重要的原因,就是出bug后debug的效率会大大提高。最容易debug的问题就是语法问题,最难debug的问题恐怕就是突然给你报一个莫名其妙的堆栈溢出。提高内存管理能力的一个有效途径,就是让自己从编译、链接等入手,搞明白每个数据的存储位置、存储方式,当你能够把内存管理像穿衣服一样熟练的时候,你的代码性能和健壮性一定会越来越好。
3.2 卓越的性能优化大师
一个合格的C++开发工程师,一定是一个性能优化大师。要对常用的数据结构和算法有深刻的了解,从时间复杂度、空间复杂度分析每种数据结构和算法的特点,能够针对特定应用场景选择合适的数据结构和算法,也能够根据需要对已有数据结构和算法进行改进和优化。
事实上,无论是C++、Java还是python,都涉及到众多数据结构和算法,只不过对于python这样的胶水语言,在实际应用中相对较少涉及这些内容。
选择了C++,就注定要经常和数据结构及算法打交道。在学习这项技能的时候,可以先从简单到复杂,边学习边刷相关算法题,能够有效提高自己的掌握程度。另外,还要多总结,多去问自己两个问题。第一,为什么,第二,凭什么。比如,为什么有原生数组还要有vector?凭什么vector就比原生数组更好用?当你问出为什么的时候,就已经开始入门数据结构和算法了,而当你探索凭什么的时候,你思考的问题就基本和面试官要问的问题一致了。
3.3 优秀的架构设计师
一个合格的C++开发工程师,一定是一个优秀的架构设计师。架构,听起来似乎很高级,事实上,从我们大一学习C语言的时候就已经开始接触了。我记得我大一刚接触C语言的时候,期末作业遇到了最难的一道题:用C语言实现一个命令行扫雷。当时我一直在想,从输入一个坐标,到判断是否是地雷,到打开周围暗格,再输入第二个坐标,以此类推。想来想去,越来越复杂。再后来经过高人(百度)点拨,尝试划分模块,输入模块负责接收用户输入,并把此输入传递给处理模块,处理模块负责根据用户输入判断、修改地雷矩阵,输出模块负责将处理模块处理后的结果返回给用户,如下图:
其实扫雷游戏是非常简单的,而我专门画出来图,只是想告诉同学们,架构无处不在。
当我们从C转向C++的时候,与其说是语言的转变,不如说是架构的转变。我最开始思考扫雷代码的方式,就是过程式的,当面临的问题越来越复杂,并且嵌套各种逻辑的时候,答案就越难呈现出来。采用模块图分割功能后,每个模块的功能都是小而独特的,模块之间的链接也是简单明了的,对解决复杂问题有很好的启发作用。
同时,这种描述项目的方式,也是面试官最喜欢的方式,在介绍自己项目的时候如果能够画出这种架构图,一定是一个亮点,因为这展现了你宏观把握的架构意识。
这里要强调的是,上面说的三点并不是对你此时的能力要求,而是一个指引。如果你对这三点非常认同,并且有兴趣投入其中,那我相信,C++开发工程师一定是一个非常适合你的岗位。
4 选择什么样的平台
我这里用了“平台”一词,而不是公司。平台指你所在的公司、部门、项目组。下面我就分别介绍一下这几项的选择依据。
4.1 选择优秀的公司
对于互联网公司而言,你应该注意以下几点:
1) 公司的待遇如何。待遇绝对不等于工资,工资只是其中一部分。实质上,自己单位时间内能获得的利润,才是自己的待遇。以在深圳的公司为例,深圳市政府会向当地企业定期分配一些保障性住房,不同企业的名额数量不同,不同企业的分配机制也是不同的。假如公司能提供给你一个40平的单人房,就相当于工资涨了3~5k。这种隐性的福利一定要考虑在内,包括但不限贵的当地户口、通讯费车马费等报销额度、医疗保险、年假天数等等。除了福利,还要考虑你的时薪。有些公司给的价格一听很诱人,动辄一年三四十万,仔细一打听一个月休两天,日常9117(早晨九点上班、晚上十一点下班、一周工作七天),你算下来一小时挣的不如楼下的保安大哥多。奔着钱去的,结果钱又不多,这不是亏了吗。如果你非要愿意用时间换金钱,那不如问问保安大哥招不招兼职。
2) *公司的培养方案如何。对于一个新人而言,大公司往往能够提供一套完整的培训课程,从代码规范到开发流程一应俱全,这也是我建议应届生尽量选择大公司的原因之一。以我厂为例,经常向员工提供一些线上、线下的课程,也时常举办一些技术比赛,并且非常鼓励员工参与。在这种环境中,你的各方面技能会越来越扎实,也不至于在跳槽的时候发觉自己只局限于部门业务相关技术。
3) 公司的未来发展。这一点很容易理解,苹果和诺基亚之间进行选择,我想你瞬间就可以给出答案。如果你把自己的未来构想的非常励志,一定要考虑这个公司未来的发展如何。互联网行业中存在跳槽频繁的现象,公司的长远发展对一般的底层员工其实并没有紧密联系,最多影响年终奖的比例。但在寒冬来临之际,公司发展就显得尤为重要了,如果公司发展不好,第一个削减的绝对不是高层员工的工资,而是底层员工的数量。中高层员工即使被裁了,也能很快凭借技术积累找到下家工作,与之相比,新员工由于入职时间不长,掌握技能较少,一旦被裁又失去了应届生身份,在找工作的时候会愈加艰难。再举个简单的例子,当你发现某公司大肆招人的时候,可以打听下这家公司是否准备上市,倘若是,请慎重。因为一旦公司上市成功,就可以开始考虑缩减成本了,而缩减成本最简单方式就是:裁人。
4.2 选择优秀的部门或项目组
下面再来说说部门和项目组,在我们与HR沟通的时候,一般都能得知自己的部门信息。有些公司提供了大部门信息,有些公司提供了小项目组信息。作为和你关系最紧密的最小单元,部门的发展很大程度决定了你的发展,部门的利润很大程度决定了你的待遇。对于部门和项目组,主要有三点值得考虑:
1) 部门的发展:我们都听过某手游年终奖发了100个月工资的事情,虽然不知道真假,也一定程度上说明了一个盈利颇多的项目组,是不会亏待它的员工的,部门和员工的关系是一荣俱荣、一损共损的。
2) 部门的技术栈:如果不是因为喜欢,尽量不要去游戏行业,因为技术栈相对较窄,以后跳槽的就业面也受限。而另一些部门,如支付部门,无论你在阿里巴巴还是在腾讯,甚至一些银行,都有相关的岗位提供,这就决定了以后你跳槽的选择相对较多,上升空间也就更大。当然有的时候要看清市场,以我厂(百度)为例,在国内众多大小厂还没投入精力到人工智能领域的时候,我厂就培养了一批相关技术人才,等到大势所趋之时,这些人才全都成为了市场炙手可热的宠儿,他们的发展前景也是一片光明。
3) 部门的核心程度:核心程度往往意味着公司对部门的投入,当你发现公司的CEO每次演讲都要带着某些部门的时候,这些部门应该就是公司的核心部门,尽管这些部门可能短期内盈利不多甚至亏损(诸如互联网公司的AI部门、硬件研发部门等),但有公司的额外照顾,你会发觉接的项目都是要在公司官网进行宣传的,这个时候你的努力往往能获得更多关注和收益。
5 总结
在选择岗位的时候,先把自己的性格、能力、兴趣罗列出来,判断要选择的岗位。在选择平台的时候,从行业、公司、部门多方考虑,作出最有利于个人发展的选择。
6 本章小结
本章主要对求职前的心态调整和平台选择做了详细的介绍,为正式迈入秋招大军打下坚实的基础、树立正确的方向。
针对自卑、自傲、懈怠三种常见的心境问题,分别给出了具体的建议,帮助你走出困扰。又对算法岗、开发岗、测试岗的特点和能力要求分别进行了介绍,并分别在公司层面和部门层面分析了利弊,以更好的选择合适的岗位。
在下一章中,我们将对秋招的先头战役——实习进行分析,帮助你获得一份适合自己、受益颇多的实习经历。