現代軟件工程 教課心得
現實世界是最好的老師, 我們這些叫 “老師” 的人, 充其量是個助教。 但是有些助教卻不讓學生見到老師。
****************
老師都想把課教好, 學生都想把課學好. 但是我們常常看到一個學期過后, 老師, 學生都有很多抱怨 (例如: 各種良好愿望和計劃在實施中的問題). 看了上面的例子, 我腦海中浮現這樣的圖畫:
游泳教練認為經過各項基本訓練, 學員在第三年的時候, 應該達到了能組隊游泳渡江的能力, 于是教練幻想這樣的畫面:
期望學生們綜合運用平時訓練獲得的能力, 組成團隊, 互相幫助, 自主學習, 集體渡江成功, 老師和TA 只用在小船上實施必要的救助即可.
但是良好的愿望碰到了尷尬的現實,這是老師在操作系統課上發現的現實:
- 特別能抄襲。被確認抄襲的人次歷史之最,是往屆數倍
- 特別能放棄。抄襲無門后,就大片地放棄作業,人數也是歷史之最,往屆數倍
- 特別少交流。網上論壇里的討論,無論數量還是質量都是史上最低
- 特別能應試。雖然發帖少,但詢問評分細節的帖子卻是史上最多
- 特別缺驚艷。即便是獨立完成作業且拿滿分的同學,其中也難以見到往屆哪種處處驚艷的效果,很多人都只是應付,看不到任何激情。
我不知道在大江大河中游泳, “抄襲, 應試” 是怎么實現的, 所以無法類比。 放棄倒是很好類比, 很多 “游泳健兒”到了江邊, 找各種借口 - 不游了!
大學生都有一定的閱歷和自學能力, 他們通常能很容易地掌握下圖中第一步到第四步。 但是社會要求往往是第五步 - “精通”。 這第四步到第五步之間有一個很大的鴻溝。 要跨過這個溝, 學生要學一些比較乏味而且貌似不太相干的內容, 例如馬的骨骼結構, 若干原理, 若干基礎實踐課程如素描等等。 老師怎么創造一種學習/實踐/反饋的環境, 讓學生能通過各種手段跨過這個溝。 (參考 卓越大學教師的建議).

