Computer

Computer

計算機。台灣譯作電腦。一台可以實施數學運算的機器。

製作電腦屬於電子系、電機系的專長。台灣的電腦工業,產業結構相當成熟,產品行銷全球。你想的到的電腦零件、電腦成品,例如硬碟、光碟機、記憶體、主機板、螢幕、桌機、筆電、滑鼠等等,都有專門公司在研發。即便是電腦回收商,也堪稱一流。

Program

程式。控制電腦運作的指令。

操控電腦屬於資工系的專長。可以分為程式語言、程式設計。

程式語言。人工產物,有嚴謹的規格書,以便精準地控制電腦運作。常用的程式語言,坊間已經充斥大量書籍,網路上已經充斥大量互動式學習資源,學習難度極低,甚至可以無師自通。

程式設計。編寫程式,達成任務。程式語言的學習資料非常多,但是程式設計的學習資料非常少。有些書教你如何把程式寫漂亮,例如code complete;有些書教你如何規劃程式碼,例如head first ooad;但是目前沒有任何一本書是談論如何編寫程式解決問題。對於程式設計,現今世界上仍沒有一套明確的見解,也沒有一條明確的學習路徑。大家現在多半把程式設計當作是一種具有靈性的藝術創作,特別強調天資這回事。

程式設計最近獲得重視。美國業界以及政府正在倡導人人都要有程式思維,規劃學習進度、培育相關師資,進一步推動計算機科學教育。也有研究單位正在探索程式設計的本質,設計適合中小學生學習的程式語言,發掘程式設計如何影響孩童的思考與行為。

想要淺嘗一下程式語言是什麼,可以從HOUR of CODE開始。

想要學習經典的程式語言,例如C++,可以參考《C++ How to Program》等著作以及各種網路資源。

想要通盤概觀程式設計,可以參考Princeton cos333Harvard cs50MIT ./missing-semester課程。

想要了解程式語言的流行用途,例如手機APP、網頁設計,可以參考Udacity與Google合作的課程韓國的軟體開發網站

Compiler

Machine Code

機器碼。參照CPU的規格書,讓CPU執行特定工作的二元碼

從CPU底部的針腳們輸入機器碼,讓CPU執行特定工作。大致流程:一、查詢CPU規格書,查詢特定指令,查詢該指令所用的針腳是哪些,以及其電壓高低。二、根據規格書,調整CPU每根針腳的電壓高低。三、找到啟動指令的針腳,調高電壓(有如按下啟動開關),電流開始流動,CPU執行一個機器碼。四、一個指令有多個機器碼,重新在針腳們輸入機器碼,重新按下啟動開關。

針腳們的電壓視作0和1,電壓高代表1,電壓低代表0。針腳們依序編號,整體視作0和1組成的字串,也就是機器碼。

規律地按下啟動開關,持續地執行每個動作,就像時鐘秒針一樣滴答,就像脈搏一樣跳動,所以取名為「時脈clock」。CPU的工作速度,取決於時脈的速度。

電子學、數位邏輯、計算機組織與結構,這些課程有助於瞭解CPU的細節。

Assembly Language

組合語言。讓CPU工作的文字指令。

因為機器碼難讀難懂,所以人類發明了組合語言──使用文字來描述工作指令。再特地打造「組譯器Assembler」,將組合語言變成機器碼。儘管組合語言依然難讀難懂,但是總比機器碼好多了。

CPU廠商,除了提供CPU的規格書,還會提供一套組合語言暨組譯器,方便工程師編寫程式。除此之外,為了避免讓工程師每換一顆新CPU、就跟著換一套組合語言,CPU廠商們也一起約定了組合語言的大致格式,主要有兩套:RISCCISC

組合語言、微處理器、嵌入式系統,這些課程有助於瞭解組合語言的細節。

Programming Language

程式語言。讓CPU工作的文字指令,擁有特殊句法。

一般說到指令,很容易聯想到「立正、敬禮、稍息」。電腦世界裡面,讓CPU做事情的指令,差不多就是這麼單純。

不過這樣的指令實在太簡單,只能做簡單的工作。遇到複雜的工作,就必須堆疊大量指令,讓事情變得複雜、難以理解。經典範例是流亡台灣的匪軍刺槍術:「氣刀體一致。防右刺!刺!刺!防左刺!刺!刺!防下刺!刺!刺!上擊!衝擊!衝擊!砍劈!橫擊!衝擊!衝擊!砍劈!迴旋!迴旋!」

因為組合語言難讀難懂,所以人類又發明了程式語言──建立了段落、層級、單元等等概念,讓人類能夠宏觀大局,不必浪費力氣鑽細節。再特地打造「編譯器compiler」,將程式語言變成組合語言、再變成機器碼。儘管程式語言依然難讀難懂,但是總比組合語言好多了。

