重写代码消耗了12个月!

我们从头开始重写代码浪费的时间。
你能想象在软件行业,12个月的时间没有任何新产品推出,没有任何新版本更新吗?
真的,我不由自主地问自己这个问题:
在这个快速发展的世界里,12月的时间能让我们做多少事情?
“2015年1月20日,星期二,下午5:10,AntiMalware软件终于进入了第一次公测。”
经过几十个小时的不眠不休后,第一个版本的软件说明书终于发布到了网站上,这标志着我们的新旅程的开始。
我在一家为企业和终端用户提供安全软件的小型网络安全公司工作。我们开发的软件保护用户免受恶意软件的侵害。如果用户的电脑被恶意软件感染,我们的软件会帮助他们清理。AntiMalware就是其中一个软件。
第一个测试版收到的反馈令人鼓舞。我们有四个开发人员为这个产品工作,不断地修复Bug, 改进产品功能,推出新版本。

第一个稳定版本

经过两个月的纠错、功能改进和编码工作,我们发布了AntiMalware的第一个稳定版本。
看看用户怎么说?
大多数用户的反馈都很好,他们喜欢这个产品。这让我们的团队深受鼓舞,大家卯足了劲地干活,来改进这个产品的核心功能。

进入市场

2016—2017。
大风暴来临前的黄金岁月。
AntiMalware软件处于它的最佳期,它成为了我们的旗舰产品。用户纷纷把它推荐给他们的朋友们。所有与安全相关的博客和论坛也都在推荐这个软件。它成了拯救被恶意软件感染的用户的首选软件。
下载、安装、销售,一切都向好的方向发展,用户群在几个月内迅速增长。创始人很高兴,团队也是如此。大家都在想:“我们做到了!像其他大公司一样,我们认为我们创造了自己的成功故事。“

新机遇(至少我们这样认为):进入企业市场

后来,公司决定进入企业市场。一个新的企业产品团队成立了。原产品负责人离开了公司,我们的CTO接任成为新的产品负责人(这是灾难的开始,稍后我会解释)。
一些开发人员离开了公司,但没有什么影响。我们把每件事情处理得很好,AntiMalware软件仍然是市场上最好的选择。

好日子结束, 麻烦开始

正如我前面所说,我们的CTO成了AntiMalware的产品负责人,他需要处理AntiMalware的方方面面。而且他还是该软件的首席开发人员,负责不间断地发布更新和功能提升。同时,他的职位让他还需要处理公司的其他事务。
当然,一开始都很顺利,我们的情况就像所有软件开发一样,我们不间断地维护和改进我们的软件。
正如我们应该预料到的(显然我们没有),不知何故,软件开发过程开始慢下来。
新的版本更新开始延期了,这种情况持续了一阵子,很快就变成没有版本更新了。这让我很不安,有一天我问CTO:
“这个产品出了什么问题?为什么版本更新要花费那么多时间而且开发进展缓慢?”
他深吸一口气,开始回答:
“我们的代码太复杂,它的结构不好,耦合太紧。架构设计完全错误,用户界面和核心逻辑代码混杂在一起,每当修复一个Bug或作某些改变时,其他部分就会受影响。即使是小的改变也很难做好。每次更新,都会引起新的问题。
一些方法竟然有20个参数,方法体的代码有两页长!你能想象吗?有许多不应该实现的东西不知为何都实现了。
这就是为什么每次更新都要花费很长时间而我们无法推出新功能的原因。每次我们推出一个新版本,我都担心可能会引入新的Bug,而那些现在工作得很好的核心功能则有可能因此无法工作。在这种情况下,发布新版本太冒险了,我们可能会失去我们的用户,我们的软件无人再愿意使用。”
他的回答中提到的一系列问题其实我们都知道。只是,我们期望从他的口中说出来。
我还问了一个问题。负责这个软件的前任首席开发人员为这个软件开发了一年时间,而他都在CTO的管理下,那么CTO为什么允许这样混乱的代码出来呢?
“我不想打击他的积极性,我们必须尽快进入反恶意软件市场,他很擅长这个,所以我才没有制止他这样做。”
CTO这样回答。
也就是说,为了以最快的速度进入市场,我们牺牲了代码质量,这样做也等于破坏了这个产品的未来。
经验教训:
要在第一时间对不好的代码设计说“不”,不要让“面条式代码”毁了你的产品的未来。要确保做出的软件产品有可持续开发性。

那么,如何修复这个可怕的代码?

