??Donald Knuth(高德納)是一位計算機科學(xué)界的著名學(xué)者和計算機程序設(shè)計的先驅(qū)之一。他被譽為計算機科學(xué)的“圣經(jīng)”《計算機程序設(shè)計藝術(shù)》的作者,提出了著名的“大O符號”來描述算法的時間復(fù)雜度和空間復(fù)雜度,開發(fā)了TeX系統(tǒng)用于排版科技文獻,獲得過圖靈獎、馮·諾伊曼獎、美國國家科學(xué)獎?wù)碌榷囗棙s譽。今天要說的就是他所提出的一條軟件設(shè)計重要原則 Premature optimization is the root of all evil 過早優(yōu)化是萬惡之源。
??為什么說“過早優(yōu)化是萬惡之源”? 我認為過早優(yōu)化代碼會讓人陷入到錯誤的目標(biāo)中去,從而忽視掉了最重要的目標(biāo)。舉個很簡單的例子,你需要快速構(gòu)建一個產(chǎn)品來搶占用戶,你當(dāng)下最重要的目標(biāo)是讓這個產(chǎn)品快速上線,而不是把這個產(chǎn)品打造的好用(在中國互聯(lián)網(wǎng)下,這樣的事數(shù)不勝數(shù)),如果你只關(guān)注到后者體驗、性能問題而忽視了速度,在當(dāng)下高度競爭的市場之下,你根本毫無機會。
??當(dāng)然上面這個例子是從感性的層面說的,對很多程序猿來說也可能涉及不到產(chǎn)品層面的內(nèi)容。我們從軟件設(shè)計的層面,理性的來說,過早優(yōu)化可能會導(dǎo)致以下的一些問題:
-
增加代碼的復(fù)雜性:過度優(yōu)化可能會導(dǎo)致代碼的復(fù)雜性增加,從而降低代碼的可讀性和可維護性。如果代碼過于復(fù)雜,可能會導(dǎo)致開發(fā)人員難以理解和維護代碼,從而增加開發(fā)成本和時間。
-
耗費開發(fā)時間和資源:過度優(yōu)化可能會導(dǎo)致開發(fā)人員花費大量時間和資源在代碼的性能優(yōu)化上,而忽略了其他重要的開發(fā)任務(wù)。這可能會導(dǎo)致項目進度延誤和開發(fā)成本增加。
-
降低代碼的可移植性:過度優(yōu)化可能會導(dǎo)致代碼的可移植性降低。如果代碼過于依賴于特定的硬件或操作系統(tǒng),可能會導(dǎo)致代碼無法在其他環(huán)境中運行。
-
降低代碼的可擴展性:過度優(yōu)化可能會降低代碼的可擴展性。如果代碼過于依賴于特定的算法或數(shù)據(jù)結(jié)構(gòu),可能會導(dǎo)致代碼無法適應(yīng)未來的需求變化。
過早優(yōu)化的典型案例
??在軟件工程史上由于過度關(guān)注軟件性能導(dǎo)致項目最終失敗的案例比比皆是,比如我下面要說的一些項目,在軟件工程史上都是非常知名的項目(當(dāng)然可能有些新生代程序員已經(jīng)不知道了)。
-
IBM OS/360操作系統(tǒng):在20世紀(jì)60年代,IBM公司開發(fā)了OS/360操作系統(tǒng),這是當(dāng)時最大的軟件工程項目之一。在開發(fā)過程中,IBM公司過于關(guān)注代碼的性能問題,導(dǎo)致代碼的復(fù)雜性增加,開發(fā)時間延誤,最終導(dǎo)致項目的失敗。我知曉這個項目還是在我最近在閱讀的一本軟件工程經(jīng)典書籍《人月神話》中,也推薦大家閱讀下,這個項目雖然最終失敗了,但也給整個軟件工程領(lǐng)域留下了寶貴的經(jīng)驗。
-
Netscape Navigator瀏覽器:在20世紀(jì)90年代,Netscape公司開發(fā)了Navigator瀏覽器,這是當(dāng)時最流行的瀏覽器之一。在開發(fā)過程中,Netscape公司過于關(guān)注代碼的性能問題,導(dǎo)致代碼的復(fù)雜性增加,開發(fā)時間延誤,最終導(dǎo)致瀏覽器市場份額嚴重下降。
-
Windows Vista操作系統(tǒng):在21世紀(jì)初,微軟公司開發(fā)了Windows Vista操作系統(tǒng),這是當(dāng)時最大的軟件工程項目之一。在開發(fā)過程中,微軟公司過于關(guān)注代碼的性能問題,導(dǎo)致代碼的復(fù)雜性增加,開發(fā)時間延誤,最終導(dǎo)致操作系統(tǒng)的用戶體驗不佳,市場反響不佳。話說這個操作系統(tǒng)我還用過呢,用戶界面還是很漂亮的,很多UI設(shè)計也被沿用到了Window7中。
如何識別過早優(yōu)化
??在軟件開發(fā)過程中,如何判斷是否過早優(yōu)化呢?這里有一些概括性的判斷標(biāo)準(zhǔn),可以簡單參考下:
-
是否存在性能問題:如果代碼還沒有性能問題,那么過早優(yōu)化就是不必要的。因此,在進行優(yōu)化之前,應(yīng)該先測試代碼的性能,確定是否存在性能問題。
-
是否優(yōu)化了未來可能發(fā)生的問題:如果優(yōu)化的是未來可能發(fā)生的問題,而不是當(dāng)前存在的問題,那么就可能是過早優(yōu)化。在進行優(yōu)化之前,應(yīng)該優(yōu)先考慮當(dāng)前存在的問題,而不是未來可能發(fā)生的問題。
-
是否犧牲了代碼的可讀性和可維護性:如果優(yōu)化代碼會導(dǎo)致代碼的復(fù)雜性增加,降低代碼的可讀性和可維護性,那么就可能是過早優(yōu)化。在進行優(yōu)化之前,應(yīng)該優(yōu)先考慮代碼的可讀性、可維護性和可擴展性。
-
是否浪費了大量的開發(fā)時間和資源:如果優(yōu)化代碼會浪費大量的開發(fā)時間和資源,而不是提高代碼的性能和效率,那么就可能是過早優(yōu)化。在進行優(yōu)化之前,應(yīng)該評估優(yōu)化的成本和收益,確定是否值得進行優(yōu)化。
??判斷是否過早優(yōu)化需要根據(jù)具體情況進行評估。在進行優(yōu)化之前,應(yīng)該先測試代碼的性能,確定是否存在性能問題。同時,也應(yīng)該優(yōu)先考慮代碼的可讀性、可維護性和可擴展性,避免過度優(yōu)化。
總結(jié)
??作為一名在IT領(lǐng)域摸爬滾打多年的工程師,我深有體會地認識到過早優(yōu)化是軟件開發(fā)中的一大陷阱。在軟件開發(fā)的初期,我們可能會過于關(guān)注代碼的性能問題,而忽略了代碼的可讀性、可維護性和可擴展性。這種做法可能會導(dǎo)致代碼的復(fù)雜性增加,降低代碼的可讀性和可維護性,甚至可能會浪費大量的開發(fā)時間和資源。文章來源:http://www.zghlxwxcb.cn/news/detail-426712.html
??在軟件開發(fā)過程中,我們應(yīng)該避免過早優(yōu)化,而是優(yōu)先考慮代碼的可讀性、可維護性和可擴展性。當(dāng)需要進行性能優(yōu)化時,應(yīng)該在代碼的基礎(chǔ)上進行優(yōu)化,通過分析性能瓶頸、優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu)等方法來提高代碼的性能和效率。同時,我們也應(yīng)該意識到,性能優(yōu)化并不是軟件開發(fā)的唯一目標(biāo),我們還應(yīng)該注重代碼的可讀性、可維護性和可擴展性,以便保證代碼的質(zhì)量和可靠性。文章來源地址http://www.zghlxwxcb.cn/news/detail-426712.html
到了這里,關(guān)于為什么說過早優(yōu)化是萬惡之源?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!