6.031,CSC151,CMPT379(軟件工程以及編譯原理)結(jié)課感想
碎碎念
????終于把相關(guān)的東西全部收掉了=_=,379的項目并沒有他們校內(nèi)一些人說的那么夸張。但是還是需要一番努力的。
????原本是只打算開編譯原理的,但是寫下去之后發(fā)現(xiàn)自己最好把軟件工程相關(guān)的知識補一下,因為這個項目可以說是目前接觸到的一個比較大的項目了,并且看engineering a compiler里面提到編譯器是一個非常不錯的軟件工程的實踐。 所以就把6.031的note看了。
????這些課和OS課的收尾是并行的,所以粗略估計大概也花了兩個多月。最后的結(jié)果是OS剩了點paper,成功爛尾。?
????軟件工程的相關(guān)Note應(yīng)該看了半個月左右,然后CSC151這個lecture可能看了十天到15天,重頭是379,花了33天,雖然中間是有擺爛的天(一有困難我就想打游戲,據(jù)不完全統(tǒng)計,我手機里的文明6至少卸了3次)
????這次寫379的時候,我裝了一個waka time的插件,他有一個自動的寫代碼時間的統(tǒng)計,這個統(tǒng)計差不多是準(zhǔn)的,以后可能就會以相關(guān)的平均值來衡量自己的一天。目前來看,一天的學(xué)習(xí)時間平均下來確實是只有4小時。?

????吐槽:川流一天居然能學(xué)13小時(自述)這已經(jīng)超越UCB老師給定的范疇,達(dá)到了神的領(lǐng)域,有點想學(xué),但不知道是怎么做到的。??
關(guān)于軟件工程
????說實在的,我覺得軟件工程這個東西是可以教的,但是成本會極其高昂,首先你需要有人能和你pair programming,而且你們水平差不多。最好要有有實戰(zhàn)經(jīng)驗的TA來輔助你們。然后通過對應(yīng)項目和場景進(jìn)行實驗。如果真的需要教學(xué),這至少是一門十分漫長而且投入巨大的課程。也許以后可能會有這種能夠定制這種東西的培訓(xùn)班出現(xiàn)吧。
????個人認(rèn)為,軟件工程相關(guān)的知識如果通過吹b和補充夾雜在其他必修課程里面,會好很多。原理性的東西其實并不多,結(jié)合案例真的很不錯。
????(可能單純的給項目也是不夠的,因為軟件是一個存在多解的工程問題,當(dāng)你覺得A好的時候,你同時要知道B為什么壞)
? ? 不過6.031其實是叫軟件構(gòu)造?(software construction)
????031的項目不開放,我也找不到能夠和我pair programming的隊友,所以很sad,我個人覺得收獲并不是很多,只是收獲了不少能夠和別人吹比的談資。(但是又很sad的一件事情是,大學(xué)里很難能找到和你吹比的人。)
????6.031里面學(xué)了不少軟件工程相關(guān)的知識,但是在做379的時候?qū)嶋H上并沒有怎么用出來。面對一些問題的時候,還是按照自己的直覺進(jìn)行寫代碼。031徹底淪為了書上的知識。
????軟件工程,是技能,而不是描述。如果你有好的老師,這些東西是不需要開一門叫做軟件工程課來教你的。
編譯原理
????課程的lecture我看的是CSC151,但是這門課并沒有開放對應(yīng)的project和homework。所以在null哥的推薦下,我選取了CMP379的project作為這個課程的補充作業(yè)(這門課沒有開放的lecture,所以說剛好。)
? ? 這門課好像要有formal language 計算理論什么的前置?但是體驗下來似乎并不是特別需要,可能是因為我學(xué)了70。
????CSC151,這個教授純板書,純手寫,講的非常好,至少讓我很舒服,一些算法,他甚至?xí)ㄒ还?jié)課的時間一點一點給你做演示,這個對于他的學(xué)生也許不是一個好的事情,但是對于看網(wǎng)課的人,實屬是一種福利。

不過他沒有講語法方面的知識,根據(jù)379的經(jīng)驗,這里并沒有太多需要講的地方?
????對于379,null哥的評價是,編譯器中的xv6,我覺得確實,雖然379的project完全不涉及代碼優(yōu)化(以前版本有,而且工作量更加巨大)距離一個有實際用途的編譯器還有極大的距離,但是確實是感覺自己有了寫一個能用的編譯器的能力。
? ? 寫379的能夠收獲的體驗。
自己寫自動化測試代碼框架。
模塊化后,bug飛速定位的爽感。
這是什么,時間消失器?CTRL + 按一下。這是什么,時間消失器?CTRL + 按一下。這是什么,時間消失器......
從此開始理解中型項目的框架源碼閱讀的正確方法。
一些做的過程中遇到的體驗。
理解是最大的困難,復(fù)雜系統(tǒng)的一個部分出了問題,會導(dǎo)致bug會在一個看上去毫不相關(guān)的地方出現(xiàn)。
還有就是第一次接觸了FunctionSiagnatures這種像黑科技,declarative programming。
模塊化,和assert,能夠很快的定位常規(guī)的bug。編譯器是我目前見過最模塊化的軟件。
理解了編譯器,從token到AST,語法檢查,然后code generator的這個流程,做的過程中比較深刻的理解了且知道了runtime和compile time的不同檢查,有些東西是能在compile time分析出來的,有些東西只有在run time才能確定的。最典型的就是函數(shù)的傳值。
還有一個比較有趣的體驗,之前暫時性的把index用全局變量存了,然后數(shù)組的打印是遞歸的,我就按照正常的遞歸寫了數(shù)組打印,但是對應(yīng)code 的 label是固定的,這就導(dǎo)致,我打印第二個元素的時候用了第一個元素,直接越界索引。
遇到困難就容易擺爛去玩游戲。
61A的environment diagram非常棒的幫助理解了項目里關(guān)于scope的講述,61A作為一門入門課,確實摻了很多高階的東西。
379可能并不能幫你覆蓋所有的編譯器該學(xué)的東西,比如說他用LL1parsing而不是LR1parsing,但是我覺得這已經(jīng)足夠了。
379的項目地址,任務(wù)量可能是5-6個gitlet
https://github.com/eecsmap/ca.sfu.cmpt379.2023.summer.resource
附上做379時的打卡。