程式語言的理論仍在發展當中。我才疏學淺,無法介紹。大家可以自行上網搜尋課程書籍

Compiler

編譯器。將程式語言,變成組合語言,再變成機器碼。

深奧幽玄。如果你確信被什麼東西附身,那麼再來深入研究吧。

https://mitpress.mit.edu/sicp/
http://www.cppgm.org/
http://www.yinwang.org/blog-cn/2013/03/28/chez-scheme

另外必須提一下LLVM,這是最近幾年的新觀念,大家都在跟進。編譯器的流程中間多了一層:程式語言先變成LLVM,再變成組合語言,再變成機器碼。

LLVM降低了事情的複雜度,讓大家可以分開處理程式語言的特殊細節、基礎結構。程式語言變成LLVM時,解決掉各種不同程式語言的特殊細節。LLVM變成組合語言時,大家就可以直接根據語言結構,實施最佳化。

ICPC 2727

Interpreter

直譯器。即時版本的編譯器,一邊讀取指令,一邊執行指令。

程式語言採用編譯器和直譯器其中一種。C、Java採用編譯器,Python、JavaScript採用直譯器。

直譯器必須建立多餘的組合語言,以處理正在計算的變數。執行速度比較慢,但是除錯比較方便。

Database

Database

資料庫。簡單來說,就是硬碟,存放大量資料的東西。

資料庫可以分成硬體層面和軟體層面。硬體層面的經典主題,例如備份與還原鏡像與同步容錯等等。通常學校課程不會教到,相關技術已被商業壟斷。

軟體層面的經典主題,例如資料庫架構:資料的格式以及存取資料的模式,資料庫正規化:歸類資料的方式,資料庫查詢語言:查詢資料的指令。學校課程就會教到。

除了存儲資料以外,通常我們還想靈活運用資料,例如資訊檢索資料探勘資料視覺化,從資料庫當中挖掘訊息、產生報表,為己所用。最近媒體吹捧的口號大數據就是活用資料庫的意思。

資料庫是相當務實的學問。國民的戶政財政資料、線上文章音樂影片、打卡訂票、字典圖書等等,資料庫無所不在。稍具規模的公司行號,就需要資料庫儲存資料。理所當然地,當今世上規模最大的軟體公司,就是資料庫公司Oracle。資料庫是資工系必修學科,就連公務員考試也要考資料庫,重要程度可見一斑。

Search Engine

搜尋引擎。從資料庫當中尋找資料的工具,已經變成現代人不可或缺的工具。遇到不明白的事情,馬上用手機上網搜尋一下資料。

我們往往希望找到最精準、最重要、最完善的資料。因此搜尋引擎的排名結果,變成大家最關注的事情。搜尋引擎製作者致力於提供好的排名,好的排名使得大家更容易汲取知識。然而排名有時候也是一種變相的資訊鉗制。搜尋引擎公司可以藉由調整排名,控制你對世界的看法。

大家重視排名,進而發展出「搜尋引擎最佳化」的概念:如何調整自家網站的內容,以提高排名?提高排名有益於提高公司曝光度、增加生意。大公司甚至花錢請搜尋引擎公司幫忙提高排名。搜尋引擎公司為了在道德和利益之中取得平衡,轉而提供了廣告機制,在搜尋結果當中,把大公司的網站放在第一名的上面,皆大歡喜。

Network

Network

網路。簡單來說,就是多地之間的訊息傳送機制。

網路分為硬體層面和軟體層面。硬體層面屬於電子電機電信通訊科系的專長,台灣業界的技術相當傑出,新知多半不在學界、而在業界。經典主題如下:

一、通訊媒介:電流(網路線、電話線)、電波(無線網路、RFID)、光波(光纖)。

二、電路設計:協定、封包、編碼、串流、多工、分流。

三、網路佈署:衛星、基地台、AP、電纜。

軟體層面屬於資管資工科系的專長,已有豐富的教材,但是只有觀念、沒有實務,大家都是自己亂搞。經典主題如下:

一、網路管理。細分為網路環境(IP、DNS、區域網路、設備維護)、網路服務(帳戶權限、流量監控、資源整合)、網路安全(firewall/VPN/proxy)。順帶一提,台灣人把網路管理系統管理通通當作同一件事情,叫做資訊系統管理

二、網路程式設計。編寫程式控制訊息傳輸,諸如廣播路由。已有經典著作中文翻譯程式範例。知名函式庫如Asio。知名應用如即時通訊軟體、社群網站、影音網站、自動線上更新、即時轉播、P2P軟體。

三、網路攻防。鑽研網路與作業系統的運作細節,是「資訊安全」領域之中的重要環節。台灣現況是由台大交大、台科大在學學生主導,而台灣業界的技術似乎還停留在十五年前的水平:網路封包分析、弱點掃描(從檔案裡搜尋關鍵字)。

