電腦科學

電腦科學會研究「運算」呢樣嘢嘅理論特性以及實際應用。
提示：呢篇文講嘅唔係科學運算。
電腦科學（英文：computer science），又有叫運算科學（computation science / computing science），粵文又有叫計算機科學，係專門研究運算嘅一個科學工程領域。「電腦」廣義上指運算機械，即係曉用數據做運算，並且俾出一啲有用結果嘅機械，簡單例子：而家手上有一柞「每個學生喺呢次考試當中攞到嘅分數」嘅數據，要用呢柞數字計出邊個考第一。電腦科學就係集中思考曉做呢啲嘢嘅機械點樣表示同儲起數據、用各種嘅演算法嚟處理數據以及彼此之間傳送數據等嘅問題。
電腦科學係一個理論同實踐兼備嘅領域。一方面，電腦科學－好似一般嘅科學領域噉－包含一啲好抽象同理論化嘅研究，例如係運算理論上對運算機械嘅研究噉，呢啲研究會將運算機械想像成好似以下噉嘅數學物體：
上圖呢部機械（稱為決定性有限狀態機）會攞一串符號做輸入，再話俾用家知，串符號入面 0 嘅數量係咪雙數：部機開始於  狀態；當部機讀到一個 0 嗰陣，會進入  狀態，而當佢再讀到個 0 嗰時，會返去  狀態；如果佢讀到嘅係 1 或者第啲符號嗰時，部機唔會改變狀態；喺部機讀完嗮串符號之後，如果串符號入面 0 嘅數量係雙數，佢會處於  狀態，否則佢就會處於  狀態。呢部抽象機械可以用多種唔同嘅物理機制實現，運算理論上屬於抽象性思考。
另一方面，電腦科學又屬工程學嘅一門，包含實踐性嘅研究，思考點樣用運算機械造出有經濟價值嘅產品。應用電腦科學嘅例子有電腦圖像學同電子遊戲開發呢兩個領域。電腦圖像學顧名思義研究電腦圖像，諗點樣運用電腦做嘅運算嚟製造圖像，而呢啲圖像可以用嚟將數據視覺化，或者整動畫同電子遊戲等嘅產品；電子遊戲開發就係思考點整電子遊戲（電子遊戲係一種用嚟做娛樂用途嘅電腦軟件），會運用電腦圖像、電腦編程（諗點樣俾指令教一部電腦做運算）、同人工智能（諗點樣用電腦運算令電腦做出有智能嘅行為）等電腦科學上嘅技術，務求製作出好玩同好賣嘅電子遊戲。總括嚟講，廿一世紀嘅電腦科學係一個蓬勃又多樣化嘅領域。

定位
英格蘭數學家巴貝治（Charles Babbage；1791-1871）一般俾人認為係創始「運算機械」呢個諗頭嘅人。
内文：電腦科學哲學

基本概念
内文：運算
"Computer science is no more about computers than astronomy is about telescopes."（「天文學唔係研究望遠鏡，電腦科學同理唔係研究電腦。」）
Michael Fellows （美國出世嘅電腦科學家米高·菲路）
電腦科學研究嘅重點係運算。廣義上，運算指涉及跟從一個定義好嘅模型，通過一連串算術同非算術步驟，做出嚟嘅計算。例如，演算法（algorithm）可以理解做用家俾一部電腦包含一串有先後之分嘅指示，每行指示教部電腦做某啲計算⸺可以係算術性嘅（加減乘除等），又可以係做邏輯代數（Boolean algebra）等等⸺通過呢啲指示，部電腦最後會俾出一個輸出，如果個演算法設計得好而且部電腦能夠無誤噉行段演算法嘅話，個輸出正正會係個用家想要嘅結果。
舉個簡單例子說明，好似係以下呢段用粵文寫嘅演算法噉：
要解決嘅問題：家吓俾一列正數你，假設呢個列唔係一個空列，同我搵嗰列數入面最大嗰個出嚟。
用嘅演算法嘅步驟：
設一個變數，叫佢做「max」，並且將佢個數值設做「0」；
 將收到嗰列正數逐個逐個攞嚟同 max 比較吓；
 如果撞到一個大過 max 嘅數（叫呢個數做「x」）嘅話，
   將 max 嘅數值設做 x，並且繼續將 max 同下個正數比較吓；
 將最後得出嗰個 max 嘅數值俾出嚟。max 嘅數值會係成列數入面最大嗰個。
做咗呢柞運算步驟之後，得出個輸出（max）會係用家想要嘅結果（列數入面最大嗰個）。

