Computer

Computer

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

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

Program

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

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

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

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

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

想要淺嘗一下程式語言是什麼,可以從HOUR of CODE開始。順帶一提台灣也有相關活動一小時玩程式

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

想要通盤概觀程式設計,可以參考Princeton cos333Harvard cs50課程。

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

程式語言的粗糙分類

根據程式語言的用途,可以分為以下這幾大類:

組合語言:控制中央處理器,例如x86。

程式語言:控制電腦運作,例如C、C++、Java、Python。

腳本語言:控制軟體運作,例如Unix shell、JavaScript。

資料語言:描述與操作資料,例如HTML、SQL、VHDL。

專業工具語言:例如繪圖計算GLSL、數學計算MATLAB。

新型態的語言:擁有龐大資料庫、函式庫,例如Mathmetica。

程式設計的粗糙分類

根據程式設計的用途,可以分為以下這幾大類:

embedded system programming:將電腦零件安裝在機械設備、電子設備裡面,然後寫程式控制設備。例如洗衣機、電子錶、捷運火車飛機、醫療器材、工廠設備。嵌入式系統是規模浩大的產業,中央處理器有98%安裝在各式設備,只有2%用於桌機。但是台灣幾乎沒人做這門生意,只專注在桌機與手機。

system programming:充分運用電腦零件、執行特定任務。例如作業系統、程式語言編譯器、驅動程式、檔案傳輸、即時通訊、瀏覽器、遊戲引擎、防毒軟體。台灣工程師的擅長項目。

application programming:手機與桌機的應用程式(軟體)。例如文書編輯器、繪圖軟體、遊戲軟體。應用程式也是規模浩大的產業,但是台灣幾乎沒人做這門生意,只專注手機APP。

需要的技能:一、各個作業系統廠商,發明了專屬的程式語言,用來撰寫自家作業系統的應用程式。例如蘋果的Objective-C。微軟的C#。二、藉由作業系統的API,操控作業系統。例如COCOA、WinAPI、Android SDK。也有廠商進一步將API包裝成工具、建立體系(框架),例如微軟的.NET。

web programming:編輯網頁、製作網站。工具時時刻刻都在改變,易學難精。職稱三不五時就會改變,炒作話題。由於學習資源十分普及、免費工具俯拾即是,因而憑空蹦出許多網路名人。

在用戶的電腦執行(前端)
HTML:語言。網頁的資料內容。
CSS:語言。網頁的排版樣式。
JavaScript:語言。控制瀏覽器的行為。通常用於控制網頁內容。
Bootstrap:人家寫好的程式碼,可以快速建構上述東西,特別針對手機的版面。
jQuery:人家寫好的JavaScript函式庫。
Angular、React:人家寫好的JavaScript工具。

在伺服器執行(後端)
PHP、JSP、ASP:語言。生成HTML。
Django、Ruby on Rail:語言與函式庫。生成HTML、管理檔案、存取資料庫。
SQL:語言。從資料庫存取資料。
  知名軟體Oracle SQL、Microsoft SQL Server、MySQL。
Web Server:軟體。讓大家可以連線到伺服器,存取網頁。
      知名軟體Microsoft IIS、Apache HTTP Server、Tomcat。

system integration:同時涉及多種程式設計類型。例如購物網站、影音平台、行政資訊系統、悠遊卡系統、停車場管理系統。台灣有許多專業公司,自產自銷、提供個性化服務。

knowledge-based programming:新世代程式設計,目前尚未流行。運用龐大資料庫與函式庫,編寫程式處理觸目所及的資訊。

Database

Database

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

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

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

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

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

Search Engine

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

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

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

Network

Network

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

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

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

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

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

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

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

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

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

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

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和Raspberry Pi,坊間已有書籍和課程。單片機,例如MCS-51(8051)、PIC,是高職電子科的課程內容。微處理器,例如ARM架構,民間人士比起學者還出名。

電子產業鏈

我也不明白。下面是草稿。也許可以參考這個網站

