谷歌程式設計師有哪些高效的程式設計習慣?
大資料文摘出品
來源:medium
編譯:高延、蔣寶尚
谷歌招聘程式設計師的難度眾所周知,不僅要求程式設計師碼力超強,還要求有良好的程式設計習慣。
那麼他們在寫程式碼的過程中,有哪些非常可貴值得我們借鑑的套路呢。
本文作者是谷歌的軟體工程師Steve Merritt,下面他將介紹其在谷歌的日常工作及與各種level的程式設計師(培訓)、大學生、實習生)的合作中都會用到的一些小技巧。
舉個例子來說明這個流程。
假設有個問題:給定兩個字串sourceString和searchString,如果sourceString中含有searchString,就返回第一個字元在sourceString中的索引。如果sourceString中沒有searchString,就返回-1。
先畫個圖
坦率地說,立刻就去敲程式碼是種荒謬且懶惰的想法。就好比在你寫一篇文章之前,要先弄清楚你的假設及論據,從而保證文章的內容有意義。不這麼做的話,你可能會漸漸意識到你所寫內容可能會跑題,不僅浪費時間,還影響心情。寫程式碼也一樣,那時你可能像眼睛裡進了洗髮水一樣難受。
通常,解決問題的方法乍一看很簡單,但其實不然。先在紙上寫寫有助於你找到解決問題的方法,並能證實該方法用於不同情境,這些都得在敲程式碼之前完成。
所以不要急於敲程式碼,甚至想都不要想程式碼。隨後你是有足夠的時間來做加分號、逗號這些事的。
畫個圖吧,畫上箭頭,或在框裡寫上數字,反正,用盡一些可以幫你描述問題的方法。我們的目標是解決問題,所以不要侷限於鍵盤,請盡情使用你的紙筆。
先設計一些簡單輸入。如果函式要處理的是一個字串,那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://
第一個結果就是w3schools網站的,雖然內容有點老,但是通常是靠譜。
w3schools:
在這基礎上,假設我每次用這段程式碼
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;
}
總結
最後,我想說的是,帶著我的方法回去試試之前讓你奔潰的程式設計問題,我保證會立竿見影的。
祝你好運,編碼愉快!
相關報導:
https://blog.usejournal.com/how-a-googler-solves-coding-problems-ec5d59e73ec5?gi=af7ed9a9dff9
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562039/viewspace-2641438/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 高效程式設計師的七個習慣程式設計師
- 10 倍效率的程式設計師有哪些好習慣?程式設計師
- 優秀的程式設計師都有哪些習慣?程式設計師
- 高效能程式設計師的七個習慣程式設計師
- 成為高效程式設計師的7個重要習慣程式設計師
- 我的iOS高效程式設計祕訣-堅持程式設計習慣iOS程式設計
- 高效程式設計師的45個習慣 讀書筆記程式設計師筆記
- 分享成為高效程式設計師的7個重要習慣程式設計師
- 高效程式設計師應該養成的七個習慣程式設計師
- 程式設計師偷偷深愛的 9 個不良程式設計習慣程式設計師
- 程式設計師的10個好習慣程式設計師
- 成功程式設計師的8個習慣程式設計師
- 《高效程式設計師的45個習慣》簡評及書摘程式設計師
- 程式設計師的35個壞習慣,你有幾條?程式設計師
- 有前途的程式設計師的14個習慣,你有幾個?程式設計師
- 好的程式設計習慣程式設計
- 程式設計好習慣程式設計
- 低效程式設計師的7個壞習慣程式設計師
- 優秀程式設計師的十個習慣程式設計師
- IT程式設計師面試技巧有哪些?程式設計師面試
- 分享 程式碼大全 節選 -- 程式設計師的習慣程式設計師
- 卓越程式設計師和優秀程式設計師有哪些區別?程式設計師
- 10個程式設計好習慣:優秀程式設計師的經驗分享程式設計師
- 助力程式設計師成功的幾個好習慣程式設計師
- 快樂Node程式設計師的10個習慣程式設計師
- 100分程式設計師的8個習慣程式設計師
- 程式設計師有哪些發展方向程式設計師
- 優秀程式設計師7個好習慣程式設計師
- 程式設計師特有的9個壞習慣程式設計師
- 有前(錢)途的程式設計師的14個習慣,你有幾個?程式設計師
- 看看你身邊的程式設計師有這8個習慣嗎程式設計師
- 程式設計中,有哪些好的習慣一開始就值得堅持?程式設計
- 程式設計老手的哪些特點,是值得新手程式設計師學習的?程式設計師
- 學習web前端誤區有哪些-好程式設計師Web前端程式設計師
- 頂尖程式設計師的10個優良習慣程式設計師
- 資深程式設計師的16個優良習慣!!!程式設計師
- 程式設計師保持天天快樂的6個習慣程式設計師
- 關注程式設計師的生活——健康,運動,習慣程式設計師