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

前言

軟件開發(fā)一直都是一個(gè)求真務(wù)實(shí)的領(lǐng)域,軟件工程師追求的往往是極高的性能目標(biāo)、需求與效率的平衡、優(yōu)雅而高效的代碼,以及易于閱讀、擴(kuò)展和維護(hù)的代碼庫。實(shí)現(xiàn)這些真的可能嗎?

是的,筆者將通過本書展示如何實(shí)現(xiàn)這些!本書在某些方面是獨(dú)樹一幟的,因?yàn)樗皇且槐舅俪山坛蹋且槐娟P(guān)于編寫高效且務(wù)實(shí)的軟件的完整指南,涵蓋了筆者在軟件開發(fā)領(lǐng)域的所見所聞。

通過本書,你將學(xué)到很多關(guān)于Go語言編程以及如何對其進(jìn)行優(yōu)化的知識。不要被本書的書名所迷惑,雖然筆者使用Go語言作為示例語言來展示優(yōu)化思維和可觀測性模式,但本書的11章中有8章與編程語言無關(guān)。這些技術(shù)理念是相通的,可以用來改進(jìn)任何其他語言(例如,Java、C#、Scala、Python、C++、Rust或Haskell)編寫的軟件。

如果你期待的是一本包含大量底層優(yōu)化技巧的書,那么這本書并不適合你。首先,軟件的性能優(yōu)化并不能一概而論。某人通過展開循環(huán)或在其結(jié)構(gòu)體字段中使用指針獲得了更好的效率,并不意味著可以推廣到所有場景!本書將介紹一些優(yōu)化技巧,但會著重強(qiáng)調(diào)效率的重要性。

其次,一些“低級”且有風(fēng)險(xiǎn)的技巧通常并沒有多大用處。在大多數(shù)情況下,只需了解程序中浪費(fèi)CPU時(shí)間和資源的癥結(jié)所在,就可以低成本、高效率地實(shí)現(xiàn)效率和可擴(kuò)展性目標(biāo)。此外,你將了解到,除了用C++、Rust或匯編語言重寫程序,在原程序基礎(chǔ)上也存在高效的解決方案!

在閱讀本書正文之前,建議先閱讀本書的前言,其中有本書的寫作目的,以及筆者專注于效率這個(gè)主題的原因。你還可以學(xué)習(xí)到如何更好地使用本書,從而在軟件開發(fā)任務(wù)中受益。

緣何而作

筆者花了大約1200小時(shí)撰寫本書,撰寫本書并非一時(shí)沖動。在社交媒體盛行的時(shí)代,閱讀與寫作紙質(zhì)書給人一種過時(shí)的感覺,但以筆者的經(jīng)驗(yàn)來看,現(xiàn)代媒體往往將信息過度簡化,因?yàn)樗鼈內(nèi)慷唐娇斓膬?nèi)容來吸引讀者,并獲得收益,因此讀者看過之后會覺得似是而非。這會導(dǎo)致不良誘導(dǎo)(https://oreil.ly/A8dCv),且與筆者想通過本書實(shí)現(xiàn)的目標(biāo)相沖突。

筆者的目標(biāo)其實(shí)很簡單——讓自己所使用或依賴的軟件變得更好,并實(shí)現(xiàn)以下目的:

? 希望軟件的貢獻(xiàn)者(Contributor)和維護(hù)者(Maintainer)能夠知曉其代碼的效率,通過持續(xù)優(yōu)化讓它變得更加高效。

? 希望軟件的貢獻(xiàn)者和維護(hù)者能夠?qū)徤鲗Υ械睦≌埱螅╬ull request),并提高效率。

? 希望周圍的人知道如何專業(yè)地處理性能問題,而不是營造緊張氛圍。

? 希望用戶和利益相關(guān)者對目前行業(yè)中風(fēng)靡的基準(zhǔn)測試和廉價(jià)營銷保持謹(jǐn)慎之心。

? 希望領(lǐng)導(dǎo)者、主管和產(chǎn)品經(jīng)理能夠充分地處理軟件效率問題,并合理制定可落地的效率規(guī)范,以幫助工程師交付出合格的產(chǎn)品。

筆者想對軟件的可持續(xù)發(fā)展盡一些綿薄之力。每一次因?yàn)檐浖男蕟栴}而浪費(fèi)的CPU時(shí)間和內(nèi)存不僅浪費(fèi)了公司的大量金錢,也浪費(fèi)了能源和硬件,從而對環(huán)境產(chǎn)生了嚴(yán)重的影響。因此,在省錢并保護(hù)環(huán)境的同時(shí)為你的企業(yè)創(chuàng)造更大的價(jià)值,是一件非常有意義的事。

