11没有源码注释_我们为什么要看源码、应该如何看源码?

c28d373ab984776e5d429132ba9ad584.png

看源码的意义

看源码只是一种方法、手段,而不是目的。我也曾经给自己制定过“阅读xxx源码”的目标,现在看起来真的很蠢,一点不smart(specific、measurable、attainable、relevant、time-bound)。

只有搞清楚了阅读代码的目标,才能有的放矢,抓住重点,高效达成任务。

这里也给大家分享一下我们的专栏《Java 进阶集中营》,每天都会给大家分享一个最新的java技术内容,有优秀的技术讯息,也欢迎分享在我的专栏里。

JAVA 进阶集中营​zhuanlan.zhihu.com
0eb32142887dd09832b8608e8dce316d.png

看源码的意义总结起来包含但不限于以下几点:

一、解决问题(BUG)

只要是代码,就会有bug,只是说bug的多与少、深与浅罢了。现在大家都喜欢发布、使用开源项目,不同的开源项目社区成熟度、代码质量又会有较大的差异,遇到bug就不足为奇了。

当然,遇到bug肯定是先在网上搜索是否有类似的问题,一般可以在google、Stack Overflow、项目的issues里面有对应的关键词搜索。如果搜不到,那么就只能看源码解决了

二、知其所以然

我在[如何学习新技术、团队技术选型时要注意些什么][Link 1]里面提到过,如果我们需要将一个开源项目用到自己的项目中,那么就必须了解这项项目的优缺点,并深知原理,对部分细节(尤其是项目的优势、feature)进行深入研究。

如果是成熟的开源项目,遇到问题也许能google到很多答案;但如果是一个处于快速发展中的开源项目,多了解其架构、核心原理,也能帮助快速定位问题。

另外,有的项目文档可能不那么丰富,但又不得不使用,那么如何以正确的姿势使用呢?也得参考源码

三、学习

看源码也是一种不错的学习方式(虽然不一定不是最佳的方式),尤其对于比较优秀的开源项目,能让人大开眼界。

即使是出于学习的目的,也是有很多侧重的,比如

学习语言:代码风格、规范、惯用法、高级语法。对于某个语言的新手,找一个熟悉领域的开源项目来深入掌握这门语言,也是一个不错的注意。

学习设计:数据接口、框架、整体架构

学习理论:算法、协议。比如我之前写过的[raft协议][raft],光看论文是很枯燥的,而且算法理论到工程实践还是有一定的差距,这个时候结合开源项目([mongodb][])实现往往更事半功倍。

四、改造

一般来说,我们刚开始仅仅是使用一个开源项目,但随着使用的深入,会发现一些自己需要的功能并没有很好的支持,向项目组提的issues也可能得不到快速的响应,这个时候就要自己开分支,改代码,加功能了。

当然,比较好的是将自己分支比较好的新feature 给原项目提merge request,反哺开源项目,比如阿里的[Blink][]

五、借鉴

他山之石可以攻玉,如果有需要重新开始自己造轮子,那么参考一些已有的、优秀的轮子肯定是有好处的。

六、副产品

这一点,不应该作为我们阅读源码的出发点,但是确实能在实际中对找工作、面试有加成,算是副产品吧。

应该如何看源码:

看源码的目的很大程度上影响了看源码的方式、需要阅读的代码的范围。比如说,如果是为了修一个线上bug,那么阅读代码的范围就紧紧围绕bug本身;而如果是为了了解某个分布式算法,那就需要按大量的、可能运行在不同节点(进程)上的代码,了解其交互原理、工作流程。

下面说一些通用的方法。

先看文档,整体把握

一般来说,文档是对代码的高度凝练,一个高质量的开源一般会包含tutorial、specification、API reference等documents,通过选择性的略读、精读这些文档,就能大致了解项目的整体架构、设计原则。6 大设计原则,你知道吗?

正确的路线是通过文档去认识这个项目,然乎通过阅读代码去验证文档、深入细节,而不是通过直接啃源码来了解这个项目,以偏概全。

理解代码组织,文件名,类名

当需要看代码的时候,不要找到一个文件就开始,先看看代码组织,粗略看看文件名、类名,基本就能猜测到每一部分。比如redis的源码就组织得很好,基本上看文件名就可以快速定位每一个command的实现位置。

关注一个问题,从问题追踪代码

