1.存在的問(wèn)題
最近十多年來(lái),軟件產(chǎn)業(yè)和互聯(lián)網(wǎng)產(chǎn)業(yè)的迅猛發(fā)展,給人們提供了用武之地,同時(shí)也對(duì)軟件工程教育提出了巨大的挑戰(zhàn)。從教育現(xiàn)狀看,通過(guò)灌輸知識(shí)可以讓人具有很強(qiáng)的考試能力,卻往往經(jīng)不起用人單位的檢驗(yàn)(筆試和機(jī)試)。雖然大家都知道,教育的本質(zhì)在于培養(yǎng)人的創(chuàng)造力、好奇心、獨(dú)特的思考能力和解決問(wèn)題的能力,但實(shí)際上我們的教學(xué)實(shí)踐背離了教育理念。代碼的優(yōu)劣不僅直接決定了軟件的質(zhì)量,還將直接影響軟件成本。軟件成本是由開(kāi)發(fā)成本和維護(hù)成本組成的,但維護(hù)成本卻遠(yuǎn)高于開(kāi)發(fā)成本,蠻力開(kāi)發(fā)的現(xiàn)象比比皆是,大量來(lái)之不易的資金就這樣被無(wú)聲無(wú)息地吞沒(méi)了,造成了社會(huì)資源的嚴(yán)浪費(fèi)。
2.核心域和非核心域
一個(gè)軟件系統(tǒng)封裝了若干領(lǐng)域的知識(shí),其中一個(gè)領(lǐng)域的知識(shí)代表了系統(tǒng)的核心競(jìng)爭(zhēng)力,這個(gè)領(lǐng)域就稱為核心域,其他領(lǐng)域稱為非核心域。雖然更通俗的說(shuō)法是業(yè)務(wù)和技術(shù),但使用核心域和非核心域更嚴(yán)謹(jǐn)。非核心域就是別人的領(lǐng)域,如底層驅(qū)動(dòng)、操作系統(tǒng)和組件,即便自己有一些優(yōu)勢(shì),那也是暫時(shí)的,競(jìng)爭(zhēng)對(duì)手也能通過(guò)其他渠道獲得。非核心域的改進(jìn)是必要的,但不充分,還是要在核心域上深入挖掘,讓競(jìng)爭(zhēng)對(duì)手無(wú)法輕易從第三方獲得。只有在核心域中深入挖掘,達(dá)到基于核心域的復(fù)用,才能獲得和保持競(jìng)爭(zhēng)力。要達(dá)到基于核心域的復(fù)用,有必要將核心域和非核心域分開(kāi)考慮。因?yàn)檫^(guò)早地將各個(gè)領(lǐng)域的知識(shí)混雜,會(huì)增加不必要的負(fù)擔(dān),從而導(dǎo)致開(kāi)發(fā)人員騰不出腦力思考核心域中更深刻的問(wèn)題,待解決問(wèn)題的規(guī)模一旦變大,而人腦的容量和運(yùn)算能力又是有限的,就會(huì)造成顧此失彼,因此必須分而治之。核心域與非核心域的知識(shí)都是獨(dú)的,比如,一個(gè)計(jì)算器要做到?jīng)]有漏洞,其中的問(wèn)題也很復(fù)雜。如果不使用狀態(tài)圖對(duì)程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)?領(lǐng)域邏輯顯式地建模,再根據(jù)模型映射到實(shí)現(xiàn),而是直接下手編程,領(lǐng)域邏輯的知識(shí)靠臨時(shí)去想,最終得到的代碼肯定破綻百出。其實(shí)有利潤(rùn)的系統(tǒng),其內(nèi)部都是很復(fù)雜的,千萬(wàn)不要幼稚地認(rèn)為我的系統(tǒng)不復(fù)雜。
3.利潤(rùn)從哪里來(lái)
早期創(chuàng)業(yè)時(shí),只要抓住一個(gè)機(jī)會(huì),多參加展會(huì),多做廣告,成功的概率就很大了。在互聯(lián)網(wǎng)時(shí)代,突然發(fā)現(xiàn)入口多了,聚焦用戶的難度也越來(lái)越大了。當(dāng)產(chǎn)品面臨競(jìng)爭(zhēng)時(shí),你會(huì)發(fā)現(xiàn)沒(méi)有最低只有更低。而且現(xiàn)在已經(jīng)沒(méi)有互聯(lián)網(wǎng)公司了,攜程變成了旅行社,新浪變成了新媒體……機(jī)會(huì)驅(qū)動(dòng)、粗放經(jīng)營(yíng)的時(shí)代已經(jīng)過(guò)去了。Apple之所以能成為全球最賺錢的手機(jī)公司,關(guān)鍵在于產(chǎn)品的性能超越了用戶的預(yù)期,且因?yàn)榇罅?可 重 用 的 核 心 領(lǐng) 域 知 識(shí),綜 合 成 本 做 到
了 極 致。Yourdon 和Constantine在《結(jié)構(gòu)化設(shè)計(jì)》一書中,將經(jīng)濟(jì)學(xué)作為軟件設(shè)計(jì)的底層驅(qū)動(dòng)力,軟件設(shè)計(jì)應(yīng)該致力于降低整體成本。人們發(fā)現(xiàn)軟件的維護(hù)成本遠(yuǎn)遠(yuǎn)高于它的初始成本,因?yàn)槔斫猬F(xiàn)有代碼需要花費(fèi)時(shí)間,而且容易出錯(cuò)。同時(shí)改動(dòng)之后,還要進(jìn)行測(cè)試和部署。更多的時(shí)候,程序員不是在編碼,而是在閱讀程序。由于閱讀程序需要從細(xì)節(jié)和概念上理解,因此修改程序的投入會(huì)遠(yuǎn)遠(yuǎn)大于最初編程的投入;谶@樣的共識(shí),讓我們操心的一系列事情,需要不斷地思考和總結(jié)使之可以重用,這就是方法論的緣起。通過(guò)財(cái)務(wù)數(shù)據(jù)分析可知,由于決策失誤,我們開(kāi)發(fā)了一些周期長(zhǎng)、技術(shù)難度大且回報(bào)率極低的產(chǎn)品。由于缺乏科學(xué)的軟件工程方法,不僅軟件難以重用,而且擴(kuò)展和維護(hù)難度很大,從而導(dǎo)致開(kāi)發(fā)成本居高不下。顯而易見(jiàn),從軟件開(kāi)發(fā)來(lái)看,軟件工程與計(jì)算機(jī)科學(xué)是完全不同的兩個(gè)領(lǐng)域的知識(shí)。其主要區(qū)別在于人,因?yàn)檐浖_(kāi)發(fā)是以人為中心的過(guò)程。如果考慮人的因素,軟件工程更接近經(jīng)濟(jì)學(xué),而非計(jì)算機(jī)科學(xué)。如果不改變思維方式,則很難開(kāi)發(fā)出既好賣成本又低的產(chǎn)品。
4.優(yōu)秀人才在哪里
學(xué)徒模式是過(guò)去造就大師、傳承技藝的方法,而現(xiàn)在指導(dǎo)和輔導(dǎo)卻成為了一項(xiàng)被忽略的活動(dòng),團(tuán)隊(duì)成員得不到所需的支持。技術(shù)領(lǐng)導(dǎo)人不僅要引導(dǎo)整個(gè)項(xiàng)目,而且還要為員工提供必需的協(xié)助。除此之外,指導(dǎo)和輔導(dǎo)提供了一種增強(qiáng)員工技能的方式,可幫助他們完善自己的職業(yè)生涯。這種協(xié)助有時(shí)是技術(shù)性的,有時(shí)是軟技能的?上У氖,在我們的行業(yè)里,許多優(yōu)秀的開(kāi)發(fā)者在轉(zhuǎn)向管理崗位之后,就放棄了對(duì)技術(shù)的追求,甚至再也不寫代碼了,因而團(tuán)隊(duì)中失去了最有價(jià)值的技術(shù)領(lǐng)導(dǎo)和導(dǎo)師,導(dǎo)致今天的開(kāi)發(fā)者還會(huì)繼續(xù)重蹈覆轍。很多優(yōu)秀的導(dǎo)師都消失了,讓開(kāi)發(fā)者到哪里去獲得經(jīng)驗(yàn)?zāi)? 未來(lái)的優(yōu)秀人才從哪里來(lái)?
5.告知讀者
這本書如同培訓(xùn)講師的教案,是我和同事們的讀書筆記及程序設(shè)計(jì)實(shí)踐的心得,并不是一本從零開(kāi)始編寫的專著或圖書。其中的很多內(nèi)容并非我們?cè)瓌?chuàng),而是重用了一些公開(kāi)出版物的內(nèi)容,詳見(jiàn)本書的參考文獻(xiàn)。
6.叢書簡(jiǎn)介
這套叢書命名為《嵌入式軟件工程方法與實(shí)踐叢書》,目前已經(jīng)完成《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》、《面向 AMetal框架和接口的 C編程》和《面向 AWorks框架和接口的 C編程(上)》,后續(xù)還將推出《面向 AWorks框架和接口的 C編程(下)》、《面向 AMetal框架和 接 口 的 LoRa 編 程》、《面 向 AWorks 框 架 和 接 口 的 C 編 程》、《面 向AWorks框架和接口的 GUI編程》、《面向 AWorks框架和接口的 CAN 編程》、《面向AWorks框架和接口的網(wǎng)絡(luò)編程》、《面向 AWorks框架和接口的 EtherCAT 編程》和《嵌入式系統(tǒng)應(yīng)用設(shè)計(jì)》等系列圖書,最新動(dòng)態(tài)詳見(jiàn) www.zlg.cn(致遠(yuǎn)電子官網(wǎng))和www.zlgmcu.com(周立功單片機(jī)官網(wǎng))
周立功
2018年9月2
周立功:周立功單片機(jī)發(fā)展有限公司總經(jīng)理,江西理工大學(xué)機(jī)電學(xué)院自動(dòng)化教研室教授,碩士生導(dǎo)師,嵌入式系統(tǒng)技術(shù)方向?qū)W科帶頭人,中國(guó)計(jì)算機(jī)學(xué)會(huì)高級(jí)會(huì)員,中國(guó)計(jì)算機(jī)學(xué)會(huì)嵌入式系統(tǒng)學(xué)會(huì)(微機(jī)專委)理事,中國(guó)單片機(jī)學(xué)會(huì)理事。從1981年開(kāi)始從事單片機(jī)與嵌入式系統(tǒng)的應(yīng)用、開(kāi)發(fā)與推廣。在教學(xué)實(shí)踐過(guò)程中,為了培養(yǎng)具有較好工程實(shí)踐能力"零適應(yīng)期"的大學(xué)生,周立功創(chuàng)立了"3+1"嵌入式系統(tǒng)應(yīng)用創(chuàng)新教學(xué)模式。
第1章 程序設(shè)計(jì)基礎(chǔ)………………………………………………………………… 1
1.1 思想的力量
……………………………………………………………………… 1
1.1.1 過(guò)程主題
…………………………………………………………………… 1
1.1.2 思維差異
…………………………………………………………………… 2
1.1.3 語(yǔ)言的鴻溝…………………………………………………………………… 3
1.2 變量與指針
……………………………………………………………………… 12
1.2.1 變
量 ……………………………………………………………………… 12
1.2.2 值的表示形式
……………………………………………………………… 16
1.2.3 數(shù)據(jù)的輸入/輸出
…………………………………………………………… 23
1.3 指針變量與指針的指針…………………………………………………………… 28
1.3.1 聲明與訪問(wèn)
………………………………………………………………… 28
1.3.2 變量的訪問(wèn)
………………………………………………………………… 33
1.3.3 指針的指針
………………………………………………………………… 36
1.4 簡(jiǎn)化表達(dá)式
……………………………………………………………………… 38
1.4.1 邏輯表達(dá)式
………………………………………………………………… 39
1.4.2 綜合表達(dá)式
………………………………………………………………… 40
1.4.3 條件表達(dá)式
………………………………………………………………… 42
1.5 共性與可變性分析
……………………………………………………………… 42
1.5.1 分析方法
…………………………………………………………………… 42
1.5.2 建立抽象
…………………………………………………………………… 44
1.5.3 建立接口
…………………………………………………………………… 44
1.5.4 實(shí)現(xiàn)接口
…………………………………………………………………… 48
1.5.5 使用接口
…………………………………………………………………… 50
1.6 數(shù)組與指針
……………………………………………………………………… 51
1.6.1 數(shù)
組 ……………………………………………………………………… 51
1.6.2 數(shù)組的訪問(wèn)形式
…………………………………………………………… 57
1.6.3 泛型編程
…………………………………………………………………… 60
1.7 數(shù)組的數(shù)組與指針
……………………………………………………………… 69
1.7.1 指向數(shù)組的指針
…………………………………………………………… 69
1.7.2 二維數(shù)組
…………………………………………………………………… 71
1.7.3 將二維數(shù)組作為函數(shù)參數(shù)
…………………………………………………… 73
1.8 字符串與指針
…………………………………………………………………… 77
1.8.1 字符常量
…………………………………………………………………… 77
1.8.2 字符串常量
………………………………………………………………… 81
1.8.3 指針數(shù)組
…………………………………………………………………… 92
1.9 動(dòng)態(tài)分配內(nèi)存
…………………………………………………………………… 99
1.9.1 malloc()函數(shù)
……………………………………………………………… 100
1.9.2 calloc()函數(shù)
……………………………………………………………… 101
1.9.3 free()函數(shù)
………………………………………………………………… 101
1.9.4 realloc()函數(shù)
……………………………………………………………… 103
第2章 程序設(shè)計(jì)技術(shù)……………………………………………………………… 105
2.1 函數(shù)指針與指針函數(shù)
…………………………………………………………… 105
2.1.1 函數(shù)指針
…………………………………………………………………… 105
2.1.2 指針函數(shù)
…………………………………………………………………… 108
2.1.3 回調(diào)函數(shù)
…………………………………………………………………… 112
2.1.4 函數(shù)指針數(shù)組
……………………………………………………………… 119
2.2 結(jié)構(gòu)體
………………………………………………………………………… 120
2.2.1 內(nèi)存對(duì)齊
…………………………………………………………………… 121
2.2.2 內(nèi)含基本數(shù)據(jù)類型
………………………………………………………… 124
2.2.3 內(nèi)置函數(shù)指針
……………………………………………………………… 130
2.2.4 嵌套結(jié)構(gòu)體
………………………………………………………………… 134
2.2.5 結(jié)構(gòu)體數(shù)組
………………………………………………………………… 138
2.3 棧與函數(shù)返回…………………………………………………………………… 142
2.3.1 堆
棧 …………………………………………………………………… 142
2.3.2 入棧與出棧
………………………………………………………………… 143
2.3.3 函數(shù)的調(diào)用與返回
………………………………………………………… 144
2.4 棧 ADT ………………………………………………………………………… 146
2.4.1 不完全類型
………………………………………………………………… 146
2.4.2 抽象數(shù)據(jù)類型
……………………………………………………………… 150
2.4.3 開(kāi)閉原則(OCP) …………………………………………………………… 160
第3章 算法與數(shù)據(jù)結(jié)構(gòu)…………………………………………………………… 165
3.1 算法問(wèn)題
……………………………………………………………………… 165
3.1.1 排
序 …………………………………………………………………… 165
3.1.2 搜
索 …………………………………………………………………… 167
3.1.3 O 記法
…………………………………………………………………… 169
3.2 單向鏈表
……………………………………………………………………… 175
3.2.1 存值與存址
………………………………………………………………… 175
3.2.2 數(shù)據(jù)與p_next分離
………………………………………………………… 184
3.2.3 接
口 …………………………………………………………………… 190
3.3 雙向鏈表
……………………………………………………………………… 201
3.3.1 添加結(jié)點(diǎn)
…………………………………………………………………… 205
3.3.2 刪除結(jié)點(diǎn)
…………………………………………………………………… 208
3.3.3 遍歷鏈表
…………………………………………………………………… 210
3.4 迭代器模式
…………………………………………………………………… 213
3.4.1 迭代器與容器
……………………………………………………………… 213
3.4.2 迭代器接口
………………………………………………………………… 214
3.4.3 算法的接口
………………………………………………………………… 219
3.5 哈希表
………………………………………………………………………… 225
3.5.1 問(wèn)
題 …………………………………………………………………… 225
3.5.2 哈希表的類型
……………………………………………………………… 229
3.5.3 哈希表的實(shí)現(xiàn)
……………………………………………………………… 231
3.6 隊(duì)列 ADT ……………………………………………………………………… 240
3.6.1 建立抽象
…………………………………………………………………… 240
3.6.2 建立接口
…………………………………………………………………… 240
3.6.3 實(shí)現(xiàn)與使用接口
…………………………………………………………… 243
第4章 面向?qū)ο缶幊?hellip;…………………………………………………………… 252
4.1 OO 思想
……………………………………………………………………… 252
4.1.1 職責(zé)轉(zhuǎn)移
…………………………………………………………………… 252
4.1.2 OO 機(jī)制
…………………………………………………………………… 254
4.1.3 OO 收益
…………………………………………………………………… 255
4.2 類與對(duì)象
……………………………………………………………………… 256
4.2.1 對(duì)
象 …………………………………………………………………… 256
4.2.2 類
………………………………………………………………………… 258
4.2.3 封
裝 …………………………………………………………………… 262
4.3 繼承與多態(tài)
…………………………………………………………………… 268
4.3.1 抽
象 …………………………………………………………………… 268
4.3.2 繼
承 …………………………………………………………………… 269
4.3.3 職責(zé)驅(qū)動(dòng)設(shè)計(jì)
……………………………………………………………… 272
4.3.4 多態(tài)性
…………………………………………………………………… 276
4.4 虛函數(shù)
………………………………………………………………………… 279
4.4.1 二叉樹(shù)
…………………………………………………………………… 279
4.4.2 表達(dá)式算術(shù)樹(shù)
……………………………………………………………… 280
4.4.3 虛函數(shù)
…………………………………………………………………… 288
4.5 狀態(tài)機(jī)
………………………………………………………………………… 292
4.5.1 有限狀態(tài)機(jī)
………………………………………………………………… 292
4.5.2 State模式
………………………………………………………………… 296
4.5.3 動(dòng)作類
…………………………………………………………………… 306
4.6 框架與重用
…………………………………………………………………… 308
4.6.1 框
架 …………………………………………………………………… 308
4.6.2 契
約 …………………………………………………………………… 309
4.6.3 建立契約
…………………………………………………………………… 310
4.6.4 框架與重構(gòu)
………………………………………………………………… 311
參 考 文 獻(xiàn)…………………………………………………………………………… 313