超越竞争对手的秘密武器-技术重用
摘要:
软件重用的好处不言而喻,但似乎很多公司都会陷入这样的怪圈:因为项目进度压力大,就不讲究什么重用设计了,太花时间了,完成项目再说。因为一直都是项目进度压力大,故周而复始的循环这个怪圈。
如何摆脱这样的怪圈?如何在激烈的竞争中立于不败之地?如何利用好“软件重用”这个厉害的武器?本文阐述了笔者大量的工作体会,将给你一个有益的启发。
国外软件技术水平 VS 国内软件技术水平
微软的Office,我想无人不晓吧?Office的VBA不知道了解的人是否多?n年前我第一次知道这个VBA的时候,我觉得非常震惊, 我们利用VBA可以低成本地做很多开发,直接利用Office的全部功能。同时我很佩服微软,Office中几乎所有的产品,都包含VBA这个“组件”,这个小小的组件让所有应用这个组件的产品增值不少。
几年前我玩过一个国产的RPG电脑游戏,觉得非常经常好玩。数月后,该公司再次发布了一款新游戏,号称继承了之前那个游戏的精华,我非常激动,购买了这个游戏,谁知道让我非常失望,新款游戏的基本上就是用原来游戏的模子倒出来的,只是把故事情节、场景换掉。这里倒不是想说这个游戏没有什么新意,而是想说这个公司把重用发挥到极致,游戏的情节引擎、战斗引擎等都不需要换掉,他们甚至利用开发团队内部使用的“情节编辑器”和“场景编辑器”等工具,就可以“配置”出一款新的游戏软件出来。姑且不论这个公司游戏创意方面的考虑,这个公司利用软件重用,生产游戏的速度得到了很大的提高,并且可以很好地保证质量,因为这些重用的组件之前已经经过充分测试了。
国外软件技术比起国内来,领先了很多个“马位”,软件重用方面的考虑在国外大公司来说已经是“家常便饭”的事情了,而国内真正考虑软件重用的公司并不多。
国内的很多系统和软件,基本上是做数据库的“四轮马车”的工作。
很多项目的名字都类似于“某某管理系统”,什么ERP、MIS等系统,其实背后做的都是数据库的增加、修改、查询和删除的操作,技术含量并不高,仅是工作量大而已。这些庞大的系统,经常会把一些软件公司拖死。难道就没有办法用快速、高质的办法来完成这些项目吗?
过程VS技术
为了更好的控制需求,为了做好需求开发工作,为了提高生产力,很多人想到了改进过程,很多公司也竞相去过CMMI多少级。从过程来改进生产力无疑是一个好方法,但能不能从技术来改进呢?很多时候从技术来改进生产力比从过程入手来得更直接更有效。
在做一些信息管理系统的时候,经常会遇到客户需要修改业务对象属性的情况,这时我们常常要给相应的数据表增加一些字段,并要修改界面层到数据库操作层的代码。难道没有一种好的技术办法来解决这种需求变更吗?
我们用微软的SharePoint作为我们公司的内部办公平台,SharePoint最大的优点就是能“随需而变”,能随时增加、修改、删除字段,而不需要编写任何的代码,也不需要要求微软提供任何支持服务。我们为之感到惊叹,微软的技术也太牛了!我们学习了SharePoint这个特点,对自己的产品进行改造,使之具备类似于SharePoint的特点,能随时增加、修改、删除业务对象的属性,而不需要修改任何代码,并且我们把这个技术几乎重用到我们全部的产品上,极大提高了我们产品的竞争力。
业务对象的属性发生变化,这是常见的事情,我们完全没有必要埋怨客户的“无理”变更,当你成为客户的时候,你也会有这样的需求变化要求。如果我们的软件在技术上能做到“随需而变”,那么你还会害怕什么需求变更呢?IBM的广告词之一就是“随需而变”,如果没有强大的技术做后盾,谁敢打出这样的广告呢?
当然,技术改进与过程改进是密不可分的,技术改进也需要配合相应的过程来支持,我们在考虑改进的时候,不妨同时从过程和技术两个角度来考虑。
老调重弹——重用的好处
网上说软件重用的好处的文章特别多,这里只介绍几点。
1)让生产软件的速度更快。
让那些以重用设计要花更多时间而不原意进行重用设计的人滚一边去吧,软件重用的目的之一就是让软件生产更快。如果贵公司每做一个项目,有50%是重用以前的组件的时候,贵公司的软件生产速度会比你的竞争对手快多少?磨刀不负砍柴功,这个道理谁都懂,但一到现实工作中,还是有很多人直接拿钝刀就去砍大树了。很多软件公司生产了软件多年,还是没有一点技术积累,自己的类库、组件库、共享代码库为零,如果还不立下痛心来改变现状,那就等着被被人淘汰吧。
有一款PS2、PS3游戏叫“战神”,非常受欢迎,我也很喜欢玩,而“战神2”的面世比其前作快了很多,也比其他大型软件的开发速度快很多,因为 “战神2”重用了前作的图像引擎。在这个商业社会,不再是大鱼吃小鱼了,而是快鱼吃慢鱼。
2)让软件质量更高。
项目越临近发布,需要加班的几率就越高,开发时间严重超出了计划的时间,而测试的时间不断被压缩,甚至有些软件公司不进行测试了,美名其曰“给客户测试”!这样的软件质量如何让客户满意?如何抛离你的竞争对手?
测试是可以被重用的!如果软件重用了大量的组件,而这些组件之前是经过充分测试的,那么软件的质量就会得到极大的保证,这些组件不需要重复测试,软件需要测试的时间也会大大减少。
3) 让管理成本更低。
我曾经花了很大的力气去抓项目的设计过程,但效果甚微,原因是我们没有足够多的利害高手,能把每个项目的设计做好。为了提高大家的设计水平,我们又进行了大量的培训。当我费劲心思提高我们的设计水平的时候,我们公司的技术副总却给了我另外一个思路,让我阔然开朗!
他认为与其从改进过程和提高大家设计能力的角度来改进,还不如编写一套生成项目框架的代码,并要求全部项目使用公司的组件库,这样做项目的人不需要很高的水平就能做出满足架构要求并且质量高的软件来。
每个公司的技术高手毕竟是少数的,要把这些高手用到刀刃上,并通过软件重用这个框架,保证高手们的智慧能贯彻到每个项目中去。这样公司管理过程的成本将会极大地降低,同时公司也不需要招聘大量的高水平的开发人员,把公司的管理重点放到能产生80%价值的20%的员工身上。
4) 有利于保护公司的技术秘密。
前段时间我还在笑话一个案例:一名客户希望某系统能做成虚拟现实的效果,能有三维的场景,能从中取出所需要的物品,当时我的感想是:无言!不过不久前,我在网上瞎逛,居然点进一个三维购物网站,里面展示了一个类似于三维的场景,能在货架上取货还能跟店员谈话!我的天啊,太牛了!我觉得非常惭愧,我居然还敢笑话那个客户,看来该笑话的应该是我!那个三维购物网站虽然还不算很强,但已经接近那个客户想要的东西了。我想如果好好发展这个技术,该技术很可能会成为该公司很有竞争力的一个技术!
一个软件公司要成为龙头老大,没有核心技术是不行的。保护核心技术最好的办法,就是采用重用技术。有核心技术的公司,一般会有两套人马,一套人马研发该核心技术的,一套人马使用核心技术的,使用核心技术的人员只能得到编译后组件,而这些组件常常要给与授权码才能使用。
保护好这些可重用的核心技术,这些将成为公司重要的资产。
如何做到重用?
1)先做好项目内重用。
不知道你编写代码的时候,是不是经常Ctrl+C和Ctrl+V?我曾经见过一些软件的代码,相同的代码到处都是,不要说面向对象了,连基本的结构化代码都写不好。相同的内容要抽出来成为方法,相似的功能可以提取到公共类中。这是最基本的编码功底,也是最基本的重用要求,如果连这点都做不到,就不要空谈什么软件重用了。
还有一次,我检查一个VB写的Windows程序的缺陷列表,发现一批关于录入提示不友好的缺陷,后来一问,原来开发人员直接使用VB的InputBox函数来让用户录入数据,开发人员还用一堆InputBox函数不好用的理由来说明这个缺陷是不能解决的。该软件存在大量的这种类似的录入窗体,我就问为什么不自己做一个录入窗体,然后在所有地方重用它呢?这样问题就不存在了,而且用户感觉更好,何况做这样的一个录入窗体时间最多也就是30分钟的事情。
做自己做起,从项目做起,马上把软件重用做好吧!
2) 拿来主义——利用开源代码及共享组件。
n年前,我曾经利用一个共享的软件,生成其中一个项目的数据操作层的代码,节省了我们不少时间。类似的这样的一些共享代码、组件、软件在网络上非常多,大家不妨多去搜索一下。
不过这里要给大家提个醒,必须测试好这些免费的东西。我曾经吃过亏,我拿了一个网上大家都鼓吹得很厉害的一套开源免费的论坛来做自己的网站,结果发现一堆bug,还有不少是导致网站无法访问的错误。使用免费的东西总是要付出代价的。
另外也要注意大家注意版权问题,很多免费的东西是不能用于商业用途的。
3)项目无可比性,如何做到项目间重用?
当我提到软件重用时,很多人跟我说,我们公司的项目每次都不一样的,很难提炼出可重用的东西。于是我回答,不管是什么项目,很多内容是可以考虑做成可重用的,如:权限管理、配置管理、日志管理、异常管理(出错管理)、缓存管理、数据层组件等。
很多共性的东西,只是我们没有抽取出来。不知道大家是否了解过微软的Enterprise Library,这个Library提供了很多个Block,项目能直接使用这些Block为项目服务,如:Data Access Application Block能提供数据访问的API,你无需再开发数据库访问的代码。微软为什么就可以对不同的项目进行抽象,提炼出这么多可重用的Block,我们是不是应该多动动脑筋?
另外不管你是不是采用.net技术去开发的,也建议去好好研究一下微软的Enterprise Library,看看他们是如何设计这些Block,好好学习人家的重用设计是怎样做的!
4)发掘有价值的重用。
项目中可重用的东西实在太多了,平时要好好发掘。
我的测试团队经常会报这样的一些缺陷,对录入数据的合法性没有做比较全面的判断,如输入电话号码的地方,可以输入“ABC”,而系统没有报错。而我们的开发也经常说这类缺陷没必要修改,另外要满足这个要求的话,代码比较难写,而且要到处修改。
我比较纳闷,如果发现要不断地处理类似的问题,是不是应该考虑重用设计呢?如果经常要验证电话号码的合法性,是不是可以做一个电话号码控件,并到处重用这个控件呢?当然电话号码的合法性判断并不简单,这段代码也并不好写,不过我们有“正则表达式”,现在很多开发包都提供正则表达式引擎,这些不都可以利用吗?
注释:正则表达式是一种对录入数据格式和合法性的定义语言,如录入电话号码的要求,完全可以用正则表达式来表达。正则表达式的引擎,可以将正则表达式与输入值进行比较,判断输入值是否符合正则表达式的要求。
我们要有敏锐的触觉,凡重复的代码、凡类似的功能、凡经常遇到要解决类似的问题,都可以考虑采用重用设计。重用设计是有一些难度,不要畏惧这个困难,很多情况下可以用简单的办法解决的。
规划技术管理路线,打造核心技术
市场、技术、过程可能是软件公司最重要的三样东西,具备具有市场价值和竞争力的技术,并且通过软件过程管理来保持和扩大这种优势,对软件公司来说是至关重要的。纵观各大软件巨头,无一不是具备这样的特点的。中国要成为软件强国,也必须走这样的发展道路,什么发展外包只是权宜之计。
以前某软件老板曾经说过:他们公司不是研究机构,更不是慈善机构,公司存在的目的就是赚钱,所以他们公司没必要打造核心技术,能赚钱的就做。问题是,如果没有核心技术,能不能持续地赚钱并且赚大钱呢?n年过后,该老板的软件公司也不见得发展了多少,目前还在为公司生存而奋斗。
阿里巴巴的发展大家有目共睹,互联网刚在中国兴起的时候,马云看中了网上交易的前景,目前阿里巴巴网站已经为阿里巴巴带来丰厚的收益,马云把B2B的市场拓展到C2C——淘宝网,为了保障安全的网上交易,开发了支付宝。为继续扩大优势,阿里巴巴并购了中国雅虎,一下子拥有了全球领先的搜索技术。没有强劲的技术是难以保证持续领先的,一流的软件公司都在不遗余力地打造自己的技术优势。
各软件公司应该好好分析自己的市场前景,制定相应的技术路线,打造核心技术来支持公司的战略!而软件重用将是保持竞争力的杀手锏!
作者:张传波
创新工场创业课堂讲师
华为某团队高级顾问
《火球——UML大战需求分析》作者