The Practice of Programming 程序設(shè)計(jì)實(shí)踐 前言翻譯

你可曾……

花費(fèi)了大量時(shí)間編寫(xiě)錯(cuò)誤的算法?

使用了過(guò)于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)?

測(cè)試程序卻忽略了明顯的錯(cuò)誤?

需要讓程序使用更少的內(nèi)存,但運(yùn)行快三倍?

糾結(jié)地在工作站和PC間移植程序?

試圖對(duì)他人的程序做適當(dāng)?shù)男薷模?/p>

因無(wú)法理解程序而重寫(xiě)?

這有趣吧?

以上種種,程序員頻頻遇見(jiàn)。但處理這些問(wèn)題卻比想象中的難,因?yàn)槌绦蛟O(shè)計(jì)中的實(shí)踐部分——測(cè)試、調(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ù)雜的接口,有著不斷改變著的工具、語(yǔ)言和系統(tǒng),有著種種事情的重重壓力,人們會(huì)忽略基本的原理——簡(jiǎn)潔性、清晰性、通用性,而這些都是優(yōu)秀軟件的基礎(chǔ)。人們也會(huì)低估機(jī)械化生產(chǎn)軟件的工具和表示法,而這些可讓計(jì)算機(jī)自動(dòng)編程。

本書(shū)的敘述方法基于一些基本的、相互關(guān)聯(lián)的原理,這些原理可用于所有層次的計(jì)算。簡(jiǎn)潔性,讓程序簡(jiǎn)短且易于管理;清晰性,保證易于人和機(jī)器的理解;通用性,意味著程序能工作于各種情景,同時(shí)適用于新情景;自動(dòng)化,讓機(jī)器為我而動(dòng),讓人從瑣碎的工作中得以解放。通過(guò)考察用多種語(yǔ)言進(jìn)行程序設(shè)計(jì)的活動(dòng)——從算法和數(shù)據(jù)結(jié)構(gòu)到程序的設(shè)計(jì)、調(diào)試、測(cè)試和性能優(yōu)化,我們便能闡明獨(dú)立于語(yǔ)言、操作系統(tǒng)或編程范式的通用工程概念。

本書(shū)源自多年的經(jīng)驗(yàn),包括編寫(xiě)維護(hù)大量軟件、教授程序設(shè)計(jì)課程,以及同形形色色的程序員共事。我們想分享實(shí)踐過(guò)程中的教訓(xùn),傳遞經(jīng)驗(yàn)中的真知灼見(jiàn),并建議不同層次的程序員如何變得更加專精高效。

本書(shū)是為多種讀者而寫(xiě)的。如果你是個(gè)學(xué)生,修習(xí)過(guò)一兩門(mén)程序設(shè)計(jì)課,想要成為更好的程序員,那么本書(shū)將闡述一些校園里未有足夠時(shí)間講授的主題。如果你的工作只是編寫(xiě)程序支持其他業(yè)務(wù),而非編程本身,那么書(shū)中內(nèi)容將讓你編得更高效。如果你是個(gè)專業(yè)的程序員,卻沒(méi)有在校園里充分領(lǐng)略這些主題,抑或你只想來(lái)次溫習(xí),再或者你是個(gè)軟件經(jīng)理,想指導(dǎo)員工朝向正確方向,那么本書(shū)材料將大有裨益。

我們希望書(shū)中的建議會(huì)助你寫(xiě)出更好的程序。唯一需要的背景知識(shí)是,你要有過(guò)編程經(jīng)驗(yàn),最好是使用過(guò)C、C++或者Java。經(jīng)驗(yàn)越豐富,編程越容易;沒(méi)有什么能讓你在21天內(nèi)從新手變專家。比起只使用Windows和MaCintosh的程序員,UNIX和LINUX程序員會(huì)對(duì)書(shū)中的一些例子更加熟悉,但所有程序員都將發(fā)現(xiàn)一些材料,讓編程變得更容易。

本書(shū)內(nèi)容分為九章,每章關(guān)注程序設(shè)計(jì)實(shí)踐的一大問(wèn)題。