筆者認(rèn)為寫一本書是實(shí)現(xiàn)這一目標(biāo)的最佳方式。這會比通過日常工作、開源項(xiàng)目和會議傳播得更廣。希望更多的人能夠看到本書。

創(chuàng)作背景

在撰寫本書時(shí),筆者已經(jīng)從大量的實(shí)踐和錯(cuò)誤中積累了經(jīng)驗(yàn),在軟件效率和開發(fā)高質(zhì)量軟件方面小有所成。

筆者在19歲時(shí)就開始了全職專業(yè)軟件開發(fā)的職業(yè)生涯,曾在英特爾從事軟件定義基礎(chǔ)設(shè)施(SDI)工作,同時(shí)還攻讀了全日制計(jì)算機(jī)科學(xué)專業(yè)。筆者的技術(shù)棧最初是使用Python為OpenStack項(xiàng)目(https://www.openstack.org)編寫代碼,然后使用C++在Mesosphere(https://oreil.ly/yUHzn)和Twitter(現(xiàn)X)與一些出色工程師合作編寫代碼[包括對當(dāng)時(shí)流行的Mesos(https://mesos.apache.org)項(xiàng)目的貢獻(xiàn)]。最近幾年,轉(zhuǎn)向?yàn)镵ubernetes(https://kubernetes.io)開發(fā)Go程序,并愛上了這門語言。

筆者在英特爾花了不少時(shí)間來研究節(jié)點(diǎn)超額訂閱功能(https://oreil.ly/uPnb7)。通常來講,超額訂閱允許在單臺機(jī)器上運(yùn)行比平時(shí)更多的程序。這樣做是可行的,因?yàn)閺慕y(tǒng)計(jì)學(xué)上來看,所有程序幾乎很少會同時(shí)使用所有的保留資源。但從筆者目前的認(rèn)知來看,通過優(yōu)化軟件來省錢通常比使用這樣的復(fù)雜算法更容易、更有效。

2016年,筆者搬到倫敦,為一家初創(chuàng)游戲公司工作,與谷歌、亞馬遜、微軟和Facebook的一些前員工合作開發(fā)和運(yùn)營一個(gè)全球游戲平臺。我們用Go開發(fā)了許多微服務(wù),主要是在全球數(shù)十個(gè)Kubernetes集群上運(yùn)行。正是在這里,筆者學(xué)到了很多有關(guān)分布式系統(tǒng)、站點(diǎn)可靠性工程和監(jiān)控的知識。也許正是在那時(shí),筆者習(xí)慣了使用一些出色的可觀測性工具,這對于軟件效率的落地至關(guān)重要。本書第6章中會對此進(jìn)行說明。

從此以后,一切順理成章。筆者將對可觀測性方面的熱情轉(zhuǎn)化為了開發(fā)和使用一個(gè)名為Prometheus(https://prometheus.io)的流行開源時(shí)間序列數(shù)據(jù)庫,以用于監(jiān)控目的。最終,筆者有幸成為一名官方維護(hù)者,同時(shí)啟動了多個(gè)Go開源項(xiàng)目和庫。最后,筆者也借此機(jī)會與Fabian Reinartz在開源社區(qū)中共同創(chuàng)建了一個(gè)名為Thanos(https://thanos.io)的大型分布式時(shí)間序列數(shù)據(jù)庫。這兩個(gè)項(xiàng)目目前的使用范圍已經(jīng)非常之廣,它們很有可能正在你的公司的基礎(chǔ)設(shè)施中運(yùn)行!

2019年,筆者加入了Red Hat,全職從事可觀測性系統(tǒng)的開源工作。也因此有了更多深入研究持續(xù)性能剖析(continuous profiling)解決方案的機(jī)會,本書正文中也會提到這一點(diǎn)。

此外,筆者還擔(dān)任了云原生計(jì)算基金會(Cloud Native Computing Foundation,CNCF,網(wǎng)址為https://cncf.io)的大使和可觀測性技術(shù)咨詢小組(TAG,網(wǎng)址為https://oreil.ly/f9UYG)的技術(shù)負(fù)責(zé)人,與其他成員共同組織會議。通過Prometheus和Thanos項(xiàng)目,筆者的團(tuán)隊(duì)每年都會通過CNCF指導(dǎo)計(jì)劃(CNCF Mentoring Initiatives,網(wǎng)址為https://oreil.ly/rU0bg[1]指導(dǎo)多名工程師。

筆者已經(jīng)編寫或?qū)彶榱顺汕先f行生產(chǎn)級的代碼,使其具備可靠性和擴(kuò)展性。到目前為止,筆者累計(jì)指導(dǎo)了20多位工程師。然而,最令筆者印象深刻的是主持開源工作,因?yàn)樵谶@項(xiàng)工作中,筆者有機(jī)會與世界各地不同公司、具有不同背景、目標(biāo)和需求的人士互動。

總的來說,筆者和共事的優(yōu)秀人員取得了一些驚人的成就。在一個(gè)高質(zhì)量代碼環(huán)境中工作是幸運(yùn)的,因?yàn)檫@樣就不會花費(fèi)時(shí)間去優(yōu)化一些延遲或風(fēng)格問題。我們致力于良好的系統(tǒng)設(shè)計(jì)、代碼可維護(hù)性和可讀性,并試圖將這些價(jià)值觀帶入開源社區(qū)。但是,如果筆者有機(jī)會再次開發(fā)像Thanos這樣的項(xiàng)目,一定會改善一件事:嘗試更多地關(guān)注代碼質(zhì)量和所選擇的算法的效率。筆者會從一開始就專注于制定更清晰的效率規(guī)范,并在基準(zhǔn)測試和性能剖析上投入更多的精力。

不要誤會,筆者這樣說并不表示Thanos的性能/效率差,相反,目前Thanos比一些競爭對手更快,而且使用的資源也更少。我們在這上面花了不少時(shí)間,但仍然有優(yōu)化空間,有許多瓶頸等待社區(qū)關(guān)注與反饋。如果從一開始就應(yīng)用本書所介紹的知識、技術(shù)和建議,筆者相信我們可以將開發(fā)成本降低一半,甚至更多,讓Thanos達(dá)到今天的狀態(tài)。

這些經(jīng)歷讓筆者頓悟?qū)懸槐具@樣的書是多么有必要!隨著全民編程時(shí)代的到來,那些沒有計(jì)算機(jī)科學(xué)背景的開發(fā)者可能會遇到很多錯(cuò)誤和誤解,尤其是在軟件效率方面。市面上沒有太多文獻(xiàn)可以為效率或擴(kuò)展問題提供參考,尤其是對于Go這樣的“年輕”語言而言更是如此。希望本書的問世能提供一些指導(dǎo)和幫助。