三大範式
廿一世紀初一般主流學界都認同，電腦科學包含咗多種唔同嘅研究範式（paradigm），當中蘇聯出世嘅電腦科學家彼得·惠拿（Peter Wegner）就主張，電腦科學包含三大範式，由唔同角度研究同「運算」相關嘅課題：
數學：電腦科學，尤其係運算理論（theory of computation）等比較理論性嘅子領域，會運用好似數學噉嘅演繹推理方法（例如係數學證明），即係齋靠已有嘅知識去嘗試推理出新嘅知識；例子有停機問題（halting problem）嘅思考，喺解決呢個問題嘅過程入面，亞倫圖靈（Alan Turing）用咗反證法證明呢個世界上冇可能有電腦能夠攞一個程式嘅碼做輸入，再俾出正確嘅「呢段碼會唔會停機」輸出－成個過程都係齋靠邏輯推理，就好似一般數學家嘅思考過程噉。
科學：另一方面，電腦科學嘅某啲子領域又會運用科學方法做研究，即係唔係齋靠諗，而係去攞一啲描述現實世界嘅數據，再用數據驗證佢哋嘅假說；例子有人工智能（AI）上嘅研究，人工智能其中一個目的係要令電腦做出有智能嘅行為，所以人工智能領域嘅科學家好多時會做實驗－好似物理學等自然科學領域噉－嘗試了解智能嘅本質，例如搵柞馬騮返實驗室嗰度，觀察佢哋係點運用工具嚟解難嘅（一般認為，曉用工具係智能嘅表現），得到數據之後，嘗試編寫出能夠教電腦做出同樣行為嘅程式。
科技：除此之外，電腦科學嘅研究好多時會似科技同工程學領域嘅噉，以「創造出最優質嘅技術或者產品」為目標；例子可以睇電子遊戲開發（video game development）呢個領域，電子遊戲開發嘅過程會用到好多涉及電腦嘅技術－電子遊戲本質上就係電腦軟件嘅一種，所以要製作一隻電子遊戲實要做大量嘅程式編寫，而且電子遊戲仲會用到電腦圖像（CG，用電腦造嘅圖像）同人工智能等嘅技術；所以遊戲製作研究會思考「一個遊戲程式用乜演算法行先會順暢」等嘅問題，而憑藉呢啲知識，遊戲製作師會以「製作出好玩（吸引到玩家俾錢）嘅遊戲」做目標工作－好似以「設計出最佳產品」為目標嘅工程師噉。可以睇埋工程學設計過程。

理論電腦科學
内文：理論電腦科學
理論電腦科學（theoretical computer science）係電腦科學當中最抽象化嘅子領域。理論電腦科學嘗試了解「運算」呢樣嘢嘅數學性質，會用數學上用嘅方法－數學證明等－嚟搵出描述運算嘅定理。理論電腦科學純粹以增進人類對運算嘅了解為目的，所以係一個好理論化嘅領域，但理論電腦科學上嘅進步往往會引致按呢啲知識嚟設計嘅電腦能夠做更有效率嘅運算。

運算理論
内文：運算理論
運算理論（theory of computation）專門研究運算嘅本質，思考機械點樣用演算法解難，嘗試了解運算機械嘅能力同極限係乜。運算理論上嘅研究會用數學證明等嘅數學方法，思考
唔同種類嘅理論性運算機械喺解難能力上有乜嘢差異（自動機理論；automata theory）；
有啲乜嘢問題係能夠或者唔能夠用運算機械解嘅（可運算性理論；computability theory）；以及
一個運算上嘅問題最高嘅可能解決效率（運算複雜性理論；computational complexity theory）
... 等等嘅問題。
舉個例說明，停機問題（halting problem）就係可運算性理論上嘅一個經典問題：
例子：停機問題證明
首先，電腦程式可以分做兩大種：
例：while (true) continue；呢種程式唔會停機－部電腦一行呢個程式就會一路行落去，永世唔會停。
例：print "Hello, world!"；呢種程式會停機－部電腦會逐行逐行碼行咗佢，最後停低。
根據英國數學家亞倫圖靈（Alan Turing）嘅證明，呢個世界冇可能有電腦能夠攞一個程式嘅碼做輸入，再俾出正確嘅「呢段碼會唔會停機」輸出。個證明大致上係噉：
想像有個程式，halts(f)，如果 f 係一個會停機嘅子程序，halts(f) 會出「真」（1），否則halts(f) 會出「假」（0），再想像以下呢個程序：
def g(): # 定義 g
    if halts(g): # 如果 halt(g) 係真...
        loop_forever() # 做永遠唔停嘅 loop
呢個程序會引致一個大矛盾：如果 g() 係會停機嘅，噉 halts(g) 會出「真」，於是 g() 就會進入永遠係噉行（loop_forever）嘅狀態－出現矛盾；而如果 g() 係唔會停機嘅，噉 halts(g) 會出「假」，於是 g() 就唔會進入永遠係噉行（loop_forever）嘅狀態－又出現矛盾。因為噉，halts(f) 呢一個程式冇可能存在喺呢個世界上。
呢個證明對運算本質嘅了解作出咗貢獻，而且由頭到尾淨係用數學證明嘅做法。
P = NP?



數據結構
内文：數據結構
數據結構（data structure）係指一部電腦組織內部數據嘅方法：要做運算，部電腦就實要用某啲方法儲住要用嘅數據，例：要做到將兩個數值加埋一齊，部電腦首先要能夠記住嗰兩個數值；好似陣列（array）噉，就係一種常用嘅數據結構，所有主流程式語言都有陳述式俾用家製造陣列，一個陣列有一個整數表示佢嘅大細，個整數表示個陣列有幾多個元素（element），每個元素都有個順序（通常由 0 起始）嘅數字表示佢係個陣列嘅第幾個元素，例：有個陣列叫 thearray，噉 thearray[0] 就係指 thearray 嘅第一個元素。數據結構上嘅研究思考部電腦以乜嘢方法儲住啲數據，以及唔同嘅儲數據方法有乜嘢優缺點，分別喺乜嘢時候啱用。
一個陣列；呢個陣列由第 0 格開始，每一格都裝一個字母，每一格上面嗰個整數表示嗰個元素係個陣列嘅第幾格。呢種字元陣列係 C 語系表示字串嘅方法。

