[閒聊] Roadmap of CSIE 資訊工程之路

看板b99902xxx作者 (簡子翔)時間13年前 (2010/10/09 04:00), 編輯推噓25(2501)
留言26則, 25人參與, 最新討論串1/1
我本來答應林軒田老師在前瞻營上以我自己的觀點向各位介紹資訊 系的課程。不過後來因為時間不夠就取消了。不過我覺得直接取消 蠻可惜的,所以我把我的講稿寫下來,讓大家參考看看。 另外,前瞻營的講義與投影片可以從以下網址下載: http://council.csie.ntu.edu.tw/frontier/2010/ 前瞻營總召 簡子翔 敬上 聲明:以下文章只代表我的個人立場。 ----------------------------------------------------------------------------- Roadmap of CSIE 資訊工程之路 「這是一個最好的時代,也是最壞的時代; 這是一個智慧的時代,也是愚蠢的時代。」 —狄更斯《雙城記》 序言 首先當然是歡迎大家加入資訊系。不過不知道大家有沒有想過:總 有一天我們要從這裡畢業,十年之後大家會在哪裡呢? 作為一個資訊系的同學,大家日後的職業應該都會和「寫程式」 有關係。可是是寫什麼樣的程式呢?是寫簡單的手機遊戲,還是設 計網站;是接別人外包的專案,還是寫一些按鈕與控制項的集合體? 我覺得這類工作在學生時期當作工讀賺取生活費還可以,但真得不 適合當一輩子的工作。為什麼我要這樣說? 「要會寫程式並不難!」 經過數十年的發展,編寫程式的工具越來越齊全,也越來越好 用;與此同時,程式設計漸漸地從藝術走向工程,從晦澀難懂走 向平易近人。 數十年前要寫程式,程序員可能要和一行又一行的組合語言搏 鬥;而時至今日,大部分的功能都已經有現成的函式庫,甚至有 整合開發環境(IDE)可以使用,程序員只要會開啟專案、拖拉點 放、輸入一些文字就可以寫出一個很棒的程式。 再看看連鎖書店裡面有多少電腦書?想要學寫程式,這裡從 C、 C++、Java、C#、Ruby、Python 的書籍!想要做網站,這裡有 PHP、ASP .NET、JSP,除此之外還有 Javascript、HTML 應有儘 有!想要寫手機程式,不論你是 iPhone 陣營還是 Android 陣營, 我們都有詳細的入門手冊任君挑選。各位想想看,除了資訊系, 還有什麼系所的知識會這麼普及? 「你的競爭者眾多!」 因為寫程式不難,這意謂著:你的競爭者眾多!而且在這個戰 場上,程式寫得好未必有競爭力! 以手機遊戲為例,有些人的程式未必寫得比你好,不過因為他 有創意,所以他寫得遊戲就蔚為風潮,而你只能感嘆時不我予; 而網站設計或者外包專案,也不是寫得最好的人可以得標,而是 以最低價格完成指定規格的人才活得下來。 所以我想要說:寫程式本身是沒有什麼價值的! 也許有人看到這裡想要問:「我是不是走錯系所了?為什麼我 未來的工作被你說得黯淡無光?」 「重點不是你會不會寫程式,而是你的程式能做什麼」 你選擇資訊系仍是一個明智的選擇!資訊系的授課重點除了寫 程式以外,有很大的比重是要讓你有 Domain Knowledge。也許很 多人會做網站,但是只有少許幾個人寫得出 Google、Bing; 也許很多人會寫 Application,但是能寫出 Office、Photoshop 的人不多;也許很多人會寫 C/C++/Java,但是能寫出編譯器、虛 擬機器的人不多。 想要寫出一個搜尋引擎,你需要的不是「七天學會網站設計」, 而是 Information Retrieval、Data Mining、Machine Learning、 Database 的知識;想要寫出 Photoshop,你需要的不是「Photoshop 快速上手」而是 Digital Image Processing;想要寫出 Office、 Visual C++ 你需要的不是「快快樂樂學 C/C++」而是要有 Compiler 與自動機的相關知識。 這些知識就是我們不同於其他人的地方,也是我們的價值。所以 重點不是你會不會寫程式,而是你寫得程式能做什麼!願各位在這 四年可以努力學習,好好發掘自己的潛力。共勉之。 資訊系課程介紹 我自己在向別人介紹資訊系課程的時候,我習慣把資訊系的課程分 為以下幾類:基礎數理、程式設計、底層相關、資訊領域相關課程。 基礎數理 顧名思意基礎數理就是非堂基本的數學與物理、化學、生物等相關知識, 日後在學習進階課程的時候,基礎數理的知識就會是基本工具,一定要 熟用。分述如下: - 微積分甲(上/下):微積分主要是要介紹怎麼求導函數與反導函數。 還有求極值、求數列極限、求偏微分、瑕積分、重積分。我們在這 堂課要學習各式各樣的微分、積分技巧。微積分的相關知識,在日 後的「機率」會很常見。 - 普通物理、化學、生物:這門必修基本上可以把它當成像是通識的 課程(雖然是必修課)。例如:普通物理中會介紹古典力學、熱力 學、電子學、相對論等知識。其中,電子學相關的知識如電阻、電 容、柯西何夫定律等等,日後在「數位電子與數位電路」會用到。 而如果對生醫資訊有興趣,可能修習普通生物或普通化學可以讓你 有一些基本知識。 - 線性代數:線性代數的主題是線性變換,例如:怎麼求 A x = b 這 一類的問題。這樣說可能太過抽象,簡單地說,線性代數就是教我 們矩陣的操作。我們會先從矩陣的列運算談起,一路講到高斯喬登 消去法。之後再引入向量空間 (Vector Space) 的概念。然後介紹 正交、行列式、特徵值 (Eigenvalue) 等等。日後在數位影像處理、 機器人學等選修課程都會用到線性代數。 - 機率:機率是現代數學當中,非常迷人的部分。這堂課會從簡單的 機率計算開始,分別介紹 Random Experiment、Outcome、Sample Space、Event 等概念。接著介紹條件機率、期望值的計算、各式 各樣的分佈、相關係數、中央極限定理、信賴區間等等統計工具。 最後還會介紹機率的各種應用,包含資訊理論、資料探堪、搜尋、 人工智慧方面的應用。機率在資訊領域的應用極廣,在演算法有 隨機演算法,在人工智慧領域也有一個分支叫作統計人工智慧, 而在計算機網路的應用更是不計其數。 - 離散數學(選):在資訊領域很多數學運算都是整數,所以離散數學 對我們而言就非常重要。離散數學主要分成三個部分:組合數學、 圖論、代數。組合數學會教我們怎麼求遞迴函數的一般式,怎麼計 算排列數與組合數,怎麼計算數列總和。圖論則是教我們圖 (Graph) 的相關性質與演算法。而代數則是教我們群 (Group)、環 (Ring)、 體 (Field)、布爾代數 (Boolean Algebra) 等等抽象代數的相關知 識。這些知識未來在演算法、資料編碼等課程會非常實用。 程式設計 雖然我前面好像把程式設計能力講得很不重要,但事實上程式設計能力 是最重要的。雖然好的程式設計能力未必能讓你打敗競爭對手,可是不 會寫程式你就直接出局了。所以資訊系還是有很多課程要教大家怎麼寫 程式。 - 計算機程式設計:本課程要教大家寫程式,說得更準確一點是程序 導向程式設計。你在這一堂課要熟悉變數 (Variable)、表達式 (Expression)、述句 (Statment)、函式 (Function)。並且要知道 怎麼控制程式的流程 (Flow Control),弄清楚遞迴 (Recursion) 是怎麼一回事。學過本課程以後看到一個新的程式語言,都要能夠 觸類旁通、舉一反三。畢竟程式語言日新月異,過去流行的是 Fortran、現在流行的似乎是 C/C++/Java,而未來一定又會有更多 不同的程式語言。 - 資料結構與演算法:會寫程式之後,我們就要開始關心程式執行的 速度。本課程會介紹若干資料結構與演算法。例如:後進先出的堆 疊(Stack)、先進先出的佇列(Queue)、容易在中間插入節點的串列 (Link List)、二元樹與走訪、深度優先(DFS)與廣度優先(BFS)、 圖(Graph)。另外還有要怎麼排序、怎麼尋找數值、怎麼找中位數等 等。這門課和「演算法設計與分析」是高度相關的。 - 系統程式設計:隨著我們的程式越來越複雜,我們會覺得 C 語言 的標準函式庫不敷使用。我們會需要作業系統的幫忙、會需要使用 別人寫好的函式庫。例如:要建立一個子程序、進行跨程序的溝通 (IPC)、使用多執行緒(Multithreading)、操作檔案系統等等都需要 作業系統或者別人寫好的函式庫。系統程式設計就是要教我們怎麼 和別人的程式溝通。除此之外,上課時也會討論 Unix 底層的設計, 讓我們知道一些函式的設計考量與為什麼儘可能不要使用某些函式。 日後介紹作業系統的時候,許多「系統程式設計」相關的議題會再 被拿出來討論。而計算機網路也會用到系統程式設計的概念。 - 作業系統:作業系統的主要功能是管理並分配各式各樣的資源,例 如硬碟上的檔案、記憶體的空間、CPU 的執行時間等等。而本課程 就是要教我們怎麼有效率地管理這些資源,例如:有多個程式要使 用 CPU 要怎麼樣排班才會有最好的效能或者最短的反應時間;有 多個程式要獨佔一些資源,我們該怎麼做才不會產生死結。本課程 還會進一步介紹一些在系統程式設計提過的概念,過去在系統程式 設計我們會知其然,而在本課程要讓你知其所以然。本課程的相關 知識未來會應用於「高等作業系統」或者「即時作業系統」等課程。 - 物件導向方法論(選):現在一份套裝軟體往往需要數百 MB 的空間。 這種龐然大物絕對不是一個人在很短的時間就可以開發出來。要怎 麼開發與維護一個巨大的軟體專案呢?過去有不少人提出各式各樣 的作法,不過現在的主流是物件導向程式設計。物件導向程式設計 強調以「物件」為中心,分析與實作一個資訊系統。面對一個新的 專案,我們可以先用 UML 分析各種需求,然後抽出重要的性質, 把物件分門別類,整理成各式各樣的類別,並探討類別與類別之間 的關係。最後就是各個擊破,分別實作不同的類別。本課程會教授 物件導向程式設計的相關知識,未來如果你想要修習「軟體設計模 式」你就會用到本課程的相關知識。 - 軟體設計模式(選):要使自己的程式設計能力有所進步,一個方法 是多看別人寫得程式碼,而且要多看頂尖高手寫得程式碼,並把別 人的技巧內化成自己的程式設計能力。本課程會介紹 Design Patterns 一書當中 23 個經典的設計。另外,還會介紹 Refactor 的概念,讓現有的程式碼可以逐步改進,同時也不會破壞相容性。 想要學習怎麼寫出漂亮的架構,這門課一定不能錯過。 資訊領域相關課程 - 演算法設計與分析:選擇排序、快速排序二者在速度上熟優熟劣? 我們要比較兩個演算法應該要有一套合理的標準。在資訊科學當 中,要分析一個演算法通常會使用 Big-Oh 漸近表示法。我們在 乎的是當輸入量很大的時候,那一個演算法比較快、用去比較少 的額外空間。此外,本課程還會介紹許多演算法設計技巧,包含 Divide and Conquer、Dynamic Programming、Greedy 等等。妥 善使用這些技巧可以降低演算法的複雜度,並加快你的程式。最 後本課程會將各種演算法依照它們的複雜度分門別類,並探討演 算法複雜度的極限。這一部分在「自動機與形式語言」會進一步 討論。 - 自動機與形式語言:自動機與形式語言主要可以分成四個部分: Deterministic Finite Automata、Context-free Grammar、 Turing Machine、計算複雜度與計算的極限。前三個是簡化過的 計算模型,其複雜度是由簡單到複雜,運算能力也是由弱到強。 而在後半部分會由 Turing Machine 開始,探討各種問題的可計 算性(例如:停機問題),或者探討哪些問題是等價的,哪些問 題又是可以歸約的。本課程介紹的 DFA 與 CFG 在編譯器程式設 計當中會是非常重要的文字處理工具。而探討複雜度的部分會和 演算法分析的複雜度相呼應。日後研究所的「資訊工程理論基礎」 也是伸延自本課程。 - 計算機網路:本課程會介紹兩台電腦之間要怎麼相互溝通,例如 要怎麼把訊息切割、封裝成封包,封包要怎麼從一台電腦傳送到 另一個電腦(Routing)等等。接著在有穩定的連線之後,二台 電腦要怎麼溝通,例如我們常用的 HTTP 服務,它背後的運作原 理是什麼等等。 - 專題研究:經過三年到四年的學習,最後我們要找一個教授作特 定專題的研究。每一個人的興趣可能都有所不同,資訊系的教授 也分別有他們擅長的領域,例如:通訊網路、多媒體、演算法設 計、編譯器、嵌入式系統、資料探堪、機器學習、生醫資訊等等。 如果有特定偏好,可以找教授談一談,我想教授們應該都很歡迎。 如果還不確定的話,未來可以參加專題說明會,聽聽看所有教授 是怎麼介紹他們所專精的領域。 底層相關 資訊系還是要學一些和硬體相關的知識。其中一個理由是知道電腦底 層是怎麼運作的,你可以寫出更好、更快的程式,也可以知道電腦的 極限在哪裡。另一個理由是因為台灣的產業還是以硬體代工為主,系 上有不少畢業生畢業後是去 IC 設計公司(IC 設計公司也很需要資 訊人材做系統整合)。 - 數位電子與數位電路:本課程會從電流、電壓、電路談起。緊接 著就是半導體材料的特性 (P-type, N-type)、如何製作二極體、 PMOS、NMOS、CMOS。之後更進一步使用 CMOS 製作一個 inverter, 與各式各樣的邏輯電路。 - 數位系統與實驗:現在要設計一個晶片,多半會使用 VHDL 等硬 體描述語言,描述出晶片的主要功能。你可以用 VHDL 寫出算數 邏輯單元 (ALU)、用 VHDL 寫出 MP3 解碼器、影片的解碼器等等。 接著使用一些工具幫我們把「程式」轉換成「電路圖」,並且檢 查是否滿足一些物理限制。最後就可以把電路圖製作成晶片。本 課程就是要介紹怎麼設計數位系統。 - 計算機結構:本課程主要有三個主題:計算機組織 (Computer Organization)、組合語言 (Assembly)、計算機結構 (Computer Architecture)。透過這門課,我們可以更了解硬體是如何執行 我們的程式。讓我們知道什麼樣的程式碼跑起來比較快,什麼 樣的程式碼跑起來比較慢。在計算機組織當中,我們會使用一 些邏輯閘設計出一個簡單的 ALU,加上記憶體就是一台具體而 微的電腦。而組合語言會教我們怎麼用組合語言寫程式,並藉 此寫出更好的機器碼。而計算機結構是介紹「現代」CPU 的設 計。現代的 CPU 為了加快程式執行的速度,會使用 L2 Cache、 Pipeline 等技術。在知道 CPU 是什麼運作之後,我們在用組 合語言寫程式時就可以避免反優化。本課程所學到的東西可以 用於日後的「編譯器程式設計」與「高等編譯器程式設計」。 -- 你按下 END 了嗎?XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.144