本書受眾

本書旨在提供必要的工具和知識,以便根據(jù)具體情況和組織目標(biāo)來明確何時(shí)以及如何應(yīng)用效率優(yōu)化。因此,本書的主要受眾是使用Go語言和任何其他現(xiàn)代編程語言編寫程序的軟件開發(fā)者。軟件工程師的本職工作應(yīng)該是確保他們創(chuàng)建的軟件能在特定的功能需求和效率要求下工作。所以在開始閱讀本書時(shí)最好具備一些基本的編程技能。

筆者相信本書對那些操作他人編寫的軟件的人也有用,例如,DevOps工程師、SRE、系統(tǒng)管理員和平臺團(tuán)隊(duì)。按照一些優(yōu)化設(shè)計(jì)層級(如3.5節(jié)中所述),有時(shí)對軟件優(yōu)化進(jìn)行投資是有意義的,而有時(shí)可能需要在其他層級去解決問題!此外,為了實(shí)現(xiàn)可靠的效率,軟件工程師必須對生產(chǎn)環(huán)境進(jìn)行大量基準(zhǔn)測試和實(shí)驗(yàn)(如第7章中所述),這通常意味著與平臺團(tuán)隊(duì)的密切協(xié)作。第6章中介紹的可觀測性是目前軟件工程中最為推薦的先進(jìn)工具。筆者強(qiáng)烈建議應(yīng)該避免為SRE區(qū)分應(yīng)用程序性能監(jiān)控(APM)和可觀測性。如果你在哪里看到了這種區(qū)分,極有可能是某些云服務(wù)商又要忽悠你付費(fèi)。正如本書中將要介紹的,可以在所有軟件可觀測性中復(fù)用相同的工具、插樁和信號[2],因?yàn)樗鼈兺谕矗兄嗤哪繕?biāo)——構(gòu)建更好的軟件產(chǎn)品!

最后,筆者向那些希望保持技術(shù)能力,并想了解如何確保團(tuán)隊(duì)不會在效率問題上浪費(fèi)數(shù)百萬美元的經(jīng)理、產(chǎn)品經(jīng)理和領(lǐng)導(dǎo)者隆重推薦本書!

內(nèi)容組織

