程序员如何跨越35岁危机?这篇给点干货建议!

职场&认知洞察 丨 作者 / findyi

这是findyi公众号的第83篇原创文章

这两天在我的读者群里做了一个职业小调研,发现关注我公众号的70%以上都是程序员。

毕竟程序员吸引程序员,这也算猿粪吧,哈哈。

这个小调研也引发大家对程序员行业的激烈探讨,一个读者丢出了一张图,是大刘老师发的一段话:

不得不佩服大刘老师的洞察力和敏锐,不干这一行居然对我们这么了解!

突然瑟瑟发抖....

前文其实也写过一篇给码农后浪的六点建议,也提到程序员不是老中医,极容易被淘汰替代。

没办法,这的确是残酷的现实。

事实上,我们不用去抱怨也不用去郁闷。

我们更应该思考:如何尽可能的延长我们的程序员生涯。

另外一个事实是:优秀的程序员,从来不担心因为年龄大而被淘汰。

我身边有好几个45+还奋斗在架构一线的老哥,干的生龙活虎。

年龄增长的同时,竞争力和薪资依然同步增长!

今天我想跟大家聊聊优秀程序员必须掌握的那些知识。


 1 

程序员必读书单

除了工作实践,我们要精进技术,一定要多读技术书籍。

为了给大家推荐这份书单,我先后问了10多个技术大牛,要求他们只推一本觉得最牛逼的。

这些大佬包括阿里P9、百度T9、58技术总监、前58技术委员会主席等等。

结合我自己过去看过的技术书,挑出10本:

《代码大全》 

虽然这本书有点年头了,且厚到可以垫显示器。

但是这绝对是一本经典的书。

《程序员修练之道》 

这本书也是相当经典,我觉得就是程序员的指路明灯。

《代码整洁之道》

细节之处的高效,整洁成就卓越代码。

《计算机的构造和解释》 

经典中的经典,必读。

《算法导论》 

美国的本科生教材,这本书应该也是中国计算机学生的教材。

《设计模式》 

这本书是面向对象设计的经典书籍,掌握设计模式是让你的代码做到「高内聚、低耦合」的第一步。

《重构:改善既有代码的设计》

代码坏味道和相应代码的最佳实践。

《人月神话》 

软件开发这个行业能不能堆人数?怎么做好项目管理?如何敏捷迭代?

看完这本书,都会有答案,它适合任何软件开发行业的从业人员阅读。

《深入理解计算机系统》

这本书以程序员的视角全面讲解了计算机系统,深入浅出地介绍了处理器、编译器、操作系统和网络环境。

《C程序设计语言》

无论是做不做C/C++,这本书都值得推荐!

C语言是除了汇编之外,最能让你洞察计算机体系知识、计算机系统运行原理的语言。


 2 

一些硬核技能

程序员行业新技术发展迅猛,可以说是日新月异。

也正是这个原因,中年危机成为我们必须面对和攻克的问题。

思考一个问题:那些能工作到45、50、甚至60的程序员们,究竟具备了哪些过人的能力?

就我过去的经历和观察来说,我认为:他们掌握了一些硬核技能。

这些硬核技能帮助他们克服了年龄带来的劣势。

1.算法能力

很多程序员朋友觉得:如果我不从事算法相关工作。

算法可能对我没有价值。

虽然大多数程序员可能在工作中用不到算法,但这一点都不妨碍算法的重要性。

培养算法能力,就是训练了我们的编码能力、解构能力和超强的逻辑能力。

我一直认为编程的本质其实类似解数学题,那么算法就是最难的数学题。

码皇MIT教授Erik Demaine的建议更为直接:

If you want to become a good programmer, you can spend 10 years programming, or spend 2 years programming and learning algorithms.

如果你想成为一个码农或是熟练工(Code Monkey),你大可以不学算法,因为算法对你确实没有用。

但如果你想成为一个优秀的开发者(Developer),扎实的算法必不可少,因为你会不断的掉进一些只能借助算法才能爬出去的坑里。

2.裸编程能力

什么是裸编程能力?

处理程序实际实现部分的子任务,实现函数或者算法之类的能力。

听起来很简单对吧?实际上很多程序员缺失这样的能力。

不知道大家有没有见过「复制粘贴工程师」,Review他们的代码甚至会发现一些网上的注释,又或者其他人的编写错误。

并不是所有程序员都具备利用必备的基本编程结构有效的实现某个产品或者某个模块。

