電腦科學詞彙表

以下係電腦科學（computer science）上常用嘅詞彙一覽。

電腦科學，又叫運算科學，係專門研究運算嘅一個科學工程領域。「電腦」廣義上指運算機械，即係曉用數據做運算，並且俾出一啲有用結果嘅機械，簡單例子：而家手上有一柞「每個學生喺呢次考試當中攞到嘅分數」嘅數據，要用呢柞數字計出邊個考第一。電腦科學就係集中思考曉做呢啲嘢嘅機械點樣表示同儲起數據、用各種嘅演算法嚟處理數據以及彼此之間傳送數據等嘅問題。

到咗廿一世紀，電腦科學經已係一個蓬勃嘅獨立科學領域，引起咗哲學、社科同科幻等領域嘅討論，而且仲有得按照所使用嘅技術或者想達到嘅目的分做多個唔同嘅子領域。電腦科學啲子領域好多時仲要專化到彼此之間溝通唔到－所以有大量嘅專業行話詞彙。
## 理論電腦科學
 
*運算（computation）：跟住有清楚定義嘅模型（演算法），對數據作出計算（唔一定係算術性質）嘅步驟；電腦本質上就係做運算嘅機械－廿一世紀數碼電腦內部會無時無刻都極快噉做大量嘅運算，由 input（用家撳咗咩掣同埋踎士喺邊個位呀噉）嚟計要出咩 output（熒光幕要顯示乜嘢圖像）。有關數碼電腦嘅運算嘅物理實現，可以睇吓電子工程方面嘅嘢。 
*資訊理論 
*形式化方法 

### 運算理論

運算理論（theory of computation）係研究運算本身嘅數學性質嘅一套理論。
*黑盒（black box）： 如果話一部機械係一部黑盒，就表示研究者知佢嘅 input 同 output，但完全唔知部機械係點樣由 input 計個 output 出嚟嘅；喺運算理論嘅分析上，研究者成日都會將唔係重點分析緊嘅部份當做黑盒噉嚟睇。
*圖靈論題（Turing thesis）：根據圖靈論題，一個施喺自然數身上嘅函數可以靠有效方法（指部運算機械會喺數量有效嘅時間之內計完）嚟計到答案 <code>if and only if</code> 個函數可以用圖靈機嚟計到答案；用日常用語講嘅話，意思即係指任何物理上有可能計到嘅問題都可以用圖靈機嚟計。 
*有效方法（effective method）：運算理論上嘅一個概念。如果話一個方法係「可以解決運算問題 A 嘅有效方法」，意思即係話用呢個方法解決問題 A 嗰陣： 
**部電腦會行完若干步之後停低。 
**部電腦實會出到正確嘅答案。 
**原則上，個步驟可以由一個手上揸住紙筆嘅人做完，而且個人淨係需要跟從個方法啲步驟。 
*圖靈機（Turing machine）：運算模型嘅一種，一部圖靈機嘅運作如下：一部圖靈機會讀取一條分做若干個格嘅帶，條帶每個格裏面都會有個符號（可以係 1 同 0 等多個款）；喺每一個時間點，部圖靈機個讀取器都會位於條帶其中一格，而部機會做以下三個基本作業當中是但一個： 
*#讀取讀取器下嗰格係乜符號； 
*#編輯嗰格－寫一個新嘅符號落去或者刪除咗嗰格佢； 
*#將條帶向左或者向右移一格，等個讀取器可以讀取打前嗰個格隔離嘅一個格。 
**圖靈機呢部抽象機械就噉睇好似好簡單，但查實可以計到好多嘢。 
:

*多項式時間（polynomial time）：如果話一段演算法係多項式時間，即係話段演算法「要行幾耐」有個上限，`T(n)=O(n<sup>k</sup>)`，當中 k 係某啲正嘅常數。
*難解問題（intractable problem）：指一條理論上可以解決，但實際上冇可能係夠短嘅時間內解嘅問題，即係例如一條運算問題理論上係解到嘅，但要解決條問題需要嗰個演算法極複雜，複雜到就算用最先進嘅超級電腦嚟行，都要行成 100 年先行得－喺實際應用上根本解決唔到。

### 電腦數據
 
*資料類型（data type）：係一件資料會具有嘅一個屬性，一件資料嘅類型會話俾個編譯器知，個程式打算點樣用呢件資料。常見（絕大多數程式語言都支援）嘅資料類型包括
**整數（integer），指件資料表示緊一個整數、
**浮點數（floating point number），指件資料表示緊一個可以係小數嘅實數、
**字符（character），指件資料表示緊一個文字等非數字嘅符號、
**布林（Boolean）指件資料表示緊一個真（1）假（0）值
**... 等等。舉個例說明，想像家陣部電腦收到一個訊號「00001」，如果呢個訊號標明咗係一個整數，噉部電腦就知呢段訊號代表緊「1」呢個數字，但如果個訊號標明咗係一個布林資料，噉呢段訊號所代表嘅係「真」。喺寫程式嗰陣，每個變數同常數都會有佢嘅資料類型，亦有程式語言係曉自動噉探測件資料嘅類型，例如 Python 。
**原始資料類型（primitive）：指最基本嗰拃資料類型，隻程式語言入面啲進階嘅資料類型都係用呢啲原始類型組合建構出嚟嘅，整數、浮點數同布林都係常見嘅原始資料類型。

