當前位置:
首頁 > 知識 > Google 程序員消滅 Bug 的 5 大法寶!

Google 程序員消滅 Bug 的 5 大法寶!

遇到問題怎麼辦?還能怎麼辦,解決唄。那到底怎麼解決呢?你是有什麼慣用的邏輯模式、解決策略,還是全靠直覺手感?

本文中,一位 Google 程序員將「現場」演示其解決編程問題的始末,看看有套路的問題解決模板,是否能幫到你。

Google 程序員消滅 Bug 的 5 大法寶!

打開今日頭條,查看更多圖片

作者 | Steve Merritt

譯者 | 彎月

責編 | 仲培藝

出品 | CSDN(ID:CSDNNews)

以下為譯文:

我將通過本文向你介紹解決編程問題的策略及始末,我會在 Google 的日常工作中用到這些策略,而且各個級別的程序員(包括參加培訓的學生、大學生和實習生等)都會通過這些策略學習以及成長。應用這種結構化流程可以最大限度地減少令人沮喪的調試過程,並在較短的時間內實現清晰正確的代碼。

具體步驟

我將通過如下練習來說明具體的步驟。


問題:「假設有兩個字元串 sourceString 和 searchString,要求你返回 sourceString 中出現的第一個 searchString 的索引。如果 sourceString 中不包含 searchString,則返回 -1。」

1)畫出來

坦白來說,立即開始寫代碼是一個荒謬且偷懶的想法。在動手撰寫一篇文章之前,首先你要想清楚論點和論據,還要確保你的論證有意義。否則你就是在浪費時間,過不了多久你就會意識到自己寫的內容無法緊密地融合在一起。編程亦是如此,而且編程的情況會更糟,就好象洗髮水不慎滴入了眼睛一般,痛苦難耐。

通常,即使看上去似乎很簡單的問題,其解決方案也並非微不足道。在紙上把問題畫出來可以幫助你找到解決方案,並通過幾種不同的情況驗證解決方案,在這之前最好一行代碼都不要寫

不要寫代碼,連寫代碼的想法都不能有。你有足夠的時間來寫那一堆的分號和括弧。你需要做的是從一台人類計算機的角度出發思考如何解決這個問題。

畫畫、使用箭頭、把數字寫到小方框中等等,無論是什麼形式,只要可以幫助你通過圖形的方式將問題表示出來就可以。你的目標是解決問題,你可以自由使用紙和筆,不要讓鍵盤局限你的思維。

首先畫出一些簡單的輸入。如果你的函數「接受一個字元串」,那麼完全可以用 "abc" 做例子,然後想清楚正確的結果是什麼。最後,試著考慮「如何」才能解決問題,以及所涉及的步驟有哪些。

讓我們假設有如下字元串:

sourceString: "abcdyesefgh"
searchString: "yes"

我具體的想法是:

好的,我在 sourceString 看見了 searchString。但是我是如何看到的?我從頭到尾查看了 searchString 中的字元,並檢查連續的 3 個字元是否匹配單詞 "yes"。例如,"abc","bcd","cde",以此類推。直到我看到第 4 個時,我找到了 "yes",所以我知道這是一個匹配成功的地方,索引從 4 開始。

在寫演算法的時候,我們需要確保可以表達清楚所有的內容,還要處理好所有可能出現的情況。如果我們找到了匹配,則返回正確的答案;但是找不到匹配時,我們也需要返回正確的答案。

我們再來試一試另一對字元串:

sourceString: "abcdyefg"
searchString: "yes"

對於這一對字元串,我從頭到尾查看了一遍 sourceString,檢查連續的 3 個字元是否匹配單詞 "yes"。當我看到第 4 個時,發現了 "yef",這個單詞已經很接近了,但沒能匹配成功,因為第三個字元不匹配。所以我繼續往下找,一直到字元串末尾,仍然沒有找到匹配成功的單詞,所以需要返回 -1。

我們已經確定了解決該問題的一系列步驟(在編程中,我們稱之為演算法),而且我們已經嘗試了幾種不同的情況,每次都能得到正確的結果。到此為止,我們可以確信我們的演算法可行,所以現在可以寫演算法了,請看下一步。

2)用文字表達出來

在這一步中,我們需要思考步驟1)中確定的演算法,並嘗試用文字表達出來。這樣做可以讓我們的實現步驟更加具體化,供我們稍後在寫代碼的時候參考。

1. 從字元串開頭開始;

2. 查看每組的 3 個字元(或者說每個 searchString 中包含的所有字元)

3. 如果找到與 searchString 匹配的單詞,則返回當前索引;

4. 如果已經到達字元串 sourceString 的末尾,卻沒有任何匹配成功,則返回 -1。

看起來不錯!

3)寫偽代碼

偽代碼不是真正的代碼,但它可以模仿代碼的結構。以下是上述演算法的偽代碼:

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

你可以自行決定偽代碼與真代碼的接近程度,經過一段時間的練習,你就可以找到最適合自己的方式!

4)翻譯成代碼


注意:對於容易解決的問題,你可以在上一步中完成這部分的工作。

整個過程中,從這一步驟開始我們才需要考慮語法、函數參數和語言規則。或許你無法寫出整段代碼,但是沒關係,把你知道的都寫出來!

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 中切割字元串的語法,所以我需要在下一步中查一查。

5)不要猜

編程新手最常見的一個錯誤就是在互聯網上尋找具體的實現方法,遇到「似乎可行」的東西,連測試都不做就放到自己的程序中。你不理解的程序越多,就越不可能找到正確的答案。

不確定的新代碼每增加一處,你的程序出問題的可能性就會加倍。你不確定的地方只有一處?那很好啊,如果你的代碼出了問題,那麼罪魁禍首也只有一個。

如果你不確定的地方有兩個?那麼出問題的可能性就有 3 種:A 出了問題、B 出了問題、A 和 B 同時出了問題!如果你不確定的地方有三處呢?那麼情況情況很快就失控了。


備註:你的程序出問題的可能性呈梅森素數序列:a(n) = (2^n) - 1

首先測試你的新代碼。通過互聯網查找代碼的實現很好,但在放到程序之前,你需要做一次單獨的小測試,確保這些代碼的工作方式與你料想的一致。

在上一步中,我不確定 JavaScript 中選擇字元串的部分語法。所以,我去 Google 了一下:


https://www.google.com/search?q=how+to+select+part+of+a+string+in+javascript

第一個搜索結果來自 w3schools。雖然有點過時,但一般都很可靠。


https://www.w3schools.com/jsref/jsref_substr.asp

根據該網頁上的說法,我覺得我應該使用:

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, searchString.length));
if (possibleMatch === searchString) {
return index;
}
}
return -1;
}

結論

如果你堅持讀到了最後,那麼我想說:趕快嘗試一下這種做法吧。回頭看看你最近遇到的編程問題,我敢保證你已經有所提高了。

祝你好運,快樂編程!


原文:https://blog.usejournal.com/how-a-googler-solves-coding-problems-ec5d59e73ec5

作者:Steve Merritt,軟體開發@Google。

本文為 CSDN 翻譯,如需轉載,請註明來源出處。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

叫板蘋果谷歌,微軟將開發者應用分成上調至 95%
程序員,不會 Debug 還做什麼開發?

TAG:CSDN |