矽/半導體
http://zhe09.pixnet.net/blog/post/51558978

IC (在上面畫電路,這領域叫做EDA,軟體叫CAD)
http://www.yzuda.org/Useful_Links/recruit/2011/
http://icdc.ee.ccu.edu.tw/2015/index2.php?page=OldExams
http://www.csie.ntu.edu.tw/~hungsh/CA/IC_design_industry.ppt

SoC (很多不同功能IC設計在一起,製程一樣)
http://people.cs.nctu.edu.tw/~tfchen/TW-SoC.pdf

SiP (很多不同功能IC拼在一起)
http://technews.tw/2015/11/29/apple-sip/

PCB (很多上面的東西一起釘在這板子上)
http://programmermagazine.github.io/y201410/htm/video1.html
http://wwwsixman.blogspot.tw/2012/08/iicpcb.html
http://www.researchmfg.com/2015/10/pcb-production-process/

CPU (微處理器,一種IC)
https://www.youtube.com/watch?v=qm67wbB5GmI
https://www.youtube.com/watch?v=wOuYLq6vfLE

ARM (微處理器規格書,32位元RISC處理器市占90%)
http://www.esdesigner.com.tw/esd/article/arm-1.pdf

ARM處理器出貨量,占有95%的智慧型手機、90%的硬碟機、40%的數位電視和機上盒、15%
的微控制器、和20%的移動電腦

樹梅派用的還是很舊的ARM架構

嵌入式系統
http://www.barrgroup.com/Embedded-Systems/Books
http://shop.oreilly.com/product/0636920017776.do

ARM
http://www.davespace.co.uk/arm/introduction-to-arm/books.html

WinCE和Linux BSP  (驅動程式)
https://lwn.net/Kernel/LDD3/
http://elinux.org/images/a/a3/Elce2013-petazzoni-devicetree-for-dummies.pdf

programmable SoC
1. MTK設計晶片

  (1) 以verilog語言,去設計電路圖。
  (2) 繞線。

2. MTK用一堆晶片兜出SoC,最後叫別人做。

  (1) 台積電做出矽圓,然後把晶片重複地印在矽圓上。
  (2) 測封廠把矽圓切成晶片,然後包裝成晶片。
 (3) 某個廠把晶片堆疊起來,弄成一個SoC/SiP。
  (4) PCB廠把晶片/SoC黏上去,弄成開發板,
      並且設計compiler和linker,讓人家可以用C語言開發。

