自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

谷歌程序員有哪些高效的編程習(xí)慣?

開發(fā) 開發(fā)工具 前端
谷歌招聘程序員的難度眾所周知,不僅要求程序員碼力超強(qiáng),還要求有良好的編程習(xí)慣。那么他們在寫代碼的過程中,有哪些非??少F值得我們借鑒的套路呢。

[[262673]]

大數(shù)據(jù)文摘出品

來源:medium

編譯:高延、蔣寶尚

谷歌招聘程序員的難度眾所周知,不僅要求程序員碼力超強(qiáng),還要求有良好的編程習(xí)慣。

那么他們在寫代碼的過程中,有哪些非??少F值得我們借鑒的套路呢。

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

舉個(gè)例子來說明這個(gè)流程。

假設(shè)有個(gè)問題:給定兩個(gè)字符串sourceString和searchString,如果sourceString中含有searchString,就返回***個(gè)字符在sourceString中的索引。如果sourceString中沒有searchString,就返回-1。

先畫個(gè)圖

坦率地說,立刻就去敲代碼是種荒謬且懶惰的想法。就好比在你寫一篇文章之前,要先弄清楚你的假設(shè)及論據(jù),從而保證文章的內(nèi)容有意義。不這么做的話,你可能會漸漸意識到你所寫內(nèi)容可能會跑題,不僅浪費(fèi)時(shí)間,還影響心情。寫代碼也一樣,那時(shí)你可能像眼睛里進(jìn)了洗發(fā)水一樣難受。

通常,解決問題的方法乍一看很簡單,但其實(shí)不然。先在紙上寫寫有助于你找到解決問題的方法,并能證實(shí)該方法可用于不同情境,這些都得在敲代碼之前完成。

所以不要急于敲代碼,甚至想都不要想代碼。隨后你是有足夠的時(shí)間來做加分號、逗號這些事的。

畫個(gè)圖吧,畫上箭頭,或在框里寫上數(shù)字,反正,用盡一些可以幫你描述問題的方法。我們的目標(biāo)是解決問題,所以不要局限于鍵盤,請盡情使用你的紙筆。

先設(shè)計(jì)一些簡單輸入。如果函數(shù)要處理的是一個(gè)字符串,那abc就是個(gè)很好的例子。試想一下正確的結(jié)果是什么,然后梳理一下你是如何解決這個(gè)問題的,以及用到了哪些步驟。

假設(shè)字符串的值如下:

  1. sourceString: "abcdyesefgh" 
  2. searchString: "yes" 

我的思路:我能看出searchString 包含于sourceString中。但我是如何做到的呢?對sourceString從左讀到最右,每3個(gè)字符一組和‘yes’進(jìn)行比對看是否匹配。

如‘abc’‘bcd’‘cde’等。當(dāng)讀到索引為4的字符時(shí),發(fā)現(xiàn)了‘yes’,這樣我就確定存在這么一個(gè)匹配,且始于索引為4的字符

當(dāng)我們在寫算法時(shí),我們需要確保我們能表達(dá)出所有內(nèi)容并能應(yīng)對所有可能的場景。在找到匹配的時(shí)候理應(yīng)返回正確的答案,在沒找到匹配的時(shí)候也要放回正確的答案。

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

  1. sourceString: "abcdyefg" 
  2. searchString: "yes" 

我們把sourceString 這個(gè)單詞從左往右讀,每3個(gè)字符一組地比對是否和‘yes’匹配。讀到索引為4的字符是,我們看到‘yef’,這看起來像是一樣的,但并不是,因?yàn)榈谌齻€(gè)字符不同。所以,我們一直讀到最右邊,得出的結(jié)論是沒有匹配,所以返回-1。

我們已經(jīng)能確定解決該問題需要的一系列步驟(在編程領(lǐng)域,我們稱之為算法),并且我們已經(jīng)不同情境中進(jìn)行都嘗試并都得到正確的結(jié)果?;谶@點(diǎn),我們就認(rèn)為該算法是有效的,接下來我們就該將它算法化。

用文字寫出來

認(rèn)真思考上一步中確定的算法后,我們就可以試著用文字把它寫出來。

這么做能使得步驟變得很具體,以便我們在后續(xù)敲代碼的時(shí)候進(jìn)行參考。

從字符串的首位開始讀。

  • 查看由3個(gè)字符(或是searchString中的字符數(shù))組成的子集。
  • 如果出現(xiàn)和searchString一致的,就返回其字母的索引號。
  • 如果我們讀到字符串末尾都沒有能匹配的,就返回-1。

寫偽代碼

偽代碼并不是真實(shí)的代碼,但是它和代碼結(jié)構(gòu)相仿。下述是我上文算法的偽代碼:

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

這樣寫就更像真實(shí)代碼了:

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

偽代碼和真實(shí)代碼的相似度取決于你,通過長期實(shí)踐你會找到最適合你的一種形式

轉(zhuǎn)化為代碼

提示:如果問題比較簡單,你也可以一并完成上述步驟

