作者LoganChien (简子翔)
看板b99902xxx
标题[闲聊] Roadmap of CSIE 资讯工程之路
时间Sat Oct 9 04:00:05 2010
我本来答应林轩田老师在前瞻营上以我自己的观点向各位介绍资讯
系的课程。不过後来因为时间不够就取消了。不过我觉得直接取消
蛮可惜的,所以我把我的讲稿写下来,让大家参考看看。
另外,前瞻营的讲义与投影片可以从以下网址下载:
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
1F:推 rod24574575:我END了 ._./ (话说都4点了还不睡... 10/09 04:25
2F:推 math120908:推荐这篇文章!! 10/09 08:49
3F:推 MrGreat:都看完了怎能不推!!! 10/09 09:01
4F:推 OppOops:大推! 10/09 09:15
5F:推 mars90226:看完了推~ 10/09 10:36
6F:推 ryan8175ptt:不推太对不起自己了! 10/09 10:57
7F:推 k7t7v7:推+1,总算对以後要学啥有初步的认识= =" 10/09 11:24
8F:推 lilian0111:大大推~ 10/09 11:34
9F:推 garychou:太棒了不推可惜!! 10/09 12:55
10F:推 mike012610:看完了大推!! 10/09 13:23
11F:推 bztfir: 10/09 13:38
12F:推 flyingmars:推~ 10/09 14:12
13F:推 pf5179:後面几点有点看不懂但是还是要推XD! 10/09 14:28
14F:推 ej0cl6:推~ 10/09 14:37
15F:推 jimmy9988:推! 10/09 15:10
16F:推 monkey020626:推~ 10/09 15:49
※ 编辑: LoganChien 来自: 140.112.247.159 (10/09 17:17)
17F:推 wctaiwan:...... XD .......... .. 10/09 17:57
18F:→ wctaiwan:Sorry, I guess PuTTY is not ideal for PTT replying. 10/09 17:58
19F:推 jenny2921:推~借转>\\\< 10/09 18:00
20F:推 otakulu:好文推~~ 10/09 19:10
21F:推 bill8124:受益良多 10/09 21:04
22F:推 dd14702006:推~ 10/09 21:04
23F:推 Rex1009:大推 10/09 21:50
24F:推 ashs99li:推~ 10/09 22:36
25F:推 xflash96:堆 10/10 09:58
26F:推 Laisky:推! 10/14 09:15