官术网_书友最值得收藏!

1.1 概要

不論你信不信,計算機編程的第一門課里就已經涵蓋了解決任何可以用計算機處理的問題所需要的所有工具了。著名的計算機科學家——艾倫·麥席森·圖靈(Alan Mathison Turing)曾經提出過一個現在已被人們普遍接受的猜想:任何可以用計算機解決的問題都只需要用到所有計算機編程語言都包含的基本語句。這些基本語句也就是:條件語句(例如if)、循環語句(例如for和while)以及存儲和檢索數據的能力。可能你已經知道了這些,想知道還有什么其他的可以學習。這是個好問題,我在下面的內容里回答。

如果將計算機編程看成與造房子類似的過程,那么掌握了編程知識就相當于是知道了如何使用錘子、螺絲刀、鋸子和鉆頭等這些工具。這些工具雖然可以說是建造所有的房子都需要用到的基本工具,但會用它們并不意味著你可以精確高效地建造一個適合居住的房子,更不用說建造一個滿足現代建筑規范且有一定規模的房子了。這不是說你不能用這些工具做一些有用的事情,如做一個長凳或鳥籠,只是你還沒有準備好應對大型項目所帶來的挑戰。

編程就像建造房子一樣,在處理大型項目的時候是需要更多額外的知識、技術和技能的。本書能讓你學習到這些額外的知識和技能,并且打下堅實基礎,讓你在未來的學習和整個職業生涯中可以不斷提高。在你學習本書的過程中,你將會完成從“小作坊”編程慢慢轉型到“大型”編程的過渡。

不同的軟件項目在很多方面都有各自的特點。就規模而言,它們可以從非常?。ɡ鐚囟葟臄z氏度轉換到華氏度)到非常大(例如計算機操作系統)。同樣,軟件項目在開發系統的關鍵任務方面也存在很大差異。一個日記網站并不需要設計得像網上銀行那樣嚴格遵守規范,也不用像控制生命維持醫療設備的程序那樣精益求精。

沒有任何一個單獨的屬性可以決定項目的“大小”或“難度”。但一般而言,有許多特征可以將現實世界里的編程和你迄今為止看到過的簡單的課堂練習題區分開來。這些特征如下。

?程序大小 到目前為止,你可能寫過包含幾百(或者幾千)行代碼的程序。但是,在實際生活中的應用程序擁有數十萬或數百萬行代碼并不罕見。例如,Linux操作系統內核包含大約600萬行代碼。

?單個程序員vs、開發團隊 到目前為止,你編寫的大多數程序可能都是你自己的項目。但是,現實生活中的大多數軟件都是由若干個開發團隊共同完成的。沒有哪個程序員能夠完全了解一個系統的各個方面。

?從頭做起vs、已有代碼 可能你編寫大部分程序都是從頭開始的。而在實際項目中,程序設計經常會建立在已有程序之上。老系統可以和新軟件一起進行擴展、被引用、被取代以及使用。

?系統生命周期 當剛開始學習編程的時候,你可能會編寫很多僅僅被用在作業里的程序。一旦這些程序被打了分,你可能永遠都不會再看它一眼了。大多數真正的軟件項目都有很長的生命周期。在它們被使用的整個時間段中,它們將會持續獲得優化、改進以及更新。

?環境的復雜性 一個小項目,只用單一的編程語言和一小套標準庫就能完成編寫;而大型項目,則更傾向于使用多種不同的編程語言和大量支持開發的工具和軟件庫來協同開發。

“大型”編程的基本問題其實就是管理相關事務的復雜性。遺憾的是,人們更擅長同時只跟蹤少量的幾件事情。因此,為了處理復雜的軟件系統,我們需要一個可以在任何給定的時間節點上都能限制需要考慮的細節數量的方法。例如忽略一些細節的同時,更專注于與手頭問題相關的細節。這一過程我們稱之為抽象。高效的軟件開發就是構建合適的抽象。因此,本書經常會用到抽象的概念。

