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的宏功 ...
随机推荐
- Jenkins自定义变量共享
https://www.cnblogs.com/junneyang/p/5239480.html https://www.cnblogs.com/Rocky_/p/8317156.html https ...
- HttpServletRequest字符集问题
post中文处理 1post在spring里的设置web.xml文件 <!-- 字符处理 UTF8 --> <filter> <filter-name>encodi ...
- 创建JavaScript函数的几种方式
window.onload = function() { // console.log('ok'); //正规的创建函数 function test(abc, d) { return abc(d); ...
- Chapter5_初始化与清理_this关键字
this关键字是Java中一类很特殊的关键字,首先它只能在方法内使用,用来表示调用这个方法的对象,在这一点上this和其他对对象的引用的操作是相同的.我们之所以可以在方法内部访问到它是因为编译器在方法 ...
- [C#.net]获取文本文件的编码,自动区分GB2312和UTF8
昨天生产突然反馈上传的结果查询出现了乱码,我赶紧打开后台数据库,发现果真有数据变成了乱码.这个上传程序都运行3个多月了,从未发生乱码现象,查看程序的运行日志,发现日志里的中文都变成了乱码,然后对比之前 ...
- # 2019-2020-4 《Java 程序设计》结对项目总结
2019-2020-4 <Java 程序设计>结对项目阶段总结---<四则运算--整数> 一.需求分析 实现一个命令行程序 要求: 自动生成小学四则运算题目(加,减,乘,除): ...
- C++数论板题(弹药科技):Lengendre定理和欧拉函数
弹药科技 时间限制: 1 Sec 内存限制: 128 MB 题目描述 经过精灵族全力抵挡,精灵终于坚持到了联络系统的重建,于是精灵向人类求助, 大魔法师伊扎洛决定弓}用博士的最新科技来抗敌. 伊扎洛: ...
- 探索微信小程序之路
记录一下每日的知识点,时不时温习一下. 视图与渲染对于页面中的数据,以json的方式存放在js文件的data中 判断的使用: <view wx:if='{{true}}'> 为真时显示 & ...
- Windows和Office激活汇总
Windows和Office是常用的软件.多数情况下,即使不激活,也会使用一部分功能.今天来看一下很多前辈的工作成果. 1. Windows 7&10 1.1 永久激活 通过key 分享几个常 ...
- Codeforces Round #485 (Div. 2) D. Fair
Codeforces Round #485 (Div. 2) D. Fair 题目连接: http://codeforces.com/contest/987/problem/D Description ...