重构代码花 1 年!程序员血泪史:千万不要重写代码!

程序员终身学习方法论:从高原期突破到知识织网 学习能力不是天赋,而是可训练的神经回路系统——它源于对问题本质的敏感、对知识转化的深度加工,以及将学习嵌入真实工作流的工程化实践。在AI辅助编程日益普及的今天,‘会学’比‘学会’更重要:Copilot能生成代码,但无法替代你判断何时该深挖原理、何时该重构设计;大模型能总结文档,却无法帮你建立HTTP状态码与JWT认证、Nginx配置、前端拦截器之间的动态知识网络。本文聚焦程序员最常遭遇的认知断层:高原期停滞、经典书读不懂、学习时间难合规、知识碎片难成体系。通过‘织网式学习’‘最小闭环验证’‘认知重启三线法’ 阅读详情

对重写代码说不。

作者 | Roman Luzgin

译者 | 苏本如

责编 | 屠敏

出品 | 优快云(ID:优快云News)

以下为译文:

重写代码消耗了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是负责开发我们软件的首席开发人员。由于他的立场,我们的产品开发进展缓慢。即使是很小的变化也需要几个星期,有时甚至几个月。我想表达的关键点是保持一直更新,永远不要停止。

版本迁移/更换要循序渐进。

当您确认新版本已经准备好,开始用新版本替换旧版本时。要一步一步,循序渐进。

首先,从一个小型的内部测试组开始,将您的产品发送到该组。收集他们的反馈和崩溃报告,修复错误,迭代新版本,然后重复这个过程,直到你确认你的产品已经准备好公开测试。

进入公开测试后,用户的反馈是你最期待的。你的第一个目标应该是确保您的产品能够解决用户的问题。当你确认新版本提供的功能与旧版本相同或者更好时,就可以进行更换了。这时候开始为新用户发布新版本,并将现有用户迁移到新版本。

以上这些都是我从代码重写过程中吸取的关键经验教训。代码重写几乎永远都不应该是解决方案,重构才是更好的选择。强烈建议采用代码重构循序渐进解决问题。这样做的风险更低,客户也更满意。

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

然而,有时候重写代码也是合适的解决方案。下面我我列出了重写代码的几种情形:

切换到另一种语言或平台:

当一种语言变得如此古老,导致你很难找到开发人员,或者必须花大价钱才能找到时。

现有的代码库变得不可维护(像我们的情形):

如何确认你的代码变得不可维护呢?这个很难,但是如果你发现即使是很小的更改也很难实现,或者新的更新比正常需要花费的时间多得多,或者任何新的更改都会影响到软件的其他部分并导致新的错误,那么你可以确认你的代码变得不可维护了。

有足够的资源可以同时维护现有系统和设计新系统:

重写代码的时候,永远不要停止维护当前正在使用的系统。只要系统在使用中,必须始终对其提供维护。记住,你的个人注意力也是一种必须考虑的资源,如果你打算同时为新系统和旧系统做设计工作,你要考虑是否每天有足够的时间。

开发人员变成了软件开发的瓶颈(像我们的情形):

这不应该出现在重写代码的原因列表中。因为你可以随时在团队中调配开发人员,也可以雇佣新的开发人员来解决瓶颈问题。

然而,就像我们的情形一样,有时你可能需要将它作为代码重写的一个原因。因为我们的软件使用的是旧技术,而CTO是唯一负责开发它的人。我们很难找到一个新的开发人员,因为这个平台年代太久。即使我们能找到一个新人,对我们来说也太昂贵。因此。我还是把它作为代码重写的情形之一,列在这里。

软件的年龄太长(我说的是10-20年或更长时间):

随着时间的推移,一个软件的代码会变得越来越凌乱,维护也会变得越来越昂贵。这是因为为了快速推出修复补丁,初始架构有时会被牺牲掉。而且,懂得旧技术的开发人员越来越少,人员成本也越来越高。同时,很难找到适合旧的应用程序运行的硬件、操作系统和框架。此外,随着业务的发展,旧的系统很可能无法满足新的业务需求。

所以,你必须在旧系统高昂的维护成本,新系统的潜在好处,以及从头重写的成本之间作一个权衡。

如果你的情形符合上述一点或多点,代码重写可能是你能接受的选项。否则,正确的做法是通过一系列简单的步骤改进系统的设计,在不重写代码的情况下处理解决现有系统的复杂性。

