為什麼要讓你的代碼儘可能簡單

2021-01-09 51CTO

 

編程很像寫作 —— 你應該從一個能用的「不完美的初稿」開始,再通過兩三次修改,逐個解決初稿中存在的問題。

工程師們肯定會嘲笑自己居然被輕率地比作了」作家「—— 但是今天早上的文檔又是誰寫的呢?你不是在「寫代碼」嗎?

軟體開發人員從事著最具創意的工程類型的工作。畢竟,與構建橋梁的土木工程師相比,軟體工程師在構建應用程式時可以發揮更多自己的創意。

在具有創意性的行業中工作意味著你可以向那些寫文章的作者身上學習到很多的東西。那些常常被推薦用於解決寫作困難的方法也是最好的寫作建議之一。

下面讓我來向你推薦「不完美初稿」的技巧 —— 因為它讓你成為效率更高的 「coder」。

」不完美初稿」的訣竅

「不完美初稿」的訣竅非常普遍,即使沒讀過網上那些各式各樣的關於寫作的博客,那你也可能早在英語課堂上就聽說過。

「不完美的初稿」的關鍵就是,即使你的初稿寫的非常的糟糕,但是你也只需完成初稿就夠了 —— 因為任何初稿都比什麼都沒有的空白頁強。

編輯修整自己的作品要比從頭開始編寫要容易的多,所以,你應該立即嘗試地編寫一些內容(不管是什麼內容都可以)只要能讓自己的代碼可以正常的工作。

換句話說,你今天要在午飯前寫完 100 行(有效)的不完美的代碼還是 0 行的完美代碼呢?

當然,最後的結果都是,你會用以上任何一種方式完成 50 行完美的代碼。但是編寫「不完美的初稿」能帶來心理上的優勢:你將在承受較少壓力的情況下獲得更大的成就感。

**你將會享受編碼的快樂!**難道還有什麼比這個更重要?

我該如何開始創作一份初稿

我更傾向於以「簡單的初稿」為編碼的起點,因為「不完美的初稿」似乎是對我的編碼能力的一種否認。

你是否想成為一位寫「不良代碼」的「不良程式設計師」,因為你讀過有關編寫「不完美的初稿」的建議?

不,你想成為一名「成功的程式設計師」,編寫「出色的代碼」,因為你正在遵循從「簡單的初稿」開始編碼的技巧。

如果你曾經複製過一個代碼示例,然後對其進行了調整以供自己使用,那麼實際上你已經學會了「簡單的初稿」的訣竅。

使用代碼示例時,你不可避免地要進行很多更改,但關鍵是首先要使代碼能夠工作,然後馬上對其進行改進。

無論你是編碼的新手還是專家,你都可以使用「簡單的初稿」的方法來完成任何的編程任務。

為什麼「簡單的初稿」非常有用

當你編寫了有效的代碼時,你就會感到很有成就感,這使你擁有了更好的心態。簡單的代碼更有可能第一次編寫就能成功。

另外,簡單的代碼易於編寫,從而節省了時間。的確,它可能看起來重複又囉嗦,你機智的大腦也會懇求你去找出一個更簡潔、高效的「更好」的解決方案。

忽略它

訣竅是在有這些感覺時先喝點飲料,然後在追求簡單的道路中勇往直前。等到代碼生效後,你將立即對其進行重構 —— 在擁有能夠正常工作的版本之後,你就可以讓自己想法變得更加複雜。但是在這之前,請讓事情儘可能的簡單。

寫作教練August Birch把這個稱作「分步式寫作」:寫下整個內容,接著立即將它修改潤色,完善和修改不斷交替。

但是在這一點上,編程和寫作有所不同:因為代碼必須可以成功執行,所以開發人員都知道什麼時候第一稿算是「足夠好」。當你的代碼正常工作時,這就是立即修改「簡單的初稿」的信號,並在進行下一步之前對其進行多次的完善。

對於任何只是學習編碼的人,這個方法都會提高兩項關鍵技能:編寫有效的代碼,並在不破壞正常運行的前提下改進代碼。

簡單的代碼示例

我最近通過領英平臺指導了一名初級工程師,他正為一個過於複雜的編碼挑戰而苦苦掙扎。儘管一旦你需要在真實的項目中實踐時,這樣的編碼挑戰就變得沒那麼有用,但它是如何編寫「簡單的初稿」的一個很好的例子。

