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