「學習的第二層是你有沒有辦法教到別人會」-導讀外文系同學 CS50 系列課程回顧與心得


Posted by ralphhong5465 on 2024-09-01

(本文所有內容禁止媒體引用)

先前看 AppWorks School 的《軟體工程師以外的職涯選擇?加入 AppWorks School!成為學生的巨人肩膀》影片,當中現職 Google 工程師的前導師 Arthur 提到:「(學習的)第二層是說,你有沒有辦法教到別人會」,這跟第一層的「自己會」是完全不同等級,因為這代表對於教學內容的理解要更深刻。


03:38:「(學習的)第二層是說,你有沒有辦法教到別人會」

能不能「把別人教會」是驗證自己是否確實掌握一項知識的絕佳方法,在今年的三月到六月間,我終於感受到帶領別人一同探索電腦科學領域的樂趣!

回顧那痛苦的學習歷程

我在 25 歲開始接觸電腦科學領域,在那之前,不管是資訊、乃至於整個第二類組的世界都極度陌生,旁人講的前端、後端、資料庫、伺服器、行動通訊網路,或者各類語言如 Python、C、C++、C#、Java、JavaScript、R、SQL 等,全部都有聽沒有懂,不要說連個 "Hello, world!" 都不會寫,甚至剛學會用 HTML 搭配 CSS 切版,就以為自己已經開始在寫程式了。

那是個還沒有 ChatGPT 的年代,又是在家上網買課自學,過程十分孤單;後來雖然有幸加入享譽盛名的程式培訓機構 AppWorks School,卻因為用錯方法學習、不知道自己在哪,幾乎都是全班最後一個交作業,永遠跟不上別人的進度讓我大受打擊,要不是有另外找工程師朋友幫忙、以及《程人頻道》的陪伴,我是非常有可能成為極少數「自主退訓」或「被退訓」的學員之一。

要一直到進入研究所第二學期、ChatGPT 等 AI 工具誕生後,這樣的情形才逐漸好轉,我逐漸了解自己學的東西、還有之後要學的東西,到底在整個電腦科學領域扮演什麼角色,還有要達成某些任務時,需要補足的技能及思考面向有哪些,從瘋狂撞牆到建立自信心,大概花了一年半的時間,讓我常常不禁在想:如果從一開始就有人引領我認識這個領域,讓我少踩一點雷、少走一些彎路、少冒出一些錯誤想法,那該有多好呢?

教學初體驗的契機

研究所第四學期剛開學不久,一位之前在社團認識的外語學院大一同學問我有沒有聽過「AI 溝通師」這類工作、還問是否可以修什麼課認識相關知識,後來又聊了一陣子之後發現:這位同學不是真的對「AI 溝通師」有興趣,而是身在就業市場相對吃虧的外語科系,想在本科之外學習對未來求職「可能比較有用的東西」,而人工智慧、甚至說是整個資訊領域感覺正是個充滿機會的地方,但在對這領域完全沒有概念的情況下,就先從看起來比較好上手的「AI 溝通師」開始問起。

我不只打開「AI 溝通師」職缺網站說明我對這個角色的理解(當中還穿插一些教授的想法哈),更另外花了一段時間跟這位同學分享電腦科學領域大概包含哪些內容,例如資訊系所必修課程、各研究室研究主題、轉職培訓班教學項目、資訊科學領域常見名詞介紹等等,以及我自己在轉到這個領域之後,看待相關議題視角有什麼樣的改變。在分享的過程中,我不斷想到 25 歲之前、對這個領域還完全沒有概念時的自己,那是個想認識這些內容、卻搞不清楚要從何開始而感到徬徨的青澀時光,讓人害怕的不是還沒學習、而是根本不知道要如何開始學習。


電腦科學的相關概念,在這部影片裡幾乎都有提到

對於在校生來說,「修課」或許是許多人選擇認識一個新領域的方式,但在有作業、考試的壓力下,修到喪失興趣、從此放棄的大有人在(大概跟我大學修外語課差不多);再者,如果從本科系的課開始修,那難度多半已經大幅超越「只是想認識這個領域在做什麼」的人所需,但如果從通識課開始修,則內容常常過度簡化,不容易看到這門領域的核心。

