400行程序写一个实时操作系统(三):Sparrow的学习方法

千里之行始于足下,为了让大家的学习更加事半功倍,笔者将会介绍RTOS的学习方法。

可能很多人拿到一份源码,就想通过各种方式搞懂它,例如抄代码或者读代码。

笔者认为,单纯抄一个实时操作系统是没有任何用处的。比如对于Sparrow,它的程序仅仅有四百行,不到一天就可以抄完,但是又能收获什么呢?

老实说,笔者也干过抄源码和看源码这种事情,比如,笔者曾经抄过FreeRTOS五千多行源码,耗费了大量时间,也尝试看过linux内核源码,但是,这样的效率非常低,甚至是几乎没有任何用处。

读者可能会质疑和反对,但是,请听笔者细细分析原因。

首先,编程是一种结果向的产物,而不是过程,你看到的源码是不断修改后的结果,而不是过程。程序 = 数据结构 + 算法。我们想获得的,是代码的思路(通常是算法),编程是对我们算法的一种描述,而不是算法本身,这也就注定了,通过看源码理解思路,是低效的,因为源码并不等同于算法,如果有人直接将算法讲述给你,你再参考源码的具体实现,或者尝试编程实现,往往会收获更多,这才是学习编程最高效的方式。但是,可能有人会说:我上哪找人直接讲述源码?莫慌,笔者的这篇文章就是为了解决这些问题而写的。但在此之前,让笔者继续讨论那些没有必要的学习方式。

其次,不管是抄源码还是看源码,代码都是死的。编程产生的代码就是要运行在机器上的,也就注定了它面向的对象是计算机,而不是人本身,除非你的大脑是二进制的!没有运行的代码,毫无意义!快速学习一个项目,需要的是对项目深刻的理解,但是抄代码等行为,让我们的认知开始变得"趋利避害",也就是说,我们往往会忽视那些细节,只重点关注我们看得懂的部分,走不出自己的舒适圈,谈何提高?

最后,学习一个项目,重要的是背后的基础知识,而不是项目本身。所谓冰山一角,便是如此。没有水下的冰山,何来一角冰山?为什么有的人常常能够举一反三,那是因为它理解了一个事物的本质,从而能够在这个基础上进行扩展。很多人看源码,却从来不思考更深层次的东西,只关注源码的浅层次的实现功能。

现在该让笔者介绍一些更加有用的学习方式了。

让程序先跑起来

笔者已经说过,程序面向的对象是机器,死的代码没有任何意义,只有计算机认可的代码才是好代码,通过观察运行的程序,笔者可以更加高效的推测程序运行的原理。

读日志

读者可以在运行的程序中加入各种printf,观察打印的日志,从而推测程序的执行思路,并且可以猜测程序的各种原理,并且通过日志来验证它。

带着目的去查看运行中的程序

通常,我们学习一个项目是为了学会其中的各种原理,那么我们必须要有目的,同时要有疑惑,当解决疑惑时,就是我们的提高。为了学习项目而学习项目是不可取的,你应该重点关注你得到了什么,以及如何去运行这些知识,而不是学完后仍然脑袋空空。

上手修改并调试

对程序的修改,是对我们的想法最好的验证,在调试过程中,我们对程序的理解会进一步加深。

明确程序只是算法的具体实现

程序 = 数据结构 + 算法。如果有一些优质的资料介绍代码的算法,笔者建议通过算法来看程序,而不是通过程序推测算法。

在后面的章节中,笔者将会先介绍Sparrow的基本原理以及算法,然后让Sparrow运行起来,通过gdb等软件,一步步执行程序并且介绍Sparrow的程序是怎样实现它的算法的。

Sparrow源码地址:skaiui2/SKRTOS_sparrow at source (github.com)

相关推荐
码农多耕地呗14 分钟前
Java.函数-acwing
java·开发语言
lsx20240620 分钟前
Linux vi/vim 编辑器:功能强大的文本处理工具
开发语言
阿珊和她的猫21 分钟前
JavaScript中的内存泄露:识别与避免
开发语言·javascript·ecmascript
byte轻骑兵21 分钟前
【0x0014】HCI_Read_Local_Name命令详解
c语言·蓝牙·通信协议·hci
不去幼儿园29 分钟前
【强化学习】Double DQN(Double Deep Q-Network)算法
人工智能·算法·机器学习·强化学习·马尔科夫决策
今晚打老虎32 分钟前
c++第13课
数据结构·c++·算法
XDU小迷弟32 分钟前
第2天:Web应用&架构类别&源码类别&镜像容器&建站模版&编译封装&前后端分离
服务器·前端·安全·web安全·架构·安全架构
haaaaaaarry33 分钟前
快速排序排序方法演示及算法分析(附代码和实例)
算法·排序算法
lennon_jlu36 分钟前
1.4 java反射机制 简单的java反射机制实践
java·开发语言·python
luoluoal38 分钟前
java项目之社区医院信息平台源码(springboot+mysql)
java·开发语言