——讀《編程珠璣I》有感:程序員
Program.Program better. Program faster.正則表達式
要從事軟件開發,首先要學會編程。如何編程呢?如何編寫更高效更優雅的程序呢?《編程珠璣》經過簡單而熟悉的示例,揭示了許多很是有益的編程原理和技巧,極具啓發性。算法
基本流程:數據庫
問題定義—— 應用框架與界面設計 —— 選擇合適的數據結構和高效的算法(對象和消息)—— 性能估計 —— 接口聲明 —— 僞代碼 —— 程序驗證—— 編碼 —— 測試與調試 —— [代碼優化]—— 代碼重審和回顧。編程
問題定義:贏在起點。清晰明確的問題描述和定義幾乎決定成功的一半。做爲問題求解,如何正確地理解問題,從何種視角去思考問題,每每會產生天壤之別的結果;做爲軟件開發,「有所爲而有所不爲」,應看成爲基本準則。誰都指望可以開發出性能強勁的、多能多才的軟件,但並非誰都可以承受這樣的研發成本(時間、資金和人力)。在成本與所能得到的最終產品之間,必須做出合適的權衡和折衷。緩存
通過良好抽象的問題,更容易獲得可複用的問題解決方案。好比,《編程珠璣I》第12章,取樣問題,從隨機選區列表抽樣,抽象成「從n個整數中隨機抽取m個有序整數」的問題;這樣,問題的解決方案還能夠用於其它領域的抽樣問題。安全
應用框架和界面設計: 在明確問題的求解目標以後, 就要思考如何求解問題了。 一般會有一個初步的思想,而後逐漸造成整個比較成熟的方案和應用框架。 與此同時, 定義良好的界面設計也是很是關鍵的。 在界面之上, 是依靠界面服務的應用程序的實現; 在界面之下, 是用來提供界面服務的數據結構與算法的實現。 網絡
數據結構與算法:掌握一門語言,就能夠開始編寫程序;而數據結構和算法,則能夠幫助寫出更爲強大的程序。 粗淺地將《編程珠璣》閱讀了一遍,發現:計算機程序的根本仍然是: 數據結構 +算法。數據結構和算法一般仍是估算和提升系統指望性能的關鍵環節。數據結構
對象和消息, 其實是數據結構與算法的封裝。 在面向對象程序中, 每個類都是一些綁定在一塊兒的「小數據結構」和「小算法」的攜帶者, 經過接口提供本身的服務;每個對象都是狀態攜帶者, 經過狀態的變化來表徵系統的變化,從而實現系統的特徵和功能。架構
數據結構有着很是重要的做用。有時候,複雜的邏輯,只要藉助必定的數據視圖,就能獲得很大的簡化,好比日期計算。《編程珠璣I》中談到的重要數據工具備:超文本、值-對、字典、數據庫、表格、模板等。
性能估計:一般,經過算法的大O分析來粗略瞭解系統可能達到的性能;另外,必定的粗略估算能力也是很是必要的(見編程珠璣第七章):常識、關鍵參數、經驗法則、量綱檢驗、安全係數。
接口聲明:涉及到系統的設計。系統由哪些數據結構(或對象)組成,它們如何進行交互(函數,消息)以完成系統的功能; 仔細定義每個接口的聲明(功能描述、參數列表、返回值、前置條件、後置條件),並使之良好地協做。
僞代碼:不要急於編程。使用僞代碼來表達思路,勾勒程序的大體框架。這經常也會讓思路更明晰:由於在這個過程當中,一般能夠發現系統有哪些子功能要實現,有利於模塊化。
程序驗證:你能保證本身編寫的程序在任什麼時候候都正確嗎?仍是僅在你視線所及的範圍內正確?你指望寫出的程序僅僅是看上去正確嗎?固然,咱們都但願可以早早完工,但是,急不得,懶不得。學習必定的程序驗證技術,也是有益無害的事情。雖然起初可能麻煩一點,但一段時間習慣以後,就不會以爲怎麼樣了。萬事開頭難,過了檻就行了。
程序驗證的經常使用方法:循環不變式和斷言。這其實是根據三種控制流來確立的技術。
編碼:終於能夠編寫程序了。恐怕通過上述折騰,編寫程序的興致早就減得不剩多少了。但是,一切,都是爲了編碼更加順利,更加有創造性。總不指望發現,編碼就是在Ctrl+C/V;當編碼到必定程度時,忽然卡了殼;忽然發現思路有問題;忽然發現性能沒法知足所指望的;忽然發現,以前的努力都白費了?
不少人抱怨工做中的編碼沒有創造性可言,但是,有沒有想過,你不去思考如何更有創造力的寫程序,難道指望創造性自動跑到你面前嗎?你不去努力使用算法、數據結構,難道它會自動跑到你跟前要求你去使用嗎?你不去主動思考、勤於發現,難道你就期望奇蹟自動降臨於身?
編碼時,盡力遵循良好的代碼規範,使之可讀性良好,爲後面的代碼重審和回顧打下良好的鋪墊。
測試和調試:如何獲得一段值得信賴的、能夠放心複用的程序呢?苛刻的、完全的測試。不要怕麻煩。凡事習慣就行了。編寫自動化測試;掌握使用斷言來進行調試。
程序測試一般能夠分爲兩種: 自動化測試和手工測試。對於小數據集,0-10,能夠構建自動化測試;另外,還要構建手工測試,使得可以對特殊情形進行測試。
代碼優化: 代碼優化一般意味着性能的小幅提高。一般是應用緩存原理,這須要對計算機組成和操做系統有深刻的理解。代碼優化一般意味着程序可靠性、可讀性和可維護性的下降,程序複雜度的增長;所以要慎重進行。
代碼重審和回顧:沒有總結就沒有進步;「寫了代碼就丟棄」也不能指望有進步。經過代碼重審和回顧,進一步改進代碼的質量:可用性、可讀性、可擴展性、可移植性、安全性、可靠性。
其它:
大數據集處理問題:初學者可能一般會考慮 1– 100 以內的小數據集處理;但進入到軟件開發領域,大數據集處理,海量數據處理,就成了一個必須考慮的問題。對於排序問題來講,當n < 50 ,或許採用插入排序就能夠了;但當n等於幾百萬,幾千萬時,就不能採用插入排序了。這說明:小數據集的處理方案和大數據集的處理方案每每會是迥然不一樣的。
實用程序和工具箱:卓越的工匠都會備用本身喜好的工具箱。程序員也不例外。初學者可能主要在於編程練習;但進入必定階段以後,就必須考慮編寫實用性強的工具和程序,而不是總停留在玩具程序的級別上。
標準庫;實用程序;熟悉的IDE;開源小工具;經常使用數據結構;算法技術;正則表達式;數據庫使用;編程技術;編程技巧;設計思路;問題求解方案;錯誤錄;等等。
自動化重複工做:時常注意平常生活中是否有可以自動化的重複性工做,並經過編寫實用程序和工具去簡化它。若是當時由於時間來不及,那麼,事後也應當盡力補上。
習慣的變革:人天性一般都是「能躺着就不站着」的,所以,培養了不少很差的習慣。程序員呢,一般指望可以快速編寫出知足功能的程序,而後運行察看是否如預期,接着便丟到一邊再也不理會了。什麼問題分析、僞代碼?什麼程序驗證、測試?什麼代碼重審和回顧?都扔到一邊去。結果是,你逃掉了一分鐘的測試時間,卻用了將近一小時調試時間來補償。划得來嗎?
其實,培養好的習慣,是一種一本萬利的投資。只要最初一兩個月堅持住,習慣成天然;以後,你便只是盡享好習慣帶來的益處了。
從編程到軟件開發
從某種意義上來講,在懂得《數據結構、算法技術、操做系統、組成原理》這些專業知識以後,再加上「勤于思考,善於追根究底」的探索精神,以及大量的編程實踐,就能夠逐漸掌握編程的基本原理和能力。
在學會編程以後,就能夠閱讀關於軟件架構的書籍了,理解軟件是如何構建起來的。數據庫,計算機網絡等等,實際上也是經過「編程原理+軟件架構」的產物,只是它們能夠被用來做爲更大系統的組件。