《構(gòu)建之法:現(xiàn)代軟件工程》讀書(shū)筆記

1.1 軟件 = 程序 + 軟件工程

  1. 作為程序員,大家都知道有“程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法” 。確實(shí),程序的確是建立在數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)上的一些算法。
  2. 一些名詞:
    ①軟件架構(gòu)(Software Architecture):軟件系統(tǒng)各個(gè)方面的設(shè)計(jì),常用的有分層架構(gòu),其架構(gòu)如下
    分層架構(gòu)
  • 表現(xiàn)層(presentation):用戶界面展示與一些交互操作。
  • 業(yè)務(wù)層(business):實(shí)現(xiàn)一些業(yè)務(wù)邏輯。
  • 持久層(persistence):提供數(shù)據(jù),SQL語(yǔ)句放在這一層。
  • 數(shù)據(jù)庫(kù)(database):保存數(shù)據(jù)。
    優(yōu)點(diǎn)在于解耦明確
    ②軟件設(shè)計(jì)與實(shí)現(xiàn)(Software Design, Implementation and
    Debug)。
    ③配置管理(Software Configuration Management)。
    ④軟件測(cè)試(Testing):用來(lái)保證軟件的正確性、完整性、安全性質(zhì)量。
    ⑤需求分析(Requirement Analysis):軟件開(kāi)發(fā)的第一步,需要完成的內(nèi)容一般有項(xiàng)目背景及目標(biāo)運(yùn)行環(huán)境、數(shù)據(jù)庫(kù)描述功能性需求描述(例如登錄注冊(cè))、非功能性需求描述(用戶界面需求、軟件環(huán)境需求)等。
    ⑥軟件維護(hù)(Software Maintenance):在出問(wèn)題的時(shí)候打補(bǔ)丁。
    ⑦生命周期(Software Life Cycle,SLC):軟件團(tuán)隊(duì)從需求分析開(kāi)始到設(shè)計(jì)(軟件架構(gòu))、實(shí)現(xiàn)(寫(xiě)程序,即寫(xiě)數(shù)據(jù)結(jié)構(gòu)和算法)、軟件測(cè)試,到最后發(fā)布軟件以及軟件的維護(hù)。

1.2軟件工程是什么

  1. 定義:軟件工程是把系統(tǒng)的、有序的、可量化的方法應(yīng)用到軟件的開(kāi)發(fā)、運(yùn)營(yíng)和維護(hù)上的過(guò)程。
  2. 軟件工程的目標(biāo):創(chuàng)造足夠好的軟件。即沒(méi)有BUG的軟件。BUG的存在會(huì)直接影響用戶滿意度、可靠性。那什么是BUG(缺陷)呢?簡(jiǎn)單來(lái)說(shuō)就是軟件的行為和用戶的期望不一樣。

2.1單元測(cè)試

目的:如何保證自己寫(xiě)的代碼的質(zhì)量。
測(cè)試方法:利用JUnit庫(kù)進(jìn)行測(cè)試,其提供了各種方法進(jìn)行單元測(cè)試。

  • 判斷程序結(jié)果是否與期望一致。
//測(cè)試方法
    @Test
    public void factorial() throws Exception {
//判斷是否相同
        assertEquals(1,new Math().factorial(0));
    }
  • 判斷是否程序超時(shí),如果程序運(yùn)行時(shí)間超過(guò)2秒便不會(huì)通過(guò)測(cè)試
    @Test(timeout = 2000)
    public void sort() throws Exception{
        int a[] = new int[50000];
        Random random = new Random();
        for(int i = 0;i<a.length;i++){
            a[i] = random.nextInt(a.length);
        }
        new Sort().sort(a);
    }

2.2 性能分析

性能分析在Java中一般采用JProfiler,對(duì)于該軟件我目前沒(méi)有進(jìn)行了解(主要沒(méi)找到破解版。。。)。

2.3 PSP(Personal Software Process)

  • 個(gè)人開(kāi)發(fā)流程,下圖給出整個(gè)流程
    個(gè)人開(kāi)發(fā)流程

    注意:往往具有一定開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)人員,會(huì)在 需求分析測(cè)試上畫(huà)多一點(diǎn)時(shí)間,而編碼(Coding)上時(shí)間用的較少。

