你想知道生活中有甚麼數學嗎?

2016年4月4日 星期一

電腦×數學 ≠ 丟給電腦算 有熊老師 陪你教數學·2016年3月23日 。想要「程式課 × 數學課」,先想為什麼「難以結合」

電腦×數學 ≠ 丟給電腦算
有熊老師 陪你教數學·2016年3月23日
。想要「程式課 × 數學課」,先想為什麼「難以結合」

「我們想和你討論一下,要怎麼讓 程式語言 和 學校的數學 作結合」
朋友向我拋出這個議題的時候,我遲疑了一下。   「一下」我指的是三個月,在這三個月裡沒有任何進展,然後我把思緒整理過一遍,跟他們說:
「程式語言,和 課內的數學 之間,其實存有本質上的矛盾。」
從國小到高中,課內的數學在教的是「速解」;面對一個也許你慢慢試,也能夠試出結果的問題,學校把前人發現的速解法告訴你。

我並不是指,數學都在「死背公式」;而是國小到高中所學的數學,大多數在這幾千年來,都已經被古人研究出特殊的解法了。

學過「等差級數公式」的人,就不會再一項一項加;能用「乘法公式」的人就不必再用分配律直接乘開、再合併項
 -- 知道有「速解的知識」、練習然後內化這種知識,並將之使用在應用問題,是貫穿了整個12年國教,數學科的基本學習流程。

但「程式語言」截然不同,「寫程式」是在思考出「能一步一步解開問題、完成任務」的方法。

電腦的優點在於它可以快速地反覆記算;但課內數學基本上,就是古人在沒有電腦的時代想出來「取代反覆計算」的速解方法。
你要學生「用電腦算等差級數」、「用電腦算相似形的邊長」,說實在話,你程式碼都還沒打完一行,人家都用筆算出來了…… 有「速解」的東西,還什麼「丟給電腦算」幹嘛?

走到高深的、現代在研究的數學領域,數學的確會利用到電腦,因為那些已經是「目前還沒有速解法、甚至還不知道怎麼解」的問題;
數學家好不容易想到了一個「可以一步一步去驗證」的方法,但人力辦不到,所以需要仰仗電腦。
(例如有名的「四色問題」)
https://zh.wikipedia.org/wiki/四�⋯⋯

走到高深的程式設計領域,為了減少運算時間、或是為了管理大量的資料、機器,寫程式的人也一樣會用到深奧的數學知識 -- 但這也不會是我們在國中小能教學生的。

。反省「成功經驗」

其實他們團隊會找我討論這個,是因為我們之前的確合作過幾次「程式 X 數學」的營隊;我們在營隊裡面,教了幾個對於數學和程式語言都很重要而基礎的知識,比如說「最大公因數」。
那個時候,是在眾多小學數學的課程裡,要找幾個能和程式教育結合的主題,其實不難、我們很快就把課程編好了;
但要想出「程式教育」與「課內數學」全面性、長期的整合模式時,就沒那麼簡單。

不過,當我看清楚「課內數學」和「程式教學」兩者的矛盾後,反而就認真地省思起:
「那這個營隊為什麼辦得起來?  “最大公因數” 和其他的數學知識有什麼不同?」
於是我發現了關鍵:「最大公因數不能速解,一定要用推論的。」
雖然我說國小、國中、高中 的數學主要都是在學「速解」,但仍然時不時地,會有「不得不推論」的環節。
啊,再繼續說理之前,讓我先分享兩個實例吧:

嗯,不要說寫程式了,應該有不少家長連數學都解不開這題吧?
別這麼快放棄,如果你解不開這題,那你應該想想「為什麼我解不開」 -- 哎呀我不是要在傷口上撒鹽啦,我是說真的,仔細想想為什麼你解不開;
那如果你解得開,幫個忙,想一下「為什麼我解得開 -- 我是怎麼想的?」。
我們先換一題簡單的:

上面的這兩個問題,都是「沒有速解」、只能「推論、再推論」的:

我認為可以透過「程式 × 數學」的課程裡教會學生的,不只是「這題怎樣解才對」、也不只是「生活上用得到的數學知識」;
而是「數學力」 -- 其中之一,就包括「瞭解自己究竟想了什麼」的能力,
以及,
在聽老師教學時、在自己解題時,都知道「想清楚」的重要性,而不只是為了產生出正解。
不過,上面的那兩個例子,都是在課內數學裡,偶爾會有的「沒有速解」的問題;那從國小到高中,許多「有速解」的數學知識呢?

。數學教育欠缺的,就是讓學生習慣「想清楚」
 -- 這正好可以用程式教育來補足。

