MIT 6.S081 是 MIT 计算机本科高年级课程。通过实现部分内核功能来学习设计和实现操作系统。
6.S081 由课程和实验组成。课程的前半部分是介绍系统的各种概念和实现。后半部分是讲一些论文,比如 meldown,ext3fs。
实验有 11 个,需要实现不同功能,比如 page table,network driver。
顺便一提,6.S081 2020 的两位老师其中一位是 Robert Morris(RTM)。
Robert Morris 写了历史上第一个蠕虫,还是 Y-Combinator 的 co-founder。
RTM 在课上说,学习这门课程可能有这些理由:
总结下来就是,有用或者有趣。
操作系统虽然有用,但对于我这种 CRUD Boy 来说,远远算不上必须。
更重要的是有趣。代码写久了,难免会想知道它是怎么运行的,想知道人类可以用 01 构建什么。
这门课程很好的满足了我的好奇心。
从今年 2 月份开始学,直到 7 月才看完课程,做完最后一个 lab。
工作日,每天学 3 个小时左右。早上起来后学 1 个小时或者 1 个半小时。
下班后,吃完饭,刷一段时间手机。再学 1 个小时左右。
有的时候晚上写代码,会写到凌晨 1 点多,但再晚就不会了,脑袋都是浆糊,这个时候花时间没有任何意义。
周末的话看情况。
中间还补了一下 C 语言和硬件相关的知识。当然也有几个星期什么也不学的时候。
一开始想的是 6.S081 和 CMU 15-445 一起学(数据库我还试着学过其他两门,发现知识储备不够,就放弃了),半年学完。
但很快发现时间不够,而且 6.S081 太有趣了,所以就放弃了 15-445(学了大约一半,又想到没学完的 6.824,哎)。
其中很长一段时间,都在想有没有可能学完。也想过去抄别人的作业。
还真的看过别人的两行代码。写 page table 那个 lab 的时候,看过别人的两行代码,看了也没看懂。后来又反复看了书/视频,连蒙带唬的把测试跑过了。
难,难到骂娘。
但老师会手把手教你写代码,跟你讲如何分析,如何 debug。
老师还会跟你说,他也觉得难,不过我们要想办法搞定它。
学习是一件复杂而困难的事情,自学更是如此。
比如找学习资料,制定目标,比如如何巩固学到的知识。
跟着某个课程来学,会省掉很多不必要的力气。
但学校的环境更好。比如 6.S081 2020,有两位老师,两位助教,还有 Office Hour 用来提问。
有同学,大家水平都差不太多,可以讨论,可以催牛逼。
而自学的,有问题,只能靠 Google,Google 不到,就要猜,或者绕一大圈找答案。
老师把上课的视频,笔记,书,实验都被放在网站上了,随便访问。
而且设计的非常好,就是难,需要花很多心力去搞懂。
老师也很好,手写板书,思路极清晰。
老师也有意思,RTM 总喜欢嘿嘿嘿笑,他上 6.824 的时候,牛仔裤上还有破漏。学生提问,答不上来。跟学生说,你的问题很好,让我有了更深入的认识(一脸我又学到了/明白的表情)。
比如之前我一直错误的认为,刷算法题没有意义。
但被 6.S081 几番毒打之后,发现我编程太水了,要多刷刷题了。
还发现,原来程序可以有这么多神奇的玩法和设计。
可以看懂以前没办法看懂的东西,比如 Meltdown,比如各种 page table 各种玩法。
编程能力/内核编程经验
认识自己 基础不好,学习方法不好,编程能力一般般,眼界低。
这个只是个人经验,每个人学习方式不一样。
一般我会找有 lab/project 的课程看。目标一般就是成完成所有的 lab/project。
我一般会先看笔记,看不懂了看视频,再不懂再找资料。主要原因就是懒 。碰到感兴趣的,就查一些相关资料什么的。
这样做,不好的地方是,会漏掉一些知识,也不那么扎实。但做完了 project,至少知道个大概。
这门课程的网站 https://pdos.csail.mit.edu/6.S081/2020/schedule.html
视频也可以去 b 站上看
MIT 6.S081 很难,学起来很多时候很痛苦,也很有趣。
花了无数个小时,看完了所有资料,跑过了所有测试,我学完了。