解读代码
关于这个主题可谓仁者见仁智者见智,每个人的方法经验都有不同,我只能尝试着归纳一下自己的习惯方法。
首先关注宏观整体,暂时忽略代码细节, 因为如果你上来就陷入代码细节很容易迷失方向,就好像一棵树,你上来就去数树叶, 头不晕才怪呢!你先要看清楚树根,树干, 树枝, 树叶的颜色, 形状,长势等等,真没有必要逐个分析每个树叶!
打开项目代码, 首先分析根目录下每个子目录的功用, 有多少个配置文件, 每个配置文件的功用!特别是项目的编译构建配置文件更要着重分析, 弄清楚此项目依赖了哪些第三方库和框架!能否跨平台等等, 然后构建编译一下,跑起来看看。
找到项目的启动入口代码, 仔细阅读分析, 都加载了哪些功能模块, 先后顺序!特别是日志模块, 事件监听派发模块, 消息队列模块, 用了哪些并发库、网络库、采用了那些互斥同步机制等等。
弄清楚模块间、对象间如何交互,比如是函数调用、消息队列、RPC、共享内存、分布式缓存、zookeeper等等,去除或者忽略各种辅助代码,专攻核心模块! 根本目的在于弄明白每个模块和对象的分工和协作方法, 注意画UML图, 脑图和文字描述, 如:结构图,时序图等等。
弄明白其采用的失败重试容错机制!异常捕获处理机制!优雅退出机制!信号处理机制!如果是分布式系统, 需要弄明白CAP, 本系统侧重哪两点!数据一致性级别, 比如:强一致性,还是最终一致性等等, 采用什么共识算法,分布式锁机制, 分布式缓存,有无状态、能否自动伸缩等等。
让程序跑起来, 调试器gdb, valgrind,ldd等工具都可以用上, 在关键代码逻辑点加上日志!分析一下日志输出结果,包括日志自动收集分析工具等。
其次着重阅读分析此项目采用了哪些特色数据结构和算法!特别是项目核心算法代码!分析是否依赖特定领域知识, 比如特定数学物理方面的定理公式等等!各个击破!遇到看不懂的代码, 先掠过, 先通体都读一读, 整体明白了,局部很可能就不攻自破!
再次对于资源管理和回收, 资源池、对象池、各种连接池、并发限流,排队、降级、避免数据库击穿等机制也要看一看。
最后看一看发布部署机制,监控狗等运维机制等等。
阅读代码必须要懂得做减法,去除细枝末节,留下核心!对于具体算法,首先知道它的功能就好, 比如知道这是排序算法,更进一步搞明白此处为什么采用堆排序而非希尔排序就可以了!至于作者为什么把代码写成那个样子,可以暂时放一放!以后有时间抠这些细节!不要被一叶障目,只见树木不见森林!
古人云登高望远, 目的在于首先看清整体的轮廓, 不至于过早地陷入细节之中!兵法云不谋全局者不足谋一域!不谋万世者不足谋一时!
听老于聊聊技术、人生、美景吧!希望大家关注、评论、点赞、转发!支持我走下去!谢谢啦!
领取专属 10元无门槛券
私享最新 技术干货