資訊理論
内文：資訊理論
資訊理論（information theory）係一個研究資訊要點樣量化、儲起同傳達嘅數學理論。資訊理論嘅核心概念係熵（entropy）；資訊理論當中嘅「熵」係一個指標，用嚟量度一個有隨機性喺入面嘅變數或者過程當中帶有幾多不確定性（uncertainty）喺入面。舉個例說明，想像家吓掟一個銀仔同擲一粒六面嘅骰仔，假設個銀仔同粒骰仔係冇出千嘅：掟一個銀仔有 2 個可能結果，而擲一粒六面骰有 6 個可能結果。擲骰仔當中有更多可能性喺度，所以不確定性亦都更加大－有更多嘅資訊熵；當一個人知道咗一次掟銀仔或者擲骰仔嘅結果嗰陣，佢會清楚知道結果－資訊熵變成 0。對比兩個情況，「話俾人知掟銀仔嘅結果」所俾到嘅資訊－消除嘅資訊熵－少過「話俾人知擲骰仔嘅結果」所俾嘅。由呢個例子可見，資訊理論做到將「資訊」呢個本來相當含糊嘅概念量化，令資訊成為一個喺科學上可以被研究嘅對象。
資訊熵相互資訊

形式化方法
内文：形式化方法
形式化方法（formal methods）泛指一啲用嚟描述、開發同驗證軟件同硬件系統嘅數學方法。呢啲方法會用數學模型描述軟件同硬件系統，幫分析者手分析個系統，例：個電腦系統嘅運算速度（）有條公式表示個速度受邊啲因素（）影響，；分析者只要知道嗰啲因素嘅數值，佢就可以用條公式計出個電腦系統嘅運算速度；所以有咗條公式，佢就有得計出啲因素要喺乜嘢數值，先可以令速度最大化；喺呢點上，電腦科學同第啲工程學領域一樣－用數學模型模擬一個系統，並且靠呢啲模型對系統嘅設計作出思考，最後設計出更加能夠幫設計者達到佢目的嘅系統。形式化方法好多時會用到運算理論、資訊理論同程式語言理論上嘅知識，而且可以話係軟件工程嘅理論基礎。

電腦系統
睇埋：電腦工程
電腦系統係指一個能夠做有用運算嘅系統。一個電腦系統能夠用某啲方式接收輸入（input），進行某啲型式嘅運算，再俾出輸出（output）；如果一個電腦系統設計得妥當，噉個輸出正正會係個用家想要嘅。電腦科學領域會對電腦系統嘅設計作出比較抽象性嘅思考，集中諗「個系統應該要進行點樣嘅運算」，然後再同電腦工程等領域嘅專家合作，等後者用物理方法實現佢哋嘅設計。

電腦架構
内文：電腦架構
電腦架構（computer architecture / digital computer organization）係指對電腦系統結構嘅思考－設計電腦系統嘅「結構」包括咗指明部電腦有邊啲子系統、每個子系統會做乜嘢運算、以及每個子系統會同邊啲子系統互相收發數據。例如馮紐曼架構（Von Neumann architecture）就係廿世紀常用嘅一種電腦架構，一部用馮紐曼架構砌出嚟嘅電腦大致上會有以下呢啲組成部份：
一個處理器（processing unit），負責做算術運算同埋寄存（暫時儲住用緊嘅數據）嘅工作；
一個控制單元（control unit），負責記住手上做緊嘅工作同指揮處理器嘅運作；
記憶體（memory），負責儲住啲數據同指令；同埋
I/O（input/output）機制，負責由外界收訊號（例：透過鍵盤）同向外界傳訊號（例：透過熒光幕）。即係：
電腦架構上嘅研究會對「CPU 應該要點樣攞記憶入面嘅數據」、「一粒 CPU 要有乜嘢部份」以及「一部電腦唔同子系統之間要有乜嘢資訊傳遞」等嘅課題進行概念性嘅思考，而電腦工程以及電子工程等硬件方面嘅領域跟住就會負責諗呢啲架構概念要點樣用物理方法實現，兩者合作嘗試設計出性能更好－行得更快、製作成本更低－嘅電腦。
邏輯門
微架構
多元處理
普及運算
作業系統

並行性
IBM 嘅藍色基因（Blue Gene）係一部做大規模平行運算嘅超級電腦。
内文：並行運算、平行運算同分散運算
並行運算、平行運算同分散運算係三個唔同（但相關）嘅重要運算系統概念：
並行運算（concurrent computing）最廣義上指一個程式、一部電腦或者一個網絡能夠並行噉做幾個唔同嘅運算工序－即係例如工序 A 喺第 0.5 秒開始做同喺第 0.8 秒完結，而工序 B 喺 0.6 秒開始同喺第 0.9 秒完結（喺 0.6 同 0.8 秒嗰段時間之間，A 同 B 都係處於「做緊」嘅狀態）－而唔係好似最簡單嗰種運算噉，集中淨係做工序 A，做完 A 再集中做 B... 一路做到做嗮要做嘅工序為止。喺有多個處理器嘅電腦系統當中，並行運算可以提升運算嘅速度。
平行運算（parallel computing）可以話係並行運算嘅一種，指多項計算或者過程嘅執行同時發生：大嘅運算問題可以分做細嘅子問題，而呢啲細問題可以同時分噉解決，於是個電腦系統可以將個問題所用嘅數據拆開，每件送去唔同嘅處理器嗰度，等嗰啲處理器同時各自噉做所需嘅運算，然後再由處理器嗰度接收啲訊號，將得到嘅各件 output 砌返埋一齊。如果啲演算法設計正確，砌返埋一齊嘅結果正正會係設計者想要嘅。喺平行運算上，要點樣控制唔同子問題之間嘅通訊以及時間同步係重要嘅課題。
分散運算（distributed computing）係指個電腦系統有多部位於唔同－彼此之間有網絡嘅－電腦，呢啲電腦之間會互相通訊，靠呢啲通訊協調彼此嘅行動，用嚟達到某啲共同目的，而且由用家嘅角度睇望落好似係一部單一嘅電腦噉；一個分散式系統會有若干個節點（node），當中每個節點都係一部能夠獨立存在嘅電腦，而且有獨立嘅記憶體。
要說明平行運算同分散運算之間嘅差異，想像以下呢幾個過程嘅日誌（Ty 代表件事喺時間點 y 發生）：
P1
   T1：由記憶體讀取 input a
   T1：由記憶體讀取 input b
   T2：用 a 做 input 運算 function_01 呢項工序
   T2：用 b 做 input 運算 function_02 呢項工序
