- Go語言高效編程:原理、可觀測性與優化
- (波蘭)巴特洛米·普洛特卡
- 1866字
- 2025-05-07 12:18:22
第1章
軟件效率很重要
軟件工程師的首要任務是經濟且高效地開發可維護且合格的軟件。
——Jon Louis Bentley,Writing Efficient Programs(Prentice Hall,1982)
即使過了40年,Jon的這句名言也仍然是軟件領域的金句。任何軟件工程師的最終目標都是開發合格的、能在其生命周期內物盡其用的軟件產品。不過遺憾的是,并非每個開發者都能意識到軟件成本的重要性。現實中更殘酷的是,軟件的研發成本往往被低估。例如,Rockstar公司曾斥資1.375億美元,250名工程師耗時5年,開發出了廣受歡迎的游戲——《俠盜獵車手5》(Grand Theft Auto 5)(https://oreil.ly/0CRW2)。再比如,為了開發可用性高的商用操作系統,蘋果公司在2001年首次發布macOS(https://oreil.ly/hQhiv)之前,就已耗費超過5億美元,在當時稱得上是“巨資”。
正因軟件研發的成本很高,所以將精力集中在重要環節顯得至關重要。在理想情況下,誰也不想將珍貴的研發時間和精力浪費在不必要的事情上,例如,花費數周時間做代碼重構并不能客觀地降低代碼復雜性,或者對很少使用的功能做深度優化。因此,軟件研發行業的新模式層出不窮,以追求高效的開發過程。比如,讓我們擁抱不斷變化的需求的敏捷看板(Agile Kanban)、移動開發領域出現的專用編程語言Kotlin,或者網頁開發框架React。很多領域的工程師都在不斷地創新,因為低效注定會增加成本。
目前在軟件研發領域還有更難的問題,那就是還需要考慮到未來的成本。有資料顯示,軟件的運維成本甚至高于初始研發成本(https://oreil.ly/59Zqe)。諸如代碼變更、bug修復、事件響應、安裝以及計算成本(包括耗電量)等必要事項,只是我們計算軟件總擁有成本(TCO)的其中幾環。敏捷研發模式通過頻繁的發版和快速的反饋,可以幫助計算此成本。
然而,單純地從軟件研發過程中將效率等優化工作剔除,會帶來TCO的提升嗎?在很多場景下,為應用程序的執行多等待幾秒不是什么大問題。最重要的是,硬件成本在逐月遞減,而運行速度卻在逐月遞增。2022年,購買擁有十幾GB內存的智能手機并不困難,2TB的固態硬盤只有手指般大小,但讀寫吞吐量卻能達到驚人的7GBps(https://oreil.ly/eVcPQ),甚至連家用計算機也能達到非常高的性能分數。目前8個及以上CPU每秒能執行數十億次循環運算,加上2TB內存,應用程序在這樣的硬件上運行能顯著提升運行效率。有了這樣的硬件加持,我們就能不做優化工作了嗎?
與人相比,機器正在變得越來越廉價;任何不考慮這一點的關于計算機效率的討論都是目光短淺的。“效率”涉及整體成本的降低——不僅節省了程序生命周期中的機器時間,還包括開發者和用戶花費的時間。
——Brian W.Kernighan和P.J.Plauger,The Elements ofProgramming Style(McGraw-Hill,1978)
畢竟,優化程序的時間和空間復雜度是一個復雜的話題。特別是當你初出茅廬的時候,你可能會在一些并沒有顯著效果的優化工作上面浪費許多時間。即使我們開始關注代碼引入的延遲問題,Java虛擬機(JVM)或Go編譯器之類的組件也會幫助我們來做優化。你還可能會花費更多的時間在一些棘手的問題上,比如在當前的硬件基礎上再進行無關的優化,那會犧牲掉程序的可靠性和可維護性。這些例子只是導致工程師將性能優化視為開發工作最低優先級的幾個原因。
不幸的是,與每一種極簡思想一樣,將性能視為第一要義也存在一定的風險。不過不用擔心,在本書中,筆者不會要求你去度量每行代碼的執行納秒數或其在內存中被分配的每一個bit,也不會試圖鼓勵你將性能優化放在開發工作的首位。
然而,刻意地推遲性能優化工作和犯一些愚蠢的錯誤之間是有明顯區別的,因為這會導致程序運行效率低下。俗話說,“求全則毀”(https://oreil.ly/OogZF),但我們也要先找到其中的平衡點。因此,筆者希望作為軟件工程師的讀者在思考應用程序性能的時候能有所改變,它可以促使你在編程和研發管理周期中養成簡單卻有效的習慣。有關數據顯示,在研發周期中需要盡早判斷何時應該忽略性能問題,什么情況下應該延期解決程序的性能問題,在遇到必須做性能優化這道坎時,需要明確在哪里做優化,以及何時優化結束,以達到預期效果。
在1.1節中,筆者將剖析“性能”一詞的深層次含義。在1.2節中,將圍繞效率和性能的五個常見誤區展開詳細討論,這些誤區需要從開發者潛意識中連根拔除。此外,你還將了解到,對于效率的思考并不僅限于“高性能”軟件,這是一個基本能力。
本書有些章節(比如本章和第3章)以及其他章節的部分內容與編程語言無關,這些經驗對于非Go技術棧的開發者同樣適用。
最后,在1.3節中,你將了解到為什么關注效率能讓我們在不犧牲時間和其他軟件質量的前提下,有效地進行性能優化。本章內容會讓你感覺偏向理論,但請相信筆者,了解本章內容將使你養成對于性能優化、算法優化、代碼優化的編程意識,或許還能幫助你說服產品經理和領導,讓他們知道你對于效率的關注對整個項目是有益的。
下面我們從了解效率的定義開始本書的閱讀之旅。