處理復雜性的另一個重要技術是會重用之前已有的解決方案。作為程序員,你將需要學習如何通過各種應用程序編程接口(Application Programming Interface,API),來調用你將要使用的工具或庫。API是代碼庫提供的類和方法,以及它們的使用說明(也就是參數和返回類型是什么,以及它們分別代表什么含義)的集合。你可能已經學習過一些簡單的API,如Python數學模塊(math)中提供的函數以及各種內置數據結構[如列表(list)和字典(dictionary)]的方法。還有一個常見的API的示例就是圖形用戶界面(Graphical User Interface,GUI)工具包。

大多數編程語言都提供可用于完成許多常見任務的API。當然API也會因語言和操作系統的不同而產生差異。因此這本書不能夠涵蓋你將會在職業生涯里遇到和使用的所有API,與之相比只是一小部分。但是,通過學習一些API,抑或更重要的是,通過學習開發自己的API,你能夠獲得使你將來能輕松掌握新的API的實用技能。

另一個和重用API已有的代碼同樣重要的能力是:能夠利用現有的良好設計原則的知識。多年來,計算機科學家們已經開發出了用于解決常見問題(例如搜索和排序)的各種算法,并構建出了在大多數程序中都可以用作基本模塊的各類數據集合。在本書里,你將會學習這些算法和數據結構,以便你之后可以編寫更大、更復雜、精心設計和因為使用了這些被廣泛理解的模塊而易于維護的程序。同時,學習這些現有的算法和數據結構還將幫助你了解如何為將來可能會面臨的特殊問題創建屬于自己的新算法和數據結構。

計算機科學家還發明了用來分析和分類各種算法和數據結構的效率的技巧。利用這些技巧,你就可以預測一個程序是否能夠在合理的時間和有限的內存等條件下成功解決問題。當然,你還需要學習算法分析的技巧,從而能夠分析你新發明的算法的效率。

不論出于什么原因,擁有多種編程語言的經驗是非常重要的。因此,本書將會介紹兩種不同編程語言的抽象和數據結構。了解不同編程語言之間的差異,可以讓你了解到開發人員可以使用不同的工具來應對不同的任務。擁有大量的工具,能夠讓你更輕松地解決各種各樣的問題。然而,更重要的一個優點是:你還能夠看到抽象、重用和分析這些基本原則是如何應用于兩種不同的編程語言之中的。只有了解了這些不同的實現,你才能真正理解什么是基本原則,而不僅僅是知道了特定編程語言的細節。無論你將來使用何種語言或環境,這些基本原則都將非常有用。

說到編程語言,在本書即將出版的時候,Python發布了新的版本(Python 3.0)。新版本中包含了大量的重新設計,并且不會向下兼容2.x版本的Python編寫的程序。雖然本書中的代碼是用Python 2.x風格編寫的,但是我們將盡可能地嘗試使用與Python 3.0兼容的規范和功能。同時,將代碼轉換為3.0版本也非常簡單,要使代碼能夠在Python 3.0中運行,你需要記住以下不同。

?print成為函數。你必須要在需要輸出的表達式序列左右加上括號。

?input函數的使用方法將會類似于之前的raw_input。如果你需要檢查用戶輸入,就必須顯式地調用(eval(input("Enter a number:")))來獲取用戶輸入。

?range函數將不再輸出列表。你仍然可以像以前那樣在for循環中使用它(例如for i in range(10):),但是你需要通過nums=list(range(10))這樣的代碼以顯式的方式生成列表。

?單斜杠運算符(/)將始終輸出浮點結果。想要輸出整數的話,你可以使用雙斜杠運算符(//)(Python 2.x中也同樣支持)。

本書的在線資源中,提供了所有代碼的Python 2.x和Python 3.0版本。因此,不論你使用哪個版本的Python,都能夠很方便地學習本書。

主站蜘蛛池模板: 咸丰县| 腾冲县| 东至县| 牡丹江市| 达尔| 新郑市| 酒泉市| 武义县| 陆河县| 正镶白旗| 南岸区| 海林市| 荆州市| 锦屏县| 台北县| 凉城县| 南安市| 靖宇县| 芜湖市| 于都县| 鄱阳县| 鄂托克前旗| 紫金县| 米易县| 上高县| 玛多县| 正安县| 仁寿县| 五莲县| 扎赉特旗| 佛学| 习水县| 丰镇市| 鲁甸县| 商城县| 晋州市| 神农架林区| 盘山县| 湄潭县| 开化县| 米泉市|