2016年冬,我在一家创虻公司的小团队里搞软件开辟。彼时我们有一位真实的企业客户,且软件的第一版也已宣布。开辟按进度落成,在宣布时我欣喜若狂,也异常骄傲,看着体系办事于天天几百万的自力用户,并发送出数切切条短信真是太令人知足了。到了第二年夏天,公司拿到了真实收入,我的职位变成了开辟主管,公司又招了些新人,正待蓬勃成长,一切都很好梦。然后我们做了一个巨大年夜的决定计划掉误:决定重写软件——大年夜头开端。
为什愦我们认为有须要大年夜头重写软件呢?
在第一次编写体系代码时,我们的时光表十分紧急,必须与时光竞走,在筹划时光内赶完进度。是以无论是设计评论辩论,照样审查会议都没花太长时光——我们没有时光浪费在这膳绫擎——只能促完成一个功能、快速测试,然后赶着去做下一?。我们与其余公司共享办公空间,我还记得其他公司的软件开辟都邑花很长时光做设计、评论辩论架构,再花上数周评论辩论设计模型。
除了设计仓促,本来的体系写得不差,总体来说架构也不错。个中有些意大年夜利面条式的代码,是公司之前做概念验证时留下的,因为这些代码能用,再加上工期重要,当时我们没有去碰。但后来我们不推敲履行优化改进,却决定要大年夜头重写代码的原因在于:
- 老旧代码很糟糕,很难保护;“单一整体式的java架构”对我们的将来成长晦气,无法支撑有6切切移动用户以及多站点安排的大年夜型运行商;我想要测验测验炫酷的新技巧,比如Apache Cassandra、虚拟化技巧、二进制协定、SOA等等。
结不雅很不幸:我们说服了全公司以及董事会,实现了欲望。
Joel Spolsky强烈否决重写代码,他建议大年夜家都不要如许做。不过我不是特别认同:有时刻慢慢优化与重构异常艰苦,独一读懂代码的方法就是重写。此外软件开辟人员爱好编写代码,创造新器械——浏览别人写的代码,测验测验懂得他们的代码与“思维抽象”会很无聊。不过,优良的法度榜样员也是优良的保护者。
代码重写之旅
正式的开辟时光是大年夜2016年春天开端的,我们将2017年1月末设定为宣布时光。因为筹划太过宏大年夜,我们须要更多的人,于是在印度聘请了参谋与几个长途开辟者。然则,我们没有充分预期到保护本来体系、进行新的开辟工作与懂得客户需求这些并行起来的工作量。
还记得我在文┞仿最开端说过,我们有一个真实客户么?这位客户是呐绫抢最大年夜的移动运营商之一。在我们开辟的体系投入应用后,他们开端对变革和新功能提出请求,是以我们只能持续更新本来的体系。然则,因为这个体系将会被放弃,在更新时我们总有些敷衍了事,尽可能找饰辞拒绝了客户很多的新功能需求。结不雅导致了工期迁延,没能在原定的deadline完成进度。事实上,我们的进度迁延了整整8个月。
然则客户拒绝了进级的请求:本来的体系已经获得了广泛应用,他们的用户已经开端依附旧系统了棘他们完全不想冒风险。长话短说,浪费了几个月之后我们见效甚微。该项目正式宣布掉败。
何时须要重写代码
如不雅你想要重写代码,必定要出于精确的来由,并有着合适的筹划。比如:
有时刻在宣布新版良久之后,老旧代码仍需保护,保护两个版本的代码须要消费大年夜量工作,在开端重写前请根据项目范围评估所需的时光与资本。
不过我们照样先说说结不雅吧:当项目终于落成时,新体系看起来异常棒,知足所有需求。我们做了负载测试,结不雅显示新体系能很轻易地支撑跨越1亿的用户,设备集中,查看图表的UI对象也很美不雅,是时刻放弃旧体系,改换新系统了……
想想其他掉去的机会,并比较义务的优先级。
重写大年夜型体系比小型体系风险更高,推敲一下可否慢慢重写。我们同时履行了以下几项工作:切换到新的数据库、应用“SOA”架构、改换为二进制协定,其实本可以慢慢履行这些改换。
推敲开辟者的成见。在开辟者想要进修新技巧或新说话的时刻,他们会想要应用这些来重写某些代码。不过我不否决如许做,这也是优胜情况与文化的标记,但应当将它与风险和机会做比较。
Michael Meadows对何时有须要进行“大年夜型”重写竽暌剐着很好的看法:
技巧上
组件的耦合度很高,无法零丁对某个组件进行修改。从新设计单个组件会导致连续串的变更,不仅会影响到相邻的组件,甚至借居影响到所有的组件。技巧客栈太过复杂,将来状况设计须要变革很多的基本架构。出于这个原因履行完全重写十分须要,慢慢从新设计在这种情况下没有优势。从新设计单个组件无论若何都邑导致对该组件的重写,在现有设计中没有可以插入新功能的处所。这种情况下慢慢从新设计没有优势。
政策上
赞助商无法懂得慢慢从新设计须要对项目进行经久投入。弗成避免的是:大年夜多半公司对于在慢慢从新设计上持续消费预算没有兴趣。在完全重写代码时,这种现象也很难避免,但赞助商更愿意持续投入,因为他们不想用着半成品的新体系与部分过时的旧体系。体系用户更习惯应用“本来的界面”:在这种情况下,政策上不会许可修改体系的重要部分(前端)。但如不雅完全大年夜头开端重写,则会绕过这个问题。用户还会保持应用“雷同的界面”,但此次你还击的来由更为充分。要记得:慢慢从新设计的总成本老是要高于完全重写代码,但一般来说对企业的影响更小一些。在我看来,如不雅重写来由充分,公司又有超等优良的开辟者,那么就开工吧。
放弃正在开辟的项目很危险:浪费大年夜量的时光和金钱反复实现已有功能,同时还会放弃实现新功能的机会,有可能激愤客户并导致工作筹划推迟。如不雅你正在重写代码,那是你的权力,不过请确保这么做的来由精确,同时懂得风险也做了相干筹划。
推荐阅读
无现金社会,在本年成为一个热词。比来,付出宝和微信付出分别推出了“无现金城市周”和“无现金日”晃荡,让它变得如日中天。这是腾讯和阿里两家互联网公司全力争夺>>>详细阅读
本文标题:代码重构的那些坑和实战经验
地址:http://www.17bianji.com/lsqh/38422.html
1/2 1