精益思想已在诸多行业取得了卓越的成效,敏捷软件开发更是让困境中的软件开发人员看到了曙光。本次大会中,敏捷专家们将精益和敏捷这两种思想的精髓揉合在软件开发中,帮助广大开发人员将广为接受的精益原则转换为适应具体环境的敏捷实践,从而提高组织的软件开发能力。
今天的话题是我9月份在伦敦的会议上讲的。我的想法是做任何事情的时候,发现它的本质是非常重要的,不要让它的本质被你所看到的假象所埋葬,这也是精益思想的精髓。
大家知道米开朗基罗吗?米开朗基罗是西方世界最著名的艺术家,他雕刻的大卫雕像是个杰作。当时有很多说法,其中有一个比较知名的说法是,当他站在大理石面前,只有他看到里面隐藏着一个大石,他所要做的事情,把加在大卫身上这些枷锁和不需要的东西解除掉,这样大卫就出来了。米开朗基罗从大理石里看见了大卫,这就是看见了里面本质的东西,把不需要的东西去掉,我们也需要发现它的DNA,这样从这个DNA塑造更多的大卫。
发现事物的本质,而这个本质是可执行的,是能动的,好像一个人,我们一开始是完整的能走、能跳、能爬,只不过会慢慢地长大变得更强壮。这时候要去发现它的“核”。
抓住核心价值 寻求独特发展
如图,我们看到这上面画了一个“核”,它有三个边。一条边是说它是可执行的,这是很重要的,我们不要纸上谈兵。一开始的时候我们也是在开发一个系统,大系统当中的一个小系统,只是它非常小,但是它还是可执行的。
另外一条边指的是蓝图,就是知道它会往什么方向发展,我们有了一个小的东西,我们会知道这个小的东西往什么方向发展,它会不会发展成我们不想要的东西。但是有一些时候我们很难很清楚地知道它会往哪个方面发展,这个时候我们需要一些原则,它有一些基本的原则保证它的发展的方向不会走错。
三条边一个是可执行的、还有一个是有蓝图的,还有一条边是有自己的内涵的原则,我们有了这个核,就可以从这个核开始,去做任何的事情。
如何应用这个核来做事情,举三个实例,一个是跟业务的开发有关,另外是软件开发本身,还有如何去构造一个好的软件开发者方法。
先从业务开始讲,若要去描述一个业务,我们会描述两个东西,一个是目前的组织的状况,现在是怎样的。另外会描述它在不久的将来能够长成什么样子。
现在我们的问题是,在描述这个东西的时候,业务是非常的复杂的。我要讲的例子是伦敦股票交易系统,它最后的结果是延期了12年,最终的费用是原来的132倍。失败有很多种原因,其中一个非常重要的原因,我们不要去试图把所有的东西一下子想清楚,因为太大了,所以要从它的“核”开始。
如图,这个例子中我们要的核是什么?这个例子中可执行的东西就是核心的过程,把它最核心本质价值的东西抽取出来,并且做成一个可执行的,然后从这个可执行的小的东西去想,它的发展的模式可能是分布式,可能是一个产品,或者是应该是多个产品。
我们有了核当中可执行的部分,如果它没有很清楚的蓝图,我们需要去考虑它有哪些核心的原则和价值。举例:宜家、Google都会有自己的核心和原则,Google有一个著名的话“不作恶”这是它发展业务的核心,如果后续的发展跟这个矛盾它就不会去做。
在20年前有多小的公司兴起,在当时还有很多大公司,但是这些小公司有可能把原来的大公司给灭了。大家知道谁创立了Skype吗?比如说Skype的兴起,那么为什么那些传统的公司没有反应呢?因为他们会说我去做这样的事情,会危机到我原来的业务。
再往前看的话,一个人从身无分文到变成一个亿万富翁,大家或许不太相信,但是Internet却改变了这一点。
Skyp创始人把他的公司卖给易贝,卖了43亿美元。易贝收购了Skyp这是非常不成功的例子,Skyp对易贝来说是非常小的一部分,易贝也不知道怎么靠Skyp来赚钱,所以过了几年之后这个哥们又去把Skyp收购了回来,只花了5亿美元。然后过了几年Skyp又发展了,三年以后又卖给了微软,具体的数字是几十个亿或上百亿。
这个例子让我们看到他要抓住自己的核心价值是什么,然后可以寻求他能够有自己比较独特的发展。我们有可执行的小系统,核心价值的原则和价值的东西就能够不断地去发展,包括软件和技术的方面。当发展业务的时候,业务和IT系统是同时来做,是迭代来做的,而把所有的事情先想清楚再去做,这是两个对比。
“Skinny System”式架构
下面我们要讲的话题和大家关系更紧密一些,首先是要从比较小的开始,抓住它的核心的东西不断地长大。现在的软件开发越来越复杂,代码、模型等等的方面,如果要用传统的敏捷方式,有可能要去扩展会比较的困难。我们做软件产品的时候,关键的也要有个小的软件系统,比较核心的系统,从这个上面再去加更多的应用。从骨架、框架系统,比较小的系统开始,让你认识到你的业务是什么,然后在这个骨架上加更多的应用和能力。
如图,这是几年前去新西兰做演讲的时候做的,新西兰有很多的绵羊,所以用这个例子会使新西兰比较好理解。我们要从骨架系统开始,这个骨架虽然很小,但是它是可执行的。
Skinny System是一种羊,它是会动的。
我们从三个方面来解释,我们做的时候不只要可执行,而且要想好它往哪个方向去发展,就是要有个蓝图。我们需要架构,这样会知道它会往哪个方向去发展,有架构但是没有可执行的方面,更是一种海市蜃楼不可靠的。很多人想架构的时候是纸上谈兵,这对我们来说是海市蜃楼,它是虚幻的。另外的情况是,我们今天有很多代码,它也形成了这样的系统,但是没有架构,我的问题是,像这样的东西你认为是什么?(可执行的代码,但是没有架构)就是一些堆积在一起的东西。
所以要关注,要有一个可执行的框架系统,同时要知道它往哪个方向去发展。开始去构造一个骨架系统然后再往下面去加它的肌肉,让它更有力气,变大。
价值和原则,你去做架构层的时候不止是画图,应该知道它的原则是什么,它的一些基本的核心价值是什么。我觉得做一个软件系统这三个方面的东西都要有,我们要从这儿开始,而且这不是非常难做的事情。
如何构建软件工程中的“核”蓝图
这是从美国的西部扩展到美国的东部,这是1976年的事情,那时候发展得更大,现在是无处不在,基础的东西是骨架系统开始,并且它有一定的自己的原则,基础性的东西。左下角写了,当时的Internet发展是有自己的原则性的指导的东西在这里。做事的方式是一样的,我们有一些基本的原则,包括做任何的系统,酒店的系统、航空系统都会有一些基本的原则,用这些基本的原则引导你后面往正确的方向去发展。
我们怎么去改变你现有的工作方式,从刚刚讲的情况来看,后一个例子一般会比前一个例子讲得更细致一些,这个例子会有一些更细节的方面。每个开发人员都知道怎么去开发自己的软件,但是软件开发作为一个社区和群体我们没有一个共识应该怎么做。而这个又是非常重要的,有共识这件事对软件开发非常重要。
软件工程被一些不成熟的实践严重妨碍了它的进步,主要表现在首先软件工程行业看起来更像是一个时尚行业,不像是工程的行业。在20年前我很年轻,这样的面向对方的很流行,27世纪90年代的时候组建化技术也很流行,接下来在20世纪90年代之后大家都开始使用UML,就是UP(统一的过程)。几年前大家都在谈极限编程,现在谈得不多,现在大家谈敏捷和其他的技术,也许明年会有一个新的东西来,大家是一会儿跟这个,一会儿跟那个,跟的同时把自己原来擅长的东西扔掉了。并不是说所有新的东西都不好,其实都有好的东西,比如说敏捷使我们能够快速获得反馈,能够快速交互,但是有可能在扩展性上存在一些问题。所以把原来所有的东西都扔掉跟时尚行业一样,这是很愚蠢的做法。
第二点我们缺乏一个正确的被大家所广泛接受的理论,从过去的一段时间到现在,大概有超过十万种到五十万种这样的方法在市面上流转。这个数字本身并不是最严重的问题,因为我们有不同的人员,不同的竞争力的人,所以需要有不同的方法来应对,问题是在于我们不知道怎么把这些好的东西能够融合在一起,有一些方法在那有可能你都不知道。
还有一个问题我们的学院派的东西跟实际的应用技术间,有些时候有很大的障碍。刚刚提到可能只有1%的一些东西被在实际中应用到。
刚才讲了很多问题,所以我们要去重建软件工程,它是基于比较可靠的理论,以及被证明过的一些原则和最佳的实践,这里用到一个非常震撼的词“革命性”。这里非常关键的是我们需要一个“核”,这样才能抓住问题的本质,把目前很多这样的方法、理论和一些好的东西,能够把它们抓到一起。
这是我们在做软件工程“核”的蓝图,这个“核”中会包含很多基本的东西,大概有20多个这样的元素,这里我们只提到四个,做软件工程和软件开发的方法中必须要用到。我们有很多种可以做需求的方法,但是在所有的软件开发中做需求这个事是一定会有的。不管用什么样的开发语言和技术来做软件开发,你总是希望最后得到一个软件系统,不管是用敏捷的方式,还是用传统的方法,还是其他的方式,总是要有一些工作要做。
团队开发中“核”的重要性
在软件的开发中需要团队,尽管有很多种不同的组织的方式,比如说跨功能的方式,但是一定需要团队来做软件开发。
我们有这样的大家达成共识的软件工程,价值在于我们能用大家所都认可的词汇来去沟通,这样可以解释我们的实践,不同的实践可以组装在一起,也可以用到比较好的实践。我们把这些我们认为标准的东西放在一起,它就形成了软件工程的“核”,它不多不少的时候正好就是反应软件工程的本质。
如图,有个要图标,这就是软件工程方法这个“核”的时候,它是可执行的,有了一个“核”之后,有很多其他的六边形的,它们很容易组装在一起,形成一个可以让大家容易去采用的软件开发和软件工程的方法。
我要以打纸片的方式来做软件的开发,一种卡片是“核”当中的元素卡,元素卡它会描述这个元素不同的状态。刚才讲的“核”的元素卡。这个卡片可以用在做培训,也可以用在平时的软件开发中。元素卡中有很多的状态,我们可以用更小的卡片表示,需求卡,这个状态要通过怎样的手段来达到呢?如果都达到了最终的状态,可以理解为你要做的事情都做完了。刚才我们谈的是“核”当中可执行的这部分。
现在给大家介绍一个实例,用软件工程“核”的方法去组织它的软件开发方法这样的例子。这是一家做软件咨询的公司,他们也做一些外包开发。在屏幕的左手边是一个相当于实践库,然后可以根据我不同的需求,不同的开发项目,去组装出开发项目所需要的软件开发方法,它是由“核”加上它的实践来的。这里面是两种不同的项目,一个是老的维护的项目,另外是新的开发项目,虽然有很多实践是来自于同一个库,但是它们会组装成不同的方法来适应不同的项目。
如图,做再保险的公司,他们有20个实践,9个“核”,在这个基础上开发出四套它的软件开发方法,一个是针对探索性的软件,比如说一些新的东西,然后有一些标准开发的,有一些是针对维护性的,还有一些是用支持这样的项目。
现在我们的方法拿出来之后,已经成为在描述工程方法方面的一个标准,就是用“核”的方式来做描述,可能它会有相应的描述的语言会出来,应该在明年会成为一个标准。
在四年前发起的宣言和声明中,有35个知名人士,16所大学和公司以及1600个开发人员,他们是通过SEMAT网络把他们聚在一起的,SEMAT的意思是软件工程方法和理论,SEMAT解决方案创造了一个容器,因为所有的方法它无非都是很多实践的组装或是融合。刚才我们提到几乎有50万种方法,但是实际上比较常用只有250个实践,通过这么多实践,不同的组装,就形成了很多的方法。我们希望所有的实践都是用软件工程“核”提供的语言的描述,这样大家都达成共识。我们的语言应该是用标准化的方式来描述,到时候不管做什么都可以用到他。
Ivar Jacobson做这样的事情,做出来的东西是给开发人员用的,而跟给传统的跟所谓的软件过程工程师使用是不一样的。我们可以用这个“核”来帮助我们去驱动我们的开发过程,我们用这个“核”组织我们的人员,并且帮助我们发现问题。
为什么说这是一个关于精益思考的复兴
如图,我们刚才谈到了三种例子,一个是关于做业务,另外是做软件系统开发,还有软件过程方法,都会用到“核”的思想。我们也可以用“核”的思想来开发系统,不止是软件系统,也包含移动设备等等。我们也可以用“核”来重新设计UML,两年前Ivar
Jacobson也写过一个白皮书,《UML之路》。关于UML再设计,对本身的使用者来说是一样的,但是如何去学习这个东西的过程,别人如何去教授UML的方法会发生一些变化,90%的情况下只用了UML10%的内容,我们也用“核”的思路把一些最核心的东西放到一起,大家先学这个,从这个开始再去学习更多UML的知识,这个也许在几十年后会变为现实。所以如果大家能够理解这个演讲的精髓和主题,可能能够构建更好的架构,在做软件开发的时候,也可能会有时间写一本这方面的书,目前正在和黄博士写一本关于“核”的书,也许很快会面市,也可能会免费地提供给大家。
我们这次演讲的主题精益思想的复兴,为什么用这个主题呢?因为现在很多时候谈精益的时候,是已经有了现有的东西,我们看哪些东西是不需要的,然后我们做减法,更好的一种方式是一开始就是拿最小的、“核”的部分的东西开始做出,所以这是精益思维,或者是精益思想的复兴。
这里还有个副标题,把本质的东西从你的整体包袱把它解放出来,你做事情要从最本质的开始,而不要做了大堆东西之后再去考虑什么是不要的。
用爱因斯坦的话,“任何事情要把它做得更加简单,但是不是什么东西越简单越好,因为没办法更简单了,就做到这个程度就好了,这样是一种很明智的做法。”
|