P2
   T1：節點 1 由自己記憶體讀取 input a
   T2：節點 1 由自己記憶體讀取 input b
   T3：節點 1 用 a 做 input 運算 function_01 呢項工序，output 係 b
   T4：節點 1 將 b 傳去節點 2
   T5：節點 2 用 b 做 input 運算 function_02 呢項工序
P1 反映咗一個平行運算，function_01 同 function_02 呢兩個運算過程可以直接噉使用同一柞記憶；而 P2 反映咗一個分散運算，Node 2 呢個節點唔可以直接用 Node 1 呢個節點嘅記憶，而係要 Node 1 將個 output 用訊號傳俾佢先可以用。喺某啲情況下，平行運算可以搞到個系統出一啲齋用非平行分散式運算唔會出嘅錯。

電腦性能
内文：電腦性能
電腦性能（performance）係電腦系統相關研究常考慮嘅一柞指標，指一個電腦系統能夠做幾多有用嘅運算同埋做起呢啲運算上嚟嘅效率係點。電腦科學家會用準確度、運算時間同速度等嚟量度一部電腦嘅性能。而一般嚟講，一部性能良好嘅電腦具有以下嘅特徵：
做起運算上嚟用嘅時間少；
用嘅運算資源（睇埋上面寄存器）少；
快速嘅數據壓縮同解壓；
數據傳遞花嘅時間短... 等等。

電腦通訊
光纖可以用嚟做長距離通訊。
運算機械之間會為咗達到各種目的而互相傳遞資訊，例如廿一世紀無所不在嘅互聯網科技噉，就涉及電腦之間係噉收發大量嘅資訊用嚟達到各種嘅用途。電腦科學上有對電腦通訊嘅問題作出思考，務求令電腦之間嘅通訊更加安全同有效率。

電腦網絡
内文：電腦網絡
一個電腦網絡（network）係指若干部電腦（每部電腦為止一個節點），會共同使用一個網絡傳輸協議（communication protocol）彼此之間分享資源。喺物理上，電腦網絡會包含若干部電腦，彼此之間以某啲方式－最簡單嘅係駁電線傳電子訊號－互相傳達訊號。電腦網絡有好多用途，例如受一個組織（一間學校或者一間公司）使用、外人用唔到嘅內聯網（intranet）可以用嚟俾一個組織內部嘅成員之間交流工作要用嘅資訊，而互聯網（internet）連接世界各地嘅電腦，令世界各地嘅人有得彼此交流圖像、文字、錄音同影片等嘅多種資訊。
電腦科學上嘅研究會將電腦網絡按各種特性分類，了解唔同類型嘅網絡喺性能上有乜差異，並且嘗試靠噉思考要點設計出更高效率嘅網絡：網絡拓樸（network topology）係指一個網絡嘅節點之間以乜嘢方式連埋一齊；網絡拓樸係抽象化嘅，唔重視電腦嘅物理位置，而只係集中思考啲電腦之間嘅連繫規律；數據傳輸就係指一個網絡嘅節點之間以乜嘢物理方式傳遞數據，當中最簡單嘅做法係駁線（可以睇埋光纖），不過廿一世紀開始嘅電腦網絡亦有大把無線技術可以用。
喺將電腦網絡分好類之後，電腦科學上就可以用好多方法衡量唔同類型網絡嘅網絡性能，即係唔同類型嘅網絡有幾能夠有效率噉幫用家達成目的。常用嘅網絡性能指標有：
頻寬（bandwidth）：指耗用嘅資訊量位元速率，以每秒嘅數量表示，一般數值愈大愈好；
時延（delay）：指由一個節點傳到第個節點嗰度要花嘅時間，一般數值愈細愈好；
順應力（resilience）：指個網絡有幾能夠喺異常情況出現（例如突然間有好多用家想要攞數據）嗰陣維持正常運作；
... 等等。
各種網絡拓樸嘅圖解；每個有色圓圈表示一個網絡節點，而兩個節點之間有連繫表示佢哋之間有能力傳資訊。

