包 瓊
(湖北經(jīng)濟學院 信息與通信工程學院,湖北 武漢 430205)
《軟件工程》是軟件工程專業(yè)與計算機科學與技術專業(yè)必修課程。該課程在學生具備一定的編程能力、已完成對數(shù)據(jù)庫基本原理學習的基礎上開設。通過課程學習,學生應該對項目開發(fā)的各個階段任務之間關系有所了解,能綜合運用已有知識對現(xiàn)實問題進行分析與設計,并解決問題,具備一定的團隊協(xié)作與文檔書寫能力。
大數(shù)據(jù)、云計算、人工智能技術的發(fā)展,對軟件工程人才培養(yǎng)提出了更高的要求[1]。2013年,隨著以“成果為導向、學生為中心、持續(xù)改進”為理念的工程教育專業(yè)認證的引入,軟件工程教育目標將更加側重于對學生能力與教學產(chǎn)出方面的評價[2]。在教學過程中應更關注:Get What(取得什么學習成果)、Why Get(為什么需要取得這些成果)、How Get(如何取得成果)與How Know(如何知道取得了學習成果)。
《軟件工程》基本理論的學習,學生完全可以通過MOOC、網(wǎng)絡資源進行。然而,目前的MOOC、網(wǎng)絡資源依然不能很好解決學生對軟件開發(fā)過程實質的理解,基本理論的理解必須依托工程實踐。網(wǎng)上教學資源可以作為對課內教學的補充,但是還不具備取代課內教學的能力。
《軟件工程》課程教學相對《程序設計語言》顯得抽象、理論性更強。計算機語言類課程所解決的問題規(guī)模相對較小,一般能在較短時間周期看到一個簡單問題的解決,因此學生比較容易獲得成就感。而反觀《軟件工程》課程,需要學生思考與解決的問題復雜度要高很多,導致成就感的獲得周期相對會長很多。因此,有些學生還沒有堅持到最后成果就中途放棄了。所以,《軟件工程》課程教學與程序設計類課程教學有著明顯不同。后者成就感獲得是短、頻、快,而前者成就感的獲得正好相反。
因此,如何適應學習主體學習特點,改善成就感獲得,調動主觀能動性,成為衡量《軟件工程》課程教學內容與方法設計的重要指標。
軟件開發(fā)技術更新突飛猛進,各種開發(fā)框架層出不窮,簡化了開發(fā)者開發(fā)難度、提升了開發(fā)效率。同時學生需要不斷學習新的開發(fā)知識。目前應用開發(fā)從基于Web應用開發(fā),到手機APP開發(fā),到熱門微信小程序開發(fā)等等。隨著軟件應用迅速普及,軟件朝著更小規(guī)模體量、更快速的開發(fā)發(fā)展。開發(fā)的短周期、開發(fā)過程的快速迭代、持續(xù)的交付與集成,成為現(xiàn)代軟件開發(fā)的顯著特點。傳統(tǒng)教學明顯不能滿足現(xiàn)代軟件開發(fā)變化。因此,對《軟件工程》教學內容取舍提出了更高要求。如何兼顧軟件工程基本內容體系完整性,又能結合現(xiàn)代軟件開發(fā)特點,將內容有效地融合到案例中,體現(xiàn)軟件開發(fā)基本原則,成為教學設計中需要考慮的重要問題。
基本能力培養(yǎng)需要以課程知識為載體,通過教學活動完成[3]。本文圍繞“成果為導向、學生為中心、持續(xù)改進”的理念,對《軟件工程》教學方法進行了改進。
以軟件需求分析部分教學為例,理解用戶需求,真實有效的例子非常重要。教學中選用真實網(wǎng)絡教學平臺的作業(yè)提交與批改作為實際案例進行分析。
這個案例的好處是:①它是一個真實的系統(tǒng),學生往往比較容易接納;②它是一個商業(yè)系統(tǒng),具有一定的復雜性;③使用該案例,可以分別接觸到教師端與學生端兩個不同角色,可以幫助學生有效理解不同角色對于系統(tǒng)的不同需求。
該案例很好切合了需求分析環(huán)節(jié)教學中關于通過現(xiàn)有系統(tǒng)獲取用戶需求的要求。通過一段時間的共同使用,學生可以在教師的提示與引導下,詳細描述該系統(tǒng)提供的功能及對應的用戶需求。
在該系統(tǒng)使用過程中,學生與教師一起發(fā)現(xiàn)了一些系統(tǒng)存在的問題,引發(fā)共同思考:①對于優(yōu)秀作業(yè),教師想通過討論組方式進行轉發(fā),可是相關附件不能一起轉發(fā),這時就產(chǎn)生了用戶新的需求;②通過系統(tǒng)對提交作業(yè)進行互評時,哪些人參與互評?這就產(chǎn)生了對業(yè)務規(guī)則詳細定義的要求;③如果作業(yè)提交日期修改了,會對互評有什么影響?這時,產(chǎn)生了新的思考,軟件功能與業(yè)務流程處理之間的矛盾如何協(xié)調。如果軟件設置過于隨便,可能會對某些業(yè)務流程的實際執(zhí)行產(chǎn)生非預期干擾甚至錯誤。
在這個真實案例中,學生擺脫了編程技術束縛,將重點落到了需求分析上。最后,學生給出了作業(yè)提交與批改系統(tǒng)的詳細需求列表,并根據(jù)自己的思考發(fā)現(xiàn)問題,提出了新的需求。在這個過程中,學生積極主動參與、思考,教師充分調動了學生的主觀能動性,在有效課堂時間內實現(xiàn)了師生互動、生生互動。
軟件開發(fā)各階段的工作之間都是有一定聯(lián)系的。如何通過有效的教學設計,在有限時間空間范圍內,讓學生體會并感受到軟件開發(fā)階段之間的聯(lián)系、前后關系,是一個很大的挑戰(zhàn)。
在教學過程中,圍繞模擬自動售貨機案例進行了相關設計。對于自動售貨機案例,按照用戶不同需求定位,給出了3個不同層次的系統(tǒng)需求,簡化描述如下:
Level1:定位為最基本的單臺自動售貨機,能夠完成商品的選擇、投幣、出貨、找零環(huán)節(jié),單次交易只能購買一件商品;能進行商品補貨。
Level2:定位為能夠對價格進行自由調整的售貨機,除了支持投幣付款,還支持其它電子貨幣付款方式,一次交易可購買多個商品;能進行商品補貨。
Level3:定位整個城市的自動售貨機系統(tǒng),通過網(wǎng)絡可以實現(xiàn)銷售情況統(tǒng)計,能夠對售貨機上貨商品與數(shù)量進行建議,調整商品配備。
不同需求對應的關注點有所不同,對于學生綜合能力要求也有所不同。具體區(qū)別如表1所示。
表1 不同層級需求的關注點及能力支撐對照
層次定位不同,難度與復雜度逐層遞增,設計與實現(xiàn)時采用的技術手段也不同。對于不同能力的學生,分配不同層次定位進行模擬系統(tǒng)開發(fā)。具體設計與實現(xiàn)采用開放方式,由學生自行選擇不同的設計與實現(xiàn)方式。學生在系統(tǒng)實現(xiàn)過程中可以根據(jù)需要采用不同方式進行設計與實現(xiàn)。比如:有學生可能采用數(shù)據(jù)庫存儲相關信息,有學生可能采用文件存儲相關信息,有學生可能直接在代碼中設置信息,有學生可能采用圖形界面實現(xiàn),有學生可能采用命令行方式實現(xiàn),有學生采用C++實現(xiàn),有學生采用Java實現(xiàn)。最后結果可能五花八門,但是核心就是需求。
這種發(fā)散式學習實踐過程,通過所有人參與,可以得到多樣性的系統(tǒng)實現(xiàn)案例。學生通過測試與使用其他人開發(fā)的系統(tǒng),發(fā)現(xiàn)不同系統(tǒng)之間的差異,然后與特定需求進行對比,找到用戶需求與實際開發(fā)之間存在偏差的原因,對照系統(tǒng)思考需求細節(jié)對系統(tǒng)實現(xiàn)的影響。學生通過對比不同設計與實現(xiàn),發(fā)現(xiàn)各種方案優(yōu)劣,完成一個比較學習的過程。這個學習過程以及收獲是網(wǎng)絡學習資源無法替代的,即群體學習過程往往優(yōu)于個體孤立學習。
軟件工程教學定位與程序設計語言或某種開發(fā)技能教學定位不同,是站在更高層次上理解軟件開發(fā)各環(huán)節(jié)間的聯(lián)系,但又植根于具體項目開發(fā)。因此,選取合適復雜度的案例并進行適當教學過程設計,能讓學生有效參與案例分析、設計與實現(xiàn),并通過調動群體學習的多樣性,達成有效成果。