写给20几岁的程序员

shellc 2022-03-04

tags: 程序员 

一代人终将老去,但总有人正年轻。

这是一个大龄程序员的分享,希望对20几岁的后浪们有点帮助。

大龄程序员是男的,15年工作经验,7年大厂经历,3.5年独角兽公司经历,目前瞎折腾当中。

好为人师是一种病,所以我尽量让病症表现得不那么明显,多分享经历和见解(主观),少表达情感。卖课割韭菜我于心不忍,所以尽量谈本质问题,而不告诉你该怎么学习Javascript或者Go,也不鼓动你去做SOLO或副业,更不想贩卖焦虑。但是我会谈到这些问题。

职业

你为什么选择写代码这份工作呢?答案无非两个,要么是热爱,要么是钱多。

先说我的经历吧。我读高中的时候,接触到了计算机和编程,DOS下的QBasic。今天看,QB肯定不是一个有品位的编程语言,但当时我却非常痴迷,以至于清醒状态下脑袋里都在想着怎么编码,甚至在脑袋里运行代码(因为上机实操的时间受限)。如果你在某件事情上有类似的行为,你就可以理解热爱编程是一种什么心理状态。

因为热爱编程,所以大学选择专业,毕业选择职业都没有任何纠结。自从接触互联网,被Web深深吸引,我的热情投注到了HTML和PHP。幸运的是,这种热爱,让我有机会分享到了互联网红利。

上面的故事发生在2000年前后,对绝大部分中国人来说,程序员当时并不是一个职业选项。2010年以后,才大量出现不会写代码的人,考虑以写代码为职业。可能因为程序员变成了一个还挺赚钱的行当。

我想说的是,如果你以写代码为职业,还是要认真想一下,你到底是把它当成一份还不错的营生还是因为你真的热爱这件事。这会影响你怎么思考后文我要讨论的问题,以及这些问题中,你可能面临的选择。

自动化机器

不管是否接受过CS专业的系统训练。很多人并没有思考过程序到底是什么?通俗的说法,程序是人和计算机交流的语言。稍专业的解释,程序会被编译为机器指令,让计算机做计算。

编程其实是制造机器的过程。我们编写的程序,最终会和计算机合为一体,成为一台新的,按照我们意志工作的机器。自从软件和硬件被分开,我们就获得了以极低成本(写代码),快速发明新机器的能力。

机器的作用是让很多事情可以自动完成,比如织布、算账、开飞机。当互联网把机器相互联结起来后,人和人的互动有了被自动化的可能,现在我们每个人手上都有一个能和其他人联结的机器。人和人的关系最复杂的联结构成了经济系统,而电商、支付、工业互联网正是经济系统的自动化机器。

程序员用代码制造新机器,参与世界的运行,这些嗡嗡作响的机器隐藏在全球数万计的数据中心里,还有你我的口袋里。

写程序是制造自动化机器的过程,整个世界正在(已经)被机器改变。正如马克安德森在2011年所说:软件正在吞噬世界。

很多程序员忽视了自己所具有的这种洪荒之力。当然,这种力量需要配合奇思妙想,才会真正被释放,大部分时候这种力量处于被封印状态。

软件工程师

造机器之说,听起来美妙。但如果从程序员的具体工作内容看,可能就不那么有意思了。

按照甲方爸爸的要求,把几个字符、数字输入进去再显示出来,并不是很有意思的样子。这种工作如何做得长久?

很多程序员对于职业的迷茫其实是对软件整体的理解出了问题。现代软件开发的分工,让岗位变得细分,不同岗位看到的可能不是机器,而是齿轮、油箱、方向盘。每一种零件的制作方法、维护方式和生命周期都不同,不同软件开发工作要解决的问题也不同。

对于程序员来说,不应该用编程语言来区分你的工作,编程语言只是制作某种零件的工艺。机器形态的寿命可能是100年,某种齿轮规格的寿命是50年,制造齿轮的工艺可能不足20年。目前形态的计算机出现已经超过60年,GUI大概40几年,Swfit编程语言只有8年。理论上来说,50年前的车削工艺也可以制造今天特斯拉车身的齿轮,就像任何图灵完备的编程语言,都可以制作大部分软件。新工艺让效率更高了,如果不理解工艺解决的问题,当更新的工艺出现,老师傅也就没用了。

程序员也不能用前后端来定位自己的工作。前后端只在Web这个特殊语境下才有,而且也不到20年,当下说的前后端分离,也不足10年。并且,前后端既不是一种技术,也不是一类问题集合。