不然我們從 CS50 開始吧?

我提出這個想法,主要是對方才大一、也沒有說要轉職成工程師,跟學習那些「即刻有用」的工具相比,我相信「建立運算思維」這能力將能陪著他走得更久、更遠,而 CS50 是非常著名的線上電腦科學入門課,授課方法生動有趣、但也不會教太簡單,可以讓學習者用相對輕鬆的方式看到電腦科學領域精髓,而且完全免費!

這門課對他來說,將是認識一門新領域的開端;而對我來說,則是要第一次挑戰「教人(嚴格來說是導讀)」。CS50 雖然是入門課程,某些內容還是有一定的難度,對於零基礎的人來說,可能依然不是那麼好理解,而能否完整向初學者說明授課內容,將是驗證我是否已經掌握相關知識的絕佳方法。畢竟在電腦科學領域待了將近兩年,CS50 我根本還沒看過,課程最開始教的 C 語言,我也才剛學不久。

從引起興趣開始:Lecture 0 - Scratch

CS50 的第 0 堂課標題是 Scratch,是一個帶有程式邏輯概念的知名遊戲,但長達兩小時的課程當然不是全部都在講 Scratch,亦提到二進制、ASCII 表、Unicode、一點點的演算法、人工智慧等內容,並在講解二元搜尋法時,簡短提到時間複雜度概念,這時出現了一個需要按下暫停、花時間講解的數學名詞:對數(log)。

對數是高一上學期數學課的內容,從指數延伸而來,但如果後來沒有用到,全部忘光光也是很正常的。於是我從指數開始講起、慢慢帶到對數定義,終喚起這位同學高中數學課的記憶,有辦法理解對數符號代表的意義、還有為何二元搜尋法的時間複雜度為 O(log n)。不過對於對數的認識就到「定義」即可,後面更深的內容如對數運算,其實在現階段也用不到。

第 0 堂課的後半段展示很多好玩的 Scratch 遊戲,結尾還有哈佛鱷魚樂團(The Harvard Krokodiloes)與女阿卡貝拉合唱團 The Radcliffe Pitches 帶來的演出,讓課程如一場大秀。記得結束時聽到該位同學說:「好有趣喔!」看來,我找的教學素材沒有挑錯。


CS50x 2024 — Lecture 0 — Scratch

進入程式語言的世界:C

在第 0 堂課中,雖然有講到一些程式語言的邏輯,但其實還沒開始「寫程式」。第 1 堂課終於打開編譯器,開始打那些以前看工程師在寫的奇怪符號。

就跟所有人學習任何新程式語言一樣,我們寫的第一行程式正是 "hello, world",但因為使用的語言是 C,還要另外解釋何謂「函式庫」,還有 int main、void 各自代表的意思,比 Python 等其他常見入門語言複雜一些。


我們寫的第一行程式碼,當時尚未提及代表換行的 \n

CS50 的進度飛快,半小時內就講完資料型別、變數、條件判斷(提到布林值 true/false)、流程控制(也就是 if/else)、運算子等很多通識課可能會講超過兩個星期的觀念,但上述內容其實都不困難,真正讓新手開始頭痛的內容,通常是「迴圈」。

第一個挑戰:迴圈

對於完全沒有碰過程式的人來說,要理解迴圈的寫法與邏輯十分痛苦,我非常能夠體會這樣的心情,因為自己在初學迴圈時,也是百思不得其解,好不容易知道怎麼印出 1~10,結果看到題目要用迴圈做循序搜尋、字串反轉或寫聖誕樹,卻完全不知道怎麼下手。

我參照坊間教科書的題目,讓他試著用 for、while 與 do...while 三種迴圈,寫出 1+2+...+100 的等差級數,再用雙層迴圈寫出九九乘法表,別看這些好像都是秒殺題,當我們還沒建立「運算思維」,根本連如何下手都不知道。

運算思維

