一、關于Alpha階段的個人總結
我們團隊做的項目是部落格資料采集,在項目的Alpha階段,我們團隊完成所有預期的基本功能任務(包括前端界面,後端資料互動子產品,資料采集分析,資料展示等),我主要負責後端資料功能子產品,在過程中,也遇到了一些困難,很多東西都是接觸以後才開始學習,慢慢地摸索前進,而且很多時候在隊友的幫助下,一起查閱資料并讨論,最後完美地解決了問題。特别感謝我們的隊長張家豪同學,他不僅作業能力強,而且每次都很有耐心地指導我們,是以我們團隊項目才得以順利進展,我覺得自己也學習掌握的不少新東西。
二、提出問題(關于軟體工程)
1、書中第1章1.2.4中提到“是否是Bug,取決于使用者和開發者的不同角度。很多人認為有Bug就是品質不合格,沒有Bug就是品質完美,其實這也未必。”這段話讓我對Bug的概念認識不清了,難道Bug不是做項目開發過程中的錯誤和沒有實作不了預期功能,也就是品質不合格嗎?
2、書中第4章4.6.1中關于兩人的合作——如何影響對方中提到“一個成熟的工程師要琢磨對方的話語和觀察對方的肢體語言,了解它們所表達的潛台詞”。我認為肢體語言表達的是一個人的情緒問題,而我們在合作過程中注重的應該是程式所展現的問題,為什麼要花時間去琢磨對方的肢體語言呢?
3、書中第5章的5.2.9中的功能團隊模式中提到的“feature crew”,即無上司的團隊,書中還說到大型軟體公司裡面的不少團隊都是采用這種模式。我想問無上司團隊不會造成組員對任務懈怠的情況嗎?
4、書中第7章7.5.4中提到精簡過直程,直奔主題,不必額外去為了文一些檔而再寫一些東西。我不認同這種說法,我認為在寫總結的過程能發現自己的問題并進步。
5、書中第9章9.5中提到在校學生如何成為PM做準備,“你覺得你的長處不在于寫代碼和debug,而是協調、溝通,讓一個團隊或組織有效運轉起來,.......那麼我看好你的PM潛質”。PM最重要的到底是溝通和管理能力還是專業能力呢?
三、自我評價
1.保持高标準,不要受制于破窗理論(broken windows theory)[i]。
當你看到不靠譜的設計、糟糕的代碼、過時的文檔和測試用例的時候,不要想 “既然别人的代碼已經這樣了,我的代碼也可以随便一點啦。”
a) 從來沒聽說過; b) 我就是這樣随便過來的; c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
2. 主動解決問題。當看到不靠譜的設計,糟糕的代碼的時候,不要想“可能别人會來管這個事情” ,或者“我下個月發一個郵件讓大家讨論一下”。要主動地把問題給解決了[ii]。
a) 不懂啥是靠譜的設計; b) 随便應付一下即可; c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
3. 經常給自己充電,身體訓練是運動員生活的一部分,學習是軟體工程師職業的伴侶。每半年就要了解和學習一些新的相關技術。通過定期分享(面對面的分享,寫技術部落格等)來確定自己真正掌握了新技術。
a) 從來不看書; b) 看了就忘; c) 有時分享。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
4. DRY (Don't Repeat Yourself)——别重複。在一個系統中,每一個知識點都應該有一個無異議的、正規的表現形式。
a) 從來沒聽說過; b) 聽說過,但是認為意思不大; c) 這要講場合。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
5. 消除不相關子產品之間的影響,在設計子產品的時候,要讓它們目标明确并單一,能獨立存在,沒有不明确的外部依賴。
a) 從來沒聽說過; b) 出了問題再說吧; c) 想做,但是不知道怎麼衡量效果。 d) 能夠在多種語言和架構中做到 e) 不但主動做, 還會影響同僚一起做好
6. 通過快速原型來學習,快速原型的目的是學習,它的價值不在于代碼,而在于你通過快速原型學到了什麼。
a) 從來沒聽說過; b) 把原型直接用于産品,不然就浪費了; c) 不用原型,一直在産品中直接改。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
7. 設計要接近問題領域,在設計的時候,要接近你目标使用者的語言和環境。
a) 從來沒聽說過; b) 按我的想法設計,使用者以後會适應的; c) 大概同意,但是怎麼接近使用者呢? d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
8. 估計任務所花費的時間,避免意外。在開始工作的時候,要做出時間和潛在影響的估計,并通告相關人士,避免最後關頭意外發生。工作中要告知可能的時間變化,事後要總結。
a) 做完了,就知道花費了,不用事先估計; b) 大概估一下,不必在意時間 c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
9. 圖形界面的工具有它的長處,但是不要忘了指令行工具也可以發揮很高的效率,特别是可以用腳本建構各種組合指令的時候。
a) 一直用滑鼠和GUI; b) 到時候問牛人; c) 正在學習指令行工具。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
10. 有很多代碼編輯器,請把其中一個用得非常熟練。讓編輯器可以實作自己的定制,可以用腳本驅動,用起來得心應手。
a) 隻用老師教的一個; b) 随意; c) 沒有任何定制。 d) 會定制,并且分享給其他人 e) 還會學習和使用各種編輯器的擴充。
11. 了解常用的設計模式,并知道擇機而用。設計模式不錯,更重要的是知道它的目的是什麼,什麼時候用,什麼時候不用。
a) 從來沒聽說過; b) 模式沒用; c) 每寫100行程式,我就盡量用一個模式。 d)有實際使用的經驗 e) 能用具體代碼說明模式的利弊
12. 代碼版本管理工具是你代碼的保障,重要的代碼一定要有代碼版本管理。
a) 從來沒聽說過; b) 用QQ,u盤即可; c) 上司要求才用。 d) 經常用 e) 不但主動做, 還會影響同僚一起做好
13. 在debug的時候,不要驚慌,想想導緻問題的原因可能在哪裡。一步一步地找到原因。要在實踐中運用工具,善于分析日志(log),從中找到bug。同時,在自己的代碼裡面加 log.
a) 從來沒聽說過; b) 隻會printf; c) 加log 太麻煩,我的代碼不會有bug 的。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
14. 重要的接口要用形式化的“合同”來規定。用文檔和斷言、自動化測試等工具來保證代碼的确按照合同來做事,不多也不少。使用斷言 (assertion) 或者其他技術來驗證代碼中的假設,你認為不可能發生的事情在現實世界中往往會發生。
a) 從來沒聽說過; b) 太麻煩,不用; c) 想用,但沒有時間。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
15. 隻在異常的情況下才使用異常 (Exception), 不加判斷地過多使用異常,會降低代碼的效率和可維護性。記住不要用異常來傳遞正常的資訊。
a) 從來沒聽說過; b) 抓住所有異常 c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
16. 善始善終。如果某個函數申請了空間或其他資源,這個函數負責釋放這些資源。
a) 從來沒聽說過; b) 随緣; c) 有時這樣做。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
17. 當你的軟體有多種技術結合在一起的時候,要采用松耦合的配置模式,而不是要把所有代碼都混到一起。
a) 從來沒聽說過; b) 沒有實踐的機會; c) 代碼都在一起比較好管理。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
18. 把常用子產品的功能打造成獨立的服務,通過良好的界面 (API) 來調用不同的服務。
a) 從來沒聽說過; b) 拷貝代碼過來用也可以 c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
19. 在設計中考慮對并行的支援,這樣你的API 設計會比較容易擴充。
a) 從來沒聽說過; b) 并行不會出錯的; c) 任何代碼都應支援并行。 d) 考慮在适當的層次支援并行 e) 不但主動做, 還會影響同僚一起做好
20. 在設計中把展現子產品 (View) 和實體子產品 (Model) 分開,這樣你的設計會更有靈活性。
a) 代碼都在一起比較好改; b) 随緣啦; c) 沒搞清楚啥是V,啥是M。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
21. 重視算法的效率,在開始寫之前就要估計好算法的效率是哪一個數量級上的(big-O)。
a) 從來沒聽說過; b) 我的資料量不大,無所謂; c) 不會有效率問題的,現在CPU 都快了。 d) 主動測試程式效率,以驗證估算 e) 不但主動做, 還會影響同僚一起做好
22. 在實際的運作場景中測試你的算法,不要停留在數學分析層面。有時候一個小小的實際因素 (是否支援大小寫敏感的排序,資料是否支援多語言)會導緻算法效率的巨大變化。
a) 從來沒聽說過; b) 想用,但不知道工具 c) 主要靠肉眼觀察算法效率。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
23. 經常重構代碼,同時注意要解決問題的根源。
a) 從來沒聽說過; b) 任何修改都可以叫重構; c) 每天應該重構兩次。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
24. 在開始設計的時候就要考慮如何測試 ,如果代碼出了問題,有log 來輔助debug 麼? 盡早測試,經常測試,争取實作自動化測試,争取每一個建構的版本都能有某些自動測試。
a) 從來沒聽說過; b) 我的代碼不會出問題的; c) 項目沒有安排時間,我也沒有提這事。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
25. 代碼生成工具可以生成一堆一堆的代碼,在正式使用它們之前,要確定你能了解它們,并且必要的時候能debug 這些代碼。
a) 從來沒聽說過; b) 從來不看那些代碼; c) 那些代碼沒有bug。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
26. 和一個實際的使用者一起使用軟體,獲得第一手回報。
a) 從來沒聽說過; b) 使用者太蠢,不值得聽回報; c) 想做但是沒有機會。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
27. 在自動測試的時候,要有意引地入bug,來保證自動測試的确能捕獲這些錯誤。
a) 沒聽說過; b) 不必這麼麻煩; c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
28. 如果測試沒有做完,那麼開發也沒有做完。
a) 從來沒聽說過; b) 簽入代碼,就是做完了; c) 。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
29. 适當地追求代碼覆寫率:每一行的代碼都覆寫了,但是程式未必正确。要確定程式覆寫了不同的程式狀态和各種組合條件。
a) 從來沒聽說過; b) 覆寫20% 就好了; c) 要覆寫至少60%。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
30. 如果團隊成員碰到了一個有普遍意義的bug, 應該建立一個測試用例抓住以後将會出現的類似的bug。
a) 從來沒聽說過; b) 每個bug都是特殊的; c) 測試用例不值得加 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
31. 測試:多走一步,多考慮一層。如果程式運作了一星期不退出,如果使用者的螢幕分辨率再提高一個檔次,這個程式會出什麼可能的錯誤?
a) 從來沒聽說過; b) 如果有問題,使用者會報告的,我們不用測這些; c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
32. (帶領團隊)了解使用者的期望值,稍稍超出使用者的期望值,讓使用者有驚喜。
a) 從來沒聽說過; b) 我們決定使用者的期望; c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
33. (帶領團隊) 不要停留在被動地收集需求,要挖掘需求。真正的需求可能被過時的假設、對使用者的誤解或其他因素所遮擋。
a) 從來沒聽說過; b) 使用者不說的,我們不做; c) 如果有明确要求,我可以做好。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
34. (帶領團隊)把所有的術語和項目相關的名詞、縮寫等都放在一個地方。
a) 從來沒聽說過; b) 都記在我腦子裡; c) 大家看代碼就好 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
35. (帶領團隊)不要依賴于某個人的手動操作,而是要把這些操作都做成有相關權限的人士都能運作的腳本。這樣就不會出現因為某人休假而項目被卡住的情況。
a) 從來沒聽說過; b) 我們沒有休假的,沒關系; c) 出了問題再說 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
36. (帶領團隊)要讓重用變得更容易。一個軟體團隊要創造一種環境,讓大家有輕松的心态來嘗試各種想法 (例如,子產品的重用,效能的提升,等)。
a) 都聽上司的; b) 團隊嚴肅緊張最好; c) 不必嘗試,失敗的可能性太大。 d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好
37. (帶領團隊)在每一次疊代之後,都要總結經驗,讓下一次疊代的進度安排更可靠,品質更高。
a) 沒有時間總結,直接做下一版; b) 總結用處不大; c) 如果上級有要求,就做一下; d) 一直主動這樣做 e) 不但主動做, 還會影響同僚一起做好