*數據結構（data structure）：指一部電腦內部組織數據嘅方法。精確啲噉講嘅話，一款數據結構係描述數據嘅代數結構，會指明嗮以下嘅資訊：
**啲數據同埋佢哋嘅數值、
**唔同數據之間嘅關係、同埋
**屬呢種數據結構嘅數據可以攞啲咩算子計或者擺入啲乜嘢函數嗰度。
**陣列（array）：陣列係用嚟裝相關嘅數據嘅；一個陣列正路會有個整數 `n` 表示佢嘅大細（裝到幾多件數據）；一個陣列會包含最多 `n` 咁多件嘅數據，會有次序（每件數據掕若干個整數，表示佢喺個陣列邊個位），而且啲數據通常（但唔一定）冚唪唥都屬同一隻類型。以下係一個一維、11 件數據咁長嘅陣列：
*:
**鏈結串列（linked list）：都係攞嚟裝相關嘅數據嘅；一條鏈結串列會有若干件次序固定嘅數據，條鏈結串列當中每個位（`node`）都會有「件數據嘅數值係乜」、「件數據指住嘅下一件數據係邊件」同「件數據嘅前一件數據係邊件」（固定次序；下圖噉）嘅資訊，一位用家搜尋一條鏈結串列嗰陣一定要焗住跟條串列個次序（或者前後掉轉）噉嚟搜尋，冇得話例如（好似陣列噉）隨機噉揀是但一件數據嚟讀取，不過鏈結串列好處係可以容易噉由柞數據當中攞走其中一件而唔使重新排過嗮柞數據（一個陣列攞走咗其中一件再排過就要改嗮後面嗰啲數據嘅位置數值。
*:
**堆疊（stack）：柞數據係最後入嘅最先出（last in first out，LIFO）嘅，即係話柞數據有次序之分，排最尾嗰件數據會優先噉被提取，就好似一疊洗好咗嘅碟噉，最尾擺入疊碟嗰隻碟會最先俾人攞走；可以對堆疊做嘅運算最基本有 `push`（擺件數據落堆疊上面）同 `pop`（刪除堆疊最上面嗰件數據），可以睇下圖嘅圖解。堆疊喺回溯法（backtracking）上成日用－例如想像家陣有個人工智能程式喺度行迷宮，個程式要一路記住自己行過嘅位置，一去到掘頭路就返轉頭，即係話「過去嘅位置」會成一個堆疊，要返轉頭行每一步嗰陣就將最近嗰件數據（個堆疊最頂嗰件）攞走。睇埋遞歸。
*:
**隊列（queue）：柞數據係最先入嘅最先出（first in first out，FIFO）嘅，即係話嗰柞數據有次序之分，當中排最先嗰件數據會優先噉被提取，就好似一班人喺度排隊噉；可以對堆疊做嘅運算最基本有 `enqueue`（擺件數據落隊列最後）同 `dequeue`（刪除堆疊最先嗰件數據），可以睇下圖嘅圖解。喺實際應用上，隊列最常見嘅用途嚟攞嚟「排隊」－俾部電腦知有啲咩數據等緊要處理，並且將啲數據優先處理。
*:
**雜湊表（hash table）：一種用嚟整關聯陣列（associative array；抽象資料型別，用嚟將每件數據都掕個獨特嘅名俾佢）嘅數據結構；一幅雜湊表會用一個雜湊函數（hash function）嚟由一個輸入（`key`）嗰度計出一個 `index`，用 `index` 嚟由一個陣列（`buckets`）嘅位嗰度搵出想要嗰件數據（下圖）。
*:
**樹（tree）：柞數據有高低層之分，好似一幅樹狀圖噉；一樖數據樹會有若干個節點（node），而且啲節點分層，除咗做起始點嗰個節點（根節點；root）之外，每個節點有一個（而且頂櫳一個）母節點（parent；指喺嗰個節點上面，連住嗰個節點嘅另一個節點），於是就形成柞節點喺起始點嗰度一層層噉每層都分叉嘅樣；好似下圖噉，紅色 2 嗰點係根節點，而根節點下有一層層嘅節點，每個節點都有個母節點（例如 7 嗰點嘅母節點就係個根節點）。
*:
**圖（graph）：一幅圖數據有若干個節點，而且每個節點都最少有一條邊（edge）連去另外一個節點嗰度，而如果有兩個節點之間有條邊連住，佢哋就算係**相鄰**（adjacent）嘅；好似係下圖噉，下圖係一幅有 6 個節點嘅圖數據，當中節點 1 同節點 2 之間有連結（可以由節點 1 行去節點 2 或者相反）、節點 1 同節點 5 之間有連結（可以由節點 1 行去節點 5 或者相反）... 如此類推。
*:
*整數過溢（integer overflow）：電腦運算上會遇到嘅一種問題，指要處理嘅數值嘅大得滯或者細得滯，搞到部電腦表示唔到佢；例如部電腦用咗 16 個位元嚟記住個數，即係話個數如果係正嘅整數，最多淨係可以有 2^{16} 咁大，而如果計計吓數個數變成大過呢個值，就會有整數過溢嘅情況。
*算術下溢（arithmetic underflow）：電腦運算上會遇到嘅一種問題，指要處理嘅數值嘅精細得滯，搞到部電腦表示唔到佢；例如部電腦用咗 16 個位元嚟記住個數，即係話個數如果係浮點數，頂嗮櫳都淨係可以有小數點後 15 個位，而如果計計吓數個數變成精細到超過小數點後 15 個位，就算係有算術下溢嘅情況。睇埋混沌理論。
*字符編碼（character encoding）：指講明電腦內部嗰啲 `0011` 點樣對應唔同嘅符號。
**ASCII：一套用嚟同廿世紀英文做字符編碼嘅標準方案；响 ASCII 入面，`100 0001` 對應 `A`、`100 0010` 對應 `B`、`100 0011` 對應 `C` ... 呀噉，所以部電腦就可以靠記住一串串嘅 `0` 同 `1` 嚟表示文字性質嘅數據。
**統一碼（Unicode）：可以話係 ASCII 嘅延伸版；統一碼嘅基本原理同 ASCII 一樣，每個符號都對應電腦內部嘅一串 `0` 同 `1`，不過統一碼就包埋好多英文以外嘅字符，好似係漢字呀噉，而且仲包埋好似古埃及嘅聖書體呢啲冇人再用（但可能考古學等領域嘅研究上會用）嘅文字。
*檔案格式（file format）：一款檔案格式係指一套儲住啲電腦位元嘅方案；例如 JPEG 同 GIF 都係圖像檔案格式（用嚟教部電腦儲住啲描述圖像嘅數據嘅檔案格式），但兩者有啲唔同－JPEG 能夠做到將份圖像檔案壓縮到本來嘅 1/10 咁大（同時幅圖嘅質素唔會明顯走樣），而 GIF 就出嗮名支援動畫（呢樣嘢係早期版本嘅 JPEG 唔支援嘅）；喺各種嘅電腦應用上，工作者要理解自己處理嘅數據可以用邊啲檔案格式儲起，並且根據自己嘅需要揀用邊一種格式。
**JSON（JavaScript Object Notation）：由 JavaScript 演變出嚟嘅一種檔案格式，常用於網絡嘅數據交流；JSON 會用人類睇得明嘅文字嚟儲同傳達包含一拃拃名-值對同陣列（或者第啲做咗序列化嘅數值）嘅數據物件。
*十六進制編輯器（hex editor）：一種電腦程式，特徵係俾用家打開一個電腦檔案，然後俾用家睇同更改個檔案嘅數據，當中個編輯器將啲數據以十六進制數噉嘅形式嚟呈現俾用家睇。

