首页
学习
活动
专区
圈层
工具
发布

代码测试意味着完全消灭了Bug?

对于大多数查询,集成测试和/或手动测试都是很好的,并且广泛的 SQL 模拟充其量是多余的,并且在最坏的情况下是有害的。...即使在那些情况下,”非单元的单元测试(例如,仅访问数据库的那个)仍然是可行的选择。集成测试也是一种选择。很多应用程序无论如何都没有那种复杂的查询。...理想情况下,我们应该两点都做到。 后记:重构引入了一个 Bug 并删除了一个有用的功能,但现在更难添加,至少因为代码要复杂得多。 测试驱动开发 所有单元正常工作都不能保证程序正常工作。...我不完全确定如何看待 BDD。我持怀疑态度,但我从来没有在一个大型项目中正确使用它,所以我犹豫不决是否放弃他。...有一个开源项目是我贡献的,我也想为之贡献更多,但是我没有,因为编写和运行测试太难了。每一个变化都是“在 15 分钟内编写工作代码,花 45 分钟处理测试”。这一点儿也不好玩。

68510

为什么写了多年代码,还是没形成自己的工程思维?

成长的关键不是关于多年的经验,不是关于懂得更多的语言,也不是关于编写更好的代码。程序员越成熟,就越冷静。我在很多人身上看到了这一点,最终开始在自己身上也看到了这一点。...问题澄清 如果一个程序员认为自己的工作只是编写代码,然后进行测试和部署,那可能不会问什么问题。而成熟的标志在于首先需要问正确的问题。一旦这样做了,弄清楚如何编写代码就变容易了。...2.根因分析 每个工程师对关闭大量的 bug 都感觉良好,仿佛给他们一种成就感。实际上,并不要急于修复这个 bug,更应该关注的是为什么。 这是一个反复出现的问题吗? 有什么模式吗?...他们花更多的时间考虑副作用,而不仅仅是解决问题,不喜欢在没有找到根本原因的情况下结束一天的工作。 到目前为止,许多人可能已经明白了为什么 RCA (根本原因分析) 对于是如此重要。...不能习惯于等待,等待任务,等待批准,等待有人告诉我该做什么。 不是忽略问题,不仅仅是报告问题。而不是等待指示。这是一种所有权心态。停止等待,负起责任,开始拥有。当前前提是授权是否充分。 7.