我們從令一個變數 sum=0 開始,帶入 sum=sum+i 的賦值運算觀念,再慢慢推出 i=1、i=2、i=3... 時,sum 的變化過程,於是寫出類似下面的算式:

  • sum = 0
  • i=1, sum=0 -> sum=0+1=1
  • i=2, sum=1 -> sum=1+2=3
  • i=3, sum=3 -> sum=3+3=6
  • i=4, sum=6 -> sum=6+4=10
  • i=5, sum=10 -> sum=10+5=15

再帶到最後的 i=100, sum=(1 加到 99 的數) -> sum=(1 加到 99 的數)+100=5050。

等確定這樣的流程都能理解,我們才回頭看 for、while 與 do...while 迴圈的寫法,再看如何以這三種迴圈實現上述的運算邏輯,如果跑出的結果不如預期,則透過觀察輸出、在迴圈中加入更多 printf() 等方式檢視運算過程,慢慢找出問題、並加以解決;後面用巢狀迴圈寫九九乘法表時,也用一樣的方法,透過寫出 i 與 j 兩變數的變化,看外層與內層的變數要怎麼搭配,才能跑出我們想要的結果。

自行除錯與找答案

為了這幾道題目,我們折騰了大約兩個星期,這段時間可是讓他深刻體會到「作業寫不出來」、甚至「問 AI 也不知道從何問起」的痛苦。在第一週時,我帶領得較為主動,幫他找問題、想解法;但到了第二週,我提供的協助大幅下降,引導他自己找到錯誤、自己想出或查出解法,哪怕是問 AI 問到的答案,我也會讓他跟我解釋 AI 寫的內容,感受資訊領域學生自己除錯、查答案的過程,而非像我在初學程式時,只要跑出來的結果不如預期,就把程式碼與執行結果貼給線上課程老師,問到後來明顯感受到老師要我「具備基本的除錯能力」。我想,沒有早一點學會「自己找答案」,是我在初入資訊科學領域時,踩的一個大坑。

使用命令列介面

當我們開始用 VS Code 等編譯器寫程式,便無可避免地會接觸到一個新名詞:終端機(terminal),程式碼的編譯與執行結果都會在這裡顯示。在多數人第一次接觸電腦時,都是使用相對容易上手的圖形使用者介面(Graphical User Interface,GUI),但對於許多開發者而言,命令列介面(Command-line Interface,CLI)反而因為操作起來更快而成為較常使用的工具。對於完全沒接觸過 CLI 的人來說,看到有人在深色底、白色字的小視窗打各項命令宛如變魔術,待實際示範達成同一目的(如創建檔案、創建資料夾、刪除檔案、移動檔案等)使用 GUI 與 CLI 的操作過程,將能明顯感受到效率的差別,前提是要對 Linux 指令夠熟,最常見的 pwd、ls、touch、mkdir、cd 等我都一一介紹。

陣列與字串

第 2 堂課進入陣列,開始帶到「記憶體」的觀念。有別於多數程式語言,C 語言並沒有「字串」這個資料型別,而是用「字元陣列」表示,但由於此時尚未提及指標,CS50 課程都是用 <cs50.h> 函數庫,讓我們得以直接使用 string 這個被 CS50 團隊定義好的資料型別。

陣列代表連續的記憶體空間,其一大特色是具有「索引值」,可以讓我們快速抵達想要的記憶體位置,且因為代表的是記憶體位置偏移量,所以索引值從 0 開始、而非從 1 開始。這在一開始接觸時,或許需要特別花心思去記,但因為陣列實在太常出現,通常是後來不知不覺就習慣了。

語法不用刻意背、學會看文件就好

程式學習基本上都是從「模仿」開始的,別人打什麼、我們就跟著打什麼,再試圖從中理解撰寫邏輯,還有可以如何透過改寫,調成我們想要的功能。CS50 的課程資源相當完整,連專屬的文件都有,其中包含一些 CS50 自有、C 語言本身未定義的函式如 get_string()get_int()。我帶著他一邊看課程影片、一邊練習時,也打開文件對照,讓同學從學習程式的最初期,就慢慢養成「查閱文件」的習慣,我們並非只能參考官方文件,在 AI 工具流行之前,MDNW3SchoolsGeeksforGeeksStack Overflow 或各路大神在 Medium 等平臺發表的技術文章都是尋找答案的好去處。