*紀錄檔案（logging / log file）：指一個紀錄作業系統或者第啲軟件運行嘅檔案；例如一個（簡化版）伺服器嘅紀錄檔案會紀錄好似噉嘅資訊－
*:用家 112XXXXXX 喺 YYYY 年 M 月 D 日 13:51:31 用過 http:xxxxxxxxxx 呢個檔案；
*:用家 129XXXXXX 喺 YYYY 年 M 月 D 日 13:51:40 用過 http:xxxxxx234x 呢個檔案；
*:...
**紀錄檔案喺做 debug 等嘅工作嗰陣好有用。

## 程式編寫

*Hello World：係指喺螢幕顯示「Hello, World!」（你好，世界！）噉嘅字串嘅電腦程式；呢種程式通常都係每種程式語言最基本、最簡單嘅程式，常用於示範一隻程式語言點運作。例如係以下呢段 C 嘅碼噉：
*:
```c
int main() /* 下面嘅係主程序... */
{
    printf("Hello, World!"); /* 呢句嘢叫部電腦出「Hello, World!」噉嘅字串。 */
}
```

*直譯器（interpreter）：指一個能夠直接噉執行以某啲程式語言寫嘅指示嘅程式。
*讀取-求值-輸出循環（read-eval-print loop，REPL）：一種簡單嘅編程環境，部機係噉重複「攞一條表達式、行、然後彈個 output 出嚟睇」噉嘅過程。
*條件陳述式（conditional statement）：絕大多數程式語言都會有嘅一種陳述式，功能係視乎情況（睇埋邏輯與、邏輯或同邏輯非）決定係咪要做某啲運算同採取某啲行動－一句條件陳述式會掕住一柞碼同一句佢要評估嘅條件，當個電腦程式行到個條件陳述式嗰時，如果個條件係真，個程式就會行條件陳述式掕住嗰柞碼，否則個程式就唔會行嗰柞碼。好似以下噉：
**`IF..GOTO`，如果 .. 為真，goto 某個位，常見於非結構化嘅程式語言。
**`IF..THEN..(ENDIF)`，如果 .. 為真，做 `THEN` 後面嘅 ..，`ENDIF` 用途在於標記掕住碼嘅終結。
**`IF..THEN..ELSE..(ENDIF)`，如果 .. 為真，做 `THEN` 後面嘅 ..，否則做 `ELSE` 後面嘅 ..，`ENDIF` 用途在於標記掕住碼嘅終結。
**`IF..THEN.. ELSE IF .. THEN .. ELSE..(ENDIF)`
*遞歸（recursion）：指一個子程式用到佢自己，例如以下呢段簡單嘅碼噉：
*:
```c
function dream()
    print "Dreaming"
    dream() // dream 呢個子程式當中用到自己。
```

*應用程式（application software）：電腦程式一種，指個程式設計嚟做某啲特定嘅作業，對部電腦本身嘅運作冇幫助，通常攞嚟俾終端用家用嘅；例如一隻電子遊戲或者一隻文書處理器就係應用程式－一隻電子遊戲會呈現一隻遊戲嚟娛樂玩家，而一隻文書處理器會俾用家有得處理文字，兩種程式都唔會幫部電腦運作。
*Regex（全名 regular expression）：指由一段字符當中搵出某串特定嘅字符，好似係
*:`^The`（搵出以 `The` 做開頭嘅字符串）
*:`end$`（搵出以 `end` 做結尾嘅字符串）
*:`^The end$`（搵出同「`The end` 」完美符合嘅字符串）... 呀噉。
*cmd.exe：又有叫命令提示符（command prompt），係好多個作業系統（包括 Microsoft Windows）預設嘅命令行直譯器，會俾用家以命令行介面嘅形式嚟指揮部電腦做嘢，一行指令望落係類似噉嘅樣：
*:`C:\>CommandA && CommandB && CommandC`

*呢嚿嘢（this）：常見於 OOP 嘅一種功能，指隻程式語言有方法喺一句指令入面講行緊嗰段碼屬嘅一件物件或者類別；例如想像遊戲編程，其中一件物件有個子程序，個子程序會改變件物件嘅位置，就有可能會出現類似以下噉嘅碼：
*:`this.position = [0,0,0];`；意思係「呢嚿嘢（`this`）嘅位置（`position`）要變成（`=`）指定咗嘅值（`[0,0,0]`）。
*函式庫（library）：指電腦程式用嘅非揮發性（唔會一熄機就冇咗嘅）資源，包括數據庫嘅數據以及陳述式噉；資訊科技工作者好興用函式庫嚟交流，令大家做嘢更加方便，例如 AI 噉，會有 AI 工作者搵埋一拃 AI 工作成日用嘅子程序，將呢啲子程序變成陳述式；第啲 AI 工作者攞去用，就可以達到「用一句碼就叫到部電腦做一樣 AI 常用嘅子程序」噉嘅效果。
### 程式語言

