很久不寫代碼,發現寫代碼的習慣有點變化了。以前基本都是把一個類(或者功能)寫好了,並測試通過了,再去寫另一個類。至於兩者如何互動的,事先要考慮清楚,也就是要做設計,畫UML圖等。至少是先寫的功能,要充分考慮未來調用者的各種使用情境。就像在一張白紙上作畫,第一筆總是很難的,所以往往也是最苦悶的時候,寫代碼的進度也很慢。現在不一樣了,根本不等把細節考慮,就開始寫代碼。先是大概把代碼架構寫了,想到什麼就先寫下什麼,還沒有確定的細節,就用虛擬碼,文字說明或者不完整的代碼來大意示意一下。就這樣,東一下子西一下的就把幾個相關的類(功能)的架構給勾勒出來。雖然還無法編譯通過,但是卻讓我對整個結構有了更多的認識,細節不斷變得清晰,然後不斷填充。這邊的細節確定了,那邊也就確定了,就這樣來來回回的填充,很快所有的虛擬碼或者不完整代碼就都變成了真正的代碼。等到所有空白都填上了,就可以F5編譯了。這時候,編譯器還會發現一些錯誤,繼續修補直至編譯通過。最後是運行調試,直至得到預期結果。
於是就想到,繪畫的時候,我們會首先用簡單的幾筆勾勒出大致的輪廓,然後不斷的補充細節。剛開始的時候,看不出是什麼東西,但隨著細節的不斷加入,就越來越生動了。你不可能說畫一個人的肖像的時候,先把每一根頭髮都描繪出來,然後才是畫眼睛,畫鼻子......你當然會先勾勒出髮型,眼睛和鼻子的位置,然後再來回細描,每一次都會力圖保證所有的部位在細節的細密程度是一致的,而不能說頭髮很細緻而眼睛很粗陋。我不懂繪畫,但我覺得這是要力圖保證協調,保證全域觀。看電影裡的大師作畫,開場總是隨便在紙上隨便點上幾筆,甚至是隨意的潑墨,然後就著這些墨跡,這裡加一筆,那裡加一筆,一幅栩栩如生的畫就誕生了,讓人歎為觀止。還有另一種繪畫方式,就是列印。紙從一頭進入,從另一頭出來,畫面是一行行的繪製出來的,細節也是一次性完成的,並不是來回補充上去的。
手繪和列印的區別就是,手繪前不需要考慮細節,只要胸中有一個大概的輪廓和思路即可,細節可以在繪畫過程中不斷補充。而列印,需要在一開始就把所有細節都考慮清楚,並在一開始就把細節做好。如果開始時沒有把細節考慮清楚,那麼列印結果是無法挽回的。手繪則可以通過再加入更多的細節來平衡以達到修補的目的,因為關注的是整體,而不是某一個局部。而且因為細節是不斷加入的,所以發現錯誤的時候還有時間補救。不過,如果設計圖(即底稿)很好的話,列印則可以得到更好的效果。所以,手繪具有靈活的特點。而列印則可以保證品質。
想想看,敏捷開發方式和瀑布型開發方式,不正好是跟手繪和列印類似?