初始能力

让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法、技巧和业务流程等频繁地阻碍和打断。

建议基本满足以下条件,再开始进行代码阅读:

  • 具备一定的语言基础:熟悉基础语法,常用的函数、库等;
  • 了解业务背景和逻辑;
  • 了解设计模式、熟悉编程和构建工具的使用、了解代码风格;

工具使用

准备动作

明确问题与需求:

- 为什么要阅读源代码?要解决什么具体问题?要达到怎样的程度和效果?
- 当前状态(初始能力、资源投入等)如何?是否足够支撑开始并完成这样的代码阅读?
- 没有明确目标,将会导致大量无效的阅读,就难以获得实际的收获;

一些参考步骤:

- 对于知名项目,收集规整已有的代码分析资料;
- 确认辅助信息来源:官方文档、项目文档、搜索引擎等;
- 确认代码版本(早期版本或当前能够理解的版本)和编码风格;

方法和注意事项

问题需求、资源投入、项目状态的不同,适用的阅读方法和工具自然也就不同。

直接啃代码的方式适合解决具体的细节问题,简单粗暴,速度快效果好。

但如果想完整而深入地了解一个有规模和难度的项目,又该如何进行呢?

一些参考方法:

- 阅读“README”;
- 通过查看提交和版本日志,研读所关注的功能和优化;
- 搭建测试环境并运行Demo或示例,观察运行状态,从外部了解核心功能和运行方式,形成总体认知;
- 善用文档:quickstart、tutorial、howto等内容中的示例往往是非常有效的了解途径;
- 分层阅读:先整体后局部,借助工具生成UML图,从整体了解代码结构和调用关系,确定阅读的层次和顺序;
- 寻找程序入口,根据实际情况确定阅读的切入点;
- 为代码写注释,必要时形成文档;
- 问题列表:记录疑问和问题并归纳成表,解决问题的过程也就是代码逐渐清晰的过程;
- 查看单元测试,编写测试用例,抛异常;
- Debug所关注的执行过程,观察现象和日志,明确调用关系和执行路径;

一些注意事项:

- 带着问题与需求阅读代码,围绕根本和主干,没有必要通读源码,更不应该沉陷于细节;
- 必要时略过难以理解的地方,不过度纠结于某一行某一段;
- 理解项目作者的思考方式,
- 低头专注代码,抬头思考架构,结合业务流程,从整体的角度来看待局部实现的过程;

简而言之,也就是“因人而异,因地制宜”,有效的才是合适的。

下一步

  • 关注原型
    最终展现的软件往往是“原型程序”经过精心包装和美化的结果。
“原型程序”只包括核心和基础功能,是可用的初始化版本,是“软件成长的起点”。
应该从“起点”开始跟随,而不是从“终点”返回。
  • 迭代式理解
    软件是成长起来的,而不是一次性搭建完成的,尝试理解代码,也会有一个循序渐进的过程。
对项目代码的理解,只是当时的理解,受限于当时的技能水平,知识结构,资源投入,甚至是身心状态。
经过一段时间磨砺和成长,回头再阅读同样的项目代码,往往会有新的发现和理解。
  • 改善适用性
    “学以致用”是获得知识技能的最有效途径之一。
实现自己的需求和想法,最终形成更适合的版本。
在现有“轮子”的基础上去制造“一个更完善轮子”,在这样的二次开发过程中,可以验证代码理解。
  • 获得建议与批判
    落后的起源是“故步自封”、“自以为是”和“自欺欺人”。
归纳并分享你的理解,会获得更全面更专业更中肯的建议与批判。
争议之中,也恰恰隐含着成长与改变的线索与机遇。

Python - 关于代码阅读的一些建议的更多相关文章

  1. Python代码阅读(第8篇):列表元素逻辑判断

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...

  2. Python代码阅读(第11篇):展开嵌套列表

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...

  3. Python代码阅读(第12篇):初始化二维数组

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了二维数组的初始化功能,根据给定的宽高初始化二维数组. 本篇阅读的代码片段来自于30-seconds-o ...

  4. Python代码阅读(第21篇):将变量名称转换为蛇式命名风格

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能. 本篇阅读的代码片段来自于30-second ...

  5. Tools - 一些代码阅读的方法

    1 初始能力 让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法.编程技巧和业务流程等频繁地阻碍和打断. 语言基础:熟悉基础语法,常用的函数.库.编程技巧等: 了解设计模式.构建工具.代码 ...

  6. 如何自学成 Python 大神?这里有些建议

    人生苦短,我用 Python.为什么?简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状:网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲解基础知 ...

  7. Python3练习题系列(08)——代码阅读方法及字典跳转表理解

    问题:分析下面代码 cities['_find'] = find_city city_found = cities['_find'](cities, state) 分析过程: 一个函数也可以作为一个变 ...

  8. py-faster-rcnn代码阅读1-train_net.py & train.py

    # train_net.py#!/usr/bin/env python # -------------------------------------------------------- # Fas ...

  9. 脚本病毒分析扫描专题1-VBA代码阅读扫盲、宏病毒分析

    1.Office Macor MS office宏的编程语言是Visual Basic For Applications(VBA). 微软在1994年发行的Excel5.0版本中,即具备了VBA的宏功 ...

随机推荐

  1. 洛谷1027 Car的旅行路线

    原题链接 将每个城市拆成四个点,即四个机场来看,那么这题就是求最短路. 不过建图有些麻烦,先要找出第四个机场的坐标. 设另外三个机场的坐标为\((x_1, y_1), (x_2, y_2), (x_3 ...

  2. PowerDesigner code、name显示设置 及 同时显示办法

    菜单->Tool->Model Options->Name Convention->右侧display中选择显示name还是code. 不支持同时显示,但可以选择显示code, ...

  3. Java中String字符串常量池

    首先看一个例子,通过这个例子更能快速理解String常量池 public static void main(String[] args) { String a = "ab"; St ...

  4. Python3 在操作excel时报PermissionError: [Errno 13] Permission denied: 'D:/workstation/yhdx_auto/config/case.xls'错误

    此问题为文件被拒绝访问,主要是该文件已经被打开了.关闭此excel文件后在执行excel的相关操作就ok了.

  5. 第一个VS2015 Xaramin Android项目(终)

    其实还有一个问题没解决,也拖很久了.中途公司的项目太紧导致无法学习更新. 之前的问题是这样的:项目搭建成功了,App也成功发布到虚拟机.便尝试增加控件 Xaml 设计界面如下: 但是在虚拟机运行却这样 ...

  6. ActivityThread 源码分析

    ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行) ...

  7. Transform(变换)—Y轴lable内容旋转

    <!DOCTYPE html> <html> <head> <style> div{ border:1px solid; } .bb{ position ...

  8. HCNA之网络通信基础

    一.通信与网络 通信的概念我们并不陌生,在人类社会的起源和发展过程中,通信就直伴随着我们.般认为, 20世纪七.八十年代,人类社会已进入到信息时代,对于生活在信息时代的我们,通信的必要性和重要性更是不 ...

  9. 【翻译】Flume 1.8.0 User Guide(用户指南) source

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  10. 树莓派RaspBerry账户初始化设定

    1 第一次安装系统进入后默认账户是pi/raspberry  root账户是默认锁定的 sudo passwd root 设置root账户密码 sudo passwd --unlock root 开启 ...