“我们都是程序员,而程序员的心中都驻着个建筑师,当他们到达一个地方的时候,他们想做的第一件事就是把这个地方夷为平地,然后在上面建造一些宏伟的建筑。我们对那些渐进式的更新不感兴趣:如小修小补、改进、种种花草等等。”
- Joel Spolsky,Stackoverflow公司CEO
开发人员总是倾向于抛弃旧代码然后从头开始,他们有这样做的理由。因为他们认为旧代码都是无用而且凌乱的。但是这只是想当然的理由。当我们试图找出背后的真正原因时,我们会发现:
我们可能错了!
旧代码对我们来说可能看起来很凌乱,必须从头重写的原因并不是因为代码本身,而是因为一个重要的,基本的编程法则:
读代码比写代码难。
这解释了代码重用困难的原因,也解释了为什么我们认为旧代码象头发一样凌乱。因为这个原因,当我们阅读另一个开发人员的代码时,我们的潜意识会不断对着我们耳语“扔掉它,重新开始”。
像所有开发人员一样,我们也落入了这个陷阱。只是读一遍我们的凌乱的代码就足够让我们下决心考虑从头重写了。
在一系列的会议之后,即使CTO对重写代码有抵触(他是对的),他最终还是被说服了,我们决定从头重写代码。
然而,重写代码的决定并没有持续太久…
那是一个周末,星期日,我边喝早茶边读一些推送文章。就像我的推送知道该向我展示什么一样,我读到了那篇最著名的关于重写代码的文章,就是Joel Spolsky写的Netscape 的代码重写故事(https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/)。
读完那篇文章后,我立马分享给了AntiMalware开发团队,包括CTO。
然后我们开始了新的讨论。
本来说服CTO作出代码重写的决定就已经很难了。他在读完那篇文章后马上改变了主意,他决定中止代码重写。这让其他团队成员生气了,他们冲我大喊大叫:
“你为什么给他看那篇文章?我们都已经说服他了。这个产品必须从头重写,这是唯一的解决方案。”
我们的第一次重写代码的尝试到此结束了。关于这个话题的讨论也终止了。我们的CTO相信我们可以管理好这个糟糕的代码,并有能力在它之上发布新版本,直到严酷的现实击倒我们为止。
一年没有任何更新…
真的,这不是玩笑。真的一年没有更新了!
“为什么没有更新?“
“自上次更新到现在已经有好几个月过去了。”
每天,我们都得面对这些来自用户的负面评论。作为一家小公司,我们需要管理的产品太多了,而且,我们又进入了企业市场,这些加在一起,使得我们陷入了这样的困境。
把所有这些结合起来,你就会得出这样的结论:我们忘记了我们的用户。
回想一下,我们不想发布新的版本,因为我们不想失去用户。
但事实应该是相反的:如果我们不发布新的更新,我们肯定会失去用户,而我们已经一年半没有给他们任何新版本了。
在被现实打了一巴掌之后,我们决定回头。对我们来说,除了重写代码别无它途。我们做到了。

当前

“2018年12月17日,星期一,21:40。测试的电子邮件准备好了,即将发送给我们的内部测试组。”
经过12个月筋疲力尽的工作,代码重写终于完工。我们准备了第一个测试版本说明,就像上次这个产品面市的第一天一样。
我们又回来了…
这个产品的重写版本仍处于测试阶段。测试已经快一个月了。我们正在修复错误,倾听用户的意见,审查用户反馈……一切就像4年前一样……
但是在这12个漫长的月中,我们错过了什么呢?如果不是重写,我们会做出什么新产品?!
许多问题可以在这里提出来。但我知道我们只有重写一条路,我们看不到任何其他的解决方案。
如果你也落入了这个陷阱,开始思考“我是否应该从头开始重写代码”,那么在开始代码重写的第一步之前,就考虑自己提问下面的问题,每个开发人员都应该问问自己:

你准备好抛弃关于旧代码的所有知识了吗?

这个问题很重要!请诚实地回答:你真的准备好抛弃所有的知识,所有收集到的错误和修复,年复一年的编码结果吗?抛弃旧代码并从头开始,真的是你所期望的吗?当你从这个角度来审视代码重写的决定,你会发觉很痛苦,不是吗?所有那些试图修补bug的不眠之夜都会在你眼前闪过。相信我,因为我有切身体会。
你必须和很多用户交谈才能找到导致你的软件不能正常工作的问题所在,然后你要在你的软件中定位这个错误,重现这个问题,然后找到解决方法,然后……等等。

