--- title: 2024 年 Linux 核心設計/實作課程作業 —— review image: https://i.imgur.com/yht9f2e.png tags: linux2024 description: 回顧 第 1 次作業,補完指定進度。為 code review 做好必要的準備工作,練習 Software peer review。 --- # M03: review > 主講人: [jserv](https://wiki.csie.ncku.edu.tw/User/jserv) / 課程討論區: [2024 年系統軟體課程](https://www.facebook.com/groups/system.software2024/) :mega: 返回「[Linux 核心設計/實作](https://wiki.csie.ncku.edu.tw/linux/schedule)」課程進度表 ==[第一次作業檢討 (2023 年)](https://hackmd.io/@sysprog/linux2023-lab0-review)==`*` ==[解說錄影 (2021 年)](https://youtu.be/Gwb-PC1azR0)== ## :memo: 預期目標 * 強化[第 1 次作業](https://hackmd.io/@sysprog/linux2024-lab0),補完指定進度 * 為 [code review](https://en.wikipedia.org/wiki/Code_review) 做好必要的準備工作,練習 [Software peer review](https://en.wikipedia.org/wiki/Software_peer_review) * 歌德說:「要欣賞自己的價值,就得給世界增添價值」,從反省和觀摩中重新檢視自己作品的具體突破機會 * [軟體工程師要學會說故事](https://ruddyblog.wordpress.com/2016/06/18/),從良性詳盡的批評開始 * 工程師也許無法賺大錢,但一定要做大事 (開發的資訊系統給數千萬人每天用,當然是大事),為了這樣的目標,提高自身素養 ## :rocket: Code Review * 錄影: [Amazing Code Reviews: Creating a Superhero Collective](https://youtu.be/ly86Wq_E18o) * Google 公司提供的 [Technical Writing Courses](https://developers.google.com/tech-writing) > ==Every engineer is also a writer.== ## :penguin: 作業要求 1. 研讀上方 :rocket: **Code Review** 區域所列出的材料,搭配檢討及解說錄影,更新自己列於 ==[Homework1 作業區](https://hackmd.io/@sysprog/linux2024-homework1)== 的開發紀錄 * 詳閱[第 1 次作業](https://hackmd.io/@sysprog/linux2024-lab0)和[第 2 次作業](https://hackmd.io/@sysprog/BkmmEQCn6)規範,不需要建立新的共筆,在你原本第 1 次作業的頁面更新即可。第一週的作業**值得花上一個月來做**,但若授課教師一開始把繳交時限寫為四周,因人性使然,繳交的狀況會很慘,於是授課教師故意縮短時限並安排在課堂檢閱,給同學們持續精進自己的機會,期許有更好的結果。務必詳閱「[第一次作業檢討 (2023 年)](https://hackmd.io/@sysprog/linux2023-lab0-review)」解說錄影,檢討自身的投入狀況。 > :warning: 你可能會發現單頁 HackMD 筆記會有內容長度的限制,這也是為何作業規範強調要記錄你的洞見和關鍵程式碼,完整的程式碼該在 GitHub 儲存庫或 [gist](https://gist.github.com/) 出現。藉本次作業,整理既有的筆記,用精簡且明確的行文反映出你的投入。 * 檢查事項 1: 確認分析 Linux 核心的 `lib/list_sort.c` 實作並評估其效益、針對 Linux 核心風格的鏈結串列開發 Timsort 排序程式,該設計對應的排序測試實驗方案。 > :warning: 為了消除虛擬機器對於效能評估帶來非預期影響,你該在自己的電腦安裝 Linux,直接執行於電腦硬體之上。 * 檢查事項 2: 閱讀指定的論文〈[Dude, is my code constant time?](https://eprint.iacr.org/2016/1123.pdf)〉及列於 `lib/list_sort.c` 修改紀錄 (即 commit [b5c56e](https://github.com/torvalds/linux/commit/b5c56e0cdd62979dd538e5363b06be5bdf735a09))中的 3 篇論文,闡述你的洞見,需要指出論文和現有 Linux 核心原始程式碼不同的地方,並予以討論,過程中該有對應的效能分析實驗。參考 CPython 的 [listsort 的說明文件](https://github.com/python/cpython/blob/main/Objects/listsort.txt),對不同的資料分佈進行測試: * 檢查事項 3: 詳閱〈[Git 教學和 GitHub 設定指引](https://hackmd.io/@sysprog/git-with-github)〉(含解說錄影),使用 git 命令的 `fetch` 操作取得最新的 [sysprog21/lab0-c](https://github.com/sysprog21/lab0-c) 變更,並用 `rebase` 操作讓自己提交的 commit 得以在 [sysprog21/lab0-c](https://github.com/sysprog21/lab0-c) 最新的變革之上。注意:你可能會遇到若干衝突,你需要自行排除。過程中,確保符合〈[How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/)〉規範,你或許會需要用 `git rebase -i` 命令來改進,最後用 `git push --force` (注意: 操作務必謹慎) 公開發佈於 GitHub。 > `git rebase` 示意: ![image](https://hackmd.io/_uploads/HkkxHWE6T.png =80%x) * 檢查事項 4: 確保符合指定的書寫規範,技術用語依循〈[資訊科技詞彙翻譯](https://hackmd.io/@sysprog/it-vocabulary)〉,並針對授課教師的要求,以清晰、明確,和流暢的漢語書寫。倘若你選擇用英語書寫開發紀錄,則依正式英語技術報告慣例。 $\to$ 理解詞彙背後的考量因素,和使用精準詞彙,其實也是工程素養的一環。 * 檢查事項 5: 針對現有 (及自己的) 程式碼,提出可重用程度更高、效能更好,且更安全的實作,過程中應有對應的實驗及分析。過程中,應查閱 C 語言規格書 (原文) 及 [The Linux Programming Interface](https://man7.org/tlpi/) * 檢查事項 6: 研讀 [select(2)](https://man7.org/linux/man-pages/man2/select.2.html) 並探討 [sysprog21/lab0-c](https://github.com/sysprog21/lab0-c) 如何偵測程式執行的超時、現有的網頁伺服器如何與 linenoise 並存,以及相關的 [signal(7)](https://man7.org/linux/man-pages/man7/signal.7.html) 使用方式。 * 檢查事項 7: 使用 valgrind, massif, gdb, perf 等課程提及的開發量化程式碼執行時期的資訊,應分析記憶體開銷、執行的指令 (instruction) 數量、cache 表現,和程式熱點 (hotspot),並予以改進,過程中應有充分的實驗紀錄及討論。 * 檢查事項 8: 紀錄研讀第 1 到第 3 週課程教材的發現和疑惑,描述於上述開發紀錄,之後授課教師和其他學員會參與討論。 > :information_source: 你可建立新的 HackMD 筆記 (記得要公開發表並設定所有登入者皆可編輯) 來闡述你對教材的認知,並在原本的筆記加上對應的超連結。 * 檢查事項 9: 詳閱〈[Teach Yourself Programming in Ten Years](https://norvig.com/21-days.html)〉,闡述你的認知和發現,並描述你在本課程發現可對應到該文章的觀點。 2. 課程助教預計在 3 月 8 日,針對每位選課的學員,從 ==[Homework1 作業區](https://hackmd.io/@sysprog/linux2024-homework1)== 挑出 5 位學員,逐一發信通知,若你在 3 月 10 日零時尚未收到如此的信件,請聯繫授課教師,當然若你願意額外評論其他同學,也歡迎。針對其他學員的開發紀錄,請編輯內文,加上 `Reviewed by 你的GitHub帳號名稱` 的段落,參見: [示範的 Review-1](https://hackmd.io/@r36EKfH2TwalEWG_fUuSyg/linux2024-homework1) 和 [示範的 Review-2](https://hackmd.io/@jason50123/linux2024-homework1),你的總結意見要寫在共筆的最上方,僅次於 "contributed by"。要從以下方面探討: - 程式碼的 coding style, git commit messages (務必查閱其 GitHub repository) - 程式碼和共筆是否達到指定作業要求,特別是上述的「檢查事項」1 到 8。 - 實驗設計的不足處、涵蓋程度是否全面,以及後續的改進空間 - 共筆行文是否流暢且具體,結構規劃是否清晰 $\to$ 台大電機系李宏毅教授對於 ChatGPT 的看法是,要善用人工智慧的成果,一旦人們得以善用,人類的書寫不該比 GPT 一類的大語言模型差。 - 建議引入新的方法或工具,如 Valgrind 參數變更、縮減排序的時間成本 - 斟酌在選定的 GitHub repository 留下 code review 意見。 - 嘗試回覆學員提出的問題。 > :information_source: 及早提交對學員的意見並藉由 HackMD 平台互動 > :warning: 不必擔心得罪人而刻意用委婉或模糊的詞彙,如此非但不利於有效溝通,還可能導致真正的訊息丟失。關鍵是不要過分拘謹於形式,若因你沒有直接說出問題,導致他人錯失學習機會,那才是真正的失禮 —— **真誠地分享你的專業知識,讓溝通能夠達到共鳴,才是真正展現禮貌的方式**。 3. 應適時回應授課教師和其他同學在你羅列於 [Homework1 作業區](https://hackmd.io/@sysprog/linux2024-homework1) 的共筆中所做的評語意見、建議,和提問。你可趁這個機會,在其他學員的共筆提交相關疑惑。 4. 截止日期: Mar 25, 2024