# 2024q1 Homework5 (assessment)
contributed by < [`st10740`](https://github.com/st10740) >
## 閱讀〈因為自動飲料機而延畢的那一年〉的啟發
作者最讓我敬佩的地方是面對多次的失敗仍然不放棄,尤其是過程中需要不斷地進行各種繁瑣的測試,只為了解決其中一個飲料機製作的問題。此外為了提高測試的效率,還想了新的解決辦法,我特別記得其中一段是作者發現每次更改一個小地方就需要一個禮拜的時間等待測試成品做出來,於是他轉了一個彎,改成用比較快速的方式將想法實作成可以測試的模樣,提升了測試的速度,展現了他面對問題靈機應變的能力。
文中亦不斷提到現實與理想的差異,並強調「這些基本到不行、看起來不難的東西,動手做之後才會發現很多細節要注意。」這讓我發覺自己是個害怕失敗的人,理想的世界很美好,如果不動手做就不會發現有甚麼問題了,這使我常常不願意動手實作,缺少了許多學習的機會,也讓我想起當初看到 lab0 中要以 Linux 核心原始程式碼風格的鏈結串列實作佇列操作時,我錯誤地以過去自己實作佇列操作的經驗,認為可以很快地完成,但直到自己實際投入之後才發現,有許多細節若沒有注意到會造成執行結果不如預期,需要花大把的時間除錯。但是「只有把東西生出來做實驗,你才會知道該如何改進。」雖然會遇到很多問題,但是這些都是精益求精的必經之路。
我一開始想要選修這門課的原因是希望能夠增強自己在電腦科學領域的能力,讓自己成為在專業領域有價值的人具備解決各種大大小小問題的能力。然而因為過去不夠了解自己的不足,要還許多技術債和改進做事的態度,我在一開始的幾個禮拜都在追趕教材和作業,雖然有在閱讀教材和觀看影片,但是有太多我不能馬上理解的知識,需要停下來思考一陣子再繼續往前,導致花的時間比預期多了好幾個小時;雖然有將作業交出去,但是進度往往不及其他優秀的同學,內容的豐富度和思考的層面也有所落差。另外在課程中老師不斷強調的學習態度讓我印象深刻,像是作業的描述要寫得清晰讓人理解、要參考第一手資料而不能只是 Google 搜尋、理解別人的實作理由要看 git log 或是相關文件不能舉燭、提出一個結論要有實際的實驗數據等等,這些都是我不擅長並還在學習的,雖然做起來很辛苦,但是我相信培養了這些習慣以後,未來遇到任何問題都能夠比起過去的我更有邏輯地找到解決辦法。在課程和實驗室工作的雙重壓力下,因為有許多落後的進度需要補齊,到後來漸漸發現自己亂了腳步,忘了當初修課的決心,於是正好藉由這個機會檢討之後課程的投入方式,我想分配好每週至少投入的時間,分別用於補齊前面的教材作業以及進行新作業,並設定當週要完成的事項,因為正如文章中說的:「這個世界比任何人都殘酷,也比任何人都公平,犧牲了多少就會得到多少。」,雖然速度慢了點,我相信只要持續地投入,一定會變得越來越強,成為理想中的我。
## 課程教材提問
- 在〈你所不知道的 C 語言:數值系統篇〉講座中有提到,現代的 C 語言 `4 / 2` 和 `4 >> 1` 的執行速度一樣快,原因是甚麼呢? 是因為編譯器最佳化將 `4 / 2` 改成 bitwise 操作嗎?
:::danger
參見〈你所不知道的 C 語言〉的編譯器最佳化講座。
> 看了此講座了解到這是利用 peephole optimization 中的「弱化特定的作用」方法做到的效果,將除以 2 的操作以右移取代,因為除法需要的代價比較大。
:::
- 在〈你所不知道的 C 語言: bitwise 操作〉講座中有介紹陷阱表示法可能出現的情境,最後的總結是「為求最大可攜性,位元運算不應該用在有號整數上」,想請問最大可攜性的意思是甚麼呢?
- 在〈你所不知道的 C 語言:指標篇〉中為甚麼會特別強調 `extern` 的array 與 pointer 不可以互換? 那 `static` 的 array 是否也不能和 pointer 互換呢?
## 欲投入的期末專案
### 〈每位程式開發者都該有的記憶體知識〉翻譯和校訂
覺得自己對記憶體的理解很薄弱,希望能夠藉此機會更深入了解記憶體的運作機制,並學習如何撰寫高效的程式,以最佳化記憶體的使用,同時為繁體中文文獻盡一份心力。
### 打造 Linux 虛擬攝影機裝置驅動程式
對探討 Android 核心的攝影機裝置驅動程式有興趣,想藉此學習攝影機裝置驅動程式的開發。
### Android 底層相關
對處理 Android 底層的問題有興趣,特別是與 Graphic Rendering 有關的,有看過老師的 〈Hardware Accelerated 2D Rendering for Android〉投影片,但是不知道近年有什麼主題比較適合我做,想請老師指點。
---
C23 才強制用二補數
[36-bit computing](https://en.wikipedia.org/wiki/36-bit_computing)
> The standard C programming language requires that the size of the char data type be at least 8 bits,[3] and that all data types other than bitfields have a size that is a multiple of the character size,[4] so standard C implementations on 36-bit machines would typically use 9-bit chars, although 12-bit, 18-bit, or 36-bit would also satisfy the requirements of the standard.
Arithmetic shift right (ASR) is NOT portable.
extern 的array 與 pointer 不可以互換? 那 static 的 array 是否也不能和 pointer 互換呢? => visibility
TODO: 〈每位程式開發者都該有的記憶體知識〉閱讀並紀錄問題
TODO: 針對第六章的實驗,予以重現
TODO: 第八章的翻譯