Python - 关于代码阅读的一些建议
初始能力
让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法、技巧和业务流程等频繁地阻碍和打断。
建议基本满足以下条件,再开始进行代码阅读:
- 具备一定的语言基础:熟悉基础语法,常用的函数、库等;
- 了解业务背景和逻辑;
- 了解设计模式、熟悉编程和构建工具的使用、了解代码风格;
工具使用
- Source Insight - 具有强劲的代码浏览和分析功能
- Doxygen - 项目文档工具
- grep命令 - 用于全局搜索
- 利用代码结构分析功能或插件生成UML图
- Python Call Graph - 生成python函数调用关系图
- 代码转换成流程图 - 在线工具
- 浏览器插件Octotree - 直观显示Github项目树形结构
- 浏览器插件Git History - 直观显示Github项目历史记录
- ......
准备动作
明确问题与需求:
- 为什么要阅读源代码?要解决什么具体问题?要达到怎样的程度和效果?
- 当前状态(初始能力、资源投入等)如何?是否足够支撑开始并完成这样的代码阅读?
- 没有明确目标,将会导致大量无效的阅读,就难以获得实际的收获;
一些参考步骤:
- 对于知名项目,收集规整已有的代码分析资料;
- 确认辅助信息来源:官方文档、项目文档、搜索引擎等;
- 确认代码版本(早期版本或当前能够理解的版本)和编码风格;
方法和注意事项
问题需求、资源投入、项目状态的不同,适用的阅读方法和工具自然也就不同。
直接啃代码的方式适合解决具体的细节问题,简单粗暴,速度快效果好。
但如果想完整而深入地了解一个有规模和难度的项目,又该如何进行呢?
一些参考方法:
- 阅读“README”;
- 通过查看提交和版本日志,研读所关注的功能和优化;
- 搭建测试环境并运行Demo或示例,观察运行状态,从外部了解核心功能和运行方式,形成总体认知;
- 善用文档:quickstart、tutorial、howto等内容中的示例往往是非常有效的了解途径;
- 分层阅读:先整体后局部,借助工具生成UML图,从整体了解代码结构和调用关系,确定阅读的层次和顺序;
- 寻找程序入口,根据实际情况确定阅读的切入点;
- 为代码写注释,必要时形成文档;
- 问题列表:记录疑问和问题并归纳成表,解决问题的过程也就是代码逐渐清晰的过程;
- 查看单元测试,编写测试用例,抛异常;
- Debug所关注的执行过程,观察现象和日志,明确调用关系和执行路径;
一些注意事项:
- 带着问题与需求阅读代码,围绕根本和主干,没有必要通读源码,更不应该沉陷于细节;
- 必要时略过难以理解的地方,不过度纠结于某一行某一段;
- 理解项目作者的思考方式,
- 低头专注代码,抬头思考架构,结合业务流程,从整体的角度来看待局部实现的过程;
简而言之,也就是“因人而异,因地制宜”,有效的才是合适的。
下一步
- 关注原型
最终展现的软件往往是“原型程序”经过精心包装和美化的结果。
“原型程序”只包括核心和基础功能,是可用的初始化版本,是“软件成长的起点”。
应该从“起点”开始跟随,而不是从“终点”返回。
- 迭代式理解
软件是成长起来的,而不是一次性搭建完成的,尝试理解代码,也会有一个循序渐进的过程。
对项目代码的理解,只是当时的理解,受限于当时的技能水平,知识结构,资源投入,甚至是身心状态。
经过一段时间磨砺和成长,回头再阅读同样的项目代码,往往会有新的发现和理解。
- 改善适用性
“学以致用”是获得知识技能的最有效途径之一。
实现自己的需求和想法,最终形成更适合的版本。
在现有“轮子”的基础上去制造“一个更完善轮子”,在这样的二次开发过程中,可以验证代码理解。
- 获得建议与批判
落后的起源是“故步自封”、“自以为是”和“自欺欺人”。
归纳并分享你的理解,会获得更全面更专业更中肯的建议与批判。
争议之中,也恰恰隐含着成长与改变的线索与机遇。
Python - 关于代码阅读的一些建议的更多相关文章
- Python代码阅读(第8篇):列表元素逻辑判断
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...
- Python代码阅读(第11篇):展开嵌套列表
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...
- Python代码阅读(第12篇):初始化二维数组
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了二维数组的初始化功能,根据给定的宽高初始化二维数组. 本篇阅读的代码片段来自于30-seconds-o ...
- Python代码阅读(第21篇):将变量名称转换为蛇式命名风格
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能. 本篇阅读的代码片段来自于30-second ...
- Tools - 一些代码阅读的方法
1 初始能力 让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法.编程技巧和业务流程等频繁地阻碍和打断. 语言基础:熟悉基础语法,常用的函数.库.编程技巧等: 了解设计模式.构建工具.代码 ...
- 如何自学成 Python 大神?这里有些建议
人生苦短,我用 Python.为什么?简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状:网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲解基础知 ...
- Python3练习题系列(08)——代码阅读方法及字典跳转表理解
问题:分析下面代码 cities['_find'] = find_city city_found = cities['_find'](cities, state) 分析过程: 一个函数也可以作为一个变 ...
- py-faster-rcnn代码阅读1-train_net.py & train.py
# train_net.py#!/usr/bin/env python # -------------------------------------------------------- # Fas ...
- 脚本病毒分析扫描专题1-VBA代码阅读扫盲、宏病毒分析
1.Office Macor MS office宏的编程语言是Visual Basic For Applications(VBA). 微软在1994年发行的Excel5.0版本中,即具备了VBA的宏功 ...
随机推荐
- Texture转Texture2D
private Texture2D TextureToTexture2D(Texture texture) { Texture2D texture2D = new Texture2D(texture. ...
- tomcat修改banner,隐藏版本号
为了避免黑客针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息.针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 cata ...
- Numpy 矩阵库(Matrix)
Numpy 中包含了一个矩阵库 numpy.matlib, 该模块中的函数返回的是一个矩阵, 而不是 ndarray 对象. 一个 m * n de 矩阵是一个 有 m 行(row) n 列(colu ...
- Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输
一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...
- H5获取原生传过来的值
项目开发中,可能会涉及到原生页面跳转到H5页面,然后H5页面要返回原生页面,通常使用的方法就会失效:this.$router.go(-1);怎么解决呢,这样就需要原生跳转H5页面的时候,在URL里传递 ...
- java将图片传为设定编码值显示(可做刺绣)
import java.awt.Color; import java.awt.image.BufferedImage;import java.io.File;import java.io.IOExce ...
- elasticdump 方法迁移数据
elasticdump -rm -ti taskrabbit/elasticsearch-dump --ignore-errors=true --offset=1000 --input=http:/ ...
- 02.02.02 第2章 制作power bi图表(Power BI商业智能分析)
---恢复内容开始--- 02.02.02第2章 制作power bi图表 02.02.02.01 power pivot数据导入 00:08:43 02.02.02.02建立数据透视表 00:11: ...
- 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB
走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...
- idea使用自动生成变量的时候总是默认final,每次都会跳出来declare final的选项,并且默认是勾选的,很难受
看下截图: 我这边首先要保证:settings----->Editor------>Code Style-------->java下的这两个选项不被勾选; 然后在生成变量的时候,再次 ...