一、請回望暑假時的第一次作業,你對於軟件工程課程的想象
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 |
alpha沖刺 | 根據沖刺時期每日估算后累計約52個小時 |
alpha事后諸葛亮 | 245 |
團隊項目測評博客 | 185 |
beta沖刺 | 根據沖刺時期每日估算后累計約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使用:
代碼規范:
詳細的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