看源码的目标决定了此时此刻的关注点,不管是解决遇到的bug还是学习某个算法,都让我们聚焦到一个具体的问题,从这个具体的问题去追踪代码,忽略掉当前无需关注的细枝末节,步步深入,直达目标。

当然在解决一个问题的时候,有可能会引发新的问题,尤其是学习的时候,此时只需记录新问题(放到收集篮,不要立即发散),待之前追踪的问题解决之后,再来看新发现的问题。

解决一个issue

如果自己没有问题,那么就帮忙解决别人的问题,通常来说,开源项目都有许多待解决的issue,从中选择一个入手即可。

调试

只要可以,一定先让代码编译通过、跑起来,这样不管是加log、打印调用栈还是断点调试都方便很多。尤其是对于像python这种动态类型代码,不跑起来很难知道到底在干啥。

加注释,做笔记

如果某份源代码的阅读并不是一锤子买卖,日后还可能回顾、重新阅读,那么就一定要做好代码注释和笔记。笔记主要是框架图、类图、流程图,目标是建立索引,方便日后快速回忆。

而注释就是阅读代码时的细节,重新阅读的时候看注释(特别是函数的注释)能节省很多时间。

d2a6ca3adb1817430e8c23fb0de0d4a7.png

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

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

相关文章

如果你没空读书,就一定要来看看这8个公众号!

全世界只有3.14 % 的人关注了爆炸吧知识不管世界变化多块,阅读仍是个不过时的动作。今天就为大家推荐几个优质公众号,从社会热点、读书成长、生活新知,你的碎片化时间,我们包了!一起来看看呀~♥长按二维码,…

03Prism WPF 入门实战 - Region

1.概要源码及PPT地址:https://github.com/JusterZhu/wemail视频地址:https://www.bilibili.com/video/BV1KQ4y1C7tg?sharesourcecopyweb(1)Prism概览Application:我们开发应用程序,初始化Bootstrapper。Bo…

CentOS利用crontab执行计划任务

walker的需求是每天1点钟的时候,执行一个shell脚本,下面记录walker用到的基本功能。1、安装yum install crontabs2、服务相关/sbin/service crond status #查看任务状态 /sbin/service crond start #启动服务 /sbin/service crond stop …

10月Web服务器调查:Apache下降 Ngnix攀升

来自netcraft的消息,在2010年10月份的Web服务器市场调查中,在232,839,963个网站中,仍有69.8%的站点在使用 Apache服务器,相比于上个月,其市场份额增长了大约1个百分点,Ngnix也有较小幅度的增长,…

四元数左乘右乘_四元数、欧拉角学习笔记个人理解

