我一手重构了1.5万条旧线路。 那是我一生中最糟糕的两个星期



几个月前,我在室外工作。 在这里,您不需要对项目的宏伟目标充满热情和信念。 他们与团队一起简单地将我卖给了客户,在会议上,我关闭多少票很重要。 对于这样的地方,完美主义攻击是一件坏事,但我无法对它们采取任何措施。 我花了很多钱买了其中一个,陷入了地狱般的危机,度过了我一生中最糟糕的两个星期。

我的公司要我到莫斯科呆两个星期,到总公司去和团队一起工作。 我同意这一要求是合理的。 出发前几天,我又拿了一张票。 有必要为我们正在处理的十几个项目向SDK添加功能。 此SDK是无法逾越的遗产,没有人会碰到。 沼泽如此之多,以至于即使是精疲力尽的工程师也要迷信地受洗-如果一切都可行,它是如何工作的。 当我们需要修复某些问题或添加功能时,我们会小心翼翼地用另一个拐杖备份代码,而不会费劲地将其发送给CI和QA。

我打算做同样的事情。 任务的本质很简单。 SDK本身是一个非常聪明的二进制系统的包装,该二进制系统可以提升VPN。 她与我们的后端通信,接收各种配置,授权用户,获取VPN的国家/地区列表,等等。

我只需要向后端添加另一个请求,即可接收服务器列表。 它看起来非常简单-向公共API添加了一种方法,在其中请求了所需的URL,将模型拍了一下,进行了解析,然后将其放弃。 然后他教客户应用程序使用此请求,您已完成。 我在两天内完成了任务。

一个很大的错误。 没有简单的任务。 一只眼睛已经在莫斯科的酒吧里整理了一下,在那里我需要喝所有的啤酒,而另一只眼睛则看到了第一个问题。 我们不仅获得服务器列表,还使用其中一台服务器来建立VPN隧道。 以前,我们仅使用国家/地区。 但是一些天才认为将国家存储为字符串列表将是一个好主意。 当然,VPN节点的本质过于庞大,无法容纳在一条线上。

结果,SDK中出现了很多方法,它们采用字符串(国家代码)并在其中执行某些操作,现在所有这些方法都应采用国家代码或服务器对象-并在其中进行操作。 我们在SDK代码和应用程​​序中对国家/地区所做的所有工作,现在我们都需要与国家/地区和服务器一起进行。

当我理解这一点时,出于某种原因,我感到很高兴。 现在,任务范围使我可以稍微重构沼泽,到处都是我经常游泳的粪便。 我宣布了自己的愿望,现在我确定了-他们给了我一个表情,就好像他们以玛莎拉蒂的名义损害了一名残疾妇女一样。 我同意每周预算并开始工作。



出发前两天。 整个星期看起来像是无限的。 我决定,直到编写代码之前,我都会摇晃这个决定,一旦到达,我将迅速分散所有内容。

正常人出差时,他会提前买票,解决住房问题,警告妻子,并且通常会做对事情。 我是个近视白痴,他带着妻子和两个孩子被踩到莫斯科。 我不得不带我的妻子,因为我在出发前三个小时告诉了她这次旅行。 两个小时后-我刚开始用小型货车找司机,因为我的车坏了。 我在同一时间租了一套公寓。 带着尖叫的孩子和一个不满的妻子六个小时的旅行结束了,他们应该得到的-公寓正好比图片中的小两千倍。 最难闻的气味是草的气味。 接待我们的女仆说他们毒死了蟑螂(蟑螂!!!)。 我的妻子相信她,并告诉我的妻子,我将草的气味与蟑螂的毒药区分开,这不符合我的利益。

我来到办公室,他们给了我一台笔记本电脑。 在安装环境的半天时间里,我认识了每个人。 当所有内容下载并安装后,它开始工作。 可怕的举动引起的愤怒尚未消退。 我使用SDK打开了该项目,再次对自己严厉诅咒,然后想到:“什么鬼? 是的,这里所有带狗的地狱都必须扔掉并重做。”

