1. 程式人生 > >閱讀和提問作業3 現代軟體工程 習而學的軟體工程教育

閱讀和提問作業3 現代軟體工程 習而學的軟體工程教育

1.方法的好和壞

The rise of worse is better: 作者Richard Gabriel在文章中對比了兩種軟體設計的思想, “the right thing”和“worse-is-better”,前者認為,軟體設計過程中的簡單性、正確性、一致性、完備性等特徵,對於設計者來說同等重要;後者則認為,實現過程的簡單性及效能是設計者唯一需要考慮的東西,正確性、一致性以及完備性都可以因為簡單性而有所犧牲。

Is worse really better:作者認為,“worse-is-better”哲學將會擁有比“the right thing”更強的生命力,其產品更容易被使用者接受並廣泛傳播。

在“詞頻統計”專案中,我們小組在專案過程的開發流程偏向於第一種哲學,每個人在實現專案中的子功能時,都盡力做到介面的一致性,每完成一個小功能都會對其進行單元測試,保證結果的正確性,這樣做的好處是,能有效的減少我們團隊的溝通成本,避免給其他成員帶來不必要的麻煩,而且會讓我們得到很多鍛鍊;壞處則是,有時候為了保證介面的一致性以及功能的完備性,增加很多程式碼,這一方面會對我們程式的效能造成影響,另一方面還讓我們在實現核心功能之外的程式碼上花費了很多時間。我認為,在一些小專案中,尤其是一些看重準確性和完備性的團隊專案中,第一種方法會增加團隊合作的效率,保證專案的穩定持續開發。如果接手的是難度較大的專案,我更傾向於用第二種軟體設計哲學,因為它對我這種經驗不多的開發者更友好,更容易讓我在功能實現中獲得成就感。而且,過於浪費時間在核心功能以外的細枝末節,而不去關注完成的產品是否可以有效抓住使用者的痛點,可能會使我們花費的時間變成無用功。

 

2.軟體工程的方法論到底有多少用處?

Jez Humble: Why Software Development Methodologies Suck

在部落格中作者認為,實際的的軟體專案是複雜的無規律可循的,現有的軟體方法論適用的範圍則極其有限,因此開發者們完全遵照軟體方法論工作也不能保證專案的成功和產品的質量。而且,相對於程式語言和方法論的選擇,開發者的能力是更具決定性的因素,而怎樣衡量開發者的能力是一個難題,招聘好的人才更是一門藝術。那麼怎樣在實踐中提高我們軟體的價值呢,作者提出了兩個重要原則:縮短開發週期和提升反饋效率。

在最近的團隊專案(AI生成對聯小程式)中,我參與了前端小程式的開發工作,工作中的體驗讓我對這篇部落格的觀點深以為然。在小程式的開發中,一開始的demo設計是簡單粗暴的,目的只是為了將後端的工作展示出來,而沒有遵照什麼開發流程。從小程式的第一個版本到基本功能實現的alpha版本,小程式設計中的bug以及使用者體驗問題絕大部分都是在團隊成員試用時發現和提出的。持續的使用者反饋使我們開發和debug的方向更為明確,少了閉門造車時苦思冥想,持續的版本迭代可以在短時間內就讓我們的最終結果符合大家的預期。我覺得這種軟體運作流程的效率和效果要好於每天流於形式的討論和構建。

3. 軟體工程和電腦科學的有區別麼?怎樣才能教好、學好軟體工程?

Is “Computer Science != Software Engineering” an excuse to teach programming poorly?

在這個討論中作者提出了兩個問題,下面的評論都十分精彩,我的答案是這樣的:

1.Is the CS != SE argument a copout or excuse for not properly teaching programming skills.

不,我認為不是CS等同於SE。我認為電腦科學是研究計算的一門學科,他介於數學、物理等自然學科與軟體工程、機械製造等技術學科之間,教會我們怎樣用形式化的語言去建模實際中遇到的各種問題,用數學化的方法簡潔的高效率地為人類解決問題,程式設計是實現模型的手段之一;軟體工程是一門更注重實現具體產品的學科,更注重程式設計的效率和產品的質量,程式設計能力成為衡量軟體工程人員能力的主要標準。因此不應該僅憑程式設計能力的高低來評判CS教育的成敗。我的本科專業是自動化,大學的專業課程裡面也包括控制系統設計、程式設計等課程,但是大四畢業後我並不認為自己可以馬上勝任運維工程師或軟體工程師的工作,但我不認為我在大學期間的學習是有問題的。大學只在培養學生紮實的數理基礎和本專業的理論基礎,編寫程式也不過是計算機專業教學過程中的一小部分。就像自動化不等同於裝置工程師專業一樣,電腦科學也不是軟體工程,這是事實,不是藉口。

2.Regardless of your answer to question 1; if you were in the almighty position of making such a decision: would you force an emphasis on proper teaching of programming in CS courses?
我的答案依然是不。大學應該做的是為學生打好數理基礎,引導學生髮現自己的興趣,並讓學生有能力自我發展、自我提高自己的興趣,不應該特定的培養學生的某方面能力。具體到程式設計上,大學老師起到的也不過是入門的引導作用,程式設計能力的高低絕大部分還是取決於學生的個人努力。而且我覺得討論發起者應該想想應該用什麼樣的標準來衡量一個計算機系的大學生是否合格,我認為如果他可以對問題的概念有清晰的認識,並有初步計算方法建模的能力,他就是合格的。但看起來,發起者更想要一個有著四年開發經驗的軟體工程師,那麼他應該去軟體學院或是人才市場找,因為計算機專業沒有義務也沒有必要培養職業碼農。

