acm-header
登录

ACM通信

Kode恶性

摘樱桃和科学方法


摘樱桃和科学方法,插图

图源:Arina Habich

回到顶部亲爱的KV

在过去的三周里,我一直在尝试从一个分支中挑选更改到另一个分支中。我什么时候该放弃并合并?

在坑里

回到顶部

亲爱的坑

有一次,我和一个朋友从蒙特利的一个计算机会议上骑车回家。巧的是,这位朋友非常喜欢新鲜樱桃,当他看到一个小摊上卖着一篮子新鲜樱桃时,他就停下来买了一些。这个朋友拥有的另一个特点是,他永远不会错过一个好交易。所以,在和卖樱桃的小贩讨价还价时,很明显,买一整筐樱桃比只买一篮要划算得多,尽管这正是我们真正想要的。不过,我的朋友不想错过这个机会,于是买下了整套房子,然后我们边吃边聊。我们又花了45分钟才到家,在这段时间里,我们已经吃掉了一半多的樱桃。我好几个月都不敢看任何有樱桃味道的东西;今天,当有人说“摘樱桃”时,这并不会让人联想到特权阶层的孩子们周六早上在加州海岸玩农夫游戏的快乐画面——我只是觉得不舒服。

这一切使我想到了你的信。很难说别人什么时候应该“放弃,去做X”,不管X是什么,但在某种程度上,你知道在内心深处,在那个地方,让你成为一名工程师的地方,开始的时候是一个快速的樱桃采摘,变成了一个可怕的泥淖,除了约翰迪尔拖拉机,没有什么能让你摆脱它。阳光下的快乐时光已经结束,下起了雨,你很冷,你只想回家。是时候停下来再试一次了。

我知道这可能是不言自明的,但我们大多数人陷入选择陷阱的真正原因是因为我们没有做定期合并我们所处理的任何代码的真正工作。我们已经让树的顶端,或者git的顶端,或者任何人们想用的陈词滥调,远离了我们,我们等待合并的时间越长,我们遭受的痛苦就越大。避免被困在樱桃园的最好方法是,当您的项目需要与开发树的头部重新同步时,有一个合并并经过测试的分支随时准备运行。我知道这比把自己关在角落里埋头于下一个版本要耗费更多的精力,但最终它会为你省去很多头疼的事情。下一次的问题将不是“我什么时候停止挑选”,而是“新的分支什么时候准备好接受我们已经完成的工作?”

KV

回到顶部

亲爱的KV

我刚开始为一个新项目主管工作,他有一个非常讨厌的习惯。每当我修复一个错误并将修复的代码检入到我们的代码库中时,她都会问,“您怎么知道这个已经修复了?”或者类似的话,质疑我对系统所做的每一个更改。好像她不信任我能做好我的工作。当我修复一个错误时,我总是更新我们的测试,这应该足够了,你不觉得吗?她想要什么,正式的正确性证明吗?

我知道因为我知道

回到顶部

亲爱的我知道

开发软件不仅仅是凭直觉知道代码是正确的。实际上,软件工作的任何部分都不应该基于直觉,因为毕竟,软件应该是计算机科学的一部分,而科学需要证明。

我对当前的bug跟踪系统有一个问题,相信我,这只是我对它们的一个问题,那就是它们不能很好地跟踪你为修复bug所做的工作。大多数错误跟踪器都有许多错误可以经历的状态:新的、打开的、已分析的、已修复的、已解决的、关闭的,等等,但这只是修复错误的一部分,或者对任何大小的程序进行其他操作。


当你处理一个问题时,你应该以一种反映科学方法的方式来做。


程序是您或团队通过编写代码来实现的某种系统的表达式。因为它是一个系统,人们必须有某种方法来推理这个系统。许多人现在会跳起来大喊,“类型系统!”,“证明!”,以及其他大多数在职程序员都不知道,也不太可能接触到的事情。然而,有一种更简单的方法来解决这个问题,它不依赖于花哨或深奥的编程语言:使用科学方法。

当你处理一个问题时,你应该以一种反映科学方法的方式来做。你可能知道问题出在哪里。把这个作为你的理论写下来。理论解释了系统中一些可观察到的事实。基于你的理论,你对这个问题提出一个或多个假设。假设是可测试的想法为了解决这个问题。假设的好处在于,它非真即假,这对我们布尔程序员的大脑很有效:非此即彼,非黑即白,非真即假。

这里的关键是把这些都写下来。当我年轻的时候,我从来不把事情写下来,因为我认为我可以把它们都记在脑子里。但这是无稽之谈;我无法把它们都记在脑子里,而那些我已经忘记的我也不知道,直到当时的老板问了我一个我无法回答的问题。当有人问你正在做的事情时,你一脸茫然,这让人很不安。

最后,我发明了一种记笔记的方法,让这变得更容易一些。当我对一个问题有了一个理论时,我会创建一个标题为“理论”的笔记,并写下我的想法。在这个目录下,我写下我所有的测试(我称之为TEST,因为像任何优秀的程序员一样,我不想一直输入HYPOTHESIS)。我目前使用的笔记系统是Emacs中的Org模式,它允许您创建可以绑定到热键的序列,允许您快速更改标签。对于错误,我将其标记为BUG、已分析、已修补、|和已修复,而对于假设,我将其证明或否定。

我总是同时保留被证明和被推翻的假设。为什么我两个都留着?因为这样我就知道我做了什么,什么成功了,什么失败了。当你的老板患有强迫症,或者他们喜欢被称为“注重细节”时,这被证明是无价的。通过保留你的成功和失败,你总是可以回头看,比如在3个月后,当代码以与你关闭的错误相似的方式崩溃时,你可以看看你上次测试了什么。也许这些假设中的一个会被证明是有用的,或者它们只是提醒你你尝试过的愚蠢的事情,所以你不会浪费时间再次尝试它们。无论哪种情况,您都应该以某种版本控制的方式备份它们。我的在我个人的源代码存储库中。您有自己的存储库,对吗?对吧? !

KV

ACM队列的q戳相关文章
queue.acm.org

Kode恶性bug Out
乔治Neville-Neil
http://queue.acm.org/detail.cfm?id=1127862

敏捷Memeplex中的航行
Philippe Kruchten
http://queue.acm.org/detail.cfm?id=1281893

动态语言中的ORM
克里斯·理查森
http://queue.acm.org/detail.cfm?id=1394140

回到顶部

作者

乔治·v·内维尔-尼尔kv@acm.org)是Neville-Neil Consulting的东主,也是ACM队列编辑委员会。他从事网络和操作系统代码方面的工作,既有趣又有利可图,教授各种与编程相关的课程,并鼓励您对他的文章发表评论、妙语和代码片段通信列。


版权归作者所有。

数字图书馆是由计算机协会出版的。版权所有©2013 ACM, Inc.


没有找到条目

登录全面存取
忘记密码? »创建ACM Web帐户
文章内容:
Baidu
map