学习记录13-如何阅读别人的代码

伙伴问:如何能快速提升编程能力?这感觉永远没有正确答案,每个人都有自己的套路,今天就来聊聊我对这个问题的看法:

学会高效读代码,就是一个不错的办法。阅读代码,可能和写代码一样重要!

为什么要会读代码?

学校往往教授的是如何写代码,可能从没有教如何读代码。

然而,理想很丰满,现实很骨感!工作中,你写代码的时间可能只占工作时间很少很少的一部分,大部分时间你可能都是在阅读已有的代码,当然除非这个项目从0到1都是你一个人干,可即便是自己写代码,也是渐进增长、不断迭代的,也需要不断反复阅读自己写的代码。

再者,编程与写文章,有异曲同工之处。编程与写作相似之处,都是用语言表达写作者的想法。

对于如何提升写作,古人曾讲:熟读唐诗三百首,不会作诗也会吟。回想学生时代,老师也常说:读书破万卷,下笔如有神!强调写作需要大量阅读,读的多了,写作能力也会相应提升。阅读之于写作,相辅相成,互为促进。

那么大量阅读别人的代码,也能提升自己的编程水平。阅读代码,个人觉得会有这样些好处:

博采众长

优秀的源码,就如传世佳作一样,值得反复揣摩,细细品味。其编写技巧、设计范式、架构思想,都具有极大的学习借鉴价值。比如一些优秀的开源项目:Linux内核、lwIP、u-boot等等。这些作品都汇集了全球优秀顶级程序员的思想智慧。都是非常优秀的作品,广为流传,广为应用。如果能花些时间去阅读理解一下其代码,一定是大有裨益的。

正如牛顿所说:如果我能比别人看的更远,只因为我站在巨人的肩上。

解决难题

编程生涯中,总会遇到一些感动束手无策的场景。github,搜索都已无能为力的时候。如果说还没遇到,那一定是机缘未到~

比如做Linux编程的时候,遇到某个API出错,或许在网上查找半天,都找不到答案。实在找不到答案了,尝试读一读内核底层相关代码,有时候就能发现问题的原因。

开阔视野

很多时候,日常工作内容或许只是很小的领域,修复一些小的bug,修改一些小的功能等。如果只专注这些小的点,个人成长一定会受到局限。

如果能善于发现一些新的感兴趣的领域,并去阅读相关的代码,则一定会提升自己的编程能力的。

所以为什么要读代码呢?

  • 找bug

  • review别人的代码

  • 学习

  • 维护等

如何阅读代码呢?

这里聊聊我的一些体会,也未必都对,也未必适合其他的朋友。分享以作交流,如有其他想法,也欢迎大家留言交流。

先粗后细

我一般拿到一份别人的代码,会先去找这个项目的入口,先梳理个大概的脉络。如单片机程序,一般会从下面几个角度先扫一遍:

  • main在哪里?

  • 开了几个任务?

  • 哪些是关键任务,主要功能链是怎么样的?

  • 任务间如何协作的?任务的执行周期是如何安排的?

  • 使用哪些硬件外设?

  • 使用了哪些中断?中断与哪些任务发生了交互?

  • 从软件角度看,大致有哪些子系统?

  • 是否有关键算法?

  • 是否使用开源组件?

  • ......

先不关心很细的函数具体怎么写,数据结构是如何设计的?这样,我大致能先有一个总体认识,然后在对自己感兴趣的进行细读。当然如果是review别人的代码则就另当别论了。

如果是Linux应用程序,或者C++应用程序,我也大致采用差不多的思路,先读个大概,然后再细读。比如对一个Linux应用程序,会先了解这些方面的概要信息:

  • 入口在哪个文件?一般都是main函数。

  • 是否支持命令行传启动参数?

  • 是否是守护进程?

  • 开了哪些线程?

  • 大致有哪些子系统?

  • 使用了哪些开源组件?

  • 是否使用驱动,是否有通讯等?

  • ......

如果项目采用cmake或者makefile进行组织的,那么先阅读下makefile也会是了解项目概要信息的一个比较好的切入点。

善做笔记

在阅读代码的概要信息的时候,我比较喜欢做做笔记,画画图。在阅读代码的时候,我比较喜欢先去研究代码中的数据结构。数据结构往往会体现作者抽象问题、对问题建模的一些思路,并使用UML图画出来,刚开始可能都不去看每个函数是怎么实现的,只关心与这些数据结构相关有哪些函数以及数据结构间关系。

或许,有的朋友会说,UML不会。不会没关系,用你习惯自己能看懂的方式都可以,而且即便是用UML也不必过分纠结绘制的图是否严谨。甚至拿支笔在笔记上手绘也可以。不过个人更建议,尽量写电子笔记,更容易保存和查阅。

阅读某一个具体函数时,如果函数内或者模块内具有状态机,如果这部分是需要仔细理解的时候,我就会将其状态机图,先绘制出来。比如,之前写的modbus协议中的状态图:

这样做有个好处,边绘图边去理解代码,就会加速对代码的理解,对我来说,我如果只用两只眼睛盯着看,和一边看一比画图效率会低很多。