第一章討論程序設(shè)計(jì)風(fēng)格。良好的風(fēng)格對(duì)優(yōu)秀的程序設(shè)計(jì)至關(guān)重要,因此我們將其放在第一章。精心組織的程序好過(guò)胡亂的編寫(xiě)。風(fēng)格良好的程序會(huì)有更少的錯(cuò)誤,會(huì)更易于調(diào)試和修改,因此首先討論風(fēng)格是很重要的。本章介紹了良好程序設(shè)計(jì)的一個(gè)重要主題――語(yǔ)言慣用法的正確使用。

第二章的主題是算法和數(shù)據(jù)結(jié)構(gòu)。這是計(jì)算機(jī)科學(xué)課程和程序設(shè)計(jì)課程的核心。因多數(shù)讀者都已熟悉這部分內(nèi)容,我們只打算對(duì)最常見(jiàn)的算法和數(shù)據(jù)結(jié)構(gòu)做簡(jiǎn)單的回顧。更加復(fù)雜的算法和數(shù)據(jù)結(jié)構(gòu)通常演變自這些基本模塊,所以大家應(yīng)該掌握最基本的。

第三章描述小型程序的設(shè)計(jì)和實(shí)現(xiàn),進(jìn)而闡述真實(shí)情況下的算法和數(shù)據(jù)結(jié)構(gòu)問(wèn)題。程序由五種語(yǔ)言實(shí)現(xiàn);通過(guò)比較,可展示不同語(yǔ)言如何處理同一數(shù)據(jù)結(jié)構(gòu),不同語(yǔ)言的表達(dá)能力和性能有著怎樣的區(qū)別。

用戶與程序間和程序各部分間的接口是程序設(shè)計(jì)的重要基礎(chǔ),軟件的成功很大程度上取決于接口的優(yōu)良設(shè)計(jì)和實(shí)現(xiàn)。第四章展示了一個(gè)小型庫(kù)的演化,用于分析某種廣泛使用的數(shù)據(jù)格式。例子雖小,卻闡明了接口設(shè)計(jì)的多個(gè)要點(diǎn):抽象、信息隱藏、資源管理,以及錯(cuò)誤處理。

大家總試圖一次性成功地編寫(xiě)程序,但是難保沒(méi)有錯(cuò)誤,因此要調(diào)試。第五章為系統(tǒng)高效的調(diào)試提供了策略和手段。論題包括常見(jiàn)錯(cuò)誤特征,以及重要的“數(shù)字命理學(xué)”,即從調(diào)試輸出的模式常??赏茢喑鰡?wèn)題所在。

測(cè)試的目的是為程序的正常工作、升級(jí)后的正常運(yùn)行提供合理的保證。第六章強(qiáng)調(diào)通過(guò)手工和機(jī)器進(jìn)行系統(tǒng)的測(cè)試。邊界條件測(cè)試檢查潛在的薄弱點(diǎn)。合理利用機(jī)械化和和測(cè)試臺(tái)讓繁重的測(cè)試變得相對(duì)簡(jiǎn)單。不同于典型的用戶測(cè)試,壓力測(cè)試提供了新的測(cè)試方法,可偵測(cè)出新一類的錯(cuò)誤。

計(jì)算機(jī)運(yùn)行很快速,編譯器性能很優(yōu)良,很多程序在完成那天起便能運(yùn)行得足夠快。但有些或是太慢,或是占用太多內(nèi)存,抑或兩者兼有。第七章呈現(xiàn)了一種有序的方法,用于處理程序有效利用資源的問(wèn)題,也就是說(shuō),在高效的同時(shí),程序正確如前。

第八章涵蓋可移植性。成功的程序,即便在運(yùn)行環(huán)境改變了,被移植到了新系統(tǒng)、新硬件、新的領(lǐng)域,也能夠運(yùn)行長(zhǎng)久??梢浦残缘哪繕?biāo)是用盡可能小的修改來(lái)適應(yīng)新的環(huán)境,進(jìn)而減少程序的維護(hù)費(fèi)用。

