張 程,古 平,劉慧君
(重慶大學(xué) 計(jì)算機(jī)學(xué)院,重慶 400030)
軟件工程課程是計(jì)算機(jī)科學(xué)與技術(shù)方向的核心專業(yè)課程,主要從基本原理、開發(fā)方法、開發(fā)工具等幾個(gè)方面講述軟件開發(fā)的全過程,是計(jì)算機(jī)相關(guān)專業(yè)的重要專業(yè)課程。然而,在軟件工程課程實(shí)際教學(xué)過程中,其教學(xué)效果并不令人滿意,教與學(xué)的付出和收獲沒有成正比,難以實(shí)現(xiàn)該課程的教學(xué)目的和預(yù)期教學(xué)效果,尤其是學(xué)生對于理論教學(xué)內(nèi)容的掌握和理解,往往低于預(yù)期。如何提高學(xué)生對軟件工程知識點(diǎn)的理解能力和運(yùn)用能力,是軟件工程課程任課教師一直努力和關(guān)注的方向。
軟件工程是一門理論性、實(shí)踐性和工程性都很強(qiáng)的課程。新技術(shù)、新理論的不斷提出,使得軟件工程知識點(diǎn)急劇膨脹,內(nèi)容多,更新快[1]。一方面,授課教師在兼顧課時(shí)的同時(shí)要更新和補(bǔ)充更多的教學(xué)內(nèi)容;另一方面,學(xué)生連續(xù)接受幾種不同的開發(fā)思想和方法,對于各種方法之間的利弊和取舍難以真正把握,給學(xué)生真正學(xué)會和運(yùn)用軟件工程的方法和技術(shù)帶來困擾[2]。
案例式教學(xué)是當(dāng)前軟件工程課堂教學(xué)的一個(gè)重要手段[3],但是案例式教學(xué)在軟件工程課程教學(xué)中的局限性主要體現(xiàn)在案例的選擇上。一類是簡單易懂的案例,如圖書管理系統(tǒng)、教學(xué)管理系統(tǒng);另一類是典型的真實(shí)案例,如清單類App、項(xiàng)目管理類App甚至支付寶等。學(xué)生對于簡單易懂的案例能夠理解,卻無法與自己的實(shí)踐項(xiàng)目建立對應(yīng)關(guān)系或轉(zhuǎn)換。真實(shí)案例與知識點(diǎn)的相關(guān)性或緊密程度不佳,且外部影響因素多,因此給學(xué)生理解知識點(diǎn)帶來困惑。
項(xiàng)目驅(qū)動式教學(xué)也是近幾年廣泛采用的教學(xué)手段[4-9],但是很多學(xué)生為確保好成績,會選擇一些簡單、易于開發(fā)的管理類項(xiàng)目,而在未來的實(shí)際應(yīng)用中幾乎不會有同等難度層次的類似開發(fā)。同時(shí),管理類項(xiàng)目也限制了授課教師在知識點(diǎn)講授過程中的全面性和應(yīng)用性,給學(xué)生造成軟件工程課程的知識技能僅適用于管理類軟件項(xiàng)目開發(fā)的印象,而一旦面對其他類型軟件開發(fā),就不知道如何應(yīng)用課程知識和技術(shù)予以解決處理。
研討式教學(xué)中發(fā)現(xiàn),學(xué)生在研討時(shí)常常是對研討內(nèi)容的表面論述和泛泛而談,缺乏深刻理解。以“阿里云存儲技術(shù)”研討為例,參與研討的學(xué)生通過阿里云網(wǎng)站、知乎等收集素材和信息,對其對象存儲、表格存儲、塊存儲、文件存儲等進(jìn)行分類介紹,而對更有意義的存儲對比、適用性選擇等幾乎未涉及。這樣的研討效果遠(yuǎn)沒達(dá)到題目設(shè)計(jì)的要求,一個(gè)重要原因就是學(xué)生對題目涉及內(nèi)容沒有切身體驗(yàn),無法深刻理解題目內(nèi)容。
軟件工程課程實(shí)踐通常在學(xué)期末以課程設(shè)計(jì)方式進(jìn)行,多門課程的課程設(shè)計(jì)都集中在這一階段,壓縮了軟件工程課程設(shè)計(jì)的可用時(shí)間;同時(shí),2周的開發(fā)時(shí)間也限制了學(xué)生能獨(dú)立完成的軟件內(nèi)容。因此,課程設(shè)計(jì)的題目很多是“圖書管理系統(tǒng)”“宿舍管理系統(tǒng)”“貪吃蛇”“俄羅斯方塊”等簡單開發(fā)項(xiàng)目。這些項(xiàng)目限制了學(xué)生對開發(fā)技術(shù)和開發(fā)過程的思考和理解,造成課程實(shí)踐與理論知識脫節(jié)。
通過對我校計(jì)算機(jī)學(xué)院學(xué)生的調(diào)查發(fā)現(xiàn),選修軟件工程課程的學(xué)生中超過50%以上參與了各種競賽項(xiàng)目或創(chuàng)新實(shí)踐項(xiàng)目,而這些項(xiàng)目絕大部分與軟件開發(fā)緊密相關(guān),因此在軟件工程課程教學(xué)中引入競賽項(xiàng)目,是解決案例化及項(xiàng)目驅(qū)動教學(xué)問題的重要手段。教師可以在軟件工程課程開始階段收集學(xué)生參與的競賽項(xiàng)目或其他項(xiàng)目題目,并讓學(xué)生用一段話描述自己的項(xiàng)目意圖和主要內(nèi)容,以此為基礎(chǔ)進(jìn)行針對性的案例化和項(xiàng)目驅(qū)動式教學(xué)。
在軟件工程課堂理論教學(xué)中,有很多的一級知識點(diǎn)或者二級知識點(diǎn)都可以應(yīng)用案例化教學(xué)進(jìn)行闡述,而以往在選擇案例講解知識點(diǎn)的過程中,學(xué)生對于案例中知識點(diǎn)的理解不夠深刻,存在浮于表面的問題。通過收集學(xué)生親身參與的項(xiàng)目題目和內(nèi)容,可以從這些項(xiàng)目中選擇適用于某知識點(diǎn)的案例,并以此為基礎(chǔ)進(jìn)行該知識點(diǎn)講解。在上課之前,先請?jiān)擁?xiàng)目的學(xué)生事先預(yù)習(xí)這部分知識點(diǎn)內(nèi)容,然后結(jié)合自身的理解對該項(xiàng)目應(yīng)用這個(gè)知識點(diǎn)與否進(jìn)行考慮,并在班上進(jìn)行講解。最后,教師對這部分知識點(diǎn)和這個(gè)項(xiàng)目進(jìn)行講評,如此便能夠加深學(xué)生對這類知識點(diǎn)的理解和認(rèn)識。由于學(xué)生親身參與了競賽項(xiàng)目,因此同學(xué)之間不存在溝通障礙,知識點(diǎn)轉(zhuǎn)換方式也更能夠被學(xué)生接受,而且全班60多名學(xué)生往往有不少于15個(gè)項(xiàng)目,也使得軟件工程課程中的案例豐富多彩且易于理解。
以某組學(xué)生的計(jì)算機(jī)大賽題目“馨家”為例,當(dāng)課程講述到用例圖的繪制和User Story轉(zhuǎn)換過程時(shí),該組學(xué)生會結(jié)合他們在“馨家”項(xiàng)目中的用例分析來講述某個(gè)場景的Story,并基于這個(gè)故事畫出對應(yīng)的用例圖,然后針對這個(gè)Story和轉(zhuǎn)換的用例圖進(jìn)行講評和修改完善。這樣的過程可以加深學(xué)生對于從Story中轉(zhuǎn)換用例圖的方法和過程的理解,也更有代入感。
由于軟件工程課程自身的特點(diǎn),可把軟件開發(fā)的全過程分解成多個(gè)章節(jié)進(jìn)行講述,而主要的章節(jié)順序也基本是軟件過程、需求分析與設(shè)計(jì)、軟件質(zhì)量管理、軟件項(xiàng)目管理與配置管理幾個(gè)部分,這樣基本跟軟件開發(fā)過程保持一致。在實(shí)際教學(xué)過程中,首先講述軟件過程及軟件項(xiàng)目分組策略,同時(shí)重點(diǎn)介紹敏捷開發(fā)和其他一些適用于中小型項(xiàng)目的過程化管理方法(同時(shí)介紹甘特圖);然后再對需求分析與設(shè)計(jì)(結(jié)合UML的相關(guān)圖形化工具)、軟件系統(tǒng)架構(gòu)設(shè)計(jì)、編碼實(shí)現(xiàn)的語言選擇和編碼風(fēng)格、軟件測試幾個(gè)部分按順序進(jìn)行軟件工程課堂教學(xué);最后介紹軟件配置管理和軟件項(xiàng)目管理的相關(guān)知識,讓學(xué)生在學(xué)習(xí)過程中結(jié)合自己參與的項(xiàng)目進(jìn)行分析和操作,并根據(jù)每個(gè)階段的內(nèi)容提交相關(guān)文檔,如項(xiàng)目分工甘特圖、項(xiàng)目需求分析說明書、項(xiàng)目UML設(shè)計(jì)圖、部分模塊開發(fā)代碼、測試報(bào)告等。雖然針對同一個(gè)作業(yè)要求提交的文檔各不相同,加大了教師批改的工作量,但是對于學(xué)生而言,他們真正在軟件工程課程學(xué)習(xí)中理解了軟件開發(fā)的過程化管理和相關(guān)知識技術(shù),并學(xué)會了在自己的真實(shí)項(xiàng)目中應(yīng)用軟件工程的理論和技術(shù)。隨著課程學(xué)習(xí)結(jié)束,學(xué)生項(xiàng)目開發(fā)的主要工作也隨之完成,學(xué)生對這樣的教學(xué)方式表示認(rèn)同和獲益匪淺。
以1.4節(jié)中提到的“阿里云存儲技術(shù)”研討題目為例,在引入競賽驅(qū)動的項(xiàng)目式軟件工程課程教學(xué)方法后,選擇進(jìn)行App項(xiàng)目開發(fā)的小組負(fù)責(zé)這個(gè)研討題目。在軟件體系架構(gòu)設(shè)計(jì)階段,教師與該組學(xué)生共同設(shè)計(jì)該項(xiàng)目的體系結(jié)構(gòu),并分析其可能存在的數(shù)據(jù)存儲內(nèi)容,然后很明確地告訴學(xué)生在該項(xiàng)目實(shí)現(xiàn)時(shí)必須用到阿里云的云存儲。這樣,該組學(xué)生在項(xiàng)目開發(fā)時(shí)就會主動分析阿里云存儲技術(shù),決策到底哪種或哪幾種阿里云存儲技術(shù)會在該項(xiàng)目中被使用,與教師交流后,甚至可以在研討前完成部分云存儲代碼的開發(fā)。在進(jìn)行該題目研討時(shí),該組學(xué)生對這個(gè)題目的內(nèi)容有了充分體會和理解,使得整個(gè)研討內(nèi)容詳盡、表述清晰,并且充分達(dá)到了研討式教學(xué)的目的。
由于在軟件工程的課堂教學(xué)中已經(jīng)讓學(xué)生進(jìn)行分組工作,并且每個(gè)組都有自己切實(shí)可行的軟件開發(fā)項(xiàng)目,因此在課堂教學(xué)過程中,該軟件開發(fā)項(xiàng)目各個(gè)階段的開發(fā)內(nèi)容和相關(guān)文檔也都得以完成并且以作業(yè)的方式提交,確保了相關(guān)文檔的質(zhì)量。軟件工程課程設(shè)計(jì)作為課堂教學(xué)結(jié)束后的集中實(shí)踐教學(xué)階段,更多地側(cè)重于最后階段的編碼實(shí)現(xiàn)和模塊整合工作以及配套的系統(tǒng)測試,從而使得課程設(shè)計(jì)不再脫離課堂教學(xué)存在,而真正成為軟件工程課堂教學(xué)的延續(xù)和收尾。軟件工程課程實(shí)踐教學(xué)環(huán)節(jié)的內(nèi)容不再枯燥無味,學(xué)生也不再抱怨2周時(shí)間無法完成一個(gè)有一定規(guī)模的軟件產(chǎn)品,因?yàn)檎麑W(xué)期的時(shí)間都用在了完成這個(gè)軟件產(chǎn)品上。
將競賽驅(qū)動的項(xiàng)目式教學(xué)方法引入軟件工程課程的教學(xué)中,使軟件工程課程不再只有理論,而是看得著、摸得到、有體會、能接觸的教學(xué)課程。學(xué)生在學(xué)習(xí)理論知識和技術(shù)的同時(shí),能夠直接與自己參與的項(xiàng)目相結(jié)合;學(xué)習(xí)軟件工程課程的過程,實(shí)質(zhì)也是自身競賽項(xiàng)目的開發(fā)、完善和改進(jìn)過程,對于培養(yǎng)學(xué)生的專業(yè)技能和實(shí)際動手能力,實(shí)現(xiàn)教學(xué)與實(shí)踐的有機(jī)結(jié)合,都起到了重要作用。