最近在Bilibili刷到了一个视频,是一个38岁老程序员找不到工作后,发了个视频发发牢骚。视频链接。看了之后很有感慨,因为我自己在2023年也经历了总计4个多月的失业时光。在那段时间的自我怀疑让我印象深刻。不过本文并不是在此忆苦思甜,而是借由此视频,探讨35岁是否真的是软件开发人员的终点,软件人是否真的到了35岁就必须“退役”,找不到工作或者转行。
35岁不是软件人的终点
目前由于经济下滑等多方面因素,各行各业都在经历裁员潮。大家都在勒紧腰带过日子。对于外部因素,我们能做的事非常少。人才市场饱和,企业从优中选优,导致面试难度不断上升也是不争的事实。有人说这是内卷,但我觉得这是人才市场的调节所产生的结果,并不是因为有部分人主动自发地“想拼命努力”,而连带着大家学习那些平时用不到的知识,而是作为企业在某些时刻需要高级人才时,拔高难度筛选的过程中,人才市场对这种现象的回应。
然而,并不是所有软件开发人员都有这样的学习习惯和技术嗅觉。2010年中国进入互联网腾飞时代,“互联网+”连接万物,涌现了一批新兴企业。而程序员这个群体踩着风口,获得了高额的薪水。有程序员因此懈怠,没有持续学习前进,没有追随时代潮流,导致经济一旦下行后被迫淘汰。如视频中那位UP主自己承认自己过去休息时间花了大量时间玩游戏,不愿意研究底层,觉得实际工作中没有直接使用就没必要学等等,这就是一种懈怠。而后续他说看到技术就厌烦,也许是他真的不喜欢软件技术,仅仅是机缘巧合之下选择了当时最热门的互联网行业。风口过去,面试碰壁,企业对38岁开发人员的画像无法满足时,自然会对“高耸入云的缺漏的知识”感到厌烦,而又因为没有良好的学习习惯和积累,导致短时间内也无法快速转行。又因为英语积累不足而无法尝试海外Remote工作或者出海找工作,进入了困兽之斗的状态。
话说回来,就算我们上知天文下知地理,也有可能会被淘汰。2015年以前几乎全世界网页前端都在手搓jQuery,而2015年后全世界的网页前端都在往三大框架Angular,Vue,React上升级。后来呢,发展到这一步,tailwind CSS帮大家把CSS里的迂腐废话文学重新修订,这一代前端程序员终于不需要再背那些复杂的经验主义CSS了。如果你在2024年还只会手搓jQuery,那么市场有什么理由不抛弃你呢。
虽然上述说了这么多内因外因,说了很多个人的局限性,但是我还是想抛出我的观点:“35岁不是软件人的终点”。
软件行业的游戏规则:简单的活为什么不给年轻人做?
当拥有了3-5年的软件工作经验之后,就会发现平时的工作并不复杂,日常的功能开发,Bug调试并不是什么复杂的事情。真正有难度的是一些程序员知识区范围以外的内容,也是整个行业前沿的,还未解决的问题等。那么如果按一个人23岁进入软件行业,12年都还在做普通的工作,没有寻求一些突破,或者说没有对那些各种瓶颈进行一些思考分析,没有尝试去理解代码背后的运行逻辑,那么是很容易原地踏步的。表面上看,企业会为了能留住“可用之人”,每年稍微加一些薪水,让程序员觉得今年有所提升,老板才会帮忙涨薪,但也许自己已经原地踏步,失去对行业深层次的思考,失去对技术的热情,成为一个机器而毫不自知。
那么简单的活为什么不给年轻人做?如果到了35岁没有足够的积累,还仅仅只能做简单的活,得过且过,那么招一个年轻人不也可以吗。如果到了35岁无法给年轻人提供指导,仅仅停留在代码表面,玩文字游戏,那么你的存在对于公司又有什么意义呢?
所以我觉得真正的问题在于,大部分人没有明白软件行业发展的速度远超其他行业。一台不到5000的电脑就可以学习各色新的编程技术,接上网线就能阅读世界上最强大最优质的操作系统和框架源码,这在其他行业是无法想象的。事实上,这对于软件行业人员来说,是一个很好的条件,真正做到了学习机会的“人人平等”。但是我有看到有些所谓的软件行业劝退视频,告诉大家这个行业变化太快,需要不断学习,太过辛苦。说到辛苦,软件人真的有医生、学校老师辛苦吗?真的有工厂打工的那些人们辛苦吗?躺在空调房里的办公椅,喝着茶水听着歌,看看源码看看文档,并且连实验室都不用进就可以做实验即时得到反馈,这到底有什么好辛苦的?我反而觉得能实时看到全世界最优秀的软件开发人员讨论技术内容,站在旁边听他们斗嘴吵架,本身就已经是一件特别有意思的事情。
如果到了35岁还没有理解软件行业的游戏规则,不能接收软件行业变化的速度,那么被淘汰是非常理所当然的事情。一个人要在某个行业坚持下来,都必须要有自己的价值观、梦想或者热情。失去了那些想法,仅仅因为“软件行业好挣钱”入行,也早晚会因为“软件行业挣不到钱”而离开。
负责,一个大人必须要会的事
负责有点像背锅,是一件吃力不一定讨好的事情。在职业生涯中,总有那么几个时刻需要我们站出来承担责任。小到一次Review对代码质量的要求负责,大到对一个项目上线后的结果负责。负责是在职场中向前发展必不可少的必修课。如何选择正确的有利的责任来担负,如何负好自己的责任,在被迫背锅的时候如何善后,其实都不是软件代码上的问题,而是沟通问题或者利益分配问题。在面对这些技术书上没有提到的,但是工作上经常遇到的问题时,该怎么调整自己心态面对那些“乱麻”,该怎样做好心里建设,知道自己想要什么,保持自己的心态,是需要花费时间修行的。
我看过很多人在升职加薪后,并没有做好负责的准备。当他们预估事情超过自己能力范围时,会产生“战逃反应”,即远古人类遇到危险时,要么战斗、要么逃跑。在办公室肯定不能“战斗”,于是他们会表现得很愤怒,或者就直接请假逃避问题。他们既想得到好处,又只想承担之前的“有限责任”,这听起来就显得很不合理。但是事实上有很多人会将责任带来的焦虑写在脸上,然后影响整个团队的氛围。
负责不一定会带来利益,但是只要我们知道自己负责的目的,负责可能的收益,知道自己在这个过程中能有什么提升,那么就是值得去做的。如果负责的结果暂时没有直接的利益,也可以以此去找其他人谈条件。如果负责没有任何好处,那么就应该尽早抽身,这样才能让这件事抛出来,让大家知道这件事是有问题的,不值得做的。
在我国的义务教育和高中教育中,很少教过如何为整个团队负责。大家都在聊自己的成绩,聊自己的前途等等,遇到团队合作的内容可能会选择缩头乌龟,老师也选择只看结果,那么最后就变成某个能力特别强的同学,或者某个最被欺负的同学来完成任务的大部分。大家并不知道负责具体是什么意思,也不知道如何培养大家的责任心。当然我并不是说每个人都必须无私奉献,而是大家团队合作的意识没有被培养,导致总有人带着一丝侥幸心理,觉得团队里有特别厉害的成员,自己就可以放松一些,这不是一个好的念头。
学会负责,包括以下几点:
- 清楚理解自己的责任范围,然后在自己的责任范围中,做好自己该做的;
- 明白自己负责后的收益,收益是否能让自己心甘情愿地负责。如果暂时没有办法让自己满足,要和上级沟通争取自己的利益;
- 更进一步,如果团队中需要自己,那么可以做一些力所能及的事情帮助更多的人。站在团队的角度上思考问题,理解更高层面的责任,并且尝试通过自己的力量做一些事情。
经历得越多,越能成长
这一路走来,我听了太多道理。有些道理,别人说了,自己不一定懂;有些道理,别人不会告诉你;有些道理,别人说给你听,是为了他们自己。但是这些所有的道理,自己没有经历过,就永远也无法完全理解。纸上得来终觉浅,绝知此事要躬行。
我们生存的世界,时间与空间不断变化。我们遇到的问题是千奇百怪的,不再是上学时有标准答案。有时候工作上的一些问题,也许永远也没有办法做到标准答案,会让人很气馁。但是只要我们能够正确区分工作不等于自我价值,知道离开了工作,它们就什么都不是,那么我们就能用更积极证明的方向来思考自己面对的问题,及问题背后更深层次的原因,而不是将产生问题的原因全部指向自己。
当你自以为懂了很多道理,踩过不少的坑,也要记得不要“好为人师”。每个人都有自己的人生,有自己必须要踩的坑,也就是“人生的劫难”。虽然有些玄学,但是由于每个人性格、出身等一系列客观原因,每个人都有自己不得不面对的棘手问题。直接告诉他们答案,并不能让他们真的学会那些道理。不论是对长辈上级、同辈亲友还是晚辈孩子,都要记得尊重他们经历和成长的机会。
永不自我设限
我们讨论过35岁不好找工作的原因,但是每个行业都会有一些“更高难度”的部分,需要先行者去攻克。而35岁恰好就是一个黄金年龄:它正好积累了一部分在学校时学习的理论经验,也有在工作中积累的工作经验,直接面对过一些行业内棘手的问题;同时,35岁正值青壮年,虽不像刚毕业的毛头小子那样活力无限,但是连肝几周攻坚难题还是绰绰有余。我认为让35岁成为门槛的另一部分原因,是有一部分人看到年纪渐长,自觉竞争不过年轻人,于是自我设限,将自己难找工作归咎于年龄。
Wine软件是一款能在Mac、Linux系统上运行Windows软件的一个框架。他们常年在全世界范围内招聘员工,进行远程开发Wine软件。他们正在招聘General Wine Developer (https://www.codeweavers.com/about/jobs),招聘要求大致如下:
[Requirements]
Strong C language skills. Compilers, linkers, macros and function pointers don't scare you.
Excellent debugging skills. You will be debugging applications whose source you do not have.
Familiarity with developing on and administering a Linux system (bash, unix utilities, package management, etc)
Ability to understand and debug build systems (Makefiles, autotools, etc)
Understanding of good development practices (source control, atomic commits, code readability, test-driven development)
Self-motivated to find work and learn new skills
No exposure to Microsoft code or reverse-engineering of Microsoft software
[Bonus skills we want] not required, but it helps
Win32 programming experience
Systems-level programming experience
Previous contributions to open source software
试问又有多少程序员能做到呢?而Wine软件是开源软件,任何人不需要登录就可以获得源码,又有多少人愿意自己研究代码,参与开发呢?
如果在中国没有办法找到工作,那么是否考虑过学习英语,去海外发展呢?真正对软件行业充满热忱,愿意投入时间和精力在行业中深耕,或者愿意花时间分析可能存在的需求,通过自己的软件能力去解决,也不至于无法以此为生。在上一个10年里,软件行业培训催生出一批为了钱而来的程序员,在经济下行的时候自然要稍微淘汰一部分人。但是总体来看,软件行业、计算机行业,正在经历AI的变革,还在影响着我们生活的方方面面,我们又如何能直接下一个“软件行业没啥前途”的结论呢?
就算真的做不到满怀热忱推动行业发展,那么做一名先行者,带领行业中的新人少走弯路,何尝不是功德一件呢?诸如左耳朵耗子、阮一峰、廖雪峰、游戏行业的云风等前辈,几十年如一日愿意分享自己的见识和理解,他们正在推动大家编写更加优质的软件,带领大家进行更为深度的思考。