2017-2018-1 學習總結目錄: 1 2 3 5 6 7 9 10 11 12
html
- 0. 本週學習內容總結
- 0.1 Comparable接口與Comparator接口的使用
- 0.2 泛型方法設計
- 0.3 團隊學習:《構建之法》 ★
- 1. 本週學習中的問題和解決過程
- 1.1 指數階複雜度的計算
- 1.2 線性語句序列
- 2. 代碼調試中的問題和解決過程
- 2.1 根據程序語句分析頻度
- 2.2 遞歸測試拋出異常StackOverflowError
if (obj1.compareTo(obj2) < 0) System.out.println("obj1 is less than obj2");
API中介紹到:java
Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.git
若是obj1小於obj2,則返回負整數,相等返回零,其他返回正整數。在 String 類中 compareTo 方法也是如此,由於 String 類實現了 Comparable 接口。
Comparator 接口:強行對某些數組或集合進行排序,在一個獨立的類中實現比較。算法
Comparator接口與Comparable接口的區別:首先,存在於不一樣的包中,Comparator 位於 java.util 包下,Comparable 位於 java.lang 包下。其次,前者在一個獨立的類中實現比較(其他類結構不變),然後者將比較代碼嵌入自身類中。兩種接口各有千秋,只有多練習才能體會到其優點。數據庫
泛型:具備一個或多個類型變量的類。一個類保存、操做並管理直到實例化時才肯定類型的對象,尖括號內指定元素對象的類型。
例如:構造一個保存 Employee 對象的數組列表:
ArrayList<Employee> staff = new ArrayList<Employee>();
兩邊都使用類型參數 Employee 有些繁瑣。在Java SE 7 中,能夠省去右邊的類型參數:
ArrayList<Employee> staff = new ArrayList<>();
這樣,new ArrayList<>()
便賦值給一個類型爲ArrayList<Employee>
的變量了,這就是所謂的 菱形語法 。編程
泛型方法:泛型方法能夠定義在普通類中,也能夠定義在泛型類中。數組
合做分工
→ 大體內容框架
→ 提出問題
安全
Members | Chapters |
---|---|
袁逸灝 | 第一、二、3章 |
劉偉康 | 第四、五、6章 |
劉先潤 | 第七、八、9章 |
馬軍 | 第十、十一、12章 |
劉誠昊 | 第1三、1四、15章 |
莫禮鍾 | 第1六、17章 |
1.1 軟件 = 程序 + 軟件工程
軟件工程的核心部分(狹義,廣義)、軟件工程的地位、軟件開發不一樣階段的不一樣表現。服務器
1.2 軟件工程是什麼
軟件工程的定義、軟件工程所包含的領域、軟件開發的難點、工程的定義、軟件工程並不等於計算機科學,二者有着不一樣的側重點,軟件工程的知識領域,軟件工程的目標,初步學會軟件工程須要達到的要求。數據結構
2.1 單元測試
保證覆蓋率爲100%,好的單元測試的標準,單元測試能夠提升軟件開發的效率,迴歸(迴歸到之前不正常的狀態)測試。
2.2 效能分析工具:Visual Studio(抽樣、代碼注入)
不經分析就盲目優化,也許會事倍功半。
2.3 我的開發流程(PSP)
PSP任務清單(大學生VS工程師),PSP的特色。
2.4 實踐
當前程序設計做業簡單,無太多擴展、擴展的方面、作項目的時候須要對項目的處理;
開放 – 封閉原則:容許擴展,不容許修改。
3.1 我的能力的衡量與發展
我的能力在團隊中的做用與影響、我的應當承擔的責任、我的的成長記方式。
3.2 軟件工程師的思惟誤區
不要總想着在短期內搞個大新聞,要結合自身實際,求穩,而後再擴展。
3.3 軟件工程師的職業發展
3.4 技能的反面
注重本身的技術,要避免懂得「技術」但仍然常常犯一些低層次的問題。
4.1 代碼規範(風格、設計)
4.2 代碼風格規範(簡明、易讀、無二義)
縮進(4個空格)、行寬、括號、斷行與空白的{}行(每一個{
和}
獨佔一行)、分行、命名、下劃線、大小寫、註釋(What、Why)。
4.3 代碼設計規範
函數、goto、錯誤處理(參數處理、斷言)、處理類。
4.4 代碼複審(自我、同伴、團隊)
爲何(早發現早修復、互相瞭解)、步驟、覈查表(概要、效能、可讀性等)。
4.5 結對編程(極致)
爲何(高投入產出比)、不間斷地複審、角色互換。
4.6 兩人合做的不一樣階段和技巧(萌芽、磨合、規範、創造、解體)
影響他人的方式、正確反饋(多層次)。
5.1 非團隊和團隊
非團隊(獨立、烏合之衆)、團隊(共同目標、合做)。
5.2 軟件團隊的模式(窩蜂模式)
主治醫師、明星、社區(衆人拾柴火焰高)、業餘劇團(不一樣角色)、祕密團隊(無干擾)、特工團隊(高手)、交響樂團(各司其職)、爵士樂(個性化表達)、功能團隊(小組交流)、官僚(不提倡)。
5.3 開發流程(統一體系)
寫了再改、瀑布模型(分析-->設計-->實現-->銷售-->維護)、統一流程、漸進交付(MVP)、TSP原則
6.1 敏捷的流程簡介(找出待解決的問題 --> 決定當前目標 -->衝刺(每日例會)--> 改進)
6.2 敏捷流程的問題和解法(計劃:體現依賴關係-->描述細化到技術層面 --> 跟蹤三個時間 --> 總結教訓)
6.3 敏捷的團隊
自主管理(本身挑選任務)、自我組織(聯合負責)、多功能(全面負責)。
6.4 敏捷總結
質量控制、短期迭代、極致編程、經驗教訓。
6.5 敏捷的問答
敏捷是一種價值觀、總結思想、最佳實踐TDD、適用範圍、宣言(左項)。
微軟解決方案框架(Microsoft Solution Framework,MSF),是微軟公司經過吸收各部門積累的業務經驗並隨着時代更新的軟件開發方法。其主要原則有9點:推進信息共享與溝通、爲共同的遠景而工做、 充分受權和信任、各司其職,對項目共同負責(不只要完成本職工做,更要對項目負責)、重視商業價值、保持敏捷,預期變化、投資質量(投資的效率,時期並要求長期)、學習全部的經驗(要堅持總結和分享)、與顧客合做(從用戶角度出發)。
用戶調研(User Study),A/B測試,經過態度、行爲、定性、定量來規範調研的尺度。
軟件需求
將需求進行分類、清楚軟件產品的利益相關者、獲取用戶需求(用戶調研)、競爭性需求分析的框架、功能的定位和優先級、目標估計和決心、找出估計後面的假設、最後分而治之。
經驗公式: Y = X ± X ÷ N
工程師的經驗公式實際時間花費主要取決於兩個因素—對 某件事的估計時間X,以及他作過相似開發工做的次數N。
提案,評估和WBS
NABC model(N--need需求、Approach--作法、Benefit--好處、Competitors--競爭、Delivery--推廣方式)
評估:目標(根據實際的需求來定)、決心(它承諾在特定日期交付預約義的功能,做爲特定的質量級別)、估計(單個任務花費的人力、時間)
WBS – Work Break Down
分而治之,頂層(產品)→中層(功能)-用戶視角→較低級別(功能實現)-團隊透視圖(PM,test)→最低級別(模塊)-開發透視圖
風險管理
第一步:確認風險、根據不一樣的來源對風險進行分類;
第二步:分析和優先級劃分;
第三步:計劃和管理風險
應對風險的方法:進一步研究、接受、 規避、轉移、 下降、制定應急計劃
項目經理(PM),PM負責除產品開發和測試以外的全部事情,包括正確地作產品和正確地作流程。
PM的做用:收集需求、設計用戶界面,編寫規範、協調市場、文檔、測試、定位、帶領團隊達成決策
【注】項目經理是和你們平等工做,而且作具體工做,和其餘團員一塊兒造成決議,只管事無論人的,和領導型經理是不同的。
1、典型用戶
1.典型用戶
定義: 描述了一組用戶的典型技巧,能力,須要,工做習慣和工做環境。
電影用戶的角色:也有受歡迎的和不受歡迎之分。
典型用戶的完善:定義了一部分典型用戶後繼續與其中表明進行溝通,進一步完善需求理解。
2.從典型用戶到場景
場景:也能夠是故事,用戶爲達到目標使用系統時經歷的全部過程。
場景的使用:設計者模擬用戶,設計一個場景入口,描述用戶在這個場景的內外部因素,給場景劃分優先級並寫場景。
3.從場景到任務
分層:沿着子系統/模塊的所屬關係把場景劃分開。(例如:P221.UI層,邏輯層,數據庫)
任務與場景:不一樣的任務將會把一個場景編織起來,獲得開發任務後,能夠建立和分配測試任務。
2、用例(Use Case)
3、功能說明書(Spec)
1.規格說明書
軟件功能說明書:說明軟件的外部功能和用戶的交互狀況。(軟件是一個黑盒子,看不到內部)
軟件技術說明書:又稱設計文檔,說明軟件的內部的設計規範。(透明盒子)
2.功能說明書
從用戶的角度描述軟件產品的功能,輸入,輸出,界面,功能的邊界問題,功能的效率(to user),國際化,本地化,異常狀況等,不涉及軟件內部的實現細節。
3.制定一份Spec
定義好相關的概念,規範好一些假設;避免一些誤解,界定一些邊界條件(定性且定量);描述主流的用戶/軟件交互步驟;一些好的功能還會有反作用,服務質量的說明。
4.Spec的弊端
枯燥乏味,沒法跟上時間的變化。
5.技術說明書
設計文檔,用於描述開發者如何趨勢線某一功能,或相互聯繫的一組功能。實現軟件功能沒有固定的模板,但總存在着一些規律。
4、功能驅動的設計
1、分析和設計方法
2、圖形建模和分析方法
3、其餘設計方法
4、從Spec到實現
1.預估開發時間
2.寫一些快速成型代碼,看當作效,查找問題。
3.看到初始效果與瞭解實現細節後,開始寫設計文檔,並與同事進行復審。
4.按照設計文檔寫代碼,解決遇到的問題。
5.寫好代碼後先根據設計文檔與代碼指南進行自我複審,重構代碼。
6.重建或更新單元測試。
7.獲得一個能夠測試的版本,交予相關測試人員測試或者公開測試。
8.修復測試中發現的問題。
9.根據代碼複審的意見修改代碼,完善單元測試和其餘相關代碼,把新的代碼簽入到數據庫中。
2. 把修改集集成到代碼庫中
根據場景和開發任務來決定集成的次序、互相依賴的任務要一塊兒集成。
在測試場景時,要保證端對端的測試。
場景的全部者必須保證場景徹底經過測試,而後把場景的狀態改成「解決」。
3.開發人員的標準工做流程(以下圖所示)
5、開發階段的平常管理
6、實戰中的源代碼管理
軟件 = 程序 + 軟件工程
軟件的質量 = 程序的質量 + 軟件工程的質量
代碼須要版本管理
在源代碼基礎上進行修改後,留下新版本以及對應的負責人記錄,記載bug的內容,處理人,處理時間,是否處理完成等內容以備查驗。
7、代碼完成
1、用戶體驗的要素
Who
When
Where
Why
How
,用以判斷用戶對產品的設計需求。2、用戶體驗設計的步驟和目標
3、評價標準
4、貫穿多種設備的用戶體驗
測試方法名稱很是多,但只不過是從各個方面描敘了軟件測試,並非說有這麼多獨立的測試方法,只要分類處理,也就不會很難理解。
Bug又可分解爲:症狀(Symptom)、程序錯誤(Fault)、根本緣由(Foot Couse)。-
測試設計有兩類方法:黑箱(Black Box)和白箱(White Box)。
【注】是測試的「設計」方法,而非測試方法。
黑箱從軟件的行爲,而非從內部設計出發來設計測試;白箱則可「看到」軟件系統內部。
按測試的目的分類:功能測試、非功能測試。
按測試的時機和做用分類:測試「烽火臺」,以及其餘測試方法。
13.2 各類測試方法(該部分書中爲舉例瞭解)
① 單元測試(Unit Test) 和 代碼覆蓋率測試(Code Coverage Analysis)
② 構建驗收測試:驗收系統的基本功能。
③ 驗收測試:拿到一個「可測」的構建之後,按測試計劃測試各自負責的模塊和功能。
④ 「探索式」測試:爲了某一特定目的而進行的測試,且僅此一次,之後通常不重複測試。
⑤ 迴歸測試
⑥ 場景/集成/系統測試:在開發必定階段對軟件進行一個全面系統的測試以保證軟件的各個模塊都能共同工做。
⑦ 夥伴測試
⑧ 效能測試:軟件在設計負載可否提供使人滿意的服務質量。
⑨ 壓力測試:嚴格地說不屬於效能測試,驗證軟件在超過設計負載的狀況下可否返回正常結果。
⑩ 內部/外部公開測試:讓特定用戶使用正在處於開發階段的版本,以便收集更多反饋。
⑪ 易用性測試
⑫ 「Bug」大掃蕩
13.3 實戰中的測試觀念:
1.從項目開始測試人員便要開始介入,從源頭防止問題的發生。
2.測試並不是必定要根據規格說明書來測,更要從用戶的角度出發來測試軟件。
3.測試人員的代碼質量必定要特別高,由於測試人員是最後一道防線。
4.若爲了讓問題儘快顯現,用Debug版本;若爲了儘量測試用戶所看到的軟件,用Release版本。
文檔:在計劃階段就寫出測試總綱與測試計劃,它們主要說明產品是什麼,要作什麼樣的測試,時間安排如何,誰負責哪方面,各類資源在哪等。
13.4 運用測試工具
運用工具記錄手工測試及自動測試。
測試效能:除功能方面的測試,還有「服務質量」
【例子】效能測試: 100個用戶的狀況下,產品搜索必須3S內返回結果。
負載測試: 2000個用戶的狀況下,產品搜索必須5S內返回結果。
壓力測試: 壓力高峯期(4000個用戶)持續48小時的狀況下,產品搜索必須保持穩定而不至於崩潰
14.1 軟件的質量
軟件質量 = 程序質量 + 軟件工程質量
程序質量體如今軟件外在功能。例如一個字處理軟件可否拷貝/粘貼等
軟件工程質量:軟件在功能、成本、時間三方面知足利益相關者的需求。
軟件工程的質量以一套比較成熟的理論CMMI進行衡量。
質量成本組成部分包括預防、評審、內部故障、外在故障四個方面。
14.2 軟件質量的保存工做
軟件的質量保障(QA)和軟件測試(Test)是有很大區別的,所以——測試的角色要獨立出來,全部人均可以參與QA工做,但最後要有一我的對QA這件事負責,最後軟件發佈時,必須獲得此角色的簽字保證。儘管有專人負責測試工做,但保證質量還是全部成員的職責。
不能盲目信任「專業人士」扮演的角色,即便有專業人士扮演的角色,還得有專人獨立地檢查驗證質量。
分工不能「畫地爲牢」,爲了不出現局部最優而全局未必最優,同時也避免因爲軟件被切碎而致使總體不太行。
分工不能無明確責任。
15.1 從代碼的完成到發佈
軟件生命週期的最後階段每每是最考驗團隊的,不但考驗團隊項目管理水平、應變能力,也考驗團隊的「血型」。
原計劃的軟件發佈時間快到了,可是軟件還存在各類問題,因而有了4種團隊血型:
A型:他們知道優秀的軟件公司會發布有已知缺陷的軟件。
B型:他們不相信這一點。
O型:他們不知道這一點,所以嘴巴驚訝成O型。
AB型:他們對於本身開發的軟件是A型,對於別人開發的軟件是B型。
會診小組:軟件團隊的各個表明組成會診小組,處理每一個影響產品發佈的問題,對於每個Bug,會診小組要決定採起何種行動:1.修復 2.設計原本如此 3.不修復 4.推遲
複雜項目的會診招數:
設計變動、搞定全部已知Bug、最後迴歸測試、砍掉功能(不能由於之前花了成本,就要求之後必定要完成某個任務)、修復Bug的門檻逐漸提升、逐步凍結。
15.2 使用不一樣頻率和不一樣覆蓋範圍的漸進發布
產品同時對不一樣的目標用戶用不一樣的頻率發佈,以適應不一樣羣體的需求。
15.3 發佈以後——過後諸葛亮會議
這個軟件生命的週期結束之後,如屍體解剖同樣,把給軟件的開發流程剖析一下。
一、軟件構建的過程當中,何爲連接參數?
二、在程序理解階段,爲了可以使不一樣的人接手非本身的代碼,打代碼的時候應該要注意什麼方面?
三、商業模式是否真正地直接可以決定一個軟件企業地成敗?
四、在軟件開發階段中愛好者怎麼才能晉升爲先行者?
五、軟件工程開發有着較高的難度,但不表明不能進行開發,如何能使咱們可以克服軟件開發過程當中的難題呢?
六、該如何使單元測試給自動化?
七、主治醫師模式:在一個團隊中如何避免一個學生幹活,其他學生跟着打醬油?
八、明星模式:如何使團隊的利益最大化,而不是在明星光芒四射時使自身利益最大化?
九、如何在不影響效率的狀況下有效記錄三個跟蹤的時間值:實際剩餘時間、預估剩餘時間、實際花費時間?
十、如何培養一我的或者一個團隊把重要和有效的作法發揮到極致的能力?
十一、軟件工程和咱們的課程程序設計與數據結構有什麼不一樣?構建之法上的哪些內容能夠徹底應用到咱們的課程中?
十二、在進行用戶調研的過程當中,爲何不能調研細微到毫釐,即作調研作過頭?
1三、一個團隊成熟的標記,就是對風險的管理,在《構建之法》中如是說,咱們對待風險該採起什麼樣的態度呢?
1四、關於項目經理PM,書中提到一個團隊能夠有不少PM,若是一個團隊中針對一個項目造成了多個決議,這種窘況該如何解決呢?
1五、project manager 和 program manager 的區別在於前者管事也管人,後者只管事無論人,因此PM須要有很強的領導力嗎?
1六、在設計用例時如何既鑲嵌UI的細節又保證故事的簡明性?
1七、用戶的體驗和產品的質量一樣重要,那麼他們衝突時應該平衡至什麼地步?
1八、在設計典型場景時須要保持模擬內容的簡明性仍是模擬全部可能發生的事件,不管是否與需求有關?
1九、成本的主要組成部分是由什麼而產生?
20、結構和實現又有什麼樣的關係?
2一、代碼覆蓋率是什麼?它重要在哪?
2二、理想的覆蓋率分析工具是怎樣的?
【問題】我在最開始接觸泛型時以爲泛型的語法有些麻煩,對於數組來講自身就有定義方式,那麼相對於其餘類、其餘方法,泛型有哪些的好處,又有哪些弊端?
ArrayList files = new ArrayList(); String filename = (String) files.get(0);
第二,這裏不便於錯誤檢查,能夠向數組列表添加任何對象。
因而,泛型就提供了 類型參數 解決這兩個問題,這使得代碼具備更好的可讀性:
ArrayList<String> files = new ArrayList<>();
【注】省略的類型能夠從變量的類型推斷得出。
固然,泛型也是有侷限性的,例如:不能使用基本類型實例化類型參數,不能用類型參數代替基本類型,這即是我所認爲的「麻煩」之處;除此以外,泛型也不能實例化類型變量,不能構造泛型數組,也不能實例化參數化類型的數組,例如:
List<String>[] ls = new ArrayList<String>[10];
可是可使用通配符建立:
List<?>[] ls = new ArrayList<?>[10];
這是我在書上查到的能看懂的弊端,其餘內容還須要大量實踐去驗證。
Iterator it = c.iterator(); for(;it.hasNext();) System.out.println(it.next());
解決方案 :查看了課本以後發現上學期的 接口 內容有所遺忘,Iterator 接口中的兩個基本方法是 hasNext 和 next ,hasNext返回一個布爾結果,next返回一個對象。這兩個方法都不帶任何參數。若是還有等待處理的數據項,hasNext 方法返回真,而next方法返回下一個對象。對於hasNext方法來講,若是仍有元素能夠迭代,則返回 true。這至關於:若是 next 返回了元素而不是拋出異常,則返回 true。hasNext有一個索引功能,即判斷下一個元素是否存在。 之因此這樣搭配,就是爲了迭代循環,從而成爲遍歷一個集合或者泛型對象的經常使用方法。
【問題2】:看了婁老師本週的教學進程以後,學習任務中有一點是:掌握Java中泛型類,泛型方法的設計。那麼要如何正肯定義一個泛型方法?
// 定義一個泛型類,這個T能夠出如今這個泛型類的任意位置,泛型的數量也能夠爲任意多個 static class Pair<T> { private T value; public Pair(T value) { this.value = value; } public T getValue() { return value; } public void setValue(T value) { this.value = value; } }
測試類獲取並替換參數值,再獲取:
public static void main(String[] args){ Pair<String> pair = new Pair<>("Hello"); //實例化泛型對象Pair String str = pair.getValue(); System.out.println(str); pair.setValue("World"); str = pair.getValue(); System.out.println(str); }
在掌握了定義一個簡單的泛型類以後,我從網上找到一個泛型方法的示例(僅選取一段):
public class Generic<T>{ private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; } } // 在public與返回值之間的<T>必不可少,這代表這是一個泛型方法,而且聲明瞭一個泛型T public <T> T showKeyName(Generic<T> container){ // 定義一個帶有類型參數的簡單方法 System.out.println("container key :" + container.getKey()); T test = container.getKey(); return test; }
例子比較簡單,容易理解。固然,關於泛型的實用性更多體如今集合中,上文說起的 Comparable 接口自己也是一個泛型類型。
20162319:未發表博客
這周學習的內容慢慢多了起來,課上的例子主要針對泛型、Map類和Comparable接口講解了一些簡單示例,咱們小組的團隊博客也漸漸開設起來,本次由於是分配學習,而後彙總寫入博客,因此有我負責編輯格式。說實話,小組成員每一個人本身總結的格式不一樣,彙總起來就比較頭疼,咱們會在之後慢慢改進磨合。構建之法中我也瞭解到所謂的「敏捷的團隊」,也但願在咱們每一個人的貢獻下,咱們的團隊也能成爲這樣的團隊。
團隊內容佔用了比較多的時間,總的來講效果不錯。相比之下,我這周課下泛型的學習還不夠深刻,只會使用幾個簡單的例子,所以在複習git和調試時也要多鞏固泛型的語法,爲下週的考試和後期學習作好準備。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 234/234 | 1/28 | 14/14 | 瞭解算法效率、大O符號等理論內容 |
第二週 | 255/489 | 1/29 | 12/26 | 瞭解敏捷的團隊、泛型的使用 |
計劃學習時間:15小時
實際學習時間:12小時
有效學習時間:5小時
改進狀況:保持了上週的狀態,但仍是太懶了,天天早晨的計劃老是拖到晚上,作事很難集中注意力,多是在宿舍的時間太長了,下週會減小天天在宿舍的時間。