程式語言（programming language）：泛指用嚟教電腦做運算嘅人造語言，每隻字都會有清楚同固定嘅定義；廿一世紀初常用嘅程式語言有 Python、Java、JavaScript、C、SQL、MATLAB 同埋 Processing 等等。
*程式語言理論（programming language theory）：電腦科學嘅一個子領域，包含研究程式語言呢樣嘢應該點樣設計、分析同埋分門別類嘅一套理論；程式語言理論會用邏輯等形式化－即係每個符號都有清晰定義，唔似得自然語言咁多歧義－嘅語言嚟表達唔同嘅程式語言，剖析唔同程式語言彼此之間喺解難能力上有乜嘢差異，例如係「某隻程式語言會唔會比起第啲語言更加擅長解某啲類型嘅問題」等嘅課題。
**抽象句法樹（abstract syntax tree，AST）：用樹狀圖噉嘅方法嚟表示一段用程式語言寫嘅源碼；噉做可以攞走源碼當中啲標點符號同第啲對分析嚟講冇用嘅符號，等分析起上嚟易睇啲。
*語言原始體（language primitive）：指一隻程式語言入面最簡單嘅元素，簡單到唔會靠第啲元素嚟定義；包括咗「要處理嘅數據」同「做喺啲數據上做啲咩運算」。
*句法（syntax）：指一隻程式語言入面指定「邊啲符號（包括數字同字母）嘅組合算係有意思」嘅法則，好似喺 C 程式語言入面，`printf("xxx");` 呢行碼會教部電腦顯示出 `xxx` 噉嘅字，因為 C 語言嘅句法指明咗 `printf` 嘅陳述式係教部電腦做「顯示段字出嚟」嘅作業。
*抽象化（abstraction）：指由研究緊嗰樣物件嗰度攞走不必要嘅資訊，等個研究者可以集中諗件物件重要嗰啲部份；喺編程上，抽象化包括（例如）同一個子程序改返個名，然後次次想部電腦行個子程序嗰陣直接用嗰個名而唔係將個子程序成段碼再打多次。
*變數（variable）同常數（constant）：喺編程上，一個變數係指某個儲存位置（記憶體地址）加一個符號性嘅名（識別碼），而個變數會有個喺程式執行期間可以改變嘅數值；而常數就係指個儲存位置嘅數值喺程式執行期間唔可以被改變。
*算子（operator）：指一隻程式語言入面行為似函數噉嘅嘢，例如「加減」或者「比較兩個數嘅大細」呀噉；運算數（operand）就係指俾算子攞去計嘅數，例如 `1 + 1` 當中嘅 `1` 係運算數，而 `+` 就係算子。
*子程序（subroutine）：指一個大型程式當中特定嘅一拃程式碼，由一個或者多個陳述式組成，專門完成某項工作，而且獨立於子程式以外嘅陳述式。通常用嚟教個程式做一啲要重複做若干次嘅工作。
*表達式（expression）：喺一段程式碼當中，一段表達式係結合咗若干個常數、變數、子程序同算子而成嘅物體，能夠俾隻程式語言攞去行。
*求值策略（evaluation strategy）：指一隻程式語言用咩方法嚟同啲表達式做求值；舉例說明，想像家陣要行以下噉嘅表達式
*:
```c
def double x = (plus x x) // 「double x 意思等同 x + x」
  def average x y = (divide (plus x y) 2) // 「average x y 意思等同『(x + y) 除以 2』」
```

**用正常次序求值（normal-order evaluation）嘅話，會做嘅嘢係「吓吓都郁手拆咗最左嗰個子程序先」→
*:
```c
(double (average 2 4)) =>
(plus (average 2 4) (average 2 4)) =>
(plus (divide (plus 2 4) 2) (average 2 4)) => ...
```

**而用應用次序求值（applicative-order evaluation）嘅話，會做嘅嘢係「吓吓都郁手拆咗最入嗰個子程序先」→
*:
```c
double (average 2 4) =>
double (divide (plus 2 4) 2) =>
double (divide 6 2) => ...
```

**唔同嘅求值策略都有各自嘅利弊，同一條表達式，有可能用一種求值策略會攞到正確答案，但用另一種求值策略就會搞到輕機。
*領域特定語言（domain-specific language，DSL）同通用電腦語言（general-purpose language，GPL）：領域特定語言係指淨係適用於某個應用領域嘅電腦語言，例如 GameMaker 呢隻遊戲引擎就設有淨係可以喺 GameMaker 入面用嘅手稿語言，呢種語言喺 GameMaker 以外嘅環境係完全冇用嘅；領域特定語言嘅相對係通用電腦語言－通用電腦語言可以用喺多種唔同嘅環境度，例如係 Python 同 C 呀噉。

### 編程範式

*物件導向編程（object-oriented programming，OOP）：以物件（object）嚟做一個程式嘅基本單元；一件物件會包括一柞特定嘅數據，呢啲數據（特性）因為用途上有某啲共通點而俾設計者擺埋一齊嚟睇；除此之外，一件物件通常仲會掕住一啲專門處理同嗰件物件相關嘅工作嘅子程序，呢啲子程序就係嗰件物件嘅方法。
*程序式編程（procedural programming）：強調「電腦程式係一連串要行嘅指令」，集中於將寫緊嘅電腦程式分開做若干橛，每橛都係一拃彼此相關嘅指令（程序；睇埋子程序嘅概念）。

### 編程原則

## 電腦工程

*電腦架構
*並行運算
*平行運算
*分散運算
*性能（performance）：指一個電腦系統能夠做幾多有用嘅運算同埋做起呢啲運算上嚟嘅效率係點；性能可以用多種指標量度，而一般嚟講，一部性能良好嘅電腦具有以下嘅特徵：
**做起運算上嚟用嘅時間少；
**用嘅運算資源（睇埋寄存器）少；
**快速嘅數據壓縮同解壓；
**數據傳遞花嘅時間短... 等等。
*系統資源（system resource）：指一個電腦系統入面一啲會俾個系統消耗嚟做運算工作嘅嘢，例如係記憶體噉。
*電腦叢集（computer cluster）：指若干部一齊做嘢嘅電腦，呢啲電腦之間嘅連接程度高到可以當做一個系統噉嚟睇，每個節點都會做同樣嘅功能，並且由某啲軟件中央噉控制住；一嚿電腦叢集裏面嗰啲電腦通常都會用區域網絡連埋一齊。

*緩存（cache）：一類嘅硬件或者軟件部份，專門攞嚟儲住啲數據，而目的係為咗第時俾用家以更快嘅速度攞啲數據嚟用；一部廿一世紀初嘅電腦，通常會將最近用過或者不嬲成日用嘅數據儲喺緩存度，達致提升電腦性能（部機處理起數據上嚟快咗）嘅效果。

### 作業系統

