最近在拜讀鄭曄的10x程序員工做法,收益良多,文中提出一個概念叫DoD(Definition of Done)給個人感觸頗深。這讓我聯想到實際工做過程當中,常常遇到的扯皮、爭吵等各類場景,其實就和這個DoD分不開。程序員
鄭曄在文中描述了這樣一種現象,相信有開發經歷的人多少有同感:單元測試
老張:這有一個任務須要完成,你看一下。小李:這個不難,兩天就能作完,兩天之後就能上線。
兩天之後,老張又來到小李的身邊驗收工做:測試
老張:怎麼樣,作完了嗎?今天能上線嗎?小李:個人代碼寫完了。老張:測試人員測過了嗎?小李:尚未。老張:那今天能測完嗎?小李:那我就不知道了。老張:什麼?我但是答應了業務的人,今天必定要上線的!
兩天之後,老張又來檢查工做。編碼
老張:這個功能開發完了嗎?小李:寫完了,你看我給你演示一下。
小李熟練地演示了這個新寫好的功能,此次老張很滿意:spa
老張:作得不錯。單元測試都寫了吧?小李:啊?還要寫單元測試嗎?老張:要不爲啥給你兩天的時間?
很明顯,老張有些憤怒,貌似總在挑刺,而小李也沒有偷懶、有些委屈。因而,老張、小李和測試人員一塊兒度過了一個不眠之夜。設計
根據上面的場景,我畫了兩幅小李和老張的思考圖,看下二者的代溝在哪兒,以下圖所示。代碼規範
很顯然二者對完成的定義各不相同。對開發人員小李來講,完成容易理解爲編碼完成;而不去考慮代碼測試和線上測試;對技術主管老張來講,完成的理解可能會更多一些,包括編碼,測試,代碼規範,審查,上線等等,有些老張腦子裏的東西更多,好比下圖所示:對象
爲何會有上面的差別?從立場來看,小李彙報的對象只有老張,而老張要協做的對象可能有產品經理、老闆、總監、小李們。小李是從我的層面,關注的是一個點,老張是從團隊層面,關注的是一個面。blog
各自定義差可能反應了一個信號,就是團隊成員總體上缺少職業素養,那麼這個團隊就危險了。從小李的角度不管怎麼努力,都不可能知足老張的需求,從老張的角度總以爲小李偷懶,致使團隊之間總是摩擦、挑刺,最後小李乾的不爽了,老張也以爲小李孺子不可教,最後事沒有作好,人跑了。接口
接下來就要回到做者提出的DoD概念(完成的定義),從這個概念的名字便不難看出,它就是爲了解決軟件開發中常見的「完成」問題而生的。
這裏的DoD在鄭曄看來包含三個層次的含義:
藉助這三個含義,我模擬登陸功能列了表格:
以上是站在測試用例的角度來寫,一個簡單的登陸就能夠包含18個開發功能點,作好登陸並無那麼簡單,這也就難怪小李和老張老是意見不一致。若是攤開這份清單用來驗收登陸功能的完整性,我相信小李和老張彼此都不會有什麼意見。
可是這裏有一個問題,就是老張根本不會去作這份清單!小李也沒有這種意識,那誰來擬定?也許你會說引入中間層,就是測試人員來擬定,假設大家團隊沒有測試人員呢?
事情老是沒有表面看起來的那麼簡單。這裏再設計一份簡化的驗收清單
如此簡化的功能也能多少避免小李和老張的鴻溝了吧?那麼又回到前面的問題,誰來製做這份清單?
我我的的意見是小李來作,由於小李的勢能沒有老張高,那就多增長本身的動能了,顯示本身作事的能力,同時也作一個同事眼中的好夥伴,領導眼中的好同事。等小李變成老李了,遇到小張也是小張來作這事。
鄭曄在最後又補充道:
至此,咱們只是從軟件開發團隊內部協做的角度來談 DoD。但實際上,它不只侷限在團隊內部協做上,若是你能夠放開思路,會發現 DoD 的思惟在工做中用途很是普遍。好比,當咱們須要和其餘團隊合做開發一個接口時,咱們都知道第一步就是要把接口定義下來。
這裏的DoD看起來很完美,定義了驗收清單,羅列了一系列驗收項目,並固化成文檔。可是,過程當中有幾個焦油坑須要去思考:
也許這須要團隊的磨合了,從老張角度若是這事不會死人,其實沒有必要去咄咄逼人,大不了後續進行迭代改進,不然逼得緊其實只會引發反彈,養成小李習慣性的逃避責任,造成團隊推卸責任的文化就得不償失了。
當咱們有了DoD的思惟方式,後面的事情也許會變得簡單不少,鄭曄舉了個小例子讓人折服:
1.常常會有人過來,讓我幫忙作些事。運用 DoD 的思惟,我首先會問他我具體要作哪些事,確認好細節(至關於定義好「檢查項」),而後我就知道,這個忙我能幫到什麼程度。2.我請別人幫忙的時候,也會很清楚告訴他,哪些事是須要他作的,儘可能減小沒必要要的誤解。
人與人的協做,總會存在理解上的誤差,如何去解決信息不一樣步的問題呢?DoD是一種最佳實踐,它是包含了檢查項的驗收清單,而如何作到「可檢查」須要雙方重點溝通。DoD從大了看是一種思惟模式,是一種儘量消除不肯定性,達成共識的方式。
借用鄭曄的一句話:「若是今天的內容你只能記住一件事,那請記住:在作任何事以前,先定義完成的標準。」