【译】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.mzph.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;接收文件&#…