由於問題很複雜,所以他打算嘗試編寫一個複雜的解決方案。讓我們來看看這個挑戰:

「編寫一個函數 addWeirdStuff,該函數將 arrayTwo 中所有奇數的和與 arrayOne 中每個 10 以下的元素相加。

類似地,addWeirdStuff 還需要將 arrayTwo 中所有偶數之和與 arrayOne 中等於或大於 10 的那些元素相加。

另外:如果 arrayOne 中的元素與 arrayTwo 中大於 20 的元素相加時,還需要額外加上 1。

值得注意的是,就像在現實生活中一樣,他得到了不完整的需求說明:函數 addWeirdStuff 應該返回一個新數組,新數組包含來自 arrayOne 以及 arrayTwo 的項。

他最開始嘗試用一個 for 循環來解決這個問題,但是最終沒有成功。這是一項複雜的認知任務,對人的工作記憶(工作記憶是短期記憶的另一個稱呼)一定是個挑戰,而他對此一籌莫展。

這個人曾經為了解決另一個代碼難題聯繫過我,因為他不小心將 return 語句放入複雜的 for 循環中。他還沒有準備好編寫簡潔的代碼。

我告訴他,他需要使用兩個單獨的 for 循環,為了簡單他應該使用 for…of 進行循環。以下是 JavaScript 代碼,以及為檢查他的代碼是否有效的測試:

View the raw code as a GitHub gist

這個代碼寫得很醜陋,效果很差,但是它可以用!並且它具有超強的可讀性,特別是對於那些剛剛開始努力學習基本概念的初學者來說。

下一步就是完善這個「簡單的初稿」。

重構時間

重構,不管你對它是愛是恨,單對於寫文章的作者們來說,就相當於一個編輯和修改的過程。在編程和其他類型的寫作中,如果是你自己編寫的文本(尤其是立即完成),修改會變得更加容易。

首先使用簡單的語言來降低文本的複雜性,然後立即進行編輯修改。這個方法適用於所有類型的寫作,包括編碼。

我從上面的「簡單的初稿」進行了重構:

View the raw code as a GitHub gist

這仍然是一個具有挑戰性的問題,還有很多其他方法可以解決此問題,但是這個版本朝著正確方向邁出了重要的一步。

在此版本的初稿中,我加了 reduce 函數因為我更喜歡在代碼中使用函數式編程

記住:「完美是好的敵人。」這只是你的初稿,你可以再次編輯!那是分步式的過程。

我還將可讀性的優先級提高了,可讀性高於性能, 因為我在每個內部循環中使用了 .some()。這是 O(n2) 的雙層循環。對於小型的數組矩陣,這對性能沒什麼影響,但是這樣的操作可能會讓你找不著工作。在我的下次一次重構的版本中,這也是不是重要的優化項。

我決定在完成「簡單的初稿」前,我又使用 .map() 進行了一輪變更:

View the raw code as a GitHub gist

這是一個 「被改善的初稿」。我將兩個 for…of 循環改成使用一次 .reduce()、一次 .some()、以及一次 .map()。我更喜歡這種編碼風格。但是老實說,我的初稿沒有什麼「錯」,因為它是能用的,不是嗎?

現在,是切換編碼任務並決定明天再次審閱此段代碼的好時機。

應用於的真實編碼場景

在實際工作中,我們經常會收到混亂的需求說明以及最晚交付日期的壓力,特別是在使用新的 API 時。每個編碼人員有時都會想:「為什麼這段代碼不能正常的工作?」

對於我指導的這個學生來說,他從無法將問題概念化到輕鬆解決問題,因為他是從簡單的for…of 循環開始的。得益於「簡單的初稿」,他沒有感到困難和挫敗,反而感到成功和成就。

如果你更有經驗,很自然的就能使用 .reduce()來解決問題,那就大膽試試吧!但是如果你需要查找語法,看看是否在不查找語法的情況,對代碼進行重構。因為在編碼階段你是可以一直對代碼進行修改的。

同樣地,如果你用的是 JavaScript,你可能希望能在在返回中增加類型檢查。這作為一個編碼挑戰,這不是必需的,可以第二天再考慮加上。

