小步慢走: 如何分解怜姿?

小步慢走通過將一大步轉(zhuǎn)化為一系列的小步慎冤,一步一個(gè)腳印。每次只關(guān)注當(dāng)前這一步沧卢,使得每一步變得容易簡(jiǎn)單蚁堤,易于控制,降低出錯(cuò)概率但狭; 另一方面即使出錯(cuò)披诗,問題也不大,容易回退立磁。 這樣步子小呈队,出錯(cuò)少,返工少唱歧,反而效率更高宪摧,所謂慢就是快粒竖。

小步慢走

小步是一個(gè)相對(duì)概念,對(duì)每一個(gè)人理解都不一樣几于,也難于統(tǒng)一蕊苗,在軟件開發(fā)過程更是這樣子。為了更好的理解什么是小步沿彭,那么我們先看看什么是大步朽砰? 下面的例子,是否似曾相識(shí)

1. 編譯長(zhǎng)時(shí)間沒有通過喉刘。

2. 單元測(cè)試紅燈一直亮著瞧柔。

3. 發(fā)現(xiàn)思路錯(cuò)了,想回退饱搏,不知道從哪里開始非剃。 如果直接revert 太可惜。

4. 修改代碼推沸,測(cè)試失敗备绽,想不錯(cuò)所以然來。

5.? 常常需要IDE里面單步調(diào)試來定位錯(cuò)誤鬓催。這個(gè)說明代碼已經(jīng)超出你的大腦容量肺素,問題已經(jīng)接近失控,需要借助工具來幫助宇驾。

6.. 出現(xiàn)regression倍靡, 推測(cè)不出來是哪里修改導(dǎo)致的, 或者剛改的哪一行代碼课舍。

這些都是步子太大的的問題塌西。反之,如果將步子放小筝尾,每次改一點(diǎn)捡需,甚至是幾行代碼,驗(yàn)證筹淫,再修改再驗(yàn)證站辉,上面問題基本就可以解決掉。對(duì)自己而言這就是小步损姜。大家可以自行感受一下饰剥。

如果要步子小,關(guān)鍵是如何將大步分解為小步摧阅。 常規(guī)軟件里面的分解技術(shù)汰蓉,比如水平層分解,垂直流程分解逸尖,內(nèi)核加插件擴(kuò)展分解古沥,以及按照自治原則分解瘸右,如微服務(wù)。 這些的確可以將一個(gè)大問題岩齿,分解為一組模塊太颤;但是問題是模塊還是太大,對(duì)于日常開發(fā)在類盹沈,接口龄章,方法這個(gè)層面來說還是不夠小。


下面介紹幾種方法乞封,更好的指導(dǎo)在代碼級(jí)別分解:

1. 接口不變逐步生長(zhǎng)

軟件開發(fā)的很多時(shí)候是接口先定下來做裙,然后再逐步完善功能。典型的是算法問題肃晚,輸入輸出很清晰锚贱,接口確定下來而且基本不會(huì)變。 比如N-皇后問題关串,輸入是一個(gè)整數(shù)代表矩陣大小拧廊,輸出是代表有多少種布局。接口很容易定下來而且是不變的晋修。然后隨著test case增加吧碾,有簡(jiǎn)單變的復(fù)雜,功能也一點(diǎn)點(diǎn)的增強(qiáng)墓卦。


隨著測(cè)試用例增加倦春,軟件功能完善

比如8N后問題,可以這樣分解:

基于這個(gè)分解的一個(gè)實(shí)現(xiàn)在落剪,這里睁本。如果想看實(shí)現(xiàn)過程,可以在這里回放 ?忠怖。 這個(gè)是用TDD實(shí)現(xiàn)添履,借助cyber-dojo這個(gè)工具可以回放修改代碼的從過程。

另外一個(gè)例子脑又,可以判斷一個(gè)字符串是不是一個(gè)數(shù)字? 比如 1.2e5. 那么也可以分解為: 自然數(shù)锐借,整數(shù)问麸,浮點(diǎn)數(shù),帶有指數(shù)的浮點(diǎn)數(shù)钞翔。一個(gè)實(shí)現(xiàn)在這里严卖。?

其實(shí)這個(gè)軟件功能完善過程,如同軟件有一個(gè)內(nèi)核逐步長(zhǎng)大布轿,類似生長(zhǎng)過程哮笆。也就是我們軟件開發(fā)中的接口不變的增量開發(fā)来颤。但是現(xiàn)實(shí)往往不是這么簡(jiǎn)單,接口在成長(zhǎng)的過程也會(huì)發(fā)生變化稠肘。于是就有下面這個(gè)方法福铅。

2. 先適應(yīng)接口再增加新功能。

