軟件工程之結(jié)對(duì)編程親歷記
作為程序員的你,不知道曾經(jīng)是否嘗試過這樣一種開發(fā)模式:你有一個(gè)伙伴,你們坐在一起,并肩作戰(zhàn),面對(duì)著同一臺(tái)顯示器,使用著同一鍵盤,同一個(gè)鼠標(biāo),你們一起思考,一起分析,一起編程。如果你嘗試過,那你可以繼續(xù)讀下去,看看我們是不是有同樣的感受;如果你沒有嘗試過,那你更應(yīng)該讀下去,因?yàn)檫@篇文章將會(huì)帶你體會(huì)這種編程模式,帶你走進(jìn)結(jié)對(duì)編程的世界。
下面,我就來講講我所經(jīng)歷的結(jié)對(duì)編程吧。
這次結(jié)對(duì)項(xiàng)目的名稱為“學(xué)術(shù)會(huì)議的展示”,即在原有的微軟學(xué)術(shù)地圖的基礎(chǔ)上,添加學(xué)術(shù)會(huì)議的信息及地理位置顯示。這是一個(gè)不大不小的項(xiàng)目,兩個(gè)人共同花了9天的時(shí)間,在完成基本功能并保證穩(wěn)定性的同時(shí),添加了一些華麗的界面元素,總的來講,感覺不錯(cuò)。
因?yàn)槭擒浖こ?,所以我們要從工程的角度出發(fā),在正式開始之前,要制定好自己的計(jì)劃。對(duì)于一項(xiàng)工程,我們會(huì)有一個(gè)期望的結(jié)果,稱之為Goal。為了實(shí)現(xiàn)這個(gè)Goal,我們會(huì)做許許多多的小工作,將這些小工作全部整合起來,就成了我們的項(xiàng)目。因此,我們首先要做的就是將項(xiàng)目細(xì)化為這樣一個(gè)一個(gè)的小工作,這一步我們稱之為WBS(Work Breakdown Structure)。
對(duì)于我們的項(xiàng)目——學(xué)術(shù)會(huì)議的展示,我們把他分成了三個(gè)部分,其中每個(gè)部分又分成數(shù)個(gè)小任務(wù)。
1、 將會(huì)議顯示在地圖上
2、 界面設(shè)計(jì)及事件
3、 會(huì)議搜索
以下是任務(wù)的細(xì)分及對(duì)任務(wù)完成的時(shí)間估計(jì)和實(shí)際完成時(shí)間。
1、 將會(huì)議顯示在地圖上
?。?) 獲取會(huì)議基本信息,如舉辦時(shí)間,全名,縮寫,地點(diǎn),學(xué)科方向等等。
估計(jì)完成時(shí)間:2小時(shí) 實(shí)際完成時(shí)間:2小時(shí)
?。?) 數(shù)據(jù)處理,如計(jì)算會(huì)議的總發(fā)表論文數(shù)及被引用數(shù),并對(duì)其排名
估計(jì)完成時(shí)間:1小時(shí) 實(shí)際完成時(shí)間:2小時(shí)
在這一步中,我們?yōu)榱朔奖?,并沒有將所有數(shù)據(jù)都獲取下來,然后離線處理,而是直接編寫SQL語句實(shí)現(xiàn)。不過由于數(shù)據(jù)量還是太大,而且中途遇到過不少bug如數(shù)據(jù)重復(fù)問題,分學(xué)科統(tǒng)計(jì)問題,前前后后花費(fèi)了我們兩個(gè)小時(shí)的時(shí)間。
(3) 獲取會(huì)議舉辦地點(diǎn)的經(jīng)緯度
估計(jì)完成時(shí)間:1小時(shí) 實(shí)際完成時(shí)間:1小時(shí)
?。?) 編寫WCF通信服務(wù)將以上獲取的數(shù)據(jù)從網(wǎng)站服務(wù)器傳送給應(yīng)用程序端
估計(jì)完成時(shí)間:1小時(shí) 實(shí)際完成時(shí)間:4小時(shí)
在這一步中我們終究還是低估了在編寫Silverlight-WCF通信程序時(shí)可能遇到的各種問題,一個(gè)簡簡單單的跨域問題足足折騰了我倆四個(gè)小時(shí)時(shí)間,東測(cè)試西測(cè)試,沒找到問題之所在,最終在網(wǎng)絡(luò)上找到解決方案。
?。?) 根據(jù)第二步所獲取的會(huì)議排名,將會(huì)議顯示在地圖上
估計(jì)完成時(shí)間:2小時(shí) 實(shí)際完成時(shí)間:1小時(shí)
這一步作為最關(guān)鍵的一步,我們分配了兩個(gè)小時(shí),其實(shí)實(shí)現(xiàn)起來無非是按部就班,因此很快便完成了。
2、 界面設(shè)計(jì)及事件
?。?) 設(shè)計(jì)會(huì)議展示界面
估計(jì)完成時(shí)間:2小時(shí) 實(shí)際完成時(shí)間:5小時(shí)
界面設(shè)計(jì)永遠(yuǎn)是沒有***的,因?yàn)槊總€(gè)人的看法都是不一樣的。在這一環(huán)節(jié)上,我與我的partner看法產(chǎn)生了分歧,最終采用的他的設(shè)計(jì)方法。事實(shí)證明做設(shè)計(jì)也是需要時(shí)間的,前后足足花費(fèi)了我們5個(gè)小時(shí),終于設(shè)計(jì)出了還看的過去的一個(gè)面板。
?。?) 從微軟學(xué)術(shù)搜索API獲取所需數(shù)據(jù)并在所設(shè)計(jì)面板上顯示出來
估計(jì)完成時(shí)間:2小時(shí) 實(shí)際完成時(shí)間:2小時(shí)
(3) 為界面添加超鏈接及鼠標(biāo)事件
估計(jì)完成時(shí)間:3小時(shí) 實(shí)際完成時(shí)間:5小時(shí)
之前一直使用TextBlock或TextBox,界面難看且不靈活,于是打算自己設(shè)計(jì)界面。設(shè)計(jì)到一半,突然發(fā)現(xiàn)在Silverlight 4中richTextBox成為了系統(tǒng)組件,這為我們界面的顯示提供了很大的便利,但也豐富了我們的想法,讓我們?cè)谏厦鎸?shí)現(xiàn)了更多的東西,超過了原有的預(yù)期的時(shí)間,但結(jié)果還是令人較為滿意的。
3、 會(huì)議搜索
?。?) 自動(dòng)補(bǔ)全搜索框的實(shí)現(xiàn)
估計(jì)完成時(shí)間:1小時(shí) 實(shí)際完成時(shí)間:2小時(shí)
(2) 根據(jù)機(jī)構(gòu)名定位到指定回憶舉辦地并顯示其詳細(xì)信息
估計(jì)完成時(shí)間:1小時(shí) 實(shí)際完成時(shí)間:0.5小時(shí)
以上就是我們?cè)敿?xì)工作的時(shí)間劃分,但實(shí)際上我們更多的時(shí)間奉獻(xiàn)給了討論與修正bug以及最終與他人項(xiàng)目的合并工作。這是每一個(gè)人都可能會(huì)遇到的問題,怎么處理好這些問題也是對(duì)我們很大的考驗(yàn)。
上面介紹完了基本的任務(wù),下面就是具體的實(shí)施結(jié)果了。
項(xiàng)目完成之前的界面,大家可以看這里:http://academic.research.microsoft.com/academicmap
我們的結(jié)果:
1、 查看
在左邊欄中,可以選擇Conference,然后我們便可以在地圖上看到看學(xué)術(shù)會(huì)議。每一個(gè)圓點(diǎn)代表一個(gè)會(huì)議,根據(jù)這個(gè)會(huì)議總共發(fā)表的論文數(shù),這個(gè)會(huì)議的原點(diǎn)會(huì)有不同的大小和不同的顏色。在左邊可以通過學(xué)科方向和會(huì)議時(shí)間來篩選。
2、 界面
將鼠標(biāo)移動(dòng)到會(huì)議圓點(diǎn)上,我們可以看到詳細(xì)的關(guān)于會(huì)議的信息,包括全名,縮寫,年份,發(fā)表論文數(shù)及被引用數(shù),舉辦城市等等信息。
當(dāng)我們點(diǎn)擊圓點(diǎn)以后,會(huì)彈出如下圖所示的面板。這是會(huì)議信息展示的主界面,在這上面,我們一個(gè)劃分額四個(gè)區(qū)域。
?。?) 左上角為當(dāng)前會(huì)議信息,當(dāng)點(diǎn)擊標(biāo)題后,會(huì)打開新頁面跳轉(zhuǎn)到微軟學(xué)術(shù)搜索相關(guān)會(huì)議的界面。
?。?) 右上角為該會(huì)議所感興趣的學(xué)科領(lǐng)域。
?。?) 左下角為該會(huì)議在不同年份的信息,每一條信息都是建立在一個(gè)按鈕之上,因此當(dāng)鼠標(biāo)點(diǎn)擊時(shí),在地圖我們就會(huì)跳轉(zhuǎn)到相應(yīng)的位置及顯示相關(guān)的信息。
?。?) 右下角同樣是該會(huì)議的相關(guān)信息,包括會(huì)議的主頁,會(huì)議的前三條關(guān)鍵字,以及會(huì)議上最出名的三個(gè)作者(按被引用數(shù)排名)。每條信息都是一個(gè)超鏈接,當(dāng)你點(diǎn)擊時(shí)會(huì)打開新頁面顯示相關(guān)的信息。
3、 搜索
當(dāng)進(jìn)入會(huì)議視圖后,我們會(huì)看到下面的搜索欄
下面輸入我們想查詢的關(guān)鍵字,以IEEE為例
搜索框自動(dòng)補(bǔ)全了我們想要搜索的信息,當(dāng)我們選中時(shí),地圖就會(huì)跳轉(zhuǎn)到相應(yīng)的回憶舉辦地并顯示如2.種所示的界面。
以上就是我們的結(jié)果,怎么樣,從效果上看,還不錯(cuò)吧。
介紹完我們的項(xiàng)目,還是回到結(jié)對(duì)編程上來。這是我***次體驗(yàn)這樣的編程模式,這種模式到底好與不好,我只能說,因人而異吧。
不可否認(rèn),這樣一種編程模式其好處是顯而易見的。作為一個(gè)driver,在編程的同時(shí),你總會(huì)想著你旁邊還有一個(gè)人,這樣你就會(huì)格外的認(rèn)真,注意每一段代碼的格式,按照統(tǒng)一的規(guī)范來寫。作為一個(gè)navigator,你會(huì)時(shí)刻關(guān)注你旁邊的人寫的代碼,思維在不停的運(yùn)作,在寫的同時(shí)進(jìn)行著復(fù)審,在起到監(jiān)督的同時(shí)也提高了代碼質(zhì)量,減少了復(fù)審所需要的時(shí)間,不用事后再去花大精力閱讀代碼,因?yàn)樵趯懙臅r(shí)候你已經(jīng)對(duì)代碼非常了解了。每當(dāng)一個(gè)人獨(dú)自寫程序時(shí),如果任務(wù)不是那么的緊,我們很容易出現(xiàn)懈怠的情緒,這時(shí)我們可能會(huì)打開人人、微薄這種東西來打發(fā)消遣一下。當(dāng)兩個(gè)人共同工作時(shí),你浪費(fèi)你自己的時(shí)間不要緊,但你浪費(fèi)他人的時(shí)間就說不過去了。
話說回來,世上人與人之間總是存在差異的,而不像機(jī)器那樣由程序統(tǒng)一控制。當(dāng)兩個(gè)人的思維發(fā)生碰撞時(shí),有時(shí)也許會(huì)融合并誕生出更好的想法,有時(shí)恐怕就會(huì)出現(xiàn)爆炸,令雙方都不太愉快。如果讓兩個(gè)編程習(xí)慣及審美觀差別極大的人結(jié)對(duì)完成一個(gè)項(xiàng)目,那可想這個(gè)過程會(huì)是多么糟糕,基本在爭吵中度過,這樣能夠?qū)懞贸绦騿???dāng)兩個(gè)人的技術(shù)水平差別過大時(shí),一人嫌另一人效率低,另一人則感覺被輕視,越發(fā)懈怠,這有基本成了一個(gè)人的工作了,而且兩人也不愉快。同時(shí),這也許項(xiàng)目的選題相關(guān),有些項(xiàng)目需要個(gè)人思考去解決問題,有些項(xiàng)目需要大家討論來解決問題。有的人不喜歡旁邊有人看著,有的人不喜歡總是看別人而自己不動(dòng)手,這些都會(huì)成為結(jié)對(duì)編程的限制條件。因此,在結(jié)對(duì)編程前,我們應(yīng)該確定合適的選題,并且兩人不能太陌生,技術(shù)水平不能差別太大,要互相認(rèn)可對(duì)方。有相同的認(rèn)可,相同的興趣,合適的選題,充分的熱情,然后兩人結(jié)對(duì)進(jìn)行開發(fā),這樣才能發(fā)揮出結(jié)對(duì)編程應(yīng)有的功效,不至于將大量時(shí)間浪費(fèi)在無謂的爭吵上。
結(jié)對(duì)編程真的能夠帶來1+1>2的效果嗎?我認(rèn)為這很大程度上取決于我們自己的規(guī)劃,因?yàn)楹芏鄷r(shí)候,我們需要自己獨(dú)立的思考,去實(shí)現(xiàn)一些想法,并不需要兩個(gè)人一天從早到晚一直坐在一起,面對(duì)著同一臺(tái)顯示器,一起思考,一起設(shè)計(jì)。
下面介紹一下我的隊(duì)友林榕城。從三明治的角度出發(fā)——他是個(gè)技術(shù)能力非常強(qiáng)的人,有著強(qiáng)大的想象力,但是這些想象力往往會(huì)超出我們的實(shí)際能力,認(rèn)為任何問題都很簡單,從而造成一種心有余而力不足的景象,比較追求華麗,這與我所認(rèn)可的簡約美產(chǎn)生了分歧,不過,他確實(shí)是一個(gè)非常好的隊(duì)友,追求卓越,為我們的項(xiàng)目做出了非常多的貢獻(xiàn),并且工作積極,很大程度上督促著我,同時(shí)也糾正了我的許多編程毛病,給了我很大幫助。
***,來一張?jiān)鄣暮险眨?/p>
照片上,我是一名driver,但更多的時(shí)候,我充當(dāng)著一名navigator。
結(jié)對(duì)編程,你明白了嗎?
原文鏈接:??http://www.cnblogs.com/foster/archive/2011/08/29/2158082.html??
【編輯推薦】