Rebornix

##每一篇博客的开始,都是一个悲剧 从五月份开始写JS,到现在已经有九个月了,前半年因为是刚接触到前端这个领域,成长的速度特别快。到近期仿佛是遇到了一些瓶颈,代码质量一直上不去。为了不让我的代码祸害我们的线上产品,我决定封码几日,换了几个prototype来做做,毕竟proof of concept对有没有八阿哥不太讲究。

不料前几日同事火急火燎来找我,说有一个我负责的功能突然不work了,完完全全100%不work,而且是live site issue,要立马修好。

当时我整个人都不好了,这都什么世界啊,惹不起也就算了,躲我都躲不起啊,不checkin代码都能把production搞挂了这种灵异事件我特么还是第一次见。不行,我一定要还自己清白。

##Trouble shooting 首先,要确定是不是别人改动了我的代码造成的regression,我绝不能错过任何爆别人的机会。查阅commit history一番之后发现,这段代码已经三个月没有改过了,希望破灭了。接着我打开编辑器查看这段代码,我发现当时为了实现一些two way binding,我使用了一个第三方的library叫做ui-ace。这引起了我的注意,会不会这个包发生了什么问题呢?

我到github上看了下ui-ace的release notes,果不其然,ui-ace在这几日刚刚发布了新版本。把最近几次的commit都阅读了一遍之后,我发现了问题所在。ui-ace中有一段旧代码逻辑存在一点问题,由于掩盖在层层API之下,我在使用这个功能的时候,把它所有的行为都当成了feature(没错,一个原本默默无闻的bug成功地把自己伪装成了feature,一次精彩的cosplay)。而最近ui-ace的维护者发现了这个问题,然后火速把它修掉了。也就是说,原来的feature,没了。我的代码应声倒地。

故事到这里水落石出。不过我估计肯定有朋友会疑问,人家ui-ace升级,跟你们有几毛钱关系啊,您们引用了人家的代码还不让人家升级,什么人啊这是?

其实这个问题,根本错误确实是在我们。我们在引用第三方library时,使用了bower来管理library的版本和升级。而我们的配置文件bower.json是长酱紫的:

"dependencies": {
    "angular": "~1.3.0",
    "angular-bootstrap": "~0.10.0",
    "angular-cookies": "~1.3.0",
    "angular-file-upload": "~1.1.5",
    "angular-mocks": "~1.3.0",
    "angular-sanitize": "~1.3.0",
    "angular-ui-ace": "~0.1.1"
    ...
}

大家看,我们对Angular的版本要求是~1.3.0,翻译成人话就是使用1.3.x的Angular代码,并且保持自动更新。所以每次我们开发、测试、部署时,bower都会帮我们check一下Angular有没有1.3下的小版本更新,有的话,自动更新Angular的代码。多么美妙的自动化啊。

同样的,我们对ui-ace的期待是~0.1.1,任何0.1.x的版本我们都能接受。这几天刚好遇上我们重新铺production,铺的过程中,bower帮我们更新了ui-ace的代码,从而导致我的代码break了。

##如何优雅地维护开源软件 如果我更加小心地书写我的bower配置文件,显然这次live site issue是能够避免的(使用固定的版本号,而不是让bower自动更新)。但是,这次的问题,也让我对ui-ace产生了一些不信任感。如果我以后自己来维护开源项目,我一定会努力避免给我的用户们造成这样的困扰。

方法就是:

版本升级有规则

Angular在版本更新的过程中,保证major.minor.build.revision中,buildrevision的升级不会存在任何的breaking change。所有功能性的大变化都会在major.minor中出现。这也就是为什么我们放心地使用~1.3.0来标志Angular的版本。

我在上一篇文章Angular 一个值得当心的bug中提到的bug,在被确诊之后,第一时间放到了angular 1.4 candidate中,就是因为修掉这个bug,是一个breaking change。插句题外话,在接近30个1.4 candidate中,这个issue将会随1.4的正式release一起fix掉,详情请见Angular 1.4 Planning)。

如果你在维护一个开源软件,不妨告诉你的用户和其他contributor,什么样的版本升级会存在breaking change;什么样的版本升级,只是增加新的feature或者修掉一些无关痛痒的bug。这样的姿势更优雅。



blog comments powered by Disqus

Published

24 January 2015

Category

Frontend