分享到plurk 分享到twitter 分享到facebook

ShamrockLee (李岳瞬)

簡介

  • 國立中央大學 物理學系學士班 (2017 ~ 2022)

  • 國立中央大學 物理學系碩士班 (2022 ~ )

  • GitHub: ShamrockLee

  • HackMD: ShamrockLee

成果發表

Linux 核心和相關專案貢獻

其他專案貢獻

2023 Linux 核心實作 春季班 自我評量

作業共筆

期末專題

  • 亂數產生器研究
  • 一對一討論
    • 時段: 2023 年 5 月 11 日 20:30 - 21:00
    • 討論內容與指派任務:
      • O(1) 排程器的特性
      • 沒有分支的 floor_log2ceiling_log2
      • 鍊結串列 merge sort 及重用既有的程式碼改善實作
    • 教師的建議
      • 誠實面對自己
      • 及早接受檢驗與交流,包含將開發紀錄與撰寫中的程式碼上網公開

所見所聞所感

修課過程

當初是因為筆電上的 drivers 沒有正確運作,想知道 Linux drivers 如何撰寫,偶然加入去年的臉書課程討論區。得知新酷音的創世神今年也有開課,再加上考慮轉換跑道,在第二週改變修課計畫決定加入。

上這門課之前,一直有一種幻想,覺得任何事只要有熱情、衝下去就做得到。開始上課之後,才發現每週光講座時間就超過八個小時,第一週的作業 lab0 就超過大部分課程一個學期的作業量。

投入的前兩週(第三、四週)幾乎是放掉研究,每天醒來就開始寫作業,到晚上趴在桌上睡著,但進度卻遠不如預期。之前跨系修過資料結構,學過 linked-list ,到了 lab0 的 q_sqrt 就卡關了,花了不只一天還在為幾十行箭頭除錯。那時怕被發現做不出來,沒有及早公開程式碼與開發紀錄。後來再加上研究進度的壓力與測驗寫不出來,就只有每個星期的講座有收看,其他幾乎都落掉了。

過了期中,教授與助教開始提醒學員及早預約一對一討論。原本想把 lab0 做完再預約,但後來沒招了。硬著頭皮私訊教授的時候,甚至還沒有繳交任何一份作業。討論的時候一問三不知,真的很慘。如教授說的,「誠實面對自己」,及早接受檢驗;不用怕丟臉,現在什麼都沒有,已經夠丟臉了。

一對一討論過後,我試著重新回答當中的問題,並將「重用既有函式和的巨集,改進程式碼」的範圍擴展到 lab0 的整份 queue.c 實作。發現原本不知道能做什麼的 list_splice 等函式都能用在實作上,當晚完成了 queue.c ,通過了功能上的測試。程式碼行數減少了一半以上,不再充滿手動定義的 prevnext 指標。

另外在 Linux 核心專案中查到了一對一討論中被我寫成義大利麵的 ilog2 如何實作,發現原本在測驗中出現時完全看不懂的一連串位元操作,現在能明白它想做什麼,並實作出 branchless 的版本。教授希望學生「就算跌倒了,還是能抓起一把沙」,或許是這個意思。

因為當初希望自己「無論如何都不要退選」,再加上一對一討論的時候本校的退選時間剛好過了,所以撐到期末專題做完。做出的期末專題仍有相當巨大的改善空間,感謝教授還讓我參與到學期結束,甚至願意派給我期末專題。

這門課程讓我深刻的認知到自己的不足。在非資訊科系的小水塘,有比同儕好一點的程式能力,遠不足以支撐了解與開發系統程式所需。同時也震垮了「完成之後才能見人」的舊有陋習,我會努力以「誠實面對自己,及早接受檢視」替代之。

因為自動飲料機而延畢的那一年》讀後感

為了寫這篇心得再次讀這系列文章,和第一次看一樣是嘴巴開著看完。以下不會是一篇配得上原文的心得,只是粗淺的經驗和看法。

這樣一篇熱血的文章,但作者多次強調他們在做各項決定前的規劃,與決策當中的調整。很多決定都有量化的數據支撐。

想到大一下實驗物理的期末專題,我當時計畫用洞洞板縫上導線做出觸控板,作為移位暫存器的應用。開始沒多久就有發現「縫上」的動作太過耗時,但當時只是想說再快一點就能完成,導致沒有足夠時間檢查買來的電子元件,期末才發現位移暫存器壞了。經過慘痛得教訓,之後的實驗物理課一直提醒自己要控制規模。

以文中作者的作法,他們可能會先訂出各個實驗架設的階段能花費的時間上限,並在實作過程中依照量化的進度修正。如果我當時能當機立斷,把觸控版大小縮小為四分之一,我們就有時間進行測試,甚至因為要連接的線不多而能繞過位移暫存器,直接接在開發版上,最後就不至於開天窗。

教授在一對一討論時曾說過我還是在靠感覺寫程式,或許就是指「缺乏規劃」吧!

教授也在課程一開始就引入各種測試工具。像是用 santizer 檢驗越界存取記憶體與 race condition 。比起跑十億次迴圈來猜程式的行為,前者顯然是更堅實、更基於事實的基礎。

除了在程式上,還有在修課的腳步上。我在一開始的時候一頭熱的衝,學期才剛開始就後繼無力,也忽略了本職的研究進度,都是課程跟不上的因素。

除了規劃之外,「引進外部資源」也是作者在卡關時能繼續推進的動力。從找到專長於機械的夥伴、向飲料店借用數據、場地、努力向領域中的專業人士求教,到買進冰塊分裝機、加糖機等等。這些資源提供了很多作者他們靠自己想破頭也無法想到的解方。

教授從一開始作業撰寫、繳交的方式,就一直鼓勵、要求及早公開、互相提問、觀摩他人的作法。期末專題中的 fls_u32_branchless ,是因為教授建議我參照另一份專題的成果,才能升級為 gen_f{f,l}s_branchless 。我會在 lab0-c 就卡關,也是因為持續閉門造車,只想等「弄好」再繳交。以前有人說「作業沒寫完,怎麼還敢繳交?」,這個學期的經驗很肯定的告訴我:沒做完的東西給別人看,就算給別人笑或給別人罵,搞不好還能找到克服的方法;卡在那會什麼都沒有。

最後,或許「熱情」不是起頭不顧一切的踩油門,而是帶著一個人在困難與遠路上繼續前進的東西。

自我評量 (1 ~ 10)

我給自己 5 分。

未及早公開結果、尋求意見,加上本身基礎不足,造成進度落後許多。完成的作業量與整體作業量相比,大概不到四分之一,遠不及研究所及格分數的 70/100 。

但是這門課真的超乎想像。學了 binary operation 不會想像到的用法,現在能看懂一些。甚至在過程中貢獻了 Linux 核心專案(雖然只是錯字)。

現在抵達了期末。希望研究告一段落之後,能再次挑戰這些課程內容。