JaneGwaww

Share it. Celebrate it. Build it.

View the Project on GitHub

作为大龄程序员,你如何持续的保持自己的竞争优势

  1. 作为一个成熟的程序员
  2. 我们还很年轻
  3. 从来都不要按套路出牌
  4. 写代码是一种生活方式
  5. 活到老学到老
  6. 发展出自己的科技树
  7. 说了这么多最后还是要回到多写代码

老兵永远不死,他们只会调零。

–英国民谣

在中国的科技公司有一个奇怪的现象,就是35岁成了这些公司程序员的一个分水岭,35岁以上就面临辞退,失业,找工作难,生活压力大等问题。

首先能造成这一现象的一定是有一定的卖方市场,只有源源不断的新鲜人才挤入这个行业,卖方才能噬无忌惮的越俎代庖把老兵给过滤掉。其次不平等的雇佣关系,这在中国是一个普遍现象,员工永远处于弱势的一方,这在你与公司对簿时你几乎不可能有什么胜算,面对这种情况时你也只能小心冀冀尽量保护好自己,这在文明世界是无法想象的,因为我们人类文明发展了几千年确还是处在弱肉强食的从林规则中,前人所做的努力似乎化为了泡影。再次是混乱的市场关系,面对这个新兴的行业,很多人都想往里面挤,当然也有大环境不好的原因,也就造成了人才市场的水平高低不一,如果一个公司的人力资源系统不专业可能造成蛇吞大象的现象,双方都不清楚对方的需求,结果都在浪费对方的时间。

中国公司能如此吃人血馒头有一部份是毫无顾忌的环境,还有对利益无下限的追求。他们还有对解雇35岁人才做出解释说是没有什么能力,工资又高,吃空饷,到一定年龄没有升职等,这些解释让人难以至信, 因为中国公司是强势一方,然后又做出如此强势的解释,这属于是流氓了是。如此的环境造就的公司一个个都是吸血鬼,只会吸取先进技术所带来的好处,未对开源1社区有任何的贡献,中国市场至今能拿的出手的开源项目寥寥无几,很多大型公司基本都依赖于国际上著名的开源软件,没有任何自己的东西,在国际上不管是技术还是名声都没有任何竞争力,甚至还输出焦虑2

在如此环境下的开发者门自然也是向金钱看齐,不会去专研所谓的技术,很多技术停留于表面的运用,不会去深究里面所运用到的知识,这样的结果就是他们的可替代性太强了,因为你没有去深耕一些领域导致的结果就是别人在你的岗位上看看文档熟练下流程就可以轻易上手了,不需要太多的经验和磨练,而这是不可能让自己保持竞争力的。我们之所以喜欢写代码是因为他带给我们乐趣,我们操纵一切然后得到我们想要的结果,他能对我们的操作做出即时的反馈,他就像是一个永远着摸不透的玩具,时时吸引着我们继续探索,而不是变为一个单一的工具,每天重复着同样的劳动,消耗着我们的精神。而那些计算机的先驱们可都是对计算机充满热情的,而正是这份热情激励着他们不断的去挖掘各种可能,肯尼斯·汤普森3曾说过:

我一直着迷于逻辑问题,甚至在小学时,我就开始研究二进制的算术问题了,诸如此类的。只是因为我对此充满着着迷。

作为一个成熟的程序员

不要再存在不切实际的幻想:开发出一个软件然后大火成为百万富翁。时代已经不一样了,现在的人已经被各种软件占据自身的时间了,很难再有软件能迅速吸睛并且长久持续下去。我们应该踏踏实实做好自己的工作,把自己的服务越做越好,等哪一天你的服务市面上最好且没有可替代的竟争对手时,你的成功就是自然而然的事情了,不需要你去苦苦追求,而这一天到来时你只需要平静的面对他就可以了,你只需要做好手头的工作,日益精进自己的技术,挣好一份工资就行了。

开发可以像音乐家、艺术家、医生一样成为一个长久的职业,你可以做10年20年或者一辈子,一份有挑战性的工作需要一位经验丰富的工程师,而你的经验越多就越能胜任这份工作。而一位后辈的成长也需要一位前辈的开点和指导,软件是主要依靠自身探索和自学的行业,大家也非常乐意去分享经验解决问题,所以一份具体的有建设性的建议也将是让人受益匪浅的,可以说是“听君一席话胜读十年书”。所以你要清楚这并不是什么青春饭行业,我们应对自己的前景有明确的认知,而技术从来都是与大众审美格格不入的,他只有使用的多寡之分没有好坏之分。

