初次读Paul M.Duvall的《持续集成软件质量改进和风险降低之道》(以下简称《持续集成》)是在大约一年前,刚涉足敏捷开发的时候。那时候对敏捷、对持续集成还是一知半解的状态--当然,现在也未必了了--通过对全文的阅读,也只是对敏捷开发有了大致的印象和了解,或者说,觉得敏捷和持续集成在国内是更合适的项目开发模式。通过这一年多的实践和逐步理解,再读此书,对CI(持续集成)、对自动化有了更深入的认识。后文我用本书中每一章节的引言来展开这本书的导读,大家仅做了解,如有兴趣深入讨论,可以联系我。

    
    首先,要掌握基本功。
                    ----Larry Bird
     
    Larry Bird是NBA赫赫有名的球星,这句话不仅对于持续集成,对所有知识的学习都适用;这便是掌握基本功。在这里这个基本功就是了解CI,了解CI在项目过程中的作用。总结起来,在我的理解里,CI是一种实践,可以让团队在持续的基础上收到反馈并进行改进,不必等到开发周期后期才寻找和修复缺陷。通俗一点儿说,就是指对于开发人员的每一次代码提交,都自动地把Repository中所有代码Check out到一个空目录,并且自动运行所有Test Case。 
 
    假定是所有麻烦之母
                    ---Wethern's Law of Suspended Judgment
 
    假定是软件开发中最重要的问题之一。项目中我们假定成立的所有条件最终都有可能引发项目中各种大问题。例如我们假定一个方法将得到正确的调用参数,那么这个方法就有可能失败。如果出现了一个问题,我们假定服务器没问题、配置文件没问题,那么可能就会花费大量时间来排查代码中本不存在的问题。所以想当然的假定,绝对是开发中的大忌。
    而CI在每次版本控制系统发生变更时就执行构建,这样有助于减少项目中的假定。这是基础,而我们需要想的将更多。
 
    品质意味着在没人看的时候也把事情做对。
                     ---Henry Ford
 
    没有不出现问题的项目,当发现问题时排查问题、定位问题的效率地下往往掣肘着项目的健康发展。CI提供的最大优势就在这里。我们可以通过最后一次构建清晰的发现很多关键问题,例如软件完成度,单元测试覆盖率等等,同样也可以缓解一些软件开发中经常遇到的风险:如缺乏项目可见性,软件品质低下或者很晚才能发现缺陷等等。
 
    整个该死的宇宙必须分解成一小块一小块的,然后重新构造。
                     ---Henry Miller
 
    不破不立。CI本身就是强力的冲击着传统的开发流程。当我们真正做到自动化构建的那一刻,我们才会发现,一切都变得似乎更简单,更有效。每个team都在CI中追寻着最适合自己的一套构建方案,无论是手工、服务器还是快速构建,当找到了正确的路子,也许我们会感慨,其实没那么难。
    
    如果说上述内容是持续集成的基础的话,后面就是持续集成的升华和思想。我换个方式总结,把所有的思想以“我认为”的方式总结给大家:

    a. 纵览全局(打破职责界限)
    dev,tester,pm,po,如果大家把角色标签限定的非常死,那么就像圣经里的巴别塔一样,不同的语言不同的方式,永远没办法团结起来。那么我们不妨看的远一些,不再为赶代码而把质量保障完全交给tester,不再为测出bug而与dev持续正路,不再为了图省事而拒绝项目里的变化。我们要积极的适应变更,积极的响应质量保障,每个人都是质量保障的一份子。

    b. 浑然一体
    研发(开发,测试,发布,部署)全过程被管理起来。所有角色在一个界面下工作,使用共同的平台,统一的源码管理,共享。大家都在一个平台上工作,所有的任务都在这个平台下,各角色间对互相的工作有更深入的了解,并且,工作状态也可以共享。
   
    c. 用简单的方法解决问题
    持续集成的解决方案是简洁的。产品由SVN去管理,构建过程由CI server负责,而构建过程包含了编译,测试,发布,部署过程。没有封闭的系统,没有蹩脚的流程,配合开放的系统(Code Review/wiki)所有的信息被自然的整合在一起。而一切都是以提高变更速度,提高产品质量为目标。
  当解决方案让你觉得不自然(或有很多内容无法囊括,或需要人为干预)的时候,那这个方案就不是一个完美的方案,必定在某一些方面受到了限制,这些限制有可能是历史造成的。要勇于质疑,扩展角度,提升高度。去掉角色的限制,站在产品的角度去思考,对于整体的优化的解决方案就产生了。
 
    似乎写着写着,不完全像一个导读,更像一个读书笔记了。这次征文的主题是“聆听音乐,品读经典”,那么我就结合着古典音乐来评点一下持续集成吧。
 
    说起来CI或者敏捷,都谈不上古典,反而是对“古典的”开发模型的冲击,但是又不脱离其根本目的,或许可以称之为“新古典”注意。在西方古典乐派中,恰好也存在着新古典主义,而我唯一听过并且印象深刻的便是普罗科菲耶夫的《古典交响曲》。和持续集成相似的是,《古典》也是一部将“过去”的风格同时代新颖的表现手法完美结合的产物,这种巧妙的结合即让人看到普氏创作扎实的传统功底,同时又反应出他才华横溢,力求创新的非凡之处。《古典》交响曲最突出特征就在于承悉传统与追求个性两个方面。我们来仔细了解一下:
 
     对《古典》交响曲这部作品篇幅简短到严格的曲式;从清新典雅的风格到抒情优美的歌唱性,都基本上体现了维也纳古典乐派的手法。同时又有着新个性的欢快自由,从其四大乐章中凸显无疑:
    第一乐章:快板。开始便突显出气势恢宏的第一主题,并伴由长笛的演奏推进动机的发展。这一乐章很类似海顿、莫扎特典型的第一乐章曲式的压缩,但是 普罗科菲耶夫转而用戏谑的态度进行模仿,仿佛一幅带有嘲讽意味的漫画。
    第二乐章:小行板,三部曲式。在其它弦乐器伴奏下,小提琴奏出一条优美而庄重的旋律线,而后长笛加入。整个乐章的结构近乎是完全古典的。
    第三乐章:加沃特舞曲,中速。主题由弦乐和木管乐器奏出,音响纯净而简洁,有进行曲的意味。这里作者用古典组曲里的“加沃特舞曲”代替了古典时代交响曲中的“小步舞曲”。
     第四乐章:生动的,奏鸣曲式。整个乐章极为诙谐幽默,充满了急促而连续的跳动,是充分体现作者风格的乐章。
 
    纵观全曲,其承前启后、调性转换也异常明显。第一乐章主部主题陈述时的调性安排就恨有代表性:第一乐句在主调D大调上陈述,第二乐句突然转到C大调,而后又自然返回D大调。这种突然转调的手法,给人以调性色彩无比清新的感觉。同时,第四乐章极为丰富的调性变幻也同样以极大的艺术魅力给人留下深刻的印象。
    事实上,各种富有个性的新颖手法在这部作品中遍布全曲,随处可见,而这正是构成这部作品通体给人以新颖别致印象的原因。
   
    提到《古典》交响曲,就不得不说其对后世的影响。普罗科菲耶夫毕生追求音乐风格的创新,他曾经说到:“在我生活中,主要的优点是一直追求创新。我讨厌模仿,我讨厌平庸的理论,我不希望去戴任何人的面具,我希望永远是我自己”。
    如果我们说普罗科菲耶夫早期的创作是与斯特拉文斯基一起反映古典主义的,那么从《古典》开始,他们已经走向了不同的道路:普罗科菲耶夫离开了古典主义,成了虽爱好古典形式但具有浪漫主义倾向的作曲家。其音乐通俗易懂,同时又具有古典风格般精湛的作曲技巧,既能受到爱好音乐的现代听众欢迎,又受到专业行家们的赞誉。经常带有大跳进行的宽广的旋律,结合像运动员进行曲似的节奏是他的风格特征之一。以简洁、明朗的古典风格表明了其反应浪漫主义的坚定立场,这一立场让他与新古典主义不知不觉地站在了一起,预示了新古典主义这股风潮的来临。
 
    同样的,持续集成在未来,甚至是现在已经越来越多的应用在项目建设中,成为一股不可抵御的风潮。我相信未来,持续集成会像普罗科菲耶夫这部《古典》交响曲一样,如同湖水在晚霞的照耀下闪烁五彩的光辉,透出了闪亮的光彩。