四、網路理論。研究網路結構的數學性質。例如link analysisqueueing theory。知名應用如社交網路分析學術搜尋

Distributed System

分散式系統。有了網路之後,資料不必齊聚一地,而是分散各處,再利用網路互通有無。

http://research.google.com/people/jeff/

分散式系統有一個極重要的特色是「分散式計算」:運用多台電腦,分工合作處理資料,又快又好。相關工具有Apache Spark、Apache Flink,是當前的研究熱點。

將來甚至可以實現:資料不必儲存在自己的電腦,而是儲存在別處的資料庫。以後的電腦和手機,只要具備輸入、輸出、連線、充電的功能就足夠了,至於儲存、計算的功能通通交給大型伺服器叢集。藉由分散式系統迅速取得資料,藉由分散式計算迅速得到計算結果。

Operating System

Operating System

作業系統。整合所有電腦功能,方便人類操控的系統。有名的作業系統如Microsoft Windows、Mac OS、Linux、Android。使用作業系統,應該不必介紹,熟能生巧。開發作業系統,有如工程建設,細節繁複。

想要學習如何使用作業系統,Microsoft Windows大家都是自己摸索、科普書籍、社會大學、電腦才藝班、胖卡;Linux可以參考鳥哥的Linux私房菜

想要學習如何開發作業系統,把Unix Programming、Linux Kernel摸個精通就差不多了。儘管這是資工系必修課程,但是台灣學校清一色只教觀念、不教實務,有教等於沒教。所幸坊間已有大量書籍與課程,可以自學。

UVa 10435 10966 142 ICPC 4392 7588 UVa 1682

Embedded System

嵌入式系統。把電腦安裝在電子設備裡面,用電腦控制電子設備。

台灣的電子產業不同凡響,產品行銷全球(先進國家不想碰的吃力不討好的高汙染工作,台灣撿來做)。受到電子產業庇蔭,嵌入式系統獲得發展契機。有了嵌入式系統的學問,就能用電腦控制電子設備;接著配合演算法的學問,就能完成各式各樣的神奇任務。

學習嵌入式系統,可從單板微控制器、單板機、微控制器(單晶片、单片机)、微處理器(中央處理器)下手。

單板微控制器。例如Arduino Uno。

單板機。例如Raspberry Pi。

微控制器。例如MCS-51(8051)、PIC、STM32,高職電子科的課程內容。

微處理器。例如公司ARM和Intel、指令集RISC與CISC、架構ARM與MIPS,大學電機系的課程內容。

User Interface

User Interface

使用者介面。電腦與人類溝通的介面。發展歷程是讀卡機、文字介面圖形介面實體介面

台灣完全沒有相關課程。即便是經典的文字介面、圖形介面,台灣也沒人談論設計原理。光是使用別人已經設計好的、完善俱全的函式庫,大多數人就已經油盡燈枯了。

Human-Computer Interaction

人機互動。研究人與機器如何互動,然後設計機器、設計互動模式。稍微脫離了計算機科學的範疇。

台灣最近才有相關課程。雖然資工系有名稱類似的實驗室,事實上卻把重心放在手機APP、觸控螢幕、電子書等等,你懂的。所幸台灣的電子界和設計界相當傑出,仍有人努力研究。

http://code.arc.cmu.edu/
http://www.designinterface.jp/en/projects/
✔7 Things you didn't know existed

Software

Software

軟體。達成特定任務的程式。電腦軟體,就是在個人電腦上面執行的軟體。手機APP,就是在手機上面執行的軟體。

軟體開發。需要學習程式設計,學習現成工具,學習經驗觀念。諸如軟體開發框架Struts/Spring/Hibernate,程式設計觀念coding convention/defensive programming/OOAD/refactoring,專案管理觀念UML/git/testing/code review/DevOps/PMP。族繁不及備載。

軟體工程。旨在研究如何開發軟體,但是很少人以科學方式進行研究,多半是經驗談,是個嘴砲成分很高的領域。現時流行的方法,往往是媒體炒作出來的,而不是受到嚴謹考驗後的適存者。反正出錯了也不會死人、也不會被告,只要發布更新就好,導致大家隨興亂搞一通。

Hardware

硬體。達成特定功能的機械。電腦就是一種硬體。

Firmware

韌體。寫死在硬體裡面的軟體,令硬體運作。

請參考嵌入式系統。

Automation

Automation

自動化技術。跨領域學科,結合了電機、資工。讓機械設備自強不息的學問。維持人類日常生活運作的重要學問。

Internet of Things

物聯網。所有東西通通裝上網路連線設備,可以隨時隨地收集資訊、隨時應變、隨時控制。目前還只是口號。