感覺蠻多人不知道什麼是資工的,或是資工在做什麼的,我在這邊簡單說一下好了。 讓想進去,或是對著裡面有幻想的孩子們有認知,對選科系或許會有幫助。

曾經有個笑話是電腦壞掉了,然後讀資工的小明不會修電腦,被人家嘲諷說:不是讀資工的?

從上面或許可以看出普羅大眾對於資工的認知或許是修電腦?其實這完全是錯誤的。

資工從一開始就會進行程式訓練,通常會是C或C++。 進階一點會開始建立物件導向的觀念,這時候通常會教C++或JAVA。

並且會訓練邏輯,所以會有離散數學等課。 然後,為了未來的實用會加入一些大一大二乍看之下沒用的線性代數跟機率之類的課程。

有了基礎程式觀念之後,會開始講解作業系統,我們寫出來的程式,是如何被執行的,OS怎樣保護硬體,如何分配資源可以更有效率。

並且會輔以計算機組織來更加了解細節,計算機組織會有電腦基本概念,比方說電腦如何表示正負號,浮點數的IEEE754是怎樣,並且講解一個程式,如何轉換成電腦看得懂的機器語言,並且CPU如何運用 pipeline 快速的去執行他,最後講解如何運用快取來讓電腦以為有一個超大又超快的記憶體空間使用。

有了OS跟計算機組織的觀念,可以幫助程式寫得更好,比方說知道有 new 就要有 delete,運用快取的特性去讀陣列,可以更快,並透過減少I/O或是用 buffer 來做I/O等提升效率,理解為什麼浮點數會有精確度問題等。

程式每個人都可以學,但我相信這些學的比較好的人,寫出來的程式會相對比較有效率。

在學習系統層面的同時,也會更精進程式能力,這邊就會加上資料結構跟演算法,裡面會提出問題,並且討論如何用演算法(程式)解決。比方說問題可能是如何讓電腦計算最短距離,然後說明這問題的必要性,以例子來說,求最短距離在近乎所有RPG都有在用到,甚至 Google Map 我猜測也有用到其的變形,最後加上解決方法,如 Dijkstra, Bellman 等。

這些都學完基本上我個人覺得就可以是一個合格的資工畢業生。 但有些人會想更進一步想看看更厲害的東西,比方說臉部偵測,如何寫一個程式讓電腦偵測人臉在哪,這在現在相機都有的功能,背後可能是 Adaboost 等想法,這時候看起來很像沒用的線性代數跟機率就會帶進來,透過數學分析,找出一個好的模型來表示這個問題並解決,再加上之前會的演算法跟資料結構時做出這個程式,並且此程式合乎作業系統的設計等,可以有效率的執行,最後就能得到我們相機上看到的成果。

這樣或許對資工有一個比較概括的了解?

有問題歡迎提出。 :D