C/C++ 不是我們需要的資訊教育
![](https://assets.matters.news/embed/cd48e7a2-042f-41de-8896-5624a0b594d7/6691167811-440ed057ba-z.jpg)
在 108 新課綱的科技領域中,加入了大量的資訊教育課程,先誇獎教育部終於有長進了,國高中每週會有兩節課,上下學期分別教資訊與生活科技;高中還會有 8 學分的選修,內容是「進階程式設計」、「工程設計專題」;領域課程「機器人專題」、「科技應用專題」。
我認為這是正確的方向,首先讓「用電腦」不再是件「不務正業」的事,說實話我們這些因為興趣而自學程式的人,最開始也不是在寫程式,通常是在玩遊戲,因為「喜歡」產生的「興趣」,讓我們想去做遊戲,從而接觸了程式語言。
當然義務教育不能是「玩」,資訊科技課綱裡主要以「演算法」為教學重點。演算法是一種充滿邏輯的思考方式,學會演算法我認為對於解決問題會很有助益,但是演算法的重點應該不是「記熟各個演算法」,而是在面對不同問題時,學會組織各種演算法來有效率的解決問題。
![](https://assets.matters.news/embed/99c691b8-a5c8-4c03-a581-5f3ddac620b4/課綱-1.jpeg)
演算法也很適合跟數學結合,以往數學教育都是要求「算出解答」,但對於「計算過程」卻不夠看重。演算法式教學可將數學問題改成:設計一個算法來解決問題,學生需要思考的就不是當前的數字,而是如何在所有可能的輸入中都能算出正確的解,這樣的教學方式我認為才是最能鍛鍊思考能力的。
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
Like my work? Don't forget to support and clap, let me know that you are with me on the road of creation. Keep this enthusiasm together!