有些時(shí)候项阴,隨著test case的增加滑黔,會(huì)發(fā)現(xiàn)已有的接口不是那么合適。 這個(gè)時(shí)候需要修改接口环揽,才能再增加新功能略荡。 這個(gè)和我們經(jīng)常看到的增量開發(fā)演示圖有點(diǎn)不一樣歉胶。

增量開發(fā)汛兜,我們常常用下圖表示。

想象中的增量開發(fā)


? 但實(shí)際情況卻是下面這樣子的通今。為增加新功能而需要修改已有代碼和接口粥谬。

實(shí)際增量開發(fā)

這條規(guī)則是指,添加新功能時(shí)如果接口不匹配衡创,那么先修改接口使得接口匹配帝嗡,然后再加入新功能。將一大步分為兩步走璃氢,先是修改接口使得適應(yīng)新功能哟玷,然后再增加新功能代碼。


先修改接口再增加功能(一大步變兩小步)


? 3. 測(cè)試代碼和生產(chǎn)代碼不同時(shí)修改

TDD標(biāo)準(zhǔn)開發(fā)流程中每次迭代是先添加新測(cè)試用例一也,這時(shí)代碼或編譯不通過或者測(cè)試不通過巢寡;再添新加代碼,使得編譯通過椰苟,測(cè)試通過抑月; 然后重構(gòu);完成一次迭代反饋舆蝴,然后進(jìn)行下一次循環(huán)谦絮;這里面其實(shí)隱藏著一條規(guī)則,就是修改測(cè)試代碼的時(shí)候洁仗,不修改生產(chǎn)代碼层皱;修改生產(chǎn)代碼,不修改測(cè)試代碼赠潦。如下圖:

測(cè)試和代碼不同時(shí)修改

如果同時(shí)修改叫胖,那么到底是代碼的錯(cuò)還是測(cè)試的錯(cuò)呢?每次只修改測(cè)試代碼或者生產(chǎn)代碼她奥,如果出錯(cuò)瓮增,那么肯定是剛修改的代碼導(dǎo)致的怎棱,很容易找打問題。步子小好定位绷跑。


? ? ? ? 規(guī)則2 和規(guī)則3經(jīng)常在一起使用的拳恋。 如果已有的代碼是A,對(duì)應(yīng)測(cè)試集合是TA你踩。 現(xiàn)在要增加新功能使得軟件功能變?yōu)?B,TB), 也就是軟件從一個(gè)狀態(tài)變到另一個(gè)狀態(tài)诅岩,即(A, TA) ----> ( B , TB)带膜。 那么應(yīng)該怎么做吩谦?

(A , TA) 初始狀態(tài)

? (A1膝藕, TA) 修改接口A為A1式廷,為添加B功能做準(zhǔn)備. 測(cè)試集TA沒有變化保證新接口以及修改的代碼不會(huì)對(duì)已有功能產(chǎn)生副作用。

(A1, TA1)修改測(cè)試代碼芭挽,使得調(diào)用新接口滑废;

? ? ? ? ? ? ? ? ? ? 這個(gè)時(shí)候代碼A1,同時(shí)保留接口和新接口

? (B, TA1)刪除舊的接口袜爪, 這是代碼應(yīng)該已經(jīng)完全轉(zhuǎn)換到新接口蠕趁,即接口由A轉(zhuǎn)到B

(B, TB)為新功能B辛馆,添加新的測(cè)試用例TB

(B1俺陋, TB)添加代碼,通過新測(cè)試昙篙。此時(shí)狀態(tài)轉(zhuǎn)換完畢腊状。

4. TDD 黃金法則:

Uncle Bob 提出來TDD的開發(fā)原則:

You are not allowed to write any production code unless it is to make a failing unit test pass.

1、除非為了使一個(gè)失敗的unit test通過苔可,否則不允許編寫任何產(chǎn)品代碼

You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.

2.在一個(gè)單元測(cè)試中只允許編寫剛好能夠?qū)е率〉膬?nèi)容(編譯錯(cuò)誤也算失斀赏凇)

You are not allowed to write any more production code than is sufficient to pass the one failing unit test.

3、只允許編寫剛好能夠使一個(gè)失敗的unit test通過的產(chǎn)品代碼

這個(gè)所謂小步慢走的極限目標(biāo)焚辅,也就是增量實(shí)現(xiàn)的終極方式映屋。 但是實(shí)際中卻很難做到,很難做到如此精細(xì)分解的粒度同蜻,而且也難于衡量(什么是剛好)秧荆,也沒有考慮到重構(gòu)。 應(yīng)該根據(jù)自己的實(shí)際情況埃仪,步子盡可能小,理想狀態(tài)是一切都在掌握之中的感覺陕赃,才是恰到好處小步卵蛉。而不是刻意追求這個(gè)過程颁股,為了小步而小步而導(dǎo)致忘記初心。

下面兩個(gè)工具傻丝,可以幫你刻意練習(xí)甘有。?

