今天看了北航軟工課程學生寫的一篇博客[1],剛好可以借此機會把我這幾年關於軟工的思考整理出來。
我在 2016 年做過福大OO課的助教,以及在 2017 年做過集大的軟工助教。當時我有很多地方都沒有做好,並且這幾年沒怎么關注軟工課程,與教學一線脫離較久,說的東西不一定對,大家隨意看看就好。
為了確保我理解了上述博客的內容,我會先嘗試對博客做個總結,然后選擇標題“足夠好”作為切入點說說我自己的一些粗淺的看法。
博客說了啥
博客的一個關鍵背景是團隊項目選題,詳細內容在:
https://edu.cnblogs.com/campus/buaa/BUAA_SE_2021_LR/homework/11925
選題方式有三種:自選題、推薦選題、繼承往屆選題。不同選題方向對團隊關於所選題目有不同的要求(這里課程組沒有充分地把要求清晰地表達出來)。選題和需求分析的時間限制是 4 天(周末兩天),同學們面臨的來自時間壓力比較大。由於本次選題后的需求答辯邀請了業界人士和大眾評審團,需要事先提供各團隊的相應資料給他們,助教面臨的完成度壓力也比較大。
在第四天,助教團隊發現部分學生團隊未提供上述需要提前給相關人員查看的內容,以通知的形式說了一段比較重的話,特別是三個“嚴重”。成為了同學們爆發不滿情緒的直接原因。在此之后助教主動聯系一位同學,交換了關於此事的意見,事后助教向同學們道歉。助教在這一點上做得很好,說明助教是想解決問題的。
現在無法通過博客內的連接查看到對話原文。從優化后的對話來看,WPB 同學對事件思考深刻,抓住了問題的根本原因,容易促成具有建設性的對話;說話有條理,清晰地表達了自己的想法,有利於助教快速准確地理解學生的看法。
總結一下,該事件的直接原因是助教的通知說了很重的話;主要原因是本學期時間更短但事情更多;根本原因是學生和老師助教對於軟工的理解不一樣。
WPB 同學敏銳地察覺到根本原因,不愧是助教選中並進行對話的同學。他有一句總結“這就是我們對軟件工程理解的偏差了,我們希望關注技術,你們希望關注產品”,這是本篇想要重點討論的內容。
接下來我會展開談一談對於軟工和軟工課程的 個人看法,不一定對,僅供參考。
軟件 or 工程?
軟件工程課程的重點是軟件還是工程?重點當然是工程。軟工課的所有內容都在告訴我們實現軟件工程的目標的方法有哪些。如果重點是軟件,那么可以在OO課上完成這些事情,不需要放在軟件工程課。
既然重點是工程,那么工程的目標是什么?助教反復強調有三點,我在這三點中挑最重要的一點,即【通過一定的軟件流程,在預計的時間內發布“足夠好”的軟件】。我想把這句話在補充完整的同時不受限於這句話本身。
前方高能,請坐穩手扶好
工程的目標是:在當前社會環境中,工程實施者使用有限的資源,把能創造的價值最大化,並將其凝固在一個產品里面。
-
之所以說在當前社會環境中,是因為同一個商品的價值在不同社會發展階段的價值不一樣。例如三十年前做一個圖書館管理系統和現在做一個圖書館管理系統的價值相差特別大。
-
有限的資源包括了時間資源、能力和 個人需求 不同的參與者(需求方、PM、程序員等等)、人脈、資金等。
-
我們經常說“足夠好”,那么這個“足夠好”應該用什么來衡量?抽象地說就是看創造了多少價值,具體說就是最終的產品(商品)在多大程度上滿足了用戶的需求。
在軟件工程課程里面,學生團隊與實際公司的團隊的一個很重要的區別在於他們的資源更加有限,特別是時間資源。他們難以動用資金資源。對於人脈資源,有些同學有,有些則沒有。那么同學們主要用於創造價值的資源是【能力不同的參與者】。
同學們容易陷入的誤區是,只讓技術能力強的同學得到充分發揮,也就是重技術過於產品。然而事實是,在錯誤的方向上,技術能力越強的同學越會讓項目陷入危險。
作為程序員角色的同學,希望通過軟件工程課程學到技術。有一部分原因是其他課程沒有提供這個機會,但是軟工課老師又不能要求其他課程提供這些機會。系統層面的問題這里不作過多討論,因為解決這個問題需要很長的時間,所以重點討論課程本身怎么樣在短期做到最大化的改善。
軟工課程主要提供了兩個東西:
- 學習和實踐工程思想和方法
- 多人合作做出一個軟件,從中學習到技術
老師主要想讓同學做的是第一點,同學想要做的是第二點。
不學習和實踐工程思想和方法的團隊可以做出比其他團隊更好的軟件,但是他們未必使用有限資源最大化地創造出價值,因此技術強的同學抱團的成績未必比其他團隊的成績高。如前文所述,軟件本身(尤其是所用到的技術是否高級)不能作為軟工的主要評價依據。不過這在評分的時候,對助教的要求會高很多。
是否最大化地創造價值,有多個依據。我舉一個比較容易看出來的依據:看團隊主動舍棄了哪些需求,以及降低了哪些需求的完成標准。
老師需要明確地把第一點的要求傳遞給學生,主要是在宣傳上做幾件事情:
- 強調課程的目標是讓學生學習和實踐工程思想和方法,弱化軟件本身的重要性
- 強調評分主要基於同學們對工程思想和方法的掌握和實踐情況
- 讓那些只想要做軟件而不是學習工程思想和方法的同學,提前做好分數低的思想准備
對於只想學技術的同學來說,選擇這門課是一個不理智的決定。這些同學需要在非常有限的時間內同時完成兩件事,既滿足老師的需要又滿足自己的需要。就像既想從英語技術書中學到技術,又想學到英語。這種“我全都要”的想法,對個人的能力要求非常高,而人們容易高估自己的能力,結果是“全都要不到”。
如果我是這部份學生,我會舍棄掉軟工課程的分數,僅僅做到及格。與此同時最大化我自身的需要,即多人合作做出一個想做的軟件,學到想學的技術。這就是“足夠好”。不過我要強調的是,這是在我意識不到工程思想和方法的重要性的情況下做出的選擇。事實上,我當時上這門課(選修的實踐課)的時候,舍棄了其他課程的分數。
順便說一句,PM 是團隊內的最大受益者。我當時是身兼 PM 和主程序員。
老師和助教是【教授軟件工程課程】這一工程的實施者
對於老師和助教來說,他們也是在實踐工程。這一工程的具體目標是使用有限的資源讓【軟件工程課程】的學生從軟工課中學到和實踐的工程思想和方法的價值最大化。
在有限的資源發生變化時,要做出相應調整,適當舍棄一些內容。我看到助教團隊和老師出題的時候,給了一些不同要求的題目供選擇,在對話中也有談到。
這正是在通過舍棄一些內容,讓同學們學習和實踐更具有價值的工程思想和方法。這是很好的實踐,只是由於信息未能充分地傳達給同學們,出現了一些問題。
改革是不可能不出現問題的,但是有勇於離開舒適圈的老師以及願意解決問題的助教,這門課必定會越來越好。