我告诉了这位领导人,他当然回答:“我同意,伙计。” 一万五千行的项目,每行都是危害人类罪。 我打算在两周内修复它。 如果我有十个小时的旅行和三个孩子,我会建议带头吗? 在一周内发明一个专门用于该项目的新PL?

但是在我看来,如果我至少订购一些东西,对我来说将变得更加容易。 现在,我把这个政府钉在十字架上,我将尽其所能,我们将活下去。 我曾经读过有关如何进行深度重构的书。 关于如何绘制步骤,编写测试,仔细思考操作的想法很多,因此您对每一步都充满信心-该项目有效,没有任何问题。 书籍和最佳做法非常酷,但是我从别人的错误中吸取教训。 在我职业生涯的开始,我读了很多关于各种基本知识的文章,但是直到我需要扩展第一个项目的功能时,我才相信这些东西。

任何耙子的任务都是给你额头。 除非您的决定失败,否则您不会认为自己是失败的。

我开始不依靠实践来进行重构。 我从精神上将项目划分为多个逻辑部分。 这没有反映在他的文件结构中,所以我把这个文件结构付诸实践。 我创建了一个顶级父亲:在这里,我们在后面工作,在这里我们在使用VPN,在这里是助手,这里有例外。 现有的单元测试,我也拒绝了。 然后在我看来,govnokod没有生命权,但现在我知道我跳下飞机,没有带降落伞,因为降落伞违反了指示。

我开始将govnokod从旧爸爸转移到新爸爸,同时将其整理好。 没什么特别的,只是遵循良好的做法。 有一个描述用户模型的类,它具有所有可选属性,所有属性都有设置器。 将其转变为孩子的继承体系。 所有ridonly,全部通过构造函数。 这样一来,此类用户始终可以准确地知道自己手中拥有什么。 四百行上有一种政府方法-您按子方法使用。 您会看到一个文件具有一千个职责-您将它变成一个职责有千个文件。 有一个具有Initialize方法的类,创建该类后必须始终立即调用该方法-您应用“状态”模式

好的和坏的代码的概念非常模糊。 我将毕生学习区分它们。 但坦白讲,我现在看到的代码很糟糕。 查看并更正。 我尽量不要过多地使用顶级体系结构,并尽可能少地更改外部SDK API。



当您的妻子在世界上最糟糕的小屋里一个陌生的城市等着您,而要待上几个小时,这是一个糟糕的决定。她有两个年幼的孩子,她在压力下咆哮不休。 我徘徊了七个小时。 在工作的第一天,我坐在办公室里直到早上一个,然后从强度中复制了2%。

早晨,“在家”应有的丑闻在等待着我-低劣的速溶咖啡。 我在距办公室五分钟的地方租了一套公寓,但在这个可怕的城市,我感到非常陌生和恐惧,以至于前三天我乘出租车去上班。

办公室里的每个人都很高兴-人们晚上要去喝酒。 这些莫斯科人每天都这样做。 他们也给我打电话。 我答应尝试,尽管我本人可以肯定-没有选择。 他准备再次工作。

然后在我看来,我自己应该为所有家庭的事负责,因为我自己承担了一切。 最好找一间公寓,做好准备,预见家庭和生活中的所有问题。 一堆本来不可能的问题。 看着代码,我想-这就是一半措施的结果。

他很快决定我昨天的做法太妥协了。 如果重做,仅此而已。 我不再局限于重命名和分割。 我要处理的每个文件都经过仔细分析。 我从事这个项目已经有一段时间了,我很了解企业在这里想要什么以及我们的代码应该做什么。

但是在这里,我开始不断遇到我不理解的代码-它解决了什么问题以及为什么要编写它。 我决定-如果我不明白为什么需要代码,那么就不需要代码。 我很高兴开始将这种数字垃圾发送到黑社会。

