为中国操作系统内核而写的教程 2

本文探讨了如何通过详细注释大型工业级软件源代码,改进大学计算机教育,特别是针对非顶级院校的学生,降低学习难度,提升编程技能。文章分享了一个成功的案例,通过精心设计的项目和注释,一个二本院校的毕业生在人工智能算法领域取得了显著进步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于大学计算机系学生学习的建议

想要和我学习的大学生朋友,请在csdn上联系我。


大道至简。农村包围城市,一句简单话概括了中国革命的精髓。我的理论归纳成一句话,看懂大型工业级别软件的源代码。这个背后的东方哲学是以正治国,以奇用兵。农村要包围城市就要做根据地的地方政权建设,不然就成了李自成的流寇作战了。让大学生看懂工业级的源代码,就要对源代码做非常好的注释。不然学生只会觉得困难而没有收获。对源代码的注释就好比让文科生读一个理工科的学术论文,要对论文中的专业名词做详细的解释。

而让大学生看懂大型工业级别软件源代码最重要的前提,是把这些工业级别的源代码做详细注释。这个事情我已经部分完成,并将继续完备。(下文中这些工业级的带注释的源代码用注释项目来简称。)

现有的大学计算机教育方案被实践证明是科学的,而我只是希望在现有的科学的体系下,做一点点的修正。所以我的改进建议是在最不打乱学生的学习和大学的教学计划下做的调整方案。力图把学生的负担和老师的工作量降低到最小,这是必须要说明的。

一 向清华学习,看懂大型工业级别软件的源代码。