这样做还有一个好处,可以将理解以图的形式记录下来,如果光用图还不能表达清楚的时候,我还会再加点文字描述。时间过了很久之后,再来看代码,可能之前的理解全忘了,可是如果有这样一份图文并茂的笔记,我就会很快找回记忆。

善用工具

比如source insght, vs code等工具,都是提高阅读代码效率的好工具。尽量熟悉如何使用键盘控制阅读跳转,用熟了,效率倍增。

另外,还有些工具,可以自动将代码转化成类图等,比如visual studio,可以自动绘制类图,Enterprise Architect也具有根据代码生成类图的功能。具有此类功能的软件还有很多。有兴趣可以搜索一下。

多多调试

如果遇到有的代码,怎么看也理解不了。这时候可以试着加些打印日志,运行调试一下,也可以使用调试工具进行断点、单步调试,观察程序运行的轨迹,数据的变化情况,可能就找到了突破口。

或者尝试对原有的代码,做些小的修改,来印证理解,也是不错的方法。

一个经常调试的程序猿,键盘上F10,F11这些键大都坏的比较快。

总结一下

把自己阅读代码的一些体会分享一下,每个人都会有适合自己的方法。利用适合自己的方法,高效的阅读代码,是提升编程的一个行之有效的办法。

如果我讲的这些,如对你有所启发,也不妨点个赞或者再看,小小的鼓励一下我。当然你如愿意扩散分享,那就感激不尽啦。

------------ END ------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512423.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川首例强生全视人工晶体在成都爱尔眼科医院成功植入

【2024年3月1日,成都】全国首批、四川首例强生全视TECNIS Symfony™ Toric IOL植入手术在成都爱尔眼科医院成功开展,手术由爱尔眼科四川省区白内障学组组长、成都爱尔眼科医院副院长巫雷教授执刀。TECNIS Symfony™ Toric IOL的成功运用,不仅…

一本书讲透ChatGPT——理论与实践的完美结合,大模型技术工程师的必备指南

写在前面 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景,在多项专业和学术基准测试中表现出的智力水平,不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎,被科技界誉…

【.NET Core】深入理解IO - 读取器和编写器

【.NET Core】深入理解IO - 读取器和编写器 文章目录 【.NET Core】深入理解IO - 读取器和编写器一、概述二、BinaryReader和BinaryWriter2.1 BinartReader类2.2 BinaryWriter类 三、StreamReader和StreamWriter3.1 StreamReader类3.1 StreamWriter类StreamWriter类构造函数Str…

学习javascript,前端知识精讲,助力你轻松掌握

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属专栏:前端泛海 景天的主页:景天科技苑 文章目录 1.JavaScript 简介2.js中,一切皆是对象3.js的引入方式4.js的变量以及…

JeecgBoot Vue3前端项目性能优化按需加载方案

JeecgBoot vue3前端项目在 3.5.5 版本之前,的确存在很严重的性能问题,大家可以参考以下文档进行升级。 按需加载改造方法 1、全局注册地方去掉2、组件改成异步注册3、用不到的大组件可以删掉 【精简项目方案】 大组件 1、富文本 tinyme2、Markdown3、…

09. Nginx进阶-Rewrite

简介 什么是rewrite? rewrite即URL重写,主要实现URL地址重写,以及重定向。 就是把插入web的请求重定向到其他URL的过程。 rewrite使用场景 URL地址调整 例如用户访问wang.mingqu.com将其跳转到ming.mingqu.com。 或者当用户通过http的方…

抢先看!Salesforce新职业Admineloper适合你吗?

每个Salesforce管理员在思考自己的职业生涯时,可能都会想到:下一步是往架构师,或者开发,还是咨询的方向发展。无论哪种职业规划,都需要培养新的技能。 由于角色职责、团队、客户需求等的变化,许多管理员在…

OSPF故障排查,这10大技巧是个网工都在用!

中午好,我的网工朋友。 OSPF这个名词网工们都不陌生吧。 OSPF,即开放式最短路径优先(Open Shortest Path First,OSPF)是广泛使用的一种动态路由协议。 它属于链路状态路由协议,具有路由变化收敛速度快、…

光纤激光焊接机:现代焊接工艺的变革引领者

随着科技的不断进步,传统焊接工艺正经历着一场革命性的变革。在这场变革中,光纤激光焊接机凭借其独特的技术优势,正逐渐崭露头角,成为现代焊接工艺的革新者。 光纤激光焊接机是一种采用激光束作为热源,通过聚焦镜将激光…

现代信号处理学习笔记(三)信号检测

通过观测数据判断信号是否存在,这一问题称为信号检测。 目录 前言 一、统计假设检验 1、信号检测的基本概念 2、信号检测理论测度 比率测度 概率测度 3、决策理论空间 二、概率密度函数与误差函数 1、概率密度函数 2、误差函数与补余误差函数 三、检测概…

容器云平台巡检实战:运维进阶技巧与策略

1 docker容器日常巡检 通过以下方式进行检查: 1.1 docker/podman ps查看容器状态 Docker/podman ps -a 查看容器状态STATUS: Exited(0):表示容器正常退出 Exited(其他数字):容器异常退出,需要通过log 查看原因 Up…

7款炫酷的前端动画特效分享(三)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 CSS3模仿四季交替动画 基于HTML5CSS3实现的卡通风格一年四季交替动画特效 以下效果图只能体现框架的…