阅读源码的真正价值

大家好,我是Z哥。

最近有位小伙伴求职遇到一些挫折,来找到我聊,其中有问到一个涉及到「阅读源码的必要性」的问题:“有很多场面试,面试官都有问到某个框架的某个功能是怎么实现的,难道真的要去看源码吗?但是感觉看源码除了面试有用,平时没啥用……”

我想可能有不少人都有一样的想法,所以我把我对阅读源码这件事的看法在这里和大家分享交流一下。

我曾经和一位同事聊天的时候打趣说,程序员可以分为4个层次。

1. 有阅读并吃透大型知名框架的能力

2. 能够知道并通过阅读框架源码来解决问题

3. 能够知道并通过找官方文档来掌握框架的使用

4. 需要有人手把手教或者自己踩过很多坑才能掌握一个框架的使用

这其实也体现了我对阅读源码这件事的看法。想成为厉害的程序员,阅读源码的能力必不可少,并且能够hold住的源码复杂度越高,水平越高。

我们程序员虽然每天都和代码打交道,但是大多数时候都是在「写」而不是「阅读」。唯有在接手一个新项目的时候,才会被逼着在短时间内阅读大量源码。毕竟,大多数情况下我们一直在固定的项目里“深耕细作”,阅读其它项目的源码,似乎对手头的项目没什么用。

但是在我看来,coding就好比写作,如果你想写出好文章,必然需要掌握很多语言组织上的技巧。比如,排比句、反复句等句式,比喻、拟人等修辞手法等等。这些其实就类似于coding中我们需要考虑的设计模式、算法这些东西。

在我们学生时代,老师会引导我们阅读大量的课外文章来提升这方面的能力,学习别人的写法,摘录别人的金句等等。

其实coding也是一样,如果你平时如果不多积累一些“美化”代码的“套路”,如何能写出优雅的代码呢?

所以通过阅读源码来提升你的编程能力,和阅读好文章提高自己的写作能力是一样的。

从这个逻辑也可以衍生一个新的逻辑,就是单凭自己顿悟、踩坑来提升编程技能的速度,必然比不过借助阅读别人源码来提升的速度。毕竟,参考、借鉴别人的东西可容易多了。你看,有哪个大文豪是不是阅读了大量的优质书籍?

回到本文的核心问题上,在Z哥看来,阅读源码的价值有很多,面试的作用只是一个短期价值。我认为它至少有以下5个价值。

/01  短期价值/

01  面试

正如前文提到的那位来找我咨询的同学,他也知道阅读源码对面试的作用是很大的。

因为有些实现细节如果我们只是会用,但不去看源码了解细节,其实就是所谓的“知其然而不知其所以然”。

比如,ArrayList 和 LinkedList 的区别?想要回答好这题,必须从源码入手,了解 ArrayList 和 LinkedList 底层实现。如果你没有阅读过源码的话,这道题肯定是回答不太好的或者回答的时候底气不足。

/02  长期价值/

01  在工作中更快地上手新项目

正如前文所说,每个程序员的职场生涯中,都无法避免“阅读源码”。因为你不可能一直在一个项目里工作,必然有机会接手很多陌生的项目。此时如何快速的了解项目的脉络、结构,以便自己快速的展开工作?这个时候,阅读源码能力高低就体现出来了。

虽说,如果上一位接手者还在职的话可以请教他,但是人家不可能真的像网传的「结对编程」图片那样,手把手解释给你,你说是吧?大部分时候还得看你自己的阅读源码能力。

▲图片来源于网络,版权归原作者所有

02  给自己创造用新技术的机会

很多技术人会抱怨工作中用不到新技术,一直在用老旧的技术。如果你寄希望于公司层面来推动一个新技术的运用,那就有点看缘分了,可能直到你离职也不一定会有这样的机会。

毕竟站在组织的角度来说,我现在项目跑得好好的,为什么要用新技术?新技术对我有什么好处,值得让我承担未知的风险?

但是如果你对某类技术其中之一的框架有源码级别的了解就不一样了。你可以借此主动推动运用某项新技术。因为你可以具体说出很多具有说服力的观点,

  • 这个新技术到底好在哪里?

  • 能够改善或者提升当前的系统的某几项能力?

  • 为什么它可以提升这些能力?

  • 它是怎么实现的?

  • 如果我们要用它,需要提前对哪些知识进行储备?

  • ……

况且,有时候组织层面不敢贸然使用新技术,可能也是担心没人能hold住这项新技术,万一出现什么问题无法及时解决怎么办?此时,如果他们发现这里有一位阅读过源码的伙计,这份担忧必然大大降低。