6.4K87
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步

    盯着老子,你就不能去干点其他事情吗?” 老板仿佛接收到了你的脑电波一样:“我就在这等着,你写完前我哪也不去,厕所也不去。”...4.3 小结一下 针对上面的场景,我们小结一下:在异步这种场景下重点是在你写代码的同时老板在刷剧,这两件事在同时进行,而不是一方等待另一方,因此这就是为什么一般来说异步比同步高效的本质所在,不管同步异步应用在什么场景下...在这里我们还要再次强调:同步方式下函数和被调函数无法同时进行。 同步编程对程序员来说是最自然最容易理解的。 但容易理解的代价就是在一些场景下,同步并不是高效的,原因很简单,因为任务没有办法同时进行。...也有的同学可能会有疑问,为什么这个函数要传递给数据库线程而不是数据库线程自己定义自己调用呢? 因为从软件组织结构上讲,这不是数据库线程该做的工作。...8.2 异步情况2:主线程关心数据库操作结果 在这种情况下,数据库线程需要将查询结果利用通知机制发送给主线程,主线程在接收到消息后继续处理上一个请求的后半部分。

    77851

    JDK11现存性能bug(JDK-8221393)深度解析

    不过不用担心,这个bug触发的要求比较苛刻,估计这也是jdk开发者不修复该bug的原因之一。另外,我在翻看jdk13源码时发现该bug已被修复,并且有些相关设计上的提升。 ?...不过这事在我介入后的第二天就立马有了眉目,嘿嘿嘿。。。 (不是我能打,而是他们缺少一把趁手的“兵器”) 排查过程 作为一名工程师,面对上面的现象,你会怎么做?...不知道怎么看火焰图不要紧,其实很简单,具体可参考阮一峰老师的如何读懂火焰图?。 y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。...中已经修复了,我们来看看他们是如何修复的。...另外是不是有些人还有个疑问,这个bug为什么不在jdk11后续版本中修掉,而是选择在jdk13中彻底修掉,不怕影响到使用jdk11的用户吗?

    98721

    干货 | 我从资深软件工程师学到的避坑大法

    如果我忘记了这部分代码,之后又回到了代码工作上,没有注释的话我不能重新创建上下文,我可能只会想:「为什么他们要这么写?这没有任何意义……哦,等等,是我写的。」 这里就是开发文档和注释该出现的地方。...毕竟这是一个技术累赘。 如果说,在某个特定国家,有 10 名记者会一年一次将他们的报道发送到这个终端,怎么办?你如何测试它?如果没有开发文档(那时就没有)就不能测试。所以我们没有测试。...我尝试基于已有代码进行工作,但是资深工程师会尝试解决掉它——全部删除。一个永远无法到达的 if 声明?一个不应该调用的函数?是的,都消失了。 至于我呢?我只会把我的函数写在最上面。...记录我所想到的会出错的地方。 在大多数情况下,以上的结论是在我在测试而不是实现的过程中想到的。...当你修复 bug 时,你不仅仅关注如何修复 bug,而是你为什么不早点发现它呢?是否有布置警报?如何能够更好地监控来避免类似的问题? 我还不知道如何监控 UI。

    89920

    大型项目中的敏捷项目管理实践

    就在我焦头烂额之际,我想起了解过的一种开发模式: Scrum 开发模式使得我们能够专注于如何在最短的时间内实现最有价值的部分; Scrum 开发模式使得我们能够快速的经常的监督实际产品发展的状况; Scrum...先写测试用例再写代码的方式,在部分小组试过几次但大家都反馈很难适应。因此没有再继续要求。 项目遇到的麻烦-需求 由于需求与开发团队是异步进行,而不是从一开始就紧密运作的。...对此,我们认为这个是因为项目实践出来偏差,没有真正领悟,敏捷开发中为什么需求必须是讨论出来,而不能是通过一个详细设计文档去传达,使得每个成员都对需求来负责,而不是仅仅被动的接受。...但该团队对缺陷的处理是: 先处理严重级别的缺陷; 缺陷集中到迭代后期再进行修复。 所以,当他们进行缺陷修复的排序时,将所有的严重缺陷都进行了修复,但是导致最后却是一个 story 都不能交付。...在此次,我们必须要认识到一点,我们每个迭代都要进行增量的价值交付,作为研发团队应该考虑如何在一个迭代中尽可能多的交付,而不是为了修复缺陷。

    1K20

    当特征成为技术债:一次线上事故引发的思考

    凌晨 2:00 的分区数据是空的。 但为什么是空的?我又得去找数据采集任务的负责人。 第四步:等人(???分钟) 凌晨四点四十分,我在工作群发了一条消息: "@all 紧急求助!...让我用两个类比来解释: 类比1:代码的调用链 在 IDE 里,你可以右键点击一个函数,选择"查找所有调用"(Find Usages),立刻看到这个函数被哪些地方调用。...就像你不会在没有 Git 的情况下管理代码,你也不应该在没有血缘的情况下管理特征。...这个专栏会记录我们的完整过程: 如何设计特征血缘系统的架构? 如何从 Spark、Airflow 中采集血缘事件? 如何用图数据库实现血缘查询? 如何推动团队使用血缘系统? 遇到了哪些坑,如何解决?...这不是一篇技术文档,而是一个真实的工程故事。 下一篇,我会讲:特征血缘和数据血缘有什么区别?为什么特征血缘不能简单等同于数据血缘? 写在最后 凌晨的那次故障,让我们付出了惨痛的代价。

    9610

    AI接管运维决策?别怕,它比你更冷静!

    提到运维,很多人的第一反应是“紧急响应”、“故障排查”、“夜半惊魂”。这份工作的难点,不仅仅是修修补补,更在于如何快速、精准地做出决策。而人工智能的出现,让自动化运维决策进入了新的阶段。...举个例子:如果数据库CPU占用突然飙升,而同时发现磁盘I/O等待时间增加,AI可以自动推测可能是慢查询导致的系统压力过大,而不是硬件故障。...AI自愈系统——AI能不能直接修?发现故障后,下一步就是修复。如果系统支持自动恢复脚本,AI可以在一定情况下直接执行修复方案,比如重启服务、调整参数、释放资源等。...别想太多,AI是助手,而不是老板! 虽然AI能自动检测、分析、执行,但它仍然依赖运维人员设定规则、优化模型,甚至在关键决策时还是得靠人来判断。...运维人员需要拥抱AI,把它变成自己的“超能力”,而不是害怕被它替代。总结AI在自动化运维决策中的应用,不只是一个趋势,而是一个必然。

    33410

    详解高级PHP工程师面试题

    大家好,又见面了,我是全栈君。 第1题.Git的分支你们是怎么管理的? git 为什么好,为什么要用 git,这不是我本文想要说明的问题。...在多人的团队中,我们应该在 master 分支上直接开发吗? 如果线上产生了bug该通过什么样方式的分支去修复? 当有多个分支的时候,测试如何有效的参与进来每一个分支的测试?...当你拿到一个需求,或者不是一个立马需求上线的bug修复,那么就应该从 develop 开一个分支出来,完成这部分工作。完成后合并到 develop 分支。 什么时候要预发分支?...其它的开发分支,都应该由开发人员自己测试,测试没有问题的时候才准许合并到develop,这就要求每一个开发要提高自己交付的产品质量,如何确保自己交付的产品质量?...同理,当你的请求在查询数据库的时候,也是一个 IO 请求,也是同步的。协程就可以让你这些 IO 编程异步非阻塞的,从而增大你的并发量。

    77620

    Flask 之父:我不觉得有异步压力

    它不会排空整个缓冲区,只会做到令事情不致失控的程度。那么为什么 write 不做隐式 drain 呢?好吧,这会是一个大规模的 API 监控,我不确定该如何做到。...在大多数异步系统中,特别是我在 Python 中遇到的大多数情况中,即使你修复了所有套接字层的缓冲行为,也最终会陷入一个将一堆异步函数链接在一起,而不考虑背压的世界。...在我们真正着手做某件事之前,我们有一种方法来弄清楚成功的可能性,如果我们超负荷了,我们将向上沟通。 现在,我没有想到如何给这种服务下定义。...然而,背压的缺失是一种具有火箭筒大小的步枪。如果你太晚意识到自己构建了个怪物,那么在不对代码库进行重大更改的情况下,几乎不可能修复它,因为你可能忘了在某些本应使用异步的函数上使用异步。...在流量控制一出现的时候,我就认为它非常复杂。很容易假装这不是个问题,这就是为什么我们会处于这种混乱状态的根本原因。流量控制还会增加大量开销,并且在基准测试中效果不佳。

    1.3K20

    使用 React Testing Library 的 15 个常见错误

    以前的我(Kent)并不是很喜欢那个时候的测试环境,为此写了一个 React Testing Library。...接下来,我就一一盘点这些方法,解释为什么它们不是很好,以及如何改进测试以避免这些陷阱。 注:下面是重要程度的说明。...这和下面这一节也有关系: 没有用文本来做查询 作为 “使用错误的 Query” 的子集,我想聊一下为什么我们更建议你用真实的文本来做查询(关于地区语言,应该用默认的地区语言文本),而不是用 Test ID...多数情况下没有使用 *ByRole 作为 “使用错误的 Query” 的子集,我想来聊聊 *ByRole。...建议:query* API 只用于断言当前元素不能被找到 用 waitFor 等待 find* 的查询结果 重要程度:高 // ❌ const submitButton = await waitFor(

    1.8K20

    Power Query 真经 - 第 3 章 - 数据类型与错误

    3.1.3 如何设置格式 简而言之,在 Power Query 中不需要设置格式。 在数据类型与格式之争中,查询编辑器的主要作用是设置数据类型,而不是格式化数据。为什么呢?...因为无论如何没有人会在查询编辑器中读取数据。这个工具的作用是获得正确的数据,而不是呈现数据。最终,将会把数据加载到如下两个地方之一。 Excel:工作表或 Excel 数据模型。...虽然这在某些情况下可以工作,但在数据类型仍然定义为【任意】数据类型的情况下,将数据加载到工作表或数据模型中是非常危险的。为什么呢?...为了使刷新工作正常进行,需要编辑查询,找到显示这个问题的步骤,并找出面前提到的错误类型。只有这样,才能够修复它。 显示【查询 & 连接】窗格(如果它还没有显示,则单击【数据】【查询和连接】)。...【注意】 也可以回到 “ErrorData 中的错误” 查询并强制刷新预览,但仍然需要等待数据集的加载,为什么不同时将数据集加载到最终目的地呢? 可以从结果中得到两个观察结果,如下所示。

    7.7K20

    90%的Java程序员不会的10道Java面试题

    1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。...线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...我认为以下几点解释了为什么 String 类在 Java 中是不可变的或 final 的: 1)想象字符串池没有使字符串不可变,它根本不可能,因为在字符串池的情况下,一个字符串对象/文字,例如 “Test...开始 当两个或多个线程在等待彼此释放所需的资源(锁定)并陷入无限等待即是死锁。它仅在多任务或多线程的情况下发生。 如何检测 Java 中的死锁?...下面是我的修复版本,它通过避免循环等待,而避免死锁, 而不需要抢占, 这是需要死锁的四个条件之一。

    1.4K00

    颠覆认知——Redis会遇到的15个「坑」,你踩过几个?

    所以,当你在删除 List/Hash/Set/ZSet 类型的 key 时,一定要格外注意,不能无脑执行 DEL,而是应该用以下方式删除: 查询元素数量:执行 LLEN/HLEN/SCARD/ZCARD...这里我先告诉你结论:即使 Redis 打开了 lazy-free,在删除一个 String 类型的 bigkey 时,它仍旧是在主线程中处理,而不是放到后台线程中执行。...如果此时 Redis 发生了宕机,那么,AOF 文件中丢失是 2 秒的数据,而不是 1 秒! 我们继续分析,Redis 主线程为什么要等待 2 秒不写 AOF page cache 呢?...1 秒的时间,等待 fsync 成功 但代价就是,如果此时发生宕机,AOF 丢失的就是 2 秒的数据,而不是 1 秒。...原因在于,EXISTS 与查询数据的命令,使用的不是同一个方法。 Redis 作者只在查询数据时增加了过期时间的校验,但 EXISTS 命令依旧没有这么做。

    1.3K40

    C++ 高性能服务器网络框架设计细节

    如果一个服务器能单纯地接受n个连接(n可能很大),但是不能有条不紊地处理与这些连接之间的数据来往也没有任何意义,这种服务器框架只是“玩具型”的,对实际生产和应用没有任何意义。   ...例如: 默认情况下,recv 函数如果没有数据的时候,线程就会阻塞在那里; 默认情况下,send 函数,如果 tcp 窗口不是足够大,数据发不出去也会阻塞在那里; connect 函数默认连接另外一端的时候...以上都不是高效服务器的开发思维方式,因为上面的例子都不满足“尽量减少等待”的原则,为什么一定要等待呢?有没用一种方法,这些过程不需要等待,最好是不仅不需要等待,而且这些事情完成之后能通知我。...我们只能是做无用功了,说白了,还是在浪费时间,因为假如一个服务器有多个连接,在cpu时间片有限的情况下,我们花费了一定的时间检测了一部分socket连接,却发现它们什么事件都没有,而在这段时间内我们却有一些事情需要处理...这个在服务程序资源够用的情况下可能体现不出来什么优势,但是如果有大量的任务要处理,这里就成了性能的一个瓶颈。

    1.9K62

    来一场Java高级的面试,看看自己啥水准

    为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。...线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...我认为以下几点解释了为什么 String 类在 Java 中是不可变的或 final 的: 1)想象字符串池没有使字符串不可变,它根本不可能,因为在字符串池的情况下,一个字符串对象/文字,例如 “Test...开始 当两个或多个线程在等待彼此释放所需的资源(锁定)并陷入无限等待即是死锁。它仅在多任务或多线程的情况下发生。 如何检测 Java 中的死锁?...下面是我的修复版本,它通过避免循环等待,而避免死锁, 而不需要抢占, 这是需要死锁的四个条件之一。

    1.3K10

    VS Code 调试完全攻略(3):编辑变量并重新执行函数

    可以通过在调试器中重新执行代码块,来查看它们在不同情况下的行为。在调用栈中修改变量并重新执行函数可以让你节省大量的时间! ? VS Code 调试完全攻略系列目录 ?...虽然这些功能不是很直观,但是非常强大,可以帮你节省大量时间。你可以把不同的输入传给埋藏在调用栈深处的函数,而不用在重新启动程序时漫长而乏味的等待。...我们的玩具服务器的请求中始终存在一个名为 name 的查询参数。如果没有参数,响应将会变为 “Hello, undefined!”...让我们通过调试器看看 getGreeting 函数在不同 name 参数下的表现如何。显然修复这个问题很简单,但是让我们来看看在调试器可以做些什么。?...在第 15 行上放置一个断点,然后在没有查询参数 name 的情况下访问服务器(例如,curl http://127.0.0.1:3456)。 你应该看到调试器启动后停在第 15行。 ?

    4.4K20

    谷歌Duet AI覆盖整个软件开发生命周期

    他们继续说:“编写代码时一个永恒的问题,特别是在原型制作时,是调试步骤和试图弄清楚:发生了什么?为什么会出现这个错误?我的东西不起作用,求助!”...“我认为这归结为工程文化和生成式人工智能固有的人性部分,即它在这里是为了帮助我们作为人类;它不是为了将事情自动化,” O’Keefe说。“因为如果发生了问题,我们将不知道如何修复。...他将此类比于他的儿子如何为驾驶考试做准备;在加利福尼亚,你在考试中不能使用后视摄像头。他的观点是,我们都必须学习基础知识,然后才能以批判的眼光利用AI。...如果我获得了架构、指导和所有这些东西,我就不会让每个开发人员排队等待测试审核、架构审核和编码协助。” Seroter强调,这不是一个通用模型。...“它可以查看我打开文件中其他内容的结构。所以想象一下,我有一个包含所有现有函数的大型测试文件,其中包含其他测试,“ O’Keefe说。

    90100

    dotnet 简单控制台使用 KernelMemory 向量化文本嵌入生成和查询

    我这里的部署名称使用的是 Embedding 名称,完成部署之后的界面内容大概如下 完成以上准备工作之后,接下来可以开始新建控制台编写代码了。...重复项为: \r\n```重复的原因是 WPF 在 .NET SDK 里修复了在 XAML 构建过程中,没有引用 NuGet 包里面的文件。...而源代码包许多都是在此修复之前打出来的,源代码包为了修复在 XAML 里面没有引用文件,就强行加上修复逻辑引用文件。...因此只需要新建一个程序集,设置 AssemblyName 为 SamplesApp 即 可 关联性: 0.66 内容: NET SDK 里修复了在 XAML 构建过程中,没有引用 NuGet 包里面的文件...而源代码包许多都是在此修复之前打出来的,源代码包为了修复在 XAML 里面没有引用文件,就强行加上修复逻辑引用文件。

    88510

    史上最难10道 Java 面试题!

    1、为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。...线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...我认为以下几点解释了为什么 String 类在 Java 中是不可变的或 final 的: 1)想象字符串池没有使字符串不可变,它根本不可能,因为在字符串池的情况下,一个字符串对象/文字,例如 “Test...开始 当两个或多个线程在等待彼此释放所需的资源(锁定)并陷入无限等待即是死锁。它仅在多任务或多线程的情况下发生。 如何检测 Java 中的死锁?...下面是我的修复版本,它通过避免循环等待,而避免死锁, 而不需要抢占, 这是需要死锁的四个条件之一。

    1.1K30
    领券