當我帶著同學寫一些流程控制搭配條件判斷的變化題,他看著文件問我:「可以複製貼上嗎?」我不禁想起自己在剛學程式的第一年,還真的以為所有程式碼都要有辦法「一行一行用手打出來(因為線上課程的老師都是這樣示範)」,這讓我在 AppWorks School 受訓時吃足苦頭,要一直到進入研究所之後,才開始慢慢領悟「複製貼上」這人人都在用的絕招。我們不可能永遠記得所有程式語言的語法,重點是解題思維,有了思維,要怎麼用特定語言的語法實現都可以查,哪怕是程式測驗也都可以參閱相關文件。待某個語言寫久了,常見的語法就會很自然地背起來,但這位同學才剛接觸這些程式語法,要從文件複製貼上後,再針對需求進行修改是完全沒問題的。

進入電腦科學核心:演算法、資料結構

對於第一次接觸程式的人來說,哪怕是基本的流程控制、條件判斷、迴圈等都要耗上不少的時間理解,雖然 CS50 這兩堂課的總長度還不到 4.5 小時,但中間穿插按暫停講解、額外練習,導致我們花了大概有 8 小時都在這些內容上,再看著接下來 CS50 的課程安排,我發現要在一學期內看完全部影片已經不可能,於是提出兩個選項:

  1. 依照課程安排,從比較難的單元如演算法、資料結構開始,而且全部都是用 C 語言教學。
  2. 跳過較難的單元,直接從相對簡單、有趣、且可能對他來說更實用的 SQL、Python、HTML、CSS、JavaScript 開始。

雖然寫迴圈已經讓他痛苦萬分,但他依然很有勇氣地選擇第一個選項,原因是:那些比較簡單的單元,或許之後可以自己找時間看。

他願意做這樣的決定讓我十分佩服,而這對我來說,也是一個挑戰的開始,雖然有學過相關內容,但當初是用 JavaScript 學的,現在改用 C,我自己在導讀前勢必自己也要先看過影片、並且徹底理解,否則可能進入連我都看不懂、完全無法導讀的窘境。

演算法

CS50 介紹演算法的方式十分生動,讓在場學生以真人演示電腦在做的事情。課程前半段包含線性搜尋、二元搜尋;後半段包含選擇排序、氣泡排序與合併排序三種排序方式,以及合併排序中用到的「遞迴」概念。每種演算法的介紹方式都是由在場學生示範完後,再帶到這些演算法的「偽代碼」,最後才進到真正的程式碼,其實跟我們實做的過程一模一樣,但在討論不同的演算法時,我們關注的不只是其實現方式,還有更關鍵的核心觀念:複雜度。

提到「迴圈解」與「遞迴解」時的手寫筆記,右圖中的河內塔為額外補充

複雜度

應該沒有資訊相關科系的學生不知道什麼是「複雜度」,這根本就已經內建在所有人的本能中。複雜度包含「時間複雜度」與「空間複雜度」,有 Big O 衡量最糟情況、Big Ω 衡量最佳情況,以及最糟與最佳情況相等時使用的 Big Θ。我們並沒有從學理層面探討這些符號的嚴謹定義與數學意義,單純從直觀的角度比較各演算法最好、最佳與平均情況的複雜度,進而去感受從空間或時間觀點而言,哪些屬於比較「好」的演算法、哪些又屬於比較「不好」的演算法。


講解複雜度時的手寫筆記

資料結構

