當開始接觸到結對程式設計這個名詞的時候,我很疑惑這是一個什麼樣的程式設計形式。當逐步深入讀了鄒欣老師《構建之法》第二版75頁4.5節之後,我不禁想起了一個這樣的畫面。在準備考研複試階段,我請了一位程式設計能力比我強人來指導我學習程式設計。當時做的是ACM水題,基礎的原因,只能從水體開始練習。開始時我坐在電腦前,他坐在我旁邊,他看著我進行程式設計。當遇到一個語法上的錯誤時,他記得清的就改正我,記不清的就叫我翻書,找到後又回來改程式碼。遇到演算法上的問題的時候,他在紙上給我畫一些草圖幫我屢屢思路。我還記得那是一道大數相加題,印象最深的是我不知道怎麼把一個整型換成字串,他說在後面加""就可以,於是問題解決了。
我想那個時候就已經開始接觸到結對程式設計。到現在他是我的室友,對於作業上的功能我不能總是麻煩他來幫我解決,我只能先自己動手找些資料過來先學習,等到要程式設計的時候我就叫他過來幫我看看。在結對程式設計中我體會到自己的思路會有很多侷限,這個時候聽指揮的才是正確的。往往一邊動手一遍動腦會很難把邏輯捋順,兩個人一起程式設計時,一個做駕駛員,一個做領航員;一個負責程式設計,一個負責指揮。
駕駛員想的是如何操作。敲程式碼是一個類似於游泳、騎自行車的工作,只有通過親身的感受和實踐才能一點點地學習其中的知識。還記得楊老師在開學初說的一段話,意思是不親自去騎一下自行車就怎麼也學不會。我通過自己的實踐,漸漸的領悟著這個過程。敲帶碼一定要親力親為。想起當初學游泳的時候也是同樣的道理。那時候個子很小,下到水池最淺的地方腳還夠不到底,我就把這岸沿亂蹬腿。等後來長大些,兩隻腳能夠到水池底了,膽子就稍大了點,於是撒開岸沿試著在水裡走了起來。等到再大點,家裡給我報了個游泳班,游泳班的第一節課就是讓每個學員在跳水的臺子上跳下去。要知道這個我以前從沒敢試過,最後還是被迫跳了下去。從那以後我就學會了換氣。慢慢的掌握了水性,後來一點點的學會了蛙泳、自由泳、仰泳。通過在水中的不斷實踐我能夠熟悉每個動作以及感受到每個動作在水中的阻力,我因此可以不斷的調整自己的姿勢以達到更好。程式設計的過程中也是這樣。通過自己的操作,我能夠感受到機器是不是認可我的做法,更明顯感覺到這點的是有時候我雖然不知道這個語法對不對,但是機器返回給我的是正確的,並且能夠返回給我想要的值。我回過頭來進行總結,這樣的學習使我覺得很靈活。
領航員想的是如何指揮。程式碼的確是通過手來敲出來的,但是沒有支配其行動的大腦,手也只能是亂忙。我感受到指揮是縱觀全域性,從清楚輸入什麼最後得到什麼,到每個語句執行通暢和簡潔。這其中每個環節都離不開一個指揮者的控制。打個比方,一次籃球賽結束後,指揮者叫同學們把桌子抬回去,要是指揮者沒有清楚的告訴誰把哪張桌子抬回哪個教室。要是學生素質很好自然有人來抬,不然可能只剩下指揮者自己抬回去了。所以指揮者清楚地洞察全域性,把每個細節的資訊傳遞給執行者,這個是一個有技術而且很值得推敲的工作。要想達到有效地傳遞資訊也並不是一件容易的事。我在指揮的時候懶得動手去指螢幕,就告訴室友你那裡少了一個等號。要是軟體給標識出來了室友找一下還能找到,可是大多數情況下室友都是拿滑鼠找完後問我在哪呢。讓執行者明白指揮者的想法,這仍需要勤加練習。
在結對程式設計過程,兩個人都有各自的承擔,要想把任務完成,兩個人都必須各司其職。在此過程中兩個的動手能力和思維能力都能夠得到提升。