3 少量項目實踐--自學和上學的差別
有句老話叫做學以緻用,說的是如果不是為了用而學,是沒有意義的; 同樣,在用中學才能真正的掌握學到内容。程式設計跟着書本走,入書之後終究需要脫離書本,做到“出書”。這是自學程式設計和科班學習的分水嶺所在。自學程式設計的朋友 往往走到這步就難以繼續前進了,一方面是從這步開始就需要自己摸索,而沒有具體那本書可以帶着你往前走。
之前我說到基礎知識很重要,但是 我并不是說如果能把那幾本基礎書順背倒背了基礎就紮實了。 為了真正了解和掌握書上的知識, 在讀完這些書之後,入門的讀者應該去做一些實際的代碼,或者是程式。我在這裡說的是代碼和程式,而不是軟體。這三者是很不同的。 在最初的時候,你可能隻會寫一個main函數的程式,其實這隻能叫做代碼(code)而已。 如果你開始能寫由多個函數構成的程式了, 這個時候你才能算是知道程式是怎麼回事了。在此之後,你可能會嘗試寫由多個源檔案和頭檔案構成的程式,這時你可以算是開始入門了。 最後你可能會要寫有多個不同功能部件組成的程式,每個部件可能是獨立的一個程式子產品, 放在不同的目錄裡面,有不同的接口。這才是程式的現實模樣。 但是這和軟體還是有差距的。 在這裡我不想去探讨軟體和程式之間的差別,因為已經有太多的定義和讨論。而且當你到了最後一步的時候,自然就明白這兩者的差距了。
那麼應該自己嘗試寫一些什麼樣的“程式”?從我自己的經曆來說,我建議以下的幾種:
1. 資料結構的基本操作,例如寫一個酒店的客人住宿登記系統,當客人到來的時候可以讓客人挑選不同的空閑房間。這個實際上就是一個簡單的資料結構的查詢,修改程式;比如你可以用連結清單來維護所有的房間資訊, 然後把客人作為第二維的連結清單挂在各個房間下面。
2. 算法的優化,性能的提高。同樣在上面的例子中,除了可以讓客戶友善的查詢目前空閑的房間外,如何同時能快速的查找到已經登記了的各位顧客的資訊。如何快速 的修改或者取消客戶的預訂? 這些就要求相對複雜的對資料結構操作的技巧了。此外還有如何有效的利用系統的記憶體,比如程式自己維護一個使用者資訊資料池,當使用者退訂房間後,該客戶的資訊 暫時先放入這個池中,等需要一個新的資訊記錄的時候,就不用再去申請記憶體塊而是直接從這個池中擷取已經回收的記憶體。這種記憶體管理機制會在今後的程式開發中 被很廣泛的用到。 尤其是在開發大規模的程式裡面。你對這方面越是熟練, 你開發出來的程式的性能越是可靠(别人的程式處理每分鐘幾千個請求的時候就相應不過來了,你的程式可以輕松的支援上萬個請求,你說客戶會用誰的軟體?)
3. 程式風格的改進:基本的分層,注釋,名稱使用習慣方面的考慮。這部分當你有了寫一些大型程式的經驗的時候就會有比較深的感受了。當程式規模比較大的時候, 程式邏輯的劃分,變量的命名都會成為影響代碼品質的重要非技術性因素。舉個例子, 如果你把變量取名成 a,b c. 等你的程式寫到幾百行時候, 你肯定會記不清想用的某個變量到底叫什麼名字,因而會很頻繁的翻頁回去看,一方面造成了你思路的中斷,另外一方面特别容易讓人大腦疲勞。如果你把名字取成 queueLen, queneCap, 這類的話, 雖然寫的時候麻煩一點,但是很容易深入人心。此外面向對象的封裝技術,以及一個好的內建開發環境 IDE都能幫助你提高效率,減緩疲勞。
以上三點中,1是對資料結構知識的鞏固和加強,2是對算法分析和設計的初步嘗試 3是對軟體工程的重要性的了解。是以對以後的相關知識點鞏固和深化有比較直覺的影響。這一階段的重要性往往在于在這個過程中所獲得的個人的心得體會,而非 技術上的進步。是以幾乎沒有書可以給你一個有形的指導,而一個有經驗的“前人”如果能在這個階段和你交流和探讨,就往往可以給你帶來飛躍性的提高。
本文轉自nathanxu 51CTO部落格,原文連結:http://blog.51cto.com/nathanxu/116364,如需轉載請自行聯系原作者