03  完善知识体系

那些大牛之所以能够在自己专攻的领域内无所不知,是他真的记忆力好吗?并不是,而是他的知识已经形成了体系框架。

完善体系框架的过程必然是你主动而为之,单凭工作中遇到问题时的百度、google是无法形成体系结构的,因为那些都是零散的碎片化知识。

如何快速的摄入大量原本就已经成体系化的知识?那些成熟的框架中就是啊,一个功能越庞大的框架,它所覆盖的知识面就越广,如果你能吃透它,你就可以快速扩充这方面的知识体系。这个过程简直就像是偷偷学了一本乾坤大挪移。

所以,阅读源码是一个加速你知识体系完善的有效方法。用不了多久,你也可以成为别人眼中的大牛。

04  学习别人的设计思路

靠自己领悟自然也能逐步成长,当然前提是你得能够「领悟」到什么。但是以这样的路线来成长,你会陷入以下两种境地。

  1. 自认为自己的设计很牛逼,而实际上……

  2. 觉得这样设计代码很变扭,但是又不知道有什么更好的方式。

如果你阅读过足够多的优秀源码,能够不断地吸取他人之长,这些情况自然就不会发生了。因为当你在看那些优秀的源码的时候,会有很多惊喜的过程。

“原来这里还可以这样来设计”、“对呀,这么设计不就搞定了么” 、“哇塞,这段代码设计的真精辟”,这些都是我在阅读那些优秀的源码时脑海中经常蹦出的词。

每当你觉得有收获到什么的时候,你可以将它们记录下来,并思考适用的场景。这样当你后续项目中遇到类似的场景,你就会想起“好像这里之前看到过一个精辟的设计,我去翻翻之前记录的代码案例。”

所谓“万事开头难”,阅读源码也是如此。因为当你阅读完第一个源码再去阅读下一个的时候,你自然而然地会带着批判或者说挑剔的眼光去阅读:为什么这个功能在我之前看的源码中是那样实现的,而在这里会是这样实现的?这其中的道理在哪里,哪种实现方式更优秀呢?通过这样的对比及探索,你会发现,自己的进步快得难以想象。

好了,总结一下。

这篇呢,Z哥和你分享了我对「阅读源码的必要性」这件事的看法。

我认为阅读源码和写作类似,相比自己琢磨、顿悟,更快的方式是通过借助、参考别人的思想成果来提升自己。当然,它的价值不仅仅用于面试,至少还有四个长期价值。

  1. 在工作中更快地上手新项目

  2. 给自己创造用新技术的机会

  3. 完善知识体系

  4. 学习别人的设计思路

不知道你对于阅读源码的态度是什么?欢迎在评论区分享你的看法。我后续打算再写一篇如何阅读源码,敬请期待。

推荐阅读:

  • 学得越多,大脑越乱?

  • 产品经理的「临界点」

原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

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

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

相关文章

vst3插件_Steinberg发布新的VST 3.7 SDK,音乐软件开发者速来围观

Steinberg日前宣布最新的VST SDK(软件开发工具包)即将面市。最新的VST 3.7引入了多项SDK接口增强功能,使VST3宿主和插件之间的集成达到了新的水平,还包括新的VST3项目生成器、改进的文档以及对MIDI 2.0的支持,还可以开…

GitHub 2017 年度报告,最受欢迎的编程语言是?

GitHub 每年都会在年度盛会中推出数据报告,其中列出了一些年度的数据,包括其网站中最受欢迎的编程语言、开源项目等。今年的数据更是让人眼前一亮,Python 这匹编程语言中的黑马,势不可挡! 编程语言之间的战争就是一场持…

python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...

1. Python和Java、PHP、C、C#、C等其他语言的对比?2. 简述解释型和编译型编程语言?3. 代码中要修改不可变数据会出现什么问题? 抛出什么异4. print 调用 Python 中底层的什么方法?5. 简述你对 input()函数的理解?6. Python解释器种类以及特点&#xf…

GraphQL:来来来,Union

Union就是把不相干的一些数据实体,合并起来,一起供外部查询。不用像webapi,完成查询不同的数据,需要多次请求。一次请求,获取多样数据,减少请求次数,这也是GraphQL的优势之一。怎么弄&#xff0…

每个程序员都应该知道的基础数论

这篇文章讨论了数论中每个程序员都应该知道的几个重要概念。本文的内容既不是对数论的入门介绍,也不是针对数论中任何特定算法的讨论,而只是想要做为数论的一篇参考。如果读者想要获取关于数论的更多细节,文中也提供了一些外部的参考文献&…

