2016年4月23日 星期六

教孩子們一個 「實用到二十二世紀」 的程式語言

如前文所說, 我不確定教所有的小朋友寫程式是不是好事。 但是既然都已經進入課綱了, 如果必須教小朋友寫程式, 我會選擇哪一種程式語言呢? 在這個汰舊換新迅速、 選擇眾多的領域裡, 能夠找到 「無所不在、 可以讓孩子們用到二十二世紀」 的程式語言嗎? 二十幾年來堅持只學習 「跨平臺、 高組合力」 技術的貴哥提出兩個與主流思考很不相同的建議。

一、 選擇依據

如果你也看懂 資訊大廠在各國政府背後推動全民寫程式的真正動機, 如果你也同意對大多數的小朋友來說, 「為用而學」 比為 「為賣而學」 更重要, 那麼我們就應該把目光鎖定在一般的小朋友身上, 而不是特別有潛力的小朋友身上。 那些天生的 coders 可能還搞不清楚什麼叫做寫程式, 就已經開始在線上遊戲上面動手修改自動打怪練功的外掛了。 或是其他類似的情境 -- 他自己會為了愛玩而不小心開始寫程式。 對於這樣天生適合寫程式的小孩, 我們大人最優先該幫他做的事, 就是鼓勵他繼續探索, 而不要因為他的選擇異於學校或老師所選的 「官方程式語言」 就去責罵/阻止/扼殺他自主學習的動力。

至於面對其他絕大多數的小朋友, 我會根據這幾個特性來選擇程式語言:

  1. 直譯式 (interpreted) 優先於編譯式 (compiled), 因為要能快速回饋修正。
  2. 很短幾句話就要能夠做出有感覺的事。
  3. 這個語言未來可能還會存在幾十年。
  4. 最好可以在很多情境底下使用。

前兩個原則既是糖衣 -- 避免小朋友太早失去耐性 -- 也比較符合通識/科普教育的需求。 後兩個原則算是 長線投資的學習策略

二、 已經佔領 web 的語言

我推薦的第四名程式語言, 是 javascript。 ( 1995 年 它至少還會存活幾十年, 這應該是大家的共識, 因為 web 已經被它佔領了 :-) 它甚至可以拿來 讓網頁程式設計師變身成手機 app 開發者

雖然一般教 javascript 的方法讓人聯想到編譯式語言 (寫在檔案裡, 改幾句, 再跑一下), 但其實你也可以用單句的方式學 javascript。 我的講義 就是採用這種方式, 以便降低心理障礙。

遺憾的是, javascript 這個語言也有很多地方為人垢病, 用戶 開發者 對它都愛恨交織。 而且它並不太適合初學者; 比較適合讓已經熟悉其他某種語言的程式設計師學習。

三、 小學生的語言

我推薦的第三名程式語言, 是 python。 ( 1989 年) 有人說相較於魔術師的語言 perl (我的最愛), python 根本就是小學生的語言。 它的語法很清楚、 很有條理, 也很容易上手。 跟 javascript 比起來特別是如此。

我會從一開始就讓小朋友用 某個圖形函式庫 來畫圖、 認識迴圈等等。

它不只是小學生的語言, 也是科學家跟工程師的語言。 從分子生物到人工智慧再到機器人, 各種科學及工程研究領域幾乎都會不小心遇到 python; 在某些領域, python 甚至是研究人員必學。

四、 從桌機到手機到物聯網無所不在的語言

我推薦的第二名程式語言, 是命令列/shell script。 ( 1977 年) 命令列/shell script 通常不被認定為 「程式語言」; 但其實它也有變數、 迴圈、 邏輯判斷、 副程式等等機制。 而且對於一般非資訊專家而言, 它比現在所有的主流語言更好學、 應用機會也更廣。 學會它, 你就有機會成為 3C 產品的主宰; 畏懼它, 你就註定永遠被 3C 產品主宰。 我常說自己 「得了一種沒有命令列就會死的病」, 原因在此。

