目標
軟體開發流程及模式,敏捷開發,軟體配置管理SCM,Git,軟體構造過程和構造工具
SDLC
傳統軟體開發模型
瀑布模型
線性模型
優點:劃分階段,管理簡單
缺點:不迭代,所以缺少靈活性,也難以適應需求;並且使用者看不到原型,導致風險高,前期錯誤後期發現
增量模型
瀑布序列,容易適應需求增加
V模型
左側開發,右側測試,並行進行,並且每個階段都要驗證
優點:階段劃分,質量高,早發現錯誤
缺點:順序執行,難以應對需求變化,成本高
原型過程
開發原型,不斷迭代,使用者試用評審,反饋修改,直到使用者滿意
螺旋模型
多輪迭代,每一輪是瀑布,每一輪都有目標,迭代時嚴格驗證
敏捷開發
快速迭代和小規模改進,Agile = 增量 + 迭代
敏捷宣言:
- 個體和互動勝過流程和工具(Individuals and interactions over processes and tools):
- 強調團隊成員之間的合作和交流,而不是過度依賴於嚴格的流程和工具。
- 工作的軟體勝過詳盡的文件(Working software over comprehensive documentation):
- 重點是交付能夠實際執行的軟體,而不是花費大量時間編寫和維護詳細的文件。
- 客戶合作勝過合同談判(Customer collaboration over contract negotiation):
- 注重與客戶的持續合作和溝通,而不是僅僅根據合同進行工作。
- 響應變化勝過遵循計劃(Responding to change over following a plan):
- 強調能夠靈活應對變化的能力,而不是嚴格按照預先制定的計劃執行。
📕重點:使用者參與,小步驟迭代,確認驗證
😀一些理念:結對程式設計,CI持續整合,taskbord與客戶共同制定開發計劃與迭代週期,頻繁釋出小版本便於使用者反饋,TDD測試驅動,持續改進程式碼結構,有編碼標準和集體程式碼所有權
- 強調能夠靈活應對變化的能力,而不是嚴格按照預先制定的計劃執行。
SCM和VCS
SCM軟體配置管理:追蹤控制軟體變化
SCI軟體配置項:軟體中發生變化的基本單元(比如檔案)
基線:記錄軟體變化中的穩定時刻
CMDB配置管理資料庫:儲存軟體配置項變化資訊和基線
版本控制
作用:便於回滾、比較差異、備份歷史版本、獲取備份、合併
支援多開發者協作並記錄開發者行為,便於審計
結構:線性和分支結構
📕一些概念:
- 倉庫:CMDB
- 工作複製:開發者本地的專案複製
- 檔案:一個配置項SCI
- 版本:所有檔案在某個時間點的狀態集合
- 變化:版本間差異
- HEAD:當前工作的版本
VCS
Local:本地的,不能共享協作
Centralized:倉庫儲存在獨立伺服器
Distributed:倉庫儲存獨立的伺服器以及每個開發者的機器
Git
倉庫
本地git倉庫、工作目錄(就是本地的檔案系統)、暫存區(隔離工作目錄與Git倉庫)
之間的三種行為:修改、暫存、提交
同時包括遠端倉庫
Node Tree
圖解:
- 通常情況下,commit指向一個父親
- 多個commit指向同一個父親,那麼他們是多個分支
- 一個commit指向兩個父親,它是分支的合併
- HEAD是當前的commit源
- branch是分支名字
commit
commit中有作者等資訊,且其指向一顆樹,樹中有指向檔案的指標,如果未發生變化,則不需要重複儲存這兩個版本的檔案
如果檔案變化了,則會儲存兩個不同的檔案,兩個tree指向不同的檔案
Git優點
儲存的是檔案,不只是程式碼行,無需在回滾提交時大量進行修改操作,節省時間
Merge
git fetch可獲取遠端分支的變化,並選擇是否與本地分支進行合併
git merge可以合併兩個分支,並在合併前進行程式碼審查
合作
Fork和pull request 使使用者之間可以向其他人倉庫提交修改申請,以實現多人合作。每個人都fork倉庫並向總專案提交PR
軟體構造過程
1.Programming
語言
從用途上劃分
- Programming languages (e.g., C, C++, Java, Python)程式語言
- Modeling languages (e.g., UML) 建模語言
- Configuration languages (e.g., XML) 配置語言
- Build languages (e.g., XML) 構建語言
從形態上劃分 - Linguistic-based 基於語言學的構造語言
- Mathematics-based (formal) 基於數學的形式化構造語言
- Graphics-based (visual) 基於圖形的視覺化構造語言
程式設計工具
IDE:
- 原始碼編輯器、智慧程式碼補全工具、程式碼重構工具
- 檔案管理
- 庫管理
- 軟體邏輯視覺化(轉化為圖)
- GUI構造器
- 編譯器和直譯器
- 自動Build工具(編譯、連結、打包、測試、部署)
- VCS
- 外部工具
建模語言
視覺化系統設計,自動生成程式碼,便於驗證與交流
配置語言
描述軟體的配置引數和初始化設定,比如環境、元件連結等
2.程式碼評審
靜態程式碼分析
要求風格,設計等
3.動態效能分析
執行程式觀察現象,度量效能與狀態
4.除錯和測試
測試發現錯誤,除錯定位錯誤根源
5.重構
不改變功能,但透過結構等方式對程式碼最佳化,使其邏輯更清晰,設計風格更優,減少不必要的程式碼行
6.構建
編譯、打包、靜態分析、測試、生成文件、部署等,並實現自動化,藉助構建工具
🌰Cmake,Maven,Gradle,Webpack等