羅先錄 周富肯 艾廣燚 向燕飛



摘? 要:計算機類專業的學生掌握編程解決問題的基本技能,是基本的專業素質。算法是程序設計的靈魂,是用系統方法描述解決問題的方法,是從編程通向計算思維的必由之路。計算機類專業的“系統能力”,是計算機類專業相較于其他專業的核心競爭力。本文總結了六年來采用不同編程語言進行教學的比較,討論了如何貫通專業學生的這些專業基本素質和核心能力,為我們進行教學時編程語言選擇提供了基于系統能力的可行方案。
關鍵詞:程序設計;數據結構與算法;計算機系統;編程語言
中圖分類號:TP312? ? ?文獻標識碼:A
Abstract: It is a professional quality for learners of computer majors to master basic skills of problem solving with programming. Algorithm, the soul of program design, is a stepwise procedure for solving problems systematically, and is the only access to computational thinking. "System Ability" is the core competitiveness of computer majors compared with other majors. This paper summarizes and compares teaching with different programming languages over the past six years, and then discusses how to enhance both professional qualities and core abilities of computer major students. The result of the paper provides a feasible scheme for programming language selection of teaching for cultivation of students' system capability.
Keywords: program design; data structure; algorithm; computer systems; programming language
1? ?引言(Introduction)
數據結構與算法課程曾經用偽代碼教學,旨在掌握算法思維本身。現在基本采用一門具體的編程語言進行教學,可能是Linus Torvalds說:“Talk is cheap,show me the code.”,也可能是程序執行時間比算法復雜度分析更有感覺。當前計算機系統能力的培養也是一個倒逼的動力,因為體驗代碼的執行、調試程序的bug,是讓學生深入理解計算機系統,加強工程能力培養的必由之路[1-4]。
目前,計算機類專業的程序設計基礎和數據結構與算法這兩門課程的教學,選擇同一門編程語言進行兩門課程的連續教學是較好的選擇。這樣為學生“學好一門編程語言”+“計算思維”這個主線提供了很好的條件[5]。
那么是讓學生自主選擇課程的這一門編程語言,還是根據專業課程體系的需要進行設定,這是我們進行課程體系設計的時候容易引起爭論的話題。我們根據TIOBE編程語言排行榜以及網上招聘和地區人才需求,“所學即所用”“一點打透”等原則,在學生中試行了學生自由選擇排名前列的幾種編程語言進行這兩門課程的教學。現在根據計算機系統能力建設的趨勢,回歸了簡單的C語言路線。這又會讓人想起發明C語言的Dennis M. Richie說:“Keep it simple stupid”[6]。我們做了一些思考和總結,供專家和同行們參考。
2? 面向對象編程語言的特點(Characteristics of object oriented programming language)
我們以Java語言為例來說明用面向對象編程語言來進行程序設計基礎+數據結構與算法課程教學的特點。Java的優勢在于實現了面向對象的主要技術(封裝、繼承與多態、接口等),而放棄了容易引起混亂的技術(例如多繼承)。
(1)封裝。在數據結構與算法課程教學中,數據抽象是首先要面對的主題。現在的面向對象技術已經很成熟,如果選擇將數據成員(數據結構)設為私有屬性隱藏起來,通過調用公有成員方法(算法)訪問私有數據,Java完成了定義自己的數據類型(數據抽象)和對這些數據操作的封裝。數據類型和相關操作(算法)有了密切相關性,定義了一個類的數據成員(數據結構)之后,相應的算法就是同一個類中的各種方法,就可以創建對象,以及派生出更多的細分、實用的類。
(2)泛型。泛型是Java 5以上版本提供的支持這一目標的方式之一。泛型也就是參數化類型,例如Stack
算法中經常需要進行對象的大小比較,一般采用兩種方法實現泛型,從而實現對象間可比較。一是用Object表示泛型,二是用Comparable接口類型表示泛型。用Comparable接口類型表示泛型時(從JDK 1.5開始,在java.lang.Comparable中使用了泛型),需要定義對象為Comparable接口的實例,然后調用Comparable的compareTo方法(需要重寫)就可以進行對象間的比較操作[8]。
3.3? ?計算機系統角度的C語言
從程序員角度的計算機系統看,C語言版本的優勢還在于可以深刻理解計算機系統,這個是當前計算機教育的一個趨勢[1-3]。2010年,教育部高等學校計算機類專業教學指導會組織高校的資深計算機教育專家成立“計算機類專業系統能力培養研究專家組”,研究組經過對國內外計算機專業的課程體系、用人單位的需求及技術的發展,提出了“計算機類專業系統能力培養專業課程體系”。并分批設立了試點高校。如果是計算機系統能力試點學校,就會了解目前所有的計算機系統基礎之類的課程和教材,都是采用了C語言舉例[1,2] ,特別是其中最著名的CMU教材《深入理解計算機系統》就是采用了C語言作為例子貫穿整個教學[10]。我們以南京大學袁春風《計算機系統基礎》為主教材,同時參考CMU的《深入理解計算機系統》,加入了第四批試點高校行列。我們結合這幾年進行程序設計基礎+數據結構,以及后續的計算機系統基礎課程這三門課連續教學中的一些主要概念的逐級提升或者延伸、最后得以澄清的經驗體會來說明這個選擇的優點。
構的訪問 數組和指針(結構體、鏈表) 線性表、棧、隊列、樹和圖等抽象數據類型等都有兩種結構的實現方式 順序實現的數組首地址以及循環模式和鏈式實現的鏈式訪問模式的比較 在匯編代碼級理解各種數據訪問模式的本質
棧(stack) 在調試運行遞歸函數時觀察調用的函數棧 LIFO問題的解決模式,熟悉棧的底層實現和運用 操作系統的棧是一個特定內存區域,和數據結構的棧一樣遵循先進后出的規則 數據結構的棧和操作系統函數調用棧的區別、函數調用棧的耗時和溢出是線索
堆(heap) 動態內存分配函數malloc/free(面向對象編程語言的new)的使用 一種特殊的二叉樹數據結構,以數組方式連續存儲 操作系統的堆是一個特定的動態內存分配區域(運行時才知道大小需求) 操作系統的堆(棧)強調數據生命周期,而數據結構的堆(棧)強調數據組織
排序算法
中的歸并
排序 多項式加法等簡單運用 遞歸實現或者非遞歸實現 額外空間的分配,需要理解內存的分配和回收的代價 從系統角度理解“以空間換時間”和“以時間換空間”的權衡
堆排序和
快速排序
比較 兩個變量比較和交換的方法 對于同樣的數據,排序過程中,堆排序算法的交換次數要多于快速排序 快速排序中數據是局部順序訪問,堆排序是跳躍訪問,對CPU緩存不友好 從系統角度理解算法快慢的根本原因
文件 文件建立/打開/關閉、讀/寫、文件指針移動 內部排序和外部排序 Cache、內存、I/O的讀寫 Cache/內存/硬盤等存儲層次結構的效率和配合
這樣的例子還可以不斷總結很多,運用C語言實現的例子,就很容易闡述清楚這些概念背后的內涵與延伸,讓學生深入理解計算機系統的運行機制,逐步形成計算機專業的核心能力。
4? ?結論(Conclusion)
對于一般專業學生來說,面向解決問題的模式,學會一種編程語言后進一步學習算法和數據結構,用一種語言學習這兩門課程是一個很順利的學習進階道路,目前的教材和師資的成熟度也支持這樣的做法。對于計算機類專業學生來說,用C語言進行這兩門課程的學習,對于后續專業核心課程的學習,將會起到很好地理解與掌握計算機系統的作用。特別是目前的計算機教育更強調計算機系統能力的培養的形勢下,更是一個必然的選擇。
參考文獻(References)
[1] 王志英,周興社,袁春風,等.計算機專業學生系統能力培養和系統課程體系設置研究[J].計算機教育,2013(09):1-6.
[2] 臧斌宇,彭遠紅.反思、借鑒、融合、提升—探尋計算機系統能力培養之道[J].計算機教育,2015(21):1-2.
[3] 袁春風,王帥.大學計算機專業教育應重視“系統觀”培養[J].中國大學教學,2013(12):41-46.
[4] 尚鳳軍.面向計算機系統能力培養的課程和實踐體系研究[C]. Proceedings of the 3rd International Conference on Applied Social Science Research(ICASSR 2015), 2015:4-5.
[5] 湯偉.《數據結構》和《C語言程序設計》新教學模式研究[J].科技資訊,2017,15(24):170-171.
[6] Brian W. kernighan, Dennis M. Ritchie. The C Programming Language(Second Edition)[M]. New Jersey:Pearson Education International,1998:23-189.
[7] Robert Sedgewick, Kevin Wayne. 謝路云,譯.算法(第4版)[M].北京:人民郵電出版社,2014:38-107.
[8] 劉小晶,杜選,朱蓉,等.數據結構-Java語言描述[M].北京:清華大學出版社,2015:23-64.
[9] 陳越,何欽銘,徐鏡春,等.數據結構(第二版)[M].北京:高等教育出版社,2019:73-276.
[10] Randal E. Bryant, David R. O'Hallarond. 龔奕利,賀蓮,譯.深入理解計算機系統[M].北京:機械工業出版社,2018:99-276.