趙娜 覃科 何金花
[摘 要]C語言是計(jì)算機(jī)專業(yè)的程序設(shè)計(jì)入門課,也是大多數(shù)理工類非計(jì)算機(jī)專業(yè)的必修課。作為重要的專業(yè)課和基礎(chǔ)工具,學(xué)好C語言對(duì)計(jì)算機(jī)專業(yè)的后續(xù)課程有重要意義。但目前的C語言教學(xué)中存在知識(shí)導(dǎo)向及重點(diǎn)不明確的問題,學(xué)生在學(xué)習(xí)了眾多晦澀的語法之后無法靈活運(yùn)用,解決問題能力不足。針對(duì)以上問題,對(duì)現(xiàn)有的教學(xué)弊端進(jìn)行分析,提出面向程序設(shè)計(jì)能力培養(yǎng)的C語言的教學(xué)改革,從知識(shí)點(diǎn)梳理、能力微模塊化、習(xí)慣培養(yǎng)等方面采取系統(tǒng)性改進(jìn)措施,以期培養(yǎng)出善于用程序設(shè)計(jì)思維解決問題的學(xué)習(xí)者,達(dá)到符合用人單位需求的C語言教學(xué)結(jié)果。
[關(guān)鍵詞]C語言教學(xué);程序設(shè)計(jì)能力;教學(xué)改革;能力培養(yǎng);習(xí)慣培養(yǎng)
[基金項(xiàng)目]2018年桂林航天工業(yè)學(xué)院教改項(xiàng)目“基于SPOC+翻轉(zhuǎn)課堂的軟件工程專業(yè)基礎(chǔ)課教學(xué)改革研究與實(shí)驗(yàn)—以C語言程序設(shè)計(jì)課程為例”(2018JB18)
[作者簡(jiǎn)介]趙 娜(1986—),女,湖南紹東人,碩士,桂林航天工業(yè)學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院助教,主要從事機(jī)器學(xué)習(xí)與自然語言處理研究;覃 科(1979—),女,湖北松滋人,碩士,桂林航天工業(yè)學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院高級(jí)工程師,主要從事智能計(jì)算與圖像處理研究;何金花(1979—),女,湖南瀏陽人,碩士,桂林航天工業(yè)學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院講師,主要從事軟件工程研究。
[中圖分類號(hào)] TP312[文獻(xiàn)標(biāo)識(shí)碼] A[文章編號(hào)] 1674-9324(2020)46-0-03[收稿日期] 2020-09-28
一、引言
隨著第四次工業(yè)革命的到來,信息化在國(guó)民經(jīng)濟(jì)中扮演著越來重要的角色。C語言一般被列為程序設(shè)計(jì)的入門課程,是大多數(shù)理工類專業(yè)的必修課,特別是對(duì)于非計(jì)算機(jī)專業(yè)而言,這可能是整個(gè)大學(xué)階段唯一的程序設(shè)計(jì)課程,但學(xué)校的C語言課堂教學(xué)往往并不令人滿意。
首先,C語言作為一門高級(jí)語言,既可以直接操縱硬件,也有足夠的封裝性,這使其語法當(dāng)中保留了相當(dāng)多的時(shí)代特點(diǎn)。如今硬件性能取得巨大進(jìn)展,人工成本遠(yuǎn)高于機(jī)器成本,C語言中的一些語法已經(jīng)不再適用,一些大型企業(yè)已經(jīng)明確限制一些語法的使用,而很多高校還在把這些晦澀的語法作為教學(xué)重難點(diǎn),讓學(xué)生花費(fèi)大量學(xué)習(xí)時(shí)間。
其次,對(duì)學(xué)生運(yùn)用程序設(shè)計(jì)思想解決問題的能力培養(yǎng)不足。課堂教學(xué)中相當(dāng)數(shù)量的案例取材于數(shù)十年前的經(jīng)典教材,并未根據(jù)學(xué)生的具體情況進(jìn)行設(shè)計(jì),往往過于關(guān)注語法的使用而忽略問題解決。案例過于復(fù)雜,相對(duì)于知識(shí)點(diǎn)本身不夠直觀,重點(diǎn)不突出,追求大而全,缺乏實(shí)用性。在教學(xué)中如何回歸C語言的工具屬性,讓學(xué)生樂于用程序設(shè)計(jì)的方式解決實(shí)際問題,是教學(xué)中需要探討的普遍問題。
目前,一些高校已經(jīng)開始嘗試C語言教學(xué)的改進(jìn)方案,如有文章[1]提出應(yīng)當(dāng)加大案例教學(xué)法的比重,用學(xué)生易于理解的案例啟發(fā)學(xué)生;也有文章[2]指出,對(duì)于非計(jì)算機(jī)專業(yè)學(xué)生,應(yīng)當(dāng)重新制定教學(xué)大綱,針對(duì)專業(yè)需求制定教學(xué)重點(diǎn);還有文章[3]引入對(duì)分課堂,將授課后的學(xué)生討論作為重要且必要的教學(xué)手段,提高學(xué)生的參與度,激發(fā)學(xué)習(xí)興趣。這些改革方案都有一定的針對(duì)性,但總體上系統(tǒng)性不足。而C語言教學(xué)作為一個(gè)整體過程,需要一套以終為始的系統(tǒng)化方案進(jìn)行改革。
本文從知識(shí)點(diǎn)梳理、能力微模塊化、習(xí)慣培養(yǎng)等三個(gè)方面提出C語言教學(xué)改革方案。該方案作為一種通用準(zhǔn)則,可作為不同側(cè)重的專業(yè)教學(xué)改革的參考。
二、知識(shí)點(diǎn)梳理
C語言是一門編譯型語言,對(duì)語法有著嚴(yán)格要求,必要的語法規(guī)則是必須介紹的,但從應(yīng)用角度出發(fā),并不是所有語法都需要掌握,特別是那些經(jīng)過實(shí)踐驗(yàn)證,無助于程序可讀性、擴(kuò)展性的語法可以不講解,留給感興趣的學(xué)生自行學(xué)習(xí)。
比如C語言的自加自減運(yùn)算符,在有嚴(yán)格編碼規(guī)范的企業(yè),通常只允許作為單獨(dú)的語句使用;又如goto語句,完全可以不做介紹,用其他語法替代。教師需要根據(jù)專業(yè)需求,分專業(yè)整理出適合專業(yè)特點(diǎn)的C語言知識(shí)點(diǎn),而不是照搬經(jīng)典教材。對(duì)于課時(shí)不足,不能涉及所有語法的專業(yè)教學(xué),更應(yīng)當(dāng)注重培養(yǎng)學(xué)生基本語法的使用,提高學(xué)生的基本能力,避免貪多嚼不爛。
三、能力微模塊化
教學(xué)中應(yīng)當(dāng)明確C語言的工具性定位,以培養(yǎng)學(xué)生使用程序設(shè)計(jì)思想解決問題的能力為目標(biāo)。將知識(shí)點(diǎn)簡(jiǎn)單羅列不利于能力的培養(yǎng),有必要將程序設(shè)計(jì)能力劃分成若干個(gè)微模塊,將教學(xué)內(nèi)容按微模塊組織和安排教學(xué),明確學(xué)生在各個(gè)模塊內(nèi)需要掌握的C語言程序設(shè)計(jì)能力。
(一)單一數(shù)值的表達(dá)運(yùn)算能力
單一數(shù)值的表達(dá)運(yùn)算能力包括數(shù)值的計(jì)算、字符串的存儲(chǔ)、輸入和輸出等。掌握該層次的能力,可以進(jìn)行簡(jiǎn)單的計(jì)算和表達(dá),具備該能力的學(xué)生可以用C語言解決一些日常簡(jiǎn)單問題。
單一數(shù)值的表達(dá)運(yùn)算能力是學(xué)習(xí)C語言的基本要求。要求學(xué)生理解編譯型語言的編譯、鏈接、運(yùn)行過程,掌握編譯工具的基本使用方法,大致了解一個(gè)完整的程序包含哪些部分,在此基礎(chǔ)上,熟練掌握整型、浮點(diǎn)型、字符和字符串的初始化、賦值、輸入輸出,掌握與之相關(guān)的常用運(yùn)算符。
(二)復(fù)雜數(shù)據(jù)的抽象和表達(dá)能力
要求能使用結(jié)構(gòu)體、數(shù)組對(duì)同一對(duì)象不同性質(zhì)的屬性或某一類同質(zhì)對(duì)象的批量數(shù)據(jù)進(jìn)行存儲(chǔ)、計(jì)算和輸入輸出。該層次的能力注重信息的轉(zhuǎn)化抽象,比如如何設(shè)計(jì)一只貓的數(shù)據(jù)結(jié)構(gòu)。掌握該層次的能力可對(duì)稍微復(fù)雜的問題進(jìn)行處理。
該能力要求學(xué)生具備初級(jí)的抽象能力。如何將現(xiàn)實(shí)中存在的多屬性實(shí)體用C語言描述出來,學(xué)生在該階段首次嘗試從自然語言到程序設(shè)計(jì)語言的轉(zhuǎn)換。在該層級(jí)學(xué)生要掌握數(shù)組、結(jié)構(gòu)體的定義和使用方法,循環(huán)只作為數(shù)組遍歷工具使用。
(三)推理計(jì)算能力
要求能運(yùn)用C語言對(duì)批量數(shù)據(jù)進(jìn)行基本的統(tǒng)計(jì)運(yùn)算,如求最大、最小值,統(tǒng)計(jì)符合某些條件的數(shù)值個(gè)數(shù),以及進(jìn)行簡(jiǎn)單的數(shù)列計(jì)算等。
該能力要求學(xué)生具備良好的推理思維。學(xué)生將在此階段進(jìn)一步體會(huì)程序的計(jì)算方法與數(shù)學(xué)中手工運(yùn)算方法的不同,并深入理解和掌握循環(huán)結(jié)構(gòu),掌握一些基本算法。在本階段,學(xué)生應(yīng)養(yǎng)成將問題分析清楚再進(jìn)行程序語言描述的習(xí)慣。
(四)問題分解能力
這是面對(duì)一個(gè)較為復(fù)雜的問題,能夠?qū)⑵溥M(jìn)行分解和抽象,轉(zhuǎn)化為通過程序設(shè)計(jì)能解決的問題的能力??梢赃m當(dāng)引入部分面向?qū)ο蟮乃枷?,教授學(xué)生如何去分解和抽象實(shí)際問題。
該能力對(duì)應(yīng)C語言的多文件、函數(shù)等知識(shí)點(diǎn),但知識(shí)在其中起到的主要是工具的作用,更多的是要通過案例傳授問題分解的思想??梢詫栴}分析過程分成三步(問題分解三步驟):①用語言將問題記錄下來,盡可能包含足夠多的細(xì)節(jié),這是進(jìn)一步分析的基礎(chǔ);②進(jìn)行功能劃分,可借助思維導(dǎo)圖等工具,將問題分解成多個(gè)子問題,如有必要可繼續(xù)劃分;③將每個(gè)子問題的實(shí)現(xiàn)過程用偽代碼、流程圖描述出來。有了以上步驟,再進(jìn)行編碼。
(五)封裝和協(xié)作能力
此時(shí),學(xué)生考慮的不再是如何解決某個(gè)特定問題,而是要解決一類問題,要考慮到代碼的復(fù)用性、可讀性等??梢赃m當(dāng)引入一些設(shè)計(jì)模式[4]相關(guān)的知識(shí),使代碼具有更好的擴(kuò)展性。該階段是尋求代碼的精簡(jiǎn),是從多到少的過程。
在企業(yè)中,程序設(shè)計(jì)通常由多人團(tuán)隊(duì)來完成,因此,接口的協(xié)商、完整的測(cè)試發(fā)布流程等知識(shí)點(diǎn)可適當(dāng)涉及,敏捷開發(fā)、單元測(cè)試等知識(shí)點(diǎn)可有選擇的適當(dāng)講解,作為大作業(yè)或者課程設(shè)計(jì)中的一環(huán),開闊學(xué)生的眼界。
在確定能力層級(jí)培養(yǎng)目標(biāo)之后,現(xiàn)有的教學(xué)手段也要加以調(diào)整,以適應(yīng)從面向應(yīng)試到面向能力培養(yǎng)的教學(xué)目標(biāo)的轉(zhuǎn)變??傮w上,要做出三方面調(diào)整。
1.增加動(dòng)手環(huán)節(jié)的教學(xué)比重。與數(shù)學(xué)等純理科課程相比,程序設(shè)計(jì)屬于典型的工科課程,沒有足夠時(shí)長(zhǎng)的訓(xùn)練很難保證效果。為使教學(xué)內(nèi)容及時(shí)轉(zhuǎn)化為動(dòng)手能力,可以在課堂講授中穿叉代碼的編寫練習(xí),讓學(xué)生即學(xué)即練。更要加大應(yīng)用題在課后練習(xí)中的比重,語法錯(cuò)誤可以交給現(xiàn)代編譯器去查找,寶貴的練習(xí)時(shí)間應(yīng)當(dāng)用于應(yīng)用能力的培養(yǎng)。
2.專業(yè)實(shí)例融入教學(xué)案例。即便是最近新編寫的教材,仍然可見大量二十年前的經(jīng)典示例,這些示例是否都適合于當(dāng)前的教學(xué)需求有待商榷。比如過去,計(jì)算機(jī)硬件資源非常有限,程序設(shè)計(jì)時(shí)需要非常注意每個(gè)變量的定義和使用,而常用算法的函數(shù)庫也遠(yuǎn)不如今天這樣豐富。教學(xué)案例也應(yīng)當(dāng)迎合時(shí)代的變革,更多地從實(shí)踐中選取,將專業(yè)領(lǐng)域內(nèi)有影響力的開源代碼作為示例進(jìn)行教學(xué),可以更加貼近專業(yè)的需要。
3.教學(xué)手段根據(jù)能力培養(yǎng)目標(biāo)有所側(cè)重。不同專業(yè)對(duì)程序設(shè)計(jì)的要求是不同的,并非所有的專業(yè)都需要追求與計(jì)算機(jī)專業(yè)完全一致的能力培養(yǎng)目標(biāo)。要明確學(xué)生在專業(yè)上需要掌握何種能力,在課堂教學(xué)的內(nèi)容和方法上,進(jìn)行適當(dāng)調(diào)整。比如通信工程專業(yè)以解決具體業(yè)務(wù)問題為主,需要加強(qiáng)問題分析和分解能力,增加這部分的課時(shí),進(jìn)行更加細(xì)致的講解和練習(xí),但可以一定程度上弱化封裝和協(xié)作能力的培養(yǎng),而數(shù)學(xué)專業(yè)的算法,往往作為基礎(chǔ)庫被上層應(yīng)用調(diào)用,則不能忽略這項(xiàng)能力。因此,各類專業(yè)在程序設(shè)計(jì)能力培養(yǎng)上,應(yīng)當(dāng)有所區(qū)分,在教學(xué)時(shí)長(zhǎng)中有所偏重,重點(diǎn)內(nèi)容應(yīng)多分析案例,增加訓(xùn)練強(qiáng)度。
四、習(xí)慣培養(yǎng)
擁有知識(shí)和技能可以編寫出“能用”的程序,但良好的習(xí)慣可以讓學(xué)生編寫出“好用”的代碼,一份能用的程序只是一切的開始,是最基本的要求[5]。企業(yè)的核心模塊的代碼生存期長(zhǎng)達(dá)十年之久,一份可讀性差、難以修改的源程序往往維護(hù)代價(jià)高昂,而一份優(yōu)秀的程序則令開發(fā)工作事半功倍。下面是初學(xué)者應(yīng)重點(diǎn)培養(yǎng)的習(xí)慣。
(一)良好的編碼風(fēng)格
良好的編碼風(fēng)格應(yīng)當(dāng)從學(xué)生第一次動(dòng)手編程開始強(qiáng)調(diào)。各大企業(yè)往往都有自己的編碼風(fēng)格要求,新進(jìn)企業(yè)的應(yīng)屆生對(duì)此往往感到痛苦,因?yàn)樵趯W(xué)校學(xué)習(xí)時(shí),要求代碼功能正確即可。如果在學(xué)習(xí)之初就加以引導(dǎo),讓學(xué)生了解到編碼風(fēng)格之于程序猶如筆跡風(fēng)格之于考試作文的重要性,則可避免此類問題。
(二)勤于添加注釋
如果按照上文的“問題分解三步驟”進(jìn)行問題分析,最終能得到一份偽代碼,它既是設(shè)計(jì)文檔,也是最初的注釋,讓學(xué)生從思想到程序平滑過渡。不但如此,閱讀一份陌生代碼的過程中將筆記用注釋的方式寫出來,對(duì)于學(xué)生內(nèi)化新知識(shí)、復(fù)習(xí)老知識(shí)有幫助。對(duì)教學(xué)來說,程序本身很難避免千篇一律,但學(xué)生在注釋中寫下自己的程序設(shè)計(jì)過程、對(duì)代碼的理解,教師能通過注釋第一時(shí)間了解學(xué)生的學(xué)習(xí)情況,及時(shí)了解教學(xué)效果,改進(jìn)教學(xué)方式。
(三)優(yōu)先選用開源工具
一套良好的開發(fā)環(huán)境至少應(yīng)當(dāng)包括代碼高亮,語法檢查,代碼縮進(jìn),注釋/反注釋,變量/函數(shù)追蹤,查找,編譯運(yùn)行,調(diào)試等,包括自動(dòng)生成注釋,代碼折疊,自動(dòng)補(bǔ)全功能更佳。
具備這些功能的軟件眾多,但學(xué)校教學(xué)往往以商業(yè)軟件為主。事實(shí)上,主流企業(yè)的開發(fā)者,多以開源軟件為主,且不談Vim/Emacs等功能強(qiáng)大的編輯器,像Notepad++這樣的軟件對(duì)初學(xué)者非常友好,容易學(xué)習(xí)。如果學(xué)生希望在課后自主學(xué)習(xí),由學(xué)校采用的商業(yè)軟件對(duì)培養(yǎng)學(xué)生的版權(quán)思維并無益處。相反,如果能及早接觸開源軟件,有助于學(xué)生開闊思路,有機(jī)會(huì)了解現(xiàn)實(shí)世界中的軟件、程序內(nèi)部結(jié)構(gòu)是怎樣的。
五、總結(jié)
提出了面向程序設(shè)計(jì)能力的C語言改革方案,整體分為三點(diǎn):教學(xué)知識(shí)點(diǎn)根據(jù)專業(yè)需要剪裁;將程序設(shè)計(jì)能力劃分為單一數(shù)值表達(dá)運(yùn)算、復(fù)雜數(shù)據(jù)的抽象和表達(dá)、推理計(jì)算、分解問題、封裝和協(xié)作等五個(gè)能力微模塊;在實(shí)踐環(huán)節(jié)中注重培養(yǎng)良好的程序設(shè)計(jì)習(xí)慣。整個(gè)方案以程序設(shè)計(jì)能力的培養(yǎng)為核心,以學(xué)生能夠通過程序設(shè)計(jì)的思想解決問題為目標(biāo),這是筆者在工業(yè)界幫助應(yīng)屆生適應(yīng)企業(yè)工作的經(jīng)驗(yàn)與在高校進(jìn)行教學(xué)的經(jīng)驗(yàn)相結(jié)合的產(chǎn)物,具體效果還需要充分的實(shí)踐驗(yàn)證。
參考文獻(xiàn)
[1]楊銀花.淺談案例教學(xué)在C語言教學(xué)改革中的探索[J].中外企業(yè)家,2019(36):177.
[2]曹鳳雪,陳艷萍,黃成.非計(jì)算機(jī)專業(yè)C語言課程的教學(xué)方法[J].福建電腦,2020,36(1):104-105.
[3]賈曉琪.基于對(duì)分課堂的C語言程序設(shè)計(jì)課程實(shí)踐教學(xué)改革研究[J].辦公自動(dòng)化,2019,24(27):30-31.
[4]埃里克·伽瑪,理查德·赫爾姆,拉爾夫·約翰遜,等.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].李英軍,馬曉星,蔡敏,等譯.北京:機(jī)械工業(yè)出版社,2019:3.
[5]史蒂夫·邁克康奈爾.代碼大全[M].金戈,湯凌,陳碩,等譯. 北京:電子工業(yè)出版社,2006:161-163.
Abstract: C language is an introductory course of programming for computer majors, and also a required course for most non-computer majors of science and engineering. As an important professional course and a basic tool, learning C language well is of great significance to the follow-up courses of computer major. However, there are too many problems in C language teaching nowadays, such as too much knowledge orientation and unclear key points. After learning many obscure grammar, students cannot use it flexibly, and their ability to solve problems is insufficient. In view of the above problems, this paper analyzes the existing teaching defects, and puts forward the teaching reform of C language for the training of programming ability. Systematic improvement measures are taken from the aspects of knowledge carding, ability micro modularization and habit cultivation, so as to cultivate learners who are good at solving problems with programming thinking, and achieve the C language teaching results that meet the needs of employers.
Key words: C language teaching; programming ability; teaching reform; ability training; habit cultivation