职场&认知洞察 丨 作者 / 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每一天。
【您的在看,我的莫大鼓励】