上海自来水来自海上,十年程序员的劝诫:千万不要重写代码!,李光洙

频道:体育世界 日期: 浏览:265

对重写代码说不。

作者 | Roman Luzgin

译者 | 苏本如

责编 | 屠敏

出品 | CSDN(ID:CSDNNews)

以下为译文:

重写代码耗费了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

开发人员总是倾向于扔掉旧代码然后从头开端,他们有这样做的理由。由于他们以为旧代前夫我拒婚码都是无用并且杂乱的。可是这仅仅想当然的理由。当咱们企图找出背面的真实原因时,咱们会发现:

咱们或许错了!

旧代码对咱们来说楚剧送友或许看起来很杂乱,有必要从头重写的原因并不是由于代码自身,而是由于一个重要的,根本的编程规律:

读代码比写代码难。

这解说了代码重用困huoyrz难的原因,也解说了为什么咱们以为旧代码象头发相同杂乱。由于这个原因,当咱们阅览另一个开发人员的代码时,咱们的潜意识会不断对着咱们耳语“丢掉它,从头开端”。

像全部开发人员相同,咱们也落入了这个圈套。仅仅读一遍咱们的杂乱的代码就满意让咱们下决心考虑从头重写了。

在一系列的会议之后,即便CTO对重写代码有冲突(他是对的),他终究仍是被压服了,咱们决议从头重写代码。

可是,重写代码的决议并没有继续太久…

那是一个周末,周日,我边喝早茶边读一些推送文章。就像我的推送知道该向我展现什么相同,我读到了那篇最著名的关于重写代码的文章,便是Joel Spolsky写的Netscape 的代码重写故事(https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/)。

读完那篇文章后,我立马共享给了AntiMalware开发团队,包含CT上海自来水来自海上,十年程序员的劝诫:千万不要重写代码!,李光洙O。

然后咱们开端了新的谈论。

原本压服CTO作出代码重写的决议就现已很难了。他在读完那篇文章后立刻改动了主见,他决议间断代码重写。这让其他团队成员生气了,他们冲我大喊大叫:

“你为什么给他看那篇文章?咱们都现已压服他了。这个产品有必要从头重写,这是仅有的处理方案。”

咱们的榜首次重写代码的测验到此完毕了。关于这个论题的谈论也中止了。咱们的CTO信任咱们能够办理好这个糟糕的代码,并有才干在它之上发布新版别,直到严格的实践击倒咱们中止。

一年没有任何更新…

真的,这不是打趣。真的一年没有更新了!

“为什么没有更新?“

“自前次更新到现在现已有好几个月过去了。”

每天,咱们都得面对这些来自用户的负面谈论。作为一家小公司,咱们需求办理的产品太多了,并且,咱们又进入了企业商场,这些加在一起,使得咱们陷入了这样的窘境。

把全部这些结合起来,你就会得出这样的定论:咱们忘记了咱们的用户。

回想一下,咱们不想发布新的版别,由于咱们不想失掉用户。

但实践应该是相反的:假如咱们不发布新的更新,咱们肯定会失掉用户,而咱们现已一年半没有给他们任何新版别了。

在被实践打了一巴掌之后,咱们决议回头。对咱们来说,除了重写代码别无它途。咱们做到了。

当时

“2018年12月17日,星期一,21:40。测验的电子邮件预备好了,行将发送给咱们的内部测验组。”

经过12个月精疲力竭的作业,代码重写总算竣工。咱们预备了榜首个测验版别阐明,就像前次这个产品面市的榜首天相同。

咱们又回来了…

这个产品的重写版别仍处于测验阶段。测验现已快一个月了。咱们正在修正过错,倾听用户的定见,检查用户反应……全部就像4年前相同……

可是在这12个绵长的月中,咱们错失了什么呢?假如不是重写,咱们会做出什么新产品?!

许多问题能够在这里提出来。但我知道咱们只需重写一条路,咱们看不到任何其他的处理方案。

假如你也落入了这个圈套,开端考虑“我是否应该从头开端重写代码”,那么在开端代码重写的榜首步之前,就考虑自己发问下面的问题,每个开发人员都应该问问自己:

你预备好扔掉关于旧代码的全部常识了吗?

这个问题很重要!请诚实地答复:你真的预备好扔掉全部的常识,全部搜集到的过错和修正,年复一年的编码成果吗?扔掉旧代码圣途风流并从头开端,真的是你所希望的上海自来水来自海上,十年程序员的劝诫:千万不要重写代码!,李光洙吗?当你从这个视点来审视代码重写的决议,你会发觉很苦楚,不是吗?全部那些企图修补bug的不眠之夜都会在你眼前闪过。信任我,由于我有切身体会。

你有必要和许多用户攀谈才干找到导致你的软件不能正常作业的问题所在,然后你要在你的软件中定位这个过错,重现这个问题,然后找到处理办法,然后……等等。

你能保证你会做的比榜首次更好吗?

