3. 四大工科大二學生

背景介紹

大二學生,之前修 python 的課以後就對寫程式很有興趣,那堂課高分過關。
之後打算修一些資工、電機系的課。

疑問

資工系的課在修什麼

我依據我自己的經驗以及修過的課,給了他一些方向

  1. 計算機組織與組合語言(台大資工)
    計算機組織就是更深一點的計算機概論,把之前講到的那些東西都講得更深更難,例如說 cache 就是跟你講有什麼L1, L2 然後是怎樣做到的,採取的方法是怎樣,或是跟作業系統、編譯器也有講到一點,因為課程名稱有組合語言,所以作業很多都是寫組語,用 online judge 的方式,就是把程式碼在網站上submit,系統就會跟你說對或是錯、用了多少時間,還可以看排名,十分有趣。

  2. 計算機組織與結構(台大資管)
    其實課程內容跟資工的那門課很像,但這門課比較多是在講一些理論的東西,實作部分比較少,也是有組合語言的作業,但只有一兩次而已,其他都是在講計算機組織的東西。

  3. 演算法與資料結構
    這部分我自己沒修過,但因為高中的時候比過程式競賽所以略懂略懂,我只跟他說修這門課你人生應該會很精彩。

機器學習

這部分其實我也不是很懂,我只大概講了一個「推薦系統」的 case,例如說在資料庫裡面你發現大部份人買A的時候也會買B,你就可以推測說買A的人應該也會喜歡B,因此推薦B給買A的人。

不過這背後有更多更多的數學模型跟統計相關知識需要學習,我完全不懂所以也無法多講。

組合語言

與起講解什麼是組合語言,不如直接拿組合語言的程式碼給他看,於是我就讓他看一段我以前寫的組合語言的code,稍微解釋一下mov, cmp, jeq這些指令所代表的意義,還是很簡單地講述暫存器的概念,就把它當成是記憶體的一塊位置就好。

這邊也有稍微提到逆向工程,把原本的執行檔反組譯成組合語言,再去trace code最後分析出一些資訊。例如說常見的破解版軟體、序號產生器之類的原理。

像是序號產生器就是反組譯驗證序號的那一塊程式碼,理解以後根據規則寫出可以符合規則的序號產生器。(這邊其實我也不是很熟,如果有講錯的話麻煩大家糾正)

指標 pointer

我提到在C裡面有一種東西叫做「指標」,通常初學者在這邊會死一半以上。

我們一般的變數所存的資訊是「值」,指標這種特別的變數,所存的資訊是「記憶體位置」。要理解這個概念就必須知道說你宣告一個變數,背後的行為是什麼。

int a = 50;
背後就是系統分配給a這個變數一個記憶體位置0x66(舉例用),並且在裡面放入50這個值。

在C裡面,用&取出一個變數的記憶體位置,所以你printf("%d", &a)會是0x66

接著指標登場了,我們用int *ptr,前面加個*表示說ptr是一個指標,接著ptr = &a,讓ptr「指向」a的記憶體位置,也就是0x66

然後我們讓*ptr = 30,指標前面加個*代表取值的意思,所以0x66這塊記憶體的值會等於30,最後printf("%d", a),就會出現30。

我還講了指標跟陣列的關係以及function pointer,這邊有興趣的可以自己去查詢。而且我也不是很會,所以無法講太多XD

推銷mac時間

他問我說:你覺得mac怎麼樣?
然後我就講一堆mac的好處,順便跟他說如果你不用mac,也要會基本的 linux,反正你遲早要碰到的。

稍微跟他介紹ubuntu作業系統。

遊戲 unity

他問我說想做遊戲的話呢?
我說現在幾乎都是用一套叫做unity的遊戲引擎在做,第一是因為跨平台,第二是因為他把許多「輪子」都做好了,你不必自己重複造輪子。

職涯規劃

他說他第一志願是鼎鼎大名的群暉,我跟他說那你把資工系必修的那些資料結構、演算法、計算機組織與結構、作業系統跟C都練熟,就差不多了。

相關資源

  1. C - Function Pointer
  2. Function Pointer:(指向函數的指標)
  3. 演算法筆記
  4. 語言技術:C 語言