你可曾……
花費(fèi)了大量時(shí)間編寫錯(cuò)誤的算法?
使用了過于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)黍瞧?
測試程序卻忽略了明顯的錯(cuò)誤诸尽?
需要讓程序使用更少的內(nèi)存,但運(yùn)行快三倍?
糾結(jié)地在工作站和PC間移植程序印颤?
試圖對他人的程序做適當(dāng)?shù)男薷模?/p>
因無法理解程序而重寫您机?
這有趣吧?
以上種種膀哲,程序員頻頻遇見往产。但處理這些問題卻比想象中的難,因?yàn)槌绦蛟O(shè)計(jì)中的實(shí)踐部分——測試某宪、調(diào)試仿村、可移植性、性能兴喂、設(shè)計(jì)方案蔼囊、風(fēng)格——常非計(jì)算機(jī)科學(xué)或程序設(shè)計(jì)課程的關(guān)注點(diǎn)。大部分程序員都是在實(shí)踐中籠統(tǒng)地學(xué)習(xí)這些知識(shí)衣迷,少數(shù)是從未學(xué)習(xí)畏鼓。
在程序設(shè)計(jì)的世界里,有著大量錯(cuò)綜復(fù)雜的接口壶谒,有著不斷改變著的工具云矫、語言和系統(tǒng),有著種種事情的重重壓力汗菜,人們會(huì)忽略基本的原理——簡潔性让禀、清晰性、通用性陨界,而這些都是優(yōu)秀軟件的基礎(chǔ)巡揍。人們也會(huì)低估機(jī)械化生產(chǎn)軟件的工具和表示法,而這些可讓計(jì)算機(jī)自動(dòng)編程菌瘪。
本書的敘述方法基于一些基本的腮敌、相互關(guān)聯(lián)的原理,這些原理可用于所有層次的計(jì)算俏扩。簡潔性糜工,讓程序簡短且易于管理;清晰性录淡,保證易于人和機(jī)器的理解捌木;通用性,意味著程序能工作于各種情景赁咙,同時(shí)適用于新情景钮莲;自動(dòng)化,讓機(jī)器為我而動(dòng)彼水,讓人從瑣碎的工作中得以解放崔拥。通過考察用多種語言進(jìn)行程序設(shè)計(jì)的活動(dòng)——從算法和數(shù)據(jù)結(jié)構(gòu)到程序的設(shè)計(jì)、調(diào)試凤覆、測試和性能優(yōu)化链瓦,我們便能闡明獨(dú)立于語言、操作系統(tǒng)或編程范式的通用工程概念盯桦。
本書源自多年的經(jīng)驗(yàn)慈俯,包括編寫維護(hù)大量軟件、教授程序設(shè)計(jì)課程拥峦,以及同形形色色的程序員共事贴膘。我們想分享實(shí)踐過程中的教訓(xùn)略号,傳遞經(jīng)驗(yàn)中的真知灼見刑峡,并建議不同層次的程序員如何變得更加專精高效玄柠。
本書是為多種讀者而寫的。如果你是個(gè)學(xué)生羽利,修習(xí)過一兩門程序設(shè)計(jì)課宫患,想要成為更好的程序員,那么本書將闡述一些校園里未有足夠時(shí)間講授的主題这弧。如果你的工作只是編寫程序支持其他業(yè)務(wù),而非編程本身畜吊,那么書中內(nèi)容將讓你編得更高效。如果你是個(gè)專業(yè)的程序員户矢,卻沒有在校園里充分領(lǐng)略這些主題玲献,抑或你只想來次溫習(xí),再或者你是個(gè)軟件經(jīng)理梯浪,想指導(dǎo)員工朝向正確方向,那么本書材料將大有裨益挂洛。
我們希望書中的建議會(huì)助你寫出更好的程序。唯一需要的背景知識(shí)是托酸,你要有過編程經(jīng)驗(yàn),最好是使用過C励堡、C++或者Java。經(jīng)驗(yàn)越豐富应结,編程越容易;沒有什么能讓你在21天內(nèi)從新手變專家鹅龄。比起只使用Windows和MaCintosh的程序員,UNIX和LINUX程序員會(huì)對書中的一些例子更加熟悉迎卤,但所有程序員都將發(fā)現(xiàn)一些材料玷坠,讓編程變得更容易。
本書內(nèi)容分為九章侨糟,每章關(guān)注程序設(shè)計(jì)實(shí)踐的一大問題。
第一章討論程序設(shè)計(jì)風(fēng)格不同。良好的風(fēng)格對優(yōu)秀的程序設(shè)計(jì)至關(guān)重要溶耘,因此我們將其放在第一章。精心組織的程序好過胡亂的編寫凳兵。風(fēng)格良好的程序會(huì)有更少的錯(cuò)誤,會(huì)更易于調(diào)試和修改,因此首先討論風(fēng)格是很重要的庐扫。本章介紹了良好程序設(shè)計(jì)的一個(gè)重要主題――語言慣用法的正確使用。
第二章的主題是算法和數(shù)據(jù)結(jié)構(gòu)铅辞。這是計(jì)算機(jī)科學(xué)課程和程序設(shè)計(jì)課程的核心萨醒。因多數(shù)讀者都已熟悉這部分內(nèi)容,我們只打算對最常見的算法和數(shù)據(jù)結(jié)構(gòu)做簡單的回顧富纸。更加復(fù)雜的算法和數(shù)據(jù)結(jié)構(gòu)通常演變自這些基本模塊旨椒,所以大家應(yīng)該掌握最基本的堵漱。
第三章描述小型程序的設(shè)計(jì)和實(shí)現(xiàn),進(jìn)而闡述真實(shí)情況下的算法和數(shù)據(jù)結(jié)構(gòu)問題怔锌。程序由五種語言實(shí)現(xiàn)变过;通過比較,可展示不同語言如何處理同一數(shù)據(jù)結(jié)構(gòu)岛杀,不同語言的表達(dá)能力和性能有著怎樣的區(qū)別崭孤。
用戶與程序間和程序各部分間的接口是程序設(shè)計(jì)的重要基礎(chǔ),軟件的成功很大程度上取決于接口的優(yōu)良設(shè)計(jì)和實(shí)現(xiàn)辨宠。第四章展示了一個(gè)小型庫的演化,用于分析某種廣泛使用的數(shù)據(jù)格式精偿。例子雖小赋兵,卻闡明了接口設(shè)計(jì)的多個(gè)要點(diǎn):抽象、信息隱藏霹期、資源管理,以及錯(cuò)誤處理甩十。
大家總試圖一次性成功地編寫程序吭产,但是難保沒有錯(cuò)誤,因此要調(diào)試垮刹。第五章為系統(tǒng)高效的調(diào)試提供了策略和手段。論題包括常見錯(cuò)誤特征荒典,以及重要的“數(shù)字命理學(xué)”吞鸭,即從調(diào)試輸出的模式常掣苍悖可推斷出問題所在。
測試的目的是為程序的正常工作造虏、升級后的正常運(yùn)行提供合理的保證麦箍。第六章強(qiáng)調(diào)通過手工和機(jī)器進(jìn)行系統(tǒng)的測試。邊界條件測試檢查潛在的薄弱點(diǎn)挟裂。合理利用機(jī)械化和和測試臺(tái)讓繁重的測試變得相對簡單。不同于典型的用戶測試栗竖,壓力測試提供了新的測試方法渠啤,可偵測出新一類的錯(cuò)誤。
計(jì)算機(jī)運(yùn)行很快速沥曹,編譯器性能很優(yōu)良,很多程序在完成那天起便能運(yùn)行得足夠快同窘。但有些或是太慢部脚,或是占用太多內(nèi)存,抑或兩者兼有委刘。第七章呈現(xiàn)了一種有序的方法,用于處理程序有效利用資源的問題呕童,也就是說淆珊,在高效的同時(shí),程序正確如前。
第八章涵蓋可移植性擂找。成功的程序浩销,即便在運(yùn)行環(huán)境改變了,被移植到了新系統(tǒng)慢洋、新硬件、新的領(lǐng)域败明,也能夠運(yùn)行長久斑芜∷罨簦可移植性的目標(biāo)是用盡可能小的修改來適應(yīng)新的環(huán)境,進(jìn)而減少程序的維護(hù)費(fèi)用沸呐。
計(jì)算語言豐富,不僅有用于大多數(shù)程序設(shè)計(jì)的通用語言寓娩,還有許多用于特定領(lǐng)域的專用語言。第九章提供的幾個(gè)例子棘伴,是關(guān)于計(jì)算表示法重要性的屁置,展示了我們應(yīng)如何使用之簡化程序、指導(dǎo)實(shí)現(xiàn)阱穗,甚至幫助我們編寫可編程的程序使鹅。
討論程序設(shè)計(jì),必須展示大量代碼患朱。書中的大部分例子都是特地準(zhǔn)備的,也有些是改寫自其它源程序蕴茴。我們已竭力去寫好書中代碼,且已用機(jī)器可讀文本直接在六個(gè)系統(tǒng)測試通過倦淀。更多的信息可在the praCtiCe of programming的網(wǎng)站上獲取:
http://tpop.aw1.Com
書中的大部分程序使用C姻成,也有些例子使用C++和Java愿棋,另外還有些腳本語言的簡短討論。在最底層糠雨,C和C++幾乎等同,C程序亦適用于C++程序琅攘。C++和Java直接源自C松邪,不僅繼承了其大量的語法,還繼承了其高效性和表達(dá)能力逗抑,同時(shí)增加了豐富的類型系統(tǒng)和庫。在書中荧关,我們通常使用以上三種語言褂傀,間雜其他。語言的選擇依賴具體的問題:操作系統(tǒng)使用高效紊服、限制少的語言編寫最佳,如C和C++参萄;快速原型通常使用命令解釋器或腳本語言最簡便煎饼,如Awk和Perl;對于用戶界面,VB和TCl/Tk是強(qiáng)有力的競爭者马篮,另外還有Java怜奖。
在選擇示例的語言時(shí),有個(gè)重要的教學(xué)考量歪玲。正如沒有一種語言能夠同等漂亮地解決所有問題,也沒有一種最好的語言適用所有主題岖圈。高級語言預(yù)設(shè)了些設(shè)計(jì)決策钙皮。如果使用低級語言,我們就得考慮問題的其他解決方案短条;知道的細(xì)節(jié)越多,就能討論得越充分逐抑。經(jīng)驗(yàn)表明屹蚊,即便是使用高級語言的工具进每,知道它們?nèi)绾闻c底層問題相聯(lián)系也是非常有價(jià)值的;沒有這種深刻的領(lǐng)悟田晚,程序很容易陷入性能低下和行為詭異的境地。因此芹壕,我們的例子通常使用C,盡管實(shí)踐中也許有其他選擇接奈。
實(shí)際上,本書的大部分內(nèi)容都獨(dú)立于特定程序設(shè)計(jì)語言睁壁。數(shù)據(jù)結(jié)構(gòu)的選擇受手頭使用的語言影響;一些語言也許沒有這些選擇潘明,而其他語言卻有各種各樣的選擇。但是厚宰,解決問題路上所做的選擇卻是相同的牲阁。如何測試和調(diào)試的細(xì)節(jié),不同的語言各不相同城菊,但其中的策略和手段卻是相近的。使程序高效的大部分技巧能應(yīng)用于不同的語言并齐。
無論使用何種語言客税,你的任務(wù)是利用手頭上的工具把自己發(fā)揮到極致。優(yōu)秀的程序員能克服語言的貧瘠更耻、能克服操作系統(tǒng)的呆板;即便是優(yōu)越的程序設(shè)計(jì)環(huán)境也拯救不了糟糕的程序員食侮。我們希望目胡,無論你當(dāng)前的經(jīng)驗(yàn)和技術(shù)如何,這本書都能幫你更好地編程眉尸,得到更多的樂趣巨双。
我們向閱讀本書手稿并提出寶貴意見的朋友和同事們表示深深的謝意。(人名從略)