当前位置: 首页 > 科技观察

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

时间:2023-03-12 17:52:09 科技观察

大数据文摘来源:Medium编译:高燕、蒋宝尚谷歌以招程序员难着称。它不仅需要程序员有很强的编码能力,还需要良好的编程习惯。那么在写代码的过程中,有哪些非常有价值的套路是我们可以借鉴的。这篇文章的作者是谷歌的软件工程师SteveMerritt。下面他将介绍一些他在谷歌日常工作中以及与各个层次的程序员(见习生、大学生、实习生)合作时会用到的技巧。举个例子来说明这个过程。假设有一个问题:给定两个字符串sourceString和searchString,如果sourceString包含searchString,则返回sourceString中第一个字符的索引。如果sourceString中没有searchString,则返回-1。先画图坦率地说,马上敲代码是荒谬和懒惰的。就像你写文章之前,你得先弄清楚你的假设和论点,这样才能保证文章的内容是有意义的。如果不这样做,你可能会逐渐意识到自己写的东西可能跑题了,不仅浪费时间,还会影响心情。写代码也是一样,这时候你可能会觉得像洗头水一样难受。通常,问题的解决方案乍一看似乎很简单,但事实并非如此。先把它写在纸上会帮助你找到问题的解决方案,并证明它可以在不同的情况下使用,所有这些都是在输入代码之前完成的。所以不要急于编码,更别想编码了。然后你就有足够的时间做一些事情,比如添加分号和逗号。画个图,画个箭头,或者在方框里写个数字,总之,用任何能帮助你描述问题的方法。我们的目标是解决问题,所以不要局限于键盘,请使用您的笔和纸。先设计一些简单的输入。如果函数正在处理一个字符串,那么abc就是一个很好的例子。试着想象正确的结果是什么,然后梳理出你是如何解决问题的以及使用了哪些步骤。假设字符串的值如下:sourceString:"abcdyesefgh"searchString:"yes"我的思路:可以看出sourceString中包含了searchString。但是我该怎么做呢?从左到右读取sourceString,并将每组3个字符与'yes'进行比较,看它们是否匹配。比如'abc','bcd','cde'等。当读取索引4处的字符时,发现'yes'所以我确定有一个匹配从索引4处的字符开始可以处理所有可能的场景。它应该在找到匹配项时返回正确答案,并在找不到匹配项时返回正确答案。想象另一对字符串:sourceString:"abcdyefg"searchString:"yes"我们从左到右读取单词sourceString,并比较每组3个字符,看它是否匹配'yes'。读取索引4处的字符,我们看到“yef”,它看起来是相同的,但实际上不是,因为第三个字符不同。因此,我们一直向右读取并得出没有匹配项的结论,因此我们返回-1。我们已经能够确定解决问题所需的步骤顺序(在编程世界中,我们称之为算法),并且我们已经在不同的情况下进行了尝试并得到了正确的结果。基于此,我们认为该算法是有效的,然后我们应该对其进行算法化。用文字写出来在思考了上一步识别出的算法之后,我们可以尝试用文字写出来。这样做可以让步骤变得非常具体,方便我们后面敲代码的时候参考。从字符串的开头读取。查看由3个字符(或searchString中的字符数)组成的子集。如果与searchString一致,则返回其字母的索引号。如果我们读到字符串的末尾并且没有匹配项,我们返回-1。编写伪代码伪代码不是真正的代码,但它的结构类似于代码。下述是我上文算法的伪代码:foreachindexinsourceString,thereareNcharactersinsearchStringletNcharsfromindexonwardbecalledPOSSIBLE_MATCHifPOSSIBLE_MATCHisequaltosearchString,returnindexattheend,ifwehaven'tfoundamatchyet,return-1.这样写就更像真实代码了:foreachindexinsourceString,N=searchString.lengthPOSSIBLE_MATCH=sourceString[indextoindex+N]ifPOSSIBLE_MATCH===searchString:returnindexreturn-1伪代码和真实代码的相似度取决于你。通过长期的练习,你会找到最适合自己的形式。转化为代码提示:如果问题比较简单,也可以将上面的步骤一起完成现在我们要开始思考语法、函数参数、语言规范了。你不一定能一口气把代码写完整,没关系,先把你会的写下来。functionfindFirstMatch(searchString,sourceString){letlength=searchString.length;for(letindex=0;indexif(possibleMatch===searchString){returnindex;}}返回-1;你会注意到我在上面的代码中留了一部分空白。我是故意这样做的,因为我不确定在JavaScript语言中对字符串进行切片的语法,因此我将在下一步中查找该语法。不要猜我作为一个新手程序员发现了这样一个错误,就是在网上找了一些我认为可能有用的语句,没有测试就加入到程序中。你不理解的代码越多,你就越不可能找到合适的解决方案。随着不确定性的增加,程序出错的可能性呈指数级增长。当你有1个不确定性时,你的程序确实只会因为这1个原因而出错。但如果有2个不确定性,则有3种错误情况(A处错误、B处错误或A和B处均有错误)。如果有3个不确定,就有7种情况。到时候你就很难找到错误的原因了。注意:程序错误原因的数量就像一个梅森序列:a(n)=(2^n)—1首先测试你的新代码。能够在Internet上找到有用的内容真是太好了,但是请在将其添加到您的程序之前在隔离环境中对其进行测试,以确保它按照您认为的方式工作。上一步,因为不清楚如何在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。我将首先构建一个小示例进行测试。>>lettestStr="abcdefghi">>letsubStr=testStr.substr(3,4);//简单易用>>console.log(subStr);"defg">>subStr=testStr.substr(8,5);//askformorecharsthanexist"i"至此,我可以判断这个函数的执行效果了。所以,当我把它插入到我的程序中时,我也可以知道程序的失败是否是由它引起的。测试完成后,我可以将这最后一段代码添加到我的程序中。functionfindFirstMatch(searchString,sourceString){letlength=searchString.length;for(letindex=0;index