在現實世界的其他場景中,「簡單初稿」編碼方法的缺點在於你將頻繁進行 git commit:至少,在進行分步式開發時,需要頻繁提交初稿的每個版本。在完成初稿前,你可能已經提交了三四個工作版本。

如果在後續的工作中發現了問題,你會對之前的多次提交感到慶幸,因為你可以根據提交發現問題所在並找到解決方案。

另外,代碼的提交次數能給我超級大的驅動力,特別是當我遠程辦公時。

測試

根據你對測試的個人偏好,完全可以在寫代碼之前寫測試。只需遵循相同的方法即可:寫儘可能簡單的測試,然後在測試代碼可以正常工作後立即對其進行重構。

或者,像大多數程式設計師一樣,你可能更喜歡在有一段可以工作的代碼之後進行測試 —— 這也完全可以,在編寫代碼並將其重構一次或兩次之後,編寫一些簡單的測試,然後再對測試代碼進行重構。

我知道寫代碼的最快方法是完全執行以下操作:

寫簡單的代碼 寫簡單的測試 用簡單的測試重構簡單的代碼 重構簡單的測試

就個人而言,我發現專注於「不完美的初稿」(或我喜歡說的「簡單初稿」)使我更有可能先寫測試,因為我並不在乎寫的測試是否是完美的。

你甚至可以考慮將測試視為工作的「第二稿」,把測試任務推遲到明天。千萬別忘了測試,就當是一切都為了你自己,你的項目和你的公司。

結論

無論你是代碼新手,初級工程師還是專家,只要你不專注於完美,都將可以更快地寫更多代碼。從「簡單的初稿」開始,然後在代碼生效後立即對其進行修整。

從一位技術作家那裡獲取經驗,該作家去年使用 10 種程式語言撰寫了 100,000 個有關 JavaScript 的文字 —— 這個寫作技巧對開發人員和作家均適用。

我對所有級別的程式設計師的真正建議是,你的初稿應該重複,甚至感覺像是「黑客」。首先忘記基本的編碼原則這篇文中所倡導的(不要自我重複),然後再堅持最基本的編碼規則:

「KISS」 (Keep It Simple, Stupid!)

一旦你做到了這一點,你就可以使你的代碼變得漂亮,但是如果你必須花費數小時的調試時間,那麼一整天的工作就會花光了 —— 甚至無法讓那段代碼正常工作。相信我,我就經歷過!

而且,如果你只是在學習新的程式語言,開發工具或代碼庫,則此建議是強制性的、必選的。

編碼快樂!

原文地址:Why You Should Make Your Code as Simple as Possible

原文作者:Dr. Derek Austin ??

譯文出自:掘金翻譯計劃

本文永久連結:https://github.com/xitu/gold-miner/blob/master/article/2020/why-you-should-make-your-code-as-simple-as-possible.md

譯者:NieZhuZhu(彈鐵蛋同學)

校對者:Yuxiao Alisa Shi、flashhu、lsvih

本文轉載自微信公眾號「前端鐵蛋」,可以通過以下二維碼關注。轉載本文請聯繫前端鐵蛋公眾號。

【編輯推薦】

【責任編輯:

武曉燕

TEL:(010)68476606】

點讚 0