不要再去争论语言的使用,每个语言都有他自身的使用环境,只要你自身技术基础好学什么语言对你来说都不是什么难事,语言只是手段不是目地。也不要固执于某个技术,技术都是会更新换代的或者被其他技术取代的,而我们自身的成长不能绑定在某个技术上而做为长期的依靠。我们需要的是靠自己的努力多去学习,以及在这条漫长道路上不让我们迷路的指路灯,例如程序员修炼之道-从小工到专家,并顺应技术的进步与时代的变迁,养成良好的习惯减少不必要的失误。

我们还很年轻

软件行业是一个如此年轻的行业,以至于发展到现在还不到100年的时间,在这段时间里诞生了许多无可比拟的大公司,虽然他的起源要追溯到几百年前,但是现代软件行业的兴起应该是从第一个高阶语言FORTRAN开始的,至今也就65年,已经接近现代语言甚至更抽象一点的语言LISP、Algol、COBOL至今也就63年左右。也就是在60年代出生的人他们就见证了整个技术行业发展的历程,从第一台电脑到便携手机,从第一封邮件到联通世界的互联网,从实验室到科技公司占领世界等等,他们都亲自见证了这一切。

艾伦.凯4面向对象编程语言的发明者,应该是目前能找到的这个行业资历最老的人了吧,59岁,他在35年前的用户图形界面展示5让人印象深刻。作为对比的是音乐界最老的大提琴大师马友友6,1955出生4岁开始练琴,如今已经66岁了,另一个是吉尼斯最老职业音乐人保持者卡斯帕.马龙7至今已有80高龄了。也就是说这些音乐大师比真正的软件行业历史还长。

当你想去学习一门技术的时候,不要有是否会过时这种想法,技术总是变化的但是你得到的经验和从中学到的思想是可以伴随着你的。我记得自己看SICP8这门课程时,他带给我的振撼前所未有像是发现了新大陆,我没想到一门语言还能这样神奇,后面我再看其他语言时基本没带给我任何新意都是新瓶装旧酒。所以关键并不在于你选择了什么技术,很多技术都是有一定共性的,而是你用这个技术做了多少事。在实际工作运用 中学习技术,更多的去动手操作他。一味的追随潮流什么火就学什么的结果就是你很难形成自己的技术优势,被潮流托着走。

我们还需要更多的向其他领域学习,当DALL-E 2能学会绘画并获得了艺术奖之后,我意识到我们还有很多可以做,我们是否还能作音乐,作艺术设计,做预测做证明等,我们做为一个年轻的行业还有很多需要向其他领域学习,这些领域都是发展了上千年的了。

从来都不要按套路出牌

软件行业是实操性很强的行业,相对于传统行业的师父领进门修行靠个人我们是不修行的而是真接实操。与其思考这行代码如何运行,运行后会不会有BUG,有BUG怎么修复等问题,你应该直接把代码写出来并运行它。每时每刻都有技术的轮番更替,你很难按既定的路线循规导矩的学下来,你要做的是看中哪个技术,然后直接动手去尝试,不要说等到适当时宜时再去学习或尝试他,因为学习一门技术最好的时间是十年前其次是现在。让自己尝试不同的技术或领域,如今的环境是不可能一个技术通吃所有功能的,与其花40年精通一个技术领域,不如用10年时间学习4种不同的技术领域,因为技术是螺旋形结构他们之间是共同进步相互促进的,而不是木桶效应。

让自己做的事带有目地性,做这个事或写这行代码能给你带来什么好处,是物质上的还是精神上的都行,都没有的话就不要轻易去做了。写这个软件能给我带来不错的收入,或者他对我技术精进有一些帮助等,想想你能从中获得什么? 或者当你陷入一种枯燥的工作中,这个工作已经不能带给你什么了,那是时候考虑换一个工作或者去度个假了,我们需要让自己做的事有意义。

开发并不存在等级制度,所谓等级只是外面的人造出来用于匹配工资用的。我们已经有了憨实的基础,有可能在任何时候为了某个需求去学习某个技术,所以没有所谓等级来定义我们的情况的。我们也都随时都在学习进步,也在不断的尝试并吸取教训经验,我们不能让自己停滞不前。

写代码是一种生活方式

