谷歌程序員有哪些高效的編程習慣?

image
谷歌招聘程序員的難度衆所周知,不只要求程序員碼力超強,還要求有良好的編程習慣。javascript

那麼他們在寫代碼的過程當中,有哪些很是難得值得咱們借鑑的套路呢。java

本文做者是谷歌的軟件工程師Steve Merritt,下面他將介紹其在谷歌的平常工做及與各類level的程序員(培訓生、大學生、實習生)的合做中都會用到的一些小技巧。程序員

舉個例子來講明這個流程。算法

假設有個問題:給定兩個字符串sourceString和searchString,若是sourceString中含有searchString,就返回第一個字符在sourceString中的索引。若是sourceString中沒有searchString,就返回-1。編程

先畫個圖函數

坦率地說,馬上就去敲代碼是種荒謬且懶惰的想法。就比如在你寫一篇文章以前,要先弄清楚你的假設及論據,從而保證文章的內容有意義。不這麼作的話,你可能會漸漸意識到你所寫內容可能會跑題,不只浪費時間,還影響心情。寫代碼也同樣,那時你可能像眼睛裏進了洗髮水同樣難受。測試

一般,解決問題的方法乍一看很簡單,但其實否則。先在紙上寫寫有助於你找到解決問題的方法,並能證明該方法可用於不一樣情境,這些都得在敲代碼以前完成。網站

因此不要急於敲代碼,甚至想都不要想代碼。隨後你是有足夠的時間來作加分號、逗號這些事的。google

畫個圖吧,畫上箭頭,或在框裏寫上數字,反正,用盡一些能夠幫你描述問題的方法。咱們的目標是解決問題,因此不要侷限於鍵盤,請盡情使用你的紙筆。編碼

先設計一些簡單輸入。若是函數要處理的是一個字符串,那abc就是個很好的例子。試想一下正確的結果是什麼,而後梳理一下你是如何解決這個問題的,以及用到了哪些步驟。

假設字符串的值以下:

sourceString: "abcdyesefgh"
searchString: "yes"

個人思路:我能看出searchString 包含於sourceString中。但我是如何作到的呢?對sourceString從左讀到最右,每3個字符一組和‘yes’進行比對看是否匹配。

如‘abc’‘bcd’‘cde’等。當讀到索引爲4的字符時,發現了‘yes’,這樣我就肯定存在這麼一個匹配,且始於索引爲4的字符

當咱們在寫算法時,咱們須要確保咱們能表達出全部內容並能應對全部可能的場景。在找到匹配的時候理應返回正確的答案,在沒找到匹配的時候也要放回正確的答案。

試想一下另外一對字符串的情景:

sourceString: "abcdyefg"
searchString: "yes"

咱們把sourceString 這個單詞從左往右讀,每3個字符一組地比對是否和‘yes’匹配。讀到索引爲4的字符是,咱們看到‘yef’,這看起來像是同樣的,但並非,由於第三個字符不一樣。因此,咱們一直讀到最右邊,得出的結論是沒有匹配,因此返回-1。

咱們已經能肯定解決該問題須要的一系列步驟(在編程領域,咱們稱之爲算法),而且咱們已經不一樣情境中進行都嘗試並都獲得正確的結果。基於這點,咱們就認爲該算法是有效的,接下來咱們就該將它算法化。

用文字寫出來

認真思考上一步中肯定的算法後,咱們就能夠試着用文字把它寫出來。

這麼作能使得步驟變得很具體,以便咱們在後續敲代碼的時候進行參考。

從字符串的首位開始讀。

查看由3個字符(或是searchString中的字符數)組成的子集。
若是出現和searchString一致的,就返回其字母的索引號。
若是咱們讀到字符串末尾都沒有能匹配的,就返回-1。
寫僞代碼

僞代碼並非真實的代碼,可是它和代碼結構相仿。下述是我上文算法的僞代碼:

for each index in sourceString,
     there are N characters in searchString
     let N chars from index onward be called POSSIBLE_MATCH
     if POSSIBLE_MATCH is equal to searchString, return index
    at the end, if we haven't found a match yet, return -1.

這樣寫就更像真實代碼了:

for each index in sourceString,
 N = searchString.length
 POSSIBLE_MATCH = sourceString[index to index+N]
 if POSSIBLE_MATCH === searchString:
 return index
return -1

僞代碼和真實代碼的類似度取決於你,經過長期實踐你會找到最適合你的一種形式

轉化爲代碼

提示:若是問題比較簡單,你也能夠一併完成上述步驟

這下咱們須要開始考慮語法、函數參數及語言規範了。你或許不能一下就把代碼寫的很全面,不要緊,先寫下你會的。

function findFirstMatch(searchString, sourceString) {
 let length = searchString.length;
 for (let index = 0; index < sourceString.length; index++) {
 let possibleMatch = <the LENGTH chars starting at index i>
 if (possibleMatch === searchString) {
 return index;
 }
 }
 return -1;
}

你會發現上述代碼中我留空了一部分。我是故意的,由於我不肯定在JavaScript語言中給字符串切片的語法,因此我會在下一步中查詢該語法。

不要猜

我發現新手程序員常範這樣一個錯誤,就是在網上找到一些以爲可能有用語句,不經測試便將其加到程序中。你不理解的代碼段越多,就越不可能找到適合的解決方案。

隨着你不肯定的內容增長,你的程序出錯的方式會呈指數式增長。當你有1處不肯定的時候,你程序確實只會由於這1個緣由而出錯。

可是若是有2處不肯定,出錯就有3種狀況(A處出錯,B處出錯,或者AB都出錯)。若是有3處不肯定,就有7種狀況。到時你就很難找到出錯緣由了。

附註:程序出錯緣由的個數如梅森序列:a(n) = (2^n) — 1

先測試一下你的新代碼。能在互聯網上找有用的內容是很好的,可是請在將其加到程序中以前,用一個獨立的環境進行測試,以確保它能以你認爲的方式運行。

在上一步中,由於不肯定在JavaScript語言裏選取字符串某個部分的方式,因此就上網搜一下。

參考以下連接:
https://www.google.com/search...

第一個結果就是w3schools網站的,雖然內容有點老,可是一般是靠譜。

w3schools:
https://www.w3schools.com/jsr...

在這基礎上,假設我每次用這段代碼

substr(index, searchString.length)

來提取sourceString的一部分。我會先建個小例子來測試。

>> let testStr = "abcdefghi"
>> let subStr = testStr.substr(3, 4); // simple, easy usage
>> console.log(subStr);
"defg"
>> subStr = testStr.substr(8, 5); // ask for more chars than exist
"i"

這時,我就能肯定這個函數的執行效果了。因此,當我將它插入到個人程序中後,我也能知道程序的故障是否由它致使的。

測試完成後,我就能將這最後一部分代碼添加到個人程序裏了。

function findFirstMatch(searchString, sourceString) {
 let length = searchString.length;
 for (let index = 0; index < sourceString.length; index++) {
 let possibleMatch = (
 sourceString.substr(index, length));
 if (possibleMatch === searchString) {
 return index;
 }
 }
 return -1;
}

總結

最後,我想說的是,帶着個人方法回去試試以前讓你奔潰的編程問題,我保證會立竿見影的。祝你好運,編碼愉快!

相關文章
相關標籤/搜索