一、背景知识:点乘、叉乘复数的点乘:(aibjck)•(xiyjzk)-(axbycz)复数的叉乘:(aibjck)(xiyjzk)(ax)ii(ay)ij(az)ik(bx)ji(by)jj(bz)jk(cx)ki(cy)kj(cz)kkijk三轴定义如上图所示。满足右手螺旋定则:(这个不是太明白,但是…

Python深度学习029:pytorch中常用的模块或方法

PyTorch是一个广泛使用的深度学习库,提供了许多用于构建和训练神经网络的模块和方法。下面是一些PyTorch中常用的模块和方法的简要介绍: PyTorch常用模块和方法 torch 用途:PyTorch的基础模块,提供了多种数学运算功能。常用方法: torch.tensor():创建张量torch.randn():…

struts2 标签不能使用EL 表单式

<c:forEach items"${requestScope.dataitemList}" var"item" varStatus"i" >//使用c:set 标签注意使用Scope属性 不然在request里面取不到值。 <s:select id"type%{#attr.i.index}" name"dataitemType" list"…

【转载】Android设计中的.9.png

转载自&#xff1a;腾讯ISUX (http://isux.tencent.com/android-ui-9-png.html) 在Android的设计过程中&#xff0c;为了适配不同的手机分辨率&#xff0c;图片大多需要拉伸或者压缩&#xff0c;这样就出现了可以任意调整大小的一种图片格式“.9.png”。这种图片是用于Android开…

如果你没空看书,我强烈建议你做这件事!

知乎上有个高赞问题&#xff1a;有哪些书看完后&#xff0c;会让人后悔没早看到&#xff1f;答案各有不一、包罗万象。但有一点&#xff0c;大家达成了共识&#xff1a;要多读书。人生漫长&#xff0c;而我们都不会是一成不变的&#xff0c;真正决定人与人之间的差距的&#xf…

为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式...

前言ASP.NET Core的Middleware&#xff08;中间件&#xff09;就是使用了管道模式&#xff1a;Request&#xff08;请求&#xff09;在管道中传递&#xff0c;依次经过管道中的每一个MiddleWare进行处理。MiddleWare就像一层层的“滤网”&#xff0c;过滤所有的请求和响应。这种…

McAfee:较之中国美国黑客才最令人害怕

据McAfee研究发现美国是最有可能的网络攻击来源&#xff0c;而不是人们印象中广泛认为的中国或者俄罗斯。 McAfee进行了这么一项研究&#xff0c;组织来自各个国家的600位IT安全主管进行讨论&#xff0c;为他们最关注的互联网安全问题定级和归类&#xff0c;大部分报告都是符合…

缓存在哪里_什么是MyBatis缓存技术

MyBatis缓存引言在一个Web项目中&#xff0c;查询数据库中的操作算是一个非常常用的操作&#xff0c;但是有些数据会被经常性的查询&#xff0c;而每一次都去数据库中查询这些重复的数据&#xff0c;会很消耗数据库的资源&#xff0c;同时使得查询效率也很低&#xff0c;而 MyB…

无法打开物理文件 操作系统错误 5:拒绝访问 SQL Sever

今天分离附加数据库&#xff0c;分离出去然后再附加&#xff0c;没有问题。但是一把.mdf文件拷到其它文件夹下就出错&#xff0c;错误如下&#xff1a; 无法打开物理文件 "E:\db\homework.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server&…

WPF开发登录窗口之——窗口布局

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织01—代码如下一、创建项目&#xff0c;命名为LoginWindow&#xff0c;然后创建以下目录结构&#xff1a;二、导入图片三、创建资源字典。一共创建四个&#xff1a;ButtonStyle、WindowStyle、Text…

这个偏僻的小山村竟出了12位博士28位硕士,高产“学霸”背后原因曝光......

全世界只有3.14 % 的人关注了爆炸吧知识考上大学留名祖宗祠堂今早&#xff0c;超模君刷微博的时候&#xff0c;有一则新闻吓得我虎躯一震——一个总共才2000多人小山村&#xff0c;竟然出了12位博士28位硕士。而且考上大学的孩子&#xff0c;他们的名字直接刻进祖宗祠堂。(微博…

Android应用程序消息处理机制(Looper、Handler)分析(5)

ActivityThread类的这个mH成员变量是什么时候创建的呢&#xff1f;我们前面在分析应用程序的消息循环时&#xff0c;说到当应用程序进程启动之后&#xff0c;就会加载ActivityThread类的main函数里面&#xff0c;在这个main函数里面&#xff0c;在通过Looper类进入消息循环之前…

现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新

背景&#xff1a;数据表字段有IP&#xff0c;IP省份&#xff0c;IP城市&#xff0c;最新访问时间&#xff0c;假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入&#xff0c;然后每天都有5W左右的IP活跃&#xff0c;然后我要更新这5W个IP的记录到初始化的表&#xf…

牛顿新定律:凭本事得到的,凭什么要还?

后记事后&#xff0c;超模君提出用上帝开过光的真苹果来换回自己的苹果手机&#xff0c;但是惨遭牛顿君拒绝&#xff0c;理由是苹果手机更能激发他的创作灵感……面对这种鬼话&#xff0c;超模君敢怒不敢言。更惨的是&#xff0c;上帝说苹果手机不报销……艾萨克牛顿&#xff0…

NOI导刊模拟2—电话网络 解题报告

题目大意&#xff1a;给出一个图&#xff0c;顶点为1到n和一个值k&#xff0c;求出包含顶点1到顶点n的通路的子图中&#xff0c;第k1大的边最短为多少&#xff1f;&#xff08;若存在一条从1到n路径边数小于等于k&#xff0c;则返回0&#xff0c;若不存在通路&#xff0c;返回-…

好书推荐 -《国富论》-15-09

好书推荐-《国富论》-15-09.md—/Users/zjh/Documents书籍 《国富论》-亚当斯密-陕西师范大学出版社 推荐理由 《国》是一本非常通俗易懂的经济书籍&#xff0c;用简单的语言讲解从个体&#xff0c;到小型市场&#xff0c;再到国家和政府的经济结构和规律。虽然亚当斯密的一些观…