11没有源码注释_我们为什么要看源码、应该如何看源码?
看源码的意义
看源码只是一种方法、手段,而不是目的。我也曾经给自己制定过“阅读xxx源码”的目标,现在看起来真的很蠢,一点不smart(specific、measurable、attainable、relevant、time-bound)。
只有搞清楚了阅读代码的目标,才能有的放矢,抓住重点,高效达成任务。
这里也给大家分享一下我们的专栏《Java 进阶集中营》,每天都会给大家分享一个最新的java技术内容,有优秀的技术讯息,也欢迎分享在我的专栏里。
JAVA 进阶集中营zhuanlan.zhihu.com
看源码的意义总结起来包含但不限于以下几点:
一、解决问题(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这种动态类型代码,不跑起来很难知道到底在干啥。
加注释,做笔记
如果某份源代码的阅读并不是一锤子买卖,日后还可能回顾、重新阅读,那么就一定要做好代码注释和笔记。笔记主要是框架图、类图、流程图,目标是建立索引,方便日后快速回忆。
而注释就是阅读代码时的细节,重新阅读的时候看注释(特别是函数的注释)能节省很多时间。
11没有源码注释_我们为什么要看源码、应该如何看源码?相关推荐
- mysql外码内码定义_刨根究底字符编码之六——简体汉字编码中区位码、国标码、内码、外码、字形码的区别及关系...
简体汉字编码中区位码.国标码.内码.外码.字形码的区别及关系 GB2312.GBK.GB18030等GB类汉字编码方案的具体实现方式是怎样的?区位码是什么?国标码是什么?内码.外码.字形码又是什么意思 ...
- python 字节码 汇编器_基础系列1-python解释器、PVM、源代码、字节码理解
大家都会听到这么一种说法,python是脚本语言,一门解释型语言,那么什么是解释型语言呢? 为了回答这个问题,我们从头撸起 语言又大致分为3类:机器语言.汇编语言.高级语言,简单的解释来说: 机器语言 ...
- java探针 字节码增强_深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- Robotium测试没有源码的apk--需重签名apk
Robotium是基于Instrumentation框架的,其编写的测试脚本与被测程序运行在同一个进程里面,所以这需要测试程序与被测程序拥有相同的签名,否则无法进行通讯. 在只有apk的情况下可以采用 ...
- Eclipse中查看没有源码的Class文件的方法
本文地址:http://blog.csdn.net/sushengmiyan/article/details/18798473 本文作者:sushengmiyan 我们在使用Eclipse的时候,经常 ...
- 为没有源码的DLL文件添加强名称
如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed -- 引用的程序集 'xxxxxx ...
- 在没有源码的情况下修改.class文件
写这个博文是因为我自己遇到了问题,不打算大包大揽的详细解释,没有这个能力,也没有这意愿.理由很简单,只是因为害怕遗忘... 类似的经历不知是否是常见的情况,总之说说的我的问题: 先发发牢骚,诺记这个公 ...
- linux0.11多任务管理程序阅读注释笔记
[ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...
- python flask源码解析_用尽洪荒之力学习Flask源码
[TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...
最新文章
- python中的zip()函数和map()函数
- CodeForces - 1408E Avoid Rainbow Cycles(思维+最大生成树)
- sql每个月每个人的花销占比_星座月运(2020年12月),每个人开支花费大,得精打细算...
- 打造史上最小尺寸.Net Core单文件应用程序
- 复化梯形公式matlab程序_【HPC】高性能数值计算-梯形面积法
- JSON与XML优缺点对比分析
- MySQL error(2014) Commands out of sync; you can't run this command now(情形2)
- arm汇编—str,mov等指令
- windows graphics - DXGI 介绍(DirectX Graphics Infrastructure)
- 亚马逊卖家培训返校季爆单技巧
- adb 切换默认桌面,OPPO默认桌面替换教程
- scoop bucket add 后仍然报错 Couldn‘t find manifest for
- 远程控制工具哪个好?向日葵VS ToDesk,安卓移动设备远程操控哪个更好用?
- 电脑硬件知识入门之内存篇
- Oracle中文排序 NLSSORT
- 【MindSpore】【数据集】数据集内数据获取失败导致迭代器退出
- eclipse启动慢解决方法
- latex数学公式(行内(间)公式标注/希腊字母/数学函数/配对括号/定理环境
- 国际浏览器市场分析报告
- [业内传闻]今天,7月25日是全世界系统网络管理员的节日
热门文章
- Azure 物联网开发者体验 7 月更新:边缘计算开发工具,ARM64 设备开发,VS Code 容器化开发工具...
- RedLock 实现分布式锁
- 官博翻译 | .NET Core 即 .NET 的未来
- CefSharp中c#和JavaScript交互读取电脑信息
- Stack Overflow 监控系统内部架构初探
- ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界
- ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot
- .NET Framework 4.7发布,支持Windows 10创作者更新
- ASP.NET Core 导入导出Excel xlsx 文件
- django07: 模板语言(旧笔记)