電腦保安
維基百科喺用戶想簽到嗰陣會要佢哋入密碼；噉做幫到手確保一個戶口淨係得開佢嗰個人用到。
内文：電腦保安
電腦保安（cybersecurity）泛指對電腦系統同網絡作出保護，等軟硬件同數據免受偷竊同損壞：隨住電腦網絡嘅普及，數據嘅流通變得容易，同時數據亦有更加有可能會落入犯罪份子嘅手，例如銀行系統所做嘅網絡通訊會包含用戶嘅信用咭號碼同戶口有幾多錢等嘅資訊，而呢啲資訊一旦落入犯罪份子嘅手，可以搞到銀行同用戶損失慘重。除此之外，大企業喺開發新產品嗰陣會想將個項目嘅內容保密，航空交通控制會想為咗確保航空安全而想保護自己用嘅電腦系統... 等等，所以電腦保安喺廿一世紀嘅電腦科學上係一個大課題。
電腦保安嘅核心概念係漏洞。漏洞泛指一個電腦系統或者網絡喺設計同執行上一啲可以俾人利用嘅弱點，例如軟件後門就係一種常見嘅漏洞，指一個系統或者網絡有方法俾人避開一般鑑別－即係入密碼等鑑別身份嘅過程－同保安控制就進入到，搞到黑客等嘅人物能夠攞到啲佢哋唔應該攞得到嘅數據。公共漏洞同暴露（Common Vulnerabilities and Exposures，CVE）等嘅資料庫會列出同討論電腦保安上常見嘅漏洞，而電腦科學上嘅學術研究亦會探討「電腦系統要點樣設計先可以冇漏洞」等嘅課題。

密碼學
内文：密碼學
密碼學（cryptography）係研究密文碼要點樣設計嘅一個領域。密碼學成個領域嘅目標係要確保傳訊人同收訊人以外嘅人冇能力知道所傳嘅資訊嘅內容，最基本嘅概念係加密（encryption）－「加密」定義係指將一段資訊入碼，轉化成第種表示方式，收訊人部電腦會知段資訊係點加密嘅，所以會有能力解讀段資訊，但收訊人以外嘅人正路就因為唔知個加密方案係點，就算攞到段資訊都解讀唔到段資訊嘅內容，而只係會得到一段望落完全雜亂無章嘅符號。一段加密演算法大致上可以想像成好似以下噉嘅虛擬碼：
攞傳訊者段資訊做 input；
 按某啲法則，將 input 變做 encrypted message（加咗密嘅信息），簡單例子：所有「a」變做「1020」；
 
 收訊者收到段加咗密嘅信息；
 收訊人部電腦按已知嘅法則，將段 encrypted message 變返做加密前嘅樣。
密碼學上嘅研究會運用資訊理論（睇返上面）等理論嘅知識，思考「加密方案可以按乜嘢特性分類」以及「邊啲類型嘅加密方案比較安全」等等嘅議題，係廿一世紀電腦保安上不可或缺嘅一環。
加密嘅抽象圖解；圖中每條鎖匙代表一段加密演算法。

電腦程式編寫
一段源碼；呢段碼係由 C 語言，一種比較高階啲嘅程式語言寫出嚟嘅，好明顯唔似人類日常傾偈講嘢。
内文：電腦程式編寫
電腦程式編寫（computer programming）係整同設計行得到嘅電腦程式嘅過程。一個電腦程式有段源碼（source code），段源碼會有若干行用程式語言寫成嘅句子，教部電腦要進行乜嘢運算，而如果個程式編寫得好，最後個程式俾嘅 output 正正就係個編程者想要嘅。喺編寫電腦程式嘅過程當中，編程者要做嘅嘢包括咗分析要解嘅問題、諗用邊啲演算法好、以及計同量度吓用緊嗰啲演算法嘅準確性同效率，而個編程者跟手就會揀返種程式語言，並且用隻語言寫好段源碼，打後個編程員仲要做多項工作，包括測試、除錯、保存住個程式嘅源碼同埋管理程式編寫過程整出嚟嘅產物等。
例如上面提到，用嚟搵出最大冧巴嘅演算法用 Python 呢隻程式語言寫出嚟嘅話如下：
# 入嘅嘢：一列冧巴，叫佢做「L」。
# 出嘅嘢：L 入面最大嘅冧巴。

def find_max (L):  # 定義乜嘢係「去搵 L 嘅最大值」。
   max = 0         # 設最大值做 0。
   for x in L:     # 為咗 x 喺 L 入面。
      if x > max:       # 如果 x 大過最大值。
         max = x         # 設最大值做 x。
   return max      # 俾返個最大值出嚟。

程式語言
内文：程式語言
一隻程式語言（programming language）係一種電腦能夠明白嘅語言，可以用嚟編寫程式教電腦做運算。一隻程式語言會有好多陳述式，每款陳述式都可以用嚟教電腦做某個特定嘅動作，編程員會按佢對用緊嗰隻程式語言嘅認識，編寫一段有若干行陳述式嘅源碼，而段碼經過編譯器（compiler）等嘅架生之後就可以由部電腦執行。舉個簡單例子說明，常用嘅程式語言冚唪唥都會有陳述式做簡單嘅算術，亦會有陳述式教電腦俾一啲字串做 output，以下嘅陳述式都係教部電腦俾「Hello World!」呢串字做  output，不過用咗唔同程式語言寫：
Python（1991 年始創嘅嘅一隻程式語言，常用於機械學習）：
print("Hello World!")
C＃（2000 年發行嘅一隻程式語言，常用於遊戲編程）：
Console.WriteLine("Hello World!");
廿一世紀嘅編程界有好多唔同嘅程式語言通用，比較常用嘅有 Python、C 同相關嘅語言以及 JavaScript 等等。唔同程式語言對同一個指令嘅陳述式會有唔同，有陣時甚至會有程式語言有一啲第啲程式語言冇嘅陳述式，所以唔同程式語言會擅長做唔同嘅工作。有經驗嘅編程者會曉按手上嘅工作嘅性質揀要用邊隻程式語言。