作業系統（operating system）係一個負責管理部電腦啲硬件同軟件資源嘅電腦程式，係電腦系統嘅基石。比較出名嘅作業系統有 Microsoft Windows 同 macOS。
*內核（kernel）：位於一個作業系統嘅「核心」嘅電腦程式，負責控制個系統嘅唔同部份；喺多數嘅作業系統嗰度，內核係部機著嗰陣其中一個最先撈嘅程式，跟手會幫手做第啲開機要做嘅工作。
*硬件抽象層（hardware abstraction layer，HAL）：一浸硬件抽象層係個作業系統入面嘅一柞程式，會負責將啲硬件抽象化噉表示出嚟，目的係俾作業系統有得同部電腦嘅硬件負動；硬件抽象層可以由內核嗰度接收指令。
*應用程式介面（application programming interface，API）：一種俾兩個或者以上電腦程式彼此之間通訊嘅軟件；例如喺一部個人電腦上面行一隻應用程式嘅話，隻程式就需要同部機嘅作業系統交流，而部機嗰啲應用程式介面就會幫手做呢樣工作。
**DirectX：係一系列用嚟教部電腦處理啲多媒體嘢嘅 API，對電子遊戲嚟講零舍重要；用電子遊戲程式做例子，DirectX 會負責扮演部電腦（包括個人電腦同好似 Xbox 噉嘅遊戲機）同遊戲程式之間條橋樑，每隻版本嘅 DirectX 都會有一套特定嘅多媒體功能係佢支援嘅，並且指定咗話呢啲功能可以由電腦程式指揮部機啲硬件（假設呢啲硬件同嗰隻版本嘅 DirectX 相容）做。DirectX 令到電子遊戲開發等嘅工作易搞咗好多－喺初頭嗰陣，電腦係會俾隻遊戲程式直接同硬件通訊嘅，但噉做搞到啲遊戲開發者焗住吓吓都要每款機都同佢寫一柞碼做呢種通訊，於是微軟就開發咗 DirectX 呢隻 API，遊戲開發者變成淨係需要諗「自己整嗰隻遊戲寫嚟同邊隻版本嘅 DirectX 相容」就得。
*檔案系統（file system）：作業系統當中用嚟控制「數據點樣儲起同提取」嗰部份；檔案系統做嘅主要係將一部電腦入面啲數據斬件分好，而且每一件數據（一個電腦檔案；file）都同佢改返個名，等用家能夠輕鬆噉睇得出邊件數據打邊件；冇咗檔案系統嘅話，部電腦入面嗰啲數據只會係一大嚿雜亂無章嘅數據，冇方法俾用家知道邊一段係屬邊件數據，更加唔會做到正確噉儲起同提取數據。

## 電腦通訊
### 電腦網絡

*對談（session）：喺電腦科學上，一場對談係指兩部或者以上嘅通訊緊嘅機之間，一場暫時嘅資訊交流，例如當一位用家用自己部個人電腦開網頁嚟睇嗰陣，佢部機會同網頁伺服器通訊，要求部伺服器交出有關嗰個網頁嘅資訊。
*電腦網絡
*節點（node）：一個電腦網絡入面嘅一個通訊終點，通常係一部有能力收發訊號嘅電子架生。
*覆蓋網絡（overlay network）：指一個「建立喺第個網絡之上」嘅電腦網絡；個網絡啲節點之間會有連繫，而呢啲連繫冚唪唥都會喺底層嗰個網絡嗰度有對應。
*私人網絡（private network）：指個網絡入面啲 IP 位址係私人嘅－會用自己嘅一套方案嚟安排 IP 位址，令到外界難以干涉個私人網絡內部嘅通訊。睇埋 VPN。
*互聯網（Internet）：一個遍及全地球嘅龐大電腦網絡，會用 TCP/IP 嚟俾網絡同電腦之間通訊，包括咗淨係地區性（例如淨係香港內）以至全地球嘅電腦網絡連繫，亦都同時包括公開同私人（淨係得有授權嘅人先可以進入）嘅網絡。
**黑暗網絡（darknet）：網絡嘅一種；一個黑暗網絡係一個喺互聯網裏面嘅覆蓋網絡，用家一定要用某啲特定嘅軟件或者授權先至可以用；黑暗網絡好多時都係外人入唔到，甚至唔能夠知道入面發生緊咩事嘅，所以成日俾人攞嚟做啲犯法嘅嘢。
*萬維網（World Wide Web，WWW）：互聯網會用到嘅一套資訊系統軟件，俾人通過互聯網嚟傳送文件或者第啲資源，當中每一件資源都有會掕住個 URL（例如 `https://example.com/` 噉）嚟識別佢。
**Web 1.0 同 Web 2.0：Web 1.0 泛指 1990 年代至 2004 年嘅 WWW；喺呢個時期，會用互聯網嘅人幾乎冚唪唥都係純接收資訊；喺 2000 年代後半橛，開始有咗社交媒體同 YouTube 等嘅平台，令到「整自己嘅內容，再將啲內容掟上網」呢家嘢變得好易做，於是「由用家創造嘅內容」－好似係社交媒體上嘅貼文、影片同網誌呀噉－出現咗爆發性嘅增長，用家會用各自整嘅內容互相影響，出現咗一套同打前嘅互聯網完全唔同嘅資訊生態，而呢個時期嘅互聯網就俾人嗌做 Web 2.0 。
*電郵（email）
**垃圾電郵（email spam / junk mail）：係指由某啲人大量噉周圍傳嘅電郵，好多時會係廣告；反垃圾電郵技術（anti-spam）會教電腦攞一封電郵做 `input`，而 `output` 就俾出「封電郵係咪垃圾電郵」，係嘅就自動將封電郵掟去垃圾信箱度。

### 電腦保安