不少工作多年的程序员甚至连一个简单算法排序都没有考虑,当然这并不影响普通工作的输出。

充当代码世界的搬运工,如同搬砖工人一般,完全可以在职业生涯初期求得苟存。

但在面临调优或者攻坚,这类型的程序员的表现甚至比刚毕业的优秀程序员还要糟糕。

当他们步入中年,当他们承担越来越复杂的任务之际,无力感会与日俱增。

3.Debug能力

调试能力某种程度上比编码能力更重要。

在工作中,编码只占据了我们一部分时间,查找和解决BUG会占用更多时间。

查找BUG产生的根源不是一件简单的事情。

需要整体的分析和经验的沉淀,同时还需要对各种调试工具熟练应用。

团队的架构师除了架构设计,最重要的工作就是去解决那些其他人解决不了的BUG。

4.底层系统知识

处理复杂任务或解决复杂BUG时,具备深厚的底层系统知识非常重要。

比如数据结构、网络协议、操作系统相关知识,等等。

程序的很多问题都是源于对计算机工作原理的误解。

即使是使用高级语言开发的程序也一样。

另外,一些更偏应用层的架构或框架,基础一定是更底层的系统。

了解了底层原理,我们才能看穿眼花缭乱的技术背后的东西,不被层出不穷的新技术所累。

比如Docker技术兴起,改变了CI/CD的方式,推动了云原生技术的发展。

那么Docker到底是什么东西呢,其底层无外乎:CGroups进行资源限制、Namespace对进程视图修改、rootfs为容器进程提供隔离后执行环境的文件系统。

了解了Docker的底层原理,才能在实际工作中更好的驾驭Docker。

以上四点,作为程序员,需要深耕取得突破。

大家可能会注意到,我并没有推荐任何一门语言作为基础能力。

对于真正的程序员大牛,语言只是工具,并不是本质。

这些大牛可以很轻松的熟练使用多种语言来实现业务目标。


 3 

领略代码之美

你如何看待编码这件事?

是把它当作一份简单重复的工作,还是像打造艺术品一样精雕细琢?

这个问题的答案恐怕决定了你是否能成为一名优秀的程序员。

代码世界充满了美轮美奂的风景,充满了领略美丽之后的喜悦。

如果不具备找到代码之美的能力,恐怕并不适合这个行业。

下面说说有哪些代码之美:

一.优美的代码

可读性高的代码才有可能是优美的代码。

相信大家都有过这样的经历:接手一个项目要修复bug或者开发新功能,发现代码可读性非常差。

哪怕是在有说明文档的情况下,都不太敢提交代码,唯恐引入新的bug或者直接导致系统崩溃

《重构》里有这么一段话:“任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。“

那么如何写出可读性高的代码呢?

有如下建议:

1.不要写过长函数

可读性差的代码有很多特征,其中最典型的就是存在大量过长的函数。

2.过于复杂的类

3.过于复杂的依赖关系

4.注释要简单明了

二.优美的架构

并不是架构师,才会跟架构打交道。

一旦我们开始编码,架构就是必备技能了。

我尤其建议:在写任何功能之前,先想清楚代码架构。

设计优美的架构要做到如下几点:

1.稳定性原则

架构尽可能的简单,清晰,不过度设计。

2.高内聚低耦合

鉴于这个展开讲完全可以写一篇文章,下次专门写下。

3.隔离

稳定业务和易变业务要分离处理,核心业务和非核心业务要分离处理。

应用和数据要分离,服务和实现细节分离,前台和后台分离。

三.重构之美,不断打磨你的艺术品

无论我们怎么努力,也很难一下子就写出可读性很强的代码。

这就像写文章一样,我们的大部分精力都放在表达思想上面,文从字顺有的时候就不太顾得上。

写代码,第一要务是能运行,能实现软件系统的功能。

《代码整洁之道》的作者写道:“我没指望你能够一次过写出整洁、漂亮的程序。如果说我们从过去几十年里面学到什么东西的话,那就是编程是一种技艺甚于科学的东西。要编写整洁代码,必须先写肮脏的代码,然后再清理它。”

很多人写出了可以运行的、“肮脏”的代码,或者说接手了一个可读性比较差的系统,往往不愿意去重构它们。

他们的理由看上去是十分充分的,那就是容易引入新bug。

事实上,不断重构才能让你的代码始终具备「可维护性」。

同时重构的过程,是一个飞速提升代码能力的过程。