在我教的課中, 絕大部分學生都下河里真正地游了好幾次, 還完成了一次團體橫渡江河的挑戰。 他們感覺很累, 但是也很有收獲, 算是體會到了實際做軟件是怎么回事。 下面是我教 <現代軟件工程> 的一些心得:
- 和領導溝通: 獲得各位領導的支持 - 您想培訓什么樣的學生, 是世界一流, 還是中國一流, 還是本省二流? 有什么樣的期望, 就有什么樣的課程設計。 我上課的學校中, 它們都把自己定位為世界一流, 或中國一流, 那我就要用世界一流和中國一流的標準來要求同學們, 否則我就是不稱職的。 要和本課的 TA 就怎么教好課程達成一致意見。 (我知道很多系領導會說無資金支持 TA, 我認為這是無能的借口 - 非不能也, 是不為也)。明確告訴利益相關者, 這門課實際負擔是多少, 估計有多少人會不及格。
- 和同學溝通: 開門見山, 在第一堂課上花時間講述 老師期望的師生關系是什么 [是運動員和教練的關系] , 這堂課如何打分 [1/n 的給分體系, 遲交作業 0 分, 不叫作業倒扣分], 最終分數的分布概況 (20% 優秀, 10% 不及格或剛及格, 其余在二者之間線性分布) (鏈接) 想學習的學生知道如何努力, 想混的學生也知道怎么才能混過去, 想退課的也可以馬上退掉。
- 簡明公開的規則: TA 在每一次作業之后, 都公布所有同學 (只顯示學號后幾位) 目前的得分, 以及推算出來的最終分數。 根據分數的分布情況, TA 通常把 10% 的同學劃到不及格這一欄中。 簡化TA 的工作, 晚交作業一律 0 分, 不必說情。
- 循序漸進: 了解學生的能力, 不出意外的話, 你會發現學生的動手能力很差!
學生之間從來沒有正經合作過!
你想讓他們馬上搞一個團隊有各種角色, 完成一個實際的項目是不可能的! 怎么辦? 我這門課設計了三種項目:- 個人項目 (讓每個人練練自己的手藝, 同時實踐項目管理的工具和操作 check-in, check-out, 簡單的測試用例設計)
- 兩人項目 (兩個人合作完成一個比較難的作業, 鍛煉交流能力, 合作能力。 同時練習軟件工程中的 “結對編程”, 接口設計, 代碼復審, 簡單的界面設計, 同時讓學生有機會學到不同語言, 不同的框架設計, 不同的表現層的實現 – WPF, Flash, Silverlight 等 ) 這類項目可以安排兩次, 每次換人做。
- 團隊項目 (真正的考驗, 但是有了前面的準備和鍛煉, 他們已經可以到河里游泳了)
- 讓學生有更多的控制, 激發他們的自我管理意識。 在這三種項目中, 學生對項目的控制越來越多, 要相信學生想做好, 能夠做好:
- 個人項目: 學生可以選擇編程語言, 其它由老師指定。
- 兩人項目: 學生可以選擇語言, 界面,
- 團隊項目: 學生可以選擇做什么, 各人的角色, 如何實現, 如何推廣。
- 如何處理學生討價還價? 很多學生給老師說:我基礎差,軟件工程課能不能高抬貴手,意思意思就行了,不要寫那么復雜的軟件。 回答:這就是本校本專業的底線。 給學生控制和希望: 有些學生某個項目搞砸了, 怎么辦? 有的學生代碼經驗特別少,怎么辦? 沒問題,課程中有一定的分數是各人自由發揮的能掙到的, 例如主動為大家服務寫測試工具, 寫更多的讀書報告, 寫深入的分析報告,等等, 都能掙到分數 -- 軟件工程不光是寫代碼。另外,要讓學生小組之間互相評比,這樣就把矛盾從“老師 -- 學生” 之間不斷討價還價,變成 “學生 - 學生” 互相比拼。
-
怎么教,怎么學? 老師不能陷入傳統的 “老師 - 學生” 模式出不來,在這個模式下, 老師不斷地 "敲黑板" - 同學們,敏捷的12原則要記住啊,期末要考! 但是學生未必領情,敲碎黑板又如何? 老師可以引入別的模式, 例如組織結對編程來促進 【學生 - 學生】的互動和學習, 通過團隊項目,團隊貢獻分來促進 【學生 - 團隊】的學習; 通過團隊評比來促進 【團隊-團隊】的學習; 通過公開的博客和公開的軟件管理和發布來促進 【團隊 - 社會】的互動。 學生不能光干活不思考, 同學們要不斷總結 – alpha, beta 階段都要做正式的 回顧和總結, 并發布博客。 要求學生自己先看教材, 然后發博客提問題, 都是成年人了, 應該能提出一些問題來; 課程結束的時候看看自己最初提出的問題, 估計自己都可以回答了 - 這不就是上課的作用么? 學生團隊要互相評比,評比的時候不要打分(A組 90 分,B組 89 分...) 因為這樣分數會太接近。 要采取無并列排名次的方法, 每個小組給別的小組排名次,同時寫140 以上的點評(優點,缺點,閃光點),排名次之后,可以看到大家公認的優秀小組得分會遠遠超過那些無所作為的小組。
-
有人打醬油怎么辦? 團隊項目有分數, 團隊中每個人都得一樣的分數, 打醬油的成員也得同樣多的分數, 怎么辦? 給每個團隊一定的自由分配的分數, 讓每個團隊決定如何分配這些分數 (分數不能平均分配, 幸苦工作的人可以得高分, 決定打醬油, 不在乎分數的人可以得低分)。 每個人的付出和結果能更好地結合起來。 在一個階段結束后,每個團隊必須有至少一個成員離開,自己尋找新的團隊。 這也是給團隊非常實際地體驗了社會上如何做績效評估, 團隊管理, 如何衡量 “我在團隊中的地位”, “我在別人心目中的分量”, "我的競爭力"。
-
用客觀數據來評分: 老師太忙, 不能仔細地批閱每一次作業, 怎么辦? 把學生的作業做成比賽, 比程序速度, 比測試用例的數量, 比博客的閱讀量… 相對的分數自然就出來了。 團隊項目一定要做解決實際問題, 能公開發布和使用的項目, 這樣有很多用戶給學生們評分。 例如一組同學的魔方程序有3 萬多下載; 同一個班級的另一組同學的軟件有 10 個下載, 誰好誰壞?
-
模擬實戰: 據我了解, 大部分軟工的”項目”是同學們從頭寫的 1.0版本, 但是IT 行業的絕大部分軟件是有很長歷史的系統, 不接觸老系統, 如何學到軟工的各種原理和實踐? 只要肯想辦法, 總是有很多途徑可以模擬實戰的:
-
把歷屆學生的項目都用版本控制軟件管起來, 這樣后來的學生可以在前人的基礎上繼續開發。
-
鼓勵同學在別人的基礎上開發 (開源, 以前的項目, 等等)
-
在項目的alpha 和 beta 階段之間, 讓部分同學跳槽, 從一個小組換到另一個小組中, 這樣同學們就有很多機會親身體會到 文檔的重要性, 如何理解老代碼, 等等軟件工程的好玩的事。
Deadline - 學生生活是什么驅動的? 是對老師規定的服從, 還是對技術的熱情, 還是為中華民族第N次偉大復興? 還是deadline? 大部分人的作業都是要等到交作業的前一天夜里搞出來的。 在軟件工程課上, 一個晚上是搞不出來可以使用的團隊項目的, 為此課程設置了很多檢查點:
- 每個階段的結束都要求公開發布博客
- 要求項目有兩個公開發布 (alpha, beta)
- 要求每個階段要有 10 天的 SCRUM 會議, 并把每次會議結果 (每個成員昨天做了什么,今天打算做什么, 碰到什么障礙) 列出來, 并用軟件工程的工具自動生成進度表。 進度表的例子:
沒有這些檢查點, 同學們會在最后演示的時候告訴你 - 我們盡力了, 搞了三天, 這次給我們及格吧, 我們以后一定會繼續改進的!然后他們再也沒有消息了。
不要盲目追求新: 1999年, 有人問軟件工程專家 David Parnas: 將來會有什么令人興奮的軟件工程技術出現? 答: 最有用的技術不在將來,
而是已經在我們中間好些年了, 只不過我們沒好好用。軟件工程課要把那些久經考驗的原則和技術交給學生, 而不能停留在浮光掠影地介紹當前最熱門的做法。 老師要展現給學生的是, 軟件工程的原則,技術仍然能解決前軟件開發的各種挑戰 - 老師自己有這個信心和經驗么?
附: 教學計劃 (http://www.rzrgm.cn/xinz/archive/2011/11/27/2265425.html)
北航的軟件工程教學計劃:
http://www.rzrgm.cn/SivilTaram/p/5656582.html
教學計劃總長: 16 周 (扣除放假之后)
授課: 12 - 14 次 老師授課
輔導課: 6 - 8 次 (輔導/交流/演示) 學生主動匯報進展, 心得, 提出問題, 老師及專業人士給予輔導。
學生項目: 個人項目, 結對編程項目 (兩個), 團隊項目
| Week | Date | Lecture (授課) | Talk (輔導/交流/演示) | Project |
| 1 | 11/1 | Intro (課程簡介, 分組) I-project 個人項目介紹 | i-project (個人項目) | |
| 2 | 11/8 | Software Engineering (軟件工程概論),Unit Test (單元測試) | ||
| 3 | 11/15 | Personal Software Process (個人軟件流程 PSP), Code Quality (代碼質量的各種標準) | SilverLight | pair project (1) 結對項目 (1) |
| 4 | 11/22 | collaboration (兩人合作), influence (影響說服別人的多種方式) | P1 review | |
| 5 | 11/29 | Team-CMMI (團隊結構, 文化, 成熟度模型 CMMI)Development Process (軟件開發的各種模式) | pair project (2) 結對項目 2 | |
| 6 | 12/6 | Innovation (軟件業的創新)Myths of Innovation (迷思),Innovator's dilemma (創新者的兩難) | P2 review | |
| 7 | 12/13 | NABCD (項目可行性分析)Spec and PM(軟件規格說明書, 項目經理) | Book Report | Team Project Kick Off 團隊項目開始 |
| 8 | 12/20 | Testing(測試) | Milestone 1 (里程碑 1) | |
| 9 | 12/27 | Proj. Mgmt w/ TFS (用TFS 進行項目管理) | daily scrum | |
| 10 | 1/3 |
Scenarios (基于場景的設計), 軟件原型設計工具介紹 |
daily scrum | |
| 11 | 1/10 | Release (軟件的發布) | alpha release | |
| 12 | 1/17 | MSF (微軟軟件解決方案框架) | Review | Review/BugBash |
| 13 | 1/24 | Dev-History (微軟軟件開發管理的歷史) | feedback | Milestone 2 (里程碑2) |
| n/a | 1/31 | Holiday | Holiday | |
| n/a | 2/7 | Holiday | Holiday | |
| 14 | 2/14 | Risk Mgmt (軟件項目的風險管理) | Book Report | daily scrum |
| 15 | 2/21 | daily scrum | ||
| 16 | 2/28 | UI/UX report | beta release | |
| n/a | 3/7 | Postmortem (軟件項目的回顧與反思) | ||
| 17 | 3/14 | Final Review (最終匯報, 復審) |





浙公網安備 33010602011771號