版本 34bc4f2ec7d5bc78e5f99e46c0c8b1eb6aef1993
Changes from 34bc4f2ec7d5bc78e5f99e46c0c8b1eb6aef1993 to 77f730e8989ffa18a34cf25ca587bd4947f30ca6
---
title: Chialiang86(郭家良)
categories: User
...
學歷
======================
- 成功大學 土木工程學系 109 級 (2016-2018)
- 成功大學 資訊工程學系 110 級 (2018-2021)
聯絡資訊
======================
- email: ``a930039930039@gmail.com``
- github: [``Chialiang86``](https://github.com/Chialiang86)
2021 春季班 個人評量
=======================
作業及筆記
------------------------
- HW1(A): [lab0](https://hackmd.io/@ChialiangKuo/linux2021-homework1)/[Github](https://github.com/Chialiang86/lab0-c)
- HW1(B): [quiz1](https://hackmd.io/A8GcmRydRHGneVFctgEkrw)
- HW2: [quiz2](https://hackmd.io/@ChialiangKuo/hw2)
- HW4: [quiz4](https://hackmd.io/@ChialiangKuo/linux2021q1-hw4)
- Final: [hash-table](https://hackmd.io/@ChialiangKuo/quiz6B-hash-table)/[Github](https://github.com/Chialiang86/Hash-Table-C)
所見所聞心得
------------------------
- 動機
這是我第一次修 jserv 老師的課,雖然自身興趣所以大學裡接觸到的課程大多是機器學習、多媒體等相關課程,也較少接觸 C 語言、作業系統相關的研究(除了必修課)。但我發現身為一個資訊人,修了一堆基本的資訊工程必修課(演算法、計算機組織、作業系統等),最後卻只是將這些知識放在一邊去學機器學習怎麼調參數、模仿別人刻模型,而且也沒真正接觸這些領域底層的實現或是了解理論基礎(畢竟能夠真正了解並對這個領域有所貢獻的大多要讀到碩博以上比較有機會,大學部的課程基本上都是以使用別人的工具來體驗而已),即便有所成果也只是知道一些皮毛。因此回歸本質,想趁最後一個學期對資工系這三年做一個回顧,加入 Linux 核心課程跳脫舒適圈,從 C 語言開始搭配較陌生的 Linux 核心切入,複習作業系統、計算機組織、資料結構等領域,若有機會還能大大增進 Code Review 以及 C 語言的能力。
- 所見所聞
這堂課不斷在強調「誠實面對自己」,說實話經過這堂課我才發現自己各方面是多麼的不足,基本的 Coding 能力、對 C 語言或是作業系統的了解根本是連皮毛都不到。從第一週開始,就高強度地讓我們看大量的文獻,並藉由每週的小考強迫我們思考各個主題,並且還要消化大量的資訊再去學習如何撰寫有質量的技術文章,培養工程師的表達能力以及獨立解決問題的能力等,甚至要實做提出每個問題更好的方案、並且還要做大量的實驗有憑有據的證明自己的論述。而這學期接觸的領域很大一部份是並行與多執行緒、同步問題以及記憶體管理等。
說實話上了課發現我自己對這些領域的觀念還停留在相當基礎的階段、甚至連恐龍本的理論都不能說有看懂,因此大多數的時候我是非常迷惘的,即便跟著 jserv 老師的每次作業的步調、嘗試花很多時間看[並行與多執行緒](https://hackmd.io/@sysprog/concurrency/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FS1AMIFt0D)的影片,以及 C 語言的教材等都沒有真正理解課堂教的內容。印象最為深刻的是作業四的 thread pool 實做,寫作業時我發現好像終於理解程式碼了、平行機制、呼叫流程還有記憶體控管等,也了解了一些 pthread 的 API ,但直到要我提出更好的作法時我卻愣住了,哪邊需要改進、哪邊其實沒做好我竟然說部太出來,連改一行程式碼都有點勉強(當然最基本將讀取 list 尾端的元素實做到 O(1) 這種顯而易見的還是可以啦),顯然我對問題仍然陌生,為了求速度反而沒有認真理解每一個細節。而類似的狀況一直持續到接近學期末,我才真正了解到自己其實一直在用不對的方法去面對這堂課。
上了課發現我自己對這些領域的觀念還停留在相當基礎的階段、甚至連恐龍本的理論都不能說有看懂,因此大多數的時候我是非常迷惘的,即便跟著 jserv 老師的每次作業的步調、嘗試花很多時間看[並行與多執行緒](https://hackmd.io/@sysprog/concurrency/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FS1AMIFt0D)的影片,以及 C 語言的教材等都沒有真正理解課堂教的內容。印象最為深刻的是[作業四](https://hackmd.io/@sysprog/linux2021-homework4)的 thread pool 實做,寫作業時我發現好像終於理解程式碼了、平行機制、呼叫流程還有記憶體控管等,也了解了一些 pthread 的 API ,但直到要我提出更好的作法時我卻愣住了,哪邊需要改進、哪邊其實沒做好我竟然說不太出來,連改一行程式碼都有點勉強(當然最基本將讀取 list 尾端的元素實做到 O(1) 這種顯而易見的還是可以啦),顯然我對問題仍然陌生,為了求速度反而沒有認真理解每一個細節。而類似的狀況一直持續到接近學期末,我才了解到自己其實一直在用不對的方法去面對這堂課。
當作到期末專題時我才領悟到自己還在用「趕作業」的壞習慣在參與這堂課,「作業 deadline 已經要結束了那我就換寫下個作業吧」,結果就是每個作業都花太少時間,但又貪心的想把每個作業都寫一寫,最後就是什麼都一知「無」解。而期末專題被老師分配到 [hash table](https://hackmd.io/HnFMYOuXRJqquFRu8PrN5Q) 這個題目時,我放掉了 deadline 壓力,只求讓自己真的有學到東西。除了放慢步調整理其他學員的實做、嘗試融合他們的論點並整理出自己的結論。並且隨後光是針對一個 hash function 的實做我就閱讀許多文獻、探討數學原理,也花大量的篇幅做了四個實驗從不同面向去檢驗別人提到的效能、hash function 的差異以及去探討 scalability 等等。也嘗試閱讀 Linux 核心程式碼剖析 hlist, list 實做上的差別、還有 Macro 背後的意義,從中看到了許多其實課堂上一直有出現的內容,如 ``(int)(sizeof(struct { int:(-!!(e)); })`` 這行程式碼設計的考量以及它如何製造 compilation error 、「指標的指標」的應用等等......。除此之外還從 linux hashtable.h 原始碼看到了課堂上頻繁出現的 RCU 同步機制,很多看似不太相關的內容漸漸被整合起來,感覺繼續照的這個節奏就能慢慢了解課程的其他內容。雖然在送出成績前我似乎還沒辦法完成對於這個專題的探討,但從中我發現自己有更進步了一些,而且還想要在之後繼續從這個專題切入,想要主動了解 Linux 核心的程式碼。
到期末專題時我才領悟到自己還在用「趕作業」的壞習慣在參與這堂課,「作業 deadline 已經要結束了那我就換寫下個作業吧」,結果就是每個作業都花太少時間,但又貪心的想把每個作業都寫一寫,最後就是什麼都一知「無」解。而期末專題被老師分配到 [hash table](https://hackmd.io/HnFMYOuXRJqquFRu8PrN5Q) 這個題目時,我放掉了 deadline 壓力,只求讓自己真的有學到東西。除了放慢步調整理其他學員的實做、嘗試融合他們的論點並整理出自己的結論。並且隨後光是針對一個 hash function 的實做我就閱讀許多文獻、探討數學原理,也花大量的篇幅做了四個實驗從不同面向去檢驗別人提到的效能、hash function 的差異以及去探討 scalability 等等。也嘗試閱讀 Linux 核心程式碼剖析 hlist, list 實做上的差別、還有 Macro 背後的意義,從中看到了許多其實課堂上一直有出現的內容,如 ``(int)(sizeof(struct { int:(-!!(e)); })`` 這行程式碼設計的考量以及它如何製造 compilation error 、「指標的指標」的應用等等......。除此之外還從 linux hashtable.h 原始碼看到了課堂上頻繁出現的 RCU 同步機制,很多看似不太相關的內容漸漸被整合起來,感覺繼續照的這個節奏就能慢慢了解課程的其他內容。雖然在送出成績前我似乎還沒辦法完成對於這個專題的探討,但從中我發現自己有更進步了一些,而且還想要在之後繼續從這個專題切入,主動了解 Linux 核心的文化以及設計精髓。「Linux 是整個資訊科技的縮影」,相信慢慢學習這個領域對於未來發展有相當程度的幫助。
對 Linux 核心設計這堂課做一個有點奇怪但我認為又蠻貼切的比喻:老師就像把大家帶到一個陌生的超大森林,老師帶著大家走到森林各處看看每棵樹,並請大家去嘗試看透整片森林。顯然一味的亂走亂看只會迷失方向,不如好好的待在森林的一處,靠自己找一棵樹,很仔細的觀察、甚至爬到樹上去看,久了會發現周圍的景色好像漸漸看的越來越清楚,並且下一步也可以知道要往哪邊去繼續認識這片森林了。好好的投入一個題目,從中完整的理解問題、解決問題或是改善問題,再延伸出來去了解其他內容我覺得是在這堂課比較適合的參與方式。
最後對 Linux 核心設計這堂課做一個有點奇怪但我認為又蠻貼切的比喻:老師就像把大家帶到一個陌生的超大森林,老師帶著大家走到森林各處看看每棵樹,並請大家去嘗試看透整片森林。顯然一味的亂走亂看只會迷失方向,不如好好的待在森林的一處,靠自己找一棵樹,很仔細的觀察、甚至爬到樹上去看,久了會發現周圍的景色好像漸漸看的越來越清楚,並且下一步也可以知道要往哪邊去繼續認識這片森林了。好好的投入一個題目(視能力增加要投入的問題),從中完整的理解問題、解決問題或是改善問題,再延伸出來去了解其他內容我覺得是在這堂課比較適合的參與方式。
自我評量分數 (1 到 10 級分)
---------------------------
8 級分。以跟自己比的角度來說,即便這堂課還有太多東西需要再好好學,學到的技能跟觀念也還不夠,但自己從看文獻、嘗試學習不懂的東西上面已經培養出了一套自己的學習習慣,並且對於專業的嚴謹度也提昇許多。從撰寫文章、做實驗去驗證知識的正確性,以及檢視自己對於每個細節的認知程度等等,都大幅提昇了自己的專業素養,更重要的是我並沒有半途而廢,即便中間遇到挫折也還是堅持到了最後,因此也給自己打一個不錯的成績來鼓勵自己。 2 級分是我認為自己對於學習太過急切、常常為了快速進步而忽略了要對知識有更全面的掌握,即便有看不完文獻,保持自己的步調慢慢的理解勝過於用填鴨式教育的方式來精進自己,以此作為警惕。