# 2024q1 Homework5 (assessment) contributed by < `yenshipotato` > ## 閱讀〈[因為自動飲料機而延畢的那一年](https://blog.opasschang.com/the-story-of-auto-beverage-machine-1/)〉的啟發 「謹以這個故事獻給那些試圖打開真理之門的人們,或許回過頭看一切都是徒勞,但只要能夠再站起來,就能抵達任何地方。」 這個故事裡沒有快樂結局,沒有天外救星( Deus ex machina ),只有現實和妥協。這是我在閱讀完全 23 篇文章後獲得的最大收穫。作者在大學四年級時選擇延畢做一個專案,在同學都已經在讀研究所或工作時,全身心投入一個以上帝視角來看沒有未來的計劃,也理所當然地碰到了一堆問題。 :::success 為什麼會出問題呢?因為這裡是他媽的真實世界啊。 大多數人一直活在本來就應該這樣嗎的童話世界裡。 [〈因為自動飲料機而延畢的那一年(3)〉](https://blog.opasschang.com/the-story-of-auto-beverage-machine-3/) ::: 現實就是如此,或現實本該如此,大多數的人因為倖存者偏差加上滿腔的熱血,一股腦地投入創業後,被接連的挫折淹死在現實的海洋。而其次讓我感觸甚深的就是台灣的教育體制。 :::success 除了資工系的學生不會寫程式,機械系的學生不會做機械,現在又多一條電工系的學生不會焊電路,這世界到底怎麼了啊。 [〈因為自動飲料機而延畢的那一年(22)〉](https://blog.opasschang.com/the-story-of-auto-beverage-machine-22/) ::: 這個世界沒有怎麼了,至少在台灣這是普遍的現象,在這裡,高等教育淪為一種為資本主義服務的洗腦手段,大學、研究所畢業後的學生沒有即戰力,進到職場再從零學習。而若有少數的人脫離了上述的鐵律:創業有成,則他們會被視為得志青年,成為倖存者;反之,創業失敗,他們不會被社會記得,或者成為負面教材,高等教育的負面教材,至此便陷入了一個惡性循環。而這個惡性循環的必要條件就是「害怕失敗」。 :::success 你該學習的不是看到事情要完蛋了就去避免失敗,而是應該學習如何處理與承受失敗,你才能變得比以前更強大。 [〈因為自動飲料機而延畢的那一年(12)〉](https://blog.opasschang.com/the-story-of-auto-beverage-machine-12/) ::: 承上,大多數人都害怕失敗,這種恐懼伴隨著教育植入廣大的莘莘學子,而不去嘗試就不會失敗似乎是大多數人面對失敗的百憂解,就連作者,在找上Jserv之前,都一直想避免失敗而裹足不前。不過我認為「害怕失敗」並不是癥結,「想避免失敗」本身也沒有問題,問題是「逃避」。恐懼是人類的生存本能,例如「害怕死亡」讓人類懂得避免危險以及促成醫療進步,但我們目前也只能延緩死亡的到來,同理,所有失敗都無法避免,但比起逃避,泰然面對、處理與承受失敗要更為實際。 :::success 但這是他媽的真實的人生,熱血毫無用武之地。 [〈因為自動飲料機而延畢的那一年(12)〉](https://blog.opasschang.com/the-story-of-auto-beverage-machine-12/) ::: 在這個故事的最後,作者的確做出了成品,做出了自動飲料機,而結局並不是申請專利、量產、發家致富,結局是把機器拆了送到倉庫,花了 14 個月、數以萬計的預算,仍然沒能成為倖存者,如果這是一個結果論的感想,那這就是一個沒有經濟價值,失敗的專案。但是,過程中,作者從一個對硬體設計、機械一竅不通的資工系學生,為了做出真的能用的成品,學了專案管理、硬體設計、機械結構設計,正因為不斷挫折以及在挫折中掙扎,才有辦法做出成品來。 :::success 紘銘總是能夠切中要害,問出關鍵的問題,衡量利弊得失做出當下最適切的決策。 我的房租和生活費就是來自紘銘的支應,換來能全心全意的投入在飲料機的開發上。 [〈因為自動飲料機而延畢的那一年(14)〉](https://blog.opasschang.com/the-story-of-auto-beverage-machine-14/) ::: 最後,我也深深體會到,人脈同樣是成功必要條件之一,儘管作者的勇氣與毅力都令人敬佩,但我更敬佩作者這位名為「紘銘」的朋友。我不知道他為了甚麼如此義無反顧,可能除了他本人也沒有人知道,而且聽作者對這位金主的描述,他不像是不能預見這個專案結局的人,但他仍把打工的錢資助在一個沒有展望的專案,同時為這個專案忙得焦頭爛額,我可以斬釘截鐵的說我辦不到。 這不是一篇傳統的雞湯文,而是血淋淋的紀實,正因為作者的自動飲料機專案沒能真正投入生產,才顯得這篇文章如此難得,儘管以做出成品來說,他已經成功了。但現實不會因為你花了多少時間多少金錢而饒過誰,「機器不夠穩定但要去當兵無法維護」,這就是現實的鐵鎚。不過經驗是會留著的,每一次的挫折與掙扎,都會使自己更精進。 ## 學習本課程 5 週之後的感想 透過前六週的課程,我深刻領悟到進步必須經過持續的訓練。儘管我在前六週的作業中屢次掉隊,無法如期完成,但正如授課教師所言,「缺甚麼補甚麼」,這一教訓我時刻銘記。認知到缺陷並不容易,尤其是在撰寫作業的過程中,我時常發現自己知識上的不足。然而,通過不斷地閱讀教材並在實際操作中學習,我能夠感受到自己的進步,這種進步是前所未有的。 在觀察他人的作業以及接受同學的建議時,我深刻體會到程式設計能力的差異對於實際成果的影響。比如,在第一次作業中,我收到了來自同學 `yenslife` 的修改建議。通過理解這些建議,我才意識到自己在使用 list API 方面存在著不足。我的程式碼不僅可讀性差,而且在程式碼的重用性方面考慮不足。通過使用簡單函式調用取代冗長的程式碼,我才真正體會到了程式設計的精妙之處。 這堂課讓我深刻體會到了資訊素養的重要性。從基礎的程式設計能力開始,逐步引導我們涉足資料結構、演算法、離散數學、作業系統以及計算機組織等領域的知識。老師不僅對程式效能給予了高度重視,還要求精確的漢語表達,營造了良好的環境。這些基礎能力是任何工程人員必不可少的,為未來實際對 Linux 核心進行貢獻打下了堅實的基礎。透過這堂課的學習,我意識到了持續學習的重要性。我將會繼續努力,克服自身的不足,不斷提升自己的程式設計能力。 ## 研讀第 1 到第 6 週「課程教材」和 CS:APP 3/e (至少到第二章),紀錄心得和提問。 * [你所不知道的C語言:指標篇](https://hackmd.io/@sysprog/c-pointer) 在考慮以下程式碼 ```c char str[123]; ``` 我實際做測試的結果的確如教材所示 `str == &str` ,我也理解兩邊的資料型別不同 :::info 可我仍然好奇為何會這樣做設計,這樣設計有甚麼優勢? ::: * 在[第四週測驗題](https://hackmd.io/@sysprog/linux2024-quiz4)測驗 2 ,提供的 mod3 範例程式碼 ```c= int mod3(unsigned n) { n = popcount(n ^ 0xAAAAAAAA) + 23; n = popcount(n ^ 0x2A) - 3; return n + ((n >> 31) & 3); } ``` 根據 Hacker's Delight 的說法,第 4 行 `n = popcount(n ^ 0x2A) - 3;` 的 `-3` 會使 `n` 變成負數,於是程式應該在 `return` 時將負數的結果加上 3 ,但跟據我的測試結果 `n` 在特定的數字下結果卻發生異常 (例 : n = 0xFFFFFFFE 時,結果應該為 2 ,回傳值為 0 ),不過將第 5 行的 `(n >> 31)` 改為 Hacker's Delight 中的 `((int)n >> 31)` 後結果就正常了。 :::info 在這裡測驗說明裡的範例程式是刻意去掉轉型的嗎? ::: * CS:APP Chapter 2.4 Floating point 在此前,我對浮點數的認知就只有 IEEE 754 標準,甚至只知道 S E M ,而這次我在閱讀教材後注意到了浮點數運算的章節,理論上,有理數具有稠密性,任兩相異有理數之間必有另一有理數,而有限的位元永遠無法提供表示有理數足夠的的精度,於是在兩浮點數的比較上,如 `0.1+0.2==0.3` 就可能為非。 而在[你所不知道的 C 語言: 浮點數運算](https://hackmd.io/@sysprog/c-floating-point#Floating-point-comparison)中提到,比較兩浮點數時可以加上容許誤差 epsilon ,這裡我產生一個疑問。 > |a−b| < 𝜖 max(|a|,|b|) :::info 目前最常被使用的方法是上述的 relative error 嗎?若是,目前使用 C 語言編寫上述浮點數比較時,是在編譯階段將 epsilon 引入,還是有相關的 CPU 指令集處理浮點數的比較? ::: ## 參照 2023 年期末專題,簡述你想投入的專案 (亦可建立新專案),至少選出 (或訂出) 二個。 已參考過 2023 年期末專題,但是我無法確定到期末之前以自身能力能做出什麼程度的成果,這部分希望與授課教師討論適合我的專題。 --- TODO: w/ yy214123 > https://hackmd.io/@yy870530/linux2024-homework5