你能保证你会做的比第一次更好吗?

这点很重要:当你从头开始的时候,没有人能保证你会比第一次做的更好。
因为你选择抛弃关于这个软件的所有知识和已经收集的错误和修复,所以同样的错误很可能再次出现在你的新代码里。
可能代码重写团队已经不是第一个版本的开发团队。所以你实际上没有“更多的经验”。你会犯下旧版本中的大部分的的错误,并带来一些新错误,而这些新错误在旧版本中并不存在。
如果你没有很好地计划重写工作,你可能面临新版本比原始版本更糟的风险。然而,既然作出了重写的决定,你就要承担这个风险,这个风险可能导致你失去你的客户。

你准备好将几个月/几年的时间优势拱手送给你的竞争对手吗?

你知道需要多少时间来重写你的软件吗?
代码重写牵扯到大量的精力、计划和准备工作。你必须把每项任务计划好,然而一个接一个地冲刺。你必须确切地知道完成这个痛苦的过程的最后期限。没人知道你会不会错过这个最后期限。有很大的可能你不能准时完成这个过程。
你不得不在数月或数年时间内只能交付旧版本给用户,这将置你于极其危险的境地。你完全无法进行任何战略改变或对市场所需的新功能作出反应,因为你没有任何新代码可以交付。
你的客户可能会抛弃你,因为你除了不断地提供一成不变地旧版本外,无法给他们任何新的东西。
这些你都考虑到了吗?、

从代码重写中我们学到了什么?

从头开始重写一个系统,本质上就是承认作为一个设计师的失败。它其实是在声明,“我们未能设计一个可维护的系统,因此必须重新从头开始。”
——摘自 Max Kanat-Alexander的 Code Simplicity
像其他设计师一样,我们承认我们未能设计好我们的软件,我们从这个精疲力尽的过程中学到了很多东西。在这里,我分享一些我们从中获得的经验教训。
代码重写是开发人员的一种错觉,大多数情况下它不是解决方案。
当你的代码遇到问题时,准确地诊断问题很重要。像每个开发人员一样,你最初的想法不应该是代码重写。代码重写只是一种错觉。因为你在阅读别人的代码的时候,你会认为如果你从头重写代码,你能做得更好。在这种情况下,请始终牢记那个重要的,基本的编程法则。
在决定重写代码前,考虑代码重构
有针对性的重写对于处理代码库中最严重的错误很有用。如果可以限制范围并解决大部分问题,就不要进行整体重写。例如,软件的加载速度非常慢。但这只影响到项目的一小部分。通过小心地移动代码、重构和更改接口,这个问题可以一次性解决。你不必重写所有代码。
代码重写是一条比预期耗时更长、更困难、更容易失败的路。
告诉大家一个开发人员通常在错过最后期限后才意识到的事实:一切都比想象的要花更长的时间。代码重写成本的估计通常很悲观,然而实际的成本几乎总是比你想象的更高,花费的时间也更长。因为总是会有想不到的复杂问题要解决,这些都会使重写过程变得更加困难和痛苦。最后,你很可能不得不接受失败的结果。
确保重写后的产品能够更好地解决用户的问题,至少相同,不能接受更差。
重写对用户没有直接的影响/好处。因为用户不关心代码,他们只想解决自己的问题,仅此而已。在用户看来,能够解决他们问题的产品就是好产品。否则,他们不会用它。用户不关心你的代码重写决定,所以重写后版本必须至少和旧版本一样有效地解决他们的问题。
保持对现有产品的维护和支持。
在我们的案例中,我们有一年的时间没有向用户提供任何软件更新。这对于我们今天生活的世界来说是太长了。尽管我们的产品依然足够优秀,但是没有更新用户肯定会抱怨。当程序员重写代码时,永远不要停止维护当前正在使用的系统。在重写过程中,旧的代码仍然需要维护,小的更新和错误修复需要及时提供给用户。否则,你将面临失去用户的风险。
让用户尽快参与设计过程
确保定期向用户展示最新进展,以便他们能够帮助你捕获最严重的错误。尽快与用户见面是很重要的。他们的反馈将帮助您根据他们的需求设计新产品。不要实现任何不必要的功能,这将避免你的代码库过于复杂化。
保持产品团队同步步调一致
一个产品团队不仅仅包括编程队伍,营销、支持、编程、设计……所有团队需要协力工作。通过定期汇报重写进展情况来确保整个团队步调一致。
在我们的案例中,我们遇到了很多这样的问题。例如,营销团队准备产品测试活动时,他们必须准确了解产品方面的情况,以便让客户为即将到来的产品改变做好准备。但是,有时我们在没有通知他们的情况下做了一些更改。这害得他们必须从头开始准备他们的测试活动。记住:不要浪费任何人的时间。
不要对产品作重大更改。
了解你的产品的弱项和强项,这一点很重要。切记不要改变产品的强项,也即用户喜爱的方面。如果用户对用户界面满意,不要对用户界面作大改动。只做最小的更改和小的用户体验改进。当您用重写后的版本替换现有版本时,确保你的用户不会被新的巨大变化所困扰。有许多情况用户放弃了新版本,因为他们找不到以前版本提供的相同的功能。不要让同样的事情发生在你身上。
不要让你的产品只依赖于一个开发者。
在我们的案例中,CTO是负责开发我们软件的首席开发人员。由于他的立场,我们的产品开发进展缓慢。即使是很小的变化也需要几个星期,有时甚至几个月。我想表达的关键点是保持一直更新,永远不要停止。
版本迁移/更换要循序渐进。
当您确认新版本已经准备好,开始用新版本替换旧版本时。要一步一步,循序渐进。
首先,从一个小型的内部测试组开始,将您的产品发送到该组。收集他们的反馈和崩溃报告,修复错误,迭代新版本,然后重复这个过程,直到你确认你的产品已经准备好公开测试。
进入公开测试后,用户的反馈是你最期待的。你的第一个目标应该是确保您的产品能够解决用户的问题。当你确认新版本提供的功能与旧版本相同或者更好时,就可以进行更换了。这时候开始为新用户发布新版本,并将现有用户迁移到新版本。
以上这些都是我从代码重写过程中吸取的关键经验教训。代码重写几乎永远都不应该是解决方案,重构才是更好的选择。强烈建议采用代码重构循序渐进解决问题。这样做的风险更低,客户也更满意。