这种方法引起了新的问题。 项目公共API错误。 有许多带有荒谬签名的方法(例如,一个方法采用一个字符串,而一个对象包含相同的字符串)。 许多方法都有白痴的名字。 通常,如果将此SDK与它所使用的API结合使用,则可以用上万种方法破坏该应用程序。

至此,我已经走得足够远了。 该项目没有进行,也没有机会在未来几天内进行。 我所做的所有更改,我只能在工作结束时进行检查。 既然我已经做了很多更改,那为什么不更改公共API呢? 好吧,我足够聪明,可以从SDK和应用程序中复制存储库,因此我可以在这些副本中复制API更改并查找错误。 毕竟,我什至无法编译SDK的主版本。

问题立即开始。 更改了一种方法的签名? 捕获应用程序中的200多个编译时间错误。 由于签名错误,因此将错误的参数传递给方法,并且应用程序正常工作。 同时,您在四个IDE窗口中工作。 在我更改了这三种方法并解决了所有错误之后,我认为-由于工作已经完成,仅更改部分愚蠢的API是愚蠢的-我们需要进一步重做。 而且他更深入地参与了这一过程。



我经常不得不做出决定,大多数是符合道德的。 所以我知道应该如何工作,现在我看到了应该执行的代码。 我读了一下,明白他没有。 但是此代码已发布,已通过质量检查。 谁是傻瓜? 我该如何承担这项责任? 起初,我很长时间考虑了每个这样的案例,并咨询了领导和团队。 但是花了太多时间。

我意识到我工作缓慢,因为我害怕打破某些东西,试图找出某个地方要小心。 然后我对自己说:“我比写这篇文章的人更聪明,我知道需要做些什么,我有一项重构的任务和预算,而且我拥有一切的权利。” imp弱者会理解和担心,一个人知道自己想要什么,并且不会问太多问题。

在某个时候,我进入了一个机器人的奇怪状态,该机器人有条不紊地用一个代码处理另一个文件。 没有检查任何东西,毫无疑问。 我看到一个错误的代码-更改。 该链条提出了新的问题区域,并对其进行了修复。 在每一个中,我都用一些可以容忍的东西代替了govnokod。

看起来像国际象棋中的闪电战。 您在玩游戏时,最重要的事情就是考虑所有可能的选择,但是时间太短,甚至无法考虑应该考虑哪些选择。 我总是失败。 第二天,我做了很多事情。 这只是您无法验证的代码-这不是代码。 我知道这一点。



一天晚上,我记得我曾答应过我的妻子去宜家。 我们住的公寓很糟糕,我妻子想买任何舒适的垃圾。 我整天写代码,我的大脑精疲力尽,但是我不得不走了。 放汽车共享,最近的汽车离二十分钟路程。 我叫出租车去了汽车。 想象一下,典型的莫斯科死胡同被汽车挡在了眼前。 最后,雷诺·卡普特(Renault Kaptur)在等我。 在击败了Delimobile落后的UI之后,我得以打开这个存储桶。 等待我的是一个惊喜-自动变速箱。 我从没开过机器,但我以为我可以处理。 如果要前进,则需要将手柄向前移动,如果要后退,则需要向后移动。 不行 我意识到在仍然可以挽救局势的那一刻,汽车并没有完全行驶。

踩下刹车。 自然,脚错了,因为在笨拙的机器上只有两个踏板,而我的大脑却误解了一切。 混蛋,汽车起身了。 与梅赛德斯S级轿车相距2毫米。

我莫名其妙地从死胡同中爬出来,意识到世界上所有的汽车都在我身边,但是我不知道去哪里或怎么去。 我开车去“家”,带我的妻子,午夜开车穿过地球上最可怕的城市,错过了十几个转弯,在宜家留下了一笔财富。

我们凌晨四点回来,我的眼睛一见到床就闭上了脑。



早上八点我又在工作。 在那里,每个人都再次高兴,讨论他们无法联系的莫斯科事务和酒吧。 我又有了SDK。 沉重的头,我浏览了所做的更改。 一切都非常糟糕。 明天集会一直在进行,我还需要三百年才能完成。