把 3C 產品眩麗耀眼的圖形介面撥開來, 不論是 Mac、 平板電腦、 手機、 平板、 IP 分享器、 行車記錄器、 監視錄影機、 四軸飛行機、 raspberry pi、 機器人、 ... 在每個類型的市場裡, 都有相當比例的產品採用 linux 或 BSD 作業系統, 而 shell script/命令列就是操作這類系統所採用的語言。

只有一個包袱最沈重、 作業系統最欠缺競爭的市場, 在那裡, 「預載命令列/shell script 的產品」 的市佔率很低 -- 那就是 PC 市場。 但其實 百毒不侵救命碟 可以讓任何一部 PC 重開機後立刻支援命令列/shell script。

一方面, 廠商很害怕用戶透過 shell 取得自主權。 「手機 usb 連線傳檔直達電腦」 那麼好用; google 卻放了一個大型心理拒馬擋在它前面, 意欲阻止你學習: 「確定要按七下變成開發者嗎?」 另一方面, 喜歡探究 3C 產品運作原理的人, 終究會自學一點命令列/shell script。 (通常是 bash 或 ash 或 sh) 這個趨勢如此地強大, 以至於連微軟也不得不屈服, 在抗拒這麼久之後, 終於在今年決定 要讓 windows 10 支援 bash。 (我原先一直以為這是愚人節笑話, 沒點進去看; 不過後來搜尋一下發現 這是真的

所以老師如果選擇教學生 bash 命令列, 這不僅具有技術意義, 更具有公民培力 (citizen empowering) 的社會意義。 找一些有感的玩法, 例如 手機變身實物投影機 從電腦透過 usb 跟手機批次傳簡訊、 ... (讓我們一起用 教英文的方式 來設計更多好玩的命令列教材) 讓小朋友藉由程式設計必修課來擺脫 (廠商所設下的) 枷鎖, 享受而不是懼怕手機及其他 3C 產品的自主權, 真正成為 3C 產品的主人。

順便一提, 英文文法不錯的人一定要看一下 bash 裡面最有趣的兩個語法: | (pipe) 跟 $(...) (command substitution)。 它們比英文文法裡的關係連接詞或關係代名詞更簡單, 卻又跟這兩者一樣, 讓使用者可以透過排列組合表達出豐富的概念, 讓你的語彙知識發揮相乘而不是相加的效果。 過去 bash 一直被當成高手專屬的語言來畏懼, 這實在是大眾的損失。

五、 CP 值超高、 更無所不在的終極電腦語言

我推薦的第一名程式語言, 是 regular expressions。 ( 1968 年) 事實上它不太算是一個程式語言, 只不過是二三十個特殊符號的排列組合而已。 它有一些類似變數、迴圈、條件判斷的機制, 但是你不能拿它來寫完整的程式, "只" 能拿它來比對/代換 (簡單到複雜的) 某類字串, 所以我稱它為 字串樣版 (正式的名稱叫做 正規表示式; 簡寫為 regex 或 regexp)。 嘴巴講得出來的字串規則, 它幾乎都能表達。

在哪裡可以看得到它的蹤影呢? 你數得出來的 「通用型」 程式語言 -- 包含上述第二三四名以及任何 「熱門程式語言排行榜」 上面所有的語言 -- 都支援 regexp。 反過來說, 如果一個程式語言不支援 regexp, 那麼真的可以不必考慮學它了 :-) 可是你為何不曾聽過它? 那是因為 regexp 功能對於提升軟體的賣相沒有幫助, 而主導資訊教育方向的, 從來都是商業力量而不是有思想的資訊教育學者, 所以賣相好的比真正有用的享有更高的能見度。 面對大量文字資料時 (例如大數據!) 像我這樣懂得用它的程式設計師, 用一句 regexp 就可以取代其他程式設計師一二十行甚至幾十行的程式碼。 用過它, 你對 「以簡馭繁」 這個成語會有更深刻的感受。