3.1 軟件工程師的成長(zhǎng)

  • 積累軟件開(kāi)發(fā)相關(guān)的知識(shí),提升技術(shù)技能(對(duì)具體技術(shù)的掌握例如Java)
  • 積累問(wèn)題領(lǐng)域的認(rèn)識(shí)和經(jīng)驗(yàn)
  • 對(duì)通用的軟件設(shè)計(jì)思想和軟件工程思想的理解。
  • 提升職業(yè)技能:自我管理的能力、交流能力、團(tuán)隊(duì)合作能力
  • 實(shí)際成果:你參與的項(xiàng)目用戶評(píng)價(jià)如何,你在其中起什么作用。軟件開(kāi)發(fā)的工作量和質(zhì)量由以下幾點(diǎn)來(lái)衡量:①代碼行數(shù)②花了多久時(shí)間③質(zhì)量如何(BUG多嗎?)

3.2 軟件工程師的職業(yè)發(fā)展

就軟件工程師而言,有很多證明個(gè)人能力的辦法和模型:

  • 考取證書(shū):例如CCF

4.1 代碼規(guī)范

目的是為了大家都能看懂,畢竟在現(xiàn)在程序往往不是一個(gè)人完成。保證簡(jiǎn)明、易讀無(wú)二義性

4.2 代碼風(fēng)格規(guī)范

4.2.1 縮進(jìn)

采用4個(gè)空格而不是tab的方式,因?yàn)閠ab在不同的情況下會(huì)顯示不同的長(zhǎng)度,干擾閱讀體驗(yàn)。

4.2.2 行寬

限制在100字符以內(nèi)

4.2.3 括號(hào)

在復(fù)雜的條件表達(dá)式中,利用括號(hào)表達(dá)優(yōu)先級(jí)。

4.2.4 斷行

建議采用下列格式

if (condition)
{
DoSomething();
}
else
{
DoSomethingElse();
}

但我一般用下面這個(gè)各式

if (condition) {
DoSomething();
} else {
DoSomethingElse();
}

4.2.5 命名

對(duì)于java而言:

  • 包:域名反轉(zhuǎn)做包名,例如com.jacob
  • 類:每個(gè)單詞首字母大寫(xiě)。
  • 方法:第一個(gè)單詞首字母小寫(xiě),其余大寫(xiě)
  • 屬性:第一個(gè)單詞首字母小寫(xiě),其余大寫(xiě)
  • 常量:所有字母都大寫(xiě)

4.3 代碼復(fù)審

定義:看代碼是否在“代碼規(guī)范”的框架內(nèi)正確的解決了問(wèn)題

  • 自我復(fù)審
  • 同伴復(fù)審
  • 團(tuán)隊(duì)復(fù)審
    代碼復(fù)審核查表如下:
  1. 代碼符合需求和規(guī)格說(shuō)明嗎?
  2. 代碼設(shè)計(jì)是否周全?
  3. 代碼可讀性如何?
  4. 代碼容易維護(hù)嗎?
  5. 是否遵從項(xiàng)目設(shè)計(jì)模式(例如MVP、MVC)
  6. 是否符合代碼規(guī)范?
  7. 有沒(méi)有對(duì)異常進(jìn)行處理(例如階乘時(shí)輸入負(fù)數(shù))?
  8. 邊界條件是否處理?
  9. 代碼效能如何(利用Jprofile)?

5.1 團(tuán)隊(duì)模式

5.1.1 主治醫(yī)師模式

  • 首席程序員:負(fù)責(zé)主要模塊的設(shè)計(jì)和編碼
  • 其他程序員:從各種角度來(lái)支持他
    不過(guò)該模式在學(xué)校一般會(huì)變成一神帶幾坑

5.1.2 明星模式

5.1.3 社區(qū)模式

每個(gè)人參與自己感興趣的項(xiàng)目,貢獻(xiàn)力量。
好處在于:“眾人拾柴火焰高”

5.1.4 業(yè)余劇團(tuán)模式

  • 在團(tuán)隊(duì)中,不同的人挑選不同的角色。

5.1.5 功能團(tuán)隊(duì)模式

  • 很多軟件公司的團(tuán)隊(duì)模式最后都轉(zhuǎn)化為功能團(tuán)隊(duì)模式,簡(jiǎn)而言之就是具備不同能力的同事們平等協(xié)作,共同完成一個(gè)功能。
功能團(tuán)隊(duì)模式

5.2 開(kāi)發(fā)流程

  • 一群人在一起做軟件開(kāi)發(fā),總是要有一些方式和方法