从清华计算机系说起,(以下内容引用来源于知乎网站:https://www.zhihu.com/question/326675268/answer/711181868)
此文作者是作为一名2005年入学本科和2009年入学研究生的清华大学计算机系学生。

“大三是计算机系,也是大部分清华工科院系的一个分水岭。因为随着平台基础课程的修完,大量的专业课程开始出现。《编译原理》、《操作系统》、《计算机组成原理》这三门大课便是当年大三学生头上的大山。个人觉的是否学过这几门核心课程的知识也是区分计算机专业和非计算机专业程序员的主要因素。清华计算机系的这几门课程,尤其的“重”,主要体现在除了课本知识上,还有分量不小的”大实验“需要学生去完成。

我到现在还清晰的记得每门课的实验场景。

《编译原理》的大实验:需要去实际的补全一个教学用的编译器,来解析一个类Java语言的源代码,以及生成和优化中间代码。这门实验是我我第一次读一个大型的代码库,也是一门让我深刻认识到什么叫“纸上得来终觉浅”。但也正是这门实验,使得我在工作中对于静态分析类的技术非常感兴趣。能在写代码时就发现并避免的问题,不用去等到代码运行时再去发现。

《操作系统》的大实验: MIT大学计算机系的操作系统实验jos(现在被本科同年级同学编写的ucore代替),需要补全一个教学操作系统的启动,内存管理、多进程、文件系统等功能。这门课程的实验使得很多的同学第一次接触Linux以及命令行程序。在模拟器中对着黑黑的窗口,人肉看内存,这门课程也使得的同学们学会了另一项奇技淫巧——在Linux中运行Windows程序。否则你正在写操作系统大实验的时候,同学找你打dota,你只能望洋兴叹“下一局”。

《计算机组成原理》的大实验:使用由清华大学科教仪器厂研发的TEC-2000A型FPGA实验箱,模拟制作一个简单MIPS指令集的CPU。第一堂课上完后从实验室领来的手提箱大小的试验箱,之后做实验的行为便被称为“烧箱子”。记得我实现简单的十几条指令,怎么也不对,后来借来别人做好实验的箱子,对着两个箱子用手拨动输入开关“人肉”调试,终于全部调通的那一刻整个人如拨云见日。
整个大三感觉速度一下被提上来,每个同学都面临着毕业之后的去路选择问题。很多同学大一大二便准备出国深造,大三的时候就已经开始准备申请;有些同学想要留校读研,也开始找系里的老师做一些学生科研项目,混个脸熟;还有的同学想要本科毕业直接工作,开始联系公司实习。准备读研和出国的同学们都开始注意自己的学分绩,为了使得自己的成绩单更加好看,每一门课都抓住尽可能得分点——作业,考试和大实验。大实验一般采用分组制,2~3人一组,每个人的实验得分很大程度上取决于小组得分。往往在课程之前,一个大牛便有好多小p奋勇而上,纷纷求抱大腿。然而大牛资源也是有限的,大牛往往被宿舍室友瓜分,或者大牛间强强联合。更多的情况下只能小p们抱团取暖。

“人都是逼出来的”——这句话作为系里的经典名言之一,是大三时大部分普通同学的真实写照。在这样巨大的学习压力之下,有些普通的小p们,被迫成长为“小牛”,“中牛”。也许他们暂时比不上那些大牛,巨牛们,但是这些经历使得他们可以成长到本来所不能够达到的高度。”

仔细读以上内容,我们可以发现清华大三通过阅读比较大型的代码,写比较困难的代码,来提高了学生的编程水平。这些项目是清华学生赖以提高的关键。其他大学也有类似的大作业,但是困难度会小的多。比如天津大学,暨南大学。如果用写作来类比,可以理解成清华学生完成了一部西游记或者三国演义的小说,而普通大学的学生是完成了一个高考的作文。这就是区别。

请看下面这个我的学生,他二本计算机专业毕业,从事视觉识别的人工智能算法。在学习了我的注释项目后的感悟。
宗师之路
我是C++程序员,已经工作蛮久了,我自己业余时间也写开源项目。我在此之前有一段时间,非常无聊,摸鱼的时候想学点什么,但很盲目,我就在各种C++Q群里要求别人问我问题,基本都能解答。一个半小时搞定项目一项目二主要是因为网太慢,(作者著 项目一项目二主要是比较简单的c程序)但后面的东西,比如数据库模型、编译器,都会让我有新的领悟。直到当我看到这个项目训练就知道,这经过精心挑选和设计,很讲道理。我就可惜没在大学时遇到这么好的东西,而且当时有些学生思维:懒,等着学,所以造成了后来走了不少弯路。如果能早些遇到这个项目训练,那我水平会早一些达到现在,以及可能现在已经做成了我想做的东西了。这个项目训练非常好,希望后来者珍惜。

我想通过对比,我们很容易发现清华在大三完成的大作业训练,是很多工作过的程序员都无法接触到的。更不用说普通的大学生。这才是造成差距的关键。

二 没有清华的学生,怎么借鉴清华的经验。
我们想借鉴清华的经验,无奈我们的学生不是清华级别的。这就好比一顿美味的大餐给一个牙齿不好的人,那怎么让这顿大餐我们年轻的学生能够吃下去呢,很简单,把大餐反复的煮烂点,这样就好咬了。换句话说就是通过逐行注释和傻瓜化的文档来降低这些工业级项目的难度,这就好比一个很难的英文阅读理解,把那些生僻的单词标注好中文解释一样,这样学生就容易看懂和理解了。我们需要把注释项目编写成几本电子教材,发送给学生。(代码一般用电脑看,所以电子版更方便和经济。)
三 在看懂大型工业级别软件的源代码这个中心,设计教学计划。
教学计划的设计原则:
1 尽量少改变福州大学已有的教学体系和计划,尽量让每个学生都能在改进的教学计划中受益,不像acm比赛最后只有最好的一批学生能参赛,或者像学校实验室的项目只有部分学生能够参与。
2项目源代码应该从易到难,从小到大。
3从老师讲解为主到学生自主学习,学生小组讨论,老师答疑为主,最后到学生完全自主学习。
注意:作者有在网络上带60个左右大学生和研究生,让这些大学生按照项目学习的方式来学习,下面的很多数据都来自于这些学生。这些项目的注释大部分是这些学生完成的。附件有这些学生对作者学习方法的评价。这些项目的资料在如下网址:https://github.com/xiaoling-project (部分项目还没有完成注释工作,因为知识产权的问题无法把电子书传上去,请见谅!请允许我在下列表格里写出完成这些注释所需要的时间,让大家明白注释工作是这个教学改进的核心,让历史铭记下这些英雄少年)

时间	课程安排	目标	在现有教学计划上做的改进

1 大一上学期 C语言 1 建议有能力的同学使用linux的gedit+gcc+gdb的环境
不要使用windows IDE
2 将 《c语言程序设计现代方法》和《linux c编程实战》作为建议学生阅读的资料,或者是查询问题的字典。
1. 这些改进,不改变以前年轻的课程和教学方法。
只需要和学生推荐两本书做教材的辅助。但是如果可以请使用《c语言程序设计现代方法》作为c语言的教材。这本书是麻省理工,普林斯顿使用的,翻译的非常好,问题讲的非常清楚,而且因为问题讲的非常清楚反而非常通俗易懂。遗憾的是大部分大学没有使用这本书做教材。
2. 一些偏底层的程序工作都要使用linux的,所以让有能力
的学生学习和使用linux是非常有意义的。未来学生操作系统的研究也是离不开linux。所以大一接触一些linux知识是非常有意义的。最重要的是window的完备的IDE,让学生形成错误的认知,觉得编程像魔法一样,其实ide是不同工具的组合而已。

2 大一寒假 1自主学习书籍Linux c实战编程2自主项目教材1 1了解和使用linux, gcc和gdb
2锻炼学生的自学api的能力
3 自主学习项目教材1 1书籍名:童永清的《linux c编程实战》
部分比较难的章节可以跳过,降低学生自学的难度,比如线程还没有好的应用实例学生很难理解。
改进点:这些linux的知识是很多大学没有教授,但是面试经常用到的。也是学操作系统的时候经常会遇到的。这本书为后面学习linux的c程序打下基础,为学习linux操作系统打下基础。
2 项目教材1包括以下项目
a webbench
这是一个国外程序员写的压力测试的工具,代码非常的简短,但是结构很精巧。并且使用了很多管道,进程,信号,定时器,字符串的组合,http的通信方式,缓冲区的使用和获取用户命令行输入的知识。非常适合教学。
改进点:在我没有注释和做文档之前,一个考上211的研究生看起来觉得困难,一个考上二本的研究生也表示困难。
在我没有做注解之前普通学生看懂这个程序需要一周的时间,在我做了注解以后和逐行的注释以后基本上1天的时间就能够看懂。也就是说通过注解和注释,我们把学生学习的时间大大压缩了,也把学习难度大大的降低了。
注释耗时:3个人,二周

b 五子棋
这是一个不完整的项目,是我故意这样设计的,目的是突出重点内容。原版本是c++写的,原版是在《visual c++游戏开发案例实战》,但我用c重写了,目的是让学生只掌握一种比较简单的c语言的语法,不用学习mfc这些框架(相对于c++和java面向对象的部分)就能够学习更多的项目源代码。
这个项目主要让学生明白不同程序之间通过有格式的数据来通信,一个程序发送数据,另外一个程序收到数据后通过解析其中的格式来做处理。这就是网络通信的原型。
改进点:
大学生在学习计算机网络的时候对各种协议的理解非常的困难,有了这个例子,那么理解这些网络通信的不同协议层就容易的多。
注释时间:3个人,2周

c 数据库模型
知识点:数据库索引文件,数据文件,hash表的使用,锁的设计。
改进点:程序的整体规模不大,但是让学生明白数据库到底是怎么实现的。这样再学习数据库的理论课程的时候就非常轻松。
以上的源代码几乎是每行都被注释了,学生只要认真看稍微查资料是可以弄懂的。这个程序是《unix环境高级编程》第20章数据库部分。书本上对程序的解释很简单,在没有把注释做出来之前普通大学生大概要看10天左右(一边上课一边抽时间看),而现在注释好了以后普通大学生只要能完成前面的两个项目,基本上只需要看三天。对项目源代码的注解极大的降低了项目学习的难度。

注释时间:3个人,2周
4 大一下学期 考试
项目教材1 以答辩的方式随机抽查项目教材中的某段内容,让学生谈理解。 改进点:通过考试确保学生有去自学,现在成都信息工程大学已经在大一采用答辩的方式检测学生,避免学生抄代码,或者找人写代码。
5 大一 下学期 课程
讲解项目教材1 写程序最困难的就是从完全不会到会一点,所以必须讲解一下这个几个项目,照顾每一个同学。这个课程不需要一个学期的时间,应该只需要一定的课时就可以完成。 改进点:
1 实践证明我的学生基本上看完上面三个项目就明白什么是编程了,然后可以自学 《x86从实模式到保护模式》和《真象还原》这样比较复杂的书籍了。
2 学生通过这个例子明白了,平时课程学到的是理论和语法。要提高自己需要看这样复杂的项目。学生会非常明确自己该学什么。

6 大一 暑假 将学生5人一组,以小组为单位自主学习
Bt程序,每个人看bt程序的不同模块,然后互相给对方解释。 1. Bt程序复杂度比较高,c语言大概有6000行。对大一的学生而言是相当的复杂,大部分本科阶段的毕业论文都没有这么复杂。
2. 同学之间的配合式学习。 改进点:
1这个项目是童永清的《linux c编程实战》的最后一章。是我从我翻阅的至少五十本书里寻找到的程序。是个比较有难度的程序了,甚至对于工作过两年的人而言。在没有做注释的时候,大学生普遍看完这个程序要1个月,我已经完成了这个项目的60%的注释,还没有达到逐行注释的程度,现在大学生在完成前面三个项目以后一般是在10天左右。所以是通过注释把大一学生不可能看懂的程序,变成大学生可以理解的程序。这就是注释的作用。前面的项目都是小项目,但这个项目算是一个工业级的项目了。

7 大二 上 考试
以答辩的方式 考察同学对bt程序的理解。 改进点:通过这个测试保证同学们暑假好好的学习,在自学了这个项目以后,大学生的对编程的理解基本上和工作的程序员没有区别了。
注释时间:2个人,1个月

8 大二 上 介绍book-os小组和xiaoling-project 让感兴趣的同学自己到上面的github网址寻找自己感兴趣的项目.
这些项目的难度和规模都是非常大了,但是因为有前面的项目的训练,还有良好的注释,那么难度被大大降低了。让同学们自己选择喜欢的项目来研究。 在https://github.com/xiaoling-project上
我们在继续做大型项目的注释。有以下几个类别

  1. 编译器类
    注释《自己动手写编译器和链接器》清华大学出版社出版。这个项目比较复杂,比较复杂的使用了一些数据结构,但是很直观的显示了语法分析和词法分析的实现,他没有用树的结构来做语法分析。如果能把这本书的源代码看懂,那么学编译原理的时候就能够有代码上的概念,而不是停留在简单的编译器的数学原理上面。

在没有注释的时候,这本书只有十分之一的大学生能够看懂每个细节吧。在完成注释后这本书

注释时间:2个人,二周完成初步注释
预估完整版本的注释:要1个月,由一个学生负责完成。
2 服务器类
A 五子棋的复杂化,用五子棋来演示java服务器的各种通信模式,阻塞非阻塞,是否使用多线程,libevent库的使用,这些都是工作中服务器设计经常需要使用的东西。
注释时间:初步完成程序设计和资料收集
2个人,1周的时间

B 一个仿nginx代理服务器的实现
这个项目的复杂度和bt程序差不多。这个也是工作中要使用的工具,理解这个项目的源代码对于学生理解大型复杂程序非常有帮助
注释时间:注释中3个人,二个月的暑假

C java的netty开源框架的注释
这个netty开源框架是一位工作3年的朋友花了一年的时间注释了大部分了,后面再安排两个同学完成这个框架的注释。

3 游戏类
A 坦克大战项目
这个项目主要是有两个版本的坦克游戏,第一个版本过度的使用线程,第二个版本合理使用线程,让同学用jprofier对第一个版本做分析,然后找出程序的瓶颈,这个工具的使用是重点,程序都是注释得比较好的。这个项目虽然小,但这个模型演示了unity3d这类游戏引擎是怎么工作的。
B 坦克大战的网络版,关键是不同客户端之间的同步问题。
项目注释:这个项目安排了2个同学,预计暑假就可以完成。

C java游戏服务器引擎
对一本游戏服务器的书做了注解。
注释时间:2个人,2个星期。

4 操作系统类
A x86从实模式到保护模式
真象还原
对这两本书的难点做注解
注释时间:注释中,估计暑假完成

B 深入理解linux虚拟内存
这本书是比较详细的说明了linux的内存管理机制
注释时间:还在注释中,预计暑假就能完成逐行的注释和完成各种难点的文档。

C linux内核的perf机制
注释时间:暑假

(几乎linux内核的每个部分我们的团队都在做研究中,注释将会陆续放出来吧!)

三 照顾能力强的同学,大一就开始做研究,而不是硕士才做研究
现在很多学生是高中,甚至初中,有些是小学才接触编程的。那么对于这部分学生,可以大一刚开学就把这个课程改进方案的内容给到这些同学,让他们感兴趣的可以先自学。他们一般都有比较强的自学能力,基本上一个学期就能把webbench,五子棋,数据库和bt程序自学完。那么后面就可以按照他们自己的兴趣来选择我们xiaoling-project项目中的学习方向了。

广州大学现在搞一个特训班的形式,就是大一就把编程基础好的同学集中起来,然后提供一些大方向,比如人工智能,大数据等方式,然后让学生自己选择他们感兴趣的方向,并开设课程专门做培养。目的就是让学生在大一就开始在某个方向上投入,这样大四毕业的时候就能取得一定的学术或者研究成果了。

对于对操作系统内核感兴趣的朋友,可以在大一的时候和我们联系。我们这个团队正在研究linux操作系统的内核,主要是以读内核代码,把内核的某些算法重新实现到我们自己的book-os操作系统上,并给出详细的注释,方便后来的人学习内核。请允许我介绍一下我的团队,我的团队主要是我在网络上联系的大学生,大部分是我按照上面的项目方法培养出的学生,也有一些加入我们团队前就有操作系统的技术基础了,还有几个是在企业工作的内核爱好者,我们大概有40人左右,以上这些项目的注释也大多数由这些学生来完成的。我是这个团队的老师,新加入我们的大学生我会沟通,在了解情况后给出具体的学习建议。在完成对操作系统的基础书籍学习以后,就可以编组到不同的小组里面,和其他同学一起研究内核的代码。因为我的学生大一或者大二就已经专注在操作系统linux的某个模块上面,比如内存管理,或者进程调度。他们大学专心研究1-2年,未来是有可能成为这个领域的佼佼者的。同时他们的研究成果以注释的形式被保留了下来,后来者的学习是非常的容易的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值