標籤

2013年3月1日 星期五

如何進行良好的程序設計

    關於程序設計,掐指算來也寫了快有十年的程序了,之前很長的一段時間都是以算法類的競賽為主,對於程序結構的設計,總是胡亂寫寫,能跑通就算ok了。來公司後, 接觸了一些大一點的項目的設計,設計的重要性就凸現出來了。

    為了更好的設計(不能說到完美,但是至少不要把自己和用戶弄暈),我寫點自己的一些感悟(有自己思考的,也有和公司的前輩討論得到的),不能說本系列是一篇指導性的文章,權當是拋磚引玉,希望能夠大家不吝賜教,多多討論。

    對於程序設計,常常是有下面的一個過程:


    1)給出了需求,對需求進行思考,考慮用某種結構去實現

    2)對於結構的思考覺得可以滿足了需求,開始程序設計

    3)設計的過程中發現某些地方有效率問題、可行性問題、或者某些不能滿足需求的問題- 在當前的基礎上進行修修補補

    4)設計的過程中用戶提出了一些新的需求- 在當前的基礎上進行修修補補

    5)為了調試、測試的方便,在程序中的一些臨時代碼也忘了清除,使得程序看起來亂七八糟

    6)重複2)3)4)的過程,直到看起來滿目蒼夷的程序完成需求,交付項目

    7)過了半年一年,用戶有了一些新的需求,或者發現了一些bug,當重拾代碼時,發現代碼已經不忍卒讀了

    每次經歷這樣的一次情況,內心中都有一種煎熬的感覺,覺得程序越寫越背離了當初設計的初衷,代碼連自己都不想去看,哪裡能算優秀的程序呢。有時候覺得很懶,喜歡給自己找一些藉口,比如項目做完了的時間可以學習一下其他的東西,看看論文什麼的,或者說省一點時間去陪陪家人。其實設計和算法一樣,都是非常有價值的東西,就像IPad和筆記本的比較一樣,IPad就因為設計的新穎,和各處的精益求精,讓全世界的人為之瘋狂。

    最近和同事進行討論,自己也想了想,可以從下面的一些方面來學會如何進行良好的設計:

    想要設計應該先去多看看別人優秀的代碼,從代碼中體會大師的設計。設計模式只是設計的一小方面,我覺得更重要的是類、函數的功能設計,讓這些函數不管從接口上還是從內部的實現上,都是去做一些比較乾淨的功能。這樣不管自己去寫,別人去讀,或者加入新的函數和類等,都更加方便。

    對於一些書(比如Effective C++等)中間講的知識不一定要生搬硬套的去使用,而可以從別人的代碼中看看大師們是怎樣用這些技巧的,比如imp指針這種技巧,我覺得就不適合在普通的接口中使用,這種技巧不同於人的直接思維,在原本簡潔的藉口後麵包裝了一個不太漂亮的“影子”。也不利於編碼和理解、調試。

    對設計,應該是跨越語言的範圍的,對於不同的語言,也同樣可以看到很多美好的設計,比如Java中非常多的開源項目就可以有很多可以去參考學習。比如我們目前正在做的分佈式機器學習庫就可以去參考一下Apache的Mahout,裡面對問題的處理方式應該是一致的。對於同一種語言開發出來的程序,可以去看看語言的技巧如何正確的使用。

    對測試,我個人習慣不太好,總喜歡在測試的時候加入一些cerr等代碼,有時又會忘記了刪除,讓代碼看起來會不太好看,對於單元測試,也不太清楚怎樣去寫良好的單元測試,這也是後面得去慢慢學習的內容。

    對設計,應該是一個精心去雕琢的過程,盡量能夠保持在自己能力內的完美,然後這也是日積月累的工作,沒有捷徑可走,只有多看多學才行。

沒有留言:

張貼留言