計(jì)算語(yǔ)言豐富,不僅有用于大多數(shù)程序設(shè)計(jì)的通用語(yǔ)言,還有許多用于特定領(lǐng)域的專用語(yǔ)言。第九章提供的幾個(gè)例子,是關(guān)于計(jì)算表示法重要性的,展示了我們應(yīng)如何使用之簡(jiǎn)化程序、指導(dǎo)實(shí)現(xiàn),甚至幫助我們編寫(xiě)可編程的程序。

討論程序設(shè)計(jì),必須展示大量代碼。書(shū)中的大部分例子都是特地準(zhǔn)備的,也有些是改寫(xiě)自其它源程序。我們已竭力去寫(xiě)好書(shū)中代碼,且已用機(jī)器可讀文本直接在六個(gè)系統(tǒng)測(cè)試通過(guò)。更多的信息可在the praCtiCe of programming的網(wǎng)站上獲?。?/p>

http://tpop.aw1.Com

書(shū)中的大部分程序使用C,也有些例子使用C++和Java,另外還有些腳本語(yǔ)言的簡(jiǎn)短討論。在最底層,C和C++幾乎等同,C程序亦適用于C++程序。C++和Java直接源自C,不僅繼承了其大量的語(yǔ)法,還繼承了其高效性和表達(dá)能力,同時(shí)增加了豐富的類型系統(tǒng)和庫(kù)。在書(shū)中,我們通常使用以上三種語(yǔ)言,間雜其他。語(yǔ)言的選擇依賴具體的問(wèn)題:操作系統(tǒng)使用高效、限制少的語(yǔ)言編寫(xiě)最佳,如C和C++;快速原型通常使用命令解釋器或腳本語(yǔ)言最簡(jiǎn)便,如Awk和Perl;對(duì)于用戶界面,VB和TCl/Tk是強(qiáng)有力的競(jìng)爭(zhēng)者,另外還有Java。

在選擇示例的語(yǔ)言時(shí),有個(gè)重要的教學(xué)考量。正如沒(méi)有一種語(yǔ)言能夠同等漂亮地解決所有問(wèn)題,也沒(méi)有一種最好的語(yǔ)言適用所有主題。高級(jí)語(yǔ)言預(yù)設(shè)了些設(shè)計(jì)決策。如果使用低級(jí)語(yǔ)言,我們就得考慮問(wèn)題的其他解決方案;知道的細(xì)節(jié)越多,就能討論得越充分。經(jīng)驗(yàn)表明,即便是使用高級(jí)語(yǔ)言的工具,知道它們?nèi)绾闻c底層問(wèn)題相聯(lián)系也是非常有價(jià)值的;沒(méi)有這種深刻的領(lǐng)悟,程序很容易陷入性能低下和行為詭異的境地。因此,我們的例子通常使用C,盡管實(shí)踐中也許有其他選擇。

實(shí)際上,本書(shū)的大部分內(nèi)容都獨(dú)立于特定程序設(shè)計(jì)語(yǔ)言。數(shù)據(jù)結(jié)構(gòu)的選擇受手頭使用的語(yǔ)言影響;一些語(yǔ)言也許沒(méi)有這些選擇,而其他語(yǔ)言卻有各種各樣的選擇。但是,解決問(wèn)題路上所做的選擇卻是相同的。如何測(cè)試和調(diào)試的細(xì)節(jié),不同的語(yǔ)言各不相同,但其中的策略和手段卻是相近的。使程序高效的大部分技巧能應(yīng)用于不同的語(yǔ)言。

無(wú)論使用何種語(yǔ)言,你的任務(wù)是利用手頭上的工具把自己發(fā)揮到極致。優(yōu)秀的程序員能克服語(yǔ)言的貧瘠、能克服操作系統(tǒng)的呆板;即便是優(yōu)越的程序設(shè)計(jì)環(huán)境也拯救不了糟糕的程序員。我們希望,無(wú)論你當(dāng)前的經(jīng)驗(yàn)和技術(shù)如何,這本書(shū)都能幫你更好地編程,得到更多的樂(lè)趣。

我們向閱讀本書(shū)手稿并提出寶貴意見(jiàn)的朋友和同事們表示深深的謝意。(人名從略)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容