編程是所有計算機科學、信息學、軟件工程和計算機工程專業(yè)的必修課。幾十年來,這項技能成為了區(qū)分計算機專業(yè)的畢業(yè)生與其他學科的同齡人的關鍵。我認為21世紀,編程的熟練程度本身既不能代表市場對計算機畢業(yè)生的技術水平要求,也不能成為有分量的資格證書。因此,我建議應該鼓勵計算機專業(yè)的學生通過課程活動為開源軟件項目貢獻代碼。
我在軟件工程課程中實踐這種方法已經有15年了,向開源項目貢獻代碼是必做的作業(yè)。本文中將根據個人的經驗,說明為什么向開源項目貢獻代碼能夠體現(xiàn)出學生對編程技巧的掌握情況,學生可以從這些活動中學到什么,如何將向開源項目貢獻代碼嵌入到課程中,以及如何幫助學生完成這份作業(yè)。
向開源項目貢獻代碼是編程的新概念
如今,編程只是軟件開發(fā)人員必須掌握技能之一。出現(xiàn)這種情況的原因有兩個:
首先,編程實踐的發(fā)展遠遠超出了Fred Brooks于20世紀70年代推廣的首席程序員模型,系統(tǒng)的規(guī)模擴大了幾個數(shù)量級、工具更加先進、流程的自動化也得到了普及,還有團隊合作、工作流程以及管理的日益復雜化。
其次,行業(yè)最佳實踐與大型成功的開源軟件項目所遵循的實踐已經趨同。各個企業(yè)都吸收并貢獻了許多開源開發(fā)實踐。因此,相應的知識和技術力在志愿者項目與企業(yè)項目之間是通用的。
因此,我們的教學必須從課程的教育實驗室走向實際的組織環(huán)境。學生可以通過為開源項目做貢獻,在實踐中獲得了廣泛的技能、知識和經驗,使他們成長為全面發(fā)展的現(xiàn)代開發(fā)人員,而不是好萊塢影片中的獨狼程序員。傳統(tǒng)的編程作業(yè)最難獲得的技能是以下社交與組織能力:
熟悉背景:了解項目范圍、使命、合作開發(fā)團隊以及新的領導形式下實際的開發(fā)工作狀況;
與項目的全球及多元化社區(qū)互動;
協(xié)商功能的請求、要求以及實現(xiàn)方法;
處理溝通問題,例如無人響應,這在志愿者運營的項目中很常見;
通過問題分類和發(fā)布計劃等實踐,認識作為產品的軟件;
接收、討論和處理代碼審查意見。
與技術相關的學習成果包括分析、評估、應用和創(chuàng)建等,具體內容如下:
瀏覽項目的資產,例如軟件代碼、議題、文檔和拉取請求;
快速評估軟件系統(tǒng)或組件的產品和流程質量,這在現(xiàn)代軟件的重用中經常需要;
配置、構建、運行和調試第三方代碼;
設置和運行包含不同軟件和硬件要求的軟件密集型系統(tǒng)。我開設的課程中包含手機、汽車電子、應用服務器、數(shù)據庫、容器、物聯(lián)網設備和嵌入式設備;
選擇實際的貢獻目標。(學生往往會在初期階段高估他們?yōu)轫椖孔鲐暙I的能力。)這是敏捷開發(fā)沖刺中的一項關鍵活動;
閱讀第三方代碼,找出需要添加的功能或修復的問題;
通過添加新功能或修復錯誤來修改大型第三方系統(tǒng);
編寫測試來證明自己貢獻的代碼無論在當下還是將來都能夠按預期工作;
學習使用多種編程語言和工具開發(fā)的軟件系統(tǒng)。學生經常驚訝地發(fā)現(xiàn),掌握集成開發(fā)環(huán)境 (IDE) 的知識遠遠不足以為項目做貢獻;
記錄自己的工作,一般都會使用聲明式標記語言,例如 Markdown 或文檔生成器代碼注釋;
遵循復雜的配置管理(版本控制)工作流程,例如處理問題分支和重新提交代碼;
通過預提交和持續(xù)集成的檢查和測試。
從這些實踐中獲得的社交經驗和技術經驗都是現(xiàn)代辦公環(huán)境所必須的,這些超出了ACM/IEEE 提出的軟件工程課程大綱。同時,課程的實踐也與ACM/IEEE課程大綱中的許多內容息息相關。這主要包括:鍛煉個人技能,例如批判性判斷、有效溝通和認識到自己的局限;培養(yǎng)自主學習的技能;了解解決軟件工程問題的多個維度;使用適當?shù)淖钚鹿ぞ?;建立現(xiàn)實世界的基礎;并通過各種教學和學習方法推進教育。
在軟件工程課程中嵌入開源開發(fā)
這門把“向開源軟件做貢獻”作為必做作業(yè)的課程名為“實踐中的軟件工程”,是大三課程的一部分。(該課程在 2019 年獲得了管理學院的卓越教學獎。)每年我們都會向20~50名雅典經濟與商業(yè)大學管理科學與技術系軟件和數(shù)據分析技術專業(yè)的學生教授這門課程。這門課程也是該大學信息學系的推薦選修課。
該課程在某種程度上顛覆了傳統(tǒng)的課堂教學方法,最后的成績完全由課程作業(yè)決定。向開源軟件的貢獻度占總分的50%。學生可以單獨或結對完成作業(yè)。結對的目的是幫助沒有安全感的學生,但要求結對完成的工作量必須多于個人,而且貢獻必須來自個人的GitHub賬號。
我們根據學生提供的在線開源項目工作(代碼提交和交互)、他們的最終書面報告以及課堂演示來評估學生的表現(xiàn)。一共需要三場演講,分別在第 4 周(描述所選項目)、第 8 周(概述提議的貢獻)和第 14 周(總結貢獻的實現(xiàn))。貢獻的代碼是否被接受并不會作為作業(yè)的評判標準,但會得到積極的評估。其他評估要素包括,學生對自己選擇的項目的理解和文檔、貢獻的廣度、實現(xiàn)的質量、代碼與項目的集成、測試實施、與項目開發(fā)團隊的合作、口頭陳述、書面報告的質量,以及他們在版本控制、代碼審查、議題管理和文檔等活動中使用的工具。
理論上,他們可以作弊(通過復制項目分支的貢獻等),這可能會成為一個問題,但我們要求學生在課堂上展示他們的成果,而且我們會讓學生們明白,他們貢獻的代碼會成為個人的一項戰(zhàn)績,而且將來還會被潛在雇主的詢問,這些措施可以杜絕作弊。
成功地向開源項目做貢獻
剛開始接觸這門課程的時候,學生們都懷著惶恐的心情,但在完成后都會非常高興。為了確保學生能夠為開源項目做出有意義的貢獻,我們需要考慮到他們的經驗不足與現(xiàn)代開源軟件開發(fā)的快節(jié)奏與復雜性。
這些年來,通過我分配的作業(yè)可以看出,為開源項目做貢獻的難度越來越低。各個項目變得更具包容性。許多項目簡化了新手入門指導,團隊更加多樣化(包括女性領導),公開聯(lián)系方式很常見,回復通常都很有禮貌,而且支持Windows 構建(盡管一些學生采用 Linux 以避免出現(xiàn)故障)。由于拉取請求工作流程中的手動控制、持續(xù)集成的廣泛采用、多樣化的代碼檢查機器人、友好的代碼審查流程以及拉取請求草案的使用,做貢獻的難度已降低。
盡管如此,學生們接觸的開源項目環(huán)境與傳統(tǒng)學術作業(yè)環(huán)境的體驗仍然相去甚遠。因此,小規(guī)模的貢獻才是比較現(xiàn)實的目標。為了讓這門課程的作業(yè)發(fā)揮作用,關鍵在于降低對學生所做貢獻度的期望。對于一個本科生來說,為開源做貢獻的門檻非常高,即便是向一個大型項目貢獻20行代碼也是值得慶賀的成就。我們給學生選擇項目的建議可以總結如下:
選擇一個有多位活躍貢獻者的項目,這樣就有一個社區(qū)來指導并回答你的問題。
選擇一個相對流行的項目(獲得了一些GitHub給星),證明這個項目提供了有用的功能,并且以相對合理的方式開發(fā)。你應該避免上傳到GitHub已久的廢棄論文項目。
避免過于受歡迎的項目,因為你的貢獻會被其他競爭者、噪音和官僚主義淹沒。(盡管如此,我們的一些學生還是參與了轟動一時的項目,例如 Tensorflow 和 Visual Studio Code。)
確認可以在自己的計算機上構建和運行項目。
確保項目定期接受來自外部的拉取請求,保證自己也有機會。
嘗試提供一個簡單的bug修復,作為熱身練習,測試一下自己是否有能力嚴格遵守項目的工作流程。
查找?guī)в小癎ood first issue”標記的議題,這表明該項目對新貢獻者很友好。
至于選擇貢獻怎樣的代碼,則完全由學生自己決定。他們可以從項目的議題列表中選擇一個開放的任務,或者提出自己的增強或修復意見。學生在與項目的核心團隊互動后也會經常改變策略。盡管讓他們自由選擇自己的貢獻似乎讓這個作業(yè)變得很容易,但我發(fā)現(xiàn)大約一半學生貢獻的代碼都被采納了。
學生在作業(yè)中面臨的最常見問題包括無法構建項目(通常是由于缺乏經驗和平臺不兼容),以及項目團隊缺乏溝通(學生會過分焦慮,認為他們貢獻的代碼必須被采納)。另一方面,學生們最大的快樂在于,發(fā)現(xiàn)自己的代碼被某個全世界都在使用的生產軟件所采納。在課程評估中,學生都很開心,他們表示自己在向開源軟件做貢獻的過程中獲得了許多實踐技能,同時也更自信了。