【譯】Googler如何解決編程問題

本文是Google工程師Steve Merritt的一篇博客,向大家介紹他自己和身邊的同事解決編程問題的方法。

原文地址:blog.usejournal.com/how-a-googl…

在本文中,我將完整的向你介紹一種解決編程問題的策略,這個策略是我在日常工作中一直使用的,并且用它來幫助各個等級的程序員(包括新手、大學生和實習生)學習和成長。應用這個結構化流程可以最大幅度的減少那令人沮喪的調試時間,并且能夠在盡可能短的時間內編寫出更加整潔、錯誤率更低的代碼。

一步步

接下來我將用一個栗子來說明。

問題:有兩個字符串sourceStringsearchString,返回searchStringsourceString中第一次出現的位置,如果searchString不是sourceString的字串,就返回-1。

第一步:畫下來

當你拿到一個需求,馬上就開始著手寫代碼是一個非常愚蠢的主意。在寫一篇文章之前,首先要弄清楚論證和論據,并且你要保證論證是有意義的。如果你沒有這么做的話,當你意識到你所寫的東西前言不搭后語時,你可能會因為浪費了大把的時間而想請自己吃一頓大嘴巴子。編程也是一樣的道理,甚至比這還嚴重,嚴重到像洗澡的時候把洗發水弄進眼睛里。

問題的解決方法通常很重要,即使它看上去很簡單。在寫代碼之前,首先要做的就是把這個方法在紙面上呈現出來,并且保證在不同的情況下適用。

所以不找急著寫代碼,甚至都不要思考如何寫。后面你會有充足的時間去敲代碼,在這之前,你要把自己當成一臺計算機,弄清楚你這臺計算機會怎么解決這個問題。

你可以使用流程圖,或者使用其他能幫你具象化的方法,總之我們的目標是解決問題。你可以用紙和筆隨意發揮,不需要收到鍵盤的限制。

我們從一些簡單的情況開始,如果一個方法是“輸入一個字符串”,那么“abc”可以作為第一個例子。首先要搞清楚正確的結果是什么,然后去想怎么樣得到正確的結果,并且一步一步的進行。

我們假設輸入的字符串是這樣:

sourceString: "abcdyesefgh"
searchString: "yes"
復制代碼

我的想法是這樣的:

我看到了searchStringsourceString里,但是我要怎么做呢?我從sourceString的第一個字符開始,逐字去讀,一直到最后,判斷每一個三個字符是不是yes。比如abcbcdcdy等等。當index值為4時,我找到了字符串yes,所以我知道結果是index為4。

當我們寫下算法時,必須要保證我們考慮了所有的情況,并且處理了所有可能的場景。當我們找到匹配的字符串時,返回結果。如果找不到匹配的字符串,同樣要返回結果。

我們來嘗試另一組字符串:

sourceString: "abcdyefg"
searchString: "yes"
復制代碼

我們重復剛才的操作,當我們讀到下標為4的字符時,找到的字符串是yef,這是最接近的結果了,但是第三個字符卻不同,所以我們繼續往后讀,一直到最后,沒有找到匹配的字符串,所以我們決定返回-1。

我們確定這一系列步驟(程序設計中,我們稱之為算法)解決了我們的問題,并且處理了兩種不同的場景,每次都得到了正確的結果。這時,我們就對我們的算法比較有信心了,并且可以將它形成條目。我們一起來進行下一步:

第二步:用英語寫下來

這里我們考慮將第一步形成的算法用英語寫下來。這可以使每一步變得更加具體,以便我們后面寫代碼的時候有所參考。

  1. 從字符串的第一個字符開始
  2. 查看每一組3個的字符(其實是searchString的長度)
  3. 如果匹配上searchString,就返回當前的index
  4. 如果一直到末尾都沒有找到匹配的字符串,就返回-1

看起來很棒,不是嗎

第三步:寫偽代碼

偽代碼并不是真正的代碼,只是一種模擬形式,這里我寫下上面的算法的偽代碼:

for each index in sourceString,there are N characters in searchStringlet N chars from index onward be called POSSIBLE_MATCHif 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.lengthPOSSIBLE_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切分字符串的語法要怎么寫,所以我會在下一步查找它。

第五步:不要猜測

我發現所有新手程序員都會犯一個共同的錯誤,就是從網上找到一個方法,覺得“可能有用”,然后不經過測試就寫進代碼里。你不理解的代碼越多,就越不可能找到正確的方法。

你的程序的錯誤可能是你不了解代碼的兩倍還多。有一處不理解,如果程序出錯,那么罪魁禍首只有一處。如果你有兩處不理解,那就有三種可能出錯(A出錯,B出錯,或者A和B都出錯)。如果有三處不理解,就會有七種情況……很快它就失控了。

