對於非工科專業,當前大學程序設計基礎教育是在誤人子弟_風聞
莽雷-2020-11-22 20:06
當前大學程序設計課程存在的主要問題有以下三個方面:
1 課程內容設計
1.1 程序設計思維缺陷
我們都知道:程序設計=算法+數據結構。不要一看到算法和數據結構就想到樹、圖算法之類的。算法也有簡單和複雜之分。求一個一元二次方程解的思路是算法,對一個網頁進行解析是算法,最短路徑求解也是算法。對入門級的編程基礎課程而言,數據結構只要能學到二維向量的表達和運用就ok了。
要解決一個問題大致需要幾個階段:分析、建模、求解、評估。對應到程序設計領域大致是:分析、算法設計、編程、測試。
程序設計裏面最重要的是問題分析和算法設計。問題分析清楚,才能設計算法,算法設計好了,才可以根據需要選擇適合的編程語言和工具。在有限的程序設計課程課時下,各方面的思維和知識都需要去構建,這對學生和老師都是困難的。但是程序設計的先行後續關係是不能改變的。我們應該做的是把最重要的分析問題和設計算法的思想傳授給學生, 而不是急匆匆去教語法。現有程序設計課程內容幾乎都是語法知識的堆砌和其應用,幾乎沒有體現程序設計的思想。學生連問題都沒搞透徹,就讓他們去編代碼。這樣的後果是學生既沒有學會程序設計的精髓,枯燥的語法如果久不啓用也會很快在大腦中煙消雲散。
1.2 課程中題目設計割裂
現有的程序設計教材中的案例、習題幾乎都是割裂的一個個小問題,相互之間幾乎沒啥關係。這樣割裂的題目設計不利於程序設計裏面建模思想、算法設計思想、編程中結構化和麪向對象思想、系統化思想的傳授。在學習程序設計的時候我們是一個個零散的小題目,而在後續的不管是科研還是應用過程中進行程序設計卻是圍繞着一個大的問題展開的。問題小就意味着各種思想的傳授不深,不廣,散亂,浮光掠影。
林羣院士曾對微積分教材説過這樣一句話:假傳萬卷書,真傳一案例。我看用到程序設計課程內容設計上也是一樣的。
2 當前大學程序設計課程結構不利於知識向中小學傳播
在人工智能時代,部分大學生接受程序設計課程教育後是要進入中小學等機構當教師指導其他學生進行程序設計啓蒙的。大學程序教學內容的偏差會會出現以下問題:
2.1 帶偏程序設計課程內涵
俗話説:有樣學樣。老師怎麼教,學生就會怎麼把這種知識向外傳播。如果在大學時候學生接受的只是一門複雜的如C和C++的編程語言語法知識,那麼以後他們成為中小學老師後也會也會這樣向自己的中小學生只傳播編程語法知識。
2.2 扼殺青少年對程序設計的興趣
我們看到現在學校裏面的程序設計幾乎都是無休止的刷題,而且是刷C語言或者C++題目。其一、由於中小學程序設計課程側重於編程語法,要想實現與其他科目的關聯難度太大(數學除外,但數學對於很多中小學生本來就是一難題),使得中小學程序設計過程內容偏難,很多學生早早放棄程序設計。其二,中小學生的時間有限,不可能花太多時間在程序設計課程上面,如果編程語言學習曲線過於陡峭,也只能讓他們早早放棄,而學生在小時候的程序設計思維的訓練應該是更容易接受的,如果能夠與其他學科結合,比如可以用程序設計實現作曲、繪畫、劇場實現,打遊戲等等,後續效果也是最大的。
3 當前程序設計語言的選擇不符合當今時代發展趨勢
3.1 還在把C或C++作為大學編程基礎語言的選擇不符合編程語言發展主流。

從圖中,我們可以看出20年來居於主流的編程語言是Java和C語言,而近年來發展最快的是Python語言。但是很奇怪的是以前我們一直選擇的是C作為基礎語言,而不是Java,當然這可以歸結於歷史的原因,可這3,40十年的歷史也忒久了吧。但是很奇怪的是都2020了,接下來很多大學編程基礎課程拋棄了C語言,卻選擇了C++,而不是Python或者Java。
自2017年以來,IEEE Spectrum發佈了各大編程語言的年度排名公佈,最流行的語言都是Python。

2019年,國際奧林匹克信息學競賽把 Scratch, Python, Java, C++ , Delphi五種語言作為參賽語言。
3.2 C和C++學習曲線相對較陡,對後續課程幫助不大。
C語言的指針,C++的面向對象的一些特性,這些特性對於初學者來説是非常不友好的,並且在大部分專業的後繼學習中也幾乎用不到。不學習這些語言特性,其實找不到要選擇這兩門語言作為程序設計入門基礎語言的理由。
我們經常發現大部分學生學習一學期C或C++後,再上後續其他編程語言課程時幾乎只記得函數一章前面的內容,編寫一個複雜點的函數大多數同學都搞不定。這樣前面花時間學習編程課程的價值何在,只是為了後續的編程課程打好基礎嗎?那為啥不跳過這編程基礎課程呢?更不用説和非編程計算機相關課程的銜接了。大部分學生學習C或者C++後除了獲得一個二級證書,留下的只是一地雞毛。
五四以後,中國都文言文教學改成白話文了。這都2020了,我們為啥就不能也換一種簡單的程序語言(比如Python),而讓學生側重於程序設計中的問題分析和簡單算法設計。這樣既可以讓學生對程序設計不那麼望而卻步,也能讓更多的學生把程序設計課程知識應用到其他學科做好鋪墊,為輔助其他學科發展提供更大的推動力。