首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么IT软件项目的代码合并就是一个“噩梦”?

2011年,LinkedIn上市了,估值在100亿美元。它的会员在以每秒2个的速度增长,但它的交付过程存在很大问题,导致公司几乎停滞不前。这是在几乎所有超速发展的公司中都存在的普遍问题,但迄今为止,很少公司有足够的勇气把情况说出来。我们使用了一个火车发布模型。在这个模型中,每两周,一列“火车”就会带着新的代码离开车站,投入生产。为了搭上火车,你需要让代码进入发布分支。那时,团队在独立的功能分支上进行自己的任务,各个团队间在数周或数月的时间里是完全隔离工作的。

接着,在安排的发布日期前三周,所有功能分支的开发都会暂停下来,十几个团队会尝试将修改合并到发布分支中。合并的过程就是一个噩梦,开发人员几个月来编码所依据的假设已经不再有效。你所使用的类已不复存在,数据库架构也发生了变化,在几十个地方使用的API已经被重构了,UI看起来也完全不同,你认为最终已经从代码库中拿掉的JavaScript库现在又被用在十个新的地方。这些冲突要花好多天去解决,而在完成之后,你又意识到合并过程中有这么多的代码已经改变了,自己在功能分支上所做的大部分测试也变得没有价值了。

我们的测试还远远不够。我们进行了测试,但只对一部分代码进行了测试,仍然存在两个问题。第一,这些测试太慢了,真的很慢。构建的过程——编译、运行测试和封装,所花的时间是以10小时来计的。第二,这些测试并不可靠。其中有许多测试很诡异,会间歇出现失败。所以每次合并之后,大致每天都要构建一次,看看是否能正常工作。我们面对的是几十个测试失败,无从了解这些失败是由某个功能分支中的bug、有问题的合并,还是仅仅是测试出现莫名其妙的情况引起的。

假设我们能够使构建过程变得稳定,接下来的挑战就是整理汇集出部署计划。这是一个手工维护的wiki页面,它会列出发布时需要部署的所有服务,以及这些服务要按照什么顺序部署,需要进行什么配置。举例来说,假设你在功能分支上修改了B服务,为它添加了一个新的端点(endpoint),又修改了A服务调用这个新的端点,你就必须记住要把A和B这两个服务都添加到部署计划中,并且要指明B必须先行部署,这样新的端点才可供A使用。

如果你需要修改B服务的配置,比如增加其线程池的大小或者调整垃圾回收设置,也必须记得把这些修改放到部署计划中,因为所有的配置都是手工管理的。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200612A0SXUU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券