開發沒有捷徑?10倍效率10倍價值的秘密在于此
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
即使是在軟件開發領域,我們也一直想象著,會否有一本“武林秘籍”能讓人很快打通任督二脈,進入軟件開發能力和效率的全新境界。
“軟件開發沒有捷徑可走!每個人都需要練習才能變得更好!”這樣的話我們聽了很多次了,但是那些擁有10倍效率的軟件生產力實踐專家是怎么做到的?有沒有什么要領可以讓人突飛猛進?有的!
但是,即使我把它分享給你,詳細地講給你聽,你可能也需要花費10年的時間才能掌握它,充分體會到它的簡單性。我就是這樣的。我的高中編程老師用通俗易懂的語言闡明了這一點,然后我通過一些示例代碼,逐步了解了應用它的流程。但直到10年后,它才真正深入我心。
這個秘密就是平均效率和10倍效率之間的關鍵區別。掌握它,你能擁有全新的效率,當出現新的需求以及代碼環境發生變化時,你可以編寫出重用性更高、損壞性更低的代碼。
這個秘訣就是掌握抽象化。很多開發人員討厭“抽象化”這個詞,你會聽到這樣的建議,比如“不要過早抽象化”,或是《Python之禪》中著名的“顯式比隱式好”,暗示具體化比抽象化好。
這些建議本身是沒有問題的,但一切都取決于具體內容。現代應用程序使用了大量的代碼。如果你把現代十大應用的源代碼打印出來,紙張高度能與摩天大樓一較高下,而軟件的維護成本也很高。你創建的代碼越多,成本就越高,而抽象化是簡單代碼的關鍵。
約翰·前田在《簡單法則》中寫道:“簡單就是減去明顯的東西,加上有意義的東西。”正確的抽象化可以通過隱藏對當前上下文不重要的細節,減少執行相同工作所需的代碼量(通常是幾個數量級),從而使代碼更具可讀性、適應性和可維護性。
圖源:unsplash
抽象不是一個單向的概念。它實際上是由兩個互補的概念構成的:
- 泛化--刪除重復的(顯而易見的)的部分,并將其隱藏在抽象之后。
- 特殊化--將抽象應用于特定用例,僅添加需要不同的部分(有意義的)。
請看以下代碼:
- constdoubleList= list => {
- const newList = [];
- for (var i =0; i < list.length; i++) {
- newList[i] = list[i] * 2;
- }
- return newList;
- };
這段代碼本身沒有什么問題,但其中包含了很多細節,對該特定的應用而言可能并不重要:
- 包含一個顯式賦值,而不是以聲明方式描述要執行的操作,這太冗長了。
- 包括正在使用的容器/傳輸數據結構(數組)的詳細信息,這意味著它僅適用于數組,它包含狀態形狀依賴性。
- 包括迭代邏輯,這意味著如果你需要其他操作,這些操作也需要訪問數據結構中的每個元素,那么你也需要在該代碼中重復非常相似的迭代邏輯。它強制重復,這違反DRY原則(請勿重復自己)。
這些都是沒有必要的部分,可以將其隱藏在“抽象”之后。如此一來,這種通用性很強的方法就能改變現代應用程序的構建方式,減少我們需要編寫的顯式for循環的數量。
使用map操作,可以將代碼簡化為單行本,即通過刪除明顯的部分(我們很可能在類似代碼中重復的部分),專注于有意義的部分(只是對于我們的用例來說需要不同的東西):
- constdoubleList= list => list.map(x => x * 2);
初級開發人員認為他們必須編寫大量代碼才能產生很多價值,而高級開發人員理解無需編任何寫代碼的價值。
想象一下,作為一名編碼員,你在像JavaScript這樣的編程語言中廣泛使用了map操作。Map可以把詳細信息抽象化,例如你要映射的數據類型,包含該數據的數據結構的類型以及枚舉數據結構中每個數據節點所需的迭代邏輯。正是這樣,十年來,它提高了我開發每個應用程序的效率。
圖源:unsplash
杰里米·阿什肯納斯使此類操作在JavaScript中變得很流行,并通過開拓在CoffeeScript中的使用,為我們在JavaScript中理所當然的許多重要語法快捷方式鋪平了道路。
他制作了Underscore和Backbone,Backscore產生了Lodash(JavaScript中最受歡迎的功能編程實用程序帶),Backbone則使JavaScript中的MVC架構得以普及,并為Angular和React奠定了基礎。
約翰·雷西格制作了非常流行和有影響力的jQuery,它形成了可重用的、封裝的JavaScript模塊(jQuery插件)的最大集合,直到幾年后出現了標準的Node模塊和ES6模塊。
jQuery的選擇器API如此有影響,它構成了當今DOM選擇API的基礎。當要對React組件進行單元測試時,我仍然能從jQuery的選擇API中受益。
給我一個足夠長的杠桿和支點,我就能翹起地球。正確的抽象就是可以極大地影響生產力的強大杠桿。抽象并不是一個令人討厭的字眼,模塊、函數、變量、類,所有這些都是抽象的形式,它們存在的全部原因是為了簡化抽象和抽象的構成。
沒有抽象就不能構建復雜的軟件。即使是匯編語言也會使用抽象——指令名稱、內存地址變量、子例程(如函數調用)跳轉到的代碼點等。現代軟件是由抽象構成的分層蛋糕,每一層都給你一個撬動不可能的支點。
圖源:unsplash
我們所追求的高效率關鍵在于簡單性,即如何減少正在生成的代碼數量,如何用更少的資源完成更多的工作,掌握抽象化,你就掌握了秘訣。