軟件工程課程之難
有感於今天軟件工程課程教學研討所涉及的話題。
其實在多個場合和來自不同學校的老師討論過本科或者研究生的軟件工程課程,大致回想一下,有如下幾個有趣之處:
(1)幾乎所有人都承認軟件工程課程難上;
(2)很多人都說在校學生(或者說沒有工作經驗/經歷的同學)認識不到軟件工程理論知識的重要性,上課難以聽進去;
(3)很多人都說那些有工作經驗/經歷的同學(或者在職學生,或者在外面工作實習的學生),對課上所講工程理論知識很有認同感;
(4)幾乎所有人都認為實踐訓練很重要。
其實“有趣”這個詞用的並不準確,我想表達的是,作為授課老師,在感性和直覺經驗層次獲得了這麽多共識,本身已經很能說明問題了,但是似乎沒有人從實證的角度來回答這些問題。不止如此,這種特征的問題在軟件工程領域似乎還不少。比如:
(1)大家都認為沒有豐富工作經驗的人很難整理清楚需求;
(2)代碼量不夠的人很難做好質量控制工作。等等
這些問題的討論可以引出幾乎沒有盡頭的問題,動輒就會有人從管理、技術、人員、項目等多個維度來系統性分析。不管哪個維度,想說的都是軟件工程有什麽。翻開任意一本軟件工程教材或專著,都會從這些維度展開論述。這說明這構成了這個領域的共同知識,於是就有了軟件工程知識體系(Body of Knowledge),而且還專門配合知識體系定義和建議了相應的課程大綱。但凡討論軟件工程知識的系統性時,就離不開這個知識體系。我以前沒搞明白,現在仍然還糊塗的是,如何應用那個知識體系來解決工程問題呢?我總覺得,這其中還少了點什麽。打個也許不恰當的比喻,知識體系好比是某套經典拳術,比如太極拳,從起式到最終收尾,一環扣一環,缺一招一式都不可以,練拳者必須嚴格遵守。而解決工程問題呢,就好比是搏鬥,對手是工程問題。如果你是高手,對手就變得弱,於是無招勝有招,隨意使用招式,哪怕是笨拙的招式,也可以很好的解決問題。但如果你的道行不夠,那麽對手就很難纏,你會不斷的陷入沈思和被動,對手這樣變化,意味著什麽呢?後續又會怎樣呢?我該用探手,還是撩腿來應對呢?......
從這個類比出發,軟件工程教學和少林武術學校本是同源。小時候喜歡看武俠書,癡迷到就想不讀書而去武校練本領。武校所教和所練,大致包括三個方面:
(1)鍛煉身體基本素質,包括力量、速度、耐力等;
(2)學習多種術:拳術、刀術、棍術等;
(3)組合對打和搏擊。
毫無疑問,學員最感興趣的一定是(3),最枯燥的一定是(1),(2)介乎其間。最容易出問題的是(2),搞不好搞成表演性的學習和訓練了,動作瀟灑漂亮,但是一到實戰就歇菜。前段時間熱潮的自由搏擊對戰太極,大概就是如此。寫著就扯遠了,回到軟件工程。我們仍可以類比來分析問題:
(1)基本素質:編程和測試;
(2)N術:各種需求分析方法、設計方法、測試方法、管理方法等;
(3)搏擊:解決工程問題。
這似乎就有點意思了,知識體系其實定義了一套拳譜,當然都是前輩大師們留下的寶貴財產,其權威性和價值不容置疑。但我現在是菜不能再菜的入門者了,再厲害的招法,在我看來都和廣場上的大爺大媽練的把式差不了多少,我只能看出那只是一個姿勢,其中蘊含的深奧道理,我看不出來,更不懂。
所以,軟件工程課程之難在於:
(1)學生需要達到什麽樣的基本素質,以及如何才能具備相應的素質,從而領會和掌握(2)中的道?
軟件工程課程不能自己扛下所有問題。必須要依賴於前序的編程、算法等課程。換句話說,要看看前序課程都把學生的素質練到了什麽程度,否則讓只能跑2000米的人上來練馬拉松,要麽是無法達成目標,要麽是直接折了,要不然中間搭了別人的車,反正你可能也不知道。所以這帶出來兩個問題:
(a) 基於你的學生所具備的素質,你如何設計(2)和(3);
(b) 你很清楚你需要學生具備的素質,嘗試讓前序課程為你服務。
(2)諸多道如何選擇(沒辦法所有都講授或學習)?總不能對敵時他打他的,我打我的,不管對手做什麽,先來一套72路長拳吧......
須知前輩們基本都是在為了解決某些特定問題的場景中提出/悟出了某些道,然後加以抽象和一般化處理,公布出來。換句話說,如果嘗試學習所有的道術,其結果只能是不倫不類。選擇就必須要有目標,任何一門課程,其本身就是一個系統,沒有目標就不存在系統。只能圍繞目標來選擇相應的道術加以講授和訓練。其他的道術,其精神要義基本相仿,相信學生具備這個意識和能力,將來可以自己根據情況去學習的,特別是幹不倒敵人時......
(3)如何既能幹倒對手,而且還自覺且優雅的使用一種或多種道?
在兩個人實力相差太懸殊時,就不會有自覺和優雅的問題。一個張無忌般的武林高手對戰一個普通來百姓,需要擺弄招式嗎?拜托,直接一伸手就解決戰鬥了。所以,必須針對學生具備的素質情況,設計相適應的對手來練他,且要隨著學生素質和能力的提升,不斷提升對手的水平。好的設計應該是讓學生能夠到,但是必須墊著腳尖,還得用力向上蹦。
歸納下來,軟件工程課程之難,難於條條大道,且都無形;難於如何讓學生夠得著相應的道;難於如何學生在夠得著一種道的情況下,能舉一反三來悟出其他的道。
軟件工程課程之難