5.2.1 瀑布模型

  • 當(dāng)軟件行業(yè)還在年幼的時(shí)期時(shí),它從別的行業(yè)借鑒了不少經(jīng)驗(yàn)和模型。在那個(gè)“硬”的時(shí)代,產(chǎn)品大都遵循分析-設(shè)計(jì)-實(shí)現(xiàn)-銷售-維護(hù)。這個(gè)模型描述的是單向的、不可逆的生產(chǎn)過(guò)程。
    相鄰步驟回溯的瀑布模型

5.2.2 生魚(yú)片模型

  • 各模塊像生魚(yú)片那樣部分重疊(解決了各個(gè)步驟之間分離的缺點(diǎn))


    生魚(yú)片模型
  • 那么問(wèn)題來(lái)了,到底是哪些部分重疊呢?

5.2.3 Rational Unified Process(統(tǒng)一流程)

  • 重計(jì)劃,重事先設(shè)計(jì)。
  • 要完成一個(gè)復(fù)雜的軟件項(xiàng)目,團(tuán)隊(duì)的各個(gè)成員要在不同的階段做不同的事情,這種不同類型的工作在RUP中稱為規(guī)程或者工作流程。簡(jiǎn)介如下:
  1. 業(yè)務(wù)建模(Business Modeling):通常利用UML(統(tǒng)一建模語(yǔ)言)描述用戶的活動(dòng)。其結(jié)果同城生成一個(gè)用例(User Case)
  2. 需求(Requirement):有了用例過(guò)后,開(kāi)發(fā)人員和用戶需要分析軟件系統(tǒng)需要哪些功能來(lái)滿足用戶需求。其結(jié)果形成需求分析文檔。
  3. 分析和設(shè)計(jì)(Analysis & Design):將需求轉(zhuǎn)化為系統(tǒng)的設(shè)計(jì)(設(shè)計(jì)系統(tǒng)架構(gòu)等)。其結(jié)果是團(tuán)隊(duì)成員需要知道系統(tǒng)要有哪些子系統(tǒng)、模塊,他們之間關(guān)系如何。
  4. 實(shí)現(xiàn)(Implementation):工程師按計(jì)劃實(shí)現(xiàn)上一步提出的設(shè)計(jì),將開(kāi)發(fā)出的組件(負(fù)責(zé)的那部分)連同單元測(cè)試模塊提交到系統(tǒng)中。最后整合各個(gè)組件。
  5. 測(cè)試(Testing):驗(yàn)證組件、組件之間交互的正確性。
  6. 部署(Deployment):生成最終版本并發(fā)布給用戶。
  7. 配置和變更管理(Configuration andChange Management):負(fù)責(zé)管理RUP各個(gè)階段產(chǎn)生的各個(gè)工作結(jié)果。
  8. 項(xiàng)目管理:管理風(fēng)險(xiǎn)。

6 微軟解決方案框架(Microsoft Solution Framework,MSF)團(tuán)隊(duì)模型

MSF

7 需求分析

7.1 軟件需求

7.1.1 獲取和引導(dǎo)需求

7.1.2 分析和定義需求

7.1.3 驗(yàn)證需求

  • 確認(rèn)用戶需要這些功能
  • 產(chǎn)品的功能性需求:產(chǎn)品需要實(shí)現(xiàn)哪些工程。
  • 產(chǎn)品開(kāi)發(fā)過(guò)程的需求:要求產(chǎn)品開(kāi)發(fā)過(guò)程中必須滿足某些約束條件,例如,開(kāi)發(fā)過(guò)程中必須產(chǎn)生某種類型的文檔,必須在某個(gè)時(shí)間點(diǎn)達(dá)到某種狀態(tài)。
  • 非功能行需求:也叫“服務(wù)質(zhì)量需求”,功能反應(yīng)時(shí)間等,友好的UI等。
  • 綜合需求:有時(shí)不一定單單的一個(gè)軟件模塊就可以滿足,例如:“購(gòu)物網(wǎng)站需要在24小時(shí)內(nèi)把貨物發(fā)送到用戶手中”,該需求牽涉到軟件系統(tǒng)、物流系統(tǒng)等。

