3. 四大工科大二學生
背景介紹
大二學生,之前修 python 的課以後就對寫程式很有興趣,那堂課高分過關。
之後打算修一些資工、電機系的課。
疑問
資工系的課在修什麼
我依據我自己的經驗以及修過的課,給了他一些方向
計算機組織與組合語言(台大資工)
計算機組織就是更深一點的計算機概論,把之前講到的那些東西都講得更深更難,例如說 cache 就是跟你講有什麼L1, L2 然後是怎樣做到的,採取的方法是怎樣,或是跟作業系統、編譯器也有講到一點,因為課程名稱有組合語言,所以作業很多都是寫組語,用 online judge 的方式,就是把程式碼在網站上submit,系統就會跟你說對或是錯、用了多少時間,還可以看排名,十分有趣。計算機組織與結構(台大資管)
其實課程內容跟資工的那門課很像,但這門課比較多是在講一些理論的東西,實作部分比較少,也是有組合語言的作業,但只有一兩次而已,其他都是在講計算機組織的東西。演算法與資料結構
這部分我自己沒修過,但因為高中的時候比過程式競賽所以略懂略懂,我只跟他說修這門課你人生應該會很精彩。
機器學習
這部分其實我也不是很懂,我只大概講了一個「推薦系統」的 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都練熟,就差不多了。