从头重写代码可能是你犯的最大错误,但同样地,不重写代码也可能导致相同的结果。我的建议是优先考虑重构而不是重写。

有些开发人员坚信所有系统最终都必须重写。记住这并非总是对的。设计一个不需要抛弃的系统是可能的。总有软件设计师会告诉你,“无论如何,总有一天我们会丢掉所有的东西”。但是,如果软件是从一开始就设计得很好,而且一直有很好的维护,为什么它会被抛弃呢?

原文:https://medium.freecodecamp.org/lessons-learned-in-my-10-years-as-a-developer-3d33c8702828

趣味游戏文章:

太好玩了!用Python写个弹球游戏2.0

巧妙的Python数据结构玩法|实战德州扑克

手把手教你,菜鸟也能用Python写一个2048游戏

用Python做个美少女大战小怪兽

强烈推荐,用Python轻松打造定制款《植物大战僵尸》

Python心得和技巧:

零基础学了8个月的Python,到底有啥感悟

我珍藏的一些好的Python代码,技巧

菜鸟写Python程序,如何从新手变老手

菜鸟必收藏,13个Python惯用小技巧

你点的每个“在看”,我都认真当成了喜欢 

Pandas多维聚合实战:银行风控场景下的生产级groupby优化 多维聚合是数据分析中连接原始数据与业务洞察的核心环节,其本质是在时间、地理、客户、产品等多重维度上执行高效、准确且可解释的统计计算。它依赖于分组机制的底层原理,通过向量化操作替代循环以保障性能,并借助自定义函数嵌入真实业务规则,从而支撑风控建模、监管报送与精准营销等关键应用场景。本文聚焦Pandas中groupby的高阶用法,深入解析多列聚合、滚动窗口、层级解构与自定义逻辑四大技术支柱,结合银行日均3亿交易流水的压测实践,提供可直接复用的生产级代码范式与避坑指南。 阅读详情

相关推荐

数字孪生项目引擎选型:从Unity转向UE5的实战避坑指南

在构建高保真、大规模的数字孪生系统时,实时渲染引擎的选择是项目成功的关键技术决策之一。渲染引擎的核心原理在于处理三维图形数据,通过光照、材质和几何体渲染等技术,在屏幕上生成逼真的虚拟场景。其技术价值在于平衡视觉质量与实时性能,为仿真、可视化等应用提供核心动力。在智慧城市、工业仿真等应用场景中,项目通常面临大场景渲染、实时数据驱动和跨平台部署等硬性需求。本文基于真实的项目实践,深入剖析了当项目需求涉及超大规模场景渲染与深度定制时,为何Unreal Engine 5的Nanite虚拟几何体与Lumen全局光照等

weixin_34043301的博客 416

优秀后端都应该具备的开发好习惯

很多小伙伴,判断一个list}这样写呢,逻辑是没什么问题的。}日常开发中,我们既要会用工具类,更要学会自己去总结工具类。比如去文件处理工具类、日期处理工具类等等。这些都是优秀后端开发的一些好习惯。

LoveSummer 2万+

银行级机器学习系统上线:从模型部署到生产稳定性的全链路工程实践

机器学习模型部署不是代码打包上线的终点,而是面向真实业务流量、跨系统依赖与数据不确定性的工程起点。在金融等强监管场景中,模型稳定性、特征时效性、决策可解释性与故障可回滚性共同构成生产可用性的核心支柱。本文围绕银行级ML系统落地中的典型挑战——如特征漂移、协议兼容断层、重试风暴、Fallback失效及监控失焦——展开深度剖析,融合PSI漂移检测、SHAP实时解释、确定性降级、黄金三角监控等关键技术手段,揭示MLOps本质是‘以不确定性为前提的系统韧性设计’。内容覆盖从模型服务化集成、毫秒级延迟优化,到审计就绪

weixin_34160277的博客 429

重构、重载、重写。看完就懂了!

重构、重载、重写

qq_52089423的博客 1451

多维聚合实战:从pandas groupby到银行级数据工程

