摘? 要:在計算機技術(shù)飛速發(fā)展而工程教育水平亟待提高的背景下,培養(yǎng)學(xué)生可持續(xù)發(fā)展的工程技術(shù)核心競爭力成為一個重要課題。本文首先提出了以系統(tǒng)觀為關(guān)鍵核心競爭力的培養(yǎng)理念,然后給出了兩種不同培養(yǎng)方式——正向構(gòu)建式和逆向析構(gòu)式,最后提出系統(tǒng)觀原核,并以此為基礎(chǔ)給出了基于逆向的培養(yǎng)方法相關(guān)內(nèi)容與經(jīng)驗。相對于構(gòu)建系統(tǒng)級軟件,該方法是輕量級的,對一般院校實施具有可操作性。
關(guān)鍵詞:系統(tǒng)觀;正向構(gòu)建式;逆向析構(gòu)式;疑證思維;系統(tǒng)觀原核;實證式教學(xué)
計算機領(lǐng)域技術(shù)發(fā)展極為迅速,給工程能力培養(yǎng)提出了嚴峻挑戰(zhàn)。我們一方面面臨不斷開設(shè)新課程的壓力,另一方面卻長期承受來自業(yè)界的批評。企業(yè)實訓(xùn)不能解決根本問題,這根源于企業(yè)的生產(chǎn)特性本質(zhì)上使其難以提供有深度、綜合性、可持續(xù)、系統(tǒng)化的訓(xùn)練,且更難大規(guī)模實施。以電子科技大學(xué)為例,一個年級的學(xué)生有四五百人,這是任何一個真正的生產(chǎn)型企業(yè)都難以承受的。多個企業(yè)分擔(dān)卻難以保證培養(yǎng)的一致性。而培訓(xùn)型機構(gòu)并不能提供真正的生產(chǎn)環(huán)境。事實上,對員工有較高自主能力要求的企業(yè)并不愿意接受培訓(xùn)式提供的學(xué)員[1]。
本文就這一問題提出了系統(tǒng)觀培養(yǎng)核心競爭力的解決思路,并分析了兩種培養(yǎng)方式,特別就逆向析構(gòu)式方式進行了探討,最后給出了其實踐過程中的相關(guān)經(jīng)驗。
一、計算機系統(tǒng)觀是可持續(xù)發(fā)展核心競爭力
面對不斷變化的軟件技術(shù),似乎只有不斷追新才能跟得上。而每種技術(shù)又必須通過撰寫大量代碼來了解、熟悉和掌握,可這又消耗了學(xué)生已經(jīng)有限的學(xué)習(xí)時間。以電子科技大學(xué)為例,其計算機科學(xué)與技術(shù)專業(yè)2年級基本一學(xué)期接近十門課程,3年級一學(xué)期有十幾門課程。如一門軟件課程需要撰寫3000~4000行代碼,時間壓力可想而知。
筆者認為相對追新面臨的壓力,培養(yǎng)核心競爭力才是治本之道。筆者曾給出例子,一些長期只從事系統(tǒng)級軟件開發(fā)的“老”程序員卻在新軟件技術(shù)掌握的速度和深度上遠超越那些精力投入追新的“年輕”程序員[1]。其根源就是系統(tǒng)能力,筆者稱其為“系統(tǒng)觀”[2]。
越來越多的研究者認識到系統(tǒng)能力的重要性,并進行了深入研究和系統(tǒng)性教學(xué)建設(shè),如北京航空航天大學(xué)、浙江大學(xué)、清華大學(xué)、東南大學(xué)、國防科技大學(xué)等[3]。最近,東南大學(xué)的同仁也指出了“系統(tǒng)觀”培養(yǎng)的重要性,他們從計算機制造者、系統(tǒng)程序員、應(yīng)用程序員和系統(tǒng)管理員的角度分析了“系統(tǒng)觀”的價值[4]。
系統(tǒng)觀的內(nèi)涵筆者尚未見非常正式的定義,有文獻稱其為“對計算機的深刻理解”[4]。下面筆者嘗試從另外一個角度給出系統(tǒng)觀的定義并分析為什么它是學(xué)生工程能力提升的可持續(xù)發(fā)展核心引擎。
筆者認為:計算機系統(tǒng)觀是計算機核心知識架構(gòu)和對它們不斷運用所形成的思維方式的復(fù)合體,不可割裂。單純的通用思維訓(xùn)練和僅僅攝取知識信息均無法形成系統(tǒng)觀。它是能自我生長,自我完善和成長的原核。在攝取新技術(shù)和面臨黑箱時,它具有極強的剖析、探索和學(xué)習(xí)能力。這賦予了高端計算機人才最重要的素質(zhì)。
核心知識架構(gòu)涵蓋計算機領(lǐng)域最本質(zhì)部分的規(guī)律,筆者認為應(yīng)包括:計算機組成原理、系統(tǒng)結(jié)構(gòu)、操作系統(tǒng)、編譯和鏈接、算法、數(shù)據(jù)庫原理和實現(xiàn)。
為什么系統(tǒng)觀在學(xué)習(xí)技術(shù)和解決難題方面具有“以少勝多”和“一勞長逸”的特點呢?下面筆者試從系統(tǒng)觀的三個功能分析。
(1)類比。因為系統(tǒng)觀包含了核心知識架構(gòu),其涵蓋的計算機領(lǐng)域本質(zhì)規(guī)律在所有計算機應(yīng)用領(lǐng)域均可借鑒和舉一反三。應(yīng)用領(lǐng)域的技術(shù)多是在老技術(shù)上不斷包裝、組合和抽象。一位云計算公司的CTO告訴筆者,他要解決存儲或并發(fā)的問題時,習(xí)慣找20世紀六七十年代最早的算法文章(因為它將根本性問題描述得非常清楚),在此基礎(chǔ)上就很容易適配到現(xiàn)在的問題中。筆者一位朋友很多年前做漢化DOS,后來他第一次做單片機破解,只花了一個月就將其破解并漢化。他明確指出DOS漢化經(jīng)驗起了很大幫助。筆者第一次面對Linux驅(qū)動的C語言編程問題時,運用面向?qū)ο蟮慕?jīng)驗,花數(shù)分鐘即解決了學(xué)生因回調(diào)語義錯誤引起的bug。因為基于接口編程思想在整個軟件甚至硬件領(lǐng)域都是一致的,在面向?qū)ο笫翘摵瘮?shù),在內(nèi)核是回調(diào)函數(shù)。這三個例子均運用系統(tǒng)觀中存在的基本模式和知識去類比解決第一次面臨的難題,體現(xiàn)了系統(tǒng)觀“少即多、舊即新、基礎(chǔ)即先進、不變應(yīng)萬變”的特點。
(2)構(gòu)建。系統(tǒng)觀思維具有構(gòu)建式的特點。形象地說就是“我來做怎么做”這樣的思維方式,在學(xué)習(xí)新系統(tǒng)或技術(shù)時能首先從構(gòu)建的角度分析,從而對關(guān)鍵點產(chǎn)生疑問。帶著疑問學(xué)習(xí),效率就高。筆者一次尋找hibernate操控同結(jié)構(gòu)多數(shù)據(jù)庫的方案時,從構(gòu)建角度分析如果自己做怎么做出擴展性,假想出了可能的擴展點,然后帶著這些假設(shè)用調(diào)試去檢驗,雖第一次接觸hibernate,用了半天就解決了。筆者曾用“我來做怎么做”的思維模式訓(xùn)練研究生,有學(xué)生反映這是其研究生期間學(xué)到的最有價值的東西。
(3)簡化。面臨復(fù)雜未知時,同時面臨太多未知點,人們必然無所適從,難以下手。如果能迅速化繁為簡,主動“忽略”過濾掉暫時無關(guān)大局的細節(jié),那么就能尋找到癥結(jié),從而快速擊破解決難題。系統(tǒng)觀的底層特點使其具有底層視角,再加上其反復(fù)淬煉出解析能力,使其能夠完成這一簡化和忽略的任務(wù)。能體現(xiàn)簡化和忽略特性的最直接例子即逆向工程。面對高級語言源代碼往往人們要找到下手點都無所適從,何況面對的是反匯編代碼?要完成任務(wù)必須快速找到關(guān)鍵點,一擊而破。在高層應(yīng)用領(lǐng)域分析理解面向?qū)ο罂蚣芤彩侨绱?,往往從關(guān)鍵的虛函數(shù)入手,通過調(diào)試找到其調(diào)用關(guān)系,并最終找到可能的裝配邏輯。
綜上所述,因系統(tǒng)觀涵蓋計算機本質(zhì)規(guī)律的掌握和運用,并具有類比、構(gòu)建和簡化功能,所以有很強的自我學(xué)習(xí)、擴展、探索和長效性特點。這使得學(xué)生培養(yǎng)了系統(tǒng)觀后,可在其職業(yè)生涯中一直發(fā)揮核心競爭力的作用。而其覆蓋本質(zhì)規(guī)律的簡約性,又使得其培養(yǎng)開銷相對經(jīng)濟,性價比高。下圖給出了系統(tǒng)觀的概念結(jié)構(gòu)。
計算機系統(tǒng)觀概念結(jié)構(gòu)圖
二、如何培養(yǎng)計算機系統(tǒng)觀
依據(jù)系統(tǒng)觀的功能特性可形成兩種系統(tǒng)觀培養(yǎng)方法:(1)對應(yīng)其構(gòu)建和類比功能特性是正向構(gòu)建式方法;(2)對應(yīng)其簡化分析特性是逆向析構(gòu)式方法。
(1)正向構(gòu)建式方法。該方法的核心就是“構(gòu)建”,并非構(gòu)建簡單的應(yīng)用軟件,而是構(gòu)建系統(tǒng)級軟件。即撰寫操作系統(tǒng)、編譯器、鏈接器和數(shù)據(jù)庫(非數(shù)據(jù)庫應(yīng)用軟件)。北京航空航天大學(xué)、清華大學(xué)、浙江大學(xué)均采用該方法。以清華大學(xué)為例,他們從MIPS指令設(shè)計開始,利用FPGA自制CPU,并在該CPU上實現(xiàn)操作系統(tǒng)、編譯器。該方案最大優(yōu)勢是自底向上完全打通軟硬件,形成最完整和堅實的系統(tǒng)觀。其限制在于時間和個體能力。即使在“985工程”高校中,也只能是優(yōu)秀學(xué)生才能完成。尋找階梯化方法普適到一般學(xué)生應(yīng)該是這一方案最終成功的關(guān)鍵。馬里蘭大學(xué)操作系統(tǒng)的模塊化做法可以借鑒[5],但也有其問題。
該方案的變種是:CPU并不做到可實現(xiàn)操作系統(tǒng)的程度,相對簡單可行,而利用x86實現(xiàn)操作系統(tǒng)。其好處是難度低、耗時少,且所形成的知識集合和將來面臨的工作更貼近,能利用的資源也多。電子科技大學(xué)的構(gòu)建式培養(yǎng)系統(tǒng)觀采用的是該方案。
(2)逆向析構(gòu)式方法。該方法最大的特點是將逆向工程的剖析的特點融入整個培養(yǎng)中??突っ仿〈髮W(xué)的教材《深入理解計算機系統(tǒng)》的前三章是這一方法的最典型代表[6]。即從反匯編的角度,建立高層語言和底層匯編、機器碼與機器的映射。復(fù)旦大學(xué)在2003年引入這門課,但因其涵蓋的內(nèi)容太廣泛,其實施難度依然很大。東南大學(xué)正在組織力量就“計算機系統(tǒng)基礎(chǔ)”這門課程撰寫更加適中的教材[4]。
筆者在2012年出版的教材《老“碼”識途》實施了不同理念[2]。往下采用機器碼開始析構(gòu),到C語言反匯編、C++反匯編、對象模型、鏈接、面向?qū)ο笤O(shè)計、框架。整個用逆向反匯編分析為貫穿始終的線索,覆蓋了從操作系統(tǒng)、編譯鏈接、面向?qū)ο笤O(shè)計等領(lǐng)域,并采用實證式教學(xué)理念[7],以每個知識點可“玩”為驅(qū)動,形成了輕量級、易學(xué)以致用的系統(tǒng)觀培養(yǎng)模式。
相對于構(gòu)建式,逆向析構(gòu)式雖無構(gòu)建式全面和系統(tǒng),但通過逆向貫穿、銜接,也自底向上形成了一套實用可行的培養(yǎng)方法。其知識點相對較小,不會像撰寫系統(tǒng)一樣需花費很長且整塊的時間。學(xué)生便于安排和實踐。其知識點的前后依賴性沒有撰寫整個系統(tǒng)那樣強耦合,利于模塊化學(xué)習(xí)。
三、基于逆向析構(gòu)式的輕量級培養(yǎng)
1.系統(tǒng)觀原核
教學(xué)內(nèi)容方面,筆者雖采用自底向上方式,但未涵蓋程序員所有視角,這與文獻[6]不同。一方面因為文獻[6]的內(nèi)容對多數(shù)學(xué)生依然是重量級,難以有效實施;另一方面因為筆者發(fā)現(xiàn)只要建立一個很小的“系統(tǒng)觀原核”,它就能幫助學(xué)生不斷攝取新知識,自動完善系統(tǒng)觀。原核至少由計算機形象思維與疑證思維組成。
(1)計算機形象思維。有句話生動地描述其重要性:“真正的黑客(原始意義上技術(shù)的狂熱探索者),在他腦袋里每一個字節(jié)是怎么流動的他都清楚”。另外,以下現(xiàn)象也反應(yīng)了形象思維的重要性:描述算法時我們喜歡用圖,在描述程序結(jié)構(gòu)時用UML圖,數(shù)據(jù)庫用E-R圖,描述設(shè)計意圖采用形象的設(shè)計模式名稱來暗喻。
形象思維需要直觀,計算機形象思維需要計算機領(lǐng)域的直觀感建立。在計算機領(lǐng)域分層是一個顯著特征,越高層的特征越抽象,比如面向?qū)ο缶捅冉Y(jié)構(gòu)化抽象。既然要建立直觀,那么就應(yīng)該盡量減少抽象,所以將目標(biāo)定在了軟件和硬件結(jié)合部位。筆者選取了程序員視角,從高級語言到匯編映射開始,并逐漸將這種映射(逆向反匯編)貫穿軟件開發(fā)的幾個典型部分。從C映射到匯編,從匯編映射到機器碼,并讓學(xué)生用機器碼構(gòu)建程序。從此開始,該方式將在不同階段重復(fù),最終建立起最形象的程序世界觀。
筆者選取軟件開發(fā)的典型相關(guān)部分包括:C語言到匯編映射,C++對象模型和映射,面向?qū)ο缶幊痰牡讓訖C制支撐,動態(tài)鏈接和靜態(tài)鏈接的底層機制,框架構(gòu)建和底層機制的運用,線程運用中的底層機制。它們輻射到多門系統(tǒng)級課,如:操作系統(tǒng)、編譯鏈接、計算機組成原理等。
(2)疑證思維。整個教學(xué)階段,每一個知識點的獲取幾乎都遵循猜測和實證的方式。讓學(xué)生自己猜測可能的答案,然后自主設(shè)計實驗驗證。不追求知識的系統(tǒng)性,在意的是所有知識點均能實證,可以“玩”。筆者稱其為實證式教學(xué)[7]。該方式建立了系統(tǒng)觀自我完善的思維引擎。
為了激發(fā)學(xué)生興趣,體現(xiàn)底層和系統(tǒng)思維的運用價值,逆向反匯編底調(diào)試不僅有專門的案例展示實際意義,它更完全滲透到每一部分的教學(xué)內(nèi)容。
筆者發(fā)現(xiàn)認真錘煉C語言到匯編映射后,不少學(xué)生可較好自學(xué)面向?qū)ο蟛糠帧Ρ劝l(fā)現(xiàn),上過與未上該課的學(xué)生,在未涉足領(lǐng)域研學(xué)表現(xiàn)出很大差異。未上該課的優(yōu)秀學(xué)生,在老師幫助下也無法完成用戶級線程庫;上過該課的學(xué)生卻能較輕松完成。這說明系統(tǒng)觀原核可自完善與發(fā)展。
2.教學(xué)經(jīng)驗
(1)實證式教學(xué)。在實驗室上課,實驗和課程融合??刹迦爰磁d實驗。課堂實驗需有補充題目,完成簡單實驗可做補充題目。引導(dǎo)學(xué)生自主設(shè)計實驗驗證知識點。一個班人數(shù)控制在30~50之間,否則效果難以保證。
(2)考核機制。完全以實踐為導(dǎo)向,平時占主要部分,期末考試為上機考試。如果不能保證平時環(huán)節(jié)的質(zhì)量,結(jié)果難以保證。筆者采用了以下方法:對逆向分析類型題目要抽問。如組隊,成績按排名越后越低,抽問靠后者,如果答不上,小組分數(shù)受罰。對程序題,先布置課后作業(yè),指出之后課堂考試從其中變化,允許考試攜帶作業(yè)。另外考試時盡量采用自動批改,為此,也開發(fā)了逆向底層作業(yè)自動生成和批改系統(tǒng)。題目必須分級,不能只有開放性的大題目,小題目很重要??己舜箢}目,而小題目作為自我練習(xí)不計分。
(3)效果。大量同學(xué)反映對本來枯燥的課程非常有興趣,筆者曾經(jīng)在課程半期后不點名到課率達90%以上。有意思的是,從沒有人問學(xué)了何用。許多學(xué)生反饋對他們幫助很大,其中一個學(xué)生說法反映了系統(tǒng)觀的價值:“以前出了問題就找高人,現(xiàn)在敢坐下來自己做,且真的解決了。”
綜上所述,基于逆向析構(gòu)式系統(tǒng)培養(yǎng)方法,選取了輕量級的原核建立方式,配合實證式教學(xué)和合理的考核方式,取得了較好的效果,能夠在更多學(xué)生中推廣。
參考文獻:
[1] 韓宏,周世杰. 計算機工程能力教育的思考[J]. 實驗科學(xué)與技術(shù),2011(5).
[2] 韓宏,李林. 老“碼”識途——從機器碼到框架的系統(tǒng)觀逆向修煉之路[M]. 北京:電子工業(yè)出版社,2012.
[3] 王志英,周興社,袁春風(fēng)等. 計算機專業(yè)學(xué)生系統(tǒng)能力培養(yǎng)和系統(tǒng)課程體系設(shè)置研究[J]. 計算機教育,2013(9).
[4] 袁春風(fēng),王帥. 大學(xué)計算機專業(yè)教育應(yīng)重視“系統(tǒng)觀”培養(yǎng)[J]. 中國大學(xué)教學(xué),2013(12).
[5] 黃廷輝. 計算機操作系統(tǒng)實踐教程[M]. 北京:清華大學(xué)出版社,2007.
[6] 布賴恩特等. 深入理解計算機系統(tǒng)[M]. 北京:中國電力出版社,2004.
[7] 韓宏. 一種面向計算機教育的實證式教學(xué)[J]. 實驗科學(xué)與技術(shù),2013(6).
[責(zé)任編輯:余大品]
(上接第31頁)師生59名赴德國、瑞典進行了為期兩周的境外專業(yè)拓展與實踐研修,開拓了學(xué)生國際視野,加深了學(xué)生對工程師素養(yǎng)的認識與理解。
五、結(jié)束語
通過三年來的試點改革,“卓越計劃”試點班的各項教學(xué)管理工作順利推進,學(xué)生學(xué)習(xí)風(fēng)氣良好,在學(xué)科競賽、開放實驗、大學(xué)生科技創(chuàng)新等方面逐步表現(xiàn)出理論基礎(chǔ)扎實,工程實踐能力突出的特點。在下一步的工作中,學(xué)校將繼續(xù)完善管理機制,為“卓越計劃”試點的順利實施提供人員、場地、經(jīng)費和政策保障;逐步開展工程教育專業(yè)認證工作,并進一步推進卓越試點專業(yè)國際化,提升卓越工程人才培養(yǎng)的質(zhì)量與水平。學(xué)校還將及時總結(jié)試點專業(yè)成功經(jīng)驗,積極穩(wěn)妥推進和帶動學(xué)校其他工科專業(yè)開展卓越試點工作,擴大工程教育改革受益面。
[資助項目:北京市哲學(xué)社會科學(xué)規(guī)劃重點項目“面向卓越工程人才培養(yǎng)的首都高校管理協(xié)同創(chuàng)新機制研究”(13JYA001);北京高等教育教學(xué)改革聯(lián)合項目“首都地方院校實施卓越工程師教育培養(yǎng)計劃的研究與實踐”(2013-lh20)]
[責(zé)任編輯:夏魯惠]