Debugging 在发布产品中打击调试代码
我在一家非常小的初创开发公司(3名开发人员)工作,我经常被拉离我正在从事的工作,以修复一个任务关键型bug或实现一个“绝对关键”的软件功能-我的bug列表几乎每天都会被重新排序,我很少知道几小时后什么是“重要的” 正因为如此,我发现我对添加可能被QA部门检查的代码越来越谨慎(阅读:person) 当我实现一个新函数时,不知道是否会在任何时候调用它,我有时会尝试在顶部写一个return语句,以确保代码永远不会在发布版本中执行 以下语句的问题:Debugging 在发布产品中打击调试代码,debugging,release,startup,Debugging,Release,Startup,我在一家非常小的初创开发公司(3名开发人员)工作,我经常被拉离我正在从事的工作,以修复一个任务关键型bug或实现一个“绝对关键”的软件功能-我的bug列表几乎每天都会被重新排序,我很少知道几小时后什么是“重要的” 正因为如此,我发现我对添加可能被QA部门检查的代码越来越谨慎(阅读:person) 当我实现一个新函数时,不知道是否会在任何时候调用它,我有时会尝试在顶部写一个return语句,以确保代码永远不会在发布版本中执行 以下语句的问题: public void NewFunction() {
public void NewFunction()
{
return; // Put break point so that I can use the debugger to step to meat:
meat:
// ... More code
}
即使在调试模式下,VisualStudio也足够聪明,知道meat:永远不会执行,因此不能使用“set next statement”命令来设置meat:。在编译器指令(如#if!调试
相反,我写的东西如下:
public void NewFunction()
{
if("a"[0]=='a')
return; // put break point here
meat:
// ... More code
}
因此,如果这段代码意外地滑入发行版,不会造成任何伤害,但因为它在运行时之前不会进行计算,所以我可以使用调试器一步到位:没有问题
我真的不喜欢让事情未完成,但在关键时刻,我们往往没有时间搁置更改集或妥善处理事情。目前,通过API访问未完成的功能(如上面的功能概述)并不令人担忧,因此我认为将这些功能留在软件中不会立即造成任何伤害(但归根结底,它们可能会导致维护过程中的几个wtf时刻,如“wtf是不是这个功能在这里不做任何事情?”因为我不记得6个月后我在做什么)
考虑到我(不幸地)在半定期的基础上做这样的事情,有没有针对这个问题的标准实践?作为一个更大的问题,是否有一些实践可以帮助解决软件版本中的调试代码问题?分布式版本控制系统使分支和合并变得简单。使用Mercurial(我个人偏好)这样的工具,您甚至不需要远程存储库——只需在本地系统上就地创建repo,然后在本地驱动器上的其他位置克隆repo。因此,在快速将代码更改迁移到“调试”分支和从“调试”分支迁移代码的同时,您可以轻松地保留代码的“发布”版本。分布式版本控制系统使分支和合并成为一个简单的过程。使用Mercurial(我个人偏好)这样的工具,您甚至不需要远程存储库——只需在本地系统上就地创建repo,然后在本地驱动器上的其他位置克隆repo。因此,在将代码更改快速迁移到“调试”分支和从“调试”分支迁移代码更改时,您可以轻松地保留代码的“发布”版本
- “我真的不喜欢把事情留到半途而废的地步,”
- “我有时试图在顶部写一个return语句,以确保代码永远不会在发布版本中执行。”
- “因此,如果此代码意外滑入发行版”
- 确保所有新代码都有单元测试来备份其功能
- 为您更改的代码编写单元测试,以确保您更改的代码不会破坏现有功能
- 使用巡航控制或类似产品进行连续构建。这与测试一起将让您在出现故障时立即知道
- 按功能/任务开始分支,这样就不会“意外”插入代码。即使从一个优先任务转移到另一个优先任务,为所有代码脱离主线也会导致这些失误
- 该产品应始终有效。在任何时间点,给定产品中完成的X个功能数量,它都应该可以工作。不要半实现一个特性。把它分解成更小的功能和任务,你可以说它们有用。客户是否永远不会使用它们并不重要。这可以防止其他开发人员使用未完成的功能并破坏这些功能
- 修理破碎的窗户。不要让非常糟糕的设计或bug继续存在。这只会在以后使问题更加复杂
通过坚持任务/特性分支,您不必像您在问题中那样创建中间代码。这不应该发生。如果切换将位于另一个分支中的任务。使您的过程最小化,分支也不费吹灰之力。那么这些东西就是第二天性了。有几件事对我来说很突出:
- “我真的不喜欢把事情留到半途而废的地步,”
- “我有时试图在顶部写一个return语句,以确保代码永远不会在发布版本中执行。”
- “因此,如果此代码意外滑入发行版”
- 确保所有新代码都有单元测试来备份其功能
- 为您更改的代码编写单元测试,以确保您更改的代码不会破坏现有功能
- 使用巡航控制或类似产品进行连续构建。这与测试一起将让您在出现故障时立即知道
- 按功能/任务开始分支,这样就不会“意外”插入代码。即使从一个优先任务转移到另一个优先任务,为所有代码脱离主线也会导致这些失误
- 该产品应始终有效。在任何时间点,给定产品中完成的X个功能数量,它都应该可以工作。不要半实现一个特性。把它分解成更小的功能和任务,你可以说w
[Conditional("DEBUG")] public void NewFunction (object something) { // do something }