編程是否該作為基礎教育的一部分?

美國科技公司高管和一些政府官員已經聯名向國會施壓,建議國會通過支持在 K-12 教育中加入編程課程,讓每一個美國孩子都學會編程。學習編程對於小學生和初中生來講有什麼用?從小學習編程對今後的人生有什麼幫助?

補充說明:
1,基礎教育是指美國k12階段教學目標,或國內義務教育階段的教育目標。
2,基礎教育階段的編程教育並非技能教學。
具體可以參考相關網站了解
http://code.org
http://scratch.mit.edu


閱讀寫作是否應該作為基礎教育的一部分?

@David Dong @physixfan :當然得教啊,圈地運動這麼猛,失業的農民不去做文字員,給不會讀書的人代讀代寫書信,還能做啥?

@白如冰 :而且,工業革命後加入了物理,等閱讀革命發生後加入文具學天經地義,不然落後了如何競爭得過火星人?

@蟶子聖子 :只怕未來會出現保存/傳播語音的工具,這文字員也當不成了。

@王贇 Maigo :反對!又不是人人都做文字員的!

@李路 :文字會對所有職業帶來輔助,同時寫作也是很棒的創造方式。

@Mon1st :另外,文字思維還是很重要的。

@馬融 :我來舉個例子吧,一本書中分層成章,段,句,詞, 詞根詞綴,字,書要有主題,章節段落要有邏輯連貫性,句要符合語法,詞,字要沒有錯誤,最好還能押韻,不重複。 層次感,論述邏輯,語法規則,如何選詞,都是文字思維的一部分。

這問題過百贊回答,都忽略了一個根本要素:

計算機是一個完全虛擬的世界,人腦中能想像出的大多都能用計算機模擬。

具體點說,所有人從小時,就會有不同的興趣:有的人喜歡觀今夜天象 ,有人愛看一個齒輪帶動另一個,大部分人都對音樂/作畫感興趣,也有的人偏生鍾愛養小烏龜。。。

這也是為什麼沙推,Lego,往往比各種高科技玩具更吸引人:它們擁有各種可塑性,可以搞各種層出不窮的新玩法。

計算機,有過之而無不及。

就用上面的例子來說,繪畫作曲的軟體多如牛毛,天文學的軟體也有,也有可以模擬天體運行的軟體(Gravity Simulator, by TestTubeGames)。如果有興趣的話,可以在該軟體裡面插入星體,看一下會有什麼影響。。。

然而,這根編程有什麼關係呢?會用軟體,就如同人人會上網會在電腦裡面打字不就好了嗎?

先別急,我們看『模擬教學』的缺陷吧。


問:如果我想畫一顆聖誕樹,多片樹葉之間重複,不就累死了?並且,複製粘貼以後對一片樹葉不滿,不就要所有的都改掉?

答:引入recording,把一段時間內的操作記下來,以後調用該recording就可以了。

此乃函數。


問:如果我想畫多邊形,星型,分型呢?

答:對多邊形,星型,引入對recording進行控制,組合的方案,對分型,引入自指。

此乃控制流,遞歸。


問:畫畫而已,能學到多少東西?

答:並不只是教畫畫,當大家學會畫畫後就可以學其他東西,並且形成連接。

比如說,上生物學/地理學,可以畫出生物圖鑑/地圖。

要學物理,可以通過在畫布上放上Object,並且對之賦予速度/加速度,畫出Object走過的痕迹。對於加速度的導/各種受力分析,唯有靠在已有系統中插入代碼模擬。

此乃Module/Object/高階函數。

見A Critique of Technocentrism in Thinking About the School of the Future,Mindstorms

PS:Smalltalk正是大量借鑒了Logo。見The Early History Of Smalltalk

又答:會寫一定代碼以後,就可以按照自己喜歡的,自己寫各科目的模擬軟體。

如在http://www.papert.org/articles/Nowiknowwhy.html 中,通過編寫詩歌生成器,就知道為什麼要有語法,要有動詞,名詞-這樣能降低毫無意義的話的數量。

此乃程序設計。


問:會不會導致學生之間的疏遠,不會與人交流?

答:編程最是需要團體合作:不會的要問其他人,也不可能自己寫完所有的代碼,需要用其他人的代碼,把自己的代碼供給其他人。

此乃開源,庫API設計。

問:『模擬教學』背後有沒有為什麼要這樣做的理論?

答:見Constructionism (learning theory)。簡單的來說,這方法提議通過提出世界運轉的理論,在上面做實驗驗證,用這理論做各種project,來學習。


問:既然大家都合作,做的東西也各個不同,教師如何評分?又那來這麼多會計算機的教師?換句話說,學校該如何教Constructionism?

答:工業革命時,一個手藝人如何用流水線變得更高效?工業革命從根本上改變了手藝人的工作方式。同理,這種做法(提高個性化,提倡合作,需要專才指導(除了會教原本學科以外,還要會Constructionism,會編程),彈性的時間)是極難融入學校的。因為一般的學習是對學生進行編程,而這方法是學生對學習工具進行編程。

這最好通過線上的互助社區來完成,因為這樣大家互相做的模擬就會留下,供其他人學習,更改,一傳十,十傳百,直到世界上大部分人都採用這種方法學習,各種軟體也因為絕大部分使用者會編程(並不一定是程序員)從而開放API/源代碼,使得人人法律上,技術上都可以定製自己的虛擬世界,才算成功。

The Computing Revolution Hasn"t Happened Yet


編程應該做為基礎教育的一部分。希望國家能夠儘快考慮這件事。

前面的人已經闡述過,在未來的幾十年內,因為人工智慧(弱人工智慧)的發展,將會有很多職業不復存在。一個很明顯的例子就是,未來5年內很可能就是無人駕駛汽車的大發展,這期間原來開了幾十年車的老司機也將會被淘汰。前幾天的 Google 翻譯改版也讓翻譯人員很吃驚,雖然翻譯工作總要人來最後編輯的,但是一個靠譜的機器翻譯將可以使得翻譯效率大大提升,需要的從業人員將會變少,低端的從業者就會面臨被裁員的局面。這種趨勢將是一個不可抵擋的趨勢。

未來的世界,將是不論什麼行業都需要跟計算機打交道的時代,那種技能重複性高、學幾個月夠用一輩子的工作大都會被人工智慧所取代。各行各業都會開始使用一定程度的編程技術提升效率,不會與機器交流將失去生存的空間。

如果國家完全按照現狀坐視不管,將要發生的事情將會是貧富差距的鴻溝越來越大。懂編程的人拿著高薪天天在知乎上炫耀,而人工智慧所取代的那些曾經認真工作的從業者將會失去飯碗、無處謀生。

更可怕的是社會底層家庭的孩子可能仍然要重複他們因為不懂技術而被社會所唾棄的命運。

目前正規編程教育都是上了大學之後才開始的,但是很多中產階級和更高階層的人的孩子們很多從小就已經開展這方面的培養和教育了,即使中產的孩子們小時候不學編程,對電腦的熟悉程度也讓他們可以很快學會編程。而如果一個孩子生在社會底層的家庭,他在上大學之前很可能連自己的電腦都沒有,更別提自學編程了。可能這些人會去網吧玩遊戲,但是如果問他有沒有考慮過寫一個小遊戲的話,他很可能堅信自己做不到,因為就從來沒有接觸過這方面信息,他不知道寫程序到底有多難,也無從入手。如果這樣的情況持續下去,社會階級固化將是牢不可破的,代際傳承除了靠錢來維繫,還靠知識的壁壘。

如果能將編程提前到初中開始學習(可以與物理、化學一起加入),通過中考、高考的指揮棒逼著所有人學習,同時學校能夠配備足夠的計算機設備給需要的人使用,那麼即使有一部分人因為技術進步不幸被社會拋棄,他們的孩子起碼還是有希望的。在我的設想里,中學時候的編程課並不需要是多專業的 C 語言編程,又是指針又是遞歸的。完全可以從 Python 爬蟲之類簡單又實用的項目開始學起,其實學什麼語言都並不重要,重要的是教會學生程序到底是怎麼寫的,教會他們基礎的演算法、邏輯等,同時讓學生知道自己可以用程序做一些事情。將來有了這個基礎,學其他語言、學更先進更時髦的東西都將容易很多。

如果中國在世界上首先培養出了整整一代略懂編程技術的龐大人口,中國在世界上的競爭力也將是無可抵擋的。


基礎教育不是傳授技能,而是培養思維方式。儘早形成對現象的直觀比什麼都重要。

狹義的編程可能是軟體工程師的工作,寫出的程序作為工具或者說消費品來給別人用,那當然沒必要人人都學。王贇 Maigo 的回答針對狹義的編程(比如說大學本科學的C/C++/Java/等等),認為技術性很強,不適合讓所有人學。這一點我想我們是一致的。

廣義的編程則是人與機器重要的交互方式——是你我能夠靈活應用機器的基本手段——在可預見的未來,隨著機器能夠做的事情越來越多,這隻會變得越來越重要。

可能有必要擴展一下我認為的廣義的編程是什麼:我發現一個常見的現象是,沒有學過編程的人對程序有種對未知事物天然的「不明覺厲」之感。一部分程序員則相反認為自己掌握了非常特別的技能,對其他的芸芸眾生表現出優越感:「這個是屬於程序員的問題,你不懂。」 這兩種觀點都很常見,都是因為太多人對程序運行的方式沒有直觀印象而導致的。

有很多簡單的程序語言,例如題主提到的scratch, 又或者小海龜系列(Logo),可能和很多人心中的 「冰冷,複雜,很難編譯成功,debug是噩夢」 的程序刻板印象不同,簡單有趣易上手。編程的本質不過是把人想要計算機做的事情以計算機能理解的方式表達給計算機——這其實是非常容易的,但如果沒有實際編程的經驗,就無法理解和善用機器,非常可惜。正如 @王贇 Maigo 所說,編程思想(我認為每個人都應該學到的東西)要建立在一定的技能基礎之上。

今天的社會有很多很多不需要編程能力和對程序運作基本原理知識的工作可以做,所以會有人覺得

我不會編程我也活得很好,才不要學編程呢!

這是很自然的。

但是稍微看遠一點的話,這樣的工作會越來越少的。

未雨綢繆吧。

@吳穹 :

未來的機械只會越來越智能化,需要的操作越來越簡單。

這是一個很好的點,但是我不能同意。的確,有可能編程作為操作機器的模式會被更先進的方式所取代(也許有一天我可以直接用自然語言告訴機器我想研究某一個問題,機器直接給我做好的結果),但比起簡單的自動化機械和程序,這一發展的時間是難以預測的。

以學用鍵盤打字為例,這相當於說未來我們都用語音輸入了,小孩用不著學鍵盤輸入法。大方向不能算錯,但時間框架不對。

@王贇 Maigo :

考慮到中國教育的實際情況,有很多貧困地區不具備學習編程的條件

這是一個現實的困難,我認為是正確的,但同時這和討論的話題無關——如果你和我一樣認同編程思想的重要性,那麼我們應該做的是努力為所有兒童提供學習條件,並努力照顧公平,而非索性不要求所有人學。

10/3/16 悄悄更新,私貨預警

結尾放一點點私貨好了,嚴格來講不是針對這個問題的回答:

我覺得沒必要區分基礎教育還是高等教育。只要不是專業技能的訓練,哪怕幼兒園教識字,或者大學裡的通識教育,也都是同一個目的:讓學生能看到更多東西。世界這麼大,理解更多的人才能享受更多。

自動化是今天這個社會的一個越來越重要的現象。你可以忘掉應用,甚至忘掉所謂編程的思維方式。僅僅是為了讓下一代理解這個世界,也應該讓他們知道編程是怎麼回事。往大了說,是準備好他們以後去理解人與機器的關係。往小了說,至少可以理解身邊的日常現象呀。


本來不想回答這個問題,但是看到一個有意思的答案,我得點評下

歐姆定律是1826年發現的,法拉第電磁感應定律是1831年發現的,交流電是19世紀後半葉發明普及的,人類才由此進入電氣時代。請問哪個國家1800年代普及了電器的使用?
事實和圖中這位作者說的恰恰相反,前幾次技術革命的相關的基礎知識:簡單機械的原理(滑輪、槓桿)、熱力學定律、簡單的電路原理,早已進入了中學生的課本。
基礎教育階段談不上理和工的區別,只不過在儘可能追趕得上時代科技發展腳步的情況下普及一些常識。電路原理、電路設計、機械原理、機械設計這些都是工科的課程,電磁學、力學是理科的課程。基礎教育不過是通過講解簡單的電路、機械的知識講一些電磁學、力學的常識,根本談不上理工之分。
教育跟不上科技發展的國家當然也有,後果大家都看到了。


一、我的思路

我把問題分解為三部分:

1. 教不教?——編程教育是不是應該納入基礎教育?
2. 教什麼?——編程教育應該教什麼內容?
3. 怎麼教?

請允許我先跳過問題1,直接討論一下問題2和3。

二、關於問題2——教什麼?

我的觀點是:信息學如果要成為基礎教育中和數學、物理一樣重要的學科,首先當然要教寫程序,但還不夠,更重要的是教會學生一句話:

程序設計 = 演算法 + 數據結構

理由闡述如下:決策者在為基礎教育選擇學科的時候,在社會上廣泛普及當然是必須的,其次還要看這個學科是不是能潛移默化地教會學生一些基本的方法和概念,讓他們看到本來看不到的東西,想到原來想不到的東西。討論兩個經典的例子:

1. 配方法和換元法

配方和換元都是數學裡的小技巧。但仔細想想就會發現,初等方程,絕大多數都是通過變換到基本式來解決的。擴大範圍來看,解決很多數學問題都需要reduction,即把一個困難的問題降解到一個更簡單的形式,通過練習解方程,無形中給學生傳遞了一種新方法。

2. 受力分析

靜止不動的物體也有相互作用的力,新概念讓學生看到了本來看不到的東西。

編程這種活動,能傳遞給公眾什麼新方法?什麼新概念?我認為程序和演算法設計中至少有四種方法,三種概念是現代人必須掌握的:

方法:窮舉,貪心,分治,歸納(分治也可以算入歸納)

概念:可計算性,formal languages,過程和函數

這四種方法不是因為計算機出現而新冒出的東西,人類很早就有了這些思想。比如窮舉法:

以下哪個選項是方程x^3+x^2+5x-7=0的根?
A.x=0
B.x=1
C.x=2

聰明人是不會照求根公式計算答案的,只需依次帶入三個選項,驗證多項式值為零就可以了。計算機出現之後,窮舉就變成了非常重要的一種思想了,四色猜想就是這麼利用計算機證明的。

很多計算機科學家都認為,歸納(或遞歸)是計算機科學裡最重要的思想方法(沒有之一)。高中數學雖然也講歸納法,囿於場景不多,不能深入闡述這種思想方法的價值。而程序設計至少可以在三個層面上將歸納法用到「泛濫」的程度:

1. 用歸納法描述問題
2. 用歸納法解決問題——比較有特色的是各種動態規劃
3. 用歸納法分析問題——比較有特色的是各種程序的複雜度分析和正確性證明

再說說程序設計帶來的重要的新概念,我覺得這些概念比方法還要重要。

【新概念一】 formal languages

程序語言是一種formal languages,相比自然語言,程序語言更講究規則。學外語要學語法,有些人不以為然,從實用角度來說,不學語法是捷徑,但會損失一次接近形式化語言的機會。幾何證明和尺規作圖是另一次機會,但聽說最新的教綱把它們也刪了,實在不可理解。從formal languages的角度來說,程序設計給人帶來的重要概念至少有:

變數、變數類型;
變數通過運算符組成表達式;
表達式組成語句;
條件和循環;
語句可以複合,可以嵌套,組成更複雜的程序。

【新概念二】 過程和函數

函數引入的概念也都是革命性的,比如

遞歸(recursion)
迭代(iteration)
封裝(encapsulation)
泛化(generalization)

【新概念三】 可計算性

任何設計工作都是在各種條件限制和相互矛盾的需求之間尋求一種平衡。這種觀點反映在程序設計上,就是硬體存儲空間與程序運行時間的限制。(from wikipedia)


當一個接受過程序設計訓練的人,面對一個非常具體的問題的時候,他會問:這個問題是可以計算的么?如果可以,需要多少資源來進行計算?沒有接受過訓練的人,只憑藉直覺往往會做出錯誤甚至可笑的判斷。

比如面對NP完全問題:
沒有接受過訓練的人,往往會低估問題的難度,意識不到這個問題是不能用更大的計算資源(時間,機器等)來徹底解決的,就算你是馬雲也不行;
只接受過一點訓練的人,往往會高估這個問題的難度,認為NP完全問題就是完全沒辦法的意思;
成熟的演算法設計人員,會知道這類問題中的絕大多數可以通過各種巧妙的約束來獲得比較理想的解,但就算是他們,也對最後一小部分的難題也是束手無策的;
躲在角落裡的密碼學家卻如獲至寶,把這些沒人認領的孤兒統統納入自己的研究範圍里,並且日夜祈禱人類不要找到解決它們的演算法。

哲學家都應該學一下計算複雜度這門學問,如果你發現了問題A的解法,你可以成為演算法設計專家,如果你證明了問題A是無法解決的,你可以成為密碼專家。同一個問題走向兩個極端,都是有正面意義的,這樣的思維體驗是很有啟發意義的。

不明白程序設計基本原理鬧笑話的例子有很多:鎌池和馬在《魔法禁書目錄05》里介紹超級電腦TreeDiagram時寫到——

「樹狀圖設計者」的演算模式並不特別複雜,但是演算的量實在太過龐大。人類所使用的「1×10=10」的計算式到了機器上會變成「1+1+1+1+1+1+1+1+1+1=10」這樣的演算方式。

算作者修正了這個不靠譜的比喻,他的觀點也是錯誤的。算的快的前提是算得巧。小高斯都能發現1+2+dots+100=101	imes 50,將1	imes 10拆開簡直是在開歷史倒車(不過這不影響我對炮姐的真愛)。

三、關於問題3——怎麼教?

上一章節討論了程序設計可以給學生帶來的新概念和新方法。落實到實際行動的討論上來,就需要問:程序設計這門學科,是否已經做好了編成教材,進入課堂的準備了呢?我的觀點是:現在已經成熟了,就等著人去做這個事了。可以看看下面這三道題目:

【例一】給定一個整數序列a_1,a_2,dots,a_n,定義	ext{Max}[i,j]	ext{Min}[i,j]分別為連續子序列a_i,a_{i+1},dots,a_{j-1},a_j中最大和最小的數字,試求

sum_{1leq ileq jleq N}
(j-i+1)cdot	ext{Min}[i,j]cdot	ext{Max}[i,j] 
mod 10^9

【例二】給定一個整數序列A=a_1,a_2,dots,a_n,定義	ext{M}(A)為該序列中任意兩個數字之差的絕對值的最大值,即	ext{M}(A)=max_{1leq i<jleq n}{|a_i-a_j|},定義	ext{m}(A)為該序列中任意兩個數字之差的絕對值的最小值,即	ext{m}(A)=min_{1leq i<jleq n}{|a_i-a_j|}。現在必須從 A中去掉k個數字(k給定),記剩下的序列為A,問	ext{M}(A最小是多少?

【例三】給定一個01序列x_1,x_2,dots,x_n(每個數字不是0就是1),再給定n個方程,其中第k個方程的形式為sum_{kleq ileq T_k}x_i=1,方程中的參數T_k也是給定的(當T_kgeq k時表示方程有效,T_k<k時表示方程無效)。在滿足所有有效方程的條件下,sum_{1leq ileq n}x_i的最大值是多少?

雖然出現了很多sum,但這些題目不是數學課上會討論的內容,它們都是典型的演算法設計習題。舉這些例子,我想說明演算法也可以做得非常符合應試教育風味的——

題面容易理解;
評卷客觀;
思考有深度;
解法有技巧性,技巧之間有聯繫,也有一些規律;
死記硬背的效果有限,但堅持長期訓練的學生還是會佔據優勢。

這些都比較符合「通過教育選拔出聰明或勤奮孩子」的主流價值觀。

順便一提,這三道題目應該在O(n)O(nlog n)的時間複雜度內完成。樸素的高次方演算法不算正解。如果將解法展開,窮舉,貪心,分治,遞歸這四大方法都會出現在分析里。這三道題目最終都需要利用「單調隊列」這個技巧,所以它們可以放在一節課里完成。正解程序不長,每題大約50行。

我做個預言:五十年內,這類題目必然會出現在高考卷子上。起步的幾年當然不會考得這麼難,慢慢就會達到這個程度。人類學習的潛能是很大的,幾件有趣的事情:

1. 二戰前,實變函數是最厲害的數學博士才能明白的東西。程其襄教授原在德國留學,建國後在華師大教書,不但能講實變,而且還編了教材,當時大家都佩服得不得了,教材被當成了寶。現在這門課是一門很常見的本科生課程,我看到網上對程老這本教材的評價,一些不懂事的人會覺得沒什麼特別的。

2. OI歷史上第一次出現動態規劃這個考點是在1993年的IOI,這道題目是關於Bitonic tour的。沒有人當場滿分,這題最早出現在一篇論文里,後來收進了CLRS。動態規劃在20年前是相當高大上的,現在看來應該是well-known的題目,都是當年全國決賽的題目,現在拿來也只能做給初中組的初賽壓壓軸了。

3. 陳振宣老師在1999年的時候告訴我(一個初中生),他講的題目(一些相當普通的,利用因式分解來化簡計算的題目),是1900年左右劍橋大學數學博士生入學考題,amazing。

這些事給我的啟發是,教材內容的來源應該是:論文 =&> 大學教材 =&> 競賽 =&> 中學教材。既然人類早已成功地將原本很高大上的內容搬到中學課堂里,我覺得再去討論如何教孩子寫程序就沒必要了。未來的老師一定有足夠的智慧搞定這件事。而且我也做過一些驗證,平均年齡13歲到16歲的孩子(初二到高二),數學成績在上海保持中上水平(區重點普通班中游),學習2年,上機200-300小時左右,稍作提示後,大約80%的孩子可以在一到兩個小時內完成【例一】這樣的題目(樣本數超過100個)。

四、關於問題1——教不教?

洋洋洒洒說了這麼多,我的立場已經很明顯了——教不教已經不是問題了,問題是教多少,怎麼教。

可喜的是,這件事是在慢慢推動的:上海的高中教材里,「演算法初步」這個章節,本身就是必修的(雖然說實在講得太簡單),「信息技術」這門課,也是必考的,唯一沒做的就是將它納入高考。浙江已經加了一門「技術」科目進高考,但編程的內容還很少,希望能朝正確的方向上發展下去。


我認同編程在現階段是一項很實用的技能,應該在義務教育階段有所涉及,至少給來自不同階層的孩子有一個接觸的機會。但是這個問題下的不少答案讓我想起了阿西莫夫所描述的「電梯效應」。

電梯效應:形容人們在對未來進行預測時常會因缺失某種關鍵因素而導致全盤錯誤。例如19世紀的人即使預測到摩登大廈的出現,但是由於無法預知電梯的發明,便會因此而產生「大廈高層的人不便外出,因此每座大廈內都將形成獨立的生態圈」這樣荒謬的推論。

弱人工智慧會接過機械自動化和工業革命的接力棒,進一步降低人類對低技術水平人力的需求——這是我們現如今所能預見的「大廈」,但如果僅就此做出「萬般皆下品,唯有編程高」的判斷,恐怕就是忽視了「電梯」。

若是參考摩爾定律,一項在某個時期只有少部分精英能接觸的技能和工具,在一段時間後就會為極大量的普通人所掌握,那麼以該技能為基礎的職業就會迅速貶值。70年代的司機屬於高薪職業,而如今即便不算收入底層,賺的也都是辛苦錢。
在圖形操作系統問世之前,連使用計算機都存在一定門檻,現在的普羅大眾即便對DOS一竅不通也可以流暢地瀏覽互聯網。我個人認為同樣的事也會發生在編程上,要麼是編程技能本身的難度進一步下降,或者是產生可以繞過編程而達到目的的工具——這就是「電梯」。

所以我認同在義務教育里增加相關內容,儘管我對其現實意義存疑。但我反對說這能給貧苦階級的孩子提供翻身機會的說法,正相反,倒像是個把低價人力引向下一個市場的斜坡,只不過這可能本就不是個選擇。

另一方面,教材是存在滯後性的。80年代,如何使用打字機和五筆輸入法來進行信息輸入還是一項專門的中學課程,而這在如今已經幾乎不能算是個技能了。這就是我為什麼對開設編程課的現實意義存疑。

實際上我倒是覺得比起計算機教育,現在國內對於各個階段的語文教育重視太低,國民的平均閱讀理解能力和表達能力都完全跟不上生產力的需求,造成了大量人力物力的浪費,進一步提高學生們的語文素養,那對國家各方面的發展幫助都是很大的。


我來唱個反調吧:我不支持現階段把編程作為高中及以下年級的必修課程。理由如下:

第一,認為編程應當作為必修課程的人,理由一般是這樣的:如今的工作和生活越來越依賴於編程帶來的自動化、智能化,不掌握編程,將被時代淘汰。然而,對於普通人來說,若要不被時代淘汰,需要掌握的是自動化、智能化工具的使用,而不是製造。從這個角度來講,應當加入必修課程的是 Excel、Google、Siri 等工具的使用方法,而不是用來製造它們的編程。當然,這些工具的使用方法不見得非要在學校里教,其中有相當一部分可以在日常生活中自然習得。

第二,編程是一件技術性很強的工作,並不是所有人都能勝任。就我觀察,我身邊即使是計算機專業的人,也有一些並不具有編程所需要的思維方式。如果要求高中及以下的學生掌握編程技能,對於不少學生來說是強人所難。題目中說「基礎教育階段的編程教育並非技能教學」,請問「非技能教學」是指什麼呢?如果說是編程思想,那麼思想也要建立在一定的技能基礎之上呀。

第三,考慮到中國教育的實際情況,有很多貧困地區不具備學習編程的條件,無論是設備還是師資都嚴重缺乏。如果把編程作為高中及以下年級的必修課程,意味著高考、中考、會考中至少有一者會考到編程,這對於貧困地區的學生非常不公平。

綜上,我覺得編程是一種具有專業性的技術,並不是人人都需要掌握的技術,適合作為大學的專業。在高中及以下的階段,對於有興趣和能力的同學,可以開設編程的選修課,但不適合作為必修課。


老實說,我們高中的時候就有編程課,是一門數學的必修課——其實是選修課,只是因為鄉下買不到另外一本數學書,所以成必修了。

我小學的時候就在我們村裡的小學老師的幫助下學編程了,所以我覺得「計算機教育從娃娃抓起」是沒有問題的。


語文、數學、英語、物理、化學、生物、地理、歷史、政治、音樂、美術、體育。

上面這些是基礎教育的組成部分,請問哪一門課可以讓你「學好了就能找工作」?很顯然,沒有。

但,編程就是這樣的課。

所以,編程永遠都不屬於基礎教育。

基礎教育,絕對不能有「職業導向性」的課程,否則就違背了基本的教育共識:不要過早分專業。

答主歡迎一切評論,不過麻煩評論者先搞清楚理科和工科的區別。謝謝。基礎教育不會包含工科。

另外,我要提醒某些朋友,你可能從一開始就認為目前人類的基礎教育時間太久了 ---- 換句話說,你的這個觀點,和「編程是否應該作為基礎教育」無關。或者我這樣問一個問題:不要考慮編程,你是否認為從7歲到18歲的基礎教育時間太久?

================== 回複評論區 ===================

什麼是基礎教育。

基礎教育就是基礎教育,它只涉及人類幾百年前的理論知識。基礎教育的目的在於讓學生儘可能多地了解現在人類有哪些方面的生產活動,它不支持學生去解決實際問題。另外,中學做的各種各樣的理科方面的實驗,都成為「驗證型實驗」,而不是「探索型試驗」。比如,我已經告訴你F=ma了,然後你去做實驗去驗證,而不是我不告訴你F=ma,然後讓你自己做試驗去找到這三個物理量之間的關係。

如何入門編程。

學過編程的人都知道編程應該如何入門 ----- 一定是找一門編程語言去學習。要說這種學習方式沒有職業導向?這是不可能的。也就是說,不論你讓學生學習編程是什麼目的,只要你讓他學,就無法避免職業導向。

為什麼?

因為編程屬於工科。工科的本質是工程學思想。工程學思想所支持的範疇內,就不可能「只學理論而不涉及實際應用」。

有朋友以數學方面的研究需要matlab為例說,編程是工具,可以提早學習。我要說:沒必要。如果你只是把編程當做工具去學,而不在工程學的思想的引導下去運用編程的話,其實國家早已考慮到了這一層面,因此有了「大學計算機二級考試」:不是計算機專業的學生要考計算機二級。你考過了,就有了「把編程當做工具使用」的能力。以數學研究為例,你如果需要用到matlab去研究數學,那不用問,你肯定讀到Master了,因此在本科完成計算機二級考試是OK的。我在盧森堡工作期間,認識了國內到盧森堡讀博士的朋友,他是學生物的,對編程的了解就是從國內的計算機二級考試來的。他在研究生物期間,需要和他的導師和小組成員使用java編程,這是他除了計算機二級考試外第一次接觸編程。事實證明,他只用了兩三天的時間就可以使用java去完成他的相關研究了。因此,如果從純工具的角度,沒有必要把編程下方到基礎教育里。

因此,可以得出這樣一個結論:如果你懂某一門或者某幾門編程語言,卻不懂編程思想,那麼你就只能把編程當做單純的工具去使用,這種情況下,根本沒必要讓編程進入基礎教育。

說到這裡,就要談一下:什麼是編程思想。

編程思想的本質,就是工程學思維。工程學思維的本質,就是:如何應對增刪改。

比如,你會用轉頭蓋樓房,但是你蓋完樓房後,發現你只是想修理樓房裡的一扇門,卻要把整個樓房的架構圖都看一遍、或者說你就需要把整棟大樓全部推倒重蓋一次,這就是「沒有工程學思維」。懂某些編程語言的語法卻沒有編程思想的人就是這樣的蓋樓者。他們只能把編程當做單純的工具使用,他們不需要也不應該考慮過多的其他事情。如果他們在使用編程中發現他們必須長期考慮如何應對增刪改,那麼正確的做法是:請找專業的軟體開發公司去給你開發一套系統。隨著社會的發展,分工是越來越細的,既然你研究數學,你就好好研究,你不需要半路跳到編程里再研究個幾年。

回到上面的問題上:什麼是編程思想。

還是那個蓋樓的例子,有編程思想或者說有工程學思維後再蓋樓,就絕對不會出現「修一扇門要拆整棟樓」的事情發生。再比如你在這裡要修一條路,你修路之前,就要想清楚:你現在修的這條路,如果要在它的基礎上再加新路,方便嗎?如果要改這條路呢?如果要拆掉這條路呢?------ 這是編程思想。這種思想的建立,一定是基於真實的項目中,在課堂上講基本沒用。你找本講得很好的設計模式的書,看上十幾遍,也不如你親自做兩個項目。

很顯然,有些朋友,其實是不理解什麼是編程思想的。也許在他們看來,會用循環實現1加到100就是編程思想?如果這就是所謂的編程思想,那還用專門開設課程去學嗎?就像我那位朋友一樣,隨便過個計算機二級就都會了然後就可以把編程當工具去用了啊。

相關鏈接:如何改變「中學生學編程無用」的觀念? - 知乎

再說得通俗易懂點:你在簡歷上寫你會高中課程,是找不到工作的;但是如果你寫你會編程,是可以找到工作的。

=================== 一些人學習編程的目的並不純潔 ==================

這是事實。

很多人說,學編程,可以給他解決實際工作中遇到的問題。

對此,我只能說,你非要用編程去解決你的那些問題,我承認這是可行的,但恕我不能認同這種方法是最優的方法。有一種東西,叫計算器;有一種軟體,叫office辦公軟體;有一種東西,叫互聯網。

如果計算器 + office + 互聯網還不能解決你所謂的「工作中的問題」而你所說的編程卻可以解決,那麼我非常歡迎你把這種問題貼出來讓我們大家看看,反正我是沒見過。

說白了,那些號稱編程可以解決工作中問題的,恕我直言,在我眼裡你們只是在裝13。

曾經和一個認同全民學編程的人辯論過,他說他支持中學教編程,因為很有用,他說他女朋友做文案工作,曾經處理過大量的數字計算,就是把好幾列幾千個數字做一些四則運算,然後得出一列計算結果。他的方案是:先把他女友的excel文件轉換成csv,然後用python寫了個腳本去處理,得到新的csv文件再轉換成excel給他女朋友。他說如果沒有他,他女友就要一個一個去計算......對此我只能說:您很成功地在您女友面前完成了一次裝13,但是,這些事情excel都可以直接做到......比爾蓋茨表示困暈在廁所:我花這麼大力氣開發的工具,你們居然不用而要去重複造輪子......


我贊成中小學生儘早接觸編程,但不能走到現在英語教育那條路上去。
現在的英語教育,以應試為目的,將語言當成一門「學科」去學,結果是學了十多年,多數人仍然是啞巴英語。
計算機要走英語的老路的話,N多人到畢業恐怕還是不能具備編程解決實際問題的能力。


我認同編程應該作為基礎教育的一部分,但是並不是因為這項技術緊跟潮流,非常重要。

基礎教育的目的不是為了教某種技術。比讓孩子學會寫代碼更重要的,是了解這樣的一種思考問題的方式。而信息科學,是科學領域的重要部分。

我所在的大學推崇『通識教育』,程序設計是所有學生的必修課,即使其要求的確很低。但是從我身邊學過這門課的非理科同學來看,他們從中受益匪淺,他們知道了原來等於號還有一重概念叫『賦值』,知道什麼是一個基本的『演算法』,程序大致如何工作。或許他們並不會去編程,但是這種思維方式,隨著信息時代的到來,會產生很大的幫助。

開玩笑地說,起碼能減少很多『就差一個程序員』的段子,也能減少很多僅因為AlphaGo就認為天網來臨的人。

現在的基礎教育里本身就含有了信息課,除了應試教育下沒有受重視外,我覺得已經足夠了。在基礎教育里,與物理化學作為科學學科教學並無二致。

------

原答案:

我們高中有教VB編程,然而因為會考時候計算機不計入總分,上面非常不重視,同學也隨便混混抄襲嚴重。(然而選了VB作為選修已然超過很多選flash的學校了……)

編程重要的是跟上這個時代與計算機交流的方式。即使不從事相關的工作,它也與物理化學歷史地理一樣重要,建立著信息社會的基本邏輯。

哪怕僅僅把這門課算入小高考,拿A加高考一分,不及格不能高考,就這樣,就絕對足夠作為基礎教育了。


編程應該做為基礎教育的一部分

1,「自動化工作」,對其他領域的學習和工作有輔助作用,編程是非常有用的泛用型工具技能,科學,經濟,教育,機械生產等幾乎所有領域都需要用編程來提高效率

2,「創作」,和繪畫,寫作一樣,編程是種創作的手段,表達和展現自我的思想與風格,與其他創作手段相比,編程的能力更強,影響力更大

3,「邏輯思考」,軟體是人類能製造出的最複雜事物(可高達九個以上抽象層次次),編程基於邏輯,訓練這方面的思維非常有效

4,「交流」,可用於在世界範圍跨國跨語種交流,學習某種編程語言的難度,是大大小於自然語言的

5,「易入門」,編程入門並不需要很多前置課程,但精通並不容易,這是基礎教育的重要特徵


應該,因為這是有創造力的活動,就像棋類技能,音樂技能一樣。

而且,如果發達國家一旦這麼幹了,發展中國家的政府也沒有多少選擇,基礎教育是國家戰略,別人教中國不教,十幾年後就是巨大的蝴蝶效應,影響國家科技競爭力。

但我不相信中國目前的教育體制能吸納編程教育,這其實跟其他素質教育科目一樣,比如棋類音樂這些素養,基本從來沒有貫徹得很好得。因為不考試啊,高考不考。

但國內是有藝校這樣的輸送渠道的,編程或者可以作為一種技藝來考核,讓有天分的小孩能有繼續訓練深造的機會。

否則和高考的科目爭,肯定是爭不過的,很容易成為雞肋,結果沒有培養起小孩兒興趣,反而摧毀了他們的興趣。嗚呼哀哉。


我感覺最大的問題是師資力量嚴重不足.

以現在我國會編程的人數來看, 不可能作為基礎教育. 更糟糕的是, 會編程的人在IT行業拿著高薪, 會去學校當老師?

如果一定要作為基礎教育, 很有可能只學理論, 沒辦法學會真正的編程(上手編程), 因為"編程老師"也不知道怎麼編程啊, 只能照本宣科.


大力支持,無需必修
對編程的「支持」,優先順序並不高於法律、經濟、外語、體育(相信我,這些科目欠缺很大)我同意@王贇 Maigo,必修「軟體使用操作」而非「developpement」。

支持方高票答主,基本是留美博士、C9大學生、IT相關從業者,要麼身處美國這種IT氛圍濃的國家、要麼是清北南復科學生智商超群,要麼是科研中無法迴避編程。故而根據自身的經驗或自己的圈子認為,「技術可以下放簡化、編程理念應該學會,人機交互思想應普及」

但是經驗性判,精英的眼界也會偏差,先入為主的從(偏向)編程論證,而不是從大眾教育出發,自然就會得出IT大法好的結論支持派答主的並集之外,群眾數量可能更大,對他們而言編程恰恰不是必須的,即使編程思想,也並無裨益。對這些人,把教育資源優先放到法律道德等方面,對公對私邊際效應都更大。

即便把討論範圍限定在編程教育之內,懂編程會編程的人也會低估教育難度。假如你熟悉多態繼承、design pattern,那很難想像「鍵盤」、「雙擊」、「執行」、「打開、關閉」這樣的辭彙,對新手都很抽象(有同學支教計算機課簡直抓狂了),哪怕985的學生,沒接觸電腦的,也要花3個學分的時間學windows系統。

有人拿機械時代的技術教育打比方,確實普及了槓桿、鏈條、滑輪、齒輪原理,甚至螺絲、鎚子的使用,這恰恰相當於計算機操作層面。
而編程層面,對應機械時代,則是礦石煉鐵、氣錘鍛造、車床車削、絲錐插紋、淬火強化等加工過程。普通人無需知道螺栓是這樣一套生產程序,只要會比口徑、扳手擰即可。
而到了智能階段,機器學習,對比機械時代,更是到了流水線優化、自動化反饋、傅立葉震動分析的程度上。但是只需要打包到模塊,告訴工人哪個部件能減震,哪個操作能自動調節熱機轉速,這就足夠了。

至於@王贇 Maigo 提到的資源問題,這更是重中之重。

  1. 師資方面,受勞動力市場宏觀調節。IT人員薪資偏高,計算機老師改行職業碼農,薪水可翻2-5倍。如果普及編程教育,要麼增加師資預算,要麼僱傭編程技能偏低的老師。
  2. 硬體方面,計算機不僅貴,且易折舊貶值,計算機更像流動資產,很多公司租而不買。這根體育課的雙杠、音樂課的鋼琴不一樣,設計壽命幾十年。計算機三五年更新一次,所以企業偏向租計算機而不是買(也有財務減稅考慮)。重點學校還好,讓農村中學,每年更新50台計算機,遠不如把預算放在英語教育上實惠。買點試管硝酸鉀、顯微鏡、實驗設備,改善物化生科目紙上談兵的空缺,也划算點。
  3. 管理方面,這更是中國特色。學校不能像市場化的私企一樣理性操作,無法在計算機使用壽命以內,優化其教育資源的效用。即便重點學校,實驗室建好了,器材也購置完備,就是不給學生使用,或是應付領導檢查、榮譽評級,或是因為管理偷懶、風險規避、等等特色因素,不能物盡其用。領導私自把教室出租給企業培訓的屢見不鮮,小縣城把機房承包出去做網吧的也非天方夜譚。

最後回到開頭部分,從教育整體需求全體中國廣大群眾樣本看,編程優先順序並不高,肯定低於道德、法律教育,等同於經濟、外語教育,資源上或許應為數學、語文教育讓步。

語文例子:程序員和產品經理的撕逼現象,必然是一方語文沒學好,項目功能的表達理解溝通環節出了問題,文不對題、詞不達意,無法把程序的功能、架構、維護、兼容、優化細節,用普通話或者方塊字一一對應翻譯出來。

數學例子:多教點應用性的概率論、統計、中位數概念等等。免得一群會計算機的人在網上,為了「初中畢業生當老闆僱傭博士」這樣的異常數據撕逼。


答案是肯定的。我也會用行動來支持。


不應該!

絕對不應該!

理由嘛,咳咳……上面不是說了很多了嗎?我舉雙手雙腳贊成!

絕對贊成!!!

對了,弱弱的問一句:

三年級的小孩學什麼編程語言比較合適?

我想給我家小孩玩一玩,嘿嘿,就玩一玩,真的。


我這代人經歷了計算器進入中學課本,乃至高考可帶計算器的轉變。但那時候,大部分人對計算器已經不陌生了。雖然教的時候已經滯後了,本已無教的必要了,但還是正而八經地教、納入大綱,高考准行等,這就只有一種姿態上的意義,就相當於宣布說:懂用計算器是公民常識。

原來,在現代社會,通過以「中學教不教」作為規定或標誌,「什麼應該是公民的常識」這種事情是可以被官方清晰界定的?或者說,清晰地去界定這件事情,在現代社會中是十分必要的?同樣是不懂用計算器,如果中學不教這個,那沒什麼;但如果中學教的你還不懂,那就可說句「你達不到公民的標準」。原來「中學教不教」,是有這一層意義的?

我能想到的其中一種思路,跟這個答案類似:編程是否該作為基礎教育的一部分? - 知乎 ,道理就跟「公民受教育權利「,實施九年義務教育的道理是一樣的。考慮一個極端cynic的人,只要中學不教什麼東西,他都可以批評說:哼,所以只有有錢人家孩子才會接觸到XX,思路更開闊,從而變得更優秀;窮人家孩子註定更艱難。這很大程度上是事實。很多農村學校的英語教學水平就不高,也沒有條件搞教學大綱內規定的化學實驗,更不用說教師進行演示實驗的條件了。而我聽說廣州有的中學購買掃描隧道顯微鏡,海外名校博士畢業的教師帶領高中生「搞納米技術科研項目」。但是否要給每個山區中學提供一名北美PhD和一台掃描隧道顯微鏡呢?

關鍵是,說」大家都要上得起中學「是籠統的。中學到底教什麼?例如,為什麼人人都上得起的中學不教彈鋼琴,卻教C++?義務教育的普及是花納稅人的錢的,會不會浪費了?這應該涉及到教育學裡關於在現代社會,我們在公民教育方面,追求什麼樣一個理想,我們願意或不願意為什麼樣的培養目標買單。不懂音樂,成了個音痴,很可能就不是現代公民教育的理想狀態,但又不至於要求都能彈奏小星星變奏曲。於是,本來音樂自己有自己的學科體系,但是為了現代公民教育,音樂學家要從原有的知識體系里,擼出一套「可以作為所有公民常識」的部分,供中學教授。很可能音樂專家們和教務處為此會成立一個中學音樂教材的委員會,爭論一切問題,包括音樂課占學生總課時多少,有沒有時間教懂五線譜,還是只教簡譜算了,而且還要考慮貧困山區和發達地區的平衡。不光音樂,語言、數學和各個自然科學都另外花時間討論過,自己學科里的啥可以抽出來形成一套中學教材,只是傳統科目像這樣討論發生得非常早,但從未停止過。我中學的時候數學就不講積分。

唉,歸根結底還是窮。北歐國家會為這些事情糾結嗎?我總覺得中國人有平等恐懼症,不滿足於與他人平等的狀態;必須高於他人,才有安全感。這就是為什麼中學會發展到買掃描隧道顯微鏡。這種特質一方面激勵了我們國家迅猛的發展,另一方面也讓生活在這個社會變得異常艱難,為了成為人上人,不得不吃苦中苦。


我覺得高中學SICP就挺好,知識結構也夠了,能很大提升學生的眼界。
不過國家義務教育一個最終要的目的在於將家長從照顧小孩的任務中解放出來,更專註地從事社會生產,義務教育的這個目標是實現得很好的。排除那些精英學校,普通學校教學效率之低實在是令人髮指,如果國家真的希望通過教育來提高國民的平均素質的話,這個目標根本沒有實現。


基礎教育中不應該包含狹義的編程,但是應該包含廣義的計算機科學

應該包含基本的計算機組成原理,計算機網路,和操作系統的知識。基礎教育中的計算機科學教育應該回答這樣的問題:「計算機是什麼」,「計算機網路是什麼」,「計算機軟體是什麼」,」計算機能夠做什麼「,」計算機不能做什麼「

同樣也應該包含基礎的離散數學和線性代數,不過這就更多的和數學,邏輯,思維方式相關了

這樣做有一下的好處:

1.有利於學生理解計算機的構成和工作原理,幫助學生更好地選擇計算機硬體,有利於加速農企奸商的倒閉。

2.有利於學生理解計算機軟體的工作原理,使得學生能夠理解自己」究竟在做什麼「,有利於保護學生的信息安全,幫助學生更好地使用計算機,有利於大幅減少360,金山,百度用戶。同時使得學生能夠理解計算機軟體能夠用來和不能用來做的事情,有利於減少不靠譜的產品經理。另外,學生可以了解到用戶對localhost具有完全控制的能力,有利於HR區分腳本和後門強迫網遊廠商寫出更可靠的代碼。

3.有利於學生理解計算機網路,有利於學生理解網路安全和黑客技術,幫助學生更好地保護自身網路安全,減少學生遭受某些中間人攻擊和釣魚的可能性,有利於減少電信詐騙和360用戶,加速360倒閉。


這些常識,破除計算機技術的黑箱狀態,使用戶不再認為計算機技術是魔法而自己是麻瓜,同時從業者也不再自認為是魔法師,是相當有價值的。


推薦閱讀:

Visual Studio 有哪些好用的插件?
關於後端程序員寫前端用什麼框架更好?
你見過哪些奇趣的代碼注釋?
如何評價 @左耳朵耗子 關於建設團隊的一條微博?
會計轉行從事 IT,如何在一年時間內全職學習?

TAG:教育 | 編程 | 基礎教育 | 編程學習 | 兒童編程 |