◆ 本書適合誰
如果你正在學習編程,那么本書再合適不過了。
如果你正在幫助其他人學習編程,本書也適合你。
如果你是一名專業(yè)的程序員,這本書不是為你準備的但無論如何,歡迎你閱讀它。也許你愿意把它推薦給別人。我熱切期盼你的意見與建議。
◆ 本書的結構
學習編程的本質是同時提升多項技能,因此我盡量在各章節(jié)之間加入了許多交叉參考資料,同時也留有足夠的自由度,讓你可以隨心所欲地在書中暢游。
第1~3章,讓我們開啟編程學習之旅。第4章將幫助你把正在學習的語言置于所有編程語言的視野中。第5~11章是本書的核心,你很可能會頻繁地翻閱這幾章。第12章和第13章專門講述如何在編程課程中取得好成績,如果你正在自學編程,完全可以跳過這些內容。第14章和第15章是本書內容的擴展,希望能對你未來的編程生涯有所幫助。
◆ 推薦序一
在1972年的圖靈獎演講中,計算機科學家、軟件工程師Edsger Dijkstra回顧了自己作為荷蘭位程序員的一些經歷和感悟。雖然在題為謙遜的程序員的演講中,Dijkstra饒有趣味地講述了自己早年從理論物理學轉向計算機科學的研究與實踐的故事,但是他的一些發(fā)現(xiàn)確實令人沮喪:社會對程序員的表現(xiàn)和他們的產品并不滿意。在計算機技術飛速發(fā)展的現(xiàn)實世界里,硬件產品的性能日益提升而價格卻不斷下降,同時,人們對各種媒體上不惜筆墨地描述的人工智能、大數(shù)據技術、量子計算等新興領域的廣闊前景充滿向往。這一切都讓今天的程序員承擔著不可避免的壓力。如何寫出好程序正是每一位程序員都在思考和嘗試的事情。
雖然探討編程技藝的同道之人眾多,但是個體的經驗和結論可能千差萬別。以我本人為例,三十多年前初學編程的時候,我對程序員這一職業(yè)完全沒有概念。那時候,每個人都為自己獨特的任務來編寫程序,編程只是服務于主體目標的一項邊緣工作。到了21世紀,軟件工程作為一門學科已經結出豐碩的果實,軟件工程專業(yè)在很多高等院校也已生根開花。打開主流的招聘網站就會發(fā)現(xiàn),社會上對程序員這一工作的認可度也已經達到了相當?shù)母叨。軟件成為人們生活、工作、學習、旅行、娛樂不可或缺的產品與服務,軟件開發(fā)也被公認為一項復雜的生產活動。但是客觀地說,對于編程本身的研究好像并沒有激起太大的浪花。對那些渴望得到指點的初學者來說,找到如何寫出好程序的答案遠不是一件輕而易舉的事情。
本書是一本名副其實的學習指南。不管是初學者,還是在鍵盤和屏幕前積累了不少開發(fā)經驗的在職程序員,養(yǎng)成良好的編程習慣都是事半功倍的關鍵。我們知道,職業(yè)運動員的日常訓練內容包括大量的體能訓練,以及必不可少的動作規(guī)范性練習。雖然這些訓練看起來和比賽沒有直接的關聯(lián),但是沒有人能否認好的成績來自嚴格而規(guī)范的訓練。當今社會對程序員的需求量較大,而優(yōu)秀程序員的供給存在巨大的缺口,這導致很多程序員并沒有經過充分而合理的訓練就直接投入賽場參與比賽。不能否認實戰(zhàn)對于程序員成長的作用,正如無法否認地基對于摩天高樓的決定作用一樣。測試、調試、優(yōu)化,讓程序清晰而簡潔,這些基本功恰好是一個程序員通向職業(yè)成功道路的鋪路石。一旦能夠開始編寫好程序,享受編程的樂趣,獲得職業(yè)的成就感,得到自身的滿足感,這一良性循環(huán)就充滿了正反饋。
作為愛丁堡大學的教授和軟件工程研究者,作者Perdita Stevens 并沒有板起面孔去寫一本嚴肅的教科書。讀者在這本書中可以體會到作者就像導游一樣,介紹了一段毫不枯燥的旅程。作者開啟的是循序漸進的編程之旅:在旅途中,不僅用一些示例揭示希望表述的道理,還不斷使用有趣的知識點和言簡意賅的小提示引導讀者的注意力。更有意思的是,通過多年教學得出的經驗,Stevens教授了解讀者會在哪里遇到困難,于是在這些地方給讀者提出了有價值的針對性建議。
本書的譯者有著軟件行業(yè)豐富的開發(fā)和管理經驗,對于編程語言、開發(fā)工具和軟件工程實踐的出色理解無疑為翻譯本書提供了堅實的基礎。整本書讀起來不僅非常順暢,對比原文還可以發(fā)現(xiàn),譯者非但沒有偏離原書作者的表達特點,而且在一些細微之處用心地照顧到了中文讀者的閱讀習慣。
可以說,這是一本值得剛上手編程的學生一讀的好書。此外,對于有經驗的程序員,這本書也打開了一扇用不同視角審視編程藝術的窗口。
沈剛
華中科技大學軟件學院教授
◆ 推薦序二
如果說現(xiàn)在是機器的時代,或者程序的時代,恐怕不會有人反對。事實上,程序已經多到我們通常會忽略它們的存在了。游戲、手機、遠程教學軟件,或者路邊絢麗多彩的廣告牌,背后都有程序在運行。
每日與程序為伴,促使我們去學習如何編寫程序。
程序可以幫助我們解決復雜的問題,或者解決簡單但煩瑣的問題。不僅如此,學習編寫程序還可以幫助我們理解它,理解機器,進而理解這個世界運轉的規(guī)則。現(xiàn)在來看,如果存在兩個世界,一個是我們身處的物理世界,另一個是數(shù)字或者虛擬世界,那么程序就是連接這兩個世界的東西。我們借由程序,可以在這兩個世界之間自由穿行。
程序員可能會有不同的想法。在他們受到的訓練里,寫程序是一件莊重又日常的事情。曾經有一本著名的書《七周七語言》,講的是程序員如何在短時間內掌握盡可能多的編程語言。是的,這對他們有莫大的吸引力。而且,一旦進入程序的世界,你會發(fā)現(xiàn)那里跟色彩絢麗的廣告牌一樣豐富多彩。
程序員不僅要學會編寫程序,還要學會測試和調試程序。為了編寫大型程序,跟更多的程序員合作,他們要學會寫整潔的代碼,學會重構,讓代碼具有自解釋性和可維護性。這讓程序員更像是一個手藝人。
但這并不意味著你必須要成為一名程序員。
除了理解機器和這個世界,編寫程序其實可以是一件很好玩的事情,尤其是當你看到計算機會聽你的話,按照你的程序執(zhí)行,得到你想要的結果的時候。慢慢地,你會發(fā)現(xiàn)你在用程序去表達你的想法,而且計算機可以理解它們,也就是理解你。
也許你會想到更多:除了方便自己,你的程序如何幫助更多的人呢?尤其是那些弱勢群體,如何讓他們生活得更好?如何讓你的程序符合道德倫理,拒絕侵犯隱私,后造福整個社會?
我想這才是好程序。
張凱峰
InfoQ社區(qū)編輯
◆ 推薦序三
兩年前,我結束自己已從事十年的一線工作轉職成為一名程序員培訓師。在近兩年的時間里,我在教學之余一直在思考與探索如何培養(yǎng)一名優(yōu)秀的程序員,并不斷總結與記錄教學經驗和對人員培養(yǎng)的理解。對于如何培養(yǎng)一名符合企業(yè)要求的、具備工程能力的程序員,主要的其實只有兩個方面:教會學員一門編程語言;幫助學員建立編程思維與解決問題的能力。
教會學員一門編程語言,這在整個教學活動過程中是一件非常簡單的事情。通常在教學實踐中會從個Hello World開始,幫助學員理解程序的本質,同時驗證學員所安裝的開發(fā)環(huán)境與開發(fā)工具的可用性。隨后便可以按部就班地從變量到數(shù)據類型這樣一路教下去,幫助學員弄懂每一個語法與函數(shù)的含義,通過在教學過程中使用大量的練習幫助其鞏固技能,終通過一個綜合性項目使其所學的技能得到綜合應用。以上便是學習一門編程語言的路徑,也是許多程序員(包括我自己)學習一門編程語言的過程。
在教學實踐中幫助學員培養(yǎng)良好的編程思維與解決問題的能力,則是一件艱難而復雜的事情,也是決定教學水平高低的重要指標。如果將學員從不會編程到學會編程形容為從0到1的過程,那從學會編程到可以編寫出更好的程序就是從1到100的過程,而這個過程也是決定該學員對于企業(yè)而言是屬于60分合格、80分優(yōu)秀還是100分卓越的關鍵。在這個過程中,學員的進步無法通過掌握語法與類庫的累加來實現(xiàn),而是必須在原有的、通過模仿套用現(xiàn)有案例完成代碼堆疊的基礎能力上,增加代碼結構設計能力、工程代碼管理能力以及代碼問題分析、定位、調試與解決能力才能實現(xiàn)?傮w而言,這個過程就是由掌握一門語言到可以獨立承擔一項工程研發(fā)任務的過程,其中核心的任務便是幫助學員培養(yǎng)良好的編程思維與解決問題的能力。
上述兩個方面在程序員的培養(yǎng)與成長過程中都非常重要,缺一不可。目前,市場上針對前者的課程、書籍與資料已經稱得上汗牛充棟,但針對后者的學習資料卻很少,即便找到寥寥數(shù)本,要么內容過于深奧復雜,僅僅書籍的厚度就讓人望而生畏,要么太過零散簡潔,猶如武林高手秘傳的內功心法一般,令新人無從下手。本書的出現(xiàn)剛好填補了這一空白,其由淺入深地向讀者講述了寫出好程序的思維與方法,并記錄了作者豐富的編程思考與經驗。
本書的譯者是國內經驗極為豐富的工程實踐的優(yōu)秀推廣者,在其過往的工作中帶領并培養(yǎng)出了在業(yè)內堪稱具有優(yōu)秀編程實踐的研發(fā)隊伍,對于研發(fā)人員的培養(yǎng)有深層次的體系化思考與實踐。
我相信,無論是剛開始學習編程的學員,還是初入職場的編程新人,或者是具有一定編程經驗的老兵,都可以從這本書中汲取到養(yǎng)分,收獲良多。同時,這本書中的所思所得對于從事教學與培訓行業(yè)的講師與課程設計師而言,也有非常高的學習、借鑒與參考價值。
宋俊毅
牛鷺學院聯(lián)合創(chuàng)始人
◆ 推薦序四
在編程的世界里,我是一名逐夢者,一名造夢者,亦是一名售夢者。
懵懵懂懂、跌跌撞撞、迷迷茫茫之間,撞入了程序的領域,是慌張,是欣喜,是困難,也是收獲;蛟S和大部分人類似,初次接觸編程,并沒有激發(fā)我對編程的熱情,我只是在用背誦代碼的方式應付考試。直到我發(fā)現(xiàn),助力我成功獲得份工作的,并不是我背誦的那些少得可憐的語法,而是不知道什么時候刻入我骨子里的clean code、思維方式和編程習慣。而伴隨著由之而來的良性循環(huán),我成了一名逐夢者。
編程是一種方式,是讓計算機做你想讓它做的事情,讓程序去解決現(xiàn)實中的問題。同時編程也是一門技藝,編寫優(yōu)雅的程序需要高超的技巧和相當?shù)膶徝烙^,就像是譜一首樂曲,音調應該是和諧的。在編程界,造夢者既在傾聽,又在獻策,既是趕工,又行美好,你需要捕獲難以捉摸的需求,并找到一種表達它們的方式,以便機器能夠輕松地理解。在項目時鐘的滴答聲中,趕工完成一項項工作的同時,你每天都在一點點地創(chuàng)造奇跡。
結構化思維在一定程度上指引著我們。先形成骨架,再去填充細節(jié),去豐滿內容,思維就會有跡可循,布局就會頗有章法,解決問題就會更有效率。那么,在學習編程的初期,抑或在有頗多編程經驗之后再次回頭梳理時,編程習慣的養(yǎng)成、抽象概念的提取,對于編程這條路來說,就像是提高了前進的加速度。這本書清晰流暢、行云流水,言語之間無一不闡述著那些通用的編程技藝。閱讀本書,將從了解編輯器、IDE、版本控制、單元測試、測試程序、調試、重構、防御式編程、優(yōu)化入手,磨煉基本功,進而培養(yǎng)良好的編程習慣,形成專業(yè)的風格和極致的治學態(tài)度,并在追求卓越的過程中積累習慣,將其變成編程道路甚至人生道路上的一種修養(yǎng),這也許是作者、譯者和我這名平凡的程序媛的售夢方式。
你、我,我們都已在編程的路上前行著,帶著修行者的信念,堅定地前行著。我相信,若是歸途,星海共讀。
張喻
騰訊科技研發(fā)工程師
◆ 譯者序
程序,在計算機尚未普及的年代,對我們來說是一個神秘而又高深的概念。然而,在如今的信息社會,我們每天都會與各種各樣的程序打交道,我們的生活早已無法離開程序,程序已成為數(shù)字化時代的一部分。
也正是由于這個原因,越來越多的同學和我們一樣,選擇了程序員這份職業(yè)。無論是編程的初學者,還是具有一定經驗的程序員,抑或從業(yè)多年的技術專家,編寫出更清晰、更正確、更健壯的程序,都是我們追求的目標。
現(xiàn)在,我們可以很容易地在市面上找到編程方面的書籍,它們或者是針對某一種語言的專業(yè)書刊,或者是某些技術細分領域的行業(yè)經驗分享。但很少能有這樣一本書:它通過具體的案例,清晰、系統(tǒng)地闡述編程技巧,并不限定于某一種語言,而是更關注傳授可移植的編程技能,讓讀者在掌握編程技巧的同時,也能理解其背后的思想。這些思想,正是設計優(yōu)雅程序的精髓。
這是一本分享經驗與指引我們少走彎路的經典書籍,針對如何設計優(yōu)質的程序提出了實用、權威的指導。對初學者來說,它是一本不可或缺的入門指南;對從業(yè)多年的開發(fā)人員和技術專家來說,它也具有相當高的參考價值。
我們幾個譯者是多年的同事和好友,也都在軟件行業(yè)摸爬滾打多年。回想起在接觸編程的時候,從剛開始簡單的Hello World起步,再慢慢地開始編寫能工作的程序,到如今設計復雜的系統(tǒng)架構,我們都不可避免地碰到過各種問題,比如:代碼缺乏良好的可讀性,致使維護效率低下;工作中缺乏良好的備份習慣,導致返工的時候成本太高等。所幸我們通過各種探索和總結,終克服了這些問題。在翻譯本書的過程中,我們多次感嘆:如果能在從業(yè)之初就接觸這本書就好了。
本書的作者Perdita Stevens是愛丁堡大學的教授,有著多年的編程和軟件工程教學經驗,她將教學過程中的經驗提煉、總結并分享出來,我們在翻譯本書的過程中,就好像在與一位編程大師對話。在本書中,Perdita Stevens教授娓娓道出的內容,對同樣是讀者的我們來說也是一筆寶貴的財富。
感謝我們的家人,本書的翻譯占用了我們大量的業(yè)余時間,對此他們給予了極大的理解與支持。更為可貴的是,在本書的翻譯過程中他們提供了很多專業(yè)的意見和建議。沒有他們的支持,我們是很難順利完成本書的翻譯工作的。
在本書的翻譯及出版過程中,機械工業(yè)出版社華章公司的編輯們逐字逐句地進行檢查、校對和修改,從而提高了譯文的質量。謝謝他們!
王磊 周訓杰 萬學凡