设计机器的人是工程师,程序员也应该从内心深处认同自己的工程师身份(虽然很多其他行业的工程师不认同软件工程)。工程师解决的是某一类工程问题,而不是掌握某种工艺制作某种零件。

从这个角度看,用React写Web界面的程序员,应该是UI工程师,解决的是人机交互的问题。你应该把所有人和机器交互的技术都当做你待解问题的备选项。React、Vue、wxWidgets、SwfitUI,并没有什么区别,VR/AR、3D渲染也该有足够了解才对。

写后端业务系统的程序员,应该把自己理解为系统工程师。解决的是对现实世界做抽象,粘合各种组件,实现数据交互,同时满足规模和稳定性要求的问题。编程语言只是一种表达方式和粘合剂,对系统问题的分析、理解以及测试、灰度、热升级、可用性、数据一致性、可运维性等工程方法才是核心技能。

写分布式系统的程序员解决的是如何调度大规模集群进行存储和计算的问题。写数据库系统的程序员,解决的是如何原子、一致、隔离、持久存储的问题。不应该把自己称为C、C++、Go、Rust程序员。

找到自己岗位的目标问题,才能摆脱搬砖的认同感。能解决某一类工程问题比会写某种语言、会用某个框架职业生涯更长。所以,请叫自己XX软件工程师。

行业

赵本山在某电视剧里有句台词:没能力就说没能力,怎么你到哪儿,哪儿都大环境不好,你是破坏大环境的人啊。

用大环境为自己找借口当然不对,不过作为某个行业的从业者,社会分工的一员,大环境对自身的影响是确实存在的。比如,在线教育行业的工程师被大规模裁员,我们不能说是因为在线教育行业的工程师能力都很差。

作为一份用来谋生的职业,如何选择公司是一个现实问题。

如何划分软件公司呢?有很多标准,不过我认为,软件作为服务行业,其实是客户决定了软件公司的状态。

以客户类型划分,中国的软件公司一般被分为三类:面向互联网终端用户(2C)、面向商业客户(2B)、面向政府和国有企业(2G)。

2C互联网类公司面临的问题是新增用户见顶,流量红利消失,商业模式单一(流量变现),存量竞争激烈。如果你要选择这类公司,最好想一下,公司业务是否在上述挑战中有独特竞争力。内卷,是因为外部卷导致了内部卷。

2B的问题是真正服务大B的企业并不多,用产品服务大B的更少。服务终端零售类小B的公司要随着C端流量的玩法快速变化。即使服务大B也要面临被作为人力外包的窘境以及无穷无尽的定制化需求。通过SaaS或软件产品吃透一个垂直行业的公司可能是更好的选择。

2G的问题最严重,这完全不是一个靠技术拿到订单的市场。我甚至认为,浪费了中国一大半IT预算的G端客户,造成了中国软件的困境。一些非市场化的操作,导致了软件公司劣币驱逐良币,让软件公司无法通过技术做充分竞争。间接导致了软件工程师被当成廉价劳动力在低端领域被消耗。

上面的分类过于粗糙,一些互联网大厂也有不错的2B产品,一些小而美的初创公司,盈利能力也很优秀。

总体来说,软件对于商业组织的意义在于增加营收和降本增效。中国过去的发展过程在通过互联网营销增加营收方面做得非常充分,软件在降本增效方面的价值,远远没有被中国的商业组织接受。这是一个很大的话题,其中一个原因其实是人力成本太低,中国的软件价值发现,还需要更长的时间。但是也不要太灰心,趋势已经形成,这个过程中也会出现更多新的机会。

就当下来说,如何选择公司和岗位,还是要回到选择这份职业的初心,你到底把写程序当成一个谋生手段,还是你希望在工作中倾注你对写程序的热爱。如果是前者,你应该用找其他工作一样的心态去选择公司,工资代表你的短期收入,公司盈利能力强代表长期稳定性。如果你更在意工作内容本身的价值和意义,或许应该选择风险看起来相对更大,但让你更开心的地方。

无论哪一种,如果你打算以写代码作为终身职业,还是要提高自己解决某一类问题的能力,并密切关注这类问题本身的长期性和技术升级的变化。

35岁

“谢顶”和“35岁”是对程序员恶意最大的两个刻板印象。

通过日常观察,程序员的谢顶比例并没有明显超过其他行业。新一代的年轻程序员一样穿着时尚,发型潮流。

35岁问题是存在的吗?是确实存在的,泛指年龄较大的程序员职场竞争力下降问题。