1. cyber dojo。 這是一個(gè)TDD在線練習(xí)的工具葡缰。每次運(yùn)行代碼的時(shí)候才保存代碼亏掀。? 當(dāng)完成時(shí),可以回放自己的代碼修改過程泛释。 用交通燈顯示每次修改后代碼的狀態(tài)滤愕; 用黃色燈代表編譯沒通過,紅色代表測(cè)試失敗怜校,灰色代表測(cè)試運(yùn)行超時(shí)间影,綠色代表測(cè)試通過;記錄下來后茄茁,就可以用來可視化回放構(gòu)建過程魂贬。 如果一直黃燈,步子太大裙顽,編譯沒通過付燥;一直紅色,測(cè)試不通過愈犹,測(cè)試粒度太大键科; 同樣還記錄下來每次提交的時(shí)間,黃紅綠之間的切換甘萧,可以看到自己的編碼節(jié)奏萝嘁。 這樣可以直觀發(fā)現(xiàn)一些問題? 哪些步子邁的太大扬卷,可以再一次分解牙言,哪些做的好的。通過再次審視怪得,回顧咱枉,分析,總結(jié)徒恋;工具簡(jiǎn)單但是刻意練習(xí)的利器蚕断。


用cyber-dojo回放構(gòu)建過程

2.git-timer, 就是一個(gè)刻意練習(xí)的工具。 工作原理簡(jiǎn)單入挣,git-timer 監(jiān)控git repository亿乳,在一定的時(shí)間間隔檢測(cè)代碼(比如5分鐘), 如果編譯測(cè)試沒有通過,強(qiáng)制revert 代碼葛假; 如果編譯測(cè)試通過障陶,強(qiáng)制提交代碼;然后重新計(jì)時(shí)聊训。 如果代碼被revert掉 抱究,說明你的步子太大,將剛才的步驟細(xì)化带斑,再來一次鼓寺。 這樣的機(jī)制強(qiáng)制你小步慢走,同時(shí)按照一定的頻率慢走勋磕;

git-timer 練習(xí)開發(fā)的節(jié)奏





下一篇預(yù)告: 分解的原則 不重不漏妈候;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朋凉,隨后出現(xiàn)的幾起案子州丹,更是在濱河造成了極大的恐慌,老刑警劉巖杂彭,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓毒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡亲怠,警方通過查閱死者的電腦和手機(jī)所计,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來团秽,“玉大人主胧,你說我怎么就攤上這事∠扒冢” “怎么了踪栋?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)图毕。 經(jīng)常有香客問我夷都,道長(zhǎng),這世上最難降的妖魔是什么予颤? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任囤官,我火速辦了婚禮,結(jié)果婚禮上蛤虐,老公的妹妹穿的比我還像新娘党饮。我一直安慰自己,他們只是感情好驳庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布刑顺。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捏检。 梳的紋絲不亂的頭發(fā)上荞驴,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音贯城,去河邊找鬼。 笑死霹娄,一個(gè)胖子當(dāng)著我的面吹牛能犯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播犬耻,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踩晶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了枕磁?” 一聲冷哼從身側(cè)響起渡蜻,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎计济,沒想到半個(gè)月后茸苇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沦寂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年学密,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传藏。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腻暮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毯侦,到底是詐尸還是另有隱情哭靖,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布侈离,位于F島的核電站试幽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霍狰。R本人自食惡果不足惜抡草,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔗坯。 院中可真熱鬧康震,春花似錦、人聲如沸宾濒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至橘忱,卻和暖如春赴魁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钝诚。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工颖御, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凝颇。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓潘拱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拧略。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芦岂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文結(jié)構(gòu): 什么是 TDD 為什么要 TDD 怎么 TDD FAQ 學(xué)習(xí)路徑 延伸閱讀 什么是 TDD TDD 有...
    李浪溪_WaterLee閱讀 75,206評(píng)論 16 168
  • 做TDD是為什么? 關(guān)于TDD的概念垫蛆、工具禽最、技巧等,經(jīng)典的書籍材料可能介紹的更為全面細(xì)致袱饭。這篇文章想分享的是從一個(gè)...
    武可閱讀 2,601評(píng)論 2 21
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理川无,服務(wù)發(fā)現(xiàn),斷路器宁赤,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 德國(guó)啤酒在國(guó)內(nèi)比較流行舀透,人們喜歡直接用顏色區(qū)分不同的品種,比如紅决左、黃愕够、白、黑佛猛。其中白啤惑芭,指的就是小麥啤酒。 正宗的...
    漁人精釀閱讀 1,051評(píng)論 0 0
  • 裝飾器 decorator類裝飾器 帶參數(shù)的裝飾器 舉例(裝飾器函數(shù)继找;裝飾器類遂跟;有參與無參) https://fo...
    idri閱讀 340評(píng)論 0 0