Debugging 在发布产品中打击调试代码

Debugging 在发布产品中打击调试代码,debugging,release,startup,Debugging,Release,Startup,我在一家非常小的初创开发公司(3名开发人员)工作,我经常被拉离我正在从事的工作,以修复一个任务关键型bug或实现一个“绝对关键”的软件功能-我的bug列表几乎每天都会被重新排序,我很少知道几小时后什么是“重要的” 正因为如此,我发现我对添加可能被QA部门检查的代码越来越谨慎(阅读:person) 当我实现一个新函数时,不知道是否会在任何时候调用它,我有时会尝试在顶部写一个return语句,以确保代码永远不会在发布版本中执行 以下语句的问题: public void NewFunction() {

我在一家非常小的初创开发公司(3名开发人员)工作,我经常被拉离我正在从事的工作,以修复一个任务关键型bug或实现一个“绝对关键”的软件功能-我的bug列表几乎每天都会被重新排序,我很少知道几小时后什么是“重要的”

正因为如此,我发现我对添加可能被QA部门检查的代码越来越谨慎(阅读:person)

当我实现一个新函数时,不知道是否会在任何时候调用它,我有时会尝试在顶部写一个return语句,以确保代码永远不会在发布版本中执行

以下语句的问题:

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
    }