admin管理员组

文章数量:1664593

【前言】因为你从来没有从这个系统层面去思考问题,你应该要“吃透”一个系统!最好的方式就是读源码!源码对编程意义何在?如何才能更好阅读代码?

很多人觉得具备阅读代码能力的人很牛逼,自己也试着做过阅读,但发现一掉进去总是会迷失方向却最后无所获取,不知道该如何正确阅读代码

一个作家要写书,他肯定是有长期阅读优秀文学作品的习惯。程序员也类似吧,想要写出大量的好代码,需要不断地阅读和实践。不仅有了阅读习惯,还可以提高代码能力。

如何才能更好的阅读代码?

  1. 精心挑选感兴趣的源码项目:最好是兴趣、工作内容,平时看看也可以有收益的。
  2. 知识点可以到官方文档:官方文档可以让大家平滑过渡到源码的学习中;
  3. 提问题找答案的学习方式:比如在使用 Toast 的过程中,你可能会想到一些问题:Toast.makeText(...).show()时发生了什么?
  4. 从一些共性层面如手:比如UI租借结构、任务调度等等。
  5. 一定要运行起来
  6. 做笔记,强制输出一些内容并且分享,更有效的吸收所学知识。

一、看什么样子的开源

  • 开源项目中要有全套的源码和配套工具,刚开始学开源的时候可别找那种没有工具或者少源码的给自己增加难度。
  • 需要有完善的文档,比如新手指南、项目整体的架构设计文档、模块详细的设计文档,配置说明文档和注意事项
  • 社区是否活跃,是否还在更新和完善。
这几点非常非常重要,基本上是一个初学者学开源的必备内容。

二、初步了解

2.1 顺一遍文档

很少有小伙伴可以好好的看一遍官方文档,因为一开始的心态就是扎进去学。

这样非常容易造成:

  1. 给自己添加难度,很多细节的内容,根本不懂。
  2. 着急动手实践,发现自己连基本的使用方式都没弄明白。

2.2 重点学习思路

首先是项目的背景:项目用了什么技术?提供了什么特性?它实际解决了什么问题

项目的适用场景是:优点是什么?缺点呢?适合与不适合的场景是什么

哪些公司在生产环境中使用?

有哪些公司在生产环境中部署并维护过此开源项目?

一方面经历过生产环境的质量相对较好,及时用bug其他公司或多或少也遇到过,自己解决起来也不至于孤立无援。

2.3 了解代码目录结构

在下载源码之后,先看下代码目录的结构,或者是从示例测试代码入手,比如:

  • base代表基础库
  • net代表网络库
  • demo/example代表示例代码
  • tests:测试代码
  • docs:文档目录(类图、流程图、活动图、业务知识相关资料等)

刚刚入手的时候,建议从标粗的内容开始看起来。

2.4 在安装部署前补充新概念、新技术

在已有的知识体系纸上去学习新的开源项目,需要对概念或者新技术有个大概的了解,才能更好地理解项目的整体实现思路,做起来才可以事倍功半。

千万不要一上来就看代码,核心概念不清楚,原理不懂,核心算法没吃透,看代码非常费劲。

三、安装部署、运行

好的开源项目,文档都是比较完善的,安装部署文档一般会有的,更好的甚至都会有rpm安装包和docker镜像。

先把程序运行起来,这只是第一遍!

运行起来之后,精简自己的环境,减少后面调试过程中会出现的干扰信息。

比如,Nginx使用多进程的方式处理请求,为了调试跟踪Nginx的行为,我经常把worker数量设置为1个,这样调试的时候就知道待跟踪的是哪个进程了。

3.2 成功运行的意义

第一:先来体验项目的功能,对开源项目的功能从上帝视角了解。

第二:下断点>调试>修改代码>观察>再调试,从这个反复的步骤中了解程序的逻辑。

3.3 举例子

安装配置环境>从最简单的例子入门>研究复杂一点的例子>自己写个demo;

常见的安装目录是conf存放配置文件,logs存放日志文件,bin存放日志文件。有一些特殊情况,Nginx有html目录,这种目录能促使我们带着相关疑问继续研究学习,带着问题学习是最高效的。

作者:黑马程序员
链接:https://www.zhihu/question/29765945/answer/2568721929
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

四、要清楚自己的学习目的

