天天看點

軟工實踐總結

一、請回望暑假時的第一次作業,你對于軟體工程課程的想象

1)對比開篇部落格你對課程目标和期待,“希望通過實踐鍛煉,增強計算機專業的能力和就業競争力”,對比目前的所學所練所得,在哪些方面達到了你的期待和目标,哪些方面還存在哪些不足,為什麼?

在當時,我寫下的對待這門課的期待是“與一群隊友共同學習共同進步,共同作出軟體作品,因為‘合作’是目前我的大學前兩年中存在感比較低的詞彙”。

可以說,我找到了一群非常靠譜的隊友,和他們的合作非常令人愉悅,這是非常獨特的體驗。自己在alpha沖刺時擔任了後端組的組長,也是發揮了一定的上司作用,得到了豐富的合作經驗。

在開發上,短時間内熟悉了一個網絡後端架構和後端php語言,可以進行項目的開發。不足就是,時間太緊,在開發工具還需要去學習的情況下,不得不做一些妥協,例如對一些較難的實作算法用較為樸素的實作方法替代,或者砍掉一些複雜的功能。

2)總結這門課程的實踐總結和給你帶來的提升,包括以下内容:

1、統計一下,你在這門軟體工程實踐中,完成了多少行的代碼;

作業 代碼行數(去掉注釋等的估算)
個人項目 500
結對項目 300
團隊結對 200
alpha沖刺 1400
beta沖刺 100
總計 2500

個人和結對項目完成wordcount功能,C++共計約800行,以及python爬蟲100行。團隊程式設計寫了約200行php,alpha沖刺負責了約1400行的後端代碼,beta沖刺時配置設定了許多任務給其他同學,自己負責了較少的部分。

2、軟工實踐的各次作業分别花了多少時間?(做一個清單)

時間花費(min)
第一次作業——準備 180
第二次作業——個人項目 865
第三次作業——結對一(原型設計) 600
第四次作業——團隊展示 60
第五次作業——結對二(實作) 1020
第六次作業——團隊選題報告 280
第七次作業——需求分析報告計 915
根據沖刺時期每日估算後累計約52個小時
alpha事後諸葛亮 245
團隊項目測評部落格 185
根據沖刺時期每日估算後累計約5個小時
beta沖刺答辯總結 120
121.5個小時

3、哪一次作業讓你印象最深刻?為什麼?

無疑是alpha沖刺,因為那時與各位隊友通力合作,共同從0到1建構項目——分析、設計、編碼、測試——這個辛苦的過程是最令人感到難忘的。

4、累計花了多少個小時在軟工實踐上?平均每周花多少個小時?同時貼出開篇部落格“你打算平均每周拿出多少個小時用在這門課上”的回答

累計花了121.5個小時在軟工實踐上。alpha沖刺時兩周花了52個小時占比42%。其餘時間平均一周5小時左右。

當時我的回答是:

(你打算平均每周拿出多少個小時用在這門課上)在回答這個問題時我想引用《黑客與畫家》裡面的一句話:

> 黑客就像畫家,工作起來是有心理周期的。有時候,你有了一個令人興奮的新項目,你會願意為它一天工作16個小時。等過了這一陣,你又會覺得百無聊賴,對所有事情都提不起興趣。

我個人對此深有體會并贊同,如果我在思考一個問題、一個程式,我可能會集中精力很久都不會覺得累,而且好幾天都會持續付出努力,吃飯睡覺時腦子裡都在想,原因隻是因為我想構造出這個程式,或者是我覺得它很有趣。是以我覺得單純用時間來衡量可能不是很有意義的。我會把每項任務都做盡可能好,而且軟工的作業裡經常都有對時間進行記錄的例行公事。

           

我早已經對這種硬核課程的時間花費有了心理準備~~

5、學習和使用的新軟體;6、學習和使用的新工具;

  • 虛拟機:Virtualbox、Vagrant
  • 繪圖:ProcessOn
  • 文檔協作:石墨文檔
  • 原型設計:Axure RP 8
  • 資料庫管理:HeidiSQL、mysql-workbench
  • 測試:OpenCppCoverage、postman、Visual Studio 2017 單元測試
  • 代碼管理:git,用到了很多之前一個人用不到的團隊協作用法

7、學習和掌握的新語言、新平台;

  • 新接觸語言:php
  • 進一步學習C++與python
  • 後端架構:Laravel
  • 雲服務:騰訊雲、putty