在這次的團隊專案中,我參與了前端小程式的實現工作,我以前並沒有過多接觸過這方面的內容。但通過快速學習前端語言以及對問題結構分析,我依然可以在有經驗的隊友的幫助下,完成既定任務。我認為這種學習能力是大學應該培養的,畢竟,大學也不可能把每個領域的程式語言都教一遍。

4.軟體工程≠電腦科學

電腦科學是一門縝密的學科,所有的理論、方法都可以在數學中被證明;而軟體工程則不同,因為有人類活動的參與,所以需要符合人們的需求,需要被人類所理解維護,軟體的設計要考慮科學之外的人文思想。而在學習中,因為軟體工程的大多數概念沒有明確的界定,我們無法單純從概念上對軟體設計的方法論有很好的理解。

通過在ASE課程的學習,我深感實踐才是理解軟體方法論的有效途徑。在實踐中,電腦科學是我們實現設想的手段,良好的溝通能力,與人協作能力以及創意都應該是軟體工程從業者應該具備的素質。

 

 5.是CS 的, 我就要做電腦科學家! 

PhD Grind  

Philip Guo是麻省理工學院的高材生,博士期間就讀於斯坦福大學計算機系,履歷不可謂不輝煌,但即使這樣,他的博士生涯也是四處碰壁,充滿苦澀。這一方面和斯坦福嚴苛的畢業要求息息相關,另一方面則是因為做學術和接受大學教育之間的巨大差距。Philip本科期間就已經有了不錯的研究經歷,而且早早定下了從事學術研究的目標。但博士第一年因為在導師的核心專案中長期從事低智力高體力的程式設計工作,導致他對該領域的科學研究產生了恐懼;後來因為研究興趣不符合主流和導師方向,Philip經歷了頗為苦澀的幾年,一波三折後才順利畢業;但似乎,畢業的時候他也開始對現實妥協,對是否繼續從事科學研究也有了動搖。

Philip的研究經歷給我的感受是這樣的:

  1. 讀博不能只靠理想,我現在對學術研究的認識、對自己的瞭解都還不夠深入,是否要以學術研究作為職業生涯,需要時間和實踐的檢驗;
  2. 做研究不是讀大學,博士期間的課題不再有明確的答案等著你去尋找,在這個時候,要學會做研究的方法,找準自己的研究方向,讓自己不斷有成就感,對衝課題前景的不確定性帶來的恐慌感;
  3. 要有開闊的眼界和廣泛的人脈,閉門造車不會提高自己做研究的水平和研究效率,與優秀的研究者合作、與成功的團隊合作可以讓自己更順利地進入行業的核心,更快更好地做出優秀的工作;
  4. 在MSR期間的經歷對Philip來說彌足珍貴,沒有冗餘的基金申請、教學任務,研究者在氣氛積極、目標明確的環境中更容易沉得下心來做科研;我很慶幸可以在MSRA攻讀博士學位,這裡即講究創新性,又兼顧實用性,是做科研的理想殿堂。

6.習而學的軟體工程教育
   你覺得文中提到的方法有什麼優缺點? 

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

鄒老師以某大學軟體學院本科教學計劃為基礎的修改版,我印象深刻的有:

把 <計算機新技術與產業發展> 放到大一上學期, 並用 <浪潮之巔>, 等反映行業變化, 生動活潑的著作作為教材 (原教學計劃無教材)。  希望能讓大一的同學知道 “學計算機軟體能做什麼?”   “計算機行業是怎樣一個有意思的行業”。

對整個行業的認識我認為應該是每個大學生的第一課。儘早地認識自己的專業,瞭解專業的歷史,可以讓懵懂的高中生迅速成長為電腦科學的探索者,無論是有志於科研的人,或是致力於工程技術的人,或是對這個專業不感興趣的人,都有充足的時間去培養自己的熱情,規劃自己的未來或者是另尋出路。

對學生要有明確的實訓/實習要求, 要到高水平的企業去, 而不是去低水平的企業混日子。 可以在短學期安排, 學生也可以自行安排。

實習可以是為了提高自己的動手能力和工作能力,也可以是看看自己的前輩具體做的工作,在與前輩的交流中,對自己未來的發展規劃都會有更清晰的認識,更有利於規劃自己的大學生活和職業生涯。

要求所有學生在入學時就建立一個自己的專業部落格, 記載自己的作業, 專業上的成長與體會, 畢業找工作時展現這個部落格即可。

很好的思路,記錄下自己成長的歷程,不僅可以督促自己,還可以增加自己的成就感,增加自己的動力。

我認為資訊類學科的工程性比較強,是比較適合習而學的學科,關鍵是要把握好學的進度,避免因基礎知識不牢固而出現空中建樓閣的情況。

 7.UCSD 怎麼教軟體工程

UCSD的教學方法和ASE的頗為類似,都是老師帶領大家迅速地過一遍軟體工程的方法論,然後通過大量的實踐讓學生們在”做中學“。我認為這種學習的方式(或者說氛圍)比較契合大型軟體公司的團隊工作方式,在這種方式下培養出來的學生很容易就會適應公司的運作流程。

另外,文中說到的Facebook等公司對實習生的要求,對網際網路充滿熱情且極其聰明,我也十分認同,通過軟體工程課上的團隊專案,這種特質是很容易被發現或培養的。軟體工程不同於傳統的科目,需要通過大量的、快速的review和meeting來更正自己的方向,反思自己的工作模式。在我們兩次的團隊專案中,及時的溝通和程式碼複審都貫穿始終,很好地幫我認識到了專案運作的流程。