本書共分為11章。在第1章中,將討論軟件效率及其重要性;在第2章中,將簡要介紹Go及其在效率方面的考量;在第3章中,將討論優(yōu)化以及如何思考和處理優(yōu)化。提高效率可能需要花費(fèi)大量時(shí)間,但系統(tǒng)性的方法可以幫助你節(jié)省大量時(shí)間和精力。

在第4章和第5章中,將解釋延遲、CPU和內(nèi)存資源,以及操作系統(tǒng)和Go如何將它們抽象化。

從第6章開始,將繼續(xù)討論圍繞軟件效率進(jìn)行數(shù)據(jù)驅(qū)動決策的含義;在第7章中,將討論復(fù)雜度分析和實(shí)驗(yàn)的可靠性;在第8章和第9章中,將解釋基準(zhǔn)測試和性能剖析技術(shù)。

最后兩章也很重要。在第10章中,將展示不同優(yōu)化情況的各種示例;在第11章中,將介紹一些經(jīng)驗(yàn)教訓(xùn),并總結(jié)在Go社區(qū)中看到的各種有關(guān)效率的模式和技巧。

排版約定

本書中使用如下排版約定:

斜體(Italic

用于表示URL、電子郵件地址、文件名和文件擴(kuò)展名。

等寬字體(Constant width)

用于程序清單,以及段落中的程序元素,例如,變量名或函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。

等寬粗體(Constant width bold

用于表示由用戶直接輸入的命令或其他文本。

等寬斜體(Constant width Italic

用于表示應(yīng)由用戶提供的值或根據(jù)上下文確定的值替換的文本。

該圖表示提示或建議。

該圖表示一般性說明。

該圖表示警告或注意。

示例代碼

本書包含一些示例代碼,它們將幫助你理解工具、技術(shù)和更好地進(jìn)行實(shí)踐。所有示例代碼都使用Go語言編寫,并且適用于Go 1.18及更高版本。可以從https://github.com/efficientgo/examples下載補(bǔ)充材料(示例代碼、練習(xí)等)。歡迎讀者隨時(shí)通過GitHub Issue或https://github.com/efficientgo/examples/issues提出問題或改進(jìn)建議!

請注意,為了控制篇幅并獲得清晰的視圖,本書中的示例代碼已經(jīng)過簡化,基本遵循以下規(guī)則:

? 如果沒有指定Go程序包,則視為main。

? 如果沒有指定示例的文件名或擴(kuò)展名,則假定該文件具有.go擴(kuò)展名。如果是功能測試或微基準(zhǔn)測試,則文件名必須以_test.go結(jié)尾。

? 如果未提供import語句,則假定導(dǎo)入了標(biāo)準(zhǔn)庫或先前引入的程序包。

? 有時(shí),不會在import語句中提供導(dǎo)入,而是在注釋中提供(//import<URL>)。這表示筆者想解釋示例代碼需要的眾多import中的特殊導(dǎo)入。

? 帶有三個(gè)點(diǎn)的注釋(//...)表示刪除了一些不相關(guān)的內(nèi)容。這忽略了一些邏輯,以突出更有意義的代碼。

? 帶有處理錯(cuò)誤語句的注釋(//handle error)表示已刪除錯(cuò)誤,以提高可讀性。始終在代碼中處理錯(cuò)誤!

這里的代碼是為了幫助你更好地理解本書的內(nèi)容。通常,可以在程序或文檔中使用本書中的代碼,而不需要聯(lián)系O'Reilly獲得許可,除非需要大段地復(fù)制代碼。例如,使用本書中所提供的幾個(gè)代碼片段來編寫一個(gè)程序不需要得到我們的許可,但銷售或發(fā)布O'Reilly的示例代碼則需要獲得許可。引用本書的示例代碼來回答問題也不需要許可,將本書中的很大一部分示例代碼放到自己的產(chǎn)品文檔中則需要獲得許可。

非常歡迎讀者使用本書中的代碼,希望(但不強(qiáng)制)注明出處。注明出處時(shí)包含書名、作者、出版社和ISBN,例如:

Efficient Go,作者Bart?omiej P?otka,由O'Reilly出版,書號978-1-098-10571-6。

如果讀者覺得對示例代碼的使用超出了上面所給出的許可范圍,歡迎通過permissions@oreilly.com聯(lián)系我們。

致謝

俗話說,“三人行,必有我?guī)熝伞保?i>https://oreil.ly/owETM),許多人在本書寫作過程中直接或間接地幫助了筆者,他們都是筆者的老師,筆者從他們身上學(xué)到了很多。

首先,要感謝筆者的妻子Kasia——沒有她的支持,這一切都不可能實(shí)現(xiàn)。

感謝本書的主要技術(shù)審校者M(jìn)ichael Bang和Saswata Mukherjee,他們仔細(xì)地檢查了所有內(nèi)容。感謝其他審閱早期內(nèi)容并提供寶貴反饋的人,他們是:Matej Gera、Felix Geisend?rfer、Giedrius Statkevicˇius、Bj?rn Rabenstein、Lili Cosic、Johan Brandhorst-Satzkorn、Michael Hausenblas、Juraj Michalek、Kemal Akkoyun、Rick Rackow、Goutham Veeramachaneni等。

另外,感謝開源社區(qū)中眾多才華橫溢的人,他們在公開內(nèi)容中分享了大量的知識!他們可能沒有意識到自己間接幫助了這項(xiàng)工作。讀者將在本書中看到其中一些人的分享,他們是:Chandler Carruth、Brendan Gregg、Damian Gryski、Frederic Branczyk、Felix Geisend?rfer、Dave Cheney、Bartosz Adamczewski、Dominik Honnef、William(Bill)Kennedy、Bryan Boreham、Halvar Flake、Cindy Sridharan、Tom Wilkie、Martin Kleppmann、Rob Pike、Russ Cox、Scott Mayers等。

最后,感謝O'Reilly出版社的編輯團(tuán)隊(duì),尤其是Melissa Potter、Zan McQuade和Clare Jensen提供的出色幫助。

歡迎反饋

如果你對筆者的工作有興趣,或者想在這個(gè)領(lǐng)域了解更多,請?jiān)赬(Twitter)上關(guān)注筆者(https://twitter.com/bwplotka)或訪問筆者的博客(https://www.bwplotka.dev)。

O'Reilly在線學(xué)習(xí)平臺(O'Reilly Online Learning)

40多年來,O'Reilly Media致力于提供技術(shù)和商業(yè)培訓(xùn)、知識和卓越見解,來幫助眾多公司取得成功。

我們擁有獨(dú)一無二的專家和革新者組成的龐大網(wǎng)絡(luò),他們通過圖書、文章、會議和我們的在線學(xué)習(xí)平臺分享他們的知識和經(jīng)驗(yàn)。O'Reilly的在線學(xué)習(xí)平臺允許你按需訪問現(xiàn)場培訓(xùn)課程、深入的學(xué)習(xí)路徑、交互式編程環(huán)境,以及O'Reilly和200多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請?jiān)L問https://oreilly.com

如何聯(lián)系我們

對于本書,如果有任何意見或疑問,請按照以下地址聯(lián)系本書出版商。

美國:

O'Reilly Media,Inc.

1005 Gravenstein Highway North

Sebastopol,CA 95472

中國:

北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)

奧萊利技術(shù)咨詢(北京)有限公司

要詢問技術(shù)問題或?qū)Ρ緯岢鼋ㄗh,請發(fā)送電子郵件至errata@oreilly.com.cn

本書配套網(wǎng)站https://oreil.ly/efficient-go上列出了勘誤表、示例以及其他信息。

關(guān)于書籍和課程的新聞和信息,請?jiān)L問我們的網(wǎng)站https://oreilly.com