这点很重要:当你从头开端的时分,没有人能保证你会比榜首次做的更好。

由于你挑选扔掉关于这个软件的全部常识和现已搜集的过错和修正,所以相同的过错很或许再次出现在你的新代码里。

或许代码重写团队现已不是榜首个版别的开发团队。所以你实践上没有“更多的经历”。你会犯下旧版别中的大部分的的过错,并带来一些新过错,而这些新过错在旧版别中并诊组词不存在。

假如你没有很好地方案重写作业,你或许面对新版别比原始版别更糟的危险。可是,已然作出了重写的决议,你就要承当这个危险,这个危险或许导致你失掉你的客户。

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

你知道需werid要多少时刻来重写你的软件吗?

代码重写牵扯到许多的精力、方案和预备作业。你有必要把每项使命方案好,可是一个接一个地冲刺。你有必要切当地知道完结这个苦楚的进程的终究期限。没人知道你会不会错失这个终究期限。有很大的或许你不能按时完结这个郭台铭儿子进程。

你不得不在数月或数年时刻内只能交给旧版别给用户,这将置你于极端危险的地步。你彻底无法进行任何战略改动或对商场所需的新功用作出反应,由于你没有任何新代码能够交给。上海自来水来自海上,十年程序员的劝诫:千万不要重写代码!,李光洙

你的客户或许会扔掉你,由于你除了不断地供给原封不动地旧版别外,无法给他们任何新的东西。

这些你都考虑到了吗?

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

从头开端重写一个体系,本质上便是供认作为一个规划师的失利。它其实是在声明,“咱们未能规划一个可保护的体系,因而有必要从头从头开端。”

——摘自 Max Kanat-Alexander的 Code Simplicity

像其他规划师相同,咱们供认咱们未能规划好咱们的软件,咱们从这个精疲力尽的进程中学到了许多东西。在这里,我共享一些咱们从中取得的经历教训。

代码重写是开发人员的一种幻觉,大多数状况下它不是处理方案。

当你的代码遇到问题时,精确地确诊问题很重要。像每个开发人员相同,你开端的主意不该该是代码重写。代码重写仅仅一种幻觉。由于你在阅览他人的代码的时分,你会以为假如你从头重写代码,你能做得更好。在这种状况下,请始兴麦集商城终紧记那个重要的,根本的编程规律。

在决议重写代码前,考虑代码重构

有针对性的重写关于处理代码库中最严峻的过错很有用。假如能够约束规模并处理大部分问题,就不要进行全体重写。例如,软件的加载速度十分慢。但这只影响到项目的一小部分。经过小心肠移动代码、重构和更改接口,这个问题能够一次性处理。你不用重写全部代码。

代码重写是一条比预期耗时更长、更困难、更简略失利的路。

通知咱们一个开发人员一般在错失终究期限后才意识到的实践:全部都比幻想的要花更长的时刻。代码重写本钱的估量一般很失望,可是实践的成挠男生本简直总是比你幻想的更高,花费的时刻也更长。由于总是会有想不到的杂乱问题要处理,这些都会使重写进程变得愈加困难和苦楚。终究,你很或许不得不承受失利的成果。

保证重写后的产品能够更好地处理用户的问题,至少相同,不能承受更差。

重写对用户没有直接的影响/优点。由于用户不关心代码,他们只想处理自己的问题,仅此而已。在用户看来,能够处理他们问题的产品便是好产品。不然,他们不会用它。用户不关心你的代码重写决议,所以重写后版别有必要至少和旧版别相同有效地处理他们的问题。

坚持对现有产品的保护和支撑。

在咱们的事例中,咱们有一年的时刻没有向用户供给任何软件更新。这关于咱们今日日子的国际来说是太长了。虽然咱们的产品依然满意优异,可是没有更新用户肯定会诉苦。当程序员重写代码时,永久不要中止保护当时正在运用的体系。在重写进程中,旧的代码依然需求保护,小的更新和过错修正需求及时供给给用户。不然,你将面对失掉用户的危险。

让用户赶快参加规划进程

保证定时向用户展现最新开展,以便他们能够协助你捕获最严峻的过错。赶快与用户碰头是很重要的。他们的反应将协助您依据他们的需求规划新产品。不要完结任何不用要的功用,这将防止你的代码库过于杂乱化。

坚持产品团队同步步调一致

一个产品团队不仅仅包含编程部队,营销、支撑、编程、规划……全部团队需求协力作业。经过宝物鱼翻译定时陈述重写开展状况来保证整个团队步调一致。

在咱们的事例中,咱们遇到了许多这样的问题。例如,营销团队预备产品测验活动时,他们有必要精确了解产品方面的状况,以便让客户为行将到来的产品改动做好预备。可是,有时咱们在没有通知他们的状况下做了一些更改。这害得他们有必要从头开端预备他们的测验活动。记住:不要糟蹋任何人的时刻。

不要对产品苏沐然作严重更改。

