今天參加了TW主辦的無壓無臭靜默編程活動(dòng)谷浅,早早起床頂著大風(fēng)去了公司秘血,9:30活動(dòng)正式開始即彪,大家自我介紹后紧唱,聽道長和主辦人王巖介紹本次活動(dòng)的主要內(nèi)容。
活動(dòng)分為5個(gè)迭代隶校,每個(gè)迭代40分鐘漏益,每個(gè)迭代圍繞不同的主題進(jìn)行結(jié)對(duì)編程,迭代結(jié)束后大家刪代碼惠况,進(jìn)行一個(gè)五到十分鐘的retro遭庶,最后有一個(gè)全天的總結(jié)。
four rules for simple design
緊接著志愿者介紹了four rules for simple design稠屠,大致意思是:
- 編寫單元測試峦睡,以最少的實(shí)現(xiàn)快速的讓測試跑通
- 消除重復(fù)
- 你的代碼應(yīng)該明確的表達(dá)你的意圖
- 只寫需要的功能,不要過度設(shè)計(jì)
加入TW之后权埠,對(duì)上述幾點(diǎn)感觸真的很深榨了,尤其是2,3攘蔽,4龙屉,這些輸入主要來源于我的buddy。
消除重復(fù)
我目前主要從事前端開發(fā)满俗,剛進(jìn)項(xiàng)目組的時(shí)候转捕,編寫一些和歷史組件雷同的組件,本應(yīng)在歷史組件上擴(kuò)展唆垃,我卻總想復(fù)制粘貼一份五芝,總覺得直接改原來的,萬一改掛了可咋辦辕万!
我buddy說:這是重復(fù)啊枢步,那你想想,這兩個(gè)組件基本一樣渐尿,其中一個(gè)的業(yè)務(wù)場景變了醉途,另一個(gè)是不是要變?那修改這段代碼的人就是雙倍的工作量砖茸,如果每個(gè)人都這樣做隘擎,讓你一個(gè)地方改10遍,給你你愿意嗎凉夯?
嗯嵌屎,有道理推正,所以重復(fù)是一定要被干掉的,不能老給別人挖坑呀宝惰。
寫能夠揭示意圖的代碼
前段時(shí)間寫代碼的時(shí)候植榕,用了奇奇怪怪的方法做了數(shù)據(jù)轉(zhuǎn)換,大致就是寫這段代碼的時(shí)候尼夺,只有我和上帝懂尊残,寫完了之后,就只有上帝懂.......當(dāng)時(shí)code review的時(shí)候還理直氣壯的覺得自己寫的沒錯(cuò)淤堵,就應(yīng)該這么寫寝衫。
直到后來,我buddy和我一起拐邪,以另一種思路慰毅,重寫了那部分代碼,條理之清楚讓我明白了扎阶,寫讓人能迅速讀懂的代碼是多么的重要汹胃。
此外,“揭示意圖”也體現(xiàn)在方法和變量的命名东臀,判斷條件的編寫着饥,好的命名可以讓閱讀代碼的人更容易理解代碼的意圖,這樣做的直接好處就是為后續(xù)維護(hù)提供便利惰赋。判斷條件盡量使用正向邏輯宰掉。雖然雙重否定表肯定,“我愛你”和“我怎么可能不愛”表達(dá)的意思相同赁濒,但是顯然前者更直觀轨奄,所以推薦使用肯定句。
拒絕過度設(shè)計(jì)
這點(diǎn)上我buddy給了我很大的啟發(fā)拒炎,大家都知道過度設(shè)計(jì)是不對(duì)的挪拟,如何有效避免過度設(shè)計(jì)才是關(guān)鍵。
使用TDD就是避免過度設(shè)計(jì)的有效方式枝冀,每一條需求都是一個(gè)單元測試,用測試來體現(xiàn)需求耘子,然后以最少的代碼讓測試跑通果漾,也就是只做測試需要的內(nèi)容,由結(jié)果推實(shí)現(xiàn)谷誓,當(dāng)然就不會(huì)過度設(shè)計(jì)了绒障。
你可能會(huì)說,不是所有代碼都有測試捍歪,那當(dāng)我們不寫測試的時(shí)候户辱,怎樣避免過度設(shè)計(jì)呢鸵钝?答案就是:先使用,再準(zhǔn)備庐镐。我們往往準(zhǔn)備一大堆東西恩商,真正使用的時(shí)候并不是所有的都會(huì)用到。其實(shí)可以反著來必逆,我知道我要C怠堪,C的前提是B,這個(gè)時(shí)候再去創(chuàng)造B名眉,以此類推粟矿,直到實(shí)現(xiàn)功能。
活動(dòng)才剛剛開始
10點(diǎn)的時(shí)候损拢,大家通過報(bào)數(shù)隨機(jī)匹配了小伙伴之后陌粹,開始了第一個(gè)迭代的內(nèi)容:乒乓結(jié)對(duì),最少代碼實(shí)現(xiàn)測試福压。和我的小伙伴分析了需求之后掏秩,第一回合我寫測試他來實(shí)現(xiàn),我的小伙伴來自一個(gè)金融公司隧膏,對(duì)數(shù)字比較敏感哗讥,在實(shí)現(xiàn)第一個(gè)測試的時(shí)候,他說:我們應(yīng)該先對(duì)傳進(jìn)來的數(shù)字做校驗(yàn)胞枕,對(duì)數(shù)字不合法的情況做處理杆煞。我想了想說道:我們現(xiàn)在是測試驅(qū)動(dòng)實(shí)現(xiàn),如果要做數(shù)字校驗(yàn)腐泻,那我們應(yīng)該有一個(gè)單元測試决乎,測試的內(nèi)容是如果輸入不合法,會(huì)返回什么結(jié)果∨勺現(xiàn)在題目的需求里沒有數(shù)字校驗(yàn)這一條构诚,所以我們不能寫數(shù)字校驗(yàn)的測試,也就不能寫數(shù)字校驗(yàn)的實(shí)現(xiàn)铆惑,對(duì)吧范嘱。(這些都是從我buddy那學(xué)的,嘿嘿學(xué)以致用)他若有所思的點(diǎn)點(diǎn)頭员魏,我們愉快的開始了40分鐘的“乒乓”丑蛤。
第二個(gè)迭代的主題是:無基本數(shù)據(jù)類型。這個(gè)階段我的角色是觀察員(每個(gè)迭代會(huì)有兩個(gè)與會(huì)者和志愿者一起當(dāng)觀察員撕阎,觀察并記錄看到的一些好的或不好的現(xiàn)象受裹,在迭代結(jié)束的時(shí)候和大家分享)。這個(gè)過程中我看到了很多東西,語言和語言的碰撞棉饶,java, js, python, 還有全世界最好的語言PHP厦章,大家互相指導(dǎo),互相學(xué)習(xí)照藻。想法和想法的碰撞袜啃,切磋,討論岩梳,互相說服囊骤,直到達(dá)成一致,開始擼碼冀值。
午飯之后稍事休息也物,開始了第三個(gè)迭代:無條件判斷,這個(gè)過程就是用繼承列疗,多態(tài)來消除一些條件判斷滑蚯。很巧的是和張鐵錘分到一組,于是和他學(xué)習(xí)了Python抵栈,但是沒寫多少東西告材,時(shí)間都用來討論了,畢竟太熟了古劲,兩個(gè)人都不愿意退讓......
第四個(gè)迭代的主題是:無副作用方法斥赋,這個(gè)也是我buddy跟我提了很多次的,你改變了方法以外的東西产艾,別人不看這個(gè)方法疤剑,不會(huì)知道你做了什么改變。這個(gè)過程中結(jié)識(shí)了一個(gè)從天津趕來的姑娘闷堡,也是學(xué)前端的隘膘,看起來小小的,真的很佩服她杠览,不畏距離和寒風(fēng)弯菊,想想自己早上7點(diǎn)多起床都擰巴的不行,覺得自己弱爆了踱阿」芮活動(dòng)結(jié)束后我們有聊過天,她很感謝這次活動(dòng)软舌,覺得TW的同事們都熱衷于分享才漆,她對(duì)TW充滿期待的同時(shí),我也對(duì)我們成為同事充滿期待葫隙。嘿栽烂,姑娘躏仇,我們要一起努力哦恋脚。
第五個(gè)迭代的主題是:不超過5行的方法腺办,由于時(shí)間關(guān)系,這個(gè)迭代被砍掉了糟描,大家一起做了討論和總結(jié)怀喉,由于活動(dòng)的內(nèi)容之前我基本都感受過,所以參加此次活動(dòng)的感受就是把一些思想強(qiáng)化了船响,不像鐵錘哥那樣充滿新鮮感躬拢,他對(duì)TDD贊不絕口,對(duì)和他一起結(jié)對(duì)的那位thoughtworker更是崇拜有加见间,回家后聊闯,好像變得更努力了呢。