程式語言理論
内文：程式語言理論
程式語言理論（programming language theory，PLT）係研究程式語言應該點樣設計、執行、分析同分類嘅一套理論。廿一世紀初嘅電腦界有好多唔同嘅程式語言，每款程式語言都有獨特嘅功能，程式語言理論上嘅研究會嘗試比較唔同嘅程式語言，會用邏輯等形式化（formalized）－即係每個符號都有清晰定義，唔似得自然語言咁多歧義－嘅語言表達唔同嘅程式語言，剖析唔同程式語言彼此之間喺解難能力上有乜差異，例如係某隻程式語言會唔會比起第啲程式語言更加擅長解決（需要冇咁多行碼）某啲類型嘅問題等嘅課題。程式語言理論呢個領域會同數學、軟件工程、語言學同認知科學等嘅領域互相影響，而且對應用電腦科學－例如係新程式語言嘅設計等－嚟講相當緊要。

電腦應用
電腦能夠做到好多人手做唔到嘅運算，而呢啲運算有好多種用途。

電腦圖像學
一個旋轉緊嘅三維模型；個模型由好多個細少嘅簡單立體物件（立方體、錐體等等）組成。
内文：電腦圖像學
電腦圖像學係研究電腦圖像（computer graphics，簡稱 CG）嘅一個領域。電腦圖像泛指用運算技術造出嚟嘅圖像。呢啲圖像有好多各式各樣嘅用途，例如用嚟整電影同電子遊戲等嘅娛樂作品、用嚟處理由現實世界探測到嘅影像、又或者喺科研上將一啲理論模擬嘅現象呈現出嚟呀噉。整電腦圖像涉及以下嘅工作：
圖像表示；如果係二維（2D）嘅圖像，噉部電腦要以某啲方式記住幅圖，通常做法係，幅圖每一點都有一柞數字俾部電腦記住，而柞數字就代表咗嗰點「乜嘢色」同埋「有幾光」等嘅資訊；例如部電腦記住 [[207, 229, 78], [141, 159, 138], [146, 109, 81], ...] 噉嘅一系列數字，每組數字有三個數，每個最細係 0 最大係 255，第一個數代表嗰一點有幾多紅（R），第二個數代表嗰一點有幾多綠（G），而第三個數代表嗰一點有幾多藍（B），而成串嘢當中有  組「每組三個數」嘅數－ 就係幅圖嘅像素；最後形成一個矩陣，令到部電腦可以記住幅圖嘅樣。
如果係三維模型（3D model），噉部電腦可以用同類方法記住個模型嘅樣，例如個模型每隻角都有柞數字俾部電腦記住，數字表達佢個坐標位置，然後每兩隻角之間有數字表達佢哋之間「有冇表面」同埋「塊表面乜嘢色」等嘅資訊；
幾何變換（geometric transformation）喺整電腦動畫嗰陣會用到：部電腦會用算式計出幅圖或者個立體模型要點郁，從而達到某啲特定嘅視覺效果。例：假想幅圖喺熒光幕中心點，佢會有個坐標值，然後下一刻部電腦將幅圖嘅 X 坐標值（打橫坐標值）加 40 個像素－就會令幅圖向右邊跳 40 像素（喺實際應用上，通常 X 坐標值愈右愈大）。
... 等等。
顯示電腦圖像嘅過程大致上可以想像成噉嘅演算法：
設定背景嘅影像；
計算下一刻嘅影像大致上係點嘅，包括「嗰一刻每件物件喺乜嘢位置」、（如果係立體嘅話）「光源喺邊」、（如果係立體嘅話）「鏡頭喺邊」呀噉；
基於步驟 2 所得嘅資訊，計算喺下一刻，畫面嘅每一點應該係乜嘢色水；
將步驟 3 嘅計算結果傳去個熒光幕嗰度，等個熒光幕將個影像顯示俾個用家睇；
返去步驟 2，直至用家叫部電腦收工為止。

科學運算
細菌透過物競天擇產生抗藥性嘅過程圖解；抗藥能力勁嘅個體先至生存到，所以得佢哋有得繁殖，佢哋生嘅後代都會係屬於抗藥能力勁嘅。
内文：科學運算
科學運算（scientific computing）係指喺科學上建構數學模型嚟模擬同分析所研究嘅現象嘅做法，往往會用到電腦科學上嘅技術。喺實證科學上，科學家會創建數學模型模擬想研究嘅現象，然後再去搵證據睇吓個模型係咪真係能夠準確噉描述所研究嘅現象；喺廿一世紀嘅科學界，隨住科學家愈嚟愈走去研究複雜嘅現象，要用嘅數學模型變得愈嚟愈複雜，愈嚟愈難以用人手計。因為噉，自然科學家同社會科學家都變到想同電腦科學合作，整出用嚟模擬複雜現象嘅程式。
舉個簡單例子說明，現代生物學其中一個基礎係進化嘅概念：想像一個生物物種族群，個族群嘅基因庫（gene pool；指個族群身上嘅基因嘅總和）係  噉嘅樣，家吓佢哋做繁殖生下一代，而下一代嘅基因庫係  噉嘅樣，因為某啲基因比較有利於生存同繁殖（例如係令隻動物生殖能力勁嘅基因，即係所謂嘅物競天擇；natural selection）， 同  會有少少差異，而過咗  代後嘅基因庫  可以同  有巨大差異，令第  嘅個體同初代個體唔再算係同一物種－進化就係指一個族群嘅基因庫隨時間嘅變化，以及呢啲變化產生新物種嘅過程。
進化同物競天擇嘅過程可以大致上噉用以下嘅 JavaScript 碼嚟模擬：
var p; // 基因 P 喺個族群當中嘅出現率
var N = 2000;
var generations = 200;
var data = [];
var simulations = 10;

