【為什麼我們要挑選這篇文章】很多想當工程師的人都會學程式,但每個工作都有卡關的時候,怎麼寫怎麼錯,寫到破頭還是沒有解決問題,如此低成效的結果,會不會一開始就出錯了?下文提供 Google 工程師寫程式的五大習慣,學會這些,寫程式的成效可能翻不只三倍囉!(責任編輯:黃穗懷)
「《科技報橘》徵才中!跟我們一起定位台灣產業創新力 >> 詳細職缺訊息
快將你的履歷自傳寄至 jobs@fusionmedium.com」
Google 招聘工程師的難度眾所周知,不僅要求工程師碼力超強,還要求有良好的程式設計習慣。
那麼他們在寫 code 的過程中,有哪些非常可貴值得我們借鑒的步驟呢。
本文作者是 Google 的軟體工程師 Steve Merritt,下面他將介紹其在 Google 的日常工作及與各種 level 的工程師(培訓生、大學生、實習生)的合作中都會用到的一些小技巧。
舉個例子來說明這個流程。
假設有個問題:給定兩個字串 sourceString 和 searchString,如果 sourceString 中含有 searchString,就返回第一個字元在 sourceString 中的索引。如果 sourceString 中沒有 searchString,就返回 -1。
寫 code 前,必須先觀察與動筆釐清問題
坦率地說,立刻就去寫 code 是種荒謬且懶惰的想法。 就好比在你寫一篇文章之前,要先弄清楚你的假設及論據,從而保證文章的內容有意義。不這麼做的話,你可能會漸漸意識到你所寫內容可能會跑題,不僅浪費時間,還影響心情。寫代碼也一樣,那時你可能像眼睛裡進了洗髮水一樣難受。
通常,解決問題的方法乍一看很簡單,但其實不然。 先在紙上書寫有助於你找到解決問題的方法,並能證實該方法可用於不同情境,這些都得在寫 code 之前完成。
所以不要急於寫 code,甚至想都不要想代碼。隨後你是有足夠的時間來做加分號、逗號這些事的。
畫個圖吧,畫上箭頭,或在框裡寫上數字,反正,用盡一些可以幫你描述問題的方法。我們的目標是解決問題,所以不要局限於鍵盤,請盡情使用你的紙筆。
先設計一些簡單輸入。如果函數要處理的是一個字串,那 abc 就是個很好的例子。試想一下正確的結果是什麼,然後梳理一下你是如何解決這個問題的,以及用到了哪些步驟。
假設字串的值如下:
我的思路:我能看出 searchString 包含於 sourceString 中。但我是如何做到的呢?對 sourceString 從左讀到最右,每 3 個字元一組和「yes」進行比對看是否匹配。
如「abc」「bcd」「cde」等。當讀到索引為 4 的字元時,發現了「yes」,這樣我就確定存在這麼一個匹配,且始於索引為 4 的字元。
當我們在寫演算法時,我們需要確保我們能表達出所有內容並能應對所有可能的場景。在找到匹配的時候理應返回正確的答案,在沒找到匹配的時候也要放回正確的答案。
試想一下另一對字串的情景:
我們把 sourceString 這個單詞從左往右讀,每 3 個字元一組地比對是否和「yes」匹配。讀到索引為 4 的字元是,我們看到「yef」,這看起來像是一樣的,但並不是,因為第三個字元不同。所以,我們一直讀到最右邊,得出的結論是沒有匹配,所以返回 -1。
我們已經能確定解決該問題需要的一系列步驟(在程式設計領域,我們稱之為演算法),並且我們已經不同情境中進行都嘗試並都得到正確的結果。基於這點,我們就認為該演算法是有效的,接下來我們就該將它演算法化。
第二步,寫下文字具體化目標
認真思考上一步中確定的演算法後,我們就可以試著用文字把它寫出來。
這麼做能使得步驟變得很具體,以便我們在後續寫 code 的時候進行參考。
從字串的首位開始讀。
– 查看由 3 個字元 (或是 searchString 中的字元數) 組成的子集。
– 如果出現和 searchString 一致的,就返回其字母的索引號。
– 如果我們讀到字串末尾都沒有能匹配的,就返回 -1。
第三步,寫一些結構相仿的程式碼
偽代碼並不是真實的代碼,但是它和代碼結構相仿。下述是我上文演算法的偽代碼:
這樣寫就更像真實代碼了:
偽代碼和真實代碼的相似度取決於你,通過長期實踐你會找到最適合你的一種形式。
第四步,嘗試將程式碼全面化
提示:如果問題比較簡單,你也可以一併完成上述步驟
這下我們需要開始考慮語法、函數參數及語言規範了。你或許不能一下就把代碼寫的很全面,沒關係,先寫下你會的。
你會發現上述代碼中我留空了一部分。我是故意的,因為我不確定在 JavaScript 語言中給字串切片的語法,所以我會在下一步中查詢該語法。
第五步,杜絕來源不明的片段程式碼
我發現新手工程師常犯這樣一個錯誤,就是在網上找到一些覺得可能有用語句,不經測試便將其加到程式中。你不理解的程式碼片段越多,就越不可能找到適合的解決方案。
隨著你不確定的內容增加,你的程式出錯的方式會呈指數式增加。當你有 1 處不確定的時候,你程式確實只會因為這 1 個原因而出錯。
但是如果有 2 處不確定,出錯就有 3 種情況(A 處出錯,B 處出錯,或者 AB 都出錯)。如果有 3 處不確定,就有 7 種情況。到時你就很難找到出錯原因了。
附注:程式出錯原因的個數如梅森序列:a(n) = (2^n) — 1
先測試一下你的新代碼。 能在互聯網上找有用的內容是很好的,但是請在將其加到程式中之前,用一個獨立的環境進行測試,以確保它能以你認為的方式運行。
在上一步中,因為不確定在 JavaScript 語言裡選取字串某個部分的方式,所以就 上網搜一下 。
第一個結果就是 w3schools 網站的,雖然內容有點老,但是通常是靠譜。
在這基礎上,假設我每次用這段代碼:
來提取 sourceString 的一部分。我會先建個例子來測試。
這時,我就能確定這個函數的執行效果了。所以,當我將它插入到我的程式中後,我也能知道程式的故障是否由它導致的。
測試完成後,我就能將這最後一部分代碼添加到我的程式裡了。
最後,我想說的是,帶著我的方法回去試試之前讓你崩潰的程式設計問題,我保證會立竿見影的。
(本文經合作夥伴 大數據文摘 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈谷歌程序员有哪些高效的编程习惯?〉。)
你會想知道
Google 首席工程師是這樣理解數據的!8 分鐘教會你什麼叫真正的「統計學」
Google 工程師:女性當不了科技主管不是歧視,是「生物」差距
軟體工程師的職涯該如何發展?AppWorks School 校友要跟你講 3 個熱血故事