邊注:程序出錯的情況種類遵循Mersenne公式 a(n) = (2^n)?—?1

首先要測試你的新代碼。從互聯網上找答案是好的,但是在寫進你的代碼之前,你要先對它進行單獨的測試,確保它能按照你想要的方式執行。

在上一步中,我不確定JavaScript怎么切分字符串,所以我選擇面向Google編程

www.google.com/search?q=ho…

第一條結果來自w3schools,有點小過時,但比較可靠

www.w3schools.com/jsref/jsref…

基于此,我覺得我應該使用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;
}
復制代碼

結論

如果你讀到這里,我要說的只有:”干就完了!“

再嘗試處理一下上周遇到的困難,用上我教你的方法,我保證你很快就會有提高。

祝你好運,編碼愉快!

譯者注:個人認為作者還是強調要先想清楚,再動手寫代碼。而且要學會面向Google編程

轉載于:https://juejin.im/post/5cae1f19e51d456e747c5300

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自學html和css,學習HTML和CSS的5大理由

描述人們學習HTML和CSS最常見的原因是開始從事web開發。但并不是只有web開發人員才要學習HTML和CSS的核心技術。作為一個網絡用戶&#xff0c;你需要你掌握的相關技術很多&#xff0c;但下面有5個你無法拒絕學習HTML和CSS的理由。1、輕松制作卡通動畫Web上的動畫很多年來都是使…

html 左側 樹形菜單,vue左側菜單,樹形圖遞歸實現代碼

學習vue有一段時間了&#xff0c;最近使用vue做了一套后臺管理系統&#xff0c;左側菜單需求是這樣的&#xff0c;可以多層&#xff0c;數據由后臺傳遞。也因為自己對官方文檔的不熟悉使得自己踩了不少坑&#xff0c;今天寫出來和大家一起分享。效果圖如下所示&#xff1a;先說…

Node.js的基本使用3

koa(擴展知識&#xff0c; 建議學習) koa是express超集&#xff08;進階版&#xff09;前后端分離和耦合概念介紹 面向過程 -》 面向對象 --》 面向服務數據庫 Node.js mongodb(bson json的超集) 分類&#xff1a; 關系型數據庫&#xff1a; MySql非關系型數據庫: MongoDB Mong…

Flutter的滾動以及sliver約束

Flutter框架中有很多滾動的Widget,ListView、GridView等&#xff0c;這些Widget都是使用Scrollable配合Viewport來完成滾動的。我們來分析一下這個滾動效果是怎樣實現的。 Scrollable在滾動中的作用 Scrollable繼承自StatefulWidget&#xff0c;我們看一下他的State的build方法…

頁面增加html,為靜態頁面HTML增加session功能

一般來說&#xff0c;只有服務器端的CGI程序(ASP、PHP、JSP)具有session會話功能&#xff0c;用來保存用戶在網站期間(會話)的活動數據信息&#xff0c;而對于數量眾多的靜態頁面(HTML)來說&#xff0c;只能使用客戶端的cookies來保存臨時活動數據&#xff0c;但對于cookies的操…

關于Istio 1.1,你所不知道的細節

本文整理自Istio社區成員Star在 Cloud Native Days China 2019 北京站的現場分享 第1則 主角 Istio Istio作為service mesh領域的明星項目&#xff0c;從2016年發布到現在熱度不斷攀升。 Istio & Envoy Github Star Growth 官網中Istio1.1的架構圖除了數據面的Envoy和控制面…

html調用父頁面的函數,js調用父框架函數與彈窗調用父頁面函數的方法

調用父級中的 aaa的函數子頁面中:οnclick"window.parent.frames.aaa()"父頁面中:function aaa(){alert(‘bbbbb’);}----------------------------------------------frame框架里的頁面要改其他同框架下的頁面或父框架的頁面就用parentwindow.opener引用的是window.…

讀卡距離和信號強度兩方面來考慮

選擇物聯宇手持終端機的時候&#xff0c;你可以參考以下幾個原則&#xff1a;選擇行業需要應用功能&#xff0c;能有效控制好預算。屏幕界面需要高清晰的&#xff0c;選用分辨率較高的能更好的支持展現。按照項目所需求的來分析&#xff0c;需要從讀卡距離和信號強度兩方面來考…

html script 放置位置,script標簽應該放在HTML哪里,總結分享

幾年前&#xff0c;有經驗的程序員總是讓我們將很明顯&#xff0c;現在瀏覽器有了更加酷的兼容方式&#xff0c;這篇文章&#xff0c;俺將跟大家一起來學習script標簽的async和defer新特性&#xff0c;探討script應該放在哪里更好。頁面加載方式在我們討論當瀏覽器加載帶有獲取…

2021吉林高考26日幾點可以查詢成績,2021吉林高考成績查分時間及入口

2021吉林高考成績查分時間及入口2021吉林高考成績查分時間及入口&#xff0c;有一些高考生真的很積極&#xff0c;考完試當天就將答案給對好了&#xff0c;考試嘛&#xff0c;站在旁觀者的角度來看總是有人歡喜有人憂。估出來分數不咋地的&#xff0c;整個六月就毀了。2021吉林…

easyui,layui和 vuejs 有什么區別

2019獨角獸企業重金招聘Python工程師標準>>> easyui是功能強大但是有很多的組件使用功能是十分強大的&#xff0c;而layui是2016年才出來的前端框架&#xff0c;現在才更新到2.x版本還有很多的功能沒有完善&#xff0c;也還存在一些不穩定的情況&#xff0c;但是lay…

廣東2021高考成績位次查詢,廣東一分一段表查詢2021-廣東省2021年一分一段統計表...

廣東省高考一分一段表是同學們在填報高考志愿時的重要參考資料之一。根據一分一段表&#xff0c;大家不僅可以清楚地了解自己的高考成績在全省的排名&#xff0c;還可以結合心儀的大學近3年在廣東省的錄取位次變化&#xff0c;判斷出自己被錄取的概率大概是多少。根據考試院公布…

bootstrap-select動態生成數據,設置默認選項(默認值)

bootstrap-select設置選中的屬性是selected"selected"&#xff0c;只要找出哪一項要設置為默認選項&#xff0c;再設置其屬性selected"selected"即可&#xff0c;親測有效。代碼如下&#xff1a; var currentId $(_this).attr(data_id);//目標id&#xff…

無法顯示驗證碼去掉html,如何去除驗證碼-模版風格-易通免費企業網站系統 - Powered by CmsEasy...

去除前臺用戶登錄驗證碼1.修改lib/default/user_act.php 注釋掉或刪除55-58行修改為//if(!session::get(verify) || front::post(verify)<>session::get(verify)) {//front::flash(驗證碼錯誤&#xff01;);//return;//} 復制代碼2.修改template/default/user/login.html…

webpack4打包工具

什么是webpack webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時&#xff0c;它會遞歸地構建一個依賴關系圖(dependency graph)&#xff0c;其中包含應用程序需要的每個模塊&#xff0c;然后將所有這些模塊打包成一個或多個…

通過計算機網絡進行的商務活動包括,電子商務練習題及答案

“電子商務”練習題一、填空題1&#xff0e;EDI系統構成三要素包括數據標準化、(EDI軟件及硬件)和(通信網絡)。2.B2C電子商務模式主要有&#xff1a;門戶網站、(電子零售商)、(內容提供商)、(交易經紀人)和社區服務商。3. 影響消費者網上購物的因素&#xff1a;商品特性、(商品…

PAKDD 2019 都有哪些重要看點?看這篇文章就夠了!...

雷鋒網 AI 科技評論按&#xff1a;亞太地區知識發現與數據挖掘國際會議&#xff08;Pacific Asia Knowledge Discovery and Data Mining&#xff0c;PAKDD&#xff09;是亞太地區數據挖掘領域的頂級國際會議&#xff0c;旨在為數據挖掘相關領域的研究者和從業者提供一個可自由 …

「javaScript-每三位插入一個逗號實現方式」

一道火了很久的面試題&#xff0c;//將以下數字從小數點前開始每三位數加一個逗號var num 1234567890.12345;復制代碼相信大家寫了這么久的前端代碼&#xff0c;不論是培訓也好&#xff0c;面試也好&#xff0c;這種題出現的頻率挺高的&#xff0c;網上方法很多&#xff0c;但…

計算機網絡df例題,計算機網絡期末試題北交.doc

計算機網絡期末試題北交北京交通大學 2007-2008學年 第學期考試試題課程名稱&#xff1a;計算機通信與網絡技術 出題人&#xff1a;網絡課程組題 號一二三五總分得 分簽 字選擇題(每題分&#xff0c;共0分)PING命令使用協議的報文A、TCP ?? ?B、UDP ??????????C、…

java B2B2C 仿淘寶電子商城系統-Spring Cloud Feign的文件上傳實現

在Spring Cloud封裝的Feign中并不直接支持傳文件&#xff0c;但可以通過引入Feign的擴展包來實現&#xff0c;本文就來具體說說如何實現。需要JAVA Spring Cloud大型企業分布式微服務云構建的B2B2C電子商務平臺源碼 一零三八七七四六二六 服務提供方&#xff08;接收文件&#…