一 校哎、編程精進(jìn)之法
“敏捷”之TDD
TDD(全稱(chēng)Test Driven Development)測(cè)試驅(qū)動(dòng)開(kāi)發(fā),是一種軟件開(kāi)發(fā)的流程瞳步,其由敏捷的“極限編程”引入闷哆。
開(kāi)發(fā)過(guò)程是從功能需求的測(cè)試用例開(kāi)始,先添加一個(gè)測(cè)試用例谚攒,然后運(yùn)行所有的測(cè)試用例看是否有問(wèn)題阳准,再實(shí)現(xiàn)測(cè)試用例所要測(cè)試的功能,然后再運(yùn)行測(cè)試用例馏臭,查看是否有case失敗野蝇,然后重構(gòu)代碼,再重復(fù)以上步驟括儒。
其理念主要是兩件事:
- 確保所有的需求都能被照顧到绕沈。
- 在代碼不斷增加和重構(gòu)的過(guò)程中,可以檢查所有的功能是否正確帮寻。
“敏捷”之BDD
BDD:行為驅(qū)動(dòng)開(kāi)發(fā)(Behavior Driven Development)
行為驅(qū)動(dòng)開(kāi)發(fā)是一種敏捷軟件開(kāi)發(fā)的技術(shù)乍狐,它鼓勵(lì)軟件項(xiàng)目中的開(kāi)發(fā)者、QA和非技術(shù)人員或商業(yè)參與者之間的協(xié)作固逗。主要是從用戶(hù)的需求出發(fā)浅蚪,強(qiáng)調(diào)系統(tǒng)行為。BDD包括驗(yàn)收測(cè)試和客戶(hù)測(cè)試驅(qū)動(dòng)等的極限編程的實(shí)踐烫罩,作為對(duì)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的回應(yīng)惜傲。
“敏捷”之ATDD
ATDD:驗(yàn)收測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(Acceptance Test Driven Development)
TDD 是開(kāi)發(fā)人員的職責(zé),通過(guò)單元測(cè)試用例來(lái)驅(qū)動(dòng)功能代碼的實(shí)現(xiàn)贝攒。
在準(zhǔn)備實(shí)施一個(gè)功能或特性之前盗誊,首先團(tuán)隊(duì)需要定義出期望的質(zhì)量標(biāo)準(zhǔn)和驗(yàn)收細(xì)則,以明確而且達(dá)成共識(shí)的驗(yàn)收測(cè)試計(jì)劃(包含一系列測(cè)試場(chǎng)景)來(lái)驅(qū)動(dòng)開(kāi)發(fā)人員的TDD實(shí)踐和測(cè)試人員的測(cè)試腳本開(kāi)發(fā)隘弊。面向開(kāi)發(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ì)劃開(kāi)始咽扇,經(jīng)過(guò)實(shí)踐邪财,再反思舅列,產(chǎn)生的改進(jìn)行動(dòng)再納入下一輪計(jì)劃的持續(xù)改進(jìn)過(guò)程。
plan:任務(wù)列表法(預(yù)估時(shí)間)
do:做可以check的事情(計(jì)時(shí)完成任務(wù))
check:反思計(jì)劃與實(shí)際的差距(對(duì)比時(shí)間卧蜓,反思)
action:在反思后采取改進(jìn)措施(針對(duì)反思要采取的措施)
二 、像機(jī)器一樣思考
Analytical Thinking(按照輸入輸出 對(duì)問(wèn)題進(jìn)行分解)
思考過(guò)程:
- 分解問(wèn)題
- 找到子問(wèn)題之間的關(guān)聯(lián)(通過(guò)輸入輸出關(guān)聯(lián)起來(lái))
- 找到問(wèn)題的邊界把敞,明確假設(shè)與結(jié)果
數(shù)據(jù)類(lèi)型與結(jié)構(gòu)
類(lèi)的結(jié)構(gòu)表達(dá)對(duì)比:
JS
{
name: String,
age: Number,
children: [{
name: String,
age: Number
}]
}
JAVA
Person {
name: String,
age: Number,
children: [Person]
}
分析問(wèn)題的基本原則:完全窮盡弥奸,各自獨(dú)立。
各自獨(dú)立奋早,是指盛霎,在劃分任務(wù)的過(guò)程中,每一個(gè)任務(wù)都對(duì)應(yīng)一個(gè) 代碼塊 或一個(gè) 函數(shù) 耽装,這些代碼塊和函數(shù)愤炸,是互相不包含的(不是不依賴(lài),Exclusive不是Independent)
完全窮盡掉奄,是指规个,需要窮盡這個(gè)代碼塊或函數(shù)里 所有的輸入和輸出 。不能遺漏任何一個(gè)輸入姓建,任何一個(gè)輸出诞仓。每一項(xiàng)的 屬性 也不能有遺漏
一圖抵千言部分
畫(huà)圖的規(guī)則
我們的畫(huà)圖方法受時(shí)序圖啟發(fā)而發(fā)明,具體的規(guī)則如下:
1 圖中基本元素由方塊和帶箭頭的線(xiàn)組成
2 一個(gè)方塊只代表一個(gè)函數(shù)或一個(gè)代碼塊速兔,通常是函數(shù)墅拭,方塊中可以寫(xiě)字,可以表達(dá)函數(shù)是屬于哪個(gè)類(lèi)或哪個(gè)實(shí)例等信息涣狗。
3 指向方塊的線(xiàn)代表該函數(shù)的輸入谍婉,背離方塊的線(xiàn)代表函數(shù)的輸出。
4 數(shù)據(jù)流動(dòng)的時(shí)間軸遵守先從左到右镀钓,再?gòu)纳系较碌捻樞颉?br> 5 每一對(duì)輸入輸出(輸入在上穗熬,輸出在下)加一個(gè)方塊,表達(dá)了一次函數(shù)調(diào)用掸宛。
測(cè)試驅(qū)動(dòng)的任務(wù)切分
按照模塊的分析方法拆分成任務(wù)時(shí)比較復(fù)雜的話(huà)死陆,我們可以按照測(cè)試的角度來(lái)切分成任務(wù)。這個(gè)思維的切換是TDD的核心唧瘾。我們需要按照測(cè)試的視角來(lái)切分任務(wù)措译,從一個(gè)函數(shù)的實(shí)現(xiàn)視角轉(zhuǎn)為一個(gè)函數(shù)的調(diào)用視角。
測(cè)試視角的優(yōu)點(diǎn):
1 封裝復(fù)雜性饰序,按照模塊去拆分的時(shí)候领虹,復(fù)雜性會(huì)變高,思考負(fù)擔(dān)會(huì)加大求豫。而按照測(cè)試的視角來(lái)切分塌衰,復(fù)雜性當(dāng)然不會(huì)消失诉稍,但是被封裝了,方便我們?cè)诜治龅臅r(shí)候減少思考負(fù)擔(dān)最疆。
2 跳出盒子外來(lái)看盒子的視角杯巨。我們?cè)诋?huà)前面的圖的時(shí)候,實(shí)際上是在我們要實(shí)現(xiàn)的這個(gè)程序內(nèi)在看努酸,完全沒(méi)有使用者的視角服爷,也就是所謂的在盒子內(nèi)。當(dāng)我們站在測(cè)試的視角看的時(shí)候获诈,我們就跳出了盒子外仍源,他更容易讓我們發(fā)現(xiàn)哪里可能設(shè)計(jì)上有問(wèn)題,比如設(shè)計(jì)出的接口是不是好用舔涎。
3 在TWs有一個(gè)觀(guān)點(diǎn):叫做任務(wù)不是步驟笼踩。當(dāng)按步驟來(lái)考慮問(wèn)題的時(shí)候,對(duì)怎么算做完這個(gè)問(wèn)題的答案往往是模糊的(往往只落在行為上亡嫌,而不是結(jié)果上)嚎于。只考慮函數(shù)實(shí)現(xiàn)的時(shí)候,也會(huì)有類(lèi)似的問(wèn)題挟冠,因?yàn)橐粋€(gè)數(shù)據(jù)類(lèi)型包含的情況太多了匾旭,想到某種類(lèi)型的數(shù)據(jù)我們就會(huì)停止思考當(dāng)前問(wèn)題轉(zhuǎn)而去想其他問(wèn)題,于是我們很容易漏掉一些情況圃郊,以測(cè)試角度看待任務(wù)會(huì)讓我們更容易看清楚我們的工作是不是真的做完了价涝。
附 學(xué)習(xí)中遇到的專(zhuān)用詞:
-
migration腳本
每一個(gè)migrate的類(lèi)都是 ActiveRecord::Migration 的子類(lèi),每一個(gè)migrate都要重寫(xiě)兩個(gè)方法 up 和 down。Migrations提供了一系列的方法來(lái)操作數(shù)據(jù)庫(kù)持舆,這些方法可以替代使用SQL來(lái)操作數(shù)據(jù)庫(kù)色瘩。(總之,是與MySQL數(shù)據(jù)庫(kù)有關(guān)的逸寓, 如何寫(xiě)migration ) -
ORM框架
目前數(shù)據(jù)庫(kù)是關(guān)系型數(shù)據(jù)庫(kù)居兆,ORM 主要是把數(shù)據(jù)庫(kù)中的關(guān)系數(shù)據(jù)映射為程序中的對(duì)象。
ORM框架采用元數(shù)據(jù)來(lái)描述對(duì)象一關(guān)系映射細(xì)節(jié)竹伸,元數(shù)據(jù)一般采用XML格式泥栖,并且存放在專(zhuān)門(mén)的對(duì)象一映射文件中。
只要提供了持久化類(lèi)與表的映射關(guān)系勋篓,ORM框架在運(yùn)行時(shí)就能參照映射文件的信息吧享,把對(duì)象持久化到數(shù)據(jù)庫(kù)中。當(dāng)前ORM框架主要有三種:Hibernate譬嚣,iBATIS钢颂,EclipseLink。 -
Jersey(軟件框架)
Jersey RESTful 框架是開(kāi)源的RESTful框架, 實(shí)現(xiàn)了JAX-RS (JSR 311 & JSR 339) 規(guī)范拜银。它擴(kuò)展了JAX-RS 參考實(shí)現(xiàn)殊鞭, 提供了更多的特性和工具遭垛, 可以進(jìn)一步地簡(jiǎn)化 RESTful service 和 client 開(kāi)發(fā)。它已經(jīng)是一個(gè)產(chǎn)品級(jí)的 RESTful service 和 client 框架操灿。與Struts類(lèi)似锯仪,它同樣可以和hibernate,spring框架整合。(是Java領(lǐng)域中開(kāi)發(fā)REST式web服務(wù)的工具)
Jersey框架一:Jersey RESTful WebService框架簡(jiǎn)介 -
SICP
《計(jì)算機(jī)程序的構(gòu)造和解釋》(Structure and Interpretation of Computer Programs, SICP)是一本關(guān)于計(jì)算機(jī)程序設(shè)計(jì)的總體性觀(guān)念的基礎(chǔ)教科書(shū)趾盐,由 MIT press 與 McGraw-Hill 共同出版營(yíng)銷(xiāo)卵酪。
書(shū)中使用程序設(shè)計(jì)語(yǔ)言 Lisp 的方言 Scheme 來(lái)解釋計(jì)算機(jī)科學(xué)的核心概念,包括抽象(abstraction)谤碳,遞歸(recursion),解釋器(interpreters)溢豆,以及元語(yǔ)言抽象(metalinguistic abstraction)蜒简。《計(jì)算機(jī)程序的構(gòu)造和解釋?zhuān)⊿ICP)》討論的核心問(wèn)題是什么? -
Rails
Rails框架首次提出是在2004年7月漩仙,它的研發(fā)者是26歲的丹麥人David Heinemeier Hansson搓茬。不同于已有復(fù)雜的Web 開(kāi)發(fā)框架,Rails是一個(gè)更符合實(shí)際需要而且更高效的Web開(kāi)發(fā)框架队他。Rails結(jié)合了PHP體系的優(yōu)點(diǎn)(快速開(kāi)發(fā))和Java體系的優(yōu)點(diǎn)(程序規(guī)整)卷仑。Rails基于MVC(模型- 視圖- 控制器)設(shè)計(jì)模式。從視圖中的Ajax應(yīng)用麸折,到控制器中的訪(fǎng)問(wèn)請(qǐng)求和反饋锡凝,到封裝數(shù)據(jù)庫(kù)的模型,Rails 提供純Ruby的開(kāi)發(fā)環(huán)境垢啼。發(fā)布網(wǎng)站時(shí)窜锯,只需要一個(gè)數(shù)據(jù)庫(kù)和一個(gè)網(wǎng)絡(luò)服務(wù)器即可。 -
強(qiáng)類(lèi)型 弱類(lèi)型
編程語(yǔ)言分為強(qiáng)類(lèi)型(比如Java芭析,C#锚扎,Scala)和弱類(lèi)型(比如JavaScript,Ruby馁启,Python)