2008年12月20日 星期六

C++ 之父 Bjarne Stroustrup 談軟體教育

Bjarne Stroustrup 是當代軟體的大人物之一。身為 C++ 程式語言設計人,他的成就已經
影響了無數的軟體開發專案,包括Google 搜尋引擎、到 iphone 手機

Bjarne Stroustrup 在貝爾實驗室有 24 年的研究員經驗,2002 年獲任德州 A&M
大學的資訊工程學系主任,這些經驗讓他對教育未來的軟體開發員有深度的見解。

在訪談中 Bjarne 也坦誠表示教育界所面對的挑戰與問題,以及相關的改進。談到的問題
包括學生觀察能力不足以深入瞭解,學校教育要如何平衡理論與現實之間的差距,他也
指出業界最常抱怨的是資訊科系學生的能力並不完全合格

他也認為學生在學時將太多重心放在 Java 程式語言上。也許 Java 讓開發員入門學習
更為容易,但問題的癥結點是在寫程式的態度上,而非單純歸咎到程式語言上。學界
正在努力將程式語言課程設計得更完善,來讓學習軟體開發更有實際用處。

就 Bjarne 所知從 Adobe, Apple, AT&T, IBM, Intel, Microsoft, 到不知名的小公司,
幾乎每一家大大小小的軟體公司,或是有使用到軟體的公司都曾經跟他抱怨過缺乏好
的軟體開發員。

可能 C++ 程式語言至今仍是許多公司採用的重要程式語言,許多業界公司人員都會找
Bjarne 討教相關議題,主要的問題不外乎缺乏好的程式框架 framework 、基礎架構配置 infrastructure、以及大型機構普遍都缺乏對能夠駕馭複雜軟體系統的人才。

由於學校教導的重點在於電腦科學而非軟體開發,可能有學習多年程式經驗的學生仍然
會寫出充滿神奇數字( Magic number)的程式碼,造成日後他人/自己閱讀困擾。原因不外
乎程式設計被認為是低階的技術,或是認為學生自己有能力學會

有些研究生對於寫出來的程式碼,完全沒有考慮到日後擴充、維護。學生的學習重點
在於演算法、資料結構、計算機架構、程式語言、作業系統。

Robert Dewar 則是指出公司機構會發出這些抱怨,就是因為他們找到的程式開發員無法
在公司所要求的便宜價格、穩定性、時限內產出所需的程式碼,因此制定出許多防呆
防錯的限制。但也因為這些陳規陋習讓真正有才能的高產出程式設計師無法盡情發揮,
甚至會因此被同化而墮落下去。

Bjarne Stroustrup 在他的新書 Programming - Principles and Practice using C++
(for educators)中指出,教導學生如何寫出一個可供他人接手使用的軟體專案,其中包括
錯誤處理、類別設計、檔案輸出入、畫圖與圖型介面、標準函式庫的容器與演算法。
其中也呈現了基本的物件導向程式設計泛型程式設計。

軟體開發教育的其中一個缺失是,現今有太多現成的工具、軟體可供使用、修改,學生
們缺乏獨立工作思考、並且要習慣不是為了考試成績而學習(但出了社會還是要面對考績)
努力認真的精神、尋找所需資料的能力、學習寫作與口頭表達思考的能力專案導向
的工作是最適當的訓練方式,使用什麼程式語言倒是其次的問題,最好有點難度給與
學生挑戰的機會與成長空間。

給與學生重複訓練的機會相當重要,因為人總是健忘的,特別是結合學過的演算法、
資料結構、計算機架構的理論後,給與學生可以整合這些理論與實際寫出專案程式的
機會是相當重要的。這也是 Bjarne Stroustrup 熱衷的教育方向之一,他認為資訊科學是
相當完美的應用科學,不論偏廢理論或實作都無法成功(這也是現今大家面對的問題)。

Bjarne Stroustup 認為身為一名資訊科學教授,不能只偏重在一種程式語言上,本身也要
熟悉多種程式語言。

除了資訊科學的工程面以外,最終的目標在能夠寫出有品質的程式專案後,還要能追求
軟體藝術層面的提升。但這仍需要有科學的計算模型來評估工程面的實用性,以及藝術
性。

軟體教育不只是熟練程式設計的技巧,需要放更多心力在數學、科學、工程面上。訓練
學生觀察出軟體專案之美的最佳方法,就是給學生們欣賞更多趨近完美的軟體專案成果
。最好是像藝術家、建築師的展覽般,舉辦學生的成果發表會,讓學生們多觀摩何謂美
的軟體專案,這是軟體美學教育的最佳途徑

軟體教育也是需要下苦功的,就像要成為一名稱職的水管工人、你不可能一夜之間成為
一名專業的軟體工程師,做你該做的系統分析、設計,實作並驗證你的設計,反覆的
練習直到這些動作成為你自己的一部份

像 Java 這類滿載許多預製好的函式庫可供使用的程式語言,可以是很便利的工具,但
如果你只知道如何使用這些預設的函式庫並不能讓你學習、成長。Bjarne 認為 C/C++
的記憶體配置觀念仍然是相當重要的。

有人說軟體外包造成資訊科學學生遞減,但也許我們可以說是因為沒有足夠多的好軟體
設計師,導致這些工作外包到海外尋找更多的好工程師。

C++ 的問題之一是標準函式庫並不那麼好用,希望 C++0x 可以解決這個問題。包括
vector 初始化 {} 與 for loop 的 auto range 語法,都是要簡化軟體設計的工作。

Bjarne Stroustrup 認為軟體開發者的偉大之處,在於他的好奇心、創新、韌性、邏輯
推理、能夠溝通進行團隊合作。這應該可以適用在軟體開發以外的領域,另外一項重要
的特質是,不要忘了你的幽默感

Bjarne Stroustrup 給所有軟體設計師的建言:
程式設計只是軟體開發的一部份,不管你的程式寫得多棒,前題都是必須要正確運作
、解決問題,並且能讓別人看得懂,請改善你的溝通技巧,學習傾聽、問正確的問題
、寫作簡明,表達清楚。正式的軟體開發工作是藉由團隊合作完成,請改善你的社交
技巧。埋首在成堆比薩跟可樂的頂尖聰明技客已經無法靠單打獨鬥面對當代軟體開發。

認真完整的學完你的第一個程式設計語言,試著用這個程式語言解決困難的問題,不要
沉迷在奇淫技巧當中,專注在技術跟科學本質上。

學習第二個程式設計語言,最好是跟第一個程式語言不完全類似的語言(interpreter, compiler),只會一種程式語言絕對不足以面對現今多樣化的問題。每個問題都有相對
最適合的程式語言。

不要只會程式設計。軟體是解決問題的工具。將你的軟體技能運用在各種可能的領域
中世紀歷史、汽車引擎設計、火箭科技、血壓分析、圖形影像處理、幾何計算、生物學
塑模等,任何你可能有興趣的領域。就我個人領域來看,這些都是真實可應用的領域。
當然最理想的是你已經有對某個領域抱有相當的興趣,請開始使用程式與軟體解決你所
遇到的問題吧!

相關文章:

程式設計的文藝復興

相關連結:

Bjarne Stroustrup on Educating Software Developers