資料結構課程從介紹堆疊(stack)與佇列(queue)開始,緊接著透過程式碼演示,說明若僅使用記憶體空間連續的「陣列」,則該陣列記憶體空間用滿時將會多麼麻煩,而跟陣列對應、使用非連續記憶體空間的線性資料結構則有「鏈結串列(linked list)」,這可說是整個 CS50 中難度最高的部分,就算先前已經用 JavaScript 學過相關概念,要改用 C 理解依然有非常大的鴻溝,我花了約三天反覆觀看影片、搭配與 ChatGPT 的討論,才逐漸理解授課內容,實際帶同學導讀時,則不斷按暫停、手繪課程演示中程式碼運行的流程。

課程後半段提到樹(tree)、雜湊表(hash table)與字典樹(trie),不過都僅是簡短介紹相關概念,並不像鏈結串列有很仔細地說明操作該資料結構的方式與流程,也沒有現場程式碼實做演示,不過這每一個主題都可以花上三節課慢慢講,經過鏈結串列近 45 分鐘的折磨,後面的內容沒講那麼深也是合情合理。


講解「鏈結串列」時的手寫筆記

指標

改用 C 語言學習鏈結串列之所以如此痛苦,主要是因為當中包含了「指標」。指標是多數人學 C 時會面對的大魔王,光一個「*」符號可代表兩種意思就常常讓人摸不著頭緒,更不用說「&」一起加進來有多麼凌亂。不過也正是有帶到指標觀念,搭配 malloc()、free() 的操作,我們才能對記憶體實際的調配狀況有更深入的感受,原本一直套用 <cs50.h> 函式庫的 string 資料型別,也終於回歸 C 語言原有的寫法 char *,並從 get_string()get_int() 等函式改用 scanf() 接收輸入(不過沒有提到更適合用來接收字串輸入的 fgets(),就要另外補充)。

Lecture 4 — Memory 課程中介紹指標之後,很快便帶到一個電腦科學領域非常重要的觀念:值傳遞(pass by value)與引用傳遞(pass by reference),這將影響到我們在函數間傳遞參數時,究竟傳的是「副本」還是「原始資料」,此差異是許多操作是否能如預期執行的關鍵。雖然嚴格來講,C 語言並沒有引用傳遞,只能透過傳遞變數的記憶體位址達成類似效果,在 CS50 課程的範例中,我們依然可看出以「副本」傳遞參數與以「指向原始資料的指標」傳遞參數之效果差異。

課程範例在 main() 主函式額外呼叫 swap() 函式,欲交換 main() 中 x、y 的值。首先是「值傳遞」的寫法:

#include <stdio.h>

void swap(int a, int b); // 值傳遞,傳遞的是參數int a與int b的副本,交換的是副本的值

int main(void)
{
  int x = 1;
  int y = 2;

  printf("x is %i, y is %i\n", x, y);  //執行swap()函數前,x is 1, y is 2
  swap(x, y);   // 值傳遞,改的是swap()函數裡的副本
  printf("x is %i, y is %i\n", x, y);  //執行swap()函數後,x is 1, y is 2,與執行swap()前相同

  return 0;
}

void swap(int a, int b) // 值傳遞,僅在swap()函數中交換參數int a、int b副本的值,不影響main()中的x與y
{
 int tmp = a; 
 a = b;
 b = tmp;
}

上述寫法因 swap() 只會處理到參數的副本,對原本 main() 中的 x、y 毫無影響,因此執行完 swap(x, y); 後,main() 中 x 與 y 的值依然不變。

但若改成透過指標傳遞參數記憶體位址,則 swap() 將可直接改到 main() 中 x、y 的值如下:

#include <stdio.h> 

void swap(int *a, int *b);     // (類似)引用傳遞,改傳遞參數指標

int main(void) 
{ 
  int x = 1; 
  int y = 2; 

  printf(“x is %i, y is %i\n”, x, y);  //執行swap()函數前,x is 1, y is 2
  swap(&x, &y);    // (類似)引用傳遞,傳入x與y位址,讓swap()函數可直接改到x與y
  printf(“x is %i, y is %i\n”, x, y);  //執行swap()函數後,x is 2, y is 1

  return 0; 
} 

void swap(int *a, int *b)   // (類似)引用傳遞,透過指標可直接改到main()中的x與y
{ 
  int tmp = *a;
  *a = *b; 
  *b = tmp; 
}