什么时候重写代码是合适的选择

然而,有时候重写代码也是合适的解决方案。下面我我列出了重写代码的几种情形:
1、切换到另一种语言或平台:
当一种语言变得如此古老,导致你很难找到开发人员,或者必须花大价钱才能找到时。
2、现有的代码库变得不可维护(像我们的情形):
如何确认你的代码变得不可维护呢?这个很难,但是如果你发现即使是很小的更改也很难实现,或者新的更新比正常需要花费的时间多得多,或者任何新的更改都会影响到软件的其他部分并导致新的错误,那么你可以确认你的代码变得不可维护了。
3、有足够的资源可以同时维护现有系统和设计新系统:
重写代码的时候,永远不要停止维护当前正在使用的系统。只要系统在使用中,必须始终对其提供维护。记住,你的个人注意力也是一种必须考虑的资源,如果你打算同时为新系统和旧系统做设计工作,你要考虑是否每天有足够的时间。
4、开发人员变成了软件开发的瓶颈(像我们的情形):
这不应该出现在重写代码的原因列表中。因为你可以随时在团队中调配开发人员,也可以雇佣新的开发人员来解决瓶颈问题。
然而,就像我们的情形一样,有时你可能需要将它作为代码重写的一个原因。因为我们的软件使用的是旧技术,而CTO是唯一负责开发它的人。我们很难找到一个新的开发人员,因为这个平台年代太久。即使我们能找到一个新人,对我们来说也太昂贵。因此。我还是把它作为代码重写的情形之一,列在这里。
5、软件的年龄太长(我说的是10-20年或更长时间):
随着时间的推移,一个软件的代码会变得越来越凌乱,维护也会变得越来越昂贵。这是因为为了快速推出修复补丁,初始架构有时会被牺牲掉。而且,懂得旧技术的开发人员越来越少,人员成本也越来越高。同时,很难找到适合旧的应用程序运行的硬件、操作系统和框架。此外,随着业务的发展,旧的系统很可能无法满足新的业务需求。
所以,你必须在旧系统高昂的维护成本,新系统的潜在好处,以及从头重写的成本之间作一个权衡。
如果你的情形符合上述一点或多点,代码重写可能是你能接受的选项。否则,正确的做法是通过一系列简单的步骤改进系统的设计,在不重写代码的情况下处理解决现有系统的复杂性。
从头重写代码可能是你犯的最大错误,但同样地,不重写代码也可能导致相同的结果。我的建议是优先考虑重构而不是重写。
有些开发人员坚信所有系统最终都必须重写。记住这并非总是对的。设计一个不需要抛弃的系统是可能的。总有软件设计师会告诉你,“无论如何,总有一天我们会丢掉所有的东西”。但是,如果软件是从一开始就设计得很好,而且一直有很好的维护,为什么它会被抛弃呢?