把写代码当成生活的一部份,像洗澡、化妆、吃饭、写日记一样平常,避免去制定目标然后去实现目标,特别是长远的目标,然后制定详细计划如何一步步的实现目标,完全没必要,首先我们不清楚在这个过程中会有哪些不可抗事情发生,其次这么做也大大了限制我们的能动性和可周旋的余地,然后是没有人能够预测未来会发生什么,而你的目标到那时又能带给你多大的价值呢。我们需要做的就是做好当下的事情,未来不可测的事就未来再说。

把学习也作为生活的一部份,每天搜索引擎找资料,StackOverflow找答案都是一个学习的过程,他人能回答出你不知道问题就值得我们学习。写代码是没有任何门槛的,你现在打开浏览器打开CodePen就可以真接写代码。当你如此日常的日复一日这样做,10年20年之后你也将惊叹于生活的游刃有余,和自己用代码创造出来的东西。也培养一下其他方面的爱好,例如弹弹吉他玩玩音乐也是一个不错的选择,可以作为生活的调味剂。

把工作和职业分开,做开发可以跟音乐家,艺术家一样可以成为你职业生涯的一部份,可以成为你生活的一部份,就像现代大部份人那样,没事刷刷抖音看看电视,空闲时写写代码也是一件有趣的事。做开发也可以找到好的工作,你可以用他挣取一份不错的工资。有些人不喜欢一些工作,可能是因为9969也可能是因为枯燥无味复杂代码等,但是他不会停止写代码,不是说工作没做了就不写代码了,写代码从来都不是枯燥无味的,工作才是。我们在学习过程中也注意区分工作与职业,有些建议在工作中很有用,但是可能对自己的职业没有任何帮助,例如把客户的需求放在第一位、用什么技术不重要产品好才重要等,这些建议在工作中没有问题,但是我们不要把这些建议代入自己的生活中,还可能对自己的职业造成误会。

活到老学到老

你不必做到一鸣惊人,在技术领域要做到被众人所熟知除了能力,还要天时地利人和,像现在还在世的艾伦.凯因为发明了面向对象编程语言而被推崇,而他那个时候做出的东西确实让人很惊艳,现在语言基本都有这个功能了,但这毕竟是少数。我们不要因为自己没有进入这个行业足够早而不如他们优秀而懊恼,这个行业还是満足1千小时定律10的,只要你练习的足够久满足这个条件你也可以成为专家,那些比你早几年写代码的人也比就你多几年经验而已。没有所谓的自己太老了不适合进入这个行业了,从来没有这样的说法以后也不会有,你只需打开网页开始写代码。

作为实操性很强的行业,关键不在于你学到了什么而是你做了什么,在学习软件这块只进行理论设计方面的学习没有动手操作,到最后做出来肯定都是错误的,在做的过程中学习就是最好的学习方法。例如先写上一段代码,然后发现这段代码无法运行,说明你的语言基础溥弱,那就多花点时间去学习这个语言的语法。之后该代码运行成功了,但是运行终端各种报错,说明关于代码格式与样式你没做好,那就花点时间看代码美化方面的书,例如程序设计实践。现在代码运行的很好,但是当我加入更多功能之后,我发现自己代码杂乱无章,没有任何可看性,且重复、累赘、全局变量代码很多,这时候就是你的设计模式不好,花点时间看看关于设计模式方面的书如设计模式-可复用面向对象软件的基础。当运用设计模式解决当前问题之后,你发现自己的代码运行平均时间比较慢,那你就可以看看重构-改善既有代码的设计了。这个时候这个代码就很好看了,然后我们可以进入下一阶段的学习了。然后一直重复这样的过程,构建-发现错误-学习知识-修复错误,他的好处是让你一直重复学习操作这个过程,能把你学习的知识立即运用到实践中。

我们需要注意学习方法,我们在向其他发展了几千年的领域学习时,不仅仅是他们的成果,更是他们的教育理念,因为音乐艺术都是追求完美的行业,所以他们着重熟能生巧,一首曲子一个鸡蛋在这个行业重复几百次几千次的练习都是家常便饭。可是在软件行业盛行不要重复造轮子的风气,我们想把重复的工作交给计算机来做,我们专注于新功能的开发。可是这样并不利于我们的学习,我们可以像其他领域一样,重复的造轮子研究代码并解决其中产生的问题,我们不要被一些偏见影响,像是重复造轮子或者像是有人说已经有现成包可以解决你这个问题你只要使用它就可以了等,短期看这是个不错的建议,但是我们希望你能尽量自己去解决这些问题,只有这样我们才能进步,按照自己的想法去解决问题去学习才可能做到无可取代。

发展出自己的科技树

