6.031,CSC151,CMPT379(软件工程以及编译原理)结课感想
碎碎念
终于把相关的东西全部收掉了=_=,379的项目并没有他们校内一些人说的那么夸张。但是还是需要一番努力的。
原本是只打算开编译原理的,但是写下去之后发现自己最好把软件工程相关的知识补一下,因为这个项目可以说是目前接触到的一个比较大的项目了,并且看engineering a compiler里面提到编译器是一个非常不错的软件工程的实践。 所以就把6.031的note看了。
这些课和OS课的收尾是并行的,所以粗略估计大概也花了两个多月。最后的结果是OS剩了点paper,成功烂尾。
软件工程的相关Note应该看了半个月左右,然后CSC151这个lecture可能看了十天到15天,重头是379,花了33天,虽然中间是有摆烂的天(一有困难我就想打游戏,据不完全统计,我手机里的文明6至少卸了3次)
这次写379的时候,我装了一个waka time的插件,他有一个自动的写代码时间的统计,这个统计差不多是准的,以后可能就会以相关的平均值来衡量自己的一天。目前来看,一天的学习时间平均下来确实是只有4小时。

吐槽:川流一天居然能学13小时(自述)这已经超越UCB老师给定的范畴,达到了神的领域,有点想学,但不知道是怎么做到的。
关于软件工程
说实在的,我觉得软件工程这个东西是可以教的,但是成本会极其高昂,首先你需要有人能和你pair programming,而且你们水平差不多。最好要有有实战经验的TA来辅助你们。然后通过对应项目和场景进行实验。如果真的需要教学,这至少是一门十分漫长而且投入巨大的课程。也许以后可能会有这种能够定制这种东西的培训班出现吧。
个人认为,软件工程相关的知识如果通过吹b和补充夹杂在其他必修课程里面,会好很多。原理性的东西其实并不多,结合案例真的很不错。
(可能单纯的给项目也是不够的,因为软件是一个存在多解的工程问题,当你觉得A好的时候,你同时要知道B为什么坏)
不过6.031其实是叫软件构造?(software construction)
031的项目不开放,我也找不到能够和我pair programming的队友,所以很sad,我个人觉得收获并不是很多,只是收获了不少能够和别人吹比的谈资。(但是又很sad的一件事情是,大学里很难能找到和你吹比的人。)
6.031里面学了不少软件工程相关的知识,但是在做379的时候实际上并没有怎么用出来。面对一些问题的时候,还是按照自己的直觉进行写代码。031彻底沦为了书上的知识。
软件工程,是技能,而不是描述。如果你有好的老师,这些东西是不需要开一门叫做软件工程课来教你的。
编译原理
课程的lecture我看的是CSC151,但是这门课并没有开放对应的project和homework。所以在null哥的推荐下,我选取了CMP379的project作为这个课程的补充作业(这门课没有开放的lecture,所以说刚好。)
这门课好像要有formal language 计算理论什么的前置?但是体验下来似乎并不是特别需要,可能是因为我学了70。
CSC151,这个教授纯板书,纯手写,讲的非常好,至少让我很舒服,一些算法,他甚至会花一节课的时间一点一点给你做演示,这个对于他的学生也许不是一个好的事情,但是对于看网课的人,实属是一种福利。

不过他没有讲语法方面的知识,根据379的经验,这里并没有太多需要讲的地方?
对于379,null哥的评价是,编译器中的xv6,我觉得确实,虽然379的project完全不涉及代码优化(以前版本有,而且工作量更加巨大)距离一个有实际用途的编译器还有极大的距离,但是确实是感觉自己有了写一个能用的编译器的能力。
写379的能够收获的体验。
自己写自动化测试代码框架。
模块化后,bug飞速定位的爽感。
这是什么,时间消失器?CTRL + 按一下。这是什么,时间消失器?CTRL + 按一下。这是什么,时间消失器......
从此开始理解中型项目的框架源码阅读的正确方法。
一些做的过程中遇到的体验。
理解是最大的困难,复杂系统的一个部分出了问题,会导致bug会在一个看上去毫不相关的地方出现。
还有就是第一次接触了FunctionSiagnatures这种像黑科技,declarative programming。
模块化,和assert,能够很快的定位常规的bug。编译器是我目前见过最模块化的软件。
理解了编译器,从token到AST,语法检查,然后code generator的这个流程,做的过程中比较深刻的理解了且知道了runtime和compile time的不同检查,有些东西是能在compile time分析出来的,有些东西只有在run time才能确定的。最典型的就是函数的传值。
还有一个比较有趣的体验,之前暂时性的把index用全局变量存了,然后数组的打印是递归的,我就按照正常的递归写了数组打印,但是对应code 的 label是固定的,这就导致,我打印第二个元素的时候用了第一个元素,直接越界索引。
遇到困难就容易摆烂去玩游戏。
61A的environment diagram非常棒的帮助理解了项目里关于scope的讲述,61A作为一门入门课,确实掺了很多高阶的东西。
379可能并不能帮你覆盖所有的编译器该学的东西,比如说他用LL1parsing而不是LR1parsing,但是我觉得这已经足够了。
379的项目地址,任务量可能是5-6个gitlet
https://github.com/eecsmap/ca.sfu.cmpt379.2023.summer.resource
附上做379时的打卡。