菜鸡Everyday
发布了11 篇原创文章 · 获赞 0 · 访问量 51
私信关注
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 文件上传分文件夹,单文件夹1024

    点赞收藏分享文章举报zyh20090823发布了32 篇原创文章 获赞 3 访问量 6884私信关注...

    2024/3/29 10:17:45
  2. MacOS上如何批量更改视频帧速率

    更改视频帧频从来都不是一件容易的事,尤其是对于视频编辑不熟练的人。在这篇文章中。我们将为您介绍如何批量更改视频帧速率,以便您可以批量更改视频帧速率而没有任何问题。使用Wondershare UniConverter更改帧速率的步骤步骤1选择文件以调整视频帧速率。启动Wondershare Uni…...

    2024/4/20 16:25:43
  3. cocos creator实例--CocosCreator一步一步实现重力球游戏

    『 游戏玩法 』通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或者下方的火焰,游戏结束。『 游戏预览 』『 开发工具 』1. CocosCreator 2.1.22. VisualStudio Code『 参考API 』1. PhysicsManager2. SystemEvent3. View4. actio…...

    2024/4/17 10:42:57
  4. 量化选股模型—资金流模型

    在市场中,经常存在交易性机会,其中一个就是资金流模型,该模型使用资金流流向来判断股票在未来一段时间的涨跌情况,如果是资金流入的股票,则股价在未来一段时间将可能会上涨;如果是资金流出的股票,则股价在未来一段时间会可能下跌,那么,根据资金流向就可以构建相应的投…...

    2024/4/7 23:55:07
  5. SpringCloud分布式微服务云架构第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)

    这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件。 一、简介Add sleuth to the classpath of a Spring Boot application (see below for Maven and Gradle examples), and you will see the correlation data being collected in logs, as long as …...

    2024/4/10 19:55:45
  6. linux sudo root 权限绕过漏洞(CVE-2019-14287)复现

    渗透学习交流群:773617250(群内定期发布相关教程视频,直播) 一. 漏洞描述 2019年10月14日,Sudo官方发布了Sudo 1.8.28版本,其中包含sudo root权限绕过漏洞的补丁修复。 此漏洞编号是CVE-2019-14287,当sudo配置为允许用户以任意方式运行命令时用户通过Runas规范中的ALL关…...

    2024/3/29 10:17:40
  7. 注解 @Target 用法

    @Target:@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰…...

    2024/3/28 18:04:27
  8. iOS开发之使用XMPPFramework实现即时通信(一)

    iOS开发之使用XMPPFramework实现即时通信(一)关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让我们的微信可以实现互联通信。要做的准备工作是要有服务器支持XMPP协议,然后通过spark注册个…...

    2024/4/14 19:10:14
  9. 不同平台下int类型、指针类型的数据大小

    对于int类型数据和指针类型数据的大小,是非常基础的问题。在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类型的大小。在不同的平台下,int类型和指针类型的数据类型大小时怎样的呢?如果要给出一个统一的答案,自然不可能集齐每个平…...

    2024/3/29 10:17:38
  10. java开发工具 Eclipse的基本使用

    Eclipse的基本使用选择工作空间 工作空间 其实就是我们写的源代码所在的目录用Eclipse来完成一个HelloWorld案例代码以项目为基本单位创建项目创建包创建类编写代码 1: 用Eclipse写一个HelloWorld案例,最终在控制台输出你的名字A:创建项目B:在src目录下创建包。cn.itcastC:在…...

    2024/4/19 12:50:19
  11. Shell的脚本学习

    第1章 Shell概述1)需要看懂运维人员编写的Shell程序。2)偶尔会编写一些简单Shell程序来管理集群、提高开发效率。第2章 Shell解析器(1)Linux提供的Shell解析器有:[atguigu@hadoop101 ~]$ cat /etc/shells/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh(2)bas…...

    2024/4/20 10:00:50
  12. 教你修改电脑mac地址图解教程

    mac地址又称为硬件地址或者物理地址,指的是局域网中的每一台计算机中固化在适配器的ROM中的地址,第二层数据链路层则负责 MAC地址,一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的地址。MAC地址由48位二进制(6个字节)组成,采用十六进制表示。简单的说就是你自…...

    2024/4/19 20:15:33
  13. Elasticsearch学习笔记-第27节:分布式文档系统_阶段性总结以及什么是distributed document store

    课程大纲1、阶段性总结1~8讲:快速入门了一下,最基本的原理,最基本的操作 9~13讲:在入门之后,对ES的分布式的基本原理,进行了相对深入一些的剖析 14~27讲:围绕着document这个东西,进行操作,进行讲解和分析2、什么是distributed document store到目前为止,你觉得你在学…...

    2024/4/20 8:07:08
  14. Elasticsearch学习笔记-第28节:分布式文档系统_深度图解剖析document数据路由原理

    课程大纲(1)document路由到shard上是什么意思?(2)路由算法:shard = hash(routing) % number_of_primary_shards举个例子,一个index有3个primary shard,P0,P1,P2每次增删改查一个document的时候,都会带过来一个routing number,默认就是这个document的_id(可能是手动…...

    2024/4/7 23:57:28
  15. 峰创时代|高性能编程

    高性能编程 前言 首先说一下我为什么要写这篇博客。因为面试有提到这个,我当时直接说不懂(一方面当时心态很差,另一方面面试官的询问方式令我很反感。所以直接refuse了。小伙伴们千万别学我)。 所以,打算谈一谈我对Java高性能编程方面的认识与总结。 首先,高性能编程不涉…...

    2024/4/18 2:10:33
  16. 测试发布一个文章

    撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + Shift + H 无序列表:Ctrl/Command + Shift + U 有序列表:Ctrl/Command + Shift + O 检查列表:Ctrl/Command + Shift + C 插入代码:Ctrl/Command + Shi…...

    2024/4/20 11:37:50
  17. cocos creator实例--CocosCreator实现左右跳游戏

    1玩法说明游戏开始后,点击屏幕左右两侧,机器人朝左上方或右上方跳一步,如果下一步有石块,成功得1分,否则游戏结束。2模块介绍游戏场景分为2个:主页场景(home)、游戏场景(game)。主页场景(home)作为游戏入口,没有其他功能,单纯提供游戏入口。游戏场景(game)实现…...

    2024/4/17 2:35:52
  18. SpringCloud分布式微服务云架构 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置文件的更改。 一、准备工作 本文还是基于上一篇文章来实现。按照官方文档,我们只需要…...

    2024/4/19 16:35:40
  19. 嵌入式Linux系统:基础知识_虚拟内存与物理内存

    在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题:物理内…...

    2024/4/3 8:59:17
  20. EMC测试不合格,应该这样整改

    EMC主要是通过测试产品在电磁方面的干扰大小和抗干扰能力的综合评定,是产品在质量安全认证重要的指标之一。很多产品在做产品安全认证时都会遇到产品测试不合格的情况,尤其是在电磁兼容测试(即EMC测试)出错频率更是普遍。当产品一旦测试不合格,那么随之而来的肯定是EMC整改…...

    2024/4/11 1:39:51

最新文章

  1. C语言求自幂数(水仙花数与其他自幂数)

    前言 今天我们来看一下如果求解自幂数(水仙花数),水仙花数是自幂数的一种,我们来看看自幂数的概念吧,当一个n位数,它的每个位上的数字的n次幂之和等于它本身的时候,我们称这个数为自幂数。水仙花…...

    2024/4/20 22:31:15
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. docker进行jenkins接口自动化测试持续集成实战

    文章目录 一、接口功能自动化测试项目源码讲解二、接口功能自动化测试运行环境配置1、下载jdk,maven,git,allure并配置对应的环境变量2、使用docker安装jenkins3、配置接口测试的运行时环境选择对应节点4、jenkins下载插件5、jenkins配置环境…...

    2024/4/19 17:56:05
  4. 【项目新功能开发篇】开发编码

    作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…...

    2024/4/20 6:46:38
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/19 14:24:02
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/19 18:20:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/19 11:57:31
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/19 11:57:31
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/19 11:57:52
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/19 11:58:14
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/19 11:58:20
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/20 7:40:48
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/19 11:58:39
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/19 11:58:51
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/20 3:12:02
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/19 11:59:15
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/19 11:59:48
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/19 12:00:06
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/20 21:12:02
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/19 12:00:25
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/19 12:00:40
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57