最近帮了一个朋友的朋友做了下职业规划,结合之前在微博上的一些问答,觉得不少应届生同学对求职有蛮多误解的,所以这里分享下我的一点经验吧。虽然本文题为指北,但只是一个面向对行业、对业界技术不熟悉的同学的操作手册。各位技术大牛可能觉得粗浅,请见谅。
本文略长,会谈及以下问题。
- 职业规划越早越好
- 一定要珍惜校招的机会窗口
- 应届生的求职策略
- 技术职位的选择
- 语言和技术栈的选择
- 技术栈的优化
- 简历的书写
下边我们一点一点来讲。
本文作者 @Easy ( weibo.com/easy ),方糖全栈课( quanzhanke.com )主讲人,有多年大规模网站、云平台开发经验、曾运营过用户数十万的程序员拍卖平台,为上千名程序员找过工作。转载请保留以上作者信息和链接,谢谢。
内容更新通知
可微信扫码(未关注直接关注)订阅本指北更新。
职业是一个非常特殊的东西,它有两点很特别,一个是「不可重来」,另一个是「验证耗时」。之前和一个老友聊天,他感叹说,回过头看看,自己的整个职业过得乱七八糟。等到现在明白这点的时候,已经来不及了。因为一般一段职业经历短则一到两年,长则三到五年。换两家公司,十年一晃就过去了。如果你在这十年中没有很好的成长,又不幸身在某些公司,那三十多岁可能就面临被清退的处境了。
我一般不屑于去和别人分享什么人生经验,毕竟有些坑不自己跳下去是不会牢记在心的。但职业的坑不一样,等你发现在坑里时,可能已经晚了。所以我花了蛮多时间来研究这个。有兴趣的同学可以去读读我的《程序员跳槽全攻略》,专门讲职业规划的。( 在我的个人网站上可以免费读 方糖气球🎈|程序员跳槽全攻略 )
我大学的语文老师曾告诫我们说,人生就像四季一样,春天该播种,你去播种,秋天该收获,你去收获,这样是最省力的。你非要倒过来呢,也不是不行,但就是会很累,会付出更多的精力和代价。
校招也类似,它是社会和企业为从未步入职场的同学特意准备的一个绿色通道。在这个通道里,我们将候选人当做一张白纸,可以没有经验、没有行业常识,只要对工作充满热情、有还算聪明的头脑,基本都算是合格的。企业会为这些同学准备培训,并留足适应期,有的甚至还会安排一对一的老员工来带。
但是,一旦你错过了它,那一切都不一样了,因为你进入了名为「社招」的红海。在这里,所有已经毕业的人变成了你的竞争对手,不但要面对和你一样工作年限的人竞争,还要面对其他工作时间更长、经验更丰富的同行跳槽带来的竞争。甚至经常发生因为招到了一个中级岗位的候选人,取消掉两个初级岗位的情况。
所以校招非常重要,一定不要错过。
既然校招这么重要,那么我们怎么才能在其中占据优势呢?记住两个词「择优录取」和「跑赢同学」。
在微博上经常可以看到这样的问题:「我这个也会、那个也合格,凭什么他们就不招我呢?」这是典型的没有明白招聘本质的表现。要明白,求职不是「会考」而是「高考」,不是什么产品的出厂合格校验,而是一场中国这个资源紧缺型国家里的又一场优质资源争夺战。
那些薪水高、发展空间好的知名企业(后文简称大厂),每年招聘的人数是一定的。极端点说,如果现在所有候选人的水平都下调20%,他们依然要招人的,不然没法发展(严格讲会有一些调整空间,但也扛不了多久)。
所以,尤其是在校招里边,「绝对值」并不重要,「相对值」才是最重要的。
我来讲一个很老的童话,听过的同学请装作没听过。两个人在森林里边遇到了熊🐻,kuma 看见他们就嗷嗷的追了过来。一个同学转身就跑,另一个问他说,我们怎么跑也跑不过熊的,那跑有什么用呢?这个同学回答说,我只要跑赢你就好了呀。
那其实校招也是一样的。它不是说你的能力要有多少,其实再牛的应届生的水平放到行业里边,都是不入流的,因为很多水平是靠海量的用户压出来的,你没有遇到过这些场景,怎么可能知道怎么去应对。
所以应届生和那些社招的候选人比,通常都是没啥胜算的,但幸运的是,我们和他们是不同的赛道。要跑赢一个在大厂核心岗位工作了一两年的人不容易,但要跑赢那些和你一样在大学只学了一堆理论基础,甚至理论课都没好好学天天在寝室吃鸡的同学,就容易很多了。
要承认,即使这样,要跑赢某些天资聪颖、能力拔群的学霸还是有难度的。但这场比赛是不公平的,因为它没规定每个人必须同时开始跑。鲁迅说得好,笨鸟先飞。(鲁迅:我没有说过)如果我们能更早的认识到这点,花更多时间去准备,那么赢的概率就会成倍提升。
我本身就是一个非常好的例子。严格的讲,我的能力算是平庸偏上一点点的,虽然在当时无论如何我都不会承认。当我在大一下半期认识到这一点时,就开始自学 PHP,大二的时候写了一堆没人用的开源项目,大三上半期找了家公司做兼职,已经能把学费挣回来了。当大三下半期开始找实习时,我的简历已经可以秒杀同校同学,小小PK 一流高校的同学了。
所以你以为校招比的是能力,其实对于执行力中等、同样天赋的同学来讲,校招比的其实是认知。越早认识到本质的人,就越容易在这场游戏里边胜出。从这个角度讲,坚持读到这里的你,甚至可能已经赢了一半了。所以记得要把这篇文章分享给你的好朋友,然后千万别让你不喜欢的同学知道。
技术岗位的大体分布如图:
现在几乎所有的软件都已经互联网化了,就算没有互联网化的,它以后也会互联网化,所以我们就不单纯地去说软件开发这个行业了。
首先就是开发岗,这个就包括了前端开发、后端开发和移动开发。
前端开发和后端开发,主要是 B/S 结构里的。B/S 结构就是 Browser-Server 结构。而前端指的就是浏览器这个端;后端指的就是服务器这个端。
前端主要做的事情,就是把从服务器端读取到的数据展现给用户,然后通过各种 UI 控件和用户互动,再将新的数据送回服务器端。具体的技术包括 HTML、CSS、JavaScript,还可能有一些嵌入浏览器运行的组件,比如 Flash 、 WebGL 。
后端则主要送数据给前端,一般有两种方式,以前用的比较多的是,将数据在服务器端先渲染完,然后将输出的结果发送给前端;现在用的比较多的方式是将纯数据通过 Json 或者 xml 等格式发送给前端,在浏览器中通过 JS 来进行渲染。
所以以前很多后端的工程师往往也懂一些前端的知识,比如我认识的很多 PHP 程序员,他们不但懂 MySQL 和 Apache,还懂 HTML 、 CSS 、 JS 和 PS。这种前后端都懂的工程师,也叫全栈工程师。
后端可以用各种语言开发,国内用的比较多的包括 Java、PHP ,还有相对小众一些的 Python 、 Ruby 、 Go。其实 C 也是可以写后端的,不过现在已经很少有公司直接用它写了。
后来有了 NodeJS ,JavaScript 也能跑到后端了,所以很多前端工程师也有了后端开发的能力,他们也占了全栈工程师的很大一部分。
相对于 B/S 结构,还有 C/S 结构,就是 Client-Server 。C/S 结构下不用浏览器来展现数据和交互,而是用客户端,一般是 Mac/Win/Linux 三大平台。
手机大潮起来以后,不管是 B/S 结构还是 C/S 结构,全部移动化了。B/S 结构对应的就是适配手机浏览器的移动网页、以及嵌入在微信、微博里边的 H5 页面; C/S 结构就是 APP ,一般覆盖 iOS 和 Android 两个主流平台。
除了这些标准开发岗,而还有一些新兴或者相对小众的开发方向,比如人工智能/算法工程师、做智能硬件的硬件开发工程师、给企业做解决方案的企业软件工程师。
做过项目的都知道,测试环节不可或缺。但学校里的项目测试的角色往往是开发自己来充当,对测试本身可能了解的不够,这里多啰嗦几句。测试英文为 QA(Quality Assurance) 翻译过来其实是质量保障,不仅仅是开发完了测一下,更重要的是从需求、交互设计、研发、测试、上线、监控、反馈……全流程保障产品质量,特别是 敏捷开发 的流行,QA 的作用越来越大。不过需求场景也注定了只有大公司才能玩得起,在里面也才能走的远。未来可能会没有测试这个岗位,但质量保障这个事情只会越来越重要。
软件并不是开发好,测试完成后上线就结束了。上线以后,还需要「运维工程师」来管理和优化服务器集群。现在服务器都虚拟化和容器化了,运维工程师中也出现了懂开发的分支,叫做 DevOps。如果业务很大,还需要 DBA(数据库管理员)来优化、管理数据库。
不管是开发岗还是测试、运维岗,都有其对应的中高级岗位。开发一般是技术经理;运维一般是架构师;测试一般是测试总监。技术总监、CTO 就是更高一级的职位了。
以上的职位分类我们参考了招聘网站的分类,不一定准确,可能会有很多岗位没覆盖到,不少公司也会有自己独特的岗位设置。
如果能选择的话,不建议一开始就选运维或者测试。原因有两个:第一,因为它们虽然很重要,但不是软件开发的核心岗位。第二,从开发岗往这两个职位转非常容易,反之却非常难。不过如前文岗位介绍,如果是 BAT 这种大公司,岗位间相差不大,对于应届生来说都是能学到很多东西,而且转岗也很常见,但若是小公司的话还是不建议一来就选择其运维或测试岗位。
如果想选择测试,心态也很重要,某些女生可能会想测试就是多拿几个手机点一点就行了,比较轻松。这就错了,前面说了如果你想有好的发展前景就要进大公司,一个测试会对接 4-6 个开发的项目量,对效率要求很高,需要很高的自动化率,这都需要码代码,对应开发岗位细分,有后端测试、移动端测试、算法测试工程师等,技术深度、代码能力要求并不比开发低。还有某些男生会觉得自己能力较弱,想以测试为跳板以后做开发,且不说校招的时候岗位要求差距不大,经理或者 HR 也不喜欢这类人,往往连本职工作都做不好,而且培养校招生成本很高,肯定不想要这种干了不到一年就走的。如果真是想做开发,建议直接去学习相关岗位的知识,没必要以测试为跳板,两点之间直线最短。
之前在给掘金写《程序员职业小白书》的时候,我做过一个邮件访谈,以问题的形式采访了多位在不同阶段、不同岗位、不同城市的程序员的日常。大家可以读一读,了解下。程序员们的日常是怎样的 (虽然这个小册是收费的,但访谈这一章却是可以免费读的,不需要购买哈)
虽然出于某种政治正确,我们一般都会说,语言不重要。但语言真的不重要么?并不是这样的,每种语言都有自己的优缺点和适用范围。
像日语和英语一样,一个是看动画玩游戏用的,一个是看资料写代码用的。(误) 下边简单介绍下我眼中的各个语言。
系统语言,用来写底层操作系统、高性能中间件和嵌入式开发。
举例来说,如果你想做人工智能方向的话,Python 语言就是非常不错的选择。因为它在各个大学和研究机构用的非常多,有成熟好用的数学库,适合于科学计算。在深度学习等热门方向上,有大量用 Python 开发的框架,新出的 Paper 也能很快在 GitHub 上找到 Python 的代码实现,可以说是不二选择了。还有如果你想做测试方向的话 Python 能很容易帮你实现测试自动化,比如业界流行的 Robot Framework 就是 Python 写的。
如果你想做前端,那么目前来看,除了 JavaScript 还真没有别的选择,因为现在能在浏览器里边跑起来,也就是它了。过两年等 wasm 成熟可能会有其他选择,但现在,是真没有。
而相应的,如果你学会了 JavaScript ,想在这个基础上再把后端给做了,那么 Node.JS 就是非常好的选择。因为它使用的就是 JavaScript 的解释器,按 JavaScript 写就好了。从学习成本上来讲,它是非常低的,可以通过很低的投入,就进入了服务器端的领域。
如果你要做网站,那么 PHP 就是首选了。一方面是有大量的可用代码,世界上超过80%的网站都用的 PHP,基本上你能想到的网站功能,都有能找到的实现,悬念只是有没有免费的;另一方面,PHP7 的性能提升了很多,用来写 API 也非常好。
另外一点,就是目前使用 PHP 的团队非常多,即使在二三线城市也比较容易找到工作,当然,组建团队也同样相对容易。
如果你要做大数据分析,那么可能就离不开 Java 了。 从 Hadoop 开始一系列的 Google Big Table 的开源实现都是 Java 的,用于海量数据搜索的 Elastic Stack 也是 Java 的。
如果你现在要想去做云计算,那 Go 就是一个非常好的选择。
因为它就是为了大规模计算设计的,并发管理和性能都非常不错。而且有很多云计算的软件,它就是 Go 写的,如果你要去修改它,调整里边的实现逻辑的话,不会 Go 可能很麻烦。当然,理论上讲,你也可以通过容器和微服务的方式来搞定,但肯定比直接改代码麻烦。
另外区块链的大热平台以太坊的官方(最具潜力)实现,也是Go做的。钱途大大的。
在语言的选择上,尤其是第一门语言的选择上,我一直推荐兴趣优先的原则。因为对初学者而言,当你遇到困难坚持不下去时,兴趣会帮你一把。中学时为了改仙剑,我连汇编都试着学了个入门 🤣
但其实对绝大部分应届生而言,对各种语言并没有特别的偏好。而且「找到工作」这件事是非常重要的。所以与其盲目的选择语言学习不如来看看各个语言在招聘市场的表现。
我之前写过一个脚本,可以抓取几个互联网招聘大站的招聘启事,并按职位对薪资进行统计。下边是最近一周的统计结果。
先来说说这些数据怎么看。
职位热度类似于招聘职位数,和其他语言对比就能看出差距。平均薪资之所有有两个值,是因为我们一般招聘时会给出薪资的上限和下限。严格的讲,这并不是当前某个语言的程序员们的薪资,而是他们下一次跳槽时的可能薪资。另外,部分企业喜欢在上限值上边虚高,所以把上限乘80%可能更合理。而下限一般比较真实,更具备对比价值。
然后我们来看看能发现什么。
首先我们会发现,Java 的职位热度非常高,几乎在所有城市里边都是排名第一的。这里有一个特殊原因,就是 Android 职位基本也是使用 Java 语言进行开发的,所以这两个职位有一些重叠。也就是说,学好 Java 其实可以同时应聘 Java工程师 和 Android 工程师(可能需要额外在学一点点应用开发的知识),这非常划算。而从薪资方面看,Java 也是数一数二的。
紧随其后的是前端职位。前端是个非常有意思的特点,那就是——几乎所有的公司都会招前端。对比 Java 而言,可能有很多大厂的后端用的不是 Java ,那他们就不需要招聘 Java 工程师。如果你非常想去这家公司,但你会的语言是 Java ,那么就可能和机会擦肩而过。而前端岗位的话,机会就可能大得多。这有点像血型里边的O型血,怎么地方都能用。就算是自以为站在食物链顶端鄙视「古典互联网」的区块链公司也不得不招前端呢,也是一个非常好的选择。
除了看热度,我们也要考虑到竞争,比如 Java 是一个「传统」岗,很多软件行业的工程师也是会 Java 的。而「前端」是一个新兴的互联网岗,专业前端还不算太多(和 Java 比啦),所以入职难度说不定反而低一些。
其他语言在各个城市的数据各不相同,大家可以挑自己感兴趣的看。比如 Go 语言在北京比其他城市热几倍;区块链虽然看起来很火,但其实职位数也就比 PHP 的一半多点;Ruby 虽然薪资不错,但岗位非常少…
总之语言的选择因人而异因时而异,请综合各种视角去选择一个适合自己的。
在选择好职位和语言后,就要寻找对应的学习路线图进行学习了。这里推荐这个 Star 数量超过4万的路线图(的中文版):GitHub - goodjack/developer-roadmap-chinese: 2018 年成為 Web 開發人員的路線圖
虽然不是很全,但细节不错。
之前我们在分析 Java 数据的时候,发现一个有意思的问题,那就是 Java 的技术栈可以同时覆盖两个热门职位 —— Java 和 Android,这让我们的求职竞争力一下翻了一倍。那么在其他的语言和岗位上还存不存在类似的情况呢?
其实是有的,比如前端岗位就是一个非常有潜力的例子,它的后端解决方案 NodeJS 正在日益流行 。在我写这篇文章的时候,互联网招聘大站 拉勾网 上北京的 NodeJS 职位数是 181,上海是 114,深圳是 65 。所以学完前端知识再补一下 NodeJS 的收益是不错的。
但这个技术栈其实还可以进一步优化,因为一个偶然的原因,我统计了一下 PHP 岗位和前端岗位招聘启事里边出现的技术关键词,发现其重合度竟然高于60%。具体的技术关键词和热度见这里 《PHP&前端岗(1~3年)核心技术点分析报告》
回头一想其实也很好理解,毕竟招 PHP 是来做网站的,HTML CSS JS 总得会一些才行。这意味着PHP的同学只需要补上部分前端知识,比如主流框架 React / Vue / Angular 和 SPA 开发就可以同时应聘 PHP 和 前端 职位。
这会有多大的竞争力呢?前端招聘启事里边,有超过十分之一的企业提及了PHP。这还没完,React 有一个混合应用解决方案,叫做 React Native,可以直接用 React 栈来开发手机APP。这个技术的需求如何呢?现在拉勾网上北京的 React Native 相关职位数有 84 。
于是呢,我们可以选择 PHP + React + React Native 的技术栈,仅仅多学习一点知识,可以投递的岗位就从原来的 364 变成了 364 + 373 + 84 。
这就是技术栈优化的策略。关于这个技术栈的优化结构,可以看这里 《方糖全栈学习路线图》,这个栈还顺便把区块链应用开发也覆盖了。大家可以举一反三,去优化自己选中的技术栈。
不要最后找工作的时候再来写简历。现在就开始写,即使你什么都不会。这样你才会真切的感受到,自己的缺点和劣势。然后通过不断的学习,往简历上追加新的内容,直到你自己看起来觉得有竞争力了,简历才算阶段性完成了。
关于简历的写作技巧和工具,我之前写过一篇文章详细说明,可以点这里阅读 《如何写出一份专业的技术简历》 (这篇文章本身依然是免费的,不用购买小册就能读)
( 由于V站上某些同学的疑惑,这里我也补充一下吧。学好基础知识是必须的,这是最基本的,如果这些地方你都丢分了,这些技巧就都白费了 )
( 刷题库是面试必须的,但只刷题库就舍本逐末了,实践驱动的学习会让你对基础的理解更深入,虽然辛苦点。顺便po一个题库网站 [nowcoder]https://www.nowcoder.com/ )
不知不觉已经写了这么多了,其实还有一些内容想说,但暂时就不写到这里了。
等以后有空我再整理一个小册子吧。我把文章也同时发布到了 GitHub,以后的更新会通过 GitHub 进行,欢迎 watch 和 star 。https://github.com/easychen/career-guide-for-cs-graduate
PS:如果你还不知道怎么用 GitHub,那么赶紧学学吧,这可是程序员的必备(交友)工具哦。