10/09 04:25, , 1F
我END了 ._./ (話說都4點了還不睡...
10/09 04:25, 1F

10/09 08:49, , 2F
推薦這篇文章!!
10/09 08:49, 2F

10/09 09:01, , 3F
都看完了怎能不推!!!
10/09 09:01, 3F

10/09 09:15, , 4F
大推!
10/09 09:15, 4F

10/09 10:36, , 5F
看完了推~
10/09 10:36, 5F

10/09 10:57, , 6F
不推太對不起自己了!
10/09 10:57, 6F

10/09 11:24, , 7F
推+1,總算對以後要學啥有初步的認識= ="
10/09 11:24, 7F

10/09 11:34, , 8F
大大推~
10/09 11:34, 8F

10/09 12:55, , 9F
太棒了不推可惜!!
10/09 12:55, 9F

10/09 13:23, , 10F
看完了大推!!
10/09 13:23, 10F

10/09 13:38, , 11F
10/09 13:38, 11F

10/09 14:12, , 12F
推~
10/09 14:12, 12F

10/09 14:28, , 13F
後面幾點有點看不懂但是還是要推XD!
10/09 14:28, 13F

10/09 14:37, , 14F
推~
10/09 14:37, 14F

10/09 15:10, , 15F
推!
10/09 15:10, 15F

10/09 15:49, , 16F
推~
10/09 15:49, 16F
※ 編輯: LoganChien 來自: 140.112.247.159 (10/09 17:17)

10/09 17:57, , 17F
...... XD .......... ..
10/09 17:57, 17F

10/09 17:58, , 18F
Sorry, I guess PuTTY is not ideal for PTT replying.
10/09 17:58, 18F

10/09 18:00, , 19F
推~借轉>\\\<
10/09 18:00, 19F

10/09 19:10, , 20F
好文推~~
10/09 19:10, 20F

10/09 21:04, , 21F
受益良多
10/09 21:04, 21F

10/09 21:04, , 22F
推~
10/09 21:04, 22F

10/09 21:50, , 23F
大推
10/09 21:50, 23F

10/09 22:36, , 24F
推~
10/09 22:36, 24F

10/10 09:58, , 25F
10/10 09:58, 25F

10/14 09:15, , 26F
推!
10/14 09:15, 26F
文章代碼(AID): #1ChtXAn2 (b99902xxx)