了解你的产品的弱项和强项,这一点很重要。牢记不要改动产品的强项,也即用户喜欢的方面。假如用户对用户界面满意,不要对用户界面作大改动。只做最小的更改和小的用户体会改善。当您用重写后的版别替换现有版别时,保证你的用户不会被新的巨大改变所困扰。有许多状况用户扔掉了新版别,由于他们找上海自来水来自海上,十年程序员的劝诫:千万不要重写代码!,李光洙不到曾经版别供给的相同的功用。不要让相同的作业发作在你身上。

不要让你的产品只依赖于一个开发者。

在咱们的事例中,CTO是担任开发咱们软件的首席开发人员。由于他的态度,咱们的产品开发开展缓慢。即便是很小的改变也需求几个星期,有时乃至几个月。我想表达的要害点是坚持一向更新,永久不要干女中止。

版别搬迁/替换要按部就班。

当您承认新版别现已预备好,开端用新版别替换旧版别时。要一步一步,按部就班。

首要,从一个小型的内部测验组开端,将您的产品发送到该组。搜集他们的反应和溃散陈述,修正过错,迭代新版别,然后重复这个进程,直到你承认你的产品现已预备好揭露测验。

进入揭露测验后,用户的反应是你最等待的。你的榜首个方针应该是保证您的产品能够处理用户的问题。当你承认新版别供给的功用与旧版别相同或许更好时,就能够进行替换了。这时分开端为新用户发布新版别,并将现有用户搬迁到新版别。

以上这些都是我从代码重写进程中汲取的要害经历教训。代码重写简直永久都不该该是处理方案,重构才是更好的挑选。强烈主张选用代码重构按部就班处理问题。这样做的危险更低,客户也更满意。

什么时分重写代码是适宜的挑选

可是,有时分重写代码也是适宜的处理方案。下面我我列出了重写代码的几种景象:

切换到另一种言语或渠道:

当一种言语变得如此陈旧,导致你很难找到开发人员,或许有必要花大价钱才干找届时。

现有的代码库变得不行保护(像咱们的景象):

怎么承认你的代码变得不行保护呢?这个上海自来水来自海上,十年程序员的劝诫:千万不要重写代码!,李光洙很难,可是假如你发现即便是很小的更改也很难完结,或许新的更新比正常需求花费的时刻多得多,或许任何新的更改都会影响到软件的其他部分并导致新的过错,那么你能够承认你的代码变得不行保护了。

有满意的资源能够一起保护现有体系和规划新体系:

重写代码的时分,永久不要中止保护当时正在运用的体系。只需体系在运用中,有必要一向对其供给保护。记住,你的个人注意力也是一种有必要考虑的资源,假如你计划一起为新体系和旧体系做规划作业,你要考虑是否每天有满意的时刻。

开发人员变成了软件开发的瓶颈(像咱们的景象):

这不该该出现在重写代码的原因列表中。由于你能够随时在团队中分配开发人员,也能够雇佣新的开发人员来处理瓶颈问题。

可是,就像咱们的景象相同,有时你或许需求将它作为代码重写的一个原因。由于咱们的软件运用的是旧技能,而CTO是仅有担任开发它的人。咱们很难找到一个新的开发人员,由于这个渠道时代太久。即便咱们能找到一个新身份证大全号码游戏用人,对咱们来说也太贵重。因而。我仍是把它作为代码重写的景象之一,列在这里。

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

跟着时刻的推移,一个软件的代码会变得越来越杂乱,保护也会变得越来越贵重。这是由于为了快速推出修正补丁,初始架构有时会被献身掉。并且,懂得旧技能的开发人员越来越少,人员本钱也越来越高。一起,很难找到合适旧的应用程序运转的硬件、操作体系和结构。此外,跟着事务的开展,旧的体系很或许无法满意新的事务需求。

所以,你杭州气候24小时有必要在旧体系昂扬的保护本钱,新体系的潜在优点,以及从头重写的本钱之间作一个权衡。

假如你的景象契合上述一点或多点,代码重写或许是你能承受的选项。不然,正确的做法是经过一系列简略的过程改善体系的规划,在不重写代码的状况下处理处理现有体系的杂乱性。

从头重写代码或许是你犯的最大过错,但相同地,不重写代码也或许导致相同的成果。我的主张是优先考虑重构而不是重写。

有些开发人员深信全部体系终究都有必要重写。记住这并非总是对的。规划一个不需求扔掉的体系是或许的。总有软件规划师会通知你,“无论怎么,总有一天咱们会丢掉全部的东西”。可是,假如软件是从一开端就规划得很好,并且一向有很好的保护,为什么它会被扔掉呢?

原文:https://medium.freecodecamp.org/lessons-learned-in-my重生之我国战神-10-years-as-a-developer-3d33c8702828

本文为 CSDN 翻译,如需转载,请注明来历出处。作者独立观念,不代表 CSDN 态度。