許多學生對「數學應用問題」感到恐懼,甚至他們「計算題會寫,但應用問題不會」;這關鍵就在於,
多數的學生「其實沒有 “把整件事想清楚”」只是憑著印象,好像是這個加那個、再乘這個…… 然後錯。
這其實算是傳統數學教育種下的惡果,而且是根植於課綱的 -- 國小課綱的編定,有時候並不是以「思考方法」或「應用層面」為章節編排,而是以「計算工具的複雜度」去排的。
老師們習慣了「先教你算,等你算熟了,再教你應用題」 -- 這時候,這些應用題,對老師、對學生而言「只是個題目」,
其中文邏輯、現實情境「只是故事」甚至是「可以跳過」。
學生和老師都養成了「想要快點 找到應用題裡的 “數字”,拿數字出來 “算”」的習慣,而逐漸喪失了「想像整件事」的能力。
因為應用題「只是個題目」,舊式教法的老師不會花太多的時間,反覆地要小朋友去想它的情境;
而不論是之前推動的「建構式」,還是近期流行的「學思達」,其實都是在設法克服這個問題。
而現在,一個現成的解決方案就在眼前 -- 寫程式,就是非得「想清楚」不可的!

如果你剛才有解開這題,你有問自己、想清楚「我是怎麼想」嗎?
為什麼「試著寫一支程式」能讓自己想得更清楚呢?
這是因為「電腦其實很笨」,人的眼睛能快速蒐尋到「哦,用這個乘這個嘛」,但電腦辦不到。
於是,你如果想要寫一支程式來解決這種問題,你不得不逼問自己
「我剛才,到底是怎麼知道,要用什麼乘以什麼的?」

如果你剛才有逼目己想清楚「我想了什麼」,那或許你也能寫出自己的程式
你剛才有想清楚嗎?
其實這個問題,國中以上的學生也有可能會用「連比」的方式來解;但同樣的,當你要把數字放進 連比 式子裡適當的位置時、當你最後思考「哪一排要乘多少」時,你究竟想了什麼?
你怎麼知道這個數字要放這裡?
你怎麼知道這個數字要「倒過來放」?
你怎麼知道這一排要乘多少?
把自己心裡所想的,給想清楚,然後你就可以試著以連比的觀念來寫一隻程式了。

。「慢」也可以慢得有價值

當然,就像我前面說的,寫程式來解基礎數學的問題,是慢的;但許多數學老師們,其實也都瞭解「慢得其法」也會很有教學價值。
比如說「推導公式」,包括我在內,許多數學老師都會堅持要帶學生推導公式;這並不是為了賣弄、也不是為了要考證明題。
1. 每一次要證明新公式,其實都會使用到大量的舊知識 -- 這是一種複習。
2. 推導公式,可以讓學生知道式子「為何長這樣」從而自然不會忘記它「該長怎樣」 -- 這是一種幫助記憶的方法。
學生如果只「背公式」,那他背錯了,自己也不知道 ,我常打比方說:
「白日依山盡,後面接 黃河入海流、長河入海流,還是 雲河入海流?」
不知道,因為是用背的啊,背錯了怎麼會知道?  所以學數學,如果抱著一種「反正就把公式背起來,解題的時候再套數字」那是錯誤的態度、是會讓學習事倍功半的。

3. 推導公式,可以讓學生知道「想清楚、推論」的重要性 -- 這是「數學能力」
學數學、教數學,要讓學生得到「數學力」,而不只是記住了一大堆的「數學工具」;就像學程式,不是只有熟練語法一樣。

推導公式,花時間、慢。
但如果能收到以上三個效果,那是「慢 得有價值」。
應用問題也一樣,很多學生甚至會想「為什麼不都出計算題就好?」「寫應用問題好花時間?」
但學生會有這種想法,其實反應了老師沒有把握機會、利用應用問題,讓學生體會「把事情想清楚」的價值和趣味。
「想像整個故事」,不只是為了解題、也不只是為了生活應用;發現現實問題中,所含有的數學規律,這基本上就是所謂「融會貫通」的一環。
如果你一題又一題地算了七八道應用問題,或許也能慢慢融會貫通;但,為何不把握每一道題目、細細地思考呢 -- 這就是「學思達」的基本精神。
現在也有許多老師慢慢掌握到「讓學生出題,給其他學生做」能收到額外的學習效果。
而讓學生「寫一支程式,讓使用者出這類的題目,程式來解」,它的概念,簡單來說就是:

「我想讓你的數學更熟、更懂,但不是叫你一直寫數學題目;而是讓你做一件和數學很有關的、新的、要動腦的任務;
你在完成任務的過程中,腦袋就會一直反覆思考這個數學知識、甚至是理解它的本質。」
而且很有趣的一件事,跟大家分享,
在你試著想清楚「我到底想了什麼」之後,你可能會發現:

「12日9點31分,到14日5點12分,經過了幾小時又幾分?」 (複名數計算)