8、學習和掌握的新方法;

  • NABCD法需求分析
  • 單元測試的寫法
  • C++爬蟲、regex正規表達式比對
  • UML類圖的制作
  • Axure RP 8 原型設計工具
  • 軟體需求規格說明書的書寫
  • Laravel後端架構
  • 騰訊雲伺服器部署
  • 團隊git的使用
  • MVC模型、RESTful API、json、HTTP協定
  • 一定的資料庫調錯、後端調錯能力、postman使用

9、其他方面的提升。

  • 合作能力獲得極大的提升
  • 懂得如何把控項目進度,懂得了一些軟工中的“神話”(也就是誤區)怎麼去避免

二、寫下屬于自己的人月神話——個人或結對或團隊項目實踐中的經驗總結+執行個體/例證結合的分析

這部分我在beta結束後進行了思考,在這裡引用《人月神話》中的三句話,也是我根據實踐經曆非常有體會的三句話:

缺乏合理的進度安排是造成項目滞後的最主要原因……它反映了一種不真實的假設:一切都将運作良好

一定不要覺得“一切都将運作良好”!除非你以前做過類似的事情,如果你是初學某個架構/語言,一定不能懶、不能嫌麻煩,多投入時間。積極去學習,尋找學長學姐詢問有關經驗,多交流,多動手。

計算機程式設計基于十分容易掌握的媒體,程式設計人員通過純粹的思維活動——概念以及靈活的表現形式來開發程式。……我們期待在實作過程中不會遇到困難,是以造成了樂觀主義的彌漫……而我們的構思是由缺陷的,開發也總會遇到bug的。

團隊在讨論的時候,常常會出現這種情況:“這個功能很簡單的啦,建一張表,有XXX字段,到時候查表就行了”、“這裡我就構造一個json發送給你你到時候接着就行了”或者“我學一下這個就行了”,這其實是一種樂觀主義,我們要避免陷入這種盲目,因為對困難估計不足,容易在遇到困難時手足無措。

人月作為衡量工作的規模是有欺騙性的神話,向進度落後的項目添加人手隻會使進度更加拖延

跟書名同名的經典理論。在團隊實踐中,添加人手所增加的負擔在于教育訓練和互相交流成本,任務不能完全分解給參與人員而不增加他們之間的交流成本。可以得知,教育訓練、互相交流、合理地配置設定任務在軟工中扮演極其重要的位置。

教育訓練成本這一點就要求大家尋找有項目經驗的隊友或者與學習能力較強的人做隊友,學習能力較強的人可以引領大家一起前進。

交流在團隊中是最重要的,如果大家有什麼問題自閉着不說出來,不能互幫互助解決。或者大家在讨論時也不交流想法,碰撞出火花,那麼還不如一個人開發更好。隊内氛圍很重要,如果死氣沉沉,或者一神帶N腿,都不是良性的團隊。

三、對下一屆實踐的建議,或者對于開學初的你,對于大一的你,對于開學初的我,對于同期的TA們,對于後來的學弟學妹:

1)你有什麼想建議、告知和期許想要告訴他們呢?

對于同學:

強烈推薦代碼功底好,自學能力較強的人選擇本課。即是你是0基礎接觸前端、後端方向,到做出一個軟工項目對你來說不是難事。學習能力強的你會成為隊核心心。

以下的情況你可以不選這門課:

  • 怕累,想過輕松的大學生活
  • 不想熬夜,想多一點自由支配的時間
  • 社交恐懼症
  • 動手能力不是很強的
  • 比較内向,不太會交流,遇到困難時不知道如何解決

但如果你想改變上面的某一項,就可以大膽地選課吧!

好好組隊,尋找好隊友。

怎麼選隊友可以參考下我當時的招聘啟事:https://www.cnblogs.com/ZCplayground/p/9623856.html

2)特别地,特别地,下一屆要不要中途換隊員(強制的、徹底的從一隊換到另一隊)?假設依舊是一個90+人數的大班

柯老師我愛您!!!!!!!!!!!!!

今年沒有強制換組!!!!!!!!!!!!!!!

上一年那些老師的說法就是典型就是“我是為了你們好”,把握了話語權,任憑你學生怎麼反對都沒用。

說白了這就是個教學手段吧,要教給我們什麼說實話我們是沒有選擇的權利的。那對于一個教學手段來說,要以有沒有教學效果來作為評估手段。而不是什麼“現實生活中都是這樣”為理由你們就都得這樣強制換組。