相關焦點

  • 只加兩行代碼,為什麼要用兩天?
    ……不管你是網際網路公司的正規軍,還是兼職外包的開發者,你或多或少都會遇到各種各樣來自產品、客戶、老闆們的花樣繁多的需求,而且他們都一致認為:這個需求很簡單。可事實果真如此嗎?「只加了兩行代碼,為什麼你要用兩天時間?」
  • 找工作為什麼要盡力去BAT這樣的大公司?其中的道理你一定要懂
    找工作一定要儘可能找大廠!為什麼?你一定要先明白一個道理:隨性的工作流程絕對不會產出高質量的人才、產品和企業,自由慣了只會讓你的競爭力急劇下降!而大廠的合規會讓你養成一個優秀、通用、受人青睞的工作習慣!
  • FANUC 為什麼有些M代碼在梯形圖中搜索不到
    M代碼調用子程序一般數控設備都會設置很多M代碼用於完成各種功能,如常用的自動門開/關,夾具夾緊/放鬆等功能,而這些M代碼都是由設備廠家在梯形圖中編寫好的,設備廠家不同,可能某一功能對應的M代碼也會有所差異
  • 這些Python代碼技巧,你肯定還不知道
    collectionsPython 有一些很棒的默認數據類型,但有時候它們可能不會盡如你意。不過,Python 標準庫提供了 collections 模塊。這個方便的附加組件可以為你提供更多數據類型。geopy地理(Geography)對於程式設計師來說可能是一個具有挑戰性的領域。但是 geopy 模塊讓它變得異常簡單。
  • 如果我愛你,就會儘可能告訴你,我為什麼生氣?
    「我如果愛你一定會儘可能告訴你我為什麼生氣」這個事情侶間夫妻間相處之道,我看得最多的是我的媽媽我的媽媽是典型的那種,我覺得我不說,你也應該知道。在別人依舊搞不懂她生氣的原因時候,她早就各種覺得不值得了,不能過了,不愛了,沒感情了。可想而知,她的情感生活一塌糊塗。男性思維和女性思維的差異性真的是很巨大的。我曾也是媽媽這種想法,覺得愛你的人應該什麼都懂你,愛你的人不需要你開口,這口雞湯真的好毒。
  • iPhone在微信上輸入這個代碼彈出窗口可能是山寨機
    在諾基亞智慧型手機的時代,在中國市場上有一種稱為山寨機的手機,雖然315剛剛過去,但是我們也要有打假的心態,不要被奸商坑害,尤其是低價購買iPhone的朋友們更應該看一樣這篇文章。大家都知道,目前智慧型手機使用的系統無非就是Android和ios,目前市場上仍然充斥著部分山寨手機,今天就給大家一個簡單的辨別手機真偽的小技巧。微信成為了大家日常交流的常用軟體之一,其實微信也有一個小功能,就是通過代碼來查詢識別手機的製造商、型號等信息,不過這個功能僅限於Android系統。
  • 像搭樂高一樣簡單,Treelab用「無代碼工具」處理跨平臺數據|GGV...
    作為「創二代」,我非常感謝父母給我的話:任何時候,都要去做你認為可以最大化降低你後悔成本的事情。 他對我說:你剛才展示的功能,Airtable都能實現。 我有點不服,一個通用軟體怎麼會解決服裝行業這種垂直業務呢?畢竟服裝是一個高度複雜的行業,連SAP都很少碰這個領域。結果他花了一周時間,寫了大概兩百行代碼,把我用兩年多時間、幾百萬行代碼寫的軟體用Airtable包裝成一個新版本,不僅能調動API,也能顯現清晰的業務邏輯。
  • 為什麼說 2017 年你必須要學習 Go 了
    為什麼要學習GoGo是未來的服務端語言— Tobias Lütke, Shopify。在過去的幾年中,Golang逐步流行起來。 還有什麼能比一門新語言讓碼農們瘋狂呢?
  • 如何設計 React 代碼結構?
    在本文中,我只會介紹在設計React代碼結構方面的個人喜好,以及其中的原因。希望你能從中借鑑一二,或者至少可以從不同的角度理解這個問題。拼圖首先,我想簡單地介紹一下我是哪種程式設計師。在寫代碼時,我會需要構建的東西看成基本的組成部分,就像拼圖一樣。
  • 不得不看的11條HTML5代碼 告別簡單重複
    但當你創建網頁時,你會經常做類似於創建表單這種重複的工作,既浪費時間又讓人厭煩。在這篇文章中,我們準備了11個非常不錯的HTML 5代碼片段,可以大大簡化工作量,豐富你的前端代碼。  1.HTML 5初始模板  當開始一個新的項目時,你可能需要一個初始的模板。下面這段代碼, 是一個極為簡潔且乾淨的、基於HTML 5的項目模板。
  • 軟體測試代碼很難?手把手教你寫出阿里巴巴註冊界面
    認識HTML如果我要問小夥伴們,什麼是網頁,這個東西大家都會,都知道。比如說用瀏覽器輸入網址打開的頁面,我們就把它叫做網頁。那如果我要問你,這個網頁它是怎麼組成的?它是用什麼語言來顯示的,那這一塊可能有些小夥伴就不知道了。那麼我告訴你的話呢,我們所謂的這一些網頁,其實它就是由HTML語言呢,來構建的。
  • 史蒂文斯:西亞卡姆很強你只能儘可能防守他
    【史蒂文斯:西亞卡姆很強你只能儘可能防守他】綠軍主帥史蒂文斯在接受採訪時稱讚了猛龍球員西亞卡姆:「他太棒了,他很強硬。只能盡你所能去防守他。我知道這聽起來很簡單,但你只是儘量做到最好。他能做他想做到的,他身體強壯。他是個很好的競爭對手。所以每次你防守他,你真的要付出很多。看到下半場開始時,他有幾個精彩的上籃,看來他們要為下半場的比賽方式定下基調,而且,你知道,他很堅強。」
  • 不要將時間浪費到編寫完美代碼上 - OSCHINA - 中文開源技術交流社區
    相比之下,某行代碼甚至某個設計的生命周期則要短很多,只有幾個月或者幾天,甚至當你為了解決一個問題迭代測試不同方案時它們的生命周期只有幾分鐘。代碼是否正確運行?是否有用?是否高效?能否處理錯誤和損壞的數據而不會崩潰,至少也要安全的失效?調試是否方便?修改起來是否簡單且安全?這些不是美觀的組成部分,而是實際中衡量代碼是否正確的標準。
  • 醫院顏色代碼 你真以為自己聽懂了嗎?
    點擊查看 醫院有很多代碼,最出名的是「藍色代碼」(Code Blue)(急診)。除此之外,其他顏色代碼名目繁多,顏色和對應病情之間的聯繫有時也讓人困惑,甚至醫生自己也會分不清。本文帶你略作梳理,一探究竟。
  • 最近,你的手機莫名其妙出現這串靈異代碼了嗎?
    最近,大量網友在網上發布求助帖:剪切板莫名其妙突然出現了靈異代碼,怎麼辦?綜合網上的用戶反饋,這些代碼的開頭看起來有點類似淘寶的淘口令。許多用戶表示,本來以為可能是手機放口袋時誤觸的,現在發現這個不是。而在網上搜了下,這樣的情況不是個例。
  • 為什麼又要「無無明盡」?
    為什麼又要「無無明盡」?在知道這個之前,我們首先要懂得,什麼是無明。佛教當中,把無明分為兩種,一種是來自自身的一種顛倒妄見。還有一種是無始以來,就存在自身內的。簡單點說,一種就是來自外界所引起的煩惱,另一種就是來自本身所引起的煩惱。所謂的無無明,就是要將所有的煩惱滅盡。
  • 隨機密碼生成器|給你代碼
    在這個快節奏的數字網絡生活中,當你要創建一個新帳戶,是否為創建符合網站或平臺要求的密碼而頭疼不已?經常對自己的密碼有創造和選擇困難症?看看下面這些密碼:你是不是曾經也使用過它們?這是全球黑客統計出的前十最高使用頻率的密碼!
  • 人類有沒有可能被「代碼」設計出來的?
    玩多了《我的世界》可能你什麼沒學到,就認識到了BUG=特性。  為什麼人類智商可以使我們成為地球的主宰,可「生孩子」這件事卻死亡率如此之高?可能有人會提到熊貓,熊貓難道不比人類更加難以生產麼?要知道它們都成了稀有動物了。
  • 為什麼程式設計師編寫的第一行代碼是Hello,World
    你現在可以去一個網站,在那裡你可以用程式語言Python運行代碼。現在類型這一行…點擊綠色「運行」按鈕在頁面的頂部附近。瞬間: 你將看到計算機執行你的命令和說你好,世界!(如果你真的想耍酷,你可以在這裡看到用28種不同語言編寫的示例。)但「你好,世界」如此受歡迎的真正原因是它純粹的隱喻。它直接觸及了編程的樂趣,這是一種非常普羅米修斯式的東西。畢竟,編寫和運行代碼常常感覺像一種魔術。你在創造一個生命形態,一個傀儡,一個會走路和說話的東西,好像它是活著的。
  • 提問:為什麼大學老師教編程課,一般都不敲代碼?
    最近在知乎上有這樣一個問題吸引了數百萬的吃瓜網友圍觀:為什麼大學老師教編程課一般都不敲代碼?大家猜猜為什麼?你作為學生會怎麼看這個老師?正因為這種狀況比較難看,所以我是會極力避免的。我一般不會在 live coding 時寫我之前從來沒寫過的代碼,往往我在備課時就寫好了一個能跑通的版本,作為標準答案放在一個我不投影的屏幕上。