一邊教、一邊學

怎麼不小心就偷渡一點技術的內容進來了?這說穿了也算是我「教學/學習筆記」的一部分。

C 語言對我來說並不是熟悉的語言,因此,到了 Lecture 4 — Memory 開始,我都是提前幾天先看過影片再帶導讀,第一次看的時候也是狂按暫停、反覆播放,但很神奇的是,到了真正導讀時,我發現一開始聽到頭腦一片空白的內容,已經可以一步一步解釋給該位同學聽,程式碼每一行在做的事情都能清楚交代,讓同學在兩個小時內就看懂鏈結串列那穿插超多指標、讓人看得頭昏眼花的程式碼,原本自己看仍有些迷糊的地方,為了講到讓對方聽懂,居然在解釋的過程瞬間理解。原來,這就是「學習第二層」的神奇魔力!

反思與收穫

記得大學時期的我,根本完全是電資理工世界的絕緣體,新聞說什麼科技業如何發展、人工智慧多麼火紅,我根本都沾不上邊,臺灣什麼產業發展多好多好,我可是一點紅利都吃不到。而到了現在,人工智慧相關產業更是被炒得水漲船高,在新聞與網路論壇的轟炸下,非常容易造成我們這以人文社會領域見長的學校瀰漫一股焦慮感與低氣壓。記得不久前參加商學院某系畢業、在科技業擔任產品經理的畢業生回來主講職涯座談,當中有人問:「非理工科系學生有什麼優勢?」,該名產品經理最直覺的回答居然是「沒有」。

根據先前跟其他學院同學交流的經驗,我發現很多人也曾經試圖「讓自己有競爭力」而選修程式課,但學來學去都只有基礎語法,很難感受到學會這些技能可以做哪些事情;或者到迴圈之類的主題,就因為作業寫不出來、考試只能硬背、查資料也不知道從何查起而直接放棄,但同學們後續實習、工作也有很大的機會依然要跟工程師合作,當雙方對於同一個任務的理解難以找到相近的討論基準點,在溝通上便要耗費更多心力。

重點不是寫程式,而是「運算思維」

從 C 語言入門對於新手來說極度不友善,但在本次的導讀中,我稍加衡量後依然決定照著 CS50 的課程安排,就從這相對麻煩的語言開始。或許很多人會說:非資訊背景學生學個高階的 Python、JavaScript 可以做事就好,又沒有要寫比較底層的功能,學這麼難的 C 語言有何作用?

我並不期待對方聽過後就「熟悉」指標的操作,但期盼透過這樣的導讀,會對這些主題「有印象」,或者至少知道處理這些操作,電腦記憶體的處理「很複雜」。課程中也帶到演算法、資料結構這些難度相對高的資訊科系核心必修,讓對方實際看到電腦科學相關領域的思維模式與學習重點,而非用 if/else 寫一點條件判斷,就覺得自己已經會寫程式。知道這個領域包含哪些內容、資訊科系學生受過哪些訓練,還有自己對於這些知識的掌握程度到哪、遇到不會的地方可以往什麼方向找資料,是我在導讀過程中,最期待能帶給對方的能力。

不是每個人都要親自寫程式,但若能建立「運算思維」,理解電腦如何執行任務、資訊科學領域人員如何思考,工作或生活上不管遇到任何問題,透過相關的邏輯思維、在腦中擬定可能的解決方案及其步驟,不要說能讓我們與技術人員溝通較為順暢,在使用現今已十分普及的 AI 工具時,也將能更精準地下提示詞問問題、更快找到我們要的答案。

當外文系同學也逐漸建立「運算思維」

整學期的導讀下來,最讓我有成就感的是:對方已經可以精準說明新學的資料結構、演算法操作的時間複雜度,並說明理由。

遙想剛在上 Scratch 時,他可是連對數都沒什麼概念,到了課程尾聲居然可以非常迅速地看出新接觸的資料結構與演算法不同操作之時間複雜度,還是用所有資訊背景人員共同語言:Big O 表示;透過 Big O 的比較,他還能說明為何在特定情境下,某種操作方式較好、某種方式較差,只要願意額外花時間動手寫程式,我覺得根本可以開始刷題了!(雖然刷題對於不打算當工程師的人來說,完全沒有必要)