我們在LinkedIn上的地址:https://linkedin.com/company/oreilly-media

我們在X(Twitter)上的地址:https://twitter.com/oreillymedia

我們在YouTube上的地址:https://youtube.com/oreillymedia


[1]如果你是軟件開發(fā)或開源方面的新手,可以與我們聯(lián)系,或開始嘗試提交貢獻(xiàn),并申請為期兩個(gè)月的帶薪指導(dǎo)。如果你想在指導(dǎo)他人的同時(shí)獲得樂趣,請告訴我們!我們也需要優(yōu)秀的導(dǎo)師——指導(dǎo)新一代開源維護(hù)者非常重要。

[2]筆者已經(jīng)收到了一些經(jīng)驗(yàn)豐富的人的反饋,他們甚至不知道可以借助指標(biāo)(metric)來提高效率和性能!這是基本操作,通過本書可以學(xué)到怎么做。

主站蜘蛛池模板: 磐石市| 青铜峡市| 德兴市| 宝应县| 渝中区| 疏附县| 营口市| 新民市| 五华县| 桃源县| 宁陕县| 洛南县| 东兰县| 武威市| 太保市| 怀仁县| 磴口县| 柏乡县| 诸暨市| 潼南县| 大姚县| 汝州市| 霍林郭勒市| 扬州市| 嫩江县| 甘谷县| 涟源市| 区。| 邵阳县| 虎林市| 丹凤县| 溧水县| 剑阁县| 门头沟区| 宁晋县| 吴川市| 韩城市| 威信县| 平遥县| 监利县| 黑水县|