3. 該SoC甚至可以做成ARM/x86架構,符合計算機架構,並且在上面安裝作業系統。
   (Broadcom 生產的 http://www.farnell.com/datasheets/1521578.pdf)

3-1. 某公司去買開發板回來,上面附帶

  (1) 各腳位功能規格書,告訴你餵什麼訊號會得什麼結果。
  (2) 組合語言/C語言的組譯器。
     (a) 用C語言的pointer去得到腳位,用assign operator去餵訊號。
     (b) 用組合語言的指令去執行一些比較厲害的功能。
         (通常已有現成的C的範例程式碼,包成function,直接呼叫就行。)
     (c) 寫好中斷表,讓硬體reset就執行自訂程式。
   (d) 組譯之後燒在開發板上的ROM裡面,硬體插電後,電壓正確就會執行程式。
  (3) 偶爾要用示波器去量腳位,看看波形是否符合規格書。判斷硬體是否為瑕疵品。

 可以做出

  (1) 簡單的控制程式:例如LED燈亮起來。
  (2) 甚至寫成RTOS即時作業系統(考慮元件反應時間、中斷)。
      不過這跟個人電腦的「作業系統」完全沒關係,只是名字很像而已。

3-2. 某公司去買比較厲害的開發板回來

  (1) 可以裝在計算機上(通常是USB),並且提供BSP,讓Linux和WinCE可以寫driver。
  (2) 寫driver,符合某種心照不宣的規格,讓寫應用程式/寫函式庫的人可以呼叫。
      通常要自己控制記憶體、記錄硬體資料等等。

3-3. 某公司去買超級厲害的開發板回來 (例如Arduino)

  (1) 裡面有作業系統,並且提供IDE,可以直接用電腦寫程式。

User Interface

User Interface

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

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

Human-Computer Interaction

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

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

http://mmdays.com/2013/10/23/
http://code.arc.cmu.edu/
http://designhash.com/best-mobile-ui-design-patterns-sites/
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/SVN/testing/code review/PMP等等。族繁不及備載。

想要開發軟體,一種方式是活用這些東西,另一種方式是開發這些東西。前者較容易,坊間書籍不可勝數,網路資源唾手可得,學習難度非常低。後者較困難,必須深入理解計算機科學。台灣的現實情況是:幾乎所有軟體工作都屬於前者,門外漢稍作訓練就趕鴨子上架,學徒都靠自己摸索,講師通常也是學徒。台灣人把工具叫做技術,把使用工具的人通通叫做工程師,一群工程師常常相邀參加技術研討大會互相取暖,最後依然培養不出專家。

這種情況就好比造車和改車。造車門檻高,門外漢碰不得;改車門檻低,一堆人愛玩。一群人改了車之後就相邀出來見面討論技術,最後還是沒有一個懂車的人。

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

台灣的硬體業方興未艾,台灣的軟體業則是完全相反,爛泥扶不上牆。主要是因為軟體業有一些特別的地方:

一、開發軟體只仰賴人力(腦力),不仰賴其他資源。即便投入各種資源,諸如金錢、時間、設備、能源等等,仍舊無法控制生產成果。唯一成功的方法,就是廣納奇才。而台灣顯然沒有那麼多奇才。

二、複製軟體不需要成本,發行軟體不需要太多成本。即便掌握各種資源,仍舊無法控制市場走向。軟體品質決定一切。

三、開發軟體只仰賴人力(腦力),更精確來說是數學──畢竟計算機是計算數學的機器。想要掌控軟體研發進度,源自自身對於數學的敏感程度。而台灣顯然沒有那麼多數學又棒、膽識又大、喜歡做軟體的人。

大家退而求其次,抱樸守拙,鑽研有規格書的、可以按表操課的東西,如程式語言、作業系統、函式庫。於是台灣軟體業就變成現在這樣,ERP、資訊服務APP,剩下的惦惦吃三碗公,沒了。

最後大家只好開始提倡開源軟體。

Game

遊戲。經典主題諸如遊戲控制器遊戲物理遊戲人工智慧遊戲引擎。知名函式庫如DirectX、SFML、SDL。知名遊戲引擎如UnityUnreal。知名商業平台如Steam。

http://bbs.gamer.com.tw/#MITpcgame:a:6293
http://home.gamer.com.tw/creationDetail.php?sn=2249441
http://chenglap-blog.logdown.com/posts/161716
http://blog.monkeypotion.net/gamedev/career/why-you-shall-not-enter-game-industry-2011
http://www.u-acg.com/archives/3922
http://simonsays-tw.com/web/lodeRunner/lodeRunner.html
http://phoenotopia.com/
大師談Java遊戲設計
大師談遊戲設計: 核心技術與演算法

Automation

Automation

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

Robotics

機器人學。跨領域學科,結合了許多領域,例如電機、資工、材料、生物等等。困難到了極點、進展十分緩慢的一門學問。

跟計算機科學有關的主題,例如SLAMInverse KinematicsMotion Planning

台灣的現況是,就連前面章節所列的主題都搞不定了。大家不如直接看鋼彈動畫、玩洛克人過過乾癮吧。

http://www.vccoo.com/a/9prkz
http://cirs.udg.edu/
http://robotik.dfki-bremen.de/en/media/video-archive/

Arm

Wheel

Drone

Modular Robotics

http://biorob.epfl.ch/roombots

Biorobotics

Humanoid Robotics

Extroskeleton