认真聊一聊:程序员一定会有35岁危机吗
你好,我是黄老师。
最近经常在知乎刷到一些类似的问题——《普通程序员真的无法度过 35 岁危机吗?》。一般问这类问题的题主年龄都超过 30 岁,希望有人来分享他们的经验。
我今年 33 岁,从毕业到现在工作也有九年多的时间了,即将到 35 岁这个年纪,那么我就从自身的工作经历,结合行业中的一些现象,来谈谈我对这个问题的看法。
为什么是 35 岁
有没有想过,为什么是 35 岁开始出现危机呢,其实 35 只是一个大概的数字,通常这个年纪左右的人都已成家,大部分人背负着房贷车贷,会一定的经济压力。
另外,随着自身年龄的增加,身体素质也大不如前,不能像年轻人那样去加班,甚至是熬夜。再加上上有老下有小,也需要分出一部分的精力去照顾家庭。
很多人就开始担心,真的到了这个年龄,如果公司裁员,会不会首先把自己裁了?如果再出去找工作,会不会四处碰壁?
以上就是大部分人焦虑的原因,但仔细想想,这个难道不是普遍存在的问题吗,似乎和程序员这个职业并不是完全绑定的,大部分行业其实都有这个问题。
那么为啥程序员貌似更加敏感,企业真的排斥大龄程序员吗?
企业真的排斥大龄程序员吗
在我看来,企业并不是排斥大龄程序员,而是排斥能力与自己工龄不匹配的大龄程序员。换位思考,如果你是企业老板,你会招一个工作十年以上,但能力只有工作两三年经验水平的大龄程序员吗?
有人说医生这个行业是越老越香,因为随着工龄的增加,他们的经验也越来越丰富。那么程序员难道不是吗,在我看来是也应该是一样的,工作越久的程序员,它的技术基础更加扎实,工作经验更加丰富,技术视野也更加广阔。
程序员群体是一个金字塔的结构,目前的现状是塔底的人很多,因为这行的门槛低,收入高,很多人涌进来。而在金字塔上层的人却不多,实际上整个行业是非常缺技术能力强的程序员的。
所以优秀的企业对于那些厉害的大龄程序员,不仅不会排斥,反而非常渴求。企业在招聘一些架构师、技术专家的岗位的时候,也明确的写到工作经验 xx 年以上,这就充分的说明了不仅要技术能力强,丰富的工作经验也同样重要。工龄应该是你找工作的优势,而不应该是劣势。
但是如果你工作了很多年,仍然在金字塔塔底,那么被淘汰是必然的趋势。如何让自己爬上金字塔的上层,度过 35 岁危机呢?不要着急,我想先和你分享一下我个人的成长经历。
我的经历
我于 2012 年毕业于北京科技大学, 计算机科学与技术专业的硕士。我本科成绩还可以,顺利保送了本校研究生。研究生期间由于被导师派出去实习,很多课翘了,所以综合成绩不理想,但是我的专业成绩还不错,只要有那种编程的大作业课程,我的作业经常被同学作为参考的对象。
在校期间我并没有学习过前端,而是自学的 C#。和现在的学生不同,那时我们并没有多少学习的资料和途径,不像现在网课非常多,我学习的途径就是看书 + 写代码,当然在校期间我也在一些小企业做过实习和兼职。
直到快毕业我才尴尬地发现,一线互联网公司都没有 C# 的岗位,为了进大公司,我选择了 Web 前端开发。虽然没有前端经验,好在我上学期间写代码比较多,参加过竞赛也获过奖,我在百度的导师还是让我通过了,于是我就以一个前端小白的身份加入了百度。
百度的第一年,主要以业务开发为主。由于刚入门前端,前期主要做一些简单的页面功能开发,渐渐地接触到一些动画的开发和稍微复杂的交互逻辑。
记得当时我们节日经常会有一些运营抽奖活动,后端同学为此写了一套通用抽奖程序。其实这些所谓的 Web 抽奖活动,无非都是前端发起一个抽奖请求,后端根据一系列处理返回抽奖结果,前端再通过某种动画或者游戏的方式展示结果。
抽奖的流程都是类似的,因此在前端也是可以复用的。我和导师讨论一番后,决定做一套通用的抽奖 JSSDK,使用方可以配置抽奖的游戏类型(转盘、老虎机),通过这种配置的方式,让使用方可以几行代码就实现了一套抽奖系统。
这一次经历让我学会主动发现业务中的痛点,用技术的手段提升研发效率。
工作第二年,我跟随我的导师做了我们首页的前端性能优化项目,并且这次的性能优化是从工程的角度来实现的,对写业务代码的人并无感知。
当时我们参考的是 facebook 的 BigPipe
的技术方案,把页面分成了多个区块 Pagelet
,每个区块用前端 JS 的方式去渲染。因为当时使用的是 PHP 的 Smarty 模板开发的页面,每个区块就会用一个 Pagelet
标签去标识,然后在 PHP 运行时动态分析和收集每个区块的 JS、CSS、和 HTML,然后在渲染区块的时候会先去加载 CSS,加载成功后渲染 HTML,最后执行 JS。
那个时候我们就已经实现了前端模块化,每个 JS 模块可以通过 require
关键字去加载其它的 JS 模块,也支持 require.async
去加载异步模块,这部分代码是交给我来写的。起初我对这块并不是很了解,于是我就研究了业内的一些成熟方案比如 require.js
和 sea.js
的实现,最终配合我们框架的特点实现了一套完整的前端模块化方案。
这个性能优化框架落地后,通过性能监控我们发现首屏性能优化效果并不明显,虽然我们采用分块渲染的方案,但还是在首次渲染就把所有区块的资源都加载并且渲染了。
于是这个继续优化的任务就又交给了我,我当时搜索了一些首屏优化的文章,其中一篇淘宝首页的首屏优化文章给了我很大的启发,文章中提到让浏览器尽快渲染前提是让首屏渲染的 DOM 尽量少。
而我们的首页有好几屏,确实非首屏的内容首次渲染是没有必要的。于是我在之前实现的前端框架的基础上,实现了延迟渲染 BigRender
:对于不可见区块可以先不渲染,当用户滚动页面的时候再渲染相应区块。这样不仅仅减少了首屏渲染的 DOM 数,还减少不可见模块的图片和数据接口请求等。
通过 BigRender
的优化,我们页面的首屏性能大幅提升,而且不论后面的业务写的再复杂,也基本上不会影响首屏性能。
这一次经历让我学会遇到问题可以参考业界的主流解决方案,并学习它们的文章或者是源码。
我们开发的这一套前端框架,构建和打包部分还是用 PHP 实现的,我使用 PHP 实现了一个在线点选打包的工具,在上线前需要通过这个工具来实现 split chunks,但这是一个需要人工参与的过程,并没有实现全自动化构建流程。
当时百度内部在推一个前端构建工具 FIS,并且他们也有一套基于 FIS 搞的 PHP + Smarty 的前端解决方案。但是这套方案相比于我们实现的前端框架,仅仅是实现了前端模块化开发,并没有任何性能优化方面的提升。
实际上 FIS 本身的实现还是很灵活的,支持插件化,有点 webpack plugin 的意思。于是我决定研究 FIS 的构建机制,并参考它现有插件的实现,然后编写相关的 FIS 插件来配合我们的运行时框架,最终这套东西被我搞出来了,实现了前端的自动化构建方案。
当初做完 FIS 这一套东西,我觉得还不够,非常想把自己这套前端框架推到业内。因为当时 FIS 主要还是百度内部在用,业界比较火的构建工具是 gulp,于是我就研究了一波 gulp 并开发了一整套 gulp 的插件来模拟 FIS 的构建行为。虽然 gulp 这套方案做成功了,但是距离我想推广出去还差的很远,还是太年轻了。
这一次经历拓展了我的广度知识,我学会了如何使用 Node.js 去编写前端构建工具。
后来由于做的业务对技术的要求也并不高,在百度的成长不大,于是在百度工作三年后,我选择了离开,加入当时高速发展的独角兽公司——滴滴。
当时面试滴滴公共部门的时候和滴滴一位技术大牛相谈甚欢,虽然我只有三年工作经验,但他对我还是很认可的,并给我发了一个难以拒绝的 offer。
来到滴滴的公共部门,让我体验到在大公司里创业的感觉。作为这个部门的第一个前端,这里的基建几乎是零,部门经理第一次找我聊天,跟我说的也就是我们大概要做什么样的东西,你看着搞吧。
百度的基础设施是相当完善的,从项目的开发到最终上线,都有成熟的系统。而来到滴滴这边,几乎什么都没有,连前端静态资源的回源机器,都是我去找 op 申请的。
来滴滴后,我的开发方向从 PC 端转到了移动端,在百度做的前端框架也不再适用。当时前端工程化在国内兴起也没多久,这方面的布道者张云龙老师发表了多篇博客,我读了后深受启发。
张云龙在 UC 搞了一套基于 FIS 二次开发的 WebApp 模块化开发框架 Scrat。我看了后觉得在滴滴也很适用,于是我向他详细了解了一下,就在滴滴把 Scrat 搞起来了,前后端分离的开发模式,且用 zepto 作为运行时增强的库。
这一次经历让我体会了自己一个人把整个前端工程化的方案搭起来的过程。
由于我加入的是滴滴公共部门,需要编写很多公司级别的 JSSDK,比如 H5 统一登录 JSSDK,打通移动端各个页面的登录态;统一地图 JSSDK,对高德地图和腾讯地图做了封装;JSBridge SDK,抹平了 Web 与 iOS、Android 端通讯交互差异。
这些 JSSDK 的使用者也是开发人员,因此除了功能完善,灵活好用也是非常重要的。在开发这些 JSSDK 的过程中,我也参考了一些曾经看过的源码中好的设计思想。
这些经历不仅让我学会如何开发好用的 JSSDK,也提升了我在公司内部的影响力。
我在滴滴的主要业务是开发 WebApp 的主页,做的事情就是集合各个业务线,保证它们的顺利集成和独立上线,其中的难度和挑战我几年前在《滴滴 webapp 5.0 Vue 2.0 重构经验分享》中说过,整体的架构设计有一点“微前端”的味道。
这一次经历锻炼了我在架构设计方面的能力,以及对外沟通的能力。
由于想回老家发展,18 年我从滴滴离职加入了现在的公司 Zoom。
其实从 12 年毕业的时候,我就一直在关注老家的就业机会,但合肥这个二线城市并没有好的互联网公司,直到后面听说 Zoom 这家公司还不错,我就在朋友的推荐下面试入职了 Zoom。
说到回老家发展,这里要多说一句,除了一直关注老家的就业机会,我给自己定的目标也是以一个技术专家的身份回去。
在 18 年左右的时候,我就有一种感觉,至少在前端这个领域我不太需要别人的指导了,我靠自己就可以持续学习新的技术为我所用。直白一点说就是在北京技术已经学够了,可以回去建设家乡了。
来到 Zoom 后,我对 Zoom Web 项目的前端开发现状做了充分的研究,分析其中的痛点和问题,然后结合 Zoom Web 产品的特点我设计了一整套前后端分离的架构设计方案,包括了项目初始化、本地开发、联调、测试、上线等各个环节,并在多个项目中落地。
在这个过程中,我还产出了很多工具和插件。通过新的架构方案,前端可以拥有最先进的的开发体验,极大提升了开发工作效率;从项目部署角度,前端可以独立发布部署项目,从庞大的 Web 工程中解耦,可以支撑项目的快速迭代、灰度发布等。
同时,我还基于 ElementUI fork 出 ZoomUI,并致力解决 Accessibility 问题和性能优化,另外除了基础组件之外,我们还针对一些业务场景设计了业务组件,极大提升开发效率。
除了做前端架构和公共组件,我也独立负责了一些复杂的业务开发,也经常帮助同事解决各种技术方面的疑难杂症。虽然我已经工作多年,但仍然坚持在一线写码,并乐此不疲。
其实回顾我这些年的工作,不难发现,除了日常业务开发,我还做了很多不一样的活,尝试了不同的方向,每一年我都很有收获。
但实际上我也并不是一路顺风顺水的,因为很多时候做的事情对当时的自己都是有一定挑战的,也会遇到很多困难,有些时候也是很痛苦的,甚至需要摸着石头过河。不过一旦克服了这些困难,我会有一种开窍的感觉,也会非常有成就感,技术也得到了提升。
除了工作之外,业余时间我也发挥余热,比如做课程、写书和写文章,它们在给我带来额外收入同时,也提升了我的能力。
在做这些事情的过程中,我把 Vue.js 源码都翻烂了,也反哺了我的工作。比如为了支持 CSP,我把 Vue.js 2.6.11 版本魔改并支持了 CSP;我还研究了 Vue.js 源码的一些性能优化技巧,应用到我的开发工作中。
我的理念是挣外快可以,但挣外快的过程中一定要提升自己,否则就是在浪费时间。当然,做这些事情前提是你的技术能力已经达到一定程度了,如果你还处于初中级的水平,且自学能力不强的话,我非常推荐去买一些付费课程学习。
对于我而言,是不存在 35 岁危机了,因为我能够持续为公司带来价值,反过来我的公司也是非常需要前端领域的技术专家。而且我加入的是一家快速发展的公司,公司的业务在行业内领先,现金流也非常充裕,我不用担心公司会出现什么问题。此外,公司的工程师文化氛围我也非常喜欢,WLB 的节奏也舒服,我在公司继续工作十几年也没啥问题。
即使我真的因为某些的原因不得不离开现在这家公司,以我的经验和技术能力相信很多优秀的公司也会向我抛出橄榄枝。
普通人的成长
可能一些人看到这里会说:老黄你也太凡尔赛了,又不是人人都像你一样毕业就能进大公司。没错,可能我的读者有部分还没进过大公司,学历也很一般,那么这些人想要成长,想度过 35 岁危机,该怎么办?
如果你恰好是这些人中的一员,在我回答这个问题之前,你先想清楚两件事情:你是否真的热爱写代码?你愿意付出更多的努力吗?如果你做不到这两点,那么大概率到 35 岁还是一个平庸的代码熟练工。
很残酷吧,但现实就是如此。首先为什么要热爱写码,因为兴趣驱动还是很重要的,它能驱使着你主动学习,也能让你在遇到困难和挑战时坚持下去。
其次为什么需要付出更多的努力,因为相比于那些 985、211 毕业的应届生,你的起点已经落后了。他们在学生阶段已经足够努力,而且很可能已经养成了好的学习习惯,如果你想追赶他们,不付出比他们更多的努力几乎是不可能的。
我这并不是在制造焦虑,而是让你们明白一个道理,没有人能随随便便的成功,各行各业都是如此,那些你眼中的大佬、成功人士背后付出的辛苦只有他们自己能体会到。
那么具体该怎么做呢,我在《解密初、中、高级程序员的进化之路(前端)》和《如何成为公司独当一面的工程师》 这两篇文章中介绍了很多方法,虽然是多年前写的文章,但这些方法仍然适用。
知道自己该怎么做后,最好还要列一个计划,在什么时间内要达成一个什么样的成长目标。随着年龄的增长,特别是成家后,一些琐事确实会分散我们一部分精力,所以你最好要在 30 岁之前成为一个资深及以上级别的研发的工程师。
大公司需要什么样的人才
如果你没有在大公司待过,我的建议还是最好能加入一家大公司工作几年。相比于小公司,大公司往往在薪资待遇、人才培养、晋升机制等方面都更胜一筹。而且大公司有很多厉害的人,跟他们一起共事,你会学的更多,成长更快。
那么大公司希望招什么样的人才呢?
对于应届生而言,喜欢招学历背景好的,有实习经验的,技术扎实的,学习能力强的,主观能动性高的。
对于社招而言,喜欢招有大公司背景的,工作经验丰富的,技术扎实的,学习能力强的,主观能动性高的。
可以看到,技术扎实,学习能力强,主观能动性高这三个素质,无论校招还是社招,都是大公司看重的。
技术扎实
所谓技术扎实就是你熟练掌握了你的专业领域内的技术知识。想要做到技术扎实,就需要不断地理论学习和实践论证。
你可以通过看书、看视频等方式学习,然后在工作中去应用你学习到的知识。因此我们学习的技术知识,也应该和工作内容相关。
显然,如果想要技术全面,你可能需要尝试不同的工作内容,然后通过反复的学习和工作论证去强化你的技术。
学习能力强
对于应届生来说,好的学历背景和在校成绩就是学历能力强的一种体现;对于有工作经验的来说,能够快速学习并掌握一门新技术是学习能力强的表现。
那么,如何提升学习能力呢?我的经验就是多思考,多总结,刨根问底。这就是为什么我喜欢看各种源码的原因,从源码中我不但能了解各种技术背后的实现原理,还能学习到很多好的编程思想和开发技巧,并总结为我所用。
不同技术栈之间也会有一些相通或者是借鉴的地方,因此精通一门技术栈,你再学习其它的技术会容易的多。
主观能动性高
主观能动性高体现在会主动承担一些有技术挑战性的工作,以及主动去学习和研究一些新技术。
主观能动性高的人通常有一个特点,就是对技术感兴趣,他们乐于并崇尚用技术的手段去解决问题。他们要么活跃在开源社区,要么经常发表高质量的技术博文。
这类人基本上把职业当做了爱好,所以在工作上的产出有些时候会超出预期,这样的人才企业怎能不爱呢?
这些事情最好别做
前面都在跟你聊应该怎么做,接下来我想跟你分享哪些事情最好别做。
上班摸鱼
很多人抱怨活干不完,需要经常加班,实际上大部分都是因为工作效率低。工作效率低通常有两个原因,一是自身技术能力不够,导致开发效率低下,还会经常花时间修 bug;另一个就是上班摸鱼,摸鱼不仅仅浪费大量时间,还会导致工作不够专注,影响工作效率。
技术能力是需要花时间提升的,你没有办法突然就变成一个技术大牛,但是上班摸鱼是可以杜绝的,最好给自己设置一个免打扰时间专心 coding,提升自己的工作效率。
一旦你的工作效率提升了,那么你几乎是不用加班的。我的九年工作经历就很少加班,而且我只接受偶尔加班,比如突击做某个紧急项目,但这不能成为常态。如果加班成为常态,你就应该思考是自身的问题还是公司的问题,如果是公司问题,果断换个工作吧。
炒股
最近几年 A 股行情不错,很多人都开始炒股。股市的 721 规律,也就是 7 亏 2 平 1 盈,大部分散户都有一个错觉,觉得自己就是那个盈利的。
但现实是很残酷的,就算行情最好的 2015 年牛市,大部分散户都是亏钱的。不论从消息面、资金、专业程度,散户都完全不是主力资金的对手,还喜欢往里面冲,这不是在给主力送钱吗?
我自己也有炒,但是我对股市研究不深,个人感觉我的行为和赌博没啥区别。虽然我炒股是赚钱了的,但是我非常清楚自己之所以赚钱完全都是靠运气,凭运气赚的钱最后还会凭实力亏掉的,所以我赚了一波后果断清仓不玩了。
如果你只是那种要代码的非专业选手,我是非常不建议炒股的。一是因为不专业,不是主力的对手,就好比你只是一个拳击爱好者,但会站在擂台和一个专业拳手打拳吗?另一个原因是炒股非常分散精力,你会经常忍不住去盯盘,浪费时间。
炒股波动太大了,你赚钱了,有些时候比自己上班的收入还高,就会产生一种上班不如炒股的错觉,但稍微多想一想就知道,国家怎么可能允许散户随随便便炒股就能赚钱,那样的话谁还上班?事实上股市大部分时间都是在跌,你看着资金的账户一点点地变少,还是非常影响心情的。
你可能会说,那我多花点时间研究炒股呗。如果你资金不足 20w,你花时间研究炒股带来的收益是远不如你花时间投资自己成长带来的收益多的。
我并不反对投资理财,我的建议是专业的事情交给专业人士做,你可以利用闲钱去定投一些基金,买一些理财产品,并不需要花多少时间在上面。
过度娱乐
工作劳累了一天,你回到家放松放松,劳逸结合是一件很好的事情,但是一定要注意一个度。如果回到家,刷一晚上短视频,或者是打一晚上游戏,这就都属于过度娱乐。
我的建议是分配一些时间来学习充充电,并做些运动锻炼身体,这才是健康的生活方式。
其它出路
我本人偏爱写码,因此我会选择技术专家的发展路线。除此之外,做技术管理,自主创业也是程序员的一个出路。
但是不管是做技术管理,还是自主创业,都是建立在你在技术这个方向已经做的足够久,且有不错的技术能力的基础上的。
对于技术管理来说,管理者的技术能力越强,底下的人就会对管理者越认可;对于自主创业来说,对技术的要求会更高和更全面。
当然,由于我对这两部分的认知有限,就不展开讲了。但是要记住,程序员的三大发展方向:技术专家、技术管理、自主创业,前期都需要足够多的技术积累。
写在最后
通篇下来,核心思想就是只要技术足够强,就不会有 35 岁危机,毕竟程序员就是吃技术这碗饭的,技术强的人怎么会丢饭碗呢?所以趁着自己还年轻,应该多努力花时间去提升自己的技术,这样等到你 35 岁的时候,不仅不用担心工作的问题,还可以有时间陪陪家人,享受生活。
当然想要提升技术并非易事,要敢于跳出自己的舒适区追求进步,要能熬得住突破瓶颈长时间的寂寞,要多年如一日的坚持。
此外,加入一家好的企业也很重要,比如我司(有想来的欢迎私信留言)。但是加入的前提是你的技术能达到企业用人的标准。因此工作中的技术积累非常重要,不要等机会来了,你却抓不住。
相关阅读
《滴滴 webapp 5.0 Vue 2.0 重构经验分享》:https://github.com/DDFE/DDFE-blog/issues/13