電腦保安（cybersecurity）係電腦科學嘅一門，泛指針對「點樣保護電腦系統入面嘅資訊」嘅研究。電腦保安係一門好緊要嘅技術，例如銀行啲資訊系統實要處理啲客嘅信用咭號碼噉嘅敏感資訊，有好多罪犯都會嘗試偷呢啲資訊，所以銀行嘅資訊科技人員就要諗計好好保護呢啲資訊。
*惡意程式（malware）：「有惡意」嘅軟件，即係指隻軟件設計出嚟用意係想對電腦、伺服器、用家或者電腦網絡造成傷害。
**病毒（virus）：一種常見嘅惡意程式，一旦一隻電腦病毒開始行，佢就會郁手篡改第啲電腦程式，對呢啲程式（host）做代碼注入（code injection；指加插一啲本來唔屬於嗰個程式嘅碼），從而自我複製，好多時仲會控制 host 所屬嘅電腦，要呢啲電腦幫手散佈隻病毒（例如教部電腦將隻病毒附喺電郵度再傳去俾第啲電腦）。
**廣告軟件（adware）：泛指一啲用嚟勁喺用家部機度顯示廣告嘅軟件；呢啲軟件可以透過好多途徑進入用家嘅電腦，例如係「匿喺」一啲正常嘅程式裏面，一齊俾用家下載落部機度；一旦一隻廣告軟件裝咗落部機度，就會開始用各種方法向用家顯示廣告，例如係上上吓網無啦啦彈個廣告出嚟，或者係擅自改咗用家網頁瀏覽器嘅頭版噉；比較有攻擊性嘅廣告軟件甚至會（例如）靜靜雞查用家「上邊啲網站」嘅資訊，再將呢啲資訊傳返去開發隻軟件嘅人度，用嚟做「已知呢位用家對呢啲呢啲嘢有興趣，要彈啲咩廣告俾呢位用家睇？」噉嘅決策。
**鍵盤側錄（keylogging / keystroke logging）：係指一部電腦（通常暗中）記住喺某段時間內用家撳咗鍵盤邊啲掣，可以係一嚿硬件；鍵盤側錄程式一般都唔犯法，成日俾 IT 工作者攞嚟查返啲用家做過啲乜，不過亦都有啲人會用鍵盤側錄嚟做「偷密碼」等嘅犯法嘢。
*網絡攻擊
**阻斷服務攻擊（denial-of-service attack，Dos attack）：指攻擊者嘗試搞到攻擊目標（好多時係一部伺服器）冇辦法通過互聯網向啲用家提供服務；例如攻擊者用某啲方法突然間係噉勁要求部目標伺服器做嘢，搞到部伺服器唔夠系統資源服務正常嘅用家。分散式阻斷服務攻擊（distributed Dos，DDos）係 Dos 嘅一種，指個攻擊者利用俾佢攻陷咗嘅一柞電腦嚟做「用家」，控制呢柞電腦一齊勁要求個目標伺服器做嘢（好似下圖嘅抽象圖解噉）。
*:
*夾硬執行代碼（arbitrary code execution，ACE）：指揀定一部機，再揀定一柞命令或者電腦碼，並且夾硬要部機執行嗰柞命令或者碼；黑客好多時都會用呢種做法嚟犯罪，簡單例子係夾硬叫受害者部機傳送一啲敏感嘅個人資料。
*防毒軟件（antivirus software）：泛指用嚟幫一部電腦探測、防範同清除惡意程式嘅軟件；响一開始嗰陣，防毒軟件淨係攞嚟防電腦病毒嘅，不過到咗廿一世紀初，防毒軟件曉應付嘅唔淨只係電腦病毒，仲會有功能幫用家防範勒索軟件、特洛伊木馬程序、濫發電子訊息同釣魚等嘅威脅。
*虛擬私人網路（virtual private network，VPN）：軟件嘅一種，主要功能係將一個私人網絡「擴張」到去一個公用網絡（例如互聯網）度，等用家有得喺唔使俾個公用網絡睇到自己 IP 位址（好多時係透過加密嘅技術）嘅情況下同個網絡收發資訊－達致「保護用家個人資料」噉嘅效果；喺廿一世紀初，VPN 嘅使用幾有爭議性，例如唔少人都質疑 VPN 係咪信得過，會唔會乘機偷用家嘅個資。

### 密碼學

*密碼學
**雜湊函數（hash function）：一種函數；一個雜湊函數能夠攞任何長度嘅數據（input），再將段數據轉化成一個長度固定嘅位陣列（output；下圖嘅 `digest`），例如攞一大拃人嘅英文名（可以有幾多個字母都得），再將啲名冚唪唥轉換做兩個位嘅數－`John Smith` → `02`、`Lisa Smith` → `03`、`Sam Doe` → `02`... 呀噉。
**密碼雜湊函數（cryptographic hash function）：密碼學上成日用嘅一類演算法；一個密碼雜湊函數會將任何長度嘅數據（input）轉化成一個長度固定嘅位陣列（output；下圖嘅 `digest`），而且有以下嘅特徵：
***冇隨機性喺入面；
***要「由出嗰啲位陣列嗰度，計返串輸入數據出嚟」，係極之困難甚至冇可能嘅；
***是但搵兩串唔同嘅輸入數據，佢哋出嘅位陣列都會唔一樣；
***串輸入數據變咗少少，出嘅位陣列都會唔同嗮樣。
**:
**區塊鏈（blockchain）：一種分散式嘅數據庫；一條區塊鏈會用好多部彼此之間有網絡連住、但位置上可以相距好遠嘅電腦，喺一條區塊鏈當中，數據會斬開做一嚿嚿**區塊**（block），每嚿區塊都會儲若干嘅數據，儲滿就封（唔俾人再改）同埋連去打前嗰啲區塊度（用 <code>prev_hash</code>），而且每嚿區塊都掕住咗個時間標記（好似下圖噉）。
***區塊鏈最出名嘅用途係用嚟儲住加密電子貨幣啲交易紀錄：一條區塊鏈正路會將網絡入面唔同電腦嘅紀錄做較對，如果有其中一部機啲數據同其餘嗰啲機唔夾，噉就知道嗰部機啲數據有問題，而噉亦都表示，如果有黑客想偷錢（必然會涉及篡改紀錄）就實要改個網絡入面 51% 嘅電腦儲咗嘅數據－呢樣係一樣極之困難嘅工作，而且因為一條區塊鏈每嚿區塊都帶有有關打前啲區塊嘅資訊（用咗密碼雜湊函數），令到防守方更加容易留意到有人對啲紀錄做咗手腳。
***:

## 資訊系統

*數據刮取（data scraping）：指用電腦程式由人睇得到嘅輸出嗰度攞數據。
**網頁刮料（web scraping）：指由網頁嗰度做數據刮取；例如寫個程式，個程式曉直接噉用 HTTP 等嘅方法上網，並且由啲網頁嗰度攞數據，數吓（例如）某隻字喺每個睇咗嘅網頁當中出現咗幾多次，然後個程式仲會將呢啲數據傳送返去事先指定好嘅數據庫嗰度，等設計個程式嘅人有得分析呢啲數據。

### 數據庫

數據庫（database）係指俾電腦有系統性噉儲住啲資料嘅地方；當中「有系統性」意思即係話個數據庫唔淨只曉儲住啲數據，仲會設計到方便啲用家搵資料－簡單例子，廿一世紀初嘅數據庫最起碼仲會包埋某啲形式嘅搜尋功能，俾用家靠打關鍵字等嘅方法摷資料，而喺實際應用上，（例如）一間企業可以用個數據庫儲住一間佢哋啲員工嘅資料，等間企業嘅管理者可以隨時靠打員工嘅名或者姓嚟搵到有關嗰位員工嘅資料。
*關係數據庫（relational database）：數據庫幅表會以表格嘅方式出現，有若干行打橫嘅列同埋若干行打戙嘅行，每列表示一個個案，每行表示一款數據。
*時間標記（timestamp）：指一串用嚟記住一件事件幾時發生嘅資訊；數據庫入面嘅每一件數據通常都會掕住個時間標記，用嚟表示嗰件數據係幾時記錄入去個數據庫度嘅。
*序列化（serialization）：係指將一個數據結構或者物件轉化成一個可以儲起嘅格式，等呢啲數據可以傳去第度而且收數據嗰方可以重新砌返啲數據出嚟。有好多程式語言（例如 Python 同 C#）都會有特定嘅陳述式做序列化。例如 C# 就有類似噉嘅做法：
*:
```csharp
[SerializeField] InputField feedback1; // feedback1 會做序列化。
```