這下我們需要開始考慮語法、函數(shù)參數(shù)及語言規(guī)范了。你或許不能一下就把代碼寫的很全面,沒關(guān)系,先寫下你會的。

  1. function findFirstMatch(searchString, sourceString) { 
  2.     let length = searchString.length; 
  3.     for (let index = 0; index < sourceString.length; index++) { 
  4.         let possibleMatch = <the LENGTH chars starting at index i> 
  5.         if (possibleMatch === searchString) { 
  6.             return index; 
  7.         } 
  8.     } 
  9.     return -1; 

你會發(fā)現(xiàn)上述代碼中我留空了一部分。我是故意的,因?yàn)槲也淮_定在JavaScript語言中給字符串切片的語法,所以我會在下一步中查詢該語法。

不要猜

我發(fā)現(xiàn)新手程序員常范這樣一個(gè)錯(cuò)誤,就是在網(wǎng)上找到一些覺得可能有用語句,不經(jīng)測試便將其加到程序中。你不理解的代碼段越多,就越不可能找到適合的解決方案。

隨著你不確定的內(nèi)容增加,你的程序出錯(cuò)的方式會呈指數(shù)式增加。當(dāng)你有1處不確定的時(shí)候,你程序確實(shí)只會因?yàn)檫@1個(gè)原因而出錯(cuò)。

但是如果有2處不確定,出錯(cuò)就有3種情況(A處出錯(cuò),B處出錯(cuò),或者AB都出錯(cuò))。如果有3處不確定,就有7種情況。到時(shí)你就很難找到出錯(cuò)原因了。

附注:程序出錯(cuò)原因的個(gè)數(shù)如梅森序列:a(n) = (2^n) — 1

先測試一下你的新代碼。能在互聯(lián)網(wǎng)上找有用的內(nèi)容是很好的,但是請?jiān)趯⑵浼拥匠绦蛑兄?,用一個(gè)獨(dú)立的環(huán)境進(jìn)行測試,以確保它能以你認(rèn)為的方式運(yùn)行。

在上一步中,因?yàn)椴淮_定在JavaScript語言里選取字符串某個(gè)部分的方式,所以就上網(wǎng)搜一下。

參考如下鏈接:

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

***個(gè)結(jié)果就是w3schools網(wǎng)站的,雖然內(nèi)容有點(diǎn)老,但是通常是靠譜。

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

在這基礎(chǔ)上,假設(shè)我每次用這段代碼

  1. substr(index, searchString.length) 

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

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

這時(shí),我就能確定這個(gè)函數(shù)的執(zhí)行效果了。所以,當(dāng)我將它插入到我的程序中后,我也能知道程序的故障是否由它導(dǎo)致的。

測試完成后,我就能將這***一部分代碼添加到我的程序里了。

  1. function findFirstMatch(searchString, sourceString) { 
  2.     let length = searchString.length; 
  3.     for (let index = 0; index < sourceString.length; index++) { 
  4.         let possibleMatch = ( 
  5.             sourceString.substr(index, length)); 
  6.         if (possibleMatch === searchString) { 
  7.             return index; 
  8.         } 
  9.     } 
  10.     return -1; 

總結(jié)

***,我想說的是,帶著我的方法回去試試之前讓你奔潰的編程問題,我保證會立竿見影的。

祝你好運(yùn),編碼愉快!

相關(guān)報(bào)道:

https://blog.usejournal.com/how-a-googler-solves-coding-problems-ec5d59e73ec5?gi=af7ed9a9dff9

【本文是51CTO專欄機(jī)構(gòu)大數(shù)據(jù)文摘的原創(chuàng)文章,微信公眾號“大數(shù)據(jù)文摘( id: BigDataDigest)”】

     大數(shù)據(jù)文摘二維碼

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2013-07-11 17:18:17

程序員習(xí)慣

2019-08-14 17:20:40

程序員人生第一份工作Google

2015-11-23 09:27:39

程序員不良編程習(xí)慣

2017-12-06 10:28:37

程序員編程習(xí)慣

2012-12-04 10:08:25

程序員

2011-06-03 09:58:03

結(jié)對編程程序員

2021-05-12 14:10:17

程序員IT互聯(lián)網(wǎng)

2009-02-23 13:00:17

程序員職業(yè)習(xí)慣

2017-11-16 11:26:23

程序員習(xí)慣

2019-09-25 11:39:07

程序員編程技術(shù)

2011-05-30 14:50:56

程序員

2012-05-22 00:16:47

2021-05-29 07:32:14

優(yōu)秀程序員代碼

2010-07-20 11:03:10

程序員

2021-11-01 22:39:14

程序員專業(yè)技術(shù)

2009-09-15 16:16:35

代碼習(xí)慣

2015-07-20 09:21:19

程序員非程序員技能

2011-07-15 15:10:37

PHP

2017-09-14 10:02:36

程序員體驗(yàn)驗(yàn)證

2016-02-01 15:43:37

成功程序員習(xí)慣
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號