現實情況就是,完全沒有任何教學效果,對于運作良好的組,換人就是瞎折騰浪費精力和時間,消磨人的積極性。再怎麼說,這也隻是在學校裡的實踐課吧,項目組運作良好,強行換人有什麼好處?兩組做的東西不同、技術棧不同,換來換去是不是要增加重新學習的成本?換過去的同學如果在原來的組表現就不錯,換過去如果表現平平,不僅學不到什麼東西,而且分數還要受損,公平性呢?

我們這次有換組的情況,情況是那一組項目開展極其不順利,然後那一組解散,幾個同學進入别的組。這種情況我百分百支援。

真的不建議對運作正常的小組進行強行還組!!!!!

3)身在一個格外大的班級,競争強勁,你認為一個組的人數應當在多少比較合适?

正常情況下我個人是覺得5-6人夠了。但今年班上人特别多,是以每個隊的人數都達到了8-11人。

以後選課的人越來越多,我校隻有3個老師教軟工(今年隻有兩個),是以每個班人會很多。老師和助教的精力有限,隊伍的數量不能太多,那麼每個隊的人數就要增加。其實不好。

對于助教想說:以前能請到工業界人士做助教,也算這門課的福利了。培養往屆同學做助教,這個思路沒什麼問題,但本屆助教積極性說實話不高,隻在每次分數釋出時有存在感,助教變成無情的分數釋出機器人,基本無互動。第一次作業,還處在去年暑假假期時,基本上蔡學姐多數都有評論,其餘一學期全部作業兩位助教基本無大範圍評論任何一次的部落格作業,說好的“消滅0回複部落格呢?”

4)個人/結對/團隊作業應該控制在怎樣的規模?

現在這樣就挺好的

5)這學期下來,你最感謝的人是誰?有什麼話想要對TA說呢?

首先一定要感謝鄒老師寫這麼一本有意思的書,構思出這麼有意思的一套教學模式,不然軟體工程又是一門無聊的理論課。您是偉大的教育者。我相信多年後,同學們可能都忘記了其他無聊的課程,但都能記起這次實踐課的細節。

隊友我最感謝王源,真的是很靠譜的一個人,和你一起開發很有意思,遇到困難我們可以一起解決,配置設定給你的任務也能很好的完成,非常讓人放心。少有的體驗。

四、分析一下自己所處的團隊。

軟體工程實踐是大學裡少有的認真的團隊協作經驗。《建構之法》上說團隊的發展有幾個階段,你的團隊都經曆過麼,最後到達了“創造”階段了麼?(參考《建構執法》第17章 人、績效和職業道德)

《建構之法》上說團隊有萌芽/磨合/規範/創造階段,我們都有經曆過:

  • 萌芽階段:大家互相之間不是很熟,每個人技術也不多,還在學習
  • 磨合階段:經曆團隊程式設計,大家逐漸成長,可以産出代碼
  • 規範階段:到alpha中期,團隊就已經較為規範
  • 創造階段:可能有所欠缺,但在beta階段團隊已經井井有條進行增量開發,各司其職,極少被之前遇到的問題難住

五、怎樣證明你學會了軟體工程?

1)研發出符合使用者需求的軟體。必須公開釋出,有實際的使用者,一定的使用者量和持續使用量 (3 天後能保持10 - 100個使用者);而不是: 做沒有使用者使用的軟體

我們的團隊項目“即食”APP沒有釋出到應用商店平台上,但是已經向部分同學開放使用。根據背景資料庫顯示,目前的使用者已經超過了一百人。

軟工實踐總結

2)通過一系列工具,流程,團隊合作,能夠在預計的時間内釋出 “足夠好” 的軟體。有項目規劃/需求/設計/實作/釋出/維護,有定時的進度釋出 ; 而不是: 通過臨時熬夜,胡亂拼湊,大牛一人代勞,延遲傳遞等方式糊弄

在alpha答辯時展示了由我主導的團隊技術筆記、接口文檔整理、團隊git使用,得到了全班同學的一緻好評。

3)并且通過資料展現軟體是可以維護和繼續發展的。而不是 找不到源代碼,代碼無文檔,代碼不能編譯,沒有task/bug 等項目的發展資料

github位址

技術筆記、github合作流、文檔等,都有利于我們軟體的可維護和繼續發展。

随意展示一些:

工作筆記:

軟工實踐總結
軟工實踐總結
軟工實踐總結

技術文檔:

軟工實踐總結
軟工實踐總結
軟工實踐總結

接口文檔:

