小SIGMA數學特別興趣組成立於2018年,有六名學生,三位家長當老師,是“三個老師六個娃”的親子班。
我們這個特別興趣組主要講數學,的特點是“慢數學”,有時候兩個小時纔講一道題。這讓我們有足夠的時間去思考、嘗試,並發現一些好玩的規律。比如講幻方時,包若寧、卜文遠和魏文珊提出了“包卜魏猜想”—若已知三階幻方的中心格子、左上角、左側中間格子的三個數,這個三階幻方就完全確定了。還有在學“雞兔同籠”時,傅鼎荃自發地想出了“二分法”。
2020年疫情期間,我們在家裡都悶得無聊,便央求老師們教我們Scratch編程。當我們看到一個個美麗的角色,搭搭積木就能寫程序時,便深深地愛上了編程。在編程裡,似乎所有事情都能實現,於是我們想到什麼事情就編程試一下。比如卜文遠自發嘗試寫了一個小程序,用小球模擬病毒的傳播。
在學習編程的這3個月裡,我們一起寫過很多程序,有四個和尚分馍馍,算π,二分法找鑽石……在這麼多程序中,好玩兒的就是阿爾法小狗了!這隻小狗會下井字棋,它本領高強,每次我們都贏不了它!
通過編程,可以解決許多數學問題,比如數學裡的雞兔同籠、估算2的平方根等。我們還可以寫一個程序估計森林裡貓頭鷹和老鼠的數目。模擬世界,這感覺很奇妙!
我們寫這本書時初的想法是:大部分編程書都是大人寫的,都是以大人的視角來看的。我們想以孩子的視角寫一本編程書,於是便一人寫幾章,把學習心得記錄下來,終形成了這本書。
我們覺得這本書和其他書是不一樣的,它記錄的是每一位小作者對每講的看法與總結,記錄了我們每個編程初學者對程序從陌生到熟悉並形成自己思維的過程,我們也希望自己的經歷可以幫助更多初學小朋友愛上編程和計算思維。我們寫的程序都放在https://deltadbu.github.io/6kids_learning_scratch/上,供大家參考。
希望你們都能喜歡這本書!
小SIGMA數學特別興趣組
2021年8月20日
教師的話一
2018年的一天,我給同事包雲崗打了個電話,說:“孩子們上二年級了,能否在輕松、活潑的氛圍下,引導孩子們學一些數學思維呢?”雲崗很贊同,我們就一起組織了一個小SIGMA數學特別興趣組,權且由包雲崗、蘭艷艷和我擔任老師,學員就是我們自己的孩子。
在這個特別興趣組中,學生用書是通用的奧數教材,不過教師用書可不太普通—我們用的是G. Polya寫的《怎樣解題—數學思維的新方法》(How To Solve it)和陶哲軒寫的《陶哲軒教你學數學》。換句話說,我們踐行的是Polya的數學教育觀—重在傾聽孩子們的理解和猜想,重在引導孩子們觀察、嘗試、聯想、歸納、做“合情推理”,總之是一種“慢數學”的風格,有時候我們甚至2個小時隻講一道題。
一開始的確看不出成效,但等到三年下來,纔慢慢發現孩子們有了一些進步—當然,這些進步不是指孩子們參加某個杯賽拿了個獎,而是指孩子們掌握了一些基本的數學思維,體現在自己能夠提出和證明一些猜想,比如包若寧、卜文遠、魏文珊小朋友提出了三階幻方的“包卜魏猜想”,傅鼎荃小朋友在學習“雞兔同籠”問題時,完全自主地想出了“二分法”。在思維火花迸發的尤裡卡時刻,孩子們興奮得又喊又跳;躬逢其時,我們也非常欣慰—這是對教師的肯定和褒獎。
等到了2020年春節,因為出現疫情,孩子們都憋在家裡,很是無聊,就嚷嚷著讓我們教他們編程。教一門編程語言容易,但是關鍵不在這裡,而在於教“計算思維”,這給我們出了一個不小的難題。
事實上,包雲崗、蘭艷艷和我都在中國科學院大學教計算機科學與技術:包老師講授“操作繫統”,負責“一生一芯”實踐計劃,講解如何設計CPU和計算機繫統;蘭老師講授“機器學習和人工智能”,訓練計算機怎樣學習;我講授“計算機算法設計”,包括怎樣觀察問題和求解問題。簡而言之,我們教的都是“計算思維”。
不過我們面向的都是本科生和研究生,能否教小學生計算思維?教什麼?怎麼教?這對我們來說是全新的挑戰。這可不像教數學,還有Polya和陶哲軒寫的書能夠當作教材,給我們一些指導。
我們在開課前思考了很久,教的時候又邊教邊琢磨,把教授本科生、研究生的計算思維進行裁剪和修改,形成了一個初步的“小學生版”計算思維。
所謂計算思維,其核心是踫到問題時如何觀察、如何嘗試,然後如何根據觀察到的規律設計計算機程序來求解問題。下面這幾條或許是基本的計算思維:
(1)先正向嘗試理解題意,再反向求解問題
踫到一個問題如何下手?孩子們往往會對著問題發獃,感覺束手無策。這不怪孩子們,求解問題是“反向思維”,有時候的確不太容易一下子就想出來。
在這種情況下,“先正向嘗試理解題意,再反向求解問題”是走出困境的一個好辦法。以“雞兔同籠”問題為例,可以先嘗試一下“雞有0隻”,即使這個嘗試非常粗糙也沒關繫,然後驗證這個嘗試對不對,不對再修改嘗試,比如接著嘗試“有1隻雞對不對”,如果不對再增加雞的數目。
先嘗試猜測一個解(或許這個解很粗糙,這不要緊),再驗證這個猜測是否滿足要求,不滿足要求就修改;這種“嘗試-驗證-改進”策略是“試錯法”,也是“逐步改進法”。正向嘗試有助於理解題意,或許應該成為孩子們踫到問題時的“反應”。
這種策略看起來很笨,不過卻有三個好處:一是能夠使孩子們動起手來,避免發獃;二是能夠啟發我們寫一個求解的程序;第三點更重要,孩子們嘗試不了幾次,可能就會自己發現規律,想出更好的求解方法—這不是想像或誇張,SIGMA的孩子們就是這樣想出求解方法的。
說得更遠一點兒,計算機科學與技術裡普遍采用這種“用正向嘗試來反向解題”的策略。一個典型的方法就是神經網絡的訓練過程—嘗試設置網絡參數,做正向的網絡傳播,驗證傳播的結果,如果不好就修正網絡參數,終反向求解出網絡參數。
(2)從簡單的做起
踫到一個復雜的問題怎麼辦?比如“四個和尚分馍馍”問題,唐僧師徒4人化緣化到了10個馍馍,問共有幾種分法?孩子們沒學過組合數學,看到這麼多和尚和這麼多馍馍,一下就傻眼了。
直接求解這個問題是很難的,我們就啟發孩子們從簡單的做起:4個和尚、10個馍馍的問題不會解,那就先考慮2個和尚、1個馍馍的問題。反過來,如果簡單的情形都無法解決,那就說明這個問題太難了,要麼放棄,要麼琢磨簡單的情形與原始問題之間的差異。當知道怎樣求解2個和尚、1個馍馍的問題之後,我們再增加難度,考慮2個和尚、2個馍馍的問題,以及3個和尚、3個馍馍的問題。
找出問題的簡單情形,從簡單的情形入手,可以有效避免孩子們面對復雜問題時束手無策。所謂下手,所謂破題,所謂“把手弄髒”,就是第二個有效方式。
(3)要學會把復雜問題分解成簡單問題
這和上一點是一脈相承的。當面對復雜問題時,首先要思考什麼是簡單情況,簡單情況下的問題會不會解。假如簡單的情況會解了,下面的思考方向就是如何把復雜問題分解成簡單問題。
還是拿“4個和尚分10個馍馍”做例子,假設知道唐僧喫了1個馍馍,剩下的問題就簡化成“3個和尚分9個馍馍”了。把復雜問題分解成簡單的、同類型的問題,就朝著終解決問題前進了一大步。
當然,這種“假設法”隻是一種問題分解手段,除此之外,還有“二分法”等。我們設計了幾個題目,比如“求2的平方根”,目的就是引導孩子們領會“二分法”。
(4)枚舉容易做,關鍵是剪枝
如果說計算思維和數學思維有什麼不同,我想的不同或許在於“枚舉法”。其中的道理很簡單:人力有限,懼怕枚舉;計算機不怕累,不怕枚舉,反而有時候喜歡枚舉—枚舉程序多容易寫啊。
踫到哪種問題可以嘗試“枚舉法”呢?如果一個問題的解是多個變量的組合,我們可以嘗試一下“枚舉法”。以“數字謎”問題為例,解是多個變量的組合,我們隻需要枚舉變量的所有組合就可以了。孩子們在數學課上常會踫到這種題目,當時很畏難—不是不會做,而是所有的組合太多了,一想到枚舉就發怵。不過到了編程課上就簡單了,隻需要寫一個“嵌套循環”,讓計算機拼命算就行了。
當然了,要是組合數量實在太多的話,計算機也枚舉不完。這時候的關鍵是找“受限制”的變量,用這個變量對枚舉樹進行“剪枝”。我們在講“數字謎”時,讓孩子們嘗試笨的枚舉,然後和帶剪枝的枚舉進行對比,從而體會剪枝的重要性。
孩子們將來會發現很多問題和“數字謎”問題類似,解是由多個變量組成的。對這種問題,“枚舉 剪枝”是行之有效的解題思路。
(5)隨機是個利器
孩子們還是小學生,接觸的“確定性”方法多,“隨機性”算法少。我們設計了“布豐投針估計π”“打圓形靶子估計π”“布朗運動和醉漢的腳步”實驗,意在引導孩子們從隨機算法的角度思考問題。
“布朗運動和醉漢的腳步”實驗,意在告訴孩子們很多天然現像的本質就是隨機;而“布豐投針估計π”和“打圓形靶子估計π”實驗,是想讓孩子們體會到即使是確定性的問題,也可以用隨機方法解決。隨機采樣可以大大減少計算量,不需要特別多的采樣,也能得到很好的結果。
(6)仿真物理世界
在學習計算思維的過程中,一個需要防止的傾向是把計算機世界和真實的物理世界割裂開來。
為了防止這種傾向,我們引導孩子們在寫程序之前,盡可能先做一些物理實驗。比如在寫“打圓形靶子估計π”程序之前,先用圓珠筆作飛鏢、向靶子上投擲;在寫“花粉的布朗運動”仿真程序之前,先用激光筆照射澱粉懸浮液,體會真實的布朗運動;在寫“牛頓的大炮”程序之前,先用三根彈簧秤探索拉力分解的奧秘。有了真實的體會再寫程序,和沒有體會直接寫,感覺是大不相同的。
此外,我們在設計題目時非常強調“數學建模”,即怎樣把物理世界中的實際問題表示成計算機問題或數學問題。比如我們設計了“森林裡有幾隻老鼠幾隻貓頭鷹”這一講,意圖引導孩子們體會如何仿真“獵物-捕食者”動力學繫統;設計了“牛頓的大炮”這一講,意圖引導孩子們體會如何把物理世界“裝”到計算機裡去。
值得指出的是,“森林裡有幾隻老鼠幾隻貓頭鷹”背後有高深的數學思想;C. Lay寫的《線性代數及其應用》中講到矩陣特征值時,開篇用的就是這個例子。等到孩子們長大了,學習大學數學時,相信會有似曾相識的感覺。
總結一下:從粗糙的解開始大膽嘗試,不斷改進;從簡單的情形做起,把復雜問題分解成簡單問題;枚舉所有的解,設計“剪枝”技術加快枚舉過程;隨機采樣少量的樣本,以減少計算量,這大概就是基本的計算思維了。我們給本科生、研究生講的無非也是這幾條,隻不過是更深、更廣一些罷了。
德國數學家、數學教育家F. Klein寫了一本書,書名叫作《高觀點下的初等數學》,其核心觀點之一是“有些基礎數學,從高觀點下纔能看得更加明白”。我們把講授給本科生、研究生的計算思維做了篩選,然後講授給孩子們;不揣淺陋,這或許可以稱作“高觀點下的少兒計算思維”吧。
為了便於孩子們理解和掌握計算思維,我們還設計了一些遊戲,比如“找鑽石”遊戲是為了體會“二分法”,“走迷宮”遊戲是為了體會陶哲軒提出的解題大法—解題無非是嘗試尋找一條從已知到結論的路徑。我們幾位老師平時研究的就是算法和繫統,所以給孩子們講授的計算思維自然而然地帶有濃厚的“數學思維”和“繫統思維”色彩。
大概花了4個月的時間,我們就教完孩子們編程了,包括編程基礎知識和計算思維。那孩子們學得到底怎麼樣呢?
事情很是湊巧,2021年5月22日計算所舉辦“公眾科學日”活動,其中一個節目是我帶著小SIGMA們做一期“知乎課堂”,講的題目是“如何用Scratch編程實現一隻阿爾法小狗”。臺下有300名現場觀眾注視,線上還有30萬觀眾觀看,孩子們頂住壓力,現場編程,出了bug現場解決,成功實現了會下tic-tac-toe棋的阿爾法小狗;然後給觀眾講解背後的原理和編程步驟,邀請觀眾進行“人狗大戰”;後又分成兩個戰隊進行“狗狗大戰”,看哪一隊設計的阿爾法小狗更厲害。
現場完成編程和講解,說明孩子們掌握了基本的計算思維和程序設計技能。此外,張秦漢小朋友參加“核桃杯”編程大賽,獲得了北京市金獎,也是一個小小的證明,值得鼓勵。
我們在講課時就要求孩子們做筆記,記錄自己的理解、實驗設計思路和實驗結果。孩子們輪流來,每一講都推選一位小朋友負責整理筆記:寫程序、分析實驗結果、上網查資料,這通常需要花費一周的時間。孩子們寫完之後,由我們修改、校補和點評,終彙集成了這本小書。我們所做的大修改都以“教師點評”的形式明確標識,盡量把修改小化,以保持孩子們寫作的原汁原味—童言童語,自當勝過老生常談。
這本書是孩子和家長共同勞動的成果:部分插圖是孩子們手繪的;封面是劉衛玲設計的;全書由包雲崗、張春明、譚光明、蘭艷艷、何海芸校對。每一位家長都沒有缺席。
在我的心目中,小SIGMA數學特別興趣組不是一個課外補習班,而是我們這些做父母的和孩子們做的一場親子遊戲,是把我們的思考和領悟教給孩子們的一次傳承,是共同領略數學思維和計算思維的一次探秘之旅。
我們這些家長們會永遠記得這段時光。我想我們的孩子們將來上了大學,學到高等數學、概率論、計算機算法、人工智能時,應該時不時會感覺似曾相識,大道至簡,當會心一笑罷。
是為記。
中國科學院計算技術研究所卜東波
2021年8月23日於北京中關村
教師的話二
給孩子們的話
計算思維是什麼?也許孩子們是次聽到“計算思維”這個詞,但相信大家其實早已無意識地在實踐計算思維,比如每天早晨上學的過程就是一次計算思維的實踐。早上起床後,孩子們就會在大腦中快速形成一個“上學程序”:步刷牙洗臉,第二步換衣服,第三步喫早餐,第四步檢查書包,第五步出門,步行或坐車去學校,第六步到校後找到座位,第七步……這其實就是計算思維的一種體現。當然,“上學程序”中的每一步還可以進一步分解為更細的步驟,比如刷牙洗臉又可以分解為擠牙膏、刷牙、漱口、接水、洗臉等,這是計算思維中的模塊化思想;“上學程序”中有些步驟還可以並行進行,比如當時間來不及時,可以一邊嚼著面包一邊換衣服,這是計算思維中的並行思想。
現在是不是覺得“計算思維”無所不在了?通俗地說,計算思維就是讓我們學會用“編程序”的方法來解決問題。但這些“程序”並不一定僅僅在計算機上運行,也可能是由一個人、一個團隊或者一個單位去執行。近中國航天領域碩果累累,“嫦娥五號”實現月面取樣返回地球,天宮空間站成功發射,“祝融號”首次登陸火星等,為什麼中國航天總能完成一個個充滿挑戰的目標?這正是得益於航天領域的總設計師們精心設計的、由幾萬個航天人一起執行的“程序”,不僅能保障工程質量,還能縮短開發時間,這就是計算思維在航天領域的應用。
孩子們也許對計算思維還是有些陌生,但大家都做過數學題,接觸過數學思維,這本書希望通過用數學思維和計算思維去求解同一個問題,並進行對比分析,從而讓大家體會數學思維和計算思維的區別以及計算思維的威力。將來有一天,當大家能有意識地將計算思維應用到學習和工作中,能把一個復雜任務分解為一個個小步驟,能把這些小步驟變成容易理解的數學模型或者容易執行的操作時,相信大家會發現那些看似復雜的問題變得容易解決了,大家也會變得更有信心去迎接挑戰。
給家長朋友們的話
作為一名家長,我也經常會想:孩子未來會成為一個什麼樣的人?應該教給孩子什麼?在眾多我們希望傳達給孩子的知識和能力中,我建議一定要把計算思維列進去。
我從初中開始學習編程,本科就讀於南京大學計算機繫,也寫過不少程序,但真正深刻認識到計算思維的力量,還是在大學本科畢業十周年的聚會上。當時,一位本科同學說他寫了一個程序,為了驗證和調試這個程序,他決定改行做高中老師。他設計的程序是這樣的:
1)將高中數學知識公理化。
2)將解數學題的過程轉化為一個搜索過程,即從題干出發搜索出對應的公理組合。
3)設立幾條搜索優先級規則,實現一個高效的搜索算法。
需要說明的是:這個程序並不是讓計算機執行,而是由人(就是高中生)來執行。一批高三學生在用這個程序練習了一段時間後,奇跡出現了—有一位學生次月考數學成績為41分,第二次月考為71分,第三次月考達到117分,全班第二!
這個例子給了我很多啟示。我開始觀察我們生活的世界,其實很多人的工作就是將各種復雜任務轉變為一個個程序,由政府、企業、部門和個人去執行。計算思維無處不在!我意識到,應該教給孩子們應用計算思維去認識世界、改變世界的能力。然而,在我們從小到大的成長經歷中,卻從來沒有一門課或一本書來專門介紹什麼是計算思維,以及如何訓練計算思維。
於是我們幾位家長決定自己去探索一種給孩子們教授計算思維的方式。這本書就記錄了2020年上半年我們和孩子們一起進行的一次嘗試。正如卜老師所言,這更像是一場親子遊戲,孩子們在學習的過程中始終充滿了激情與活力,也充滿了對新課程的期待。因此,我想如果要再給家長朋友們一個建議,那就是帶著孩子們一起去實踐書中的那些題目,一起去對比分析數學思維和計算思維的區別,一起去體會計算思維的威力。
古人雲:“授人以魚,不如授人以漁。”計算思維,是乃漁也。
中國科學院計算技術研究所包雲崗
2021年10月8日於北京中關村