比較可惜的是,因為時間有限,導讀完最困難的演算法、資料結構與指標之後,尚未能帶他一起看相對簡單的 Python、反饋感更高的 Flask、HTML + CSS + JavaScript 等,但相信經過這一學期的洗禮(折磨?),他已經更知道電腦科學領域是怎麼一回事,哪怕是日後再遇到沒聽過的內容,還是有辦法透過下更精準的關鍵字或提示詞,在搜尋引擎或 AI 工具上找到答案。

學員回饋

從國中就立定志向往文組發展,從來沒想過身為資工絕緣體的我有一天會接觸到這些東西。上大學時依著自己的志願選了外文系,然而唸了不久卻開始茫然,「純文未來沒有出路」、「翻譯很快就會被取代」等等諸如此類科技業興盛後常出現的言論,讓我開始產生「我真的該繼續唸下去嗎?」「會不會唸出來才發現這是一條死路?」的想法。因此,我開始涉略科技產業,知道自己無法和資工背景的人競爭,偶然看到 AI 溝通師這個職業,想到上學期社團認識的學長 Ralph,之後就如同學長所說,開始了一系列 CS50 的教學。

起初我保持著「認識看看」的心態,想著科技業既然是未來趨勢,也許學到的哪天能派上用場。因為過去對這方面可以說是一竅不通,學習的過程中多少有些吃力,但很感謝 Ralph 學長用深入淺出的方式帶我一一認識、講解,將這些我自己讀起來可能與古希臘文無異的電腦語言翻譯成白話文讓我理解。

學程式不僅是學習如何運用科技達成目的,更是一種邏輯思維的訓練,讓自己的想法在過程中一步一步具體化。雖然絞盡腦汁的過程很痛苦,但這項邏輯思考能力不僅在寫程式,運用在其他科目的學習,更甚至生活上的問題,都是十分有用的工具。我認為這學期的 CS50 學習收穫滿滿,建構了我對程式的認識以及訓練邏輯思維,更重要的是,建立了我對於資訊工程的信心,讓我未來更有意願和興趣接觸資工領域。

小結

記得高中的時候,我曾經試著教別人英文。英文算是我學起來相對輕鬆的科目,原本想說應該沒什麼問題,結果是出現「不知道為什麼對方不會」或「不知道這有什麼好解釋的」這些尷尬局面,最後不了了之。

後來我發現:要「教人」最好不要從自己擅長的科目開始,像電腦程式這種我在學的時候也踩了很多坑的,反而更能知道別人痛點。正因為我自己也經歷過一段相對辛苦的理解過程,要傳授相同內容時,才有辦法把所有思路通通講清楚,更不會出現「不知道為什麼對方不會」這種窘境。

我算是比較晚才踏入電腦科學領域、也不期待自己成為什麼資訊大神,在 AppWorks School 受訓時,永遠都只有追別人進度與被教的份,但十分慶幸的是:自己即便遇到這麼多挫折,還是一直非常喜歡這個領域,不論是知識、人與整體環境氛圍,都讓我十分熱愛,而我也不斷把自己對這領域的愛跟更多人分享,希望在這「重理輕文」的風氣之下,讓對這領域尚不了解、甚至因此感到焦慮的人,也能從中找到一些能切入的角度,並享受獲得相關知識與技能帶來的樂趣。


#電腦科學 #cs50









Related Posts

Vue Router-Day01 # 簡介與 在一般網頁中引入Vue Router

Vue Router-Day01 # 簡介與 在一般網頁中引入Vue Router

JavaScript 提升(Hoisting)概念

JavaScript 提升(Hoisting)概念

一起來讀 CRAM - A Cognitive Robot Abstract Machine for Everyday Manipulation in Human Environments

一起來讀 CRAM - A Cognitive Robot Abstract Machine for Everyday Manipulation in Human Environments


Comments