**做序列化可能嘅用意包括係想將啲數據傳去數據庫嗰度，例如行為分析上就成日會將自己嘅軟件設計成曉將描述用家行為嘅數據傳返去間企業嘅數據庫嗰度。
*數據庫管理系統（database management system，DBMS）：泛指一啲專門設計嚟俾用家攞嚟管理數據庫嘅軟件，最少會有齊增查改刪（CRUD）嘅功能。增查改刪包括：
*#**增加**（**C**reate）指加新嘅數據個案落個數據庫嗰度；
*#**查閱**（**R**ead）指俾用家查同睇數據庫入面嘅數據；
*#**更改**（**U**pdate）指俾用家改嘅數據庫嘅數據；
*#**刪除**（**D**elete）指俾用家剷走唔想要嘅數據。

## 軟件工程

軟件工程（software engineering）係工程學嘅一門，專研究點樣去規範噉開發同維護電腦軟件，而軟件工程師（software engineer）就係指專業噉做軟件工程嘅人。
*軟件（software）：泛指一隻或者一柞程式，能夠教部電腦做出特定嘅運算嚟達到用家想要嘅功能。
**本台（native）同跨平台（cross-platform）軟件：一隻本台軟件係專門設計嚟淨係喺某隻作業系統上面行嘅軟件，而一隻跨平台軟件就係可以喺唔同嘅作業系統上面行嘅軟件；例如一部 Game Boy 會由佢嘅咭匣嗰度攞軟件行，呢啲軟件嘅碼係專門設計嚟喺 Game Boy 上面行嘅，而想喺 Game Boy 以外嘅平台嗰度行呢啲碼就要用到模擬器－一種模仿 Game Boy 噉行啲碼嘅架生；同「用返隻本台軟件屬嘅平台嚟行」相比，「用模擬器嚟行」通常梗會慢咗啲－模擬器定義上就係模仿第個平台嘅硬件或者軟件，所以實要喺「想行嗰段碼」之外再行啲額外嘅碼。
*軟件最佳化（software optimization / software optimisation）：指將一隻軟件改到更加有效率，等個系統行起上嚟唔使用咁多系統資源；簡單例子有檢查吓隻軟件嘅源碼，確保段源碼完全冇任何多餘（即係有同冇都唔會影響隻軟件嘅功效）嘅碼－想像家陣編寫緊一隻網上遊戲嘅程式，隻遊戲好受歡迎，有數以十萬計嘅玩家，如果個程式嘅源碼當中有一行多餘嘅碼，噉十萬幾位玩家玩起上嚟部伺服器就要行多十萬幾行多餘嘅碼，會搞到部伺服器嘅負責大咗好多。因為噉，最佳化喺實際嘅軟件工程工作上係一個相當受重視嘅課題。
*由上至下設計（top-down design）同由下至上設計（bottom-up design）：廣義上係指兩種處理資訊嘅做法，**由上而下**係指將一個有返咁上下複雜嘅系統整體噉嚟睇先，跟住再將個系統啲組成部份逐個逐個攞嚟睇（睇咗上層嘅嘢先睇下層），而**由下至上**係指將啲組成部份逐個逐個攞嚟睇先，跟住先將個系統整體噉嚟分析。喺軟件工程上，**由上至下**係指諗好咗隻軟件「要有咩功能」先，諗完先至諗源碼要點寫，而**由下至上**就係指郁手寫咗啲源碼先，「柞源碼要點樣砌埋一齊成一個整體」就遲啲先算。
*整合開發環境（integrated development environment，IDE）：係指設計嚟係要俾做電腦相關工作嘅人攞佢嚟開發軟件嘅應用程式，通常會起碼有齊原始碼編輯器（俾用家攞嚟寫源碼）、組建自動化（將源碼轉化做行得嘅程式嘅功能）同埋除錯器等嘅功能。
*流動應用程式（mobile application / app）：泛指專門設計嚟俾智能電話等嘅流動裝置用嘅應用程式；喺廿一世紀初，流動裝置係個個人都有嘅咁滯，所以流動應用程式有相當嘅市場，有唔少軟件工程師都會花心機嚟研究流動應用程式嘅開發。
### 軟件設計
軟件設計
*物件導向設計（object-oriented design）：指攞個軟件設計上撞到嘅問題，喺郁手寫源碼打前，諗計度出一個由物件組成嘅系統（物件導向編程）用嚟解決個問題。
*設計模式（design pattern）：指一拃設計軟件嗰陣常用嘅方法，設計軟件嘅人唔一定要跟呢啲方法，但主流認為每隻設計模式都能夠有效解決某啲做 OOP 嗰時成日會撞到嘅問題。
**建立型模式（creational pattern）：指集中諗「點樣建立物件」嘅設計模式。
***單例模式（singleton pattern）：指成個類別得一個實例，用家唔可以隨便建立新嘅實例；喺最簡單嗰種做法當中，個程式會有類似以下呢段 Java 碼入面嘅 `getInstance` 噉嘅程序，用嚟確保個實例唔會喺個程式入面出現多過一次：
***:
```java
public static synchronized Singleton getInstance() // synchronized 確保唔可以有兩段或者以上嘅過程同時行呢段碼；
    {
        if (obj==null) // 如果冇 instance...
            obj = new Singleton(); // 就整個新 instance
        return obj; // 將個新 instance 俾做 output
    }
```

