当前位置: 首页 > 科技观察

如何正确阅读源代码?

时间:2023-03-15 01:00:07 科技观察

在写完《你也可以像Prisma一样渲染图像》之后,有读者问了这样一个问题:我猜你应该看过开源项目的源码,好的开源软件或框架,几万行的源码,虽然是宝,但是我看源码一直漏了点。我投入了很多时间,但收获甚微。请问:您在阅读源代码时一般关注的问题是什么?您在源代码中看到任何方法吗?如何抓住重点,下手?有时候面对优秀的开源框架,想要学习,却不知从何下手。关于这个问题,我想说几句。阅读优秀的源代码是软件工程师提高编程技能和学习开源框架的最佳途径之一。作为一名运动员,除了持续刻意练习外,还需要大量观看对手的比赛视频。作为一名小说家,除了努力工作,还需要阅读大量其他作家的佳作。当然,观察和阅读不是目的,而是手段。在创作《平凡的世界》之前,路遥阅读了大量的“名著”。然后,他把所有受人尊敬的作家,都安置在遥远的历史为他们准备的“前圣言”中,让他们光芒四射,照耀人间。然后开始创作百万大作《平凡的世界》。照耀在你世界上的光应该是你自己的。程序员也是如此。在编程的路上,无数高手写出了伟大的代码和软件,学习他们的编程技巧和技术风格,取其精华,去其糟粕,最终完成自己的作品。2005年前后,我有幸参与了类似CORBA的分布式应用系统的开发。那段时间,我几乎把这个项目的早期代码都看完了。是早期的CORBA说明符)。这段经历对我后来的编程道路产生了深远的影响。和编程一样,阅读别人的源代码从来都不是一件容易的事,或者说,是一件需要不断投入、阅读、研究、玩、练的难事。很多人认为拿到源码就像买了一本书,立马放在书柜上,造成一种学习的错觉(我就是这样做的,微笑),但真正拿到手时,只会体验到强烈的挫败感练习过。.大多数情况下,如果看不懂,不是方法不好,而是输入不够。阅读源代码,一定要找到好的开源项目。什么是好项目?口碑好、应用广泛的项目才是好项目,比如Docker、Spring、OpenResty,都是很好的阅读材料。此外,完善的文档和足够的测试用例覆盖率是衡量一个开源项目是否优秀的标准。很多人说代码就是文档,好的代码是不言自明的。但是,对于大型开源软件来说,没有文档是不可想象的。所以在阅读源代码之前一定要先阅读文档。虽然看完文档后,你可能不知道代码的技术细节,但至少你能了解项目的大纲。结合开源项目的代码目录,大概可以画出一个粗粒度的整体架构图,类似这样:然后记录并标识每个目录(或模块),一个一个读,或者直接读部分你最感兴趣的是。我喜欢以自上而下的方式阅读源代码。先理清整体脉络,再按模块阅读代码,记录类与类、函数与函数的调用关系。如果可以逆向的话,用IntelliIDEA之类的工具把代码之间的调用关系显示在Diagrams中,这样阅读起来更直观。不同的语言有不同的工具可供选择。另外,阅读测试用例还可以帮助你理解作者的代码设计意图。一般情况下,测试用例来源于文档和设计,而不是完成代码后再编写测试用例。阅读测试用例可以让你更清楚地了解相应的类和函数要做什么。阅读源代码需要一个方便的工具。我喜欢使用Vim。配合NERDTree、CtrlP、ctags、taglist等插件,Vim可以成为优秀的代码浏览工具,而且非常轻量。您可以在终端中使用命令快速打开、关闭、搜索和索引程序,并进行有效的关联跳转(静态代码)。如果不习惯,也可以使用SublimeText、Atom等工具。当然,如果要调试跟踪,最好使用与程序栈相关的IDE工具,如Eclipse、JetBrain系列工具、Xcode等,这样可以跟踪到所有函数调用和可变参数调试状态。时间线上的变化。如果你喜欢Vim,可以阅读这篇文章《Vim8.0,姗姗来迟》。重申一遍,工具和方法从来都不是最重要的,读一读,遇到困难的时候,不懂的时候,咬紧牙关坚持下去,一个一个破茧而出。最终,你会在冰冷黑暗的二元世界中看到一张地图,找到一座灯塔,进而解释和还原底层世界每一个细微方面的语义,重构高层的抽象概念和关系。***推荐两本书,《Docker 源码分析》和《Go 语言学习笔记》,都是关于Go语言的。他们可以说是源码阅读的典范。如果您有兴趣,可以找到它们并阅读它们。