我遇到很多同学上来就是找我,老师给我推荐点什么的开源项目,我说为什么学?很多同学的回答都是感觉该学点源码了。但是完全不知道自己为什么要学。

是要了解其中一个模块,比如是基础模块还是业务模块

4.2 学习顺序

  • 第一步:业务逻辑的实现流程,中间调用了第三方库函数、utils函数、定制的数据结构和算法等;还要了解对外的接口,这些接口的入口,出口参数以及作用。
  • 第二步:看看内存池的实现代码、调度器代码、dpdk中对于海量数据包是如何处理的。
  • 第三步:制作成excel表格,记录走读进度
  • 第四步:批判性的思维,为什么要这样做?
比如:从main函数进入,使用gdb单步跟踪清理一次完整流程(如程序初始化)的代码调用路径,这可以通过debug来观察运行时的变量和行为

如果实在是读不下去的话,先找到自己的兴趣所在,如果你对网络通讯感兴趣,就阅读网络层代码,深入到实现细节。比如:它用了什么库、采用了什么设计模式、为什么这么做?如果可以,debug的细节是什么?

或者是,看1.0版本的源码,1.0版本的内容,从复杂度上来说,都小很多,比较容易

4.3 数据结构和算法

如果上面的步骤都完成了,在来这里。如果真的不明白可以跳过去!比如判断参数的就可以跳过不看的,其次就是代码中有没有一些非顺序的代码,如果有你能理解么?比如通过中间件MQ继续后续的流程等等,所以大家要学会分析。

优秀的开源项目当中都有很多经典的算法,可以全部跳过之后再来学习

因为结构定义了一个程序的架构,结构定下来了才有具体的实现,好比盖房子。数据结构就是框架的结构,至于算法,暂时属于不需要深究的细节。先了解入口出口参数以及作用就可以了。

注意:烂程序员关心的是代码,好程序员关心的是数据结构以及他们的关系。

所以在,读一份代码的时候,理清楚核心的数据结构之间的关系很重要。

五、划重点

将上面说的学习事项再次总结梳理一遍!

安装运行:按照相关文档,安装运行项目:

  • 系统的依赖组件: 因为依赖组件是系统设计和实现的基础,可以了解系统关键信息。比如Memcached最重要的一来是高性能的网络库libevent,我们大概就能推测出Memached的网络实现应该是Reacyor模型。
  • 系统提供的工具: 需要特别关注命令行和配置文件,通过这两个非常重要的信息,我们可以知道系统具备哪些能力和系统将会如何运行。这些信息是我们学习系统内部机制和原理的窗口。

系统测试

如果只是自己学习和研究是可以参考网上测试和分析的文档,但是大家是要在生产环境投入使用必须进行测试。思路如下:

  • 核对每个配置项的作用和影响,识别出关键配置项
  • 进行多场景的性能测试
  • 进行压力测试:连续跑几天,观察CPU、内存、磁盘IO等指标拨动
  • 进行故障测试:kill、断点、拔网线等等

关键学习

有人学了源码跟没学一样,主要是读了,连API都没有调用过,这是灾难式学习。所以这个阶段的关键学习如下:

在IDE拿到调用栈: 在IDE里面读,这里方便跳转,方便查看定义,比网页上效率高。 通过IDE工具,运行example程序进行跟踪调试,通过打断点可以的刀片程序运行的调用栈。 尽可能编译调试,只要调试了,基本没有看不懂的代码

重点注意是,平常的时候多了解一些设计模式,这样看到名字里比如有proxy之类的直接就明白了。代码都是分模块的,要知道自己看的是哪个层哪个模块。

小的项目分层不明显的话就无所谓了,更多是注重语法的技巧。读没读懂,最简单的标准是,有没有信心可以写出一个差不多的东西。

六、一些建议

上面说的全部内容都是认真学开源的步骤,完全不能少的步骤。

大家如果抱着多学几个开源的心态,不如集中全部时间,把一个项目吃透,哪怕用了半年的时间。积累几年下来的数量还是非常可观的。而且很多项目的思想是共同的,比如高可用方案、分布式协议等。

一定要记得,不断的总结复盘,最好可以不仅写笔记还在论坛上分享。一方面锻炼自己的思维,一方面建立知识索引。

以上,希望对每一个同学有帮助。可以和我一起学!

本文标签: 看了那么多能力视频