多维聚合是数据分析的核心能力,本质是将高维原始数据按业务维度降维重构为可解释的指标矩阵。其原理不仅涉及统计计算,更依赖分组键顺序、窗口时间对齐、内存布局与缺失值语义等系统性设计。技术价值在于支撑实时风控、客户分群、经营归因等关键场景,避免因NaN处理不当、列名嵌套、序列化失败等问题导致报表失真或模型偏差。典型应用包括银行信用卡交易分析、电商GMV交叉归因、SaaS产品使用行为聚类等。本文聚焦生产环境下的七种高频聚合模式组合,覆盖多列多函数聚合、自定义可审计函数、滚动/扩展时间窗口、多级分组unstack及复

weixin_30635053的博客 788

ABAP OO - ALV_TREE例程

项目上比较少有用到ALV_TREE的报表功能,刚好项目上有写了一次,也查阅大量的范例,整合了一写法,给自己做一下笔记。 程序包含功能按钮,按钮下拉,F4帮助,读取选中行,字段双击触发事件,字段前置图标,更新节点,获取节点数据,获取全部子节点,递归算法,DMS模块:创建文档功能,创建文档链接,SNRO创建流水号,缓存数据,下次用户加载进来继续操作。 *&---------------------------------------------------------------------* *&a

大步甩起来 4989

重构、重写、重载的区别

重构、重写、重载 重构:通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理。提高软件的扩展性和维护性。通俗点说,重构就是当你发现代码的不足之处时,去改动它的结构,去优化它。 重构的具体做法:可以通过重写或者重载等,但不限于此,更改注释、更改函数名类名等,都可以称之为重构; 重构的目的 :是为了让软件容易维护, 修改其Bug等。 ...

xxzh_pengpeng的博客 2189

Cadence笔记--原理图导入PCB

根据PCB尺寸画PCB外观尺寸,这里注意X\Y不能超过指定的区域,X\Y的最大值在setuo的grids里设置,画完后保存并关闭工程然后重新打开(不理解为何)由于只画了一个PMU6050,所以这里只有一个器件。工程选择board,选择存储路径和名称。6、重新网格导入,保证网表导入无误;注意网表保存的路径。

weixin_51418325的博客 1960

改善你的代码:使用这5种重构技术

重构是任何希望提高代码质量、性能和可维护性的开发者的基本实践。通过花时间分析和优化代码,可以消除冗余,降低复杂性,并创建更高效且可扩展的应用程序。通过不断审查和改进你的代码,你可以创建一个更强大、更具弹性的应用程序。希望这篇文章能帮助您了解一些重构技巧。代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具Fundebug。

粉丝们务必加入微信粉丝群 1692

Android UI 组件系列(二):Button 进阶用法

在这篇博客中,我们深入探讨了 Button 的进阶用法,重点介绍了如何通过 事件处理 来响应用户的操作,如何使用 自定义样式 来提升按钮的外观,并利用 StateListDrawable 来管理按钮在不同状态下的表现。这些技巧能够帮助你打造更具交互性、视觉吸引力和动态响应的按钮,提升用户体验。

weixin_39339407的博客 1625

【拼多多笔试题汇总】2024-03-24-拼多多春招笔试题

A 小镇上有个奇特的游戏。游戏开始时,A 先生准备了一排 nnn 个物品。K 小姐和卢小姐则轮流进行操作。首先,K 小姐可以选择移除至多 xxx 个物品。接着,卢小姐也可以选择移除剩余物品中的至多 yyy 个。游戏的目标是,K 小姐想尽量让剩余物品的价值之和最大化,而卢小姐则想将剩余物品的价值之和最小化。假设两人都采取最优策略,请问最后剩余物品的价值之和是多少?第一行包含五个正整数 n,m,k,x,yn, m, k, x, yn,m,k,x,y,分别表示物品的总数、K 小姐最多可移除的物品数、卢小姐最多可移

春秋招笔试突围 1万+

常见代码重构技巧(非常实用)

Java 8 之前我们知道,一个接口的所有方法其子类必须实现(当然,这个子类不是一个抽象类),但是 java 8 之后接口的默认方法可以选择不实现,如上的操作是可以通过编译期编译的。另外,if else(或switch)本身就是一个“变化点”,当需要扩展新的类型时,我们不得不追加if else(或switch)语句块,以及相应的逻辑,这无疑降低了程序的可扩展性,也违反了面向对象的开闭原则。同时,类职责单一,类依赖的和被依赖的其他类也会变少,减少了代码的耦合性,以此来实现代码的高内聚、松耦合。

rainbow的博客 803

