关山难越,谁悲失路之人;萍水相逢,尽是他乡之客。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程教程 > 技术文章 > 正文

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

guanshanw 2023-09-26 12:20 29 浏览 0 评论



大数据文摘出品

来源:medium

编译:高延、蒋宝尚

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

那么他们在写代码的过程中,有哪些非常可贵值得我们借鉴的套路呢。

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

举个例子来说明这个流程。

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

先画个图

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

通常,解决问题的方法乍一看很简单,但其实不然。先在纸上写写有助于你找到解决问题的方法,并能证实该方法可用于不同情境,这些都得在敲代码之前完成。

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

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

先设计一些简单输入。如果函数要处理的是一个字符串,那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;
}


总结


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

祝你好运,编码愉快!

相关推荐

七条简单命令让您玩转Git
七条简单命令让您玩转Git

凭借着出色的协作能力、快速部署效果与代码构建辅助作用,Git已经得到越来越多企业用户的青睐。除了用于开发商业及消费级应用之外,众多科学及政府机构也开始尝试使用这...

2023-10-07 12:14 guanshanw

基本完整的关于Git分支branch的操作
基本完整的关于Git分支branch的操作

Git使用背景项目中要用到dev或者其他分支开发完代码,需要将该分支合并到master的需求操作步骤下面以dev名称为lex为分支名为例来操作一遍客户端操作:...

2023-10-07 12:14 guanshanw

Git 进阶(合并与变基)
Git 进阶(合并与变基)

在Git中整合来自不同分支的修改主要有两种方法:合并(merge)以及变基(rebase)合并(merge)merge流程图merge的原理是找到这两个分...

2023-10-07 12:13 guanshanw

Git学习笔记 003 Git进阶功能 part5 合并(第一部分)

合并(merge)是很常用的操作。尤其是一个庞大的很多人参与开发的企业级应用。一般会设定一个主分支,和多个副分支。在副分支开发完成后,合并到主分支中。始终保持主分支是一个完整的,稳定的最新状态的分支。...

非标题党,三张图帮你理解git merge和git rebase的区别
非标题党,三张图帮你理解git merge和git rebase的区别

初始场景:基于正常的开发分支修改几个小bug,然后在合并到开发分支上。gitmergegitcheckoutfeaturegitmergeho...

2023-10-07 12:13 guanshanw

git 初次使用(01)
git 初次使用(01)

先从github上克隆代码下来:使用vscode克隆代码如下图,填写上github仓库地址:vscode有时候克隆代码速度比较慢,可以用命令行方式克隆gitc...

2023-10-07 12:12 guanshanw

Git 远程操作

4.Git远程操作命令说明gitremote远程版本库操作gitfetch从远程获取版本库gitpull下载远程代码并合并gitpush上传远程代码并合并4.1远程版本库操作gitre...

Git常用命令-总结
Git常用命令-总结

创建git用户$gitconfig--globaluser.name"YourName"$gitconfig--globaluser.em...

2023-10-07 12:12 guanshanw

git中删除从别人clone下来项目的git信息,并修改为自己的分支

如果你从别人的Git存储库中克隆了一个项目,并想要删除与该存储库相关的Git信息,并将其修改为你自己的分支,则可以执行以下步骤:使用gitclone命令克隆存储库:gitclone<u...

git系列-回滚和放弃本地修改

回滚历史提交就是reset的功能。这种情况是已经提交远程仓库,需要回滚到之前的提交。gitreset--hardcommitId//注:强制提交后,当前版本后面的提交版本将会删掉!gi...

GIT使用小技巧大全
GIT使用小技巧大全

在大型软件工程的开发过程中,版本控制是无法绕过去的;目前来说,最火的版本控制软件就是GIT了。早两年SVN比较火,不过被大神linus喷了几次后,就日落西山了,...

2023-10-07 12:11 guanshanw

git相关命令-上
git相关命令-上

这些命令都是看了文档后,个人觉得比较有用的一些,展示给大家。回到远程仓库的状态抛弃本地所有的修改,回到远程仓库的状态。gitfetch--all&...

2023-10-07 12:10 guanshanw

Git命令行接口:掌握Git的必备技能
Git命令行接口:掌握Git的必备技能

Git是一款强大的分布式版本控制工具,它支持命令行界面操作。熟练掌握Git命令行接口,是开发者使用Git的必备技能之一。在这篇文章中,我们将介绍Git命令行接口...

2023-10-07 12:10 guanshanw

Git命令详解
Git命令详解

相信各位小伙伴们应该都对git有一些了解,毕竟作为代码管理的神器,就算不是IT行业的小伙伴肯定也或多或少的听说过一些。今天就来和小伙伴们分享一下自己总结的常用命...

2023-10-07 12:10 guanshanw

工作7年收集到的git命令
工作7年收集到的git命令

概念git中的术语解释:仓库也叫版本库(repository)stage:暂存区,add后会存到暂存区,commit后提交到版本库git安装linux...

2023-10-07 12:10 guanshanw

取消回复欢迎 发表评论: