一 、編程精進(jìn)之法
“敏捷”之TDD
TDD(全稱Test Driven Development)測試驅(qū)動(dòng)開發(fā),是一種軟件開發(fā)的流程,其由敏捷的“極限編程”引入。
開發(fā)過程是從功能需求的測試用例開始,先添加一個(gè)測試用例,然后運(yùn)行所有的測試用例看是否有問題,再實(shí)現(xiàn)測試用例所要測試的功能,然后再運(yùn)行測試用例,查看是否有case失敗,然后重構(gòu)代碼,再重復(fù)以上步驟。
其理念主要是兩件事:
- 確保所有的需求都能被照顧到。
- 在代碼不斷增加和重構(gòu)的過程中,可以檢查所有的功能是否正確。
“敏捷”之BDD
BDD:行為驅(qū)動(dòng)開發(fā)(Behavior Driven Development)
行為驅(qū)動(dòng)開發(fā)是一種敏捷軟件開發(fā)的技術(shù),它鼓勵(lì)軟件項(xiàng)目中的開發(fā)者、QA和非技術(shù)人員或商業(yè)參與者之間的協(xié)作。主要是從用戶的需求出發(fā),強(qiáng)調(diào)系統(tǒng)行為。BDD包括驗(yàn)收測試和客戶測試驅(qū)動(dòng)等的極限編程的實(shí)踐,作為對測試驅(qū)動(dòng)開發(fā)的回應(yīng)。
“敏捷”之ATDD
ATDD:驗(yàn)收測試驅(qū)動(dòng)開發(fā)(Acceptance Test Driven Development)
TDD 是開發(fā)人員的職責(zé),通過單元測試用例來驅(qū)動(dòng)功能代碼的實(shí)現(xiàn)。
在準(zhǔn)備實(shí)施一個(gè)功能或特性之前,首先團(tuán)隊(duì)需要定義出期望的質(zhì)量標(biāo)準(zhǔn)和驗(yàn)收細(xì)則,以明確而且達(dá)成共識的驗(yàn)收測試計(jì)劃(包含一系列測試場景)來驅(qū)動(dòng)開發(fā)人員的TDD實(shí)踐和測試人員的測試腳本開發(fā)。面向開發(fā)人員,強(qiáng)調(diào)如何實(shí)現(xiàn)系統(tǒng)以及如何檢驗(yàn)。
保證編程質(zhì)量,提高編程效率
任務(wù)列表法+PDCA
- 任務(wù)列表法:使任務(wù) 完全窮盡 與 各自獨(dú)立
- PDCA是Plan-Do-Check-Action四個(gè)詞的組合。是著名的戴明環(huán)。從計(jì)劃開始,經(jīng)過實(shí)踐,再反思,產(chǎn)生的改進(jìn)行動(dòng)再納入下一輪計(jì)劃的持續(xù)改進(jìn)過程。
plan:任務(wù)列表法(預(yù)估時(shí)間)
do:做可以check的事情(計(jì)時(shí)完成任務(wù))
check:反思計(jì)劃與實(shí)際的差距(對比時(shí)間,反思)
action:在反思后采取改進(jìn)措施(針對反思要采取的措施)
二 、像機(jī)器一樣思考
Analytical Thinking(按照輸入輸出 對問題進(jìn)行分解)
思考過程:
- 分解問題
- 找到子問題之間的關(guān)聯(lián)(通過輸入輸出關(guān)聯(lián)起來)
- 找到問題的邊界,明確假設(shè)與結(jié)果
數(shù)據(jù)類型與結(jié)構(gòu)
類的結(jié)構(gòu)表達(dá)對比:
JS
{
name: String,
age: Number,
children: [{
name: String,
age: Number
}]
}
JAVA
Person {
name: String,
age: Number,
children: [Person]
}
分析問題的基本原則:完全窮盡,各自獨(dú)立。
各自獨(dú)立,是指,在劃分任務(wù)的過程中,每一個(gè)任務(wù)都對應(yīng)一個(gè) 代碼塊 或一個(gè) 函數(shù) ,這些代碼塊和函數(shù),是互相不包含的(不是不依賴,Exclusive不是Independent)
完全窮盡,是指,需要窮盡這個(gè)代碼塊或函數(shù)里 所有的輸入和輸出 。不能遺漏任何一個(gè)輸入,任何一個(gè)輸出。每一項(xiàng)的 屬性 也不能有遺漏
一圖抵千言部分
畫圖的規(guī)則
我們的畫圖方法受時(shí)序圖啟發(fā)而發(fā)明,具體的規(guī)則如下:
1 圖中基本元素由方塊和帶箭頭的線組成
2 一個(gè)方塊只代表一個(gè)函數(shù)或一個(gè)代碼塊,通常是函數(shù),方塊中可以寫字,可以表達(dá)函數(shù)是屬于哪個(gè)類或哪個(gè)實(shí)例等信息。
3 指向方塊的線代表該函數(shù)的輸入,背離方塊的線代表函數(shù)的輸出。
4 數(shù)據(jù)流動(dòng)的時(shí)間軸遵守先從左到右,再從上到下的順序。
5 每一對輸入輸出(輸入在上,輸出在下)加一個(gè)方塊,表達(dá)了一次函數(shù)調(diào)用。
測試驅(qū)動(dòng)的任務(wù)切分
按照模塊的分析方法拆分成任務(wù)時(shí)比較復(fù)雜的話,我們可以按照測試的角度來切分成任務(wù)。這個(gè)思維的切換是TDD的核心。我們需要按照測試的視角來切分任務(wù),從一個(gè)函數(shù)的實(shí)現(xiàn)視角轉(zhuǎn)為一個(gè)函數(shù)的調(diào)用視角。
測試視角的優(yōu)點(diǎn):
1 封裝復(fù)雜性,按照模塊去拆分的時(shí)候,復(fù)雜性會(huì)變高,思考負(fù)擔(dān)會(huì)加大。而按照測試的視角來切分,復(fù)雜性當(dāng)然不會(huì)消失,但是被封裝了,方便我們在分析的時(shí)候減少思考負(fù)擔(dān)。
2 跳出盒子外來看盒子的視角。我們在畫前面的圖的時(shí)候,實(shí)際上是在我們要實(shí)現(xiàn)的這個(gè)程序內(nèi)在看,完全沒有使用者的視角,也就是所謂的在盒子內(nèi)。當(dāng)我們站在測試的視角看的時(shí)候,我們就跳出了盒子外,他更容易讓我們發(fā)現(xiàn)哪里可能設(shè)計(jì)上有問題,比如設(shè)計(jì)出的接口是不是好用。
3 在TWs有一個(gè)觀點(diǎn):叫做任務(wù)不是步驟。當(dāng)按步驟來考慮問題的時(shí)候,對怎么算做完這個(gè)問題的答案往往是模糊的(往往只落在行為上,而不是結(jié)果上)。只考慮函數(shù)實(shí)現(xiàn)的時(shí)候,也會(huì)有類似的問題,因?yàn)橐粋€(gè)數(shù)據(jù)類型包含的情況太多了,想到某種類型的數(shù)據(jù)我們就會(huì)停止思考當(dāng)前問題轉(zhuǎn)而去想其他問題,于是我們很容易漏掉一些情況,以測試角度看待任務(wù)會(huì)讓我們更容易看清楚我們的工作是不是真的做完了。
附 學(xué)習(xí)中遇到的專用詞:
-
migration腳本
每一個(gè)migrate的類都是 ActiveRecord::Migration 的子類,每一個(gè)migrate都要重寫兩個(gè)方法 up 和 down。Migrations提供了一系列的方法來操作數(shù)據(jù)庫,這些方法可以替代使用SQL來操作數(shù)據(jù)庫。(總之,是與MySQL數(shù)據(jù)庫有關(guān)的, 如何寫migration ) -
ORM框架
目前數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,ORM 主要是把數(shù)據(jù)庫中的關(guān)系數(shù)據(jù)映射為程序中的對象。
ORM框架采用元數(shù)據(jù)來描述對象一關(guān)系映射細(xì)節(jié),元數(shù)據(jù)一般采用XML格式,并且存放在專門的對象一映射文件中。
只要提供了持久化類與表的映射關(guān)系,ORM框架在運(yùn)行時(shí)就能參照映射文件的信息,把對象持久化到數(shù)據(jù)庫中。當(dāng)前ORM框架主要有三種:Hibernate,iBATIS,EclipseLink。 -
Jersey(軟件框架)
Jersey RESTful 框架是開源的RESTful框架, 實(shí)現(xiàn)了JAX-RS (JSR 311 & JSR 339) 規(guī)范。它擴(kuò)展了JAX-RS 參考實(shí)現(xiàn), 提供了更多的特性和工具, 可以進(jìn)一步地簡化 RESTful service 和 client 開發(fā)。它已經(jīng)是一個(gè)產(chǎn)品級的 RESTful service 和 client 框架。與Struts類似,它同樣可以和hibernate,spring框架整合。(是Java領(lǐng)域中開發(fā)REST式web服務(wù)的工具)
Jersey框架一:Jersey RESTful WebService框架簡介 -
SICP
《計(jì)算機(jī)程序的構(gòu)造和解釋》(Structure and Interpretation of Computer Programs, SICP)是一本關(guān)于計(jì)算機(jī)程序設(shè)計(jì)的總體性觀念的基礎(chǔ)教科書,由 MIT press 與 McGraw-Hill 共同出版營銷。
書中使用程序設(shè)計(jì)語言 Lisp 的方言 Scheme 來解釋計(jì)算機(jī)科學(xué)的核心概念,包括抽象(abstraction),遞歸(recursion),解釋器(interpreters),以及元語言抽象(metalinguistic abstraction)。《計(jì)算機(jī)程序的構(gòu)造和解釋(SICP)》討論的核心問題是什么? -
Rails
Rails框架首次提出是在2004年7月,它的研發(fā)者是26歲的丹麥人David Heinemeier Hansson。不同于已有復(fù)雜的Web 開發(fā)框架,Rails是一個(gè)更符合實(shí)際需要而且更高效的Web開發(fā)框架。Rails結(jié)合了PHP體系的優(yōu)點(diǎn)(快速開發(fā))和Java體系的優(yōu)點(diǎn)(程序規(guī)整)。Rails基于MVC(模型- 視圖- 控制器)設(shè)計(jì)模式。從視圖中的Ajax應(yīng)用,到控制器中的訪問請求和反饋,到封裝數(shù)據(jù)庫的模型,Rails 提供純Ruby的開發(fā)環(huán)境。發(fā)布網(wǎng)站時(shí),只需要一個(gè)數(shù)據(jù)庫和一個(gè)網(wǎng)絡(luò)服務(wù)器即可。 -
強(qiáng)類型 弱類型
編程語言分為強(qiáng)類型(比如Java,C#,Scala)和弱類型(比如JavaScript,Ruby,Python)