「5又 2/7  - 3又 5/7 = ?又 ?/7」 (帶分數加減)

這兩題的「思考路徑」其實是一樣的!
一樣都可以用「退位、借位」,也一樣都可以「先化成分 (先化假分數)」

。讓數學更有用

上面說了,國小到高中的數學,大部份都是有「速解」的;但他們「已經學過的」知識很少,這導致出題的題型僵化。 舉例來說:

因為學校教的是「有速解」的知識、考的應用題也都是有某種「已經學過的速解法」;這導致兩個不良後果:
1. 學生看到問題,結果明明知道某種基礎、但步驟較多的解題方法,卻不去做;而是兩眼直盯著題、一直在想「我有學過哪種公式,是用來解這個的嗎?」。
2. 因為日常生活中的問題「沒學過」,所以學歷唸到越高、越沒有「用數學來思考日常生活問題」的企圖心。
我們小時候還會覺得「這個東西,我想一下,應該想得出來」;
但奇怪,長得越大、明明學得越多,卻反而越容易就放棄:「這個我沒學過」。

像這樣的問題,因為數字尚未被填入,學生被迫要去想像「這個數字是什麼意思」,而不能再只憑「感覺」、「記憶」去作答。
只要學過「迴圈」和「函式」,許多複雜的現實問題,都「可以被解決」  -- 不需要「學過公式」,也就不怕「沒學過這個的公式」。這可以
避免學生「被特定的題型,給僵化了思考」、保持他們一種「我應該可以解決它」的積極性。
又,同時,也可以讓學生體驗
「如果我自己沒想清楚,程式是不會知道的 -- 它會送出錯誤的結果,但自己不知道那錯了」
以及
「如果只想透過程式取得結果,那就像直接翻看答案一樣,是學不到東西的;既不會懂得什麼新知識、也沒辦法因為思考而變得聰明。」

以上,在幫我朋友的團隊想出了一百多道,可能適合的「數學程式問題」之後,跟大家分享我的兩大心得,
也就是可以讓「程式×數學」發揮綜效的兩大主軸:
一、沒有速解、必需一步一步推論的問題。
二、有速解的,讓學生「寫出程式,去解 「使用者出的應用問題」」

讓他不得不想清楚,這些問題的「整件事」、它的數學邏輯;
同時,也在編寫程式 (拼scratch積木) 的同時,讓學生自然而然地去「想像這些數值,運算起來會有什麼意義」。

最後,我要感謝一下我朋友的這個團隊 -- 哦,他們叫 橘子蘋果 啦。
https://www.facebook.com/OrangeAppl⋯⋯
其實我剛開始提出的 idea 挺天真的,比如說這個:
讓學生寫出一隻程式,當使用者輸入下列線索時,程式會回答「阿凱的錢,是小明的幾倍」

「小明的零用錢是小花的 13 倍,阿凱的零用錢是小花的5倍」、
「阿凱的零用錢變一半之後,比小明多一半」
「小花的零用錢是小明的5倍,而且的是小花的1/3」

也就是題目中可能有「誰的幾倍」、「誰的幾分之幾」、「比誰多一半」這些關鍵字,然後要讓程式能透過這些關鍵字,算出正確的倍數關係。

因為學生必需自身想清楚才能寫程式,所以在數學上,透過這些題目,讓學生練習正確地倍數判斷,同時在程式上,則學習寫爬蟲的程式。
我的想法很單純,就是「學生要建立,能透過中文描述,辨明數學關係的能力;所以就想讓他們寫這樣的程式」
結果呢,就被他們說:「太 fancy (夢幻)」… 然後他們花了三分鐘跟我講解「爬蟲程式」為什麼很難寫。
我還建議過
寫出一隻程式,當畫面上有十幾隻造形不同的小蟲時,
程式要判斷,是該依「大小」、「顏色」、「特定部位造形」等哪一種作為分類維度,來分類這些蟲子,能達成最好的分類效果。
 -- 這也是一種數學能力嘛……對吧?  但是…就是… 這程式太難教了……。
許多諸如此類的磨合和討論,最後才有像上面這幾個問題這樣「在數學、在程式教育上,都難度適中、又同時具有 “學數學” 和 “學程式” 的兩種綜效」的問題。

此外,我們也知道,即便課程開發完畢而出檯,一個班一次能教的也不過就那麼十幾、二十個學生。
所以我們都認同,應該把這些課程開發的心得分享出來,讓更多的老師、家長知道;尤其是學校的資訊課程
 -- 如果校內的老師能一起投入「程式×數學」的課程開發、分享 與 推廣,那我相信,幾年之後,台灣學生的數學力,一定會有 質 與 量 的明顯突破。

沒有留言:

張貼留言