powerbi视觉对象_玩转Power BI的图片可视化

​制作可视化报告时,为了展示效果,有时候需要用图片来展示,在 Power BI 中,关于图片的自定义视觉对象主要有下面三个,利用他们可以很轻松的进行图片可视化。下面来看看这些视觉对象的效果。样本数据如下:为…

东南大学计算机网络_东南大学,2020年东南大学高考录取分数线分析

各位读者大家好,今天给大家介绍的是南京重点大学—东南大学。小编一直从事高等教育领域的写作,感兴趣的读者可以关注一下小编~1.学校基础东南大学,简称“东大”,是中华人民共和国教育部直属、中央直管副部级建制的全国重点大学&am…

Goodbye 2020,Welcome 2021 | 沉淀 2021

引言2021年,已开启二月的篇章,农历新年也张灯结彩而来,只不过要留守过年。在这辞旧迎新之际,踏入而立之年之时,正是算账的好时候,数一数今年的成长,讲一讲来年的期望,最重要的还是要…

程序员必须知道的十大基础实用算法及其讲解

本文盘点程序员必须知道的十大基础实用算法及其讲解。 算法一:快速排序算法 快速排序是由东尼霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(nlogn) 次比较。在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见。事实上&#…

sql 日期和当前日期时间差_详解PostgreSQL 如何获取当前日期时间

概述开发数据库应用或者调试代码时,经常需要获取系统的当前日期和时间,今天主要看一下 PostgreSQL 中提供的相关函数。一、当前日期CURRENT_DATECURRENT_DATE 函数用于获取数据库服务器的当前日期:postgres# SELECT CURRENT_DATE;调用该函数时…

我们只知大势将至,却不知未来已来

❈ 凯文•凯利 《必然》: 未来的一切事物的生命都将是无穷尽的升级,而且迭代的速度不断的在加速。包括看得见的事物,也包括看不见的审美观和价值观。无论你使用一项工具的时间有多长,不断的升级都会把你变成一个菜鸟,从…

c#爬虫-1688官网自动登录

背景在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。登录地址https://login.1688.com/member/signin.htm自动登录…

tensorrt轻松部署高性能dnn推理_部署环境之:tensorRT的插件

TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorFlow、Caffe、Mxnet、Pytor…

做一个网站多少钱?

「一辆车子多少钱?一个房子多少钱?」 这问题在工程师或设计师的眼里就如「一辆车子多少钱?一个房子多少钱?」,这个问题实在空泛到一个让人无法言语的境界,这也是我最常被问到的问题「做一个网站多少钱?」。…

[Abp 源码分析]多租户体系与权限验证

点击上方蓝字关注我们0.简介承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的。1.多租户的概念多租户系统又被称之为 Saas ,比如阿里云就是一个典型的多租户系统&#xff0…

生存是一种毅力

三月初回到成都,出站时还是凌晨5点多,第一次这么早站在成都的火车站,拥挤的人群和车辆,我的神志却异常的清醒,坚持不要母亲来接我. 到家洗漱后到头就睡,一觉醒来10点多,中午的成都虽不像北京那么阳光普照但也感觉暖暖的.想起在北京训练营的日子,"枯藤老树昏鸦"每天伴…

linux truncate文件,linux系统编程:用truncate调整文件大小

truncate的使用非常简单:int truncate(const char *path, off_t length);参数1:文件名参数2: 文件需要被调整的大小length 大于 文件大小, 文件后面会填充空白字节或者空洞length 小于 文件大小, 文件多出的部分,会被…

如何在 ASP.Net Core 中使用 SignalR

SignalR for ASP.Net Core 是 SignalR 的浴火重生版,允许你在 ASP.Net Core 中实现实时通讯,这里的 实时 意味着双方都能快速的感知对方发来的消息,比如:一旦 server 端有需要推送的内容将会直接 push 到 client,这和原…

搞笑动图:这些痛,只有程序员懂…

“代码上线后又追加了新特性” “在生产环境做 hotfix” “刚调稳定的系统,公司叕空降了一位架构师,叕要重构现有系统…… ” “当程序员听客户说还在用 IE 时” “当黑客拿到 root 权限之后” “代码进入循环分支后” “项目交接,客户要求开…

linux内核分为子系统,Linux内核内存管理子系统分析【转】

还是那张熟悉的老图:Linux内核子系统简介(由七个部分组成)Linux内存管理模型:1. 内存管子系统职能:1> 管理虚拟地址与物理地址的映射2> 管理物理内存的分配2. 地址映射管理1> 虚拟地址空间分布:linux采用的是一种虚拟地…