// 定義咗柞子程序先。
function next_generation(simulation_data) { // 呢個子程序負責由一代嘅數據計下一代嘅樣
    var draws = 2 * N;
    var A1 = 0;
    var A2 = 0;
    for (var i = 0; i < draws; i = i + 1) {
        // p 乘嘅數值代表基因 P 有幾有利生存繁殖，嗰個數值愈高愈表示基因 P 有利生存繁殖。
        if (Math.random() <= p * 1.01) { // 喺呢個個案入面，0.5 * 1.01 大過 0.5，所以 A1 嘅數值比較有可能上升。
            A1 = A1 + 1;
        }
        else {
            A2 = A2 + 1;
        }
    }
    p = A1/draws; // 將 p 設做一代後，基因 P 喺個族群當中嘅出現頻率。如果 p 上面乘嗰個數大過 1，噉 p 嘅數值傾向會升。
    simulation_data.push(p);
}

function simulation(simulation_counter) { // 呢個子程序負責做模擬。
    p = 0.5; // 設 p 做 0.5，即係個族群入面一半個體有基因 P。 
    for (var i = 0; i < generations; i = i + 1) { // 行 200 代（設咗 generations = 200）。
        next_generation(data[simulation_counter]); // 行 next_generation 呢個子程序，行 200 次。
    }
}

// 個主程序喺呢度。
for (var i = 0; i < simulations; i = i + 1) { // 做 10 次模擬（設咗 simulations = 10），
    data.push([]); // 每次都將計出嘅數據放入 data[] 呢個 array 嗰度。
    simulation(i); // 行 simulation 呢個子程序。
}
draw_line_chart(data,"Generation","p",["Population Size:",N,"Generations:",generations]);
// 最後畫條線，以 X 軸表示代，Y 軸表示 p；如果「p * 1.01」當中 p 乘嗰個數大過 1，通常條線會係一條有好多起起跌跌、但總體偏升嘅線。

軟件工程
螺旋模型嘅圖解
内文：軟件工程
軟件工程（software engineering）係指用工程學方法開發電腦軟件嘅過程。軟件工程師會了解佢哋開發嘅軟件要滿足乜嘢需要，然後按照佢哋對呢啲需要嘅分析以及電腦程式編寫等嘅電腦技術，決定要使用嘅軟件架構，並且設計同建構出一隻行得嘅軟件，然後會做測試，而喺隻軟件出咗街之後，佢哋仲會攞用家嘅評價同更新嘅軟件。
軟件工程領域仲會對「做軟件工程應該要做乜嘢工序」等嘅課題作出思考。例如螺旋模型（spiral model）就係一種喺 1980 年代尾興起嘅軟件開發方法；用螺旋模型開發一隻軟件嘅過程包括若干次迴轉（loop），每次迴轉都係
以決定目標（determine objectives）起始，
然後諗吓乜嘢最有可能搞喎成個項目同度吓要點應付（identify and resolve risks），
跟住郁手整原型（development and test）同
計劃下一次迴轉（plan the next iteration）；
螺旋模型喺遊戲製作等嘅軟件開發過程上好使好用－要整出一個可以做測試嘅遊戲程式好多時要花好耐時間，一旦有其中一個部份後嚟先發覺有問題（例：一個創新嘅遊戲機制，做完試玩先至知冇想像中咁好玩）會嘥好多時間，於是遊戲製作師就要用螺旋模型，喺郁手整之前就諗好嗮有乜可能會出錯嘅地方同點應對（例：喺整 beta 途中，特登將隻遊戲設計成冇咗嗰隻新機制都仲行得到）；軟件工程師會思考好似噉嘅模型，嘗試提高軟件工程界開發軟件嘅效率。

遊戲製作
内文：電子遊戲製作
電子遊戲製作（video game development）係指製作一隻電子遊戲嘅過程，屬軟件工程嘅一個子領域。電子遊戲係以電腦軟件型式存在嘅遊戲，遊戲設計師同製作師會負責設定隻遊戲嘅規則同美學，務求令玩家開心過癮，而一個覺得開心過癮嘅玩家會願意使錢，買嗰隻遊戲同隻遊戲嘅相關產品－呢樣係所有媒體嘅遊戲設計同製作嘅共同目標。廿一世紀嘅電子遊戲設計以及製作係一個高度專業化嘅領域，要製作一隻電子遊戲，製作者需要做多個工序：佢哋要諗好隻遊戲點玩，再做好程式編寫（仲可能會用到人工智能技術）、電腦圖像製作以及為隻遊戲作故仔等嘅工作，途中用到唔少電腦科學以外嘅知識同技術；跟手佢哋仲要試行試玩吓隻初型，發覺到有問題就要返轉頭執；搞掂出得街之後，佢哋仲要度「點樣為隻遊戲做宣傳」等嘅問題，而且喺出咗街之後，製作組往往仲要喺社交媒體等嘅地方留意玩家俾嘅意見，睇吓隻遊戲有冇乜嘢需要再執。
一隻製作早期嘅遊戲；喺整遊戲嗰陣，製作組通常會用低質圖像頂住檔先，試行吓個遊戲嘅程式－遊戲程式喺呢度應該經已處於行得到嘅狀態。