我有一个很好的技能-当我拿到一张大票时,我总是将其分解成几个小票。 因此,我的工作流程。 一张票,一两次提交,一个拉请求。 因此,原则上,我无法在编码过程中将任务分解为几个提交-我通常不需要这样做。 但是压力使我失望了,技能失败了。 在此过程中,我将一个小任务变成了一个巨大的任务,但是我开始以处理一个小任务的方式进行工作。 没有系统,愚蠢的我发现问题所在,就在那里解决了。 他没有将流程划分为合理的步骤,而只是在去年六月立即抓住了这一机会。

您无法将其退回。 主要问题仍然存在-我无法构建和运行整个解决方案,也不知道它将如何工作。 真是太可怕了,在最后一天,我查看了差异,意识到我已经重写了几乎整个项目。 真是可怕。



一切总是在最后一天下滑。 商务旅行也结束了,我的重构时间也延长了。 我的妻子打来电话,说虽然我在深夜同意,但我们正在下午一点被驱逐。 自然,这意味着我无法完成最后一天。

伴随着三加仑的冷汗,当我开始执行这项任务,计划进行重构,同意出差,带孩子,脱下两周的藏身之物时,我想到了什么-我是全世界最重要的白痴。 精神科医生理清我的动机是值得的,但我决定一路走下去。 要么惩罚自己,要么出于某种非理性的信念,认为我所做的一切正确。

我用燃烧的屁股在一个小时内冻结了所有内容,启动了CI并将其丢弃。 我一直在脑海中滚动浏览代码,我绝对确定没有任何效果。 更改太多,将有一百个错误,我们将拒绝这种重构。

当我回到家时,新闻正等着我-该项目正在运作。 Lead纠正了一些小问题,我的更改通过了自动测试,现在它们已经成功地进行了手动测试。 我不相信。 我破坏了家用手推车的代码,收集并手动检查了所有我不信任的脚本。 奏效了。 它的工作!

我为自己感到骄傲。 代码库的质量已经增长了很多倍,出现了一些功能,我排除了许多测试人员尚未设法解决的错误。 Liba可以舒适地使用,而且我证明自己很专业。



狂热和自我牺牲的狂热-很多天真的傻瓜。 我很高兴用这个故事证明与我相反。 但是回来后的几天,更多的消息在等着我。

客户决定放弃该项目。 结果,近一百名员工(整个公司的一半)正在“等待一个新项目”。 考虑-边缘失业。 并且首先将此类问题的远程人员削减。 有人告诉我永久搬到莫斯科,然后再转到另一个项目。 否则我们会解雇你。

我问旧项目会怎样。

在这样的时刻,人们变得非常痛苦。 不再需要奉承,点缀和企业道德。 有人告诉我,全世界任何人都不再需要此代码,而是发送到历史垃圾箱。 产品本身将使用很长时间,但没人会支持该代码库。 所有这些都是代码的质量和可读性,可伸缩性,易用性,明确的行为-一切都是徒劳的。

我听着并明白,我可以做一个特色,然后走进酒吧。 但是我因为没有一个别人需要的良好代码库而在晚上坐在床上,没有睡觉,遭受了丑闻。 热情是骗人的。 您说即使没有收获也准备工作。 但是,当他们告诉您最高的免费性并不能带来好处时,由于某种原因,它会杀死您。 您希望随着一时冲动而改变一切普遍的错误。

我想我从一开始就完全理解所有内容。 我只是不想成为一个务实的人。

因此,我说过,他们可以将我开除,并把他们的母亲带到肮脏的莫斯科,这样他们的肥臀就可以将无橡胶的东西撕成十亿个小碎片。 他有礼貌地写了这个,然后呆在家里。 世界上仅需要制作足够的塔萨。

Source: https://habr.com/ru/post/zh-CN471628/


All Articles