***工廠方法模式（factory method pattern）：又係種建立型模式，用工廠（喺 OOP 當中泛指曉建立第啲物件嘅物件）入面嘅方法嚟建立物件，而唔係吓吓都要想用件物件嘅物件親自（用自己嘅方法）建立。
**結構型模式（structural pattern）：軟件設計模式嘅一類，專門透過「搵出簡單方法嚟實現想要嘅物體間關係」嚟達致有效嘅軟件設計。
**行為型模式（behavioral pattern）：軟件設計模式嘅一類，專門透過「搵出物件之間嘅常見通訊規律」嚟達致有效嘅軟件設計。
***觀察者模式（observer pattern）：指一件物件（`Subject`）內部留意住佢啲觀察者（observer）；每當某啲狀態出現變化嗰陣，`Subject` 都會通知自己啲觀察者，而且通常係透過叫觀察者嘅方法嚟通知。
### 評估軟件
*可返用性：指一個程式入面啲部份（尤其係源碼）可以喺第時寫新程式嗰陣返用，喺軟件工程上係軟件嘅一樣重要特徵；有唔少電腦工作者都指出，OOP 其中一個最大嘅優點係啲程式可返用性高－例如喺電子遊戲製作上，遊戲製作師好容易可以攞自己程式入面啲類別去分享（睇埋遊戲資產），令到第啲人想喺自己整嘅電子遊戲裏面加類似嘅物件嗰陣可以慳返工夫。
*模塊性：簡化講係指個程式嘅唔同部份有幾易「分拆開，每嚿都可以獨立運作」－高嘅模塊性表示個程式就算其中一橛軭咗，個程式嘅其餘部份都可以繼續運作；有唔少電腦工作者指，OOP 喺模塊性方面嘅表現相當惡劣－例如淨係繼承嘅功能，就成日搞到啲程式出現「其中一段碼（例：類別）改咗，另外第啲碼（例：啲子類別）跟住就出問題」噉嘅情況。

## 數碼藝術

### 電腦圖像

電腦圖像（computer graphics / computer-generated imagery，CG / CGI）：指運用電腦整出嚟嘅圖像或者影片。
*二維電腦圖像（2D computer graphics）：二維嘅電腦圖像。
*三維電腦圖像（3D computer graphics）：三維嘅電腦圖像。
**景檔案（scene file）：一個景檔案會包含咗多種資訊，包括係「個景入面用咗啲乜嘢立體模型」、「每個立體模型喺邊個位置」、「光源喺邊」、「個鏡頭擺喺邊個位置」同埋「幾何變換」呀噉，描述個景係點嘅。然後部電腦會將呢個檔案入面嘅數據傳去一個彩現程式嗰度，等個程式做一大柞人手做唔嚟嘅運算，計出個鏡頭會睇到嘅（二維）影像應該係點嘅樣嘅，並且將個鏡頭所睇到嘅影像俾出嚟做輸出。

### 電腦音樂

電腦音樂

## 拉雜應用
### 科學運算

*科學運算
### 人機互動

*人機互動
*虛擬實境（virtual reality，縮寫 VR）：泛指用電腦嚟模擬出一個虛擬世界俾用家體驗；喺廿一世紀初，虛擬實境嘅標準做法係俾用家戴住個特製嘅頭罩－個頭罩會向用家對眼顯示個虛擬世界嘅影像，而且個罩仲內置咗感應器曉感應用家嘅郁動，每當用家郁嗰陣，虛擬實境裏面嘅景物就會跟住郁，令用家覺得自己好似置身响個虛擬世界入面噉。Unity 等嘅遊戲引擎有功能俾用家攞嚟製作虛擬實境用嘅虛擬世界。

*個人資訊科學（personal informatics）：指人用各種嘅電腦方法監察住自己嘅行為；一個做個人資訊科學嘅系統會有感應器係噉感應住用家做嘅嘢（例如每日行咗幾多步），跟住仲會將呢啲資訊顯示俾用家睇，用意係想幫人更加妥善噉管理自己嘅生活（例如俾用家靠睇住自己每日行咗幾多步，嚟計劃點樣減肥）。

## 相關數學

## 註釋

## 睇埋
*人工智能詞彙表
*電子遊戲詞彙表
*電腦硬件詞彙表
*工程學詞彙表

## 文獻

*Abelson, H., & Sussman, G. J. (1996). *[https://library.oapen.org/bitstream/handle/20.500.12657/26092/sicp.pdf?sequence=1 Structure and interpretation of computer programs]* (PDF). The MIT Press. 
*Arpaci-Dusseau, R. H., & Arpaci-Dusseau, A. C. (2018). *Operating systems: Three easy pieces*. Arpaci-Dusseau Books LLC. 
*Bryant, R. E., David Richard, O. H., & David Richard, O. H. (2003). *Computer systems: a programmer's perspective*. Upper Saddle River: Prentice Hall. 
*Felleisen, M., Findler, R. B., Flatt, M., & Krishnamurthi, S. (2018). *How to design programs: an introduction to programming and computing*. MIT Press.
*Hellerstein, J. M., Stonebraker, M., & Hamilton, J. (2007). *[https://dsf.berkeley.edu/papers/fntdb07-architecture.pdf Architecture of a database system]*. Now Publishers Inc. 
*Hellerstein, J. M., & Stonebraker, M. (Eds.). (2005). *Readings in database systems*. MIT press. 
*Kleppmann, M. (2017). *Designing data-intensive applications: The big ideas behind reliable, scalable, and maintainable systems*. " O'Reilly Media, Inc.". 
*Kurose, J. F., & Ross, K. W. (2007). *Computer Networking: A Top-Down Approach Edition*. Addision Wesley. 
*Lehman, E., Thomson Leighton, F., &  Meyer, A. R. (2017). *[https://courses.csail.mit.edu/6.042/spring17/mcs.pdf Mathematics for Computer Science]*. 
*L. Lov'asz & K. Vesztergombi (1999). *[https://cims.nyu.edu/~regev/teaching/discrete_math_fall_2005/dmbook.pdf Discrete Mathematics]* (PDF). Lecture Notes, Yale University. 
*Nisan, N., & Schocken, S. (2021). *The elements of computing systems: building a modern computer from first principles*. MIT press. 
*Nystrom, R. (2021). *Crafting Interpreters*. Genever Benning.
*Patterson, D. A., & Hennessy, J. L. (2016). *Computer organization and design ARM edition: the hardware software interface*. Morgan kaufmann. 
*Polya, G. (2004). *How to solve it: A new aspect of mathematical method* (No. 246). Princeton university press.
*Skiena, S. S. (1998). *The algorithm design manual* (Vol. 2). New York: springer. 
*Strang, G. (1993). *Introduction to linear algebra*. Wellesley, MA: Wellesley-Cambridge Press. 

## 攷

## 拎
*Teach Yourself Computer Science.
*Scholarly Societies in Computer Science.
*What is Computer Science?.