現代軟體工程 習而學的軟體工程教育

SoftwareTeacher發表於2014-05-14

茅於軾先生寫了一篇部落格 ( http://blog.sina.com.cn/s/blog_49a3971d0102dufj.html ) 紀念茅以升先生提出的 習而學的工程教育:

把顛倒了的工程教育順序恢復過來,即他稱之謂“習而學的工程教育”。

以橋樑建築專業為例,大學一年級先學施工條例,二年級則學設計規範。這些學習內容不必解釋條例和規範的理論基礎,只說明其內在的聯絡。到三年級可以學結構力學,四年級則學微積分、線性代數、概率論和普通物理。但橋樑專業的微積分和物理學可以不同於機械系的,它們各有側重點,有各自的例題和習題。學生越是到高年級,越是明白自己在低年級所學的道理,也就明白還有哪些道理至今在科學上還沒有辦法解釋。於是學習成為一個自然的延續過程,成為一種終身的事業:活到老、學到老。

從我個人的學習和教學經歷來看, 我認為給學生具體的, 能實踐的, 能馬上看到因果關係的教材和練習, 是激發學生興趣, 好奇心, 求知慾的好方法。 我就是這樣學習程式設計和軟體開發的 (見下面的註解 三文魚模型)。  所以我對 “習而學”的方法很有好感。軟體工程有理論的部分, 有工程的部分; 有藝術的部分, 有手藝的部分; 在同學們達到理論/藝術的階段之前, 大量的練習是必須的。

大家不妨看看這個陶藝課的故事,把學生分成兩組,一組以出產的陶罐的量來評分,一組不要求數量, 純粹以質評分。一個學期後,真正好的陶藝作品反而是出現在那以量評分的組裡。各種道理值得大家思考。

抽象的理論和推導, 不是不能學, 但是我在學習和教學的過程中, 總是有 “學這些抽象的理論到底是為什麼? ” 的疑問。 有些學生非常喜歡理論, 或者有些學生能克服自己的厭惡情緒, 把理論和推導學好, 記牢, 至少到考試結束前,  像下面這個圖那樣。 這些學生的考試成績很好, 理論基礎也很紮實, 也許能在廣闊的 IT 行業找到自己的發展道路 (希望如此!)。

image

對於工程類的學科來說, 教導學生理論本身並非終點,引導學生將所學技能自如運用於現實世界才是我們的目標。 那怎麼引導呢? 大學老師們關心此事麼? 

 

最近軟體工程這一門學問在中國提升到了 “一級學科”, 我想起幾年前去某大學開會, 某軟體學院的老教授對大家說, 他一直在忙“一級學科” 的事兒, 大家問此事為何如此重要。 他說, 如果搞到一級學科, 他的博士生們答辯就不用去計算機系, 不用穿別人給的小鞋了!  我當時似懂非懂。 其實這事不光計算機界有,我所尊敬的科學家韋鈺老師在回憶她科研的經歷時說: ...

中國這個問題是很嚴重的。我們建立第一個學科的時候,我遇到了很大的困難。這些困難都不是來自政治界的,而是來自學術界本身,來自學術界某些權威。有位權威就是不同意給我立題和資助,說“你怎麼能研究這個,你怎麼能進到我的領域來” ...

 

後來看到更多中國高校的情況, 其實大家都在爭一個自己可以佔山為王的地界罷了。 至於科學啊, 培養人才啊, 技術的浪潮啊, 社會的進步啊... 呵呵. 

從我有限的瞭解來看, 大學的管理人員比較在乎自己的學校是哪個級別 (某部直屬/211/985/...),  一些大陸的科學家比較在乎自己的學科是局級還是廳級,  我不知道世界級的科學家是否在乎自己的學科是一級、二級、還是三級, 我也有幸和一些世界級的電腦科學家接觸過, 這個話題好像沒人提起過。 作為一個寫軟體為生的工程師, 我倒是想實驗一下, 如果我們用茅以升先生的 “習而學的工程教育”方法來改進軟體學院的教育模式, 會有什麼樣的情況。

 

我用一箇中國211大學的軟體學院的本科教學計劃為基礎 (此大學以工科見長, 印象中此學校水平應該在中國大陸排十名左右), 做了如下修改:

 

  1. 把基礎實踐課放到大一, 一開始就要動手.
  2. 所有的課程的上機時間都加倍, 相應減少授課時間。老師在講臺上反覆講 “陣列從0開始…”,不如在電腦上試試。 
  3. 把 <計算機新技術與產業發展> 放到大一上學期, 並用 <浪潮之巔>, 等反映行業變化, 生動活潑的著作作為教材 (原教學計劃無教材)。  希望能讓大一的同學知道 “學計算機軟體能做什麼?”   “計算機行業是怎樣一個有意思的行業”。
  4. 把基本的測試技術作為 “軟體測試技術入門”,  放到大一。 其餘的部分作為 <高階軟體測試技術>
  5. 針對軟體工程的畢業生職業發展, 調整了兩門課程的 必修/選修性質。 (例如: 把 <形式化方法> 變為選修課, 把軟體專案管理, 人機互動技術變成必修課 )
  6. 大部分數學和物理課都推遲一到兩個學年上課,  這樣到了大三同學們可以根據實踐的體會, 更好地學習。  另外有同學在大三時決定考研, 他們正好可以好好學習高等代數, 爭取考個好分數。如果是大一就學了, 那大四都忘了, 還要從頭學一遍, 浪費時間。 離散數學對於計算機軟體專業的學習還是很有用的, 仍然保持在第一學期。
  7. 專業選修課放到大二下學期 - 大四上學期。
  8. 在軟體工程課中, 強調團隊合作 (見講義) , 在其它程式語言課程中適當引入結對程式設計, 程式碼複審等方法。 [注4]
  9. 對學生學習程式語言有明確程式碼量的要求.  (每種語言 3000 行以上.  程式行數不包括空行, 註釋行, 單字元行)。
  10. 對學生要有明確的實訓/實習要求, 要到高水平的企業去, 而不是去低水平的企業混日子。 可以在短學期安排, 學生也可以自行安排。 [注3]
  11. 爭取所有學生能用主流程式設計語言 (C, C++, Java, C#, 網頁前端語言 JS, php, 基本資料庫, 基本檔案系統) 寫實用的軟體。
  12. 要求所有學生在入學時就建立一個自己的專業部落格, 記載自己的作業, 專業上的成長與體會, 畢業找工作時展現這個部落格即可。 
  13. 教學資源的建設, 老師和學生一起, 持續地把關於這門課的課件/資料/問答 都彙集起來形成結構化的wiki.

 

表一是所有專業必修課的安排:

軟體工程 習而學的教學計劃 各學期周學時分配
一年級 二年級 三年級 四年級
類別 名稱 學分 總學時 授課 實驗 上機 實踐 學期安排
計算機導論 1.5 24 18   6   1 1.5                    
資料結構 (C 語言) 4 64 48   16   1 4                    
計算機新技術與產業發展 1 16 16       1 1                    
數字邏輯 2 40 24 16     1 2                    
C/C++ 程式設計 3.5 64 48   16   2   4                  
組合語言程式設計 2 32 16   16   2   2                  
軟體測試技術入門 1 16 8   8   2   1                  
限選 Java語言程式設計 2 32 16   16   2   2                  
C++ 高階程式設計 3 56 40   16   3       3              
計算機組成原理 4 64 52 12     3       4              
限選 C# 與 .Net框架基礎 2 32 16   16   3       2              
限選 Web 前端技術開發 3 48 24   24   4         3            
作業系統實踐 (基於 Linux) 2 32 16   16   4         2            
限選 人機互動技術 2 32 16   16   4         2            
高階軟體測試技術 2 32 16   16   4         2            
限選 移動平臺應用開發 2 32 16   16   5             2        
資料庫原理及應用 3 48 32   16   5             3        
計算機網路 3 48 32   16   5             3        
限選 演算法分析 2 32 24   8   6               2      
軟體工程 4 64 32   32   6               4      
資訊保安技術 2 32 24   8   6               2      
作業系統原理 3 48 40   8   7                   3  
編譯原理 3 56 40   16   7                   3  
軟體專案管理 2 32 24   8   7                   2  
畢業設計(論文或實際專案) 12 16周         8                     12

限選意味著學生必須在幾門課中選擇。

 

表二是專業選修課的安排 (課程是學校提供的):

  課程 學分 總學時 授課 實驗 上機 實踐 學期
科技英語(英)A 1.5 24 16     8 4
計算機軟體日語基礎 2 32 32       4
嵌入式程式設計 2 32 24   8   4
人工智慧 2 32 24   8   5
計算機視覺 2 32 24  

8

  5
影象處理  2 32 24   8   5
科技英語(英)B 2 32 16     16 5
資料倉儲與資料探勘 2 32 24   8   6
虛擬化技術與雲端計算  1.5 32 16   16   6
地理資訊系統導論 2 32 24   8   6
系統模擬與虛擬現實 2 32 24   8   6
形式化方法 2.5 40 40       7
計算機圖形技術 2 32 24   8   7
平行計算 2 32 24   8   7

科技英語也要增加實踐的內容, 學生為什麼不能用學到的科技英語讀論文,寫摘要, 做翻譯, 寫部落格, 做英語課件?

 

表三是數學物理課程的安排:

軟體工程 習而學 教學安排 (數學物理) 各學期周學時分配
一年級 二年級 三年級 四年級
類別 名稱 學分 總學時 授課 實驗 上機 實踐 學期安排
高等數學2A 5 80 80         2 3                  
高等數學2B 6 96 96                     3 3      
線性代數及其應用 3.5 56 56                           3.5  
離散數學導論1 3 48 48         3                    
概率論與數理統計1 3 48 48                       3      
大學物理2A-B 7 112 112                 4   3        
物理實驗A 1 27 3 24                   1        
物理實驗B 1 27   27                     1      

 

 

不應該忽略的還有必須學習的各種政治思想課:

課程性質 課程名稱 課程編號 學分 總學時 授課學時 實驗學時 上機學時 實踐學時 各學期周學時分配
第一學年 第二學年 第三學年 第四學年
1 2 1 2 1 2 1 2
  16 352 311     41                      
思想道德修養與法律基礎 5100055 3 48 48       3                    
中國近現代史綱要 2111139 2 32 30     2   2                  
馬克思主義基本原理 2111140 3 48 48             3              
毛.澤.東思想、鄧.小.平理論與“三個代表”重要思想概論 2111141 6 96 57     39               3      
形勢與政策教育 5100045-52 2 128 128       0.5 0.5   0.5 0.5            

 

我對於政治思想課是外行, 唯一的建議是:  在上 <三個代表> 課程的時候, 要求學生針對校內的 IT 系統, 採訪群眾, 搞清楚下面的問題:

我校的資訊服務系統是否代表了先進生產力的發展要求?

是否代表先進文化的前進方向?

是否代表我校廣大師生的根本利益?

具體表現在哪裡?

然後發表部落格。

 

------------------------------------------------

注1:

“Learning by Doing” :

     我以前接觸過韋鈺老師的 “做中學”/ “Learning by Doing” 理念, 雖然它強調的是兒童和少年時期的學習, 但是我想這種方法對於任何年齡的人都適用。

 

注2:

大馬哈魚洄游模型, 三文魚模型 見部落格:

http://www.cnblogs.com/xinz/archive/2011/12/03/2274445.html 

 

注3:

有些人也許覺得這種方式太創新了,  其實加拿大的 滑鐵盧大學 計算機系 早就在做類似的事情, 甚至更工業化, 更系統化。 他們計算機系的學生本科就是一年有三個學期,  一個學期 (4 個月) 的課程學習, 然後接著一個學期的工作 (Co-op, internship, 實習生),  我的一個同事就是這樣完成本科教育 -  上了8個學期的課, 穿插了6 個學期的實習生工作。 官方介紹:

http://cecs.uwaterloo.ca/about/

 

注4:

我們都知道要練習,  但是怎麼練習?  這裡有探討:  http://www.douban.com/note/260623954/ 

引文: 學習科學大量研究表明,成人的最佳學習方式並非獨自練習,而是在情境中學習。有效學習是進入相關情景,找到自己的【學習共同體】,然後學習者剛開始圍繞重要成員轉,做一些外圍的工作,隨著技能增長,進入學習共同體圈子的核心,逐步做更重要的工作,最終成為專家。

這就是學習科學日益主流的觀念:從【情景學習】出發,當一名【認知學徒】,它的要點有:

* 找到學習共同體:因為大量知識存在於學習共同體的實踐中,不是書本中,所以有效的學習不是關門苦練,而是找到屬於自己的學習小團體。如程式設計師在類似於github這樣的網站練習程式設計。
* 隱性知識顯性化:隱性知識是使人們有能力利用概念、事實以及程式來解決現實問題的知識。
* 模仿榜樣:榜樣可以是現實生活中的導師,也可以是網上的導師;
* 培養多樣性:在多種情境中實踐,以此強調學習廣闊的應用範圍。如裁縫出師並不是已經練習了一萬小時,而是能夠縫製出足夠好的,各種各樣的衣服。

相關文章