我们都是从新手开始的,我们都是从学校、网络、博客、书本上学习这个行业的基本技能,但是这些都是工作需要的基本知识,没有什么可骄傲的,或者有的人再多几年的工作经验,但这也仅仅只是工作水平的区分,还做不到声名鹤立。我们想做到独一无二还需要有自己的贡献,有自己的名声或品牌。你可以在自己善长的领域分析细节,深度解析自己使用的技术或者自己分析的领域能够大火并且源源不断的有资金流入,例如比特币火起来之前你有一篇博客分析比特币的技术总结和区块链安全,那你就能迅速积累起自己的名声。你也可以在开源项目上做贡献来获得地位,例如现在的Kubernetes,如果你之前有参与这个项目,那你现在就可以提前退休,当一个技术咨询就够了。

你可以学一些其他领域技能,这样可以帮助你更能胜任一些专业领域的工作,例如你学过金融相关的专业,那么在做金融系统相关开发时,你就有一定的专业优势,对于需求的把控与理解也更加的得心应手,也能洞悉该领域的发展方向更好的服务于产品。

我们都曾被问起工资的问题,例如”高级程序员工资开多少比较合适”、“我是有15年工作经验的程序员工资应该开多少比较合适”..。这种问题外行不懂问问就算了,如何你是经验丰富的工程师也问这种问题就很滑稽了,因为首先资深工程师都有自己的善长的领域,没有说两个有15年工作经验的工程师的技能树是相同的,所以你用一个标准去衡量两个完全不同领域的资深工程师是不可取的。其次能问出这个问题说明你对自己经营的领域不够了解,这就很难让人相信你经验的真实性了。更妥当的说法应该是”我在该领域有15年的从业经验,是否应该主导这个项目的开发”,而如果你刚好符合他们的人选,那么接下来他们应该问的是“在你这15年的从业生涯中你都做过什么?”。

还有我们不能吊死在一棵树下,不要死抓着一个技术不放,技术是多样性的,我们人也总是充满好奇的,我们更应该去尝试不同的技术,吃老本从来都是不可持续的,也限制了我们看待问题的视角,在我们做项目遇到问题时我们应该多方面想办法去解决它,死抠一种技术是没有出路的。看待问题的视角这个很重要,软件行业不仅仅只是技术,更是使用技术的人,我们更多的是与人打交道而不是与机器打交道,所以我们更要尝试沟通,沟通的好能解决很多问题。在技术方面,不同的技术也能教我们不同的思考方式,例如如果使用Haskell语言可以帮助我们了解函数式编程思想,所以放开思维尝试不同的技术。

说了这么多最后还是要回到多写代码

学一门语言实际上就像学下棋一样简单,你可以在很短的时间内把象棋的所有规则教给别人,但是你要驾驭这些规则,并且通过熟练的运用规则成为象棋大师是很难的。

–Harold Abelson(SICP)

大道理大家也都听过很多了,积少成多,积水成渊等等,但是还是要再次强调软件行业是实操性很强的行业,任何的意见和建议都是建立在你去做了的基础上的,当你的项目无法落地时,任何的建议都是空谈。

写在后面

NO. Content
1 分享最近阅读的书籍清单(一)
2 分享最近阅读的书籍清单(二)
3 分享最近阅读的书籍清单(三)
4 如何面对35岁
5 分享最近阅读的书籍清单(四)
6 为什么你应该学习多种语言及哪里可以学到他们
7 作为大龄程序员,你如何持续的保持自己的竞争优势
8 程序员在职场中如何缓解过度焦虑
  如果喜欢该文章欢迎Star我的github
  捐助我的游戏,支持我的创作
  我的社区更新地址
  email: janegwaww
  Home Page

Footnotes

1 开源软件维基百科

2 某音在英国推行996结果招集体抵抗

3 Kenneth Lane Thompson(生于1943年2月4日)是美国计算机科学的先驱。Thompson的大部分职业生涯都在贝尔实验室工作,在那里他设计并实现了最初的Unix操作系统。

4 Alan Curtis Kay(生于1940年5月17日是美国计算机科学家。他被选为美国艺术与科学院院士、美国国家工程院院士和皇家艺术学会院士。他最出名的是他在面向对象编程和窗口图形用户界面(GUI)设计方面的开创性工作。2003年获得图灵奖。

5 Alan Kay: Doing with Images Makes Symbols (Full Version)

6 馬友友维基百科

7 Kasper “Stranger” Malone wiki

8 MIT CS6.001

9 9点上班9点下班一周工作6天

10 只要你练习超过1千小时你就可以成为这方面的专家