軟工實踐總結
軟工實踐總結

GitHub使用:

軟工實踐總結

代碼規範:

軟工實踐總結
軟工實踐總結

詳細的commit資訊:

軟工實踐總結

4)對着這個檢查表:http://xinz.cnblogs.com/p/3852177.html 檢查一下,自己如果去企業面試,這些常見的問題是否都能回答,并在此總結。

類别 具體技能和面試問題 回答
語言 最拿手的計算機語言之一,代碼量多少? 最拿手也是用的最多的應該是C/C++ 約3W行
最拿手的計算機語言之二,代碼量多少? php,2000行,這次實踐時使用的web後端語言
軟體實作 你有沒有在别人代碼的基礎上改進 較少
你是怎麼讀懂别人的代碼的 讀源碼+文檔
你采取了什麼方法來保證新功能不會影響原來的功能 我知道要用回歸測試,但我沒有實際做過
你在開發中遇到的最複雜的bug是什麼,你是如何解決的?這個bug出現的原因是什麼,你在将來應該怎麼避免bug再出現? 這一次背景開發時有一次取資料庫中的一個record反複報錯,檢視報錯資訊說“類型不比對”,不是一個很精确的報錯語句。查找資料得知select之後是一個record的集合,需要調用first得到其中的一個。
軟體測試 你如何測試自己寫的代碼 單元測試。以及在寫後端時,現在本地虛拟機測試,本地代碼通過後部署到雲伺服器上使用postman測試,再寫接口文檔聯系前端進行測試
你如何測試别人寫的代碼 沒測試過别人寫的代碼……如果是我的話,先問清楚代碼邏輯和輸入輸出,為他設計測試用例
你掌握了多少種測試工具和方法 OpenCppCoverage、postman、Visual Studio 2017 單元測試
你寫過測試工具嗎 沒有
你如何對一個網站進行壓力測試和效能測試 有專門的壓力測試網絡服務
你如何測試一個軟體的人機界面(UX/UI) 根據規格說明檢視各個功能是否有錯誤,是否有功能缺失,點選互動是否有錯誤回報。
你寫過的最複雜的代碼是什麼 紅黑樹和本學期寫的wordcount比較複雜,其他的都不是太複雜,我也沒有研究過非常難的算法
你是如何測量和改進它的效能的,用了什麼工具,如何分析的 使用visual studio的性能分析工具
項目管理 你參與過項目管理嗎 yes,作為後端leader
軟體設計 你做過構架設計,子產品化設計,接口設計嗎? 做了後端的接口設計
品質意識 你是怎麼做代碼複審的 由于實踐時間很短,學技術+碼代碼就沒什麼精力做複審這種額外工作了。我的做法是把代碼規範約定好并跟隊友強調,然後靠他們的自覺了,實踐證明隊友還是很靠譜的
工具/社群 你在各種開發平台都使用過什麼開發工具 VS
自己寫過什麼工具來改進工作效率 寫過爬蟲,寫過統計代碼行數的程式
給社群貢獻過什麼工具和代碼,github有分享代碼嗎 github常用,但隻要作為個人代碼倉庫和項目展示,未給大型項目貢獻過代碼
你的技術部落格堅持了多久,讀者最多的是哪一篇 從17年1月斷斷續續至今。讀者最多的前三十:mininet安裝、C語言統計代碼行數程式、浮點數的細節
團隊協作 請描述你在項目中如何說服同伴采用你提出的更好的解決方案,或者你如何聽取了别人的一件,改進了自己的方案 開會讨論時各抒己見,最後由leader定奪
你如何說服懶惰的同伴趕緊工作,實作團隊目标 主動詢問他遇到什麼困難。因為很多人都是遇到困難就自閉了,解決了這個困難就可以跟上
理論素養 你上過什麼數學,計算機或其他理論課 微積分線代機率論離散數學,其他理論課不一一列舉了,我覺得最有幫助的是計算理論、計算機網絡、作業系統、資料庫、資料結構與算法、編譯原理
請舉出具體的例子,說明你學到的理論知識如何幫助你解決實際問題 計算理論接觸到的狀态圖、正規表達式幫助我構思wordcount的核心功能。OS\network\database是寫一個安卓APP的後端所必須的知識
自我管理 全年級你專業排名多少? 31/55
你剛入學帶現在的排名有變化嗎? 上升
如何解釋你的排名的變化 我轉了專業

七、個性發揮,包括圖文、照片和創意等

best memory in this semester

軟工實踐總結