不只是程式語言, 連 試算表跟文書軟體 裡面都可以用 regexp。 還有, (強調發揮組合力量的) 阿貴的繪圖工具箱 裡面, 負責把各種文字資料檔轉成繪圖程式碼 (從資料產生程式! 帥吧?) 的, 也是 regexp。 其實它對網管、 秘書、 地圖股長 跟其他很多工作也都很有幫助; 但我沒空詳細解釋。 簡單講, 因為它處理的是 文字檔。 文字檔 (包含程式碼跟設定檔) 可以說是電腦的母語, 也是 人類跟電腦溝通時表達力最精確又完整的 "語言"; 而 regexp 則是處理文字檔的既強大又簡單工具, 所以任何與電腦溝通的工作, 幾乎都用得到它。

另一方面, 它的學習門檻比前述三種語言都低很多, 真的不需要是電腦高手。 如果邏輯思考或英文文法是你的強項, 請一定要給自己一個機會, 用二十分鐘的時間瞄一下 基本觀念 二十個常用符號, 也許你會訝異自己竟然能夠這麼精確地使喚電腦。

它的有效期限呢? 我猜測要等到人類不太再用文字檔跟電腦溝通、 甚至連 「檔案名稱」 的概念消失的那一天, regexp 才會失去意義。 (因為 「檔名清單」 也是文字檔啊!)

上面三段要說的是: 對一般人 (其實對程式設計師也是) 而言 想要用最簡單的 "語言" 去命令 「現在與未來最多種不同的電腦」 做最多的事, regexp (加上一點點 shell 指令) 是 CP 值最佳的低成本高效益學習投資。

六、 挑哪個語言, 很重要嗎?

也許挑哪個語言, 其實並沒有那麼重要。 因為不同的程式語言經常可以互相翻譯。 例如搜尋 「translate javascript python」 就會找到一些兩者互轉的工具。

從這個角度看, 從程式設計師體驗去挑語言, 可能比從成果應用面去挑語言來得重要。 例如前面說過 javascript 已經佔領 web (甚至手機), 也就是說 javascript 程式的成果應用面超廣; 但是它的用戶體驗為人垢病, 所以出現了很多 把其他程式語言翻譯程 javascript 的工具。 會不會有一天 javascript 變成網路版的機器語言 -- 無所不在, 但程式設計師不太直接接觸它, 而是採用其他更高階的語言?

以上分析不太適用於命令列/shell script跟 regexp。 Shell script/命令列處理的是作業系統層級的事, 它跟其他程式語言之間不太有 「翻譯」 的關係, 而是會去呼叫/使用其他程式語言所寫出來的程式。 (當然, shell 有很多種, 有些彼此也可互轉; 另外, 也有人在談 python 可否取代 bash -- 請搜尋 「python as shell」。) 「表達字串樣版」 這個領域太小, regexp 已經做得接近完美, 不太可能出現新的競爭者。 這兩者的獨特性也是我更敢大力推薦的原因。

七、 全民學游泳的教育目標?

如果我們的課綱要求全民學游泳, 那麼教育目標當然不是要讓每個人都能夠變成游泳選手或游泳教練或救生員 (為賣而學) 而是要讓每個人都有一點自救的能力, 例如至少學會水母漂、 原地沉浮換氣、 不管用蛙式還是掙扎式最好能游幾十公尺 (為用而學)。 全民學騎腳踏車或全民學作菜也是一樣。 還好這些技能背後都沒有強大的商業力量在主導國家的教育方向。 但是面對 (向來都被大廠牽著鼻子走的) 資訊領域全民必修課, 我們有必要不時提醒自己: 「為用而學」 應該優先於 「為賣而學」

