現代軟體工程 習而學的軟體工程教育
茅於軾先生寫了一篇部落格 ( http://blog.sina.com.cn/s/blog_49a3971d0102dufj.html ) 紀念茅以升先生提出的 習而學的工程教育:
把顛倒了的工程教育順序恢復過來,即他稱之謂“習而學的工程教育”。
以橋樑建築專業為例,大學一年級先學施工條例,二年級則學設計規範。這些學習內容不必解釋條例和規範的理論基礎,只說明其內在的聯絡。到三年級可以學結構力學,四年級則學微積分、線性代數、概率論和普通物理。但橋樑專業的微積分和物理學可以不同於機械系的,它們各有側重點,有各自的例題和習題。學生越是到高年級,越是明白自己在低年級所學的道理,也就明白還有哪些道理至今在科學上還沒有辦法解釋。於是學習成為一個自然的延續過程,成為一種終身的事業:活到老、學到老。
從我個人的學習和教學經歷來看, 我認為給學生具體的, 能實踐的, 能馬上看到因果關係的教材和練習, 是激發學生興趣, 好奇心, 求知慾的好方法。 我就是這樣學習程式設計和軟體開發的 (見下面的註解 三文魚模型)。 所以我對 “習而學”的方法很有好感。軟體工程有理論的部分, 有工程的部分; 有藝術的部分, 有手藝的部分; 在同學們達到理論/藝術的階段之前, 大量的練習是必須的。
大家不妨看看這個陶藝課的故事,把學生分成兩組,一組以出產的陶罐的量來評分,一組不要求數量, 純粹以質評分。一個學期後,真正好的陶藝作品反而是出現在那以量評分的組裡。各種道理值得大家思考。
抽象的理論和推導, 不是不能學, 但是我在學習和教學的過程中, 總是有 “學這些抽象的理論到底是為什麼? ” 的疑問。 有些學生非常喜歡理論, 或者有些學生能克服自己的厭惡情緒, 把理論和推導學好, 記牢, 至少到考試結束前, 像下面這個圖那樣。 這些學生的考試成績很好, 理論基礎也很紮實, 也許能在廣闊的 IT 行業找到自己的發展道路 (希望如此!)。
對於工程類的學科來說, 教導學生理論本身並非終點,引導學生將所學技能自如運用於現實世界才是我們的目標。 那怎麼引導呢? 大學老師們關心此事麼?
最近軟體工程這一門學問在中國提升到了 “一級學科”, 我想起幾年前去某大學開會, 某軟體學院的老教授對大家說, 他一直在忙“一級學科” 的事兒, 大家問此事為何如此重要。 他說, 如果搞到一級學科, 他的博士生們答辯就不用去計算機系, 不用穿別人給的小鞋了! 我當時似懂非懂。 其實這事不光計算機界有,我所尊敬的科學家韋鈺老師在回憶她科研的經歷時說: ...
中國這個問題是很嚴重的。我們建立第一個學科的時候,我遇到了很大的困難。這些困難都不是來自政治界的,而是來自學術界本身,來自學術界某些權威。有位權威就是不同意給我立題和資助,說“你怎麼能研究這個,你怎麼能進到我的領域來” ...
後來看到更多中國高校的情況, 其實大家都在爭一個自己可以佔山為王的地界罷了。 至於科學啊, 培養人才啊, 技術的浪潮啊, 社會的進步啊... 呵呵.
從我有限的瞭解來看, 大學的管理人員比較在乎自己的學校是哪個級別 (某部直屬/211/985/...), 一些大陸的科學家比較在乎自己的學科是局級還是廳級, 我不知道世界級的科學家是否在乎自己的學科是一級、二級、還是三級, 我也有幸和一些世界級的電腦科學家接觸過, 這個話題好像沒人提起過。 作為一個寫軟體為生的工程師, 我倒是想實驗一下, 如果我們用茅以升先生的 “習而學的工程教育”方法來改進軟體學院的教育模式, 會有什麼樣的情況。
我用一箇中國211大學的軟體學院的本科教學計劃為基礎 (此大學以工科見長, 印象中此學校水平應該在中國大陸排十名左右), 做了如下修改:
- 把基礎實踐課放到大一, 一開始就要動手.
- 所有的課程的上機時間都加倍, 相應減少授課時間。老師在講臺上反覆講 “陣列從0開始…”,不如在電腦上試試。
- 把 <計算機新技術與產業發展> 放到大一上學期, 並用 <浪潮之巔>, 等反映行業變化, 生動活潑的著作作為教材 (原教學計劃無教材)。 希望能讓大一的同學知道 “學計算機軟體能做什麼?” “計算機行業是怎樣一個有意思的行業”。
- 把基本的測試技術作為 “軟體測試技術入門”, 放到大一。 其餘的部分作為 <高階軟體測試技術>
- 針對軟體工程的畢業生職業發展, 調整了兩門課程的 必修/選修性質。 (例如: 把 <形式化方法> 變為選修課, 把軟體專案管理, 人機互動技術變成必修課 )
- 大部分數學和物理課都推遲一到兩個學年上課, 這樣到了大三同學們可以根據實踐的體會, 更好地學習。 另外有同學在大三時決定考研, 他們正好可以好好學習高等代數, 爭取考個好分數。如果是大一就學了, 那大四都忘了, 還要從頭學一遍, 浪費時間。 離散數學對於計算機軟體專業的學習還是很有用的, 仍然保持在第一學期。
- 專業選修課放到大二下學期 - 大四上學期。
- 在軟體工程課中, 強調團隊合作 (見講義) , 在其它程式語言課程中適當引入結對程式設計, 程式碼複審等方法。 [注4]
- 對學生學習程式語言有明確程式碼量的要求. (每種語言 3000 行以上. 程式行數不包括空行, 註釋行, 單字元行)。
- 對學生要有明確的實訓/實習要求, 要到高水平的企業去, 而不是去低水平的企業混日子。 可以在短學期安排, 學生也可以自行安排。 [注3]
- 爭取所有學生能用主流程式設計語言 (C, C++, Java, C#, 網頁前端語言 JS, php, 基本資料庫, 基本檔案系統) 寫實用的軟體。
- 要求所有學生在入學時就建立一個自己的專業部落格, 記載自己的作業, 專業上的成長與體會, 畢業找工作時展現這個部落格即可。
- 教學資源的建設, 老師和學生一起, 持續地把關於這門課的課件/資料/問答 都彙集起來形成結構化的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:
大馬哈魚洄游模型, 三文魚模型 見部落格:
注3:
有些人也許覺得這種方式太創新了, 其實加拿大的 滑鐵盧大學 計算機系 早就在做類似的事情, 甚至更工業化, 更系統化。 他們計算機系的學生本科就是一年有三個學期, 一個學期 (4 個月) 的課程學習, 然後接著一個學期的工作 (Co-op, internship, 實習生), 我的一個同事就是這樣完成本科教育 - 上了8個學期的課, 穿插了6 個學期的實習生工作。 官方介紹:
注4:
我們都知道要練習, 但是怎麼練習? 這裡有探討: http://www.douban.com/note/260623954/
引文: 學習科學大量研究表明,成人的最佳學習方式並非獨自練習,而是在情境中學習。有效學習是進入相關情景,找到自己的【學習共同體】,然後學習者剛開始圍繞重要成員轉,做一些外圍的工作,隨著技能增長,進入學習共同體圈子的核心,逐步做更重要的工作,最終成為專家。
這就是學習科學日益主流的觀念:從【情景學習】出發,當一名【認知學徒】,它的要點有:
* 找到學習共同體:因為大量知識存在於學習共同體的實踐中,不是書本中,所以有效的學習不是關門苦練,而是找到屬於自己的學習小團體。如程式設計師在類似於github這樣的網站練習程式設計。
* 隱性知識顯性化:隱性知識是使人們有能力利用概念、事實以及程式來解決現實問題的知識。
* 模仿榜樣:榜樣可以是現實生活中的導師,也可以是網上的導師;
* 培養多樣性:在多種情境中實踐,以此強調學習廣闊的應用範圍。如裁縫出師並不是已經練習了一萬小時,而是能夠縫製出足夠好的,各種各樣的衣服。
相關文章
- 軟體工程學習軟體工程
- 構建之法——現代軟體工程軟體工程
- 學習高校課程-軟體工程-軟體工程(ch2)軟體工程
- 軟體工程-軟體工程層狀模型(EHM)軟體工程模型
- 軟體工程 第一章 軟體與軟體工程軟體工程
- 軟體工程練習題軟體工程
- 軟體工程 .軟體工程
- 軟體工程軟體工程
- 《構建之法——現代軟體工程》讀後感軟體工程
- 軟體工程——軟體測試軟體工程
- 軟體工程——軟體計劃軟體工程
- 軟體工程博士講師:軟體工程是一個學習過程,程式碼只是學習的副產品軟體工程
- 軟體、軟體危機、軟體工程 (轉)軟體工程
- 軟體工程的理解軟體工程
- 軟體工程每週學習進度條軟體工程
- 作業8: 軟體工程學習總結軟體工程
- 軟體工程實踐----初步接觸軟體工程的總結軟體工程
- 軟體工程—GitHub軟體工程Github
- 軟體工程1軟體工程
- 軟體工程4.21軟體工程
- 軟體工程5.7軟體工程
- 軟體工程4.28軟體工程
- 軟體工程5.9軟體工程
- 軟體工程5.8軟體工程
- 軟體工程4.27軟體工程
- 軟體工程5.13軟體工程
- 軟體工程6軟體工程
- 軟體工程學習後的一些體會--------兩週軟體工程
- 一個軟體測試工程師的學習體驗工程師
- [軟體工程]軟體中的量化問題軟體工程
- 開源軟體的教育是一個系統工程
- 現代軟體工程 團隊作業 - 軟體分析和使用者需求調查軟體工程
- 讀《現代軟體工程——構建之法》第8~10章軟體工程
- 開學至今對軟體工程的感悟軟體工程
- 軟體工程的變遷軟體工程
- 軟體工程的認識軟體工程
- 軟體工程的認知軟體工程
- 一位學軟體工程的學生對軟體行業的困惑軟體工程行業