這本編程思想指南,展示了一套獨(dú)特而有趣的思路,促使你考慮如何才能將程序?qū)懞。書中?1條實(shí)用規(guī)則,各自都有專門的一章來講解,剛?cè)胄械某绦騿T能夠從這些章節(jié)里面獲得必b備的知識,編程老手也能夠從中汲取靈感。這本書講解的編程規(guī)則包括:盡量簡化,但不要簡化得太過分。良好的名稱是最z佳的文檔。讓代碼自己說話。別讓bug蔓延。把復(fù)雜的東西控制起來。消除可能出現(xiàn)故障的情況。必須有三個用例才能泛化。運(yùn)行不到的代碼,是不管用的。從想要的結(jié)果出發(fā)倒著推,而不要從現(xiàn)有的代碼出發(fā)正著推。有的時候,你就是要工作。頭一條優(yōu)化原則就是不要優(yōu)化。
專家推薦本書能夠很好地指導(dǎo)初學(xué)者認(rèn)識一些容易出錯的地方,即便是編程專家,或許也能在其中發(fā)現(xiàn)以前沒聽過的知識。本書作者用一種有趣的方式來講述這些知識,讓這本書既好讀,又能給人以教益。Mark Cerny,PlayStation 4與PlayStation 5游戲機(jī)的首席系統(tǒng)架構(gòu)師編程新手與老手都能從這本書中獲得很大的啟發(fā)。本書作者的寫作風(fēng)格令人舒適,他所指出的21條規(guī)則,在當(dāng)今這個全行業(yè)與全社會都需要技術(shù)的時代里,能夠?yàn)樘嵘愕能浖帉懰,提供重要幫助。Paul Daugherty,Accenture的Group Chief Executive of Technology與 CTO編輯推薦這本編程思想指南,展示了一套獨(dú)特而有趣的思路,促使你考慮如何才能將程序?qū)懞。書中?1條實(shí)用規(guī)則,各自都有專門的一章來講解,剛?cè)胄械某绦騿T能夠從這些章節(jié)里面獲得必b備的知識,編程老手也能夠從中汲取靈感。本書作者Chris Zimmerman是電子游戲工作室Sucker Punch Productions的聯(lián)合創(chuàng)始人,他用通俗易懂的短句來描述編程的真諦,并采用源自實(shí)際工作的范例代碼,來幫助讀者更為深刻地理解這些話語。另外,這本實(shí)用的指南還能給團(tuán)隊(duì)管理者提供一些培訓(xùn)新員工的方式。
前言歡迎你閱讀這本書,這里有一套很容易記住也很容易運(yùn)用的編程規(guī)則,能夠幫你寫出更好的代碼。編程是件難事,但遵循這些規(guī)則,能讓這件事稍微容易一些。下面是閱讀本書的一些技法:?? 書中的每條規(guī)則都自成一體。如果你在目錄里面發(fā)現(xiàn)某條規(guī)則很有意思,那就直接跳到那一條去讀好了,完全沒問題。?? 盡管如此,但筆者還是建議你從(第 1 條:盡量簡化,但不要簡化得太過分)開始。這條規(guī)則可以為你理解其他各條規(guī)則,打下一個很好的基礎(chǔ)。?? 本書的范例都是用 C 語言寫的。如果你用的編程語言是 Python 或JavaScript,那應(yīng)該在深入學(xué)習(xí)各條規(guī)則之前,分別看一下(附錄A:寫給Python 程序員的C 指南)或(附錄B:寫給JavaScript 程序員的C 指南)。這兩份附錄就像(可以幫助我們把古埃及象形文字解讀成世俗體與古希臘文的)羅塞塔石碑(Rosetta Stone)那樣,幫助你把C 語言里的概念,轉(zhuǎn)換成你所熟知的那兩門編程語言之中的相關(guān)概念。另外,如果你用的編程語言不是這三種,而且你覺得書里面的C 范例代碼很難懂,那筆者建議你去看看Rosetta Code(https://oreil.ly/Rr2BL),這是個很棒的網(wǎng)站,收錄了各項(xiàng)編程任務(wù)在各種編程語言里面的做法。如果你本來就是使用 C 語言編程的,那么請注意,筆者為了照顧不使用這門語言的程序員,對范例代碼做了一些簡化。例如代碼里面多次用到了帶符號的整數(shù)(signed integer),但是在真正寫C 程序的時候,這些地方通常都會使用無符號的整數(shù)(unsigned integer),另外,筆者把帶符號與無符號值之間的默認(rèn)轉(zhuǎn)換所觸發(fā)的警告,給關(guān)閉了。還有就是,筆者默認(rèn)所有的范例都帶有一條using namespace std; 指令,假如沒有這條指令,代碼里面就會出現(xiàn)許多個需要加std:: 的地方,那樣很影響閱讀。?? 最后要說的是,如果筆者指的是這本書里面的某條規(guī)則,那么會把 Rule這個詞的首字母大寫。所以你看到的若是首字母小寫的rule,則意味著筆者說的是一條早就有了的普通規(guī)則,而非本書所認(rèn)定的這些規(guī)則。不區(qū)分大小寫,就無法體現(xiàn)出這兩種規(guī)則之間的區(qū)別,所以希望大家諒解。希望讀者能夠喜歡這本書的內(nèi)容。筆者覺得,你應(yīng)該可以從中發(fā)現(xiàn)一些磨煉編程技能的思路。Girls Who Code本書所有版稅都會捐給Girls Who Code(https://oreil.ly/QyCTX),這是個致力于幫助年輕女性發(fā)掘編程意義的組織。筆者剛讀完大學(xué)那會兒,超過三分之一的計算機(jī)科學(xué)專業(yè)畢業(yè)生都是女性,而現(xiàn)在,這個比例已經(jīng)降到了五分之一左右。筆者覺得,從事編程的女性與男性人數(shù)之比,應(yīng)該更加平衡才對。你可能也是這樣想的吧?給Girls Who Code 捐款或者做義工,能夠讓我們離這個目標(biāo)更進(jìn)一步。字體約定書中使用下列兩種字體來表示特定的內(nèi)容:斜體(Italic)首次出現(xiàn)的術(shù)語,以及所有的網(wǎng)址、電子郵件地址、文件名及文件擴(kuò)展名,印刷成斜體。等寬字體(Constant width)大段的程序代碼,采用等寬字體印刷,正文里面提到的程序部件,例如變量名、函數(shù)名、數(shù)據(jù)庫名、數(shù)據(jù)類型、環(huán)境變量、語句以及關(guān)鍵詞,也印為等寬字體。如何使用范例代碼?本書的補(bǔ)充材料(例如范例代碼、習(xí)題等),可以從https://github.com/the-rulesof-programming/examples 下載。如果有技術(shù)問題或是在使用范例代碼時遇到困難, 請發(fā)電子郵件至bookquestions@oreilly.com。這本書是想幫助你學(xué)習(xí)編程技術(shù)。一般來說,你可以在程序或文檔中使用書里的任何代碼,除非你是要復(fù)制大段代碼,否則無需提前征求我們同意。比方說,用這本書里的幾段代碼來編寫程序,不需要征得我們同意,但是售賣或分發(fā)OReilly圖書之中的范例,則需要提前征得同意;引用本書內(nèi)容及范例代碼回答問題,不需要征求我們同意,但把書中的大量范例代碼納入你的產(chǎn)品文檔,則需要提前征得同意。我們樂意看到你在引用時指出資料來源,但不強(qiáng)制要求你這么做。指出資料來源時,通常應(yīng)該包含書名、作者、出版社與ISBN。例如:The Rules of Programming by Chris Zimmerman (OReilly). Copyright 2023 Chris Zimmerman,978-1-098-13311-5.如果你覺得你對代碼的用法已經(jīng)超出了合理使用的范圍,或者不知道它是否屬于剛才說的那幾種需要征得同意的情況,歡迎你通過permissions@oreilly.com 詢問我們。OReilly 在線學(xué)習(xí)平臺(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識和卓越見解,來幫助眾多公司取得成功。公司獨(dú)有的專家和改革創(chuàng)新者網(wǎng)絡(luò)通過OReilly 書籍、文章以及在線學(xué)習(xí)平臺,分享他們的專業(yè)知識和實(shí)踐經(jīng)驗(yàn)。OReilly 在線學(xué)習(xí)平臺按照您的需要提供實(shí)時培訓(xùn)課程、深入學(xué)習(xí)渠道、交互式編程環(huán)境以及來自O(shè)Reilly 和其他200 多家出版商的大量書籍與視頻資料。更多信息,請訪問網(wǎng)站:https://www.oreilly.com/。聯(lián)系我們?nèi)魏斡嘘P(guān)本書的意見或疑問,請按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)奧萊利技術(shù)咨詢(北京)有限公司這本書在OReilly 網(wǎng)站上面有相應(yīng)的網(wǎng)頁,其中包含勘誤表、范例代碼,以及其他一些附加信息。這個頁面的網(wǎng)址是:https://www.oreilly.com/library/view/therules-of/9781098133108。如果您想跟作者表達(dá)你的想法,對本書有所評論或疑問,請參閱此書的專門網(wǎng)站https://www.therulesofprogramming.com,網(wǎng)站上面會給出反饋渠道。與我們的書籍和課程有關(guān)的新聞及信息,參見https://oreilly.com 網(wǎng)站。我們的LinkedIn:https://linkedin.com/company/oreilly-media。我們的Twitter:https://twitter.com/oreillymedia。我們的YouTube:https://www.youtube.com/oreillymedia。致謝首先,感謝可愛又多才的妻子Laura,她鼓勵我把做其他事的時間,用在寫這樣一本書上面。還要多謝幫助筆者總結(jié)出書中各條規(guī)則的人。其中包括Sucker Punch Productions以前和現(xiàn)在的所有開發(fā)者,你們都在有意或無意之間,對本書內(nèi)容提供了幫助,尤其感謝Apoorva Bansal、Chris Heidorn、David Meyer、Eric Black、Evan Christensen、James McNeill、Jasmin Patry、Nate Slottow、Matt Durasoff、Mike Gaffney、Ranjith Rajagopalan、Rob McDaniel、Sam Holley、Sean Smith、Wes Grandmont 與William Rossiter。還要感謝Sucker Punch Productions 之外的各位,給我從其他一些角度提供了思路,你們是:Adam Barr、Andreas Fredriksson、Colin Bryar、David Oliver、Max Schubert、Mike Gutmann 與Seth Fine。特別令我贊賞的是,Adrian Bentley、Bill Rockenbeck、Jan Miksovsky 與Julien Merceron 閱讀了本書的每一條規(guī)則。筆者真的是很感謝你們。最后,感謝OReilly 團(tuán)隊(duì)的每一個人,耐心地指導(dǎo)我寫完這本書,你們是:Charles Roumeliotis、Gregory Hyman、Libby James、Mary Treseler、Sara Hunter、Suzanne Huston 與Sarah Grey,特別是Sarah Grey,把筆者堅持寫進(jìn)去的一些無聊笑話給刪了,幫助團(tuán)隊(duì)其他成員大幅減輕負(fù)擔(dān)。
Chris Zimmerman在1997年與人合作創(chuàng)立了電子游戲工作室Sucker Punch Productions,并于其后的二十五年間,引領(lǐng)編程團(tuán)隊(duì)開發(fā)出許多款成功的游戲,其中包括進(jìn)入2020年TGAGame of the Year獎候選名單的《Ghost of Tsushima》。在抽出一半的時間撰寫這本書之前,他同時做著編寫代碼、管理編程團(tuán)隊(duì),以及設(shè)計游戲這三個方面的工作。
目錄前言 1規(guī)則的起源 7規(guī)則的變通 11規(guī)則1 盡量簡化,但不要簡化得太過分 15規(guī)則2 別讓bug 蔓延 33規(guī)則3 良好的名稱是最佳的文檔 53規(guī)則4 必須有三個用例才能泛化 69規(guī)則5 頭一條優(yōu)化原則就是不要優(yōu)化 89插曲:有人批評上一條規(guī)則了 107規(guī)則6 代碼審查有三個好處 111規(guī)則7 消除可能出現(xiàn)故障的情況 119規(guī)則8 運(yùn)行不到的代碼,是不管用的 143規(guī)則9 編寫可折疊的代碼 159規(guī)則10 把復(fù)雜的東西控制起來 181規(guī)則11 決定重做之前,先想想這能不能比原來好一倍 201規(guī)則12 大型團(tuán)隊(duì)需要有嚴(yán)格的約定 211規(guī)則13 找出引發(fā)崩潰的根源 225規(guī)則14 學(xué)會辨別代碼的四種風(fēng)味 245規(guī)則15 給代碼除草 263規(guī)則16 從想要的結(jié)果出發(fā)倒著推,而不要從現(xiàn)有的代碼出發(fā)正著推 271規(guī)則17 大問題有時更容易解決 299規(guī)則18 讓代碼自己說話 315規(guī)則19 通過一套平行的系統(tǒng)來修改項(xiàng)目 327規(guī)則20 先把賬算清 355規(guī)則21 有的時候,你就是得搬磚 369結(jié)語:自己掌握規(guī)則 379附錄A 寫給Python 程序員的C 指南 383附錄B 寫給JavaScript 程序員的C 指南 405