当前位置: 首页 > news >正文

如何阅读一份源代码?

阅读源代码的能力算是程序员的一种底层基础能力之一,这个能力之所以重要,原因在于:

  • 不可避免的需要阅读或者接手他人的项目。比如调研一个开源项目,比如接手一个其他人的项目。
  • 阅读优秀的项目源码是学习他人优秀经验的重要途径之一,这一点我自己深有体会。
    读代码与写代码是两个不太一样的技能,原因在于“写代码是在表达自己,读代码是在理解别人”。因为面对的项目多,项目的作者有各自的风格,理解起来需要花费不少的精力。

我从业这些年泛读、精读过的项目源码不算少了,陆陆续续的也写了一些代码分析的文章,本文中就简单总结一下我的方法。

先跑起来

开始阅读一份项目源码的第一步,是先让这个项目能够通过你自己编译通过并且顺利跑起来。这一点尤其重要。

有的项目比较复杂,依赖的组件多,搭建起一个调试环境并不容易,所以并不见得是所有项目都能顺利的跑起来。如果能自己编译跑起来,那么后面讲到的情景分析、加上调试代码、调试等等才有展开的基础。

就我的经验而言,一个项目代码,是否能顺利的搭建调试环境,效率大不一样。

跑起来之后,又要尽量的精简自己的环境,减少调试过程中的干扰信息。比如,Nginx 使用多进程的方式处理请求,为了调试跟踪 Nginx 的行为,我经常把 worker 数量设置为1个,这样调试的时候就知道待跟踪的是哪个进程了。

再比如,很多项目默认是会带上编译优化选项或者去掉调试信息的,这样在调试的时候可能会有困扰,这时候我会修改 makefile 编译成 -O0 -g,即编译生成带上调试信息且不进行优化的版本。

总而言之,跑起来之后的调试效率能提升很多,而在跑起来的前提之下又要尽量精简环境排除干扰的因素。

明确自己的目的

尽管阅读项目源码很重要,但是并不见得所有项目都需要从头到尾看的清清楚楚。在开始展开阅读之前,需要明确自己的目的:是需要了解其中一个模块的实现,还是需要了解这个框架的大体结构,还是需要具体熟悉其中的一个算法的实现,等等。

比如,很多人看 Nginx 的代码,而这个项目有很多模块,包括基础的核心模块( epoll 、网络收发、内存池等)和扩展具体某个功能的模块,并不是所有这些模块都需要了解的非常清楚,我在阅读 Nginx 代码的过程中,主要涉及了以下方面:

  • 了解 Nginx 核心的基础流程以及数据结构。
  • 了解 Nginx 如何实现一个模块。
    有了这些对这个项目大体的了解,剩下的就是遇到具体的问题查看具体的代码实现了。

总而言之,并不建议毫无目的的就开始展开一个项目的代码阅读,无头苍蝇式的乱看只会消耗自己的时间和热情。

区分主线和支线剧情

有了前面明确的阅读目的,就能在阅读过程中区分开主线和支线剧情了。比如:

想了解一个业务逻辑的实现流程࿰

http://www.xdnf.cn/news/764821.html

相关文章:

  • Dify工作流实践—根据word需求文档编写测试用例到Excel中
  • 使用new操作符动态分配
  • 《软件项目管理》第一章(概述)期末周复习总结笔记
  • 内存管理--《Hello C++ Wrold!》(8)--(C/C++)--深入剖析new和delete的使用和底层实现
  • 英语中什么时候用that?
  • 我爱学算法之—— 前缀和(上)
  • 【QT控件】QWidget 常用核心属性介绍 -- 万字详解
  • 使用source ~/.bashrc修改环境变量之后,关闭服务器,在重启,环境变量还有吗?
  • Hadoop 大数据启蒙:深入解析分布式基石 HDFS
  • 神经网络基础:从单个神经元到多层网络(superior哥AI系列第3期)
  • 题单:二分查找(最小下标)
  • 记忆解码 | 从神经机制到记忆逻辑的科学探索
  • 2023年12月6级第一套第一篇
  • 【头歌实验】Keras机器翻译实战
  • 什么是 CPU 缓存模型?
  • SMT高速贴片机核心技术深度剖析
  • 基于Python学习《Head First设计模式》第四章 工厂模式+抽象工厂
  • 【设计模式-3.6】结构型——桥接模式
  • 设计模式——访问者设计模式(行为型)
  • 使用 OpenCV (C/C++) 通过二值化增强车牌识别
  • 【机器学习基础】机器学习入门核心:数学基础与Python科学计算库
  • nssctf第一题[SWPUCTF 2021 新生赛]re1
  • 每日算法刷题计划Day20 6.2:leetcode二分答案3道题,用时1h20min
  • 深度学习|pytorch基本运算-hadamard积、点积和矩阵乘法
  • 如何学习才能更好地理解人工智能工程技术专业和其他信息技术专业的关联性?
  • Python-matplotlib库画不规则图
  • 机器视觉图像处理之图像滤波
  • LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上
  • 深度学习与神经网络 前馈神经网络
  • 【LeetCode】数组刷题汇总记录