- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是一名高级工程师,在一个由其他四人组成的团队中工作驱动大型美国职业体育网站的内容管理应用程序地点。我们两年前就开始了这个项目,并选择了Java 作为我们的平台,虽然我的问题不是 Java 特定的。自从我们开始了,我们的队伍出现了一些流失。我们每个人都有在决定实现方面有很大的自由度细节,尽管重要的决定是通过共识做出的。
我们的项目是一个相对年轻的项目,但我们已经到了一定程度当没有一个开发人员知道有关该应用程序的所有信息时。首要的原因是我们的发展速度很快,其中大部分发生在我们运动的赛季揭幕战前的紧缩中;和事实上,我们的测试覆盖率基本上是 0。
我们都了解 TDD 的理论优势并同意该方法将改善我们的生活和代码的原则如果我们一开始并坚持通过年。这从未发生过,现在我们负责一个未经测试的仍然需要大量扩展并被积极使用的代码库在生产中并受到公司结构的依赖。
面对这种情况,我只看到两种可能的解决方案:(1)为现有代码追溯编写测试,或 (2) 尽可能多地重写该应用程序的实用性,同时狂热地坚持 TDD原则。我认为(1)大体上是不切实际的,因为我们在项目中有一个 hell 般的依赖关系图。我们几乎没有组件可以单独测试;我们不知道所有的用途案例;并且在测试推送期间用例可能会发生变化由于业务需求或对不可预见问题的 react 。为了这些原因,我们不能确定我们的测试结果是否一旦我们完成了高质量。带领团队有风险进入一种虚假的安全感,因此微妙的错误会悄悄潜入没有人注意到。鉴于前景黯淡投资返回率,我自己或我们的团队领导很难证明这一点努力管理。
方法(2)更有吸引力,因为我们将遵循测试优先原则,从而生成几乎 100% 覆盖的代码 bat 。即使最初的努力导致覆盖代码的孤岛首先,这将为我们提供一个重要的滩头阵地项目范围的覆盖并帮助解耦和隔离各种组件。
这两种情况的缺点是我们团队的业务生产力可能会显着放缓或蒸发完全在任何测试插入期间。我们不能在此期间这样做业务驱动的紧缩,尽管紧随其后的是相对平静我们可以利用它来达到我们的目的。
除了选择正确的方法((1)、(2)或另一个未知的解决方案),我需要帮助回答以下问题:我的团队如何确保我们的努力不从长远来看,由于未维护的测试和/或无法编写而浪费随着业务需求的增加而出现新的?我对广泛的事物持开放态度这里的建议,无论是胡萝卜还是大棒。
无论如何,感谢您阅读这个自找的困境。
最佳答案
“这两种情况的不利之处在于,我们团队的业务生产力可能会在任何测试推进期间显着放缓或完全消失。”
这是对事实的常见误解。现在你有你不喜欢并且难以维护的代码。 “ hell 依赖图”等。
因此,您一直在进行的“紧缩”开发导致了昂贵的返工。返工如此昂贵,你不敢尝试。这说明您的紧缩开发不是非常有效。当时它看起来很便宜,但回想起来,你注意到你真的在浪费开发资金,因为你创建了有问题的、昂贵的软件,而不是创建好的软件。
TDD 可以改变这一点,这样您就不会生产维护成本高的紧缩软件。它不能解决所有问题,但可以清楚地表明,将注意力从“紧缩”转移可以产生更好的软件,从长远来看成本更低。
根据您的描述,您当前的部分(或全部)代码库是负债,而不是 Assets 。现在想想 TDD(或任何学科)将如何降低该责任的成本。当您产生负债时,“生产力”的问题不适用。
TDD 的黄金法则:如果您停止编写有责任的代码,组织就会获得积极的投资返回率。
小心询问如何保持当前的工作效率。其中一些“生产力”正在产生没有值(value)的成本。
“我们几乎没有一个组件可以单独测试;我们不了解所有用例”
正确。对现有代码库进行改造单元测试真的很难。
“有可能导致团队陷入错误的安全感,从而导致细微的错误会在没有人注意到的情况下悄悄潜入”
错误。没有“虚假的安全感”。每个人都知道测试充其量是艰难的。
此外,现在你有可怕的错误。你的问题太糟糕了,你甚至不知道它们是什么,因为你没有测试覆盖率。
与无法测试的代码相比,处理几个细微的错误仍然是一个巨大的改进。我会在任何一天对未知的错误进行细微的错误处理。
“方法(2)更有吸引力”
是的。但是。
您之前的测试工作被一种奖励紧缩编程的文化所颠覆。
有什么改变吗?我对此表示怀疑。你的文化仍然奖励紧缩编程。您的测试计划仍有可能遭到破坏。
您应该考虑一个中间立场。不能指望你在一夜之间“狂热地坚持 TDD 原则”。这需要时间和重大的文化变革。
您需要做的就是将您的应用程序分解成多个部分。
例如,考虑 模型 - 服务 - View 层。
您拥有需要广泛、严格的可信测试的核心应用程序模型(持久化事物、核心类等)。
您的应用程序服务需要进行一些测试,但受制于“在测试推送期间,由于业务需求或对不可预见问题的 react ,用例可能会发生变化”。尽可能多地进行测试,但不要违反为下一季按时发货的要求。
您有需要一些测试但不是核心处理的 View /演示内容。这只是介绍。随着人们想要不同的选项、 View 、报告、分析、RIA、GUI、浮华和嘶嘶声,它会不断变化。
关于java - 如何采用 TDD 并确保遵守?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2341998/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!