谷歌程序员有哪些高效的编程习惯?


谷歌程序员有哪些高效的编程习惯?



谷歌招聘程序员的难度众所周知,不只要求程序员码力超强,还要求有良好的编程习惯。javascript

那么他们在写代码的过程当中,有哪些很是难得值得咱们借鉴的套路呢。java

本文做者是谷歌的软件工程师Steve Merritt,下面他将介绍其在谷歌的平常工做及与各类level的程序员(培训生、大学生、实习生)的合做中都会用到的一些小技巧。程序员

举个例子来讲明这个流程。面试

假设有个问题:给定两个字符串sourceString和searchString,若是sourceString中含有searchString,就返回第一个字符在sourceString中的索引。若是sourceString中没有searchString,就返回-1。算法

先画个图编程

坦率地说,马上就去敲代码是种荒谬且懒惰的想法。就比如在你写一篇文章以前,要先弄清楚你的假设及论据,从而保证文章的内容有意义。不这么作的话,你可能会渐渐意识到你所写内容可能会跑题,不只浪费时间,还影响心情。写代码也同样,那时你可能像眼睛里进了洗发水同样难受。bash

一般,解决问题的方法乍一看很简单,但其实否则。先在纸上写写有助于你找到解决问题的方法,并能证明该方法可用于不一样情境,这些都得在敲代码以前完成。架构

因此不要急于敲代码,甚至想都不要想代码。随后你是有足够的时间来作加分号、逗号这些事的。函数

画个图吧,画上箭头,或在框里写上数字,反正,用尽一些能够帮你描述问题的方法。咱们的目标是解决问题,因此不要局限于键盘,请尽情使用你的纸笔。测试

先设计一些简单输入。若是函数要处理的是一个字符串,那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://www.google.com/search?q=how+to+select+part+of+a+string+in+javascript

第一个结果就是w3schools网站的,虽然内容有点老,可是一般是靠谱。

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


总结


最后,我想说的是,带着个人方法回去试试以前让你奔溃的编程问题,我保证会立竿见影的。

祝你好运,编码愉快!

多年收集的面试资料以及朋友录制的视频资料,相信对你会有帮助!

加入个人Q群809389099便可免费获取

北漂七年拿过阿里、腾讯、华为offer的资深架构师,分享经验总结

北漂七年拿过阿里、腾讯、华为offer的资深架构师,分享经验总结

北漂七年拿过阿里、腾讯、华为offer的资深架构师,分享经验总结
相关文章
相关标签/搜索