通過昨天對(duì)老師的提問,也算是對(duì)一直以來的困惑和思考做了個(gè)總結(jié)。
敏捷開發(fā)是一種內(nèi)涵非常豐富的思想,面向用戶,面向需求,而不是面向模塊。而TDD則是一種卓有成效地提高工作效率的辦法,與敏捷相輔相成。
接下來,結(jié)合本人最近項(xiàng)目上的一些經(jīng)驗(yàn)和教訓(xùn),來做一個(gè)深入的總結(jié)和反思吧~
關(guān)于敏捷,面向需求和面向模塊究竟有什么區(qū)別呢?
以目前的經(jīng)驗(yàn)為例,作為一個(gè)用戶量巨大的后臺(tái),按照模塊來分,有測(cè)試模塊,面向數(shù)據(jù)庫(kù)的模塊,面向緩存的模塊和面向前端的模塊。如果按照模塊來分工合作的話,會(huì)出現(xiàn)的問題是,接口的負(fù)責(zé)人很難提供其他模塊所需要的特定功能,很難知道自己的接口在其他模塊究竟是怎樣運(yùn)行的,發(fā)揮著什么樣的作用。倘若嘗試解決這些問題,溝通的成本是昂貴的,需要給出的API文檔的工作量和需要的時(shí)間成本同樣很高,但是需要更新甚至返工的概率是很大的。那么按照需求來分工的話,則是功能的開發(fā)者對(duì)所需要的模塊接口進(jìn)行全局的設(shè)計(jì)和實(shí)現(xiàn),在已有的可擴(kuò)展性較高的接口基礎(chǔ)之上,為需求進(jìn)行專屬的擴(kuò)展。事實(shí)上有經(jīng)驗(yàn)的對(duì)業(yè)務(wù)進(jìn)展十分清楚的程序員會(huì)能夠在最初設(shè)計(jì)接口是就考慮接口的通用性,為后來的接口擴(kuò)展提供便利,但多數(shù)情況下還是按照功能,定制地去拓展接口。
這種情況下對(duì)程序員的挑戰(zhàn)是大于以往的,一方面,前期的結(jié)構(gòu)對(duì)于后期功能的拓展可能會(huì)是一種阻礙,很可能需要全部重來。如果接口的可拓展性極差,或者架構(gòu)對(duì)后期的功能的添加會(huì)產(chǎn)生大量負(fù)面影響而需要重新設(shè)計(jì),推翻重來是不可避免的。所以這是十分需要經(jīng)驗(yàn)的,現(xiàn)代軟件開發(fā)流程的科學(xué)化使得很多公司有專門的架構(gòu)師,這類人所承擔(dān)的責(zé)任通常是巨大的,就我現(xiàn)在的感受而言,架構(gòu)師應(yīng)該不僅僅是面向開發(fā)團(tuán)隊(duì)的,同時(shí)也是面向用戶的。在我們這次實(shí)踐中,SM便是這樣的一種角色,而PO更像是用戶和SM之間的橋梁。如果SM缺乏面向用戶的意識(shí),整個(gè)團(tuán)隊(duì)的代價(jià)是無法真正實(shí)現(xiàn)敏捷的,開發(fā)過程中遇到的阻礙也可能會(huì)變多。另一方面,是對(duì)編程技能的要求更高,需要更加全面的編程知識(shí)。譬如,一個(gè)后臺(tái)程序員,除了要對(duì)前端有所了解,對(duì)于算法,數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)底層,操作系統(tǒng)性能等方面都比較熟悉,否則同樣是無法敏捷的。也就是說,對(duì)于一個(gè)整體的功能,任何拿到部分功能的程序員,都應(yīng)當(dāng)具備實(shí)現(xiàn)全局功能的編程能力,同時(shí)也意味著不同的人是需要操作相同的模塊的。
關(guān)于測(cè)試,什么樣的測(cè)試才是系統(tǒng)測(cè)試呢?
還是結(jié)合自身經(jīng)歷來思考。對(duì)于一個(gè)面向前端的登錄接口,我們獲得前端的輸入,返回其想要的結(jié)果,我們不需要關(guān)心用戶信息是否寫入了數(shù)據(jù)庫(kù)或緩存,不需要關(guān)心返回值是如何計(jì)算的,這個(gè)過程中可能出現(xiàn)的錯(cuò)誤等。我們的測(cè)試是不依賴于實(shí)現(xiàn)的。那么單元測(cè)試呢?我的理解是,單元測(cè)試時(shí)關(guān)注實(shí)現(xiàn)的,譬如我的需求,a+b+c,實(shí)現(xiàn)者利用了函數(shù)sum(a,b,c,),過程需要函數(shù)add(x,y),系統(tǒng)只關(guān)心初值和終值,單元卻還會(huì)關(guān)心過程中的兩次add,他需要知道實(shí)現(xiàn),才能確認(rèn)實(shí)現(xiàn),進(jìn)而測(cè)試實(shí)現(xiàn)來保證最終結(jié)果。
那么,TDD是什么,又如何應(yīng)用呢?
TDD,所謂測(cè)試驅(qū)動(dòng)開發(fā),那么一定是測(cè)試現(xiàn)行。TDD的過程中,我們需要的是專注于一個(gè)需求的開發(fā),直到測(cè)試通過。這里我說針對(duì)一個(gè)需求,我想強(qiáng)調(diào)的,這里的測(cè)試,應(yīng)當(dāng)是不依賴于實(shí)現(xiàn)的系統(tǒng)測(cè)試,而不是單元測(cè)試。否則,TDD將難以展開。
大多數(shù)情況下,開發(fā)者會(huì)先開發(fā)再測(cè)試,很可能出現(xiàn)的一種情況是,過程中一系列的單元測(cè)試都是通過的,但最終的功能依舊無法保證,這時(shí)再開展系統(tǒng)測(cè)試,可以說是比較耗費(fèi)時(shí)間的,畢竟,原本你的目標(biāo)可以變成:通過眼前這一項(xiàng)測(cè)試。
先這么多吧~期待后面會(huì)有更多不一樣的感受。