曾少寧++李慧++袁秀蓮
摘 要:針對編程實驗教學(xué)過程中,存在教師分配任務(wù)和學(xué)習(xí)提交實驗代碼過于耗費時間、教師評測實驗代碼和匯總成績完全依賴手工等問題,分析使用云服務(wù)和開源協(xié)同開發(fā)平臺功能以輔助編程實驗教學(xué)的方法與過程,提出一種基于GitHub平臺的問題驅(qū)動式編程實驗教學(xué)方法,具體闡述在兩個學(xué)期Android、Web等編程課程實驗教學(xué)中對可行性和有效性的驗證。
關(guān)鍵詞:教學(xué)方法;GitHub;交互式學(xué)習(xí);編程語言
0 引 言
GitHub是一個開源協(xié)同開發(fā)平臺,支持代碼庫(repository)、問題跟蹤(issue)、項目分支(fork)、代碼提交(commit)、代碼合并請求(pull request)等功能,可用于支持大規(guī)模開源和商業(yè)軟件項目的開發(fā),其最吸引人關(guān)注的研究點有GitHub開源貢獻模式[1-2]、基于GitHub的商業(yè)軟件開發(fā)[3-4]、社交編碼[5-6]、社交行為模式[7-8]、協(xié)同工作流[9-10]、在線分布式軟件開發(fā)[11]、共同創(chuàng)作平臺[12]、推薦算法[13]及教育應(yīng)用[14]。
最近,GitHub官方還推出一個面向教育的課堂工具[15],與其他用于教育的開源技術(shù)類似[16-17],GitHub也可以作為一種教學(xué)工具,用于支持軟件工程專業(yè)的協(xié)同學(xué)習(xí)模式[14]。之前的研究表明,使用GitHub替代傳統(tǒng)教學(xué)資源與教學(xué)方法,可以改進教學(xué)過程[18-19];同時,GitHub所提供的版本控制功能也可以集成到本科計算機科學(xué)課堂中[20]。一些教學(xué)工作者使用GitHub的服務(wù)優(yōu)化教學(xué)過程,如專門為軟件開發(fā)教學(xué)在GitHub上創(chuàng)建的UEC軟件庫[21]、在課堂中使用Github版本控制功能[22]以及使用GitHub的開源協(xié)同工作流支持課堂教學(xué)[23]。有研究案例表明,GitHub的協(xié)同開發(fā)特性可以很好地支持計算機科學(xué)和軟件工程等專業(yè)學(xué)生的學(xué)習(xí)活動[24]。實際上,學(xué)生在學(xué)習(xí)過程上可以使用GitHub開展協(xié)同學(xué)習(xí)實驗[25]。此外,使用GitHub布置編程課堂作業(yè),也是一種很常見的輔助教學(xué)方法。然而,想要在GitHub上順利執(zhí)行完整的教學(xué)過程,只是將GitHub作為一種輔助教學(xué)工具使用是遠(yuǎn)遠(yuǎn)不夠的?;贕itHub平臺的問題驅(qū)動式編程實驗教學(xué)方法,可用于支持開放協(xié)同的編程教學(xué)實驗。
1 相關(guān)工作
GitHub可以看做一種特殊形式的云服務(wù),而云技術(shù)在教學(xué)中的應(yīng)用由來已久。雖然GitHub的互聯(lián)網(wǎng)托管服務(wù)相對更適合軟件工程等計算機專業(yè)教育,但是一直以來都有其他形式的云技術(shù)應(yīng)用于教學(xué)過程[26]。在教學(xué)中使用云計算技術(shù)具有很多的優(yōu)勢[27-28],如有專門為信息技術(shù)教學(xué)創(chuàng)建的教育云平臺[29],也有專門為材料科學(xué)基礎(chǔ)課程創(chuàng)建的一種高度交互的云課堂技術(shù)[30]。此外,國內(nèi)外許多高校都使用云技術(shù)創(chuàng)建虛擬化計算實驗室[31]。實際上,云計算方法本身就非常適合用來支持實驗教學(xué)過程[32],然而相對于一般的云技術(shù),GitHub所提供的開源項目開發(fā)特性更加適合計算機編程教學(xué),如協(xié)同開發(fā)模型、社交編碼[33]、版本控制、免費代碼庫等。
基于GitHub平臺的教學(xué)應(yīng)用可以分成3類:第1類是課堂工具,其中包括前面提到的GitHub官方推出的課堂工具,但是這些工具是一種適用于教學(xué)資料管理和教學(xué)活動管理的通用技術(shù),而不是專門針對編程教學(xué)的工具;第2類是將GitHub作為一種內(nèi)容托管服務(wù),通常只是利用GitHub開源源代碼庫所支持的無限空間存儲和分發(fā)教學(xué)資料,如布置作業(yè);最后1類應(yīng)用相對更復(fù)雜一些,它們將協(xié)同開發(fā)模型融合到教學(xué)過程中。通常,師生都會使用GitHub的社交編碼特性,如提交代碼、請求合并、評論等。我們也曾經(jīng)提出過一種基于GitHub平臺的協(xié)同式實驗教學(xué)方法[34],但是編程是一種解決問題的過程,教學(xué)中應(yīng)培養(yǎng)學(xué)生使用代碼解決問題的能力,而不僅僅是教授編程技能。
實際上,無論是開源項目或是商業(yè)項目,都在使用GitHub的問題跟蹤功能跟蹤和管理軟件缺陷(Bug)。在GitHub上修復(fù)一個開源項目缺陷的基本過程如下。
在這個過程中,用戶、開發(fā)者和核心開發(fā)者一起協(xié)作,使用GitHub提供的代碼庫、分支、代碼提交、評論、標(biāo)簽、合并請求等功能修復(fù)一個問題。經(jīng)過恰當(dāng)?shù)恼{(diào)整,這個過程就可以用來支持編程教學(xué)活動,實現(xiàn)一種問題驅(qū)動式教學(xué)方法,從而更高效地鍛煉和培養(yǎng)學(xué)生解決問題的能力。
2 問題驅(qū)動式編程教學(xué)方法
根據(jù)編程實驗教學(xué)的特點,如果按照前面的GitHub解決問題過程開展編程實驗教學(xué)活動,就必須對解決問題過程的角色進行調(diào)整,才能最終設(shè)計出符合實驗教學(xué)要求的過程。
2.1 設(shè)計教學(xué)過程
在GitHub跟蹤和修復(fù)問題的過程中,如果結(jié)合實驗教學(xué)的需求,用教師與學(xué)生等相關(guān)角色替代開源協(xié)同開發(fā)的角色,并且將這個過程中的活動調(diào)整為實驗教學(xué)活動,就可以得到一種問題驅(qū)動式實驗教學(xué)方法。
在該方法中,教師和學(xué)生都使用相同的問題、代碼庫、分支、提交、評論、標(biāo)簽、合并請求等功能完成實驗教學(xué)中的各種活動。教師在這個過程中扮演著核心開發(fā)者的角色,負(fù)責(zé)創(chuàng)建課程代碼庫、檢查作業(yè)代碼和給學(xué)生作業(yè)評分;學(xué)生則根據(jù)實驗問題要求編寫和提交代碼。當(dāng)學(xué)生通過合并請求提交實驗作業(yè)時,教師會檢查作業(yè),通過評論功能指導(dǎo)學(xué)生解決作業(yè)中的問題;如果教師決定接受并合并學(xué)生的請求時,學(xué)生就算是完成實驗并且會獲得相應(yīng)的實驗分?jǐn)?shù)。在這個過程中,開放協(xié)同開發(fā)平臺的特點使得所有學(xué)生的全部實驗活動都是互相可見的。我們的課程實驗發(fā)現(xiàn),這種方式對于編程學(xué)習(xí)過程非常有好處,但是為了順利完成整個編程實驗,我們還需要解決兩個問題:一是自動識別學(xué)生身份;二是自動生成學(xué)生的期末總評分。
2.2 自動識別學(xué)生身份
這個過程的問題是GitHub本身并不可能支持學(xué)生賬號與學(xué)號的關(guān)聯(lián)。學(xué)生賬號都是自行在網(wǎng)站上注冊的,記錄和跟蹤學(xué)生賬號會帶來額外的繁重工作,但是新方法不應(yīng)該增加教學(xué)工作的負(fù)擔(dān)。那么,該如何確定哪一位學(xué)生提交了代碼,以及他/她所提交代碼對應(yīng)的問題號是哪一個呢?使用GitHub的版本控制功能,恰恰能解決這個問題。在每一次代碼提交中,GitHub都會跟蹤所有發(fā)生修改的文件,包括文件增加或刪除的代碼行。此外,在一次代碼提交中所有新創(chuàng)建、修改或刪除的文件都會被記錄下來。在以創(chuàng)建問題的方式布置實驗任務(wù)時(見表2),教師需要設(shè)計一個實驗要求,讓學(xué)生在代碼中留下一個可以鑒別學(xué)號的線索,如以學(xué)號作為文件夾或文件名。圖1所示為實驗課程庫(hzuapps/java-web)中的一個代碼提交記錄,里面包含修改過的文件記錄,其中就可以看到學(xué)生學(xué)號的線索(se1414080902203),因此這個線索就可以在評分程序中用于關(guān)聯(lián)學(xué)生賬號與學(xué)號。endprint
2.3 自動評分系統(tǒng)
在使用信息技術(shù)輔助教學(xué)過程時,自動考核是其中要考慮的最重要問題之一[35]。只有支持合理的評分方式,一個教學(xué)方法才稱得上真正有效。GitHub提供了一套開發(fā)者應(yīng)用編程接口(API)[36],允許開發(fā)者編程抓取代碼庫的開發(fā)活動數(shù)據(jù),包括前面提到的貢獻者、問題列表、合并請求、提交代碼等,因此,在編寫Java評分程序時,第1個任務(wù)就是抓取課程代碼庫所發(fā)生的活動數(shù)據(jù),整個評分過程如圖2所示。
我們編寫的Java程序的第2個任務(wù)是分析從課程代碼庫抓取的活動數(shù)據(jù)。由于實驗要求中定義了學(xué)生身份線索(參見2.2),因此這個程序可以將每一個問題映射到一個學(xué)號上,然后它會記錄所有的實驗活動,包括請求數(shù)、提交數(shù)、修改文件數(shù)等,最后,程序會根據(jù)數(shù)據(jù)分析結(jié)果為每名學(xué)生生成一份實驗成績報告。例如,表3顯示了課程代碼庫“hzuapps/java-web”中登錄名為“Mr-bingo”的學(xué)生成績報告,這名學(xué)生實驗成績?yōu)?00分。滿分列指每一類數(shù)據(jù)的最高分值,而平均值顯示的是整個班級中每一類數(shù)據(jù)的平均值,然后,每一項數(shù)據(jù)得分可以參照平均值計算得出。需要特別說明的是,請求數(shù)是指教師接受請求的數(shù)量(參見2.1)。這個接受請求的動作是由教師評閱作業(yè)時手工完成的,而不是評分程序自動完成的。這個Java評分程序只負(fù)責(zé)采集和統(tǒng)計正確作業(yè)(已接受)的得分以及自動生成學(xué)生的實驗成績報告。
3 教學(xué)方法的實踐及結(jié)果
為了驗證所提出方法的可行性,我們在2門課程的編程實驗教學(xué)過程中實踐了問題驅(qū)動式實驗教學(xué)方法,分別是“基于Android的移動應(yīng)用設(shè)計與開發(fā)”和“基于Java EE的高級網(wǎng)頁設(shè)計”。我們使用Java編寫數(shù)據(jù)抓取程序,通過GitHub開發(fā)者API抓取實驗活動數(shù)據(jù),包括請求數(shù)、提交數(shù)、用戶、評論等,再根據(jù)這些數(shù)據(jù)評估教學(xué)方法的有效性。在程序抓取到數(shù)據(jù)后,有時需人工處理少量出現(xiàn)問題的數(shù)據(jù)。具體地,需要進行2個人工處理操作:①刪除所有沒有關(guān)聯(lián)到一個有效問題號的數(shù)據(jù);②刪除未能解析到一個有效學(xué)號的數(shù)據(jù)。
3.1 基于Android的移動應(yīng)用設(shè)計與開發(fā)課程實驗
這個課程(2016年春季)一共有4個班級162名學(xué)生選課,都使用同一個GitHub代碼庫(hzuapps/android-labs)。我們一共從數(shù)據(jù)中獲取到162個有效問題號,但是有一些問題并沒有任何的請求和提交數(shù)據(jù),如圖3和圖4所示,這是因為這個課程并不是一個必修課程,一些學(xué)生可能在提交問題后選擇中途退出課程。
這個實驗課程一共設(shè)置了9個作業(yè),其中包括5個必選作業(yè)和4個可選作業(yè),這表示所有學(xué)生必須有5個以上請求獲得接受,如圖3(虛線)所示,有29.6%的學(xué)生完成了規(guī)定的實驗;同時,一共有83個問題出現(xiàn)4個請求,另外有111個問題出現(xiàn)3個請求,換算成比例分別是51.2%和68.5%。全部學(xué)生發(fā)送的平均請求數(shù)量為4.735個,稍低于合格實驗數(shù)量(5個),但在正常的范圍之內(nèi),完成實驗的學(xué)生數(shù)量也符合正態(tài)分布。
為了準(zhǔn)確評估學(xué)生的實驗表現(xiàn),還需要進一步分析學(xué)生的代碼提交數(shù)量和修改過的文件數(shù)量,如圖4所示,每一個學(xué)生平均修改的文件數(shù)量為17.710個,而平均提交代碼次數(shù)為7.136次,這個數(shù)字高于平均請求數(shù)(4.735)。請求數(shù)量較低的原因是一些學(xué)生會在一次請求中提交多次作業(yè)的代碼。除此之外,一些學(xué)生可能會在一次實驗中多次提交代碼,如修改之前的錯誤。經(jīng)過統(tǒng)計,我們發(fā)現(xiàn)學(xué)生大約需要1.5次提交代碼才能完成一個請求。按照問題關(guān)聯(lián)數(shù)據(jù)的分析,有50個問題(30.8%)出現(xiàn)了7次以上提交代碼,而這個數(shù)字與平均請求數(shù)更接近一些,因此有必要在評分時考慮提交數(shù)和修改文件數(shù)所體現(xiàn)的實驗工作量。
3.2 基于Java EE的高級網(wǎng)頁設(shè)計課程實驗
第2個課程(2016年秋季)有2個班級共79名學(xué)生選課。這些數(shù)據(jù)都來源于GitHub庫“hzuapps/java-web”。我們從代碼庫一共獲得79個有效問題,同時也抓取了請求數(shù)、提交數(shù)、修改文件數(shù)等數(shù)據(jù),具體如圖5和圖6所示。這個課程一共有8個實驗,其中只有1個是選做實驗。
課程數(shù)據(jù)分析得到的平均請求數(shù)為6.835,比較接近要求的7個實驗數(shù),意味著這兩個班級的學(xué)生完成實驗情況非常好,如圖5所示,一共有30個問題(38.0%)有7個以上合并的請求,另外有67個問題(84.8%)有4個合并的請求,這些學(xué)生至少可以得到合格以上的成績;如圖6所示,在提交代碼次數(shù)和修改文件數(shù)量上,它們的平均值分別是12.6和20.4,因此選修這個課程的學(xué)生至少需要1.8次代碼提交才能完成一次請求,這表明這個課程的學(xué)生在完成實驗過程中投入了更多的時間和精力,但可能是由課程難度造成的。
4 結(jié) 語
隨著GitHub逐漸成為一個最流行的開源軟件開發(fā)平臺,出現(xiàn)了許多基于GitHub社交編碼服務(wù)、特性和方法的教學(xué)方法,而且GitHub也越來越多地被用作教學(xué)工具,然而相對于它所提供的工具功能,這個平臺的社交編碼方法對于編程學(xué)習(xí)的作用更大。我們提出一種問題驅(qū)動式編程課程實驗教學(xué)方法,更注重培養(yǎng)學(xué)生解決問題的習(xí)慣和能力。這個方法使用GitHub的許多核心功能,如代碼庫、分支、提交代碼、合并請求等,可以很好地支持編程實驗教學(xué)活動。我們在兩個編程課程中實踐了這個新的教學(xué)方法,結(jié)果證明這個教學(xué)方法有效。未來,我們將探索這個教學(xué)方法在非計算機編程課程上的應(yīng)用可行性。
參考文獻:
[1] Tsay J, Dabbish L, Herbsleb J. Influence of social and technical factors for evaluating contribution in GitHub[C]//ICSE. Hyderabad: ACM, 2014: 356-366.endprint
[2] Guzman E, Azócar D, Li Y, et al. Sentiment analysis of commit comments in GitHub: An empirical study[C]//Working Conference on Mining Software Repositories. Hyderabad: ACM, 2014: 352-355.
[3] Peterson K. The GitHub open source development process[J]. Mayo Clinic, 2013(1): 1-10.
[4] Kalliamvakou E, Damian D, Blincoe K, et al. Open source-style collaborative development practices in commercial projects using GitHub[C]//37th IEEE International Conference on Software Engineering. Florence: IEEE, 2015: 574-585.
[5] Dabbish L, Stuart C, Tsay J, et al. Social coding in GitHub: Transparency and collaboration in an open software repository[C]//CSCW 2012 Computer Supported Cooperative Work. Seattle: DBLP, 2012: 1277-1286.
[6] Thung F, Bissyande T F, Lo D, et al. Network structure of social coding in GitHub[C]//2013 17th European Conference on Software Maintenance and Reengineering.Washington D C: IEEE, 2013: 323-326.
[7] Mcdonald N, Goggins S. Performance and participation in open source software on GitHub[C]//CHI '13 Extended Abstracts on Human Factors in Computing Systems. Paris: ACM, 2013: 139-144.
[8] Yu Y, Yin G, Wang H, et al. Exploring the patterns of social behavior in GitHub[C]//Proceedings of the 1st International Workshop on Crowd-Based Software Development Methods and Technologies. Hong Kong: ACM, 2014: 31-36.
[9] Rahman M M, Roy C K. An insight into the pull requests of GitHub[C]//Proceedings of the 11th Working Conference on Mining Software Repositories. Hyderabad: ACM, 2014: 364-367.
[10] Tsay J, Dabbish L, Herbsleb J. Let's talk about it: Evaluating contributions through discussion in GitHub[C]//Proceedings of the 22nd ACM SIGSOFT international symposium on foundations of software engineering. Hong Kong: ACM, 2014: 144-154.
[11] Marlow J, Dabbish L, Herbsleb J. Impression formation in online peer production: Activity traces and personal profiles in github[C]//Proceedings of the 2013 Conference on Computer Supported Cooperative Work. San Antonio: ACM, 2013: 117-128.
[12] Longo J, Kelley T M. Use of GitHub as a platform for open collaboration on text documents[C]//Proceedings of the 11th International Symposium on Open Collaboration (OpenSym). San Francisco: ACM, 2015: 1-2.
[13] Yu Y, Wang H, Yin G, et al. Reviewer recommender of pull-requests in GitHub[C]//IEEE International Conference on Software Maintenance and Evolution.Victoria: IEEE, 2014: 609-612.endprint
[14] Zakiah A, Fauzan M N. Collaborative learning model of software engineering using Github for informatics student[C]//2016 4th International Conference on Cyber and IT Service Management. Jakarta: IEEE, 2016: 1-5.
[15] Github classroom[EB/OL]. [2017-05-18]. https://classroom.github.com/.
[16] Stracquadanio G, Yang K, Boeke J D, et al. BioPartsDB: A synthetic biology workflow web-application for education and research[J]. Bioinformatics, 2016, 32(22): 394.
[17] Izbicki M. Open Sourcing the Classroom(Abstract Only)[C]//ACM Technical Symposium on Computing Science Education. Memphis: ACM, 2016: 723-723.
[18] Murray J. Open education: A revolution of resources and community[C]// TCC Worldwide Online Conference. Honolulu: TCC,2014: 65-72.
[19] Kamvar Z N, Lópezuribe M M, Coughlan S, et al. Developing educational resources for population genetics in R: An open and collaborative approach[J]. Molecular Ecology Resources, 2016, 17(1): 120-128.
[20] Bonakdarian E. Pushing Git & GitHub in undergraduate computer science classes[J]. Journal of Computing Sciences in Colleges, 2017, 32(3): 119-125.
[21] Goto T, Homma T, Tsuchida K, et al. Software development education based on UEC software repository[M]. Berlin: Springer, 2012: 55-65.
[22] Griffin T, Seals S. GitHub in the classroom: Not just for group projects[J]. Journal of Computing Sciences in Colleges, 2013, 28(4): 74.
[23] Zagalsky A, Feliciano J, Storey M A, et al. The emergence of GitHub as a collaborative platform for education[C]//The ACM Conference on Motivation and Dynamics of the Open Classroom CSCW 2015. Vancouver: ACM, 2015: 1906-1917.
[24] Feliciano J, Storey M A, Zagalsky A. Student experiences using GitHub in software engineering courses: A case study[C]//International Conference on Software Engineering Companion. Washington D C: IEEE Computer Society, 2016: 422-431.
[25] Kertesz C Z. Using GitHub in the classroom: A collaborative learning experience[C]//2015 IEEE 21st International Symposium for Design and Technology in Electronic Packaging. Brasov: IEEE, 2015: 381-386.
[26] Ercan T. Effective use of cloud computing in educational institutions[J]. Procedia-Social and Behavioral Sciences, 2010, 2(2): 938-942.
[27] González-Martínez J A, Bote-Lorenzo M L, Gómez-Sánchez E, et al. Cloud computing and education: A state-of-the-art survey[J]. Computers & Education, 2015(80): 132-151.
[28] Liou W K, Bhagat K K, Chang C Y. Beyond the flipped classroom: A highly interactive cloud-classroom(HIC) embedded into basic materials science courses[J]. Journal of Science Education and Technology, 2016, 25(3): 460-473.endprint
[29] Yokoyama S, Yoshioka N, Shida T. Cloud in a cloud for cloud education[C]//International Workshop on Principles of Engineering Service-Oriented Systems. Zurich: IEEE, 2012: 63-64.
[30] Burd S D, Luo X, Seazzu A F. Cloud-based virtual computing laboratories[C]//Hawaii International Conference on System Sciences. Hawii: IEEE, 2013: 5079-5088.
[31] Khmelevsky Y, Voytenko V. Cloud computing infrastructure prototype for university education and research[C]//Western Canadian Conference on Computing Education. Kelowna: ACM, 2010: 8.
[32] Yang G Z, Zhou F, Zhu Z. The application of SaaS-based cloud computing in the University Research and Teaching Platform[C]//International Conference on Intelligence Science and Information Engineering. Wuhan: IEEE, 2011: 210-213.
[33] Lima A, Rossi L, Musolesi M. Coding together at scale: GitHub as a collaborative social network[J]. Eprint Arxiv, 2014(7): 25-35.
[34] 曾少寧. 基于GitHub平臺的協(xié)同式實驗教學(xué)方法[J]. 計算機教育, 2016(12): 144-148.
[35] Zamyatina O M, Mozgaleva P I. IT implementation in the educational process of future engineers by means of project activities and competences assessment[C]//Global Engineering Education Conference. Berlin: IEEE, 2013: 1170-1176.
[36] Github Developer. REST API v3[EB/OL]. [2017-05-18]. https://developer.github.com/v3/ .
(編輯:宋文婷)endprint