人工智能
2018 年《AI for Good》峰會嗰度展示嘅機械人蘇菲亞；佢內置人工智能，曉用語言同人傾偈。
内文：人工智能
人工智能（artificial intelligence，簡稱「AI」）係電腦科學同心靈科學嘅交界領域，專門研究點樣用各種嘅演算法教一部電腦展示好似人類噉嘅智能：一嚿物體如果有能力感知佢四圍嘅環境並且按照所得嘅資訊嚟提升自己達到目的嘅機會率嘅話，噉佢就算係一個智能體（intelligent agent），包括人類在內嘅動物都符合呢個定義，而人工智能領域嘅目標就係研究點樣人工噉整一啲智能體出嚟－自自然然，正如機械工程師喺設計飛機嘅翼嗰陣會參考雀仔嘅翼，研究人工智能嘅科學家就要參考現實世界嘅認知系統，並且嘗試整出模仿呢啲認知系統嘅人工智能。

心靈系統
有認知科學家提出，心靈可以分做多個子系統，而當中每一個子系統都負責某啲認知功能，而且每個都可以用一啲演算法嚟模擬，並且創造出能夠展現認知能力嘅機械。用高度抽象化嘅虛擬碼表達嘅話，一個可能嘅心靈模型如下：
感知系統（睇埋機械感知同電腦視覺）
   Input：外界嘅物理刺激；例：視覺感應器傳一串串 144 100 89 等嘅碼，每串表示環境每一點有幾多紅幾多藍幾多綠。
   機制：可以睇吓深度學習。
   Output：描述外界嘅資訊，例：122 代表「有隻貓」，456 代表「有道門」。
 
 注意力系統
   Input：主要係感知系統嘅 output 同決策系統嘅 output
   Output：注意力要擺喺邊；例如傳個 output signal「(248, 987)」去感知系統嘅控制器嗰度，表示「視線要移去空間嘅 (248, 987) 嗰點」。
 
 記憶系統
   Input：各系統嘅 output
   Output：儲起做記憶嘅資訊（睇埋記憶體）。
 
 知識系統
   Input：記憶儲起咗嘅資訊
   機制：睇埋知識表示同機械學習
   Output：一啲描述「呢個世界係點運作」嘅數學模型，例子可以睇貝葉斯網絡。
 
 決策系統
   Input：各系統嘅 output
   機制：按照知識系統嘅模型估計自己每個可能行動方案會做成乜嘢結果，計吓邊個結果對自己嚟講最理想；Foreach 可能行動，計個行動嘅效益。
   Output：有個 output 傳遞去行為產生器（behavior generator）嗰度，個行為產生器會直接駁落肌肉等嘅力學部份嗰度，令個系統可以採取行動。
... 等等。

簡史
亞倫圖靈嘅相，喺 1928 年影嘅；佢對運算理論同人工智能等嘅領域作出咗重大貢獻。
内文：電腦科學史
電腦科學當中嘅某啲諗頭可以追溯去未有現代電腦嘅時代。遠古嘅人類發明咗好多架生嚟計數，好似算盤噉，而且中世紀（5 至 15 世紀）經已有數學家喺度諗有關演算法嘅概念。不過當時嘅世界未有任何可以算得上係「電腦」嘅機械，所以電腦科學頂櫳都淨係存在喺理論性嘅思考當中。
現代電腦最早可以追溯至 17 世紀：當時有德國學者威廉嶭卡（Wilhelm Schickard）同德國數學家萊布尼茲（Gottfried Leibniz）分別喺 1623 年同 1673 年發明咗機械性（用力同物件嘅移動做運算）嘅計數機，可以算係為「曉計數嘅機械」呢個諗頭創咗先河，當中萊布尼茲完善咗－對現代電腦嚟講好重要嘅－二進制系統，俾人視為史上第一個算得上係「電腦科學家」嘅人。
19 世紀係現代泛用電腦嘅開端：1820 年，開始有咗量產計數機呢家嘢，而喺 1822 年，英格蘭數學家巴貝治（Charles Babbage）諗出咗「可以做編程嘅計數機」嘅諗頭，即係所謂嘅分析機（Analytical Engine）；喺 1834 年，巴貝治開始著手研究分析機嘅諗法，兩年間就諗出好多同現代電腦相近嘅概念，所以巴貝治俾好多人覺得係現代電腦之父。打後英格蘭數學家勒芙蕾絲（Ada Lovelace）喺 1843 年嘗試翻譯一篇關於分析機嘅法文文章嗰陣，喺佢加入嘅譯者筆記入面記錄咗一個計白努利數嘅演算法，可以話係世界上第一個電腦程式。
廿世紀上半橛係電腦科學萌芽嘅時代：喺 1930 年代，亞倫圖靈（Alan Turing）開創咗運算理論同人工智能嘅思考，諗出咗圖靈機（Turing machine）等現代電腦科學都仲會用嘅諗頭；喺 1937 年，候活·艾肯（Howard Aiken）成功說服 IBM 建造佢（基於巴貝治嘅分析機）構想出嚟嘅超大型可編程計數機；打後喺 1940 年代，又有人開始整更新更勁嘅計數機，仲開始咗嗌呢啲機械做 computer ，而紐約市嘅哥倫比亞大學喺 1946 年推出人類史上第一個有學分嘅電腦科學課程－即係話電腦科學正式成為咗一門獨立嘅科學工程學問。