簡單代碼的秘訣—去掉顯而易見的,加上有意義的
成為10倍開發人員有捷徑可走嗎? 是否有這樣一個神奇的秘密,可以幫助我們打開一個全新的軟件開發精通和生產力世界?懷疑者們通常會說:“當然沒有捷徑可走! 每個人都需要不斷的練習才能變得更好!”
的確如此,但是軟件生產力實踐的專家是什么?有沒有一件可以產生巨大變化的關鍵事情?答案是有的!但是,即使我現在拿出來分享,一字一句講給你聽,可能你還是需要要花10年才能有足夠多的經驗來領悟它極致的簡單性。
是的,這就是發生在我身上的事情。 我上學時候的程序設計老師用通俗易懂的話給我講過一遍,并且用一些示例代碼一步步教我如何去運用它。 然而直到10年后,我才真正理解。 但是現在,憑借過往的經驗,我深深地體會到了這堂課的意義,我現在就分享給你。
這個秘密是平均生產率和10倍生產率之間的關鍵區別,如同杠桿一般,可以讓我們把效率提高幾個數量級。
生產率提高10倍的秘訣是學會如何抽象(Abstraction)。 許多開發人員將“抽象”視為一個臟話。 也許你會經常聽到這樣的建議,例如“不要過早抽象”或 Python 之禪中著名的“顯式勝于隱式”,這意味著具體(Concrete)要勝于抽象。 這些建議都是很有價值的,不過也得看問題的上下文。
現代應用程序的代碼量普遍很大。 如果我們把現代十大應用程序的源代碼打印出來,那么這些紙疊起來的高度將可以比得上一座摩天大樓,由此可以想象軟件的維護成本有多高。 也就是說,寫的代碼越多,成本就越高。
抽象是簡單代碼的關鍵
正確的抽象可以隱藏對當前上下文不重要的細節,并減少執行相同工作所需的代碼量(通常減少幾個數量級),從而使代碼更具可讀性,適應性和可維護性。
簡單就是去掉顯而易見的,加上有意義的。——John Maeda《簡單的法則》
抽象并不是一條單向路。 它實際上是由兩個互補的概念構成的:
- 泛化(Generalization)——刪除重復的部分(顯而易見的部分)并將其隱藏在抽象后面。
- 特化(Specialization)——將抽象應用于特定用例,僅添加需要不同的內容(有意義的內容)。
考慮以下代碼:
- const doubleList = (list) => {
- const newList = [];
- for (var i = 0; i < list.length; i++) {
- newList[i] = list[i] * 2;
- }
- return newList;
- };
這些代碼本質上沒有錯,但其中包含許多瑣碎的細節,對于特定應用而言可能并不重要。
- 它包含正在使用的容器/數據結構(數組)的詳細信息,這意味著它僅適用于數組。 它包含狀態形狀依賴性。
- 它包含迭代邏輯,這意味著如果其他操作也需要訪問數據結構中的每個元素,則還需要在該代碼中重復非常相似的迭代邏輯,這就可能違反 DRY(Do not Repeat Yourself)原則。
- 它包括一個顯式賦值,而不是以聲明方式描述要執行的操作,太冗長了。
這些都沒有必要。所有這些都可以隱藏在抽象后面。在這種情況下,這種非常通用的抽象方法改變了現代應用程序的構建方式,并減少了我們需要編寫的顯式for循環的數量。
當你帶著深刻的覺知觸及了一個事物, 你就觸及到了一切。——釋一行
通過使用 map 操作,我們可以通過刪除明顯的代碼(我們可能會在相似的代碼中重復的部分)并將代碼集中在有意義的代碼上(只是需要與我們使用的代碼有所不同的代碼),從而簡化成一行代碼:
- const doubleList = list => list.map(x => x * 2);
初級程序員認為他們必須編寫大量代碼才能產生很多價值。而高級程序員了解無需編寫任何代碼的價值。
想象一下,作為一名程序員,他在像JavaScript這樣的編程語言中廣泛使用了map操作。Map 操作抽象了被操作的數據節點的類型,包含該數據的數據結構的類型以及每個數據節點的迭代邏輯。過去十年來,它提高了我開發的每個應用程序的效率。
Jeremy Ashkenas 使這些操作在 JavaScript 中變得很流行,并且通過開創性的 CoffeeScript,為目前 JavaScript 中理所當然的許多重要的快捷語法奠定了基礎。 他開發了 Underscore 和 Backbone,Underscore 產生了 Lodash(至今仍然是 JavaScript 中最受歡迎的工具庫之一),Backbone 則使 JavaScript 中的 MVC 架構得以普及,并為 Angular 和 React 奠定了基礎。
John Resig 開發了流行和有影響力的 jQuery,它形成了可重用的,封裝的 JavaScript 模塊(jQuery插件)的最大集合,直到幾年后標準的 Node 模塊和 ES6 模塊出現。jQuery 的選擇器 API 影響深遠,它構成了當今 DOM Selection API 的基礎。當我對 React 組件進行單元測試時,我仍然幾乎每天都會從 jQuery 的選擇 API 中受益。
正確的抽象是可以極大地影響生產力的強大杠桿。抽象不是一個臟話。模塊,函數,變量,類——所有這些都是抽象形式,它們存在的全部原因就是為了簡化抽象和抽象的構成。
沒有抽象就無法構建復雜的軟件,甚至匯編語言也使用抽象——指令的名稱,內存地址的變量,子例程(例如函數調用)跳轉到的代碼點等。現代軟件是有用的抽象的多層蛋糕,這些層為您提供了杠桿作用。
給我一根足夠長的杠桿和支撐它的支點,我將翹起整個地球。——阿基米德
簡單的關鍵就是:如何減少我們正在生產的代碼的數量,如何用更少的錢做更多的事情。掌握了這一點之后,您將成為10倍的程序員,我保證。




