所以寫程式的技能如何幫一般人解決生活中的問題? 如果你懂得上網搜尋現成的軟體, 現在幾乎已經沒有理由要自己寫 「通用」 類型的程式。 你想做別人也想做而且電腦做得來的事, 幾乎都已經都有自由軟體幫你做; 重點只在於你有沒有想到要搜尋、 會不會用正確的搜尋關鍵詞而已。 下載完軟體之後, 除了設定軟體之外, 你的時間多半會花在撰寫一二十行以內、 只有你自己 (最多加上同僚) 會用的小程式, 它的功能通常是幫其他大型軟體在輸入資料前或輸出資料後, 略微匯整/編排格式, 例如 繪圖工具箱範例 當中所說的應用。 (所以選用開放的檔案格式, 避開 綁架你的火星文檔案格式 非常重要。) 以我自己為例, 撇開執行計畫或是針對程式設計課程的教材準備工作不談, 你猜我平常都用什麼程式語言來簡化我的瑣事雜務呢? 答案就是 shell script 跟 regexp。 (好吧, 我也常寫 perl; 就功能而言, python 可以算是它的平民/囉嗦/摩登版的替代品。) 對大多數人而言, 操作交通工具的能力最常用於騎腳踏車或機車到菜市場, 而不是開太空梭上月球。 (更不是開太空梭上菜市場) 即使是太空人, 在他值勤之外的時間可能也是如此。

資訊人力分佈圖 讓我把 2001 年文章 的舊插圖小改一下重新解釋一遍: 正常的情況下, 越簡單的東西越多人學得會, 越難的東西越少人學得會。 但是在資訊教育領域很奇怪, 過去對於非資訊科系的學生, 我們告訴他: 「命令列太難, 你不需要學, 只要學會用 MS Office 之類的圖形介面就好」; 對於資訊科系的學生, 我們則告訴他: 「你將來要寫程式賣錢耶; 對於賣錢沒有幫助的技能 (例如原始碼被看光光、執行略慢開發極快的 scripting 類語言) 你不必學」。 於是有很多明明能力興趣不在於開發軟體的學生, 在資訊科系裡面待得很痛苦。 結果中等困難度的技術在學校裡幾乎 沒什麼在教。 現在的全民程式教育, 會不會也有類似的現象? 要嘛就是號稱 「滑鼠拉一拉也能寫程式」, 要嘛就是 為就業而教? (ps. 我不反對用拉滑鼠來誘導小朋友入門; 只是覺得其他還有很值得教的東西) 身為各級學校的電腦老師, 如果我們無法挑戰跨國資訊大廠所主導的 「全民寫程式課綱」, 那麼至少我們可以透過這門課讓更多學生看見高 CP 值的中間等級、 到了二十二世紀都還能用的技術, 例如命令列/shell script 跟 regexp。

* * * * *

花了幾週終於完成 「評論課綱納入程式設計」 的一系列五篇文章:

  1. 販售價值 vs 使用價值
  2. 全民寫程式瘋就業?
  3. 從 「為賣而學」 轉向 「為用而學」 [長線投資的電腦學習策略 2016 版]
  4. 教孩子們一個 「實用到二十二世紀」 的程式語言
  5. 拉拉熊和丁丁的神燈