超时工作是中国程序员的一种普遍职场状态。行业风气是一个重要的原因,大部分情况下,强制超时工作其实换来的是效率下降,并没有提高整体产出。这通常是因为管理者要满足自己的心理安全感,其实是管理能力低下的表现。管理者会武断的认为35岁的人不适合超时工作,通过用更年轻的人来替换大龄员工。其实,本质上是这类公司/业务并无核心技术竞争力,更年轻的程序员意味着更廉价。无脑一刀切排斥大龄程序员的公司,本身就意味着公司技术竞争力有问题,这反而给了程序员一个反向排除选择的机会。不过,如果你只能做低端的技术工作,也只能被这类公司在35岁时扫地出门。

很多大厂也一样存在这个问题。大厂的业务往往很复杂,不同的业务线和岗位,对技能的要求差异非常大。比如,某电商大厂的某个小业务,他的技术团队也只是基于公司的平台搞些稍有差异的CRUD。同时,底层平台部门的工程师,要解决的问题可能是全球最大的访问压力问题,这类问题是不可能用没有太多经验的年轻工程师强制换掉大龄工程师的。

很多HR、非技术管理者和媒体并不理解程序员的工作内容差异如此之大。在管理者看来,员工是一种生产资料,投入产出比才是这个问题的本质。薪水和产出对等的情况下,其实年龄并不重要,只有管理者和程序员都认识并接受这一点,35岁问题才可能解决。

创造价值

对于一些优秀程序员,他们其实是那种具备改变世界的潜在能力,却被困在了雇佣关系里的人。在大厂的合适岗位上努力生存或者去赌一个初创公司IPO的机会成了很多人的优先选择。

如果能够把程序员的职业看成一份普通工作,丢掉对于长期维持高薪和IPO暴富的过分期待,焦虑感可能会少很多。

找回编程的乐趣对于很多人更有意义,热爱一件事才能投注更多的想象力,靠想象力才可能释放编程这种力量,而创造更多可能性。

不要因为无法忍受工作去SOLO或创业,因为SOLO和创业的成功依赖更多条件,绝大多数工程师是不具备的。如何独立打造一个生意和如何编写一个软件是不同领域的问题,好的软件不见得是好的生意。所以,除了继续热爱编程,你还要思考如何通过编程创造价值,以及如何把价值转化为生意。这些努力带来的乐趣和可能性才是有价值的。

降低对于钱的过分期待,提高创造价值的热情。

财富

钱并不完全等同于财富,赚钱的能力才是。如果我们预期通过职业赚钱的能力会随时间逐渐消失,那么就有必要考虑打造新的赚钱能力了。

通过工作赚钱,本质上是在出卖自己的时间,你停下的那一刻,收入就没有了。如果你有能力创造自己的IP,比如书、软件作品、运转良好的业务,它们帮你赚钱的生命周期会更长。

其实钱本身也是一种生产资料,如果在收入还不错的时候,保留一部分钱,用来投资,赚钱的可持续性会更强。投资权益类资产本质上是把自己变成了公司的债权人或股东,是购买别人的时间为自己创造收益。

打造适合自己的投资方式是一个需要大量学习的过程。但是,这件事情值得投入精力。投资是一种放大收入的杠杆,可以让你从出卖自己时间赚钱的模式中提前解脱出来。

如果从分配的角度看财富,现有的经济系统和分配机制其实导致了财富的不均衡。假设社会平均收入是1万元,你可以赚到10万元,这意味着你可以支配(交换)10个和你一样的同类的生命(时间)。作为程序员,你的收入大概应该是远超过社会平均收入的,为什么还那么不开心呢?如果我说是欲望在作祟,你可能不会同意。

前几年互联网行业集中IPO的时候,很多员工获得了大量的财富,明显的一个变化就是这些公司停车场的豪车变多了,员工的离婚率升高了,财富让一些人的生活变得一地鸡毛。从天而降的财富放大了人的欲望,却没有增加人获取新财富的能力,欲望和能力的不匹配才是痛苦的根源。

百万年薪是类似的问题,行业、平台的快速发展导致从业人员的薪水被推高,一旦这种增长消失了,被推高的对于高薪的欲望靠什么满足呢?

打造自己脱离平台的赚钱能力,是建立自己的时间杠杆,而管理好自己的欲望才有可能获得真的自由。

意义

人的理性是有限的,根本上人受情感支配,我们一切的努力,是为了我们情感上认为有意义的事情。可能是亲情、良好的人际关系、某种让自己开心的爱好。我们应该诚实的回答自己,什么才是我们需要珍惜的,什么才是生命的意义。你在未来的36000天内,大概率是会死的。