uniapp(安卓 | 苹果) - 最新详细实现App打包发布教程,uni-app苹果IOS软件应用上架App Store软件商店,uni-app打包发布安卓Android软件到各大应用商店(详细教程

uni-app,安卓android,苹果ios,uniapp App软件,Uniapp上架发布应用,打包构建,apk、app软件,应用商店,应用市场,app store,uni-app安卓苹果app上架应用商店,app应用从创建到上架_uniapp打包app的流程和上架,uniapp打包上架ios Appstore 最全流程,苹果应用商店上架教程,uniapp生成的app怎么上架到iphone的app store,uni-app打包到上架Android , ios完整详细流程,审核一直不通过,软件商店审核失

✅ 精选推荐文章 1万+

1 代码_重构代码花 1 年!程序员血泪史:千万不要重写代码!

作者 |Roman Luzgin译者 | 苏本如 责编 |屠敏原文|http://suo.im/6qIUhX以下为译文:1.重写代码消耗了12个月!我们从头开始重写代码浪费的时间。你能想象在软件行业,12个月的时间没有任何新产品推出,没有任何新版本更新吗?真的,我不由自主地问自己这个问题:在这个快速发展的世界里,12月的时间能让我们做多少事情?“2015年1月20日,星期二,...

weixin_39969568的博客 143

408 | 408常用计算公式与方法 —— 计组篇 汇总

408常用计算公式与方法 —— 计算机组成原理篇 汇总

"You are worthy! You can do it!" 4655

【深度学习新浪潮】ISP芯片算法技术简介及关键技术分析

ISP(Image Signal Processor)芯片作为现代影像系统的核心组件,负责对图像传感器输出的原始信号进行后期处理。ISP的主要功能包括线性纠正、噪声去除、坏点修复、色彩校正以及白平衡调整等,这些处理步骤对于提高图像质量和视觉效果至关重要。随着科技的进步,ISP芯片不仅提升了图像的清晰度和色彩准确性,还通过高效的算法增强了拍摄体验,尤其是在低光环境下的表现。

专注:太空算力、AI infra、异构调度、大模型成本工程 1223

不用改一行代码,工作效率翻倍了?我的程序员搭子竟然是它!

有次更离谱:我写着代码突然想优化Docker镜像体积,顺嘴问了句“alpine和distroless怎么选”,它列完对比表又补了刀:“您在2023-08的项目曾因glibc兼容性问题改用distroless”——连我一年前的技术债都记得。我SQL优化直接让它重写,省了两小时?早上7点,咖啡还没咽下去,产品经理的新需求又弹了出来:“加个动态权限控制,今天上线?对了,刚让DeepSeek生成这段话时,它坚持要加一句免责声明:“建议人类程序员亲自审查代码,本人不背锅”——啧,这求生欲,比我会来事儿多了。

weixin_50019283的博客 322

基于STM32、HAL库的RN8209D电能计量芯片驱动程序设计

/ 假设电压互感器变比为220V:0.5V,电流互感器变比为20A:5mA。// 电压ADC原始值。// 电流ADC原始值。// 有功功率(W)// 电能(kWh)

corlin6688的博客 470

反季大清仓,最低仅需34.9元【最后一次】

马上就要2020年啦很多地方已经进入了寒冬的季节有的地方已经开启了下雪模式纷纷开始买冬天的商品棉衣、羽绒服、取暖器......但是.......今天我是来搞反季清仓的快来看看今天的反季清...

区块链大本营 1140

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

重磅!Dubbo 2.7.7 发布,FastJson 升级了!

击上方的终端研发部,右上角选择“设为星标”每日早9点半,技术文章准时送上公众号后台回复“学习”,获取作者独家秘制精品资料来源作者:局长原文链接:www.oschina.net/news/...

这个时代,作为程序员可能要学习小程序 904

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

fastjson版本查看_重磅!Dubbo 2.7.7 发布,FastJson 升级了!

击上方的终端研发部,右上角选择“设为星标”每日早9点半,技术文章准时送上公众号后台回复“学习”,获取作者独家秘制精品资料来源作者:局长原文链接:www.oschina.net/news/115796/dubbo-2-7-7-released正文Apache Dubbo 2.7.7 已发布,这是一款高性能、轻量级的开源 JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用、...

weixin_39629969的博客 629

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 做Python三年半了,一直认为Python就是写写脚本,直到我学习了这些公众号,发现还有更多作用...
下一篇: 女程序员真的太太太太难了!
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值