C/C++ 不是我們需要的資訊教育
在 108 新課綱的科技領域中,加入了大量的資訊教育課程,先誇獎教育部終於有長進了,國高中每週會有兩節課,上下學期分別教資訊與生活科技;高中還會有 8 學分的選修,內容是「進階程式設計」、「工程設計專題」;領域課程「機器人專題」、「科技應用專題」。
我認為這是正確的方向,首先讓「用電腦」不再是件「不務正業」的事,說實話我們這些因為興趣而自學程式的人,最開始也不是在寫程式,通常是在玩遊戲,因為「喜歡」產生的「興趣」,讓我們想去做遊戲,從而接觸了程式語言。
當然義務教育不能是「玩」,資訊科技課綱裡主要以「演算法」為教學重點。演算法是一種充滿邏輯的思考方式,學會演算法我認為對於解決問題會很有助益,但是演算法的重點應該不是「記熟各個演算法」,而是在面對不同問題時,學會組織各種演算法來有效率的解決問題。
演算法也很適合跟數學結合,以往數學教育都是要求「算出解答」,但對於「計算過程」卻不夠看重。演算法式教學可將數學問題改成:設計一個算法來解決問題,學生需要思考的就不是當前的數字,而是如何在所有可能的輸入中都能算出正確的解,這樣的教學方式我認為才是最能鍛鍊思考能力的。
108 課綱在今年上路,由於在新制中初中已經有資訊教育課程,所以在暑假期間高一新生就得先上「銜接課程」,結果傳出有些學校老師 用 C/C++ 來上課 。
工程師的「缺德行為」
網路上有個流行的說法:叫朋友從 C/C++ 入門,是一個工程師的缺德行為。C/C++ 是一個歷史悠久的語言,貝爾實驗室為了製作電腦作業系統而發明的程式語言,讓工程師從組合語言中解脫出來,也影響了日後許多的程式語言。
C/C++ 很好也很重要,C/C++ 也能夠在很多地方使用,但 C/C++ 就是不適合教新手。
C/C++ 是靜態語言,意思是它的變數需要定義型別且不能改變,這對新手是一個困難;C/C++ 是編譯式語言,程式必須先經過編譯才能執行,編譯過程對新手也是一個困難。
再來是最大的問題,C/C++ 語法複雜,且在 AI、網站後端、App 等領域較不適合,現在通常是用其他的語言來設計,C/C++ 只會用來實做底層的功能。
簡而言之,你寫 C/C++ 的程式,在執行它享受程式運行的快感之前,有太多準備工作需要做了,這容易讓新手感到挫折,何況今天目標是所有的學生。以我聽到的情況,他們老師教 Hello World 花了三個小時,讓許多學生誤以為「程式很難」。
另外,學校的 C/C++ 有時教的甚至還不是最新的標準,可能是因為網路上知名教學網站大部分都不是最新標準,導致老師在參考時就很可能有誤。
資訊教育需要做出「應用」
從這些執政者大學畢業到現今的十幾年間,已經出現了很多很棒更適合新手的語言,能夠讓初學者在很快的時間內做出「看得到」的成品,Hello World 只要一行搞定。
建議初學者入門的程式語言,我會選擇 Python 以及 JavaScript,這兩者都是動態直譯式語言,不需要設定型別、不需要編譯,也有著豐沛的生態環境,要做什麼應用都有現成的函式庫可以使用,而且大多都是開源的。
舉例來說,一個 C 的 Hello World 是這樣:
#include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; return 0; }
那關於這段程式,我們就要解釋第一行是要使用系統的輸入輸出的功能(例如 std::cout
這個函數)。using namespace std
代表我們要使用std命名空間的函式。而 main
函數則是程式最開始執行的地方,而 cout
就是將字串印到標準輸出裡(stdout,通常就是 terminal),最後 return 0
則是代表這個程式運行的結果(0 代表正常)。
以下則是 Python 的 Hello World:
print("Hello World")
沒錯就是這麼簡單,因為 Python 是直譯式語言,所以程式就是從第一行到最後一行,不需要寫什麼 main。
更多 Python 與 C/C++ 的比較,我們可以用課綱中的八年級才教的 「陣列程式設計實作」 為例(其實我很傻眼陣列有什麼好教一整個學期的),一個 C/C++ 的陣列,需要定義內容裝載的是「什麼型別的資料」,還需要定義長度;而一個 Python 的陣列,什麼都不用定義,把東西裝進去就好。
# Python mylist = [] #先用一個串列 count = input(":") #輸入有幾個元素 for i in range(int(count)): mylist.append(int(input(":"))) #利用迴圈一個個讀取,並加入串列 # 過了很久,想要再加入一個數 mylist.append(int(input(":"))) #瞬間解決
Python 的陣列可以輕輕鬆鬆改變長度,利於學習者,適合快速的使用,十分人性化。
// C/C++ int count; scanf("%d", &count); int mylist[count]; for (int i = 0; i < count; ++i) { scanf("%d", mylist[i]); } // 過了很久,想要再加入一個數 // 怎麼辦,我的陣列不夠大
在 C 語言中,對新手最大的困難莫過於 C 的陣列長度是固定的,而程式需要處理的資料往往是不固定的。當然 C 有方法變更陣列大小,但對新手而言真的太困難了,在這種情況下,常常會造成新手認為這個語言竟然無法完成想要的應用,並且讓新手得不到成就感。
Python 也能更快的做出 GUI 程式、網頁伺服器、深度學習,事實上以政府力推的 AI 教育方向來看,教 Python 能讓學生在學習 TensorFlow 這類深度學習框架時更得心應手。
能夠快速的用程式做出「應用」,才能讓學生有成就感,有興趣自主學習,這才是「素養」該帶來的成效,而不是讓學生害怕程式,塑造「程式語言很難」這樣的錯誤認知。
課綱以「演算法」為教學重點,而 Python 這類專注於易用性的語言,才能讓學生專注在「邏輯思維」而不是「語法」。
課綱並沒有明定要以什麼程式語言教學,我想之所以有些學校會選擇 C/C++,是因為老師只會 C/C++,畢竟 Python 在 1991 年發明,至今也不過 28 年,有多少電腦老師在畢業後就沒有再寫過程式,何況是學習新的程式語言?Python 在老師們讀大學的時候也許根本還沒被發明。
不只是新課綱,技職體系的資訊領域也是已經脫節了幾十年,新的程式語言、新的技術往往教育界根本不懂,結果課綱雖然改了,上的內容依然是十幾年前的技術。
身為一個自學程式的學生
其實作為一個愛好程式的人,我對於政府要將程式語言納入義務教育充滿猶豫,因為程式的學習方式其實與傳統的教育差距很大,自學是學程式最有效率的方式,試著自己去做一些應用,在過程遇到瓶頸,上網學習如何解決,這就是寫程式。
跟傳統教育由老師教課的方式很不一樣,以往電腦課老師總是先做一遍再讓學生練習,這樣真的很低效又無聊,讓學生覺得沒有挑戰性,只會浪費寶貴的上課時間。學程式應該是個人對於解決問題的練習,而老師只須提供引導及適當協助即可。
教育系統總是笨重而不知變通,往往原本學生會有興趣的事,放到教育系統中就變得無趣而困難,這是我對資訊教育的憂心,從「C 語言授課」就能從中看出「義務教育把程式的樂趣毀滅」的跡象。
這樣的資訊教育,也許根本無法帶來改變。
// 感謝 C 語言基本教義派的 @蕭朝鴻 a.k.a. TNPLR 協助修訂
參考資料
本文首發於wancat.cc