多年前,我曾接受一个几十万行代码的工程。

一个类就有2万行,一个函数几千行.....

我花了半年时间,在保证上线迭代的同时,把这个工程彻底重构。

这个过程的确收益良多。


最后的话

成为优秀程序员的路并不好走,你可能要经历孤独、自我怀疑、放弃、痛苦、绝望。

但,这世间所有好走的路,都不值得去走。

只有那些难走的路,征服它才会收获巨大。

跨越泥泞小路,才能抵达理想彼岸。

祝我的程序员读者朋友们,都能成为优秀程序员。

祝大家都能开心Coding每一天。


【您的在看,我的莫大鼓励】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode455. 分发饼干

一:题目 二:上码 class Solution {public int findContentChildren(int[] g, int[] s) {int ans 0;int gIndex 0;int sIndex 0;Arrays.sort(g);Arrays.sort(s);while (gIndex < g.length && sIndex < s.length) {if (s[sIndex] > g[gIndex]) gIndex; //只…

写了多年代码,你会 StackOverflow 吗

写了多年代码&#xff0c;你会 StackOverflow 吗Intro准备写一个傻逼代码的系列文章&#xff0c;怎么写 StackOverflow 的代码&#xff0c;怎么写死锁代码&#xff0c;怎么写一个把 CPU 跑满&#xff0c;怎么写一个 OutOfMemory 的代码。今天主要来看 StackOverflow&#xff0c…

C#实现迭代器

迭代器模式&#xff08;Iterator&#xff09;&#xff0c;提供一种方法顺序访问一个聚合对象中的各种元素&#xff0c;而又不暴露该对象的内部表示。C#中使用IEnumerator接口实现&#xff0c;Java中使用Iterator接口实现&#xff0c;其中原理都差不多&#xff0c;下面我就用C#代…

从CLR GC到CoreCLR GC看.NET Core为云而生

内存分配概要前段时间在园子里看到有人提到了GC学习的重要性&#xff0c;很赞同他的观点。充分了解GC可以帮助我们更好的认识.NET的设计以及为何在云原生开发中.NET Core会占有更大的优势&#xff0c;这也是一个程序员成长到更高层次所需要经历的过程。在认识GC的过程中&#x…

springboot邮件发送(牛客论坛项目之QQ邮箱发送)

一:邮箱发送原理 1:狂神图解 张三通过smtp协议连接到Smtp服务器&#xff0c;然后发送一封邮件给网易的邮件服务器网易分析发现需要去QQ的邮件服务器&#xff0c;通过Smtp协议将邮件转投给QQ的Smtp服务器QQ将接收到的邮件存储在456789qq.com这个邮件账号的空间中李四通过Pop3协…

如果淘宝双十一架构用. Net Core,如何“擒住”高并发、高可用、低延迟?

电商的秒杀和抢购&#xff0c;对我们来说&#xff0c;都不是一个陌生的东西。然而&#xff0c;从技术的角度来说&#xff0c;这对于Web系统是一个巨大的考验。当一个Web系统&#xff0c;在一秒钟内收到数以万计甚至更多请求时&#xff0c;系统的优化和稳定至关重要。缓存技术是…

.NET5在开发平台上远优于Java,如何发挥优势?

上周.NET5 RC2已发布&#xff0c;.NET5已经肉眼可见的即将到来&#xff0c;令人期待&#xff01;从.NET Framework到.NET Core再到.NET5&#xff0c;能看到诸多开发者和公司都在积极拥抱新技术。对比Java&#xff0c;国内主流开发都还停留在Java8&#xff0c;在云原生的互联网时…

leetcode122. 买卖股票的最佳时机 II

一:题目 二&#xff1a;上码 class Solution {/**思路:1.局部最优:我们买入当前股票等哪天遇见最大值的时候买出 赚最大利润2.全局最优:局部最优推出全局最优3.这个利润是可以被分解的 7 1 5 10利润: -6 4 5那么最大利润是459其实就是1买入10卖出,但是我们可以在5这天…

多重继承和菱形问题

翻译自 John Demetriou 2018年4月8日 的文章 《Multiple Inheritance And The Diamond Problem》[1]开篇之前&#xff0c;我假设每个人都知道在面向对象编程中继承是什么&#xff0c;以及它能提供什么好处。我不会深入探究对象继承的基础知识。这篇文章更关注于多重继承和它所面…

Jekins持续集成在ERP研发中的应用实践

源宝导读&#xff1a;“持续集成”是敏捷最佳实践中&#xff0c;保证高质量交付的关键环节之一。本文将介绍明源云ERP系统在研发过程中&#xff0c;应用Jekins平台完成持续集成自动构建的实践。一、认识持续集成持续集成是一种软件开发实践&#xff0c;即团队开发成员经常集成他…

leetcode45. 跳跃游戏 II(java详解)

一:题目 二:上码 class Solution {public int jump(int[] nums) {int ans 0;int curIndex 0;//当前统计出来的可以移动的最远距离的下标int nextIndex 0;//在到达 当前最远距离下标的这段距离内 我们统计出的可以达到的最远距离//如果在统计的过程中 其覆盖范围已经大于数组…

Ids4 认证保护 API 方案更新

壹时刻保持学习的喜悦可能你咋一看这个标题不知道什么意思&#xff0c;其实我也没想好怎么表达&#xff0c;因为是一个特别简单的小知识点。先说下为什么突然说到了Ids4&#xff1f;这几天大家都知道&#xff0c;我在视频《微服务之eShop讲解》&#xff0c;目前讲到了购物车微服…

dotNet Core 3.1 使用 Aspose (部署 Docker)

在之前的文章《dotNET Core中使用Aspose&#xff08;部署Docker&#xff09;》中介绍了在 dotNet Core2.1 中使用 Aspose &#xff0c;并部署到 Docker 中&#xff0c;现在 dotNET Core 升级到了 3.1 &#xff0c;Docker 镜像发生了变化&#xff0c;一些依赖的安装也有些变化。…

MySQL之一条Update的执行流程

文章目录1:执行的语句2:在更新操作中流程中特有的部分(1):redo log&#xff08;重做日志&#xff09;(2):binlog&#xff08;归档日志&#xff09;(3):Redo日志跟binlog日志的区别2:执行流程1:执行的语句 update T set c c 1 where ID 2;2:在更新操作中流程中特有的部分 (…

教你打入clr内部: 配置windows上的windbg,linux上的lldb

一&#xff1a;背景1. 讲故事前几天公众号里有位兄弟看了几篇文章之后&#xff0c;也准备用windbg试试看&#xff0c;结果这一配就花了好几天&#xff0c;(づ╥﹏╥)づ&#xff0c;我想也有很多跃跃欲试的朋友在配置的时候肯定会遇到这样和那样的问题&#xff0c;所以我觉得有必…

leetcode周赛6076. 表示一个折线图的最少线段数

气死爹了 用C过不去 换成Java 过了 一:题目 二:上码 class Solution {public int minimumLines(int[][] stockPrices) {Arrays.sort(stockPrices,(o1,o2)->o1[0]-o2[0]);int n stockPrices.length;if (n 1) return 0;int ans 1;for (int i 0; i < n-2; i) {int k1 …

使用代码片段的正确姿势,打造高效的vscode开发环境

全文3928字&#xff0c;阅读时间 10分钟&#xff0c;未来节约时间 15分钟/每天代码片段&#xff08;code snippet&#xff09; 相信大家都或多或少有接触过。在完成一个项目以后&#xff0c;往往都会写出许多有价值的代码&#xff0c;或是绞尽脑汁解决的难题&#xff0c;或是灵…

leetcode周赛6074. 字母在字符串中的百分比

这个简单题也比较狗 上午做的时候一直有个测试点不过 但是题目不给出什么测试点不过 原来是100这个答案 给跪了 一:题目 二:上码 class Solution { public:int percentageLetter(string s, char letter) {if (s.size() 0) return 0;int count 0;for (int i 0; i < s.si…

leetcode周赛6075. 装满石头的背包的最大数量

一:题目 二:上码 class Solution { public:/**思路:求差&#xff0c;将结果放到一个容器当中&#xff0c;然后的话&#xff0c;排序&#xff0c;*/int maximumBags(vector<int>& capacity, vector<int>& rocks, int additionalRocks) {vector<int> …

学完这篇依赖注入,与面试官扯皮就没有问题了。

IOC: Inversion Of Control 控制反转DI: Dependency Injection 依赖注入1.控制反转 Inversion Of Control 的前世今生1.1 IOC理论产生的背景讨论控制反转之前&#xff0c;先看看软件系统提出控制反转的前世今生。一个完整精密的软件系统&#xff0c;组件之间就像齿轮&…