7.2 軟件產(chǎn)品的利益相關(guān)者

  • 分析軟件需求的時(shí)候需要考慮以下的利益相關(guān)者。
  1. 用戶:直接使用軟件的人。例如打車(chē)軟件的使用者有“乘客”、“司機(jī)”。
  2. 顧客:購(gòu)買(mǎi)這個(gè)軟件的人。這些人不一定是軟件的直接用戶,但卻直接利益相關(guān)。例如代表甲方向團(tuán)隊(duì)提需求的人。
  3. 軟件工程師:軟件的各種約束會(huì)影響開(kāi)發(fā)效率,所以應(yīng)當(dāng)征求其意見(jiàn)。

7.3 獲取用戶需求-用戶調(diào)查

如何去有效的收集用戶需求,有以下幾種常用的用戶調(diào)用方法:

  1. 焦點(diǎn)小組模式:找到一群目標(biāo)用戶的代表,加上利益相關(guān)者來(lái)討論用戶向要什么。
    焦點(diǎn)小組
  2. 深入面談模式:通過(guò)詳細(xì)的面談,廣泛而深入的了解用戶的心理、背景、需求等。通常是一對(duì)一的采訪。效果往往取決于團(tuán)隊(duì)成員的能力。此類研究主要探究用戶在使用軟件時(shí)遇到哪些苦難,需要怎樣的改進(jìn)。
    深入面談
  3. 卡片分類模式:通常團(tuán)隊(duì)收到的需求都是雜亂無(wú)章的。將需求寫(xiě)在卡片上,對(duì)卡片需求進(jìn)行討論->明確定義->歸類->排序,這可以幫助我們統(tǒng)一大家對(duì)軟件需求的認(rèn)識(shí)。
  4. 用戶問(wèn)卷調(diào)查模式
  5. A/B測(cè)試:如果你的產(chǎn)品已經(jīng)有一些用戶在用,你想對(duì)用戶界面做一些改進(jìn),但是又不知道到底有多少用戶會(huì)喜歡新的界面,怎么辦?這時(shí)候可以利用A/B測(cè)試的方法,將改進(jìn)的UI現(xiàn)在5%-10%的用戶上運(yùn)行測(cè)試,然后收集數(shù)據(jù)得出結(jié)論。
  6. 快速原型調(diào)研:先設(shè)計(jì)原型,讓用戶看。
總結(jié)

7.4 競(jìng)爭(zhēng)性需求分析的框架

想競(jìng)爭(zhēng)就一定要?jiǎng)?chuàng)新!

  • 參考NABCD模型
  1. N(Need,需求)
    創(chuàng)意能解決什么用戶需求?
  2. A(Approach,做法)
  • 最好是獨(dú)特的做法
    技術(shù):人臉識(shí)別?大規(guī)模數(shù)據(jù)處理?
    成本:能找到便宜的資源來(lái)維護(hù)網(wǎng)站?
    人脈:
  1. B(Benefit,好處)
    能給客戶/用戶帶來(lái)什么好處?
  2. C(Competitors,競(jìng)爭(zhēng))


    競(jìng)爭(zhēng)
  3. D(Delivery,推廣)

7.5 功能的定位和優(yōu)先級(jí)

開(kāi)發(fā)之前問(wèn)自己兩個(gè)問(wèn)題:①你為啥在做這個(gè)功能而不是另一個(gè)功能?②為什么做這個(gè)產(chǎn)品而不是別的產(chǎn)品?


功能分析四象限

以一個(gè)英漢詞典APP來(lái)說(shuō)明上圖

  • 殺手功能:OCR文字識(shí)別技術(shù),可以在屏幕上取詞解釋,擁有獨(dú)家權(quán)威詞典,等等。
  • 外圍功能:良好的界面設(shè)計(jì),在各個(gè)平臺(tái)上都能運(yùn)行。
  • 必要需求:?jiǎn)卧~短語(yǔ)釋義的準(zhǔn)確性(如果達(dá)不到這一點(diǎn),用戶就不會(huì)來(lái)使用)。
  • 輔助需求:可以做各種皮膚(這也許能讓一些用戶更喜歡這個(gè)軟件,但不是決定因素)。

7.6 分而治之

每個(gè)項(xiàng)目需要在一段時(shí)間內(nèi)完成諸多任務(wù),滿足用戶的需求,實(shí)現(xiàn)團(tuán)隊(duì)的目標(biāo),但從哪里入手?這個(gè)時(shí)候需要一個(gè)角色站出來(lái)領(lǐng)導(dǎo)大家。這就是PM項(xiàng)目經(jīng)理。
采用WBS:Work Breakdown Structure方法,一層一層把大型交付件分割為小型交付件。

WBS例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容