15 則留言:

  1. http://blog.interfacevision.com/design/design-visual-progarmming-languages-snapshots/

    回覆刪除
  2. 我本來想推個 prolog 或 lisp 之類的有趣語言。

    bash 超強!
    最近想寫一篇文章探討如何該程式變有趣,
    發現解就是 shell script ,可以用來處理瑣事。

    回覆刪除
    回覆
    1. 洪老師,你是一位對台灣資訊教育有重大貢獻的人,我默默看了你的文章有20年以上,早期在園區工作時(晶片設計、流程開發⋯⋯),每每和同事溝通正確工具軟體使用觀念,就算是清大電機的學生(固態物理組),也是受微軟的毒很深,可惜口才和文筆沒有你這麼好,無法影響週遭許多人,但是有機會就藉由你的文章和網頁分享他人,如果像你或陳良基老師能在教育部擔任重要職務,台灣就真的有福了!

      感謝您長期對這塊土地的下一代付出和奉獻

      刪除
    2. 教育部聽不見我的聲音,是有點遺憾。 還好有各位讀者把我的文章分享出去,至少這樣還有一些老師有機會聽見不同的聲音、在小小的場域發揮影響力。 謝謝大家支持!

      刪除
    3. 在商言商,也不能怪微軟。只是我們的政府(包括教育部),選擇和微軟站在一起。其實像版主這樣的人才,放在研考會或經濟部,也是不錯的選擇。

      刪除
  3. 不好意思啊,很久沒查看垃圾留言,從四月到現在, google 又誤判了好幾則 :-(

    回覆刪除
  4. 這些語言以後還是會沒用的

    回覆刪除
  5. Shell script 我反而覺的他是比較特殊的語言, 與其說是腳本語言, 它更像是腳本.
    可能我懂太少, 不過就我現有有辦法了解的範圍, 我覺的 shell scipt 除了簡單控制作業系統的一般事物已外, 其他部份並不能有很好的處狸能力.

    我舉我自己的例子, 我在公司跟廠商通訊是用 skype (微軟的沒辦法) 這套通訊軟體, 我一直想把 skype 的通話紀錄保存下來.
    可是如果直接複製對話內容到剪貼簿, 格式都會消失只剩下純文字 (也跟 Line 一樣). 這不是我要的.
    於是我寫了一個 shell script, 把純文字的 skype 通訊紀錄, 轉成 html 格式, 顯示說話者, 時間, 並且用 css 加入顏色, 還有左右浮動位置.
    看似簡單, 但是用 shell script 寫超麻煩, 還要跳脫一些對話有可能出現的特殊字元用 eval 弄好久. 而且整個 code 又很不易讀, 很醜.
    shell script 根本不是拿來做腳本語言的, 它最好的用途是做更簡單的判斷.
    其實貴哥有提到 "python as shell" 我眼睛亮了一下, 沒錯, 我之前就在想當初如果這些邏輯還有文字處理是用 python 寫的話, 是否會愉快很多. (可是我還不會 python).

    (結果我又重複發明車輪, 早就有 Skyperious 這種軟體了, 不但可以解讀 skype 資料庫還可以轉成 html.)

    回覆刪除
    回覆
    1. 當成練功吧!也許你會對 Skyperious 的原始碼有興趣。

      刪除
  6. 當自學程式的唐鳳入閣,我們如何把程式教育做得更好?
    http://www.bnext.com.tw/column/view/id/40722
    資安即國安 府院今明擴大資安會議
    http://news.ltn.com.tw/news/politics/paper/1025776

    資安和人權,封閉和自由,應該會引起討論。

    回覆刪除
    回覆
    1. 天下沒有白吃的午餐跟一步登天的事,一個堂奉只是製造更多問題不是解決問題

      刪除
    2. 好吧,你終於承認有問題了,我要去吃午餐了。

      刪除
  7. 分享 : 【全端工程師解密】2016 年度 JavaScript 潮流:請徹底拋棄 jQuery
    https://buzzorange.com/techorange/2016/10/25/2016-programming-language/
    (標題疑似取的不好).

    回覆刪除
    回覆
    1. 哈哈 好讚的諷刺文。 已加入 「令人愛恨交織的 javascript, 開發者觀點篇」。 科技報橘竟然很認真地把它下錯標題了 :-)

      刪除
  8. 最近在公視的節目「下課花路米」中,有小學生用圖形化可程式控制器寫程式,控制用積木製作而成的機器人。也許跟興趣結合,才是培養未來資訊人才的正確方式。最近被熱烈討論的「前瞻基礎建設計畫」中,有關數位建設的部分,只著重在硬體建設,而沒有自由軟體和創用CC等,關於智財權和軟體自主的部份,令人擔心會不會是下一波盲目升級的開始。

    回覆刪除