一切皆可复用
摘要:
人类文明不断地进步,并不是现在的人比古代的人要聪明,而是我们能不断地“复用”前人的知识、经验。你能不能成为优秀的软件人才,也视乎你能不能不断地“复制”你的成功。一流的软件公司,关注的不止是在技术方面的复用,实际上软件开发过程中几乎所有的东西都可以复用!
你有复用习惯吗?
你是程序员吗?我们经常要写数据库连接的代码,这些代码都类似,无非是new一个connection,然后配置connection的参数,然后open。很多编码新手,常常会在不同的地方编写这段类似的代码。其实很简单,这段代码应该抽取出来供每个地方调用。如果你编写的代码中发现很多类似的甚至相同的代码到处都是,应该好好考虑重构一下了。
读小学的时候,老师要求我们写日记,当时觉得很难写,也不想写。后来读高中的时候,我的思想来了个大转变,突然写起日记来,一写就是几年。写日记并不是记下每天干了啥,而是每天都总结一下当天的得失,看看有什么东西是可以“复用”的。现在写文章对我来说并不是什么很难的事情,我也比较容易观察出周围一些事物的闪光点,并学习它,供自己“复用”。
复用其实不复杂,从小处做起,养成一种习惯,这种好的习惯会让你的成功速度加倍!
你的企业有复用习惯吗?
你们公司有组件库、类库或者是共享代码库吗?每次你们做项目,有没有之前的一些东西可直接供本项目使用的,还是需要全部重新开发的?
A项目遇到一个问题,而这个问题B项目已经解决了,但A项目的人还不知道,这种情况多见吗?
你们做项目,是不是时间压力非常大,公司有没有要求你们完成项目的时候要提交一些可复用的组件出来?项目能按期完成就阿弥陀佛了,还管什么复用呢L
很多公司可能不太注意“复制成功”,每天都在干救火的事情,老员工陆续离职,新员工陆续入职,公司一直没有什么积累。一流的软件企业,都有一套“复用”机制,能不断地积累知识和成功经验,不断地保持公司的竞争优势。
一切皆可复用!
一说到软件复用,很多人可能只想到技术方面的复用,我们应该把复用的范围再扩大。我们为什么要复用呢?因为我们想利用别人或者自己之前的成果,加快进步的步伐。正是因为我们这个目的,所以只要有利于进步的东西,都可以复用。
软件企业之间的竞争说到底是人才的竞争、智力的竞争和知识的竞争,每个公司都想网罗最优秀的人才。但千军易得,良将难求,企业有什么办法把优秀人才的优秀做法“固化”下来,让整个企业都具备优秀人才的特点呢?优秀的人才包括很多方面的人才,技术人才、管理人才、行业知识专家等等,通过一套“复用管理办法”,可以让这些专家的先进的做法,贯彻到整个企业中去。这样就相当于企业复制了很多个这样的优秀人才,企业的战斗力就会达到超强的境界。
技术复用
我们公司的某个项目,要通过网页的方式展示一些列表,并且要把列表的内容导出成Excel。开发人员经常抱怨客户的需求在变,列表及导出成Excel的表格,客户经常修改对列的要求,什么列要显示什么列不需要不显示,列的顺序、宽度、列标题等经常要修改。很多时候客户确实不是无理取闹的,业务是发生变化的,人的认识也是不断加深的,这是一种合理的变化要求,软件应该满足这样的要求,只是我们的技术能力还不过关,每次这样的修改都需要去改代码,修改成本高,开发人员不高兴,客户也不高兴,因为每次修改我们都要跟他讨价还价。
当时我就问开发人员,能不能把这部分的做成可定制的呢?客户想显示什么列就让自己去配制,我们不需要改代码,客户也不会来“骚扰”我们。但开发人员就以难度大,时间紧为由而不同意。
很多公司都会出现类似这样的情形,一般情况下指望项目组内能解决这些问题是不太可能的,原因有二:一是项目所有人基本都是进度优先的,基本上对于这样的改进都是听不进去的;二是项目中的人没有能力去做这个技术改进,或者是项目中利害的人没有时间来处理这个问题。
如果我告诉开发人员,公司组件库中有这样的一个组件,能做到可定制的,能完满满足要求,我想项目组会毫不犹豫地使用这个组件。项目组其实并不否认这样的做法的好处,只是没有时间做或者是自己做不出来。
公司应成立专门的部门,管理整个公司的技术复用,技术复用包括设计复用、组件复用、类库复用、代码复用等。该部门有两大任务:一、不断地研究能为公司使用的先进技术;二、关注每个项目,提取项目中可重用的内容,并为项目提供可重用的组件,为项目解决技术难题,从技术上加快项目的进度和保证质量。这个部门是很重要的,优秀的技术人才放到这里,会使他的作用成倍地放大。
关于技术复用,请看我的另外一篇文章《超越竞争对手的秘密武器——技术重用》,这里仅做简单介绍。
项目管理复用
为什么有项目经理管项目就比较好,有些项目经理就做得不太好了?优秀项目经理的管理经验能不能重用呢?
微软总结了很多项目的成功经验,总结出MSF(Microsoft Solution Framework),并向整个微软甚至是全世界的软件公司推荐MSF。MSF的八大原理以及MSF的团队模型,对提高业界项目管理水平发挥了不可估量的作用。除了MSF,业界还有RUP、敏捷、XP等各种方法供大家参考,这些东西都不妨“拿来主义”,为我所用。
除了复用别人成功的管理经验,更重要的是要复用具有自己企业特色的项目管理经验。把优秀的做法写成过程,“固化”下来,让全部的项目遵照执行,并不断地完善此过程。
过程必须是经过公司实践的提炼出来的,而不要“照搬”外部的一套过程来实施。我们公司刚建立过程的时候,是通过两个试点项目各自的实践摸索出来的,我们总结了这两个项目的成功经验,建立了过程的初稿。以后所有过程的修改,都不是凭空构思,而是“复用”了实践中的成功经验。
管理这东西是有点虚的,不能照搬理论,一定要通过实践来总结经验,把最佳实践写成过程,让整个公司学习和执行这个过程,这样优秀项目管理者的成功经验就会被“复用”到每个项目中去。
行业知识复用
你们做行业软件吗?比方说财务软件、房地产、股票交易软件、建筑预算软件、医院系统。有位项目经理负责一个医院的管理系统,做完后他颇有感触地说,现在就连那个医院的院长也不比我对医院的业务熟悉了!
行业知识不精,最直接后果就是难以把握好需求,被动地响应客户的变化,难以做出客户真正想要的东西。如果你们公司是专注于某个行业的软件的,如果行业知识不精,很容易被竞争对手超越。
作为客户,他们除了关注软件公司技术水平,可能更关注软件公司能不能帮助他们重整业务流程,实现更大的业务价值。很多大型的ERP系统、MIS系统实施不成功,很可能是因为对业务的理解不够,难以推动客户重整业务流程。
为了保证在行业知识方面的优势,很多公司会招聘熟悉该行业的人士,甚至用即懂该行业又懂软件开发的人来负责项目。除此以外,我们应该关注行业知识的复用,公司只有少数几个业务精英是不够的,我们希望每个人都是业务精英。要做到业务知识复用并不复杂,关键做好以下的事情:
1. 安排业务高手讲业务知识文档化,如写出产品的需求规格说明书、使用手册等。
2. 由业务高手安排一些培训,让负责该行业软件的项目经理、开发、测试、实施都接受培训和考核,保证项目组全部成员都具备相应的知识。
3. 持续地更新业务知识文档,并持续地进行培训。
软件公司除了要关注技术积累,也要注重行业知识积累,其实应该首先关注行业知识积累,行业知识就是需求的根源,而技术是为实现需求服务的。
估算复用
要做准确的估算,对估算者的要求很高,要考虑的问题很全面和深入。
以前我们公司做项目估算很不准,一个开始估计是10万的项目,最后可能要20万。如果每次估算,都有一些资深的项目高手来估算就好了,这样能比较全面充分地考虑问题,于是我们想到了这样的一个办法:
我们集中全公司的资深项目经理,一起来对项目估算进行总结,一起列出做估算需要考虑的内容,并加上详细的说明。最后做出了一个估算用的模板,这既是一个模板也是一个指南,列出了项目整个周期需要考虑的工作,并给出详细的说明。这个模板“固化”很多人的智慧,项目组使用这个模板进行估算,就相当于“复用”了大家的智慧。采用此模板后,估算准确率提高了很多,估算的偏差由原来50%以上,控制在20%以内。
业界有很多估算办法,如功能点法、代码行数法,倒不是说这些方法不好,不过很多公司都没有办法很好地掌握这些方法,也没有让这些方法发挥作用。估算这个事情也不是什么方法就能搞定的,是很依赖于估算人的智慧、经验、判断能力的,想办法“复用”他们的智慧,这可能才是解决估算问题的有效办法。
测试复用
发现了一个缺陷,如何保证以后测试不会遗漏?
软件发布了新功能,进行测试的时候如何保证老功能不会有问题?
测试复用对于提高测试质量、保证软件质量和降低测试工作量太重要了。凡发现缺陷的测试用例都需要重视,这个测试用例以后要复用!进行新功能测试的时候,我们还需要跑一下测试老功能的测试用例,检验做新功能有没有导致老功能出问题。测试中其实是非常关注复用的,也有很多公司在研究自动化测试工具,特别是功能自动化测试工具,以便更好地复用。
但实际上很多公司并没有做得那么理想,测试时间经常被压缩,测试人员得不到重视,测试自动化工具一直也没办法用上,测试工程师们周而复始地进行原始的手工测试,软件还是持续地遗留大量的缺陷发布给客户。
要做好测试复用,可以先从简单做起:
1. 规范测试的过程,保证缺陷都被准确地记录下来,并且详细地记录发现缺陷的测试步骤。
2. 每次测试都需要总结经验教训供以后使用。
我们公司为了让测试的水平能持续地提高,我们针对我们的产品编写了功能树,列出了全部的测试点,以及测试时的注意事项,测试时要按照此树进行测试,要覆盖全部的点。如果发现测试有遗漏,或者软件功能调整,我们马上更新功能树。这样即使我们安排不同的人去测试,都基本能保证测试的效果,我们的测试工程师通过功能树“复用”了前人的经验教训,避免了重犯。
持续培训,把复用发挥到极致!
说到底,复用就是一个实践、总结、学习、应用的过程,我们公司的“每日培训”把复用发挥到极致。每个公司都应该有持续培训的制度,把公司各方面的复用推向极致!
培养知识共享、乐于交流、追求进步的企业文化
不少软件公司的技术人员,都或多或少的有一些技术保留的想法。但持续培训机制,让每个人都很热衷把自己研究的成果与大家分享,乐于解答别人在工作上遇到的困难和问题,乐于与大家争论技术问题,每个人都急于吸收新知识、新技术,每个人每天都会觉得自己有很多东西要学、想学。
员工与公司共同进步
公司是由每位员工组成了,每位员工进步了,公司也就进步了。持续培训机制是每位员工个人发展的加速器,员工通过不断的学习,甚至是自己亲自做讲师,个人水平得到了全面地提高。伴随着员工水平的提高,公司的生产力也不断地提升。
打破部门界限、项目组界限
持续培训制度,彻底打碎部门界限、项目界限,所有人不分部门、不分项目组地坐在一起上课、讨论,不同部门的人、不同项目的人轮流上台讲课,讲授各自的经验和知识。不同部门、不同项目组之间的员工关系将非常融洽,彼此了解对方正在什么工作,也非常乐意提供跨部门、跨项目的帮助。
新技术、新过程迅速转化成生产力
采用新技术,实施新过程是公司不断革新的重要方法。新技术、新过程的顺利实施并转化成生产力的周期越短越好,持续培训制度,大大缩短了这个周期。所有新技术、新过程将会很快地被“复制”,大家会在培训上热烈讨论,加深了对新技术、新过程的理解,从而加速了新技术、新过程的实施。
新制度迅速落实
一个管理严格的公司一定会有严格的日常管理制度,而日常管理制度应该根据实际情况及时调整,持续培训制度对新的制度的迅速顺利落实起到了很大的作用。
成功迅速复制,错误不会重犯
持续培训制度,可以让每一个人的成功经验迅速“复制”给每一个人,而任何一个人的失败教训,可以迅速让每一个人体会,避免错误重现。
打造金牌讲师
每位讲师,由准备讲课到经历讲课,是对自己各方面能力的考验,每一次讲课就是一次能力提升的过程。持续培训制度,“复制”了大量的金牌讲师。
打造品牌课程
持续培训制度积累了大量的课程,所有的课程的资料全部保存到培训网站,可供所有后来的员工查阅和学习。而不少系列课程,经过多次的改版以及重讲,慢慢了形成了公司的经典课程,这些经典课程被不断地“复用”,教育着一批又一批的新员工。
打造卓越团队
持续培训制度,锻炼了大量的项目经理、部门经理,他们成为了公司的中坚力量,“复制”出一个又一个的卓越团队。
关于培训,请参考我的系列文章《不可思议的每日培训》。
打造企业的复用库!
能复用的东西非常,如:风险识别办法和缓解办法、设计方案的复用、缺陷的解决办法等等,复用思想的本质其实就是要不断地总结经验教训为今后所用。要做到这点,除了在公司倡导总结和学习的企业文化外,需要制度化地管理复用工作。
CMMI中提到资产库,资产库的重要组成部分就是复用库,复用库可以包含组件、代码、设计方案、各种工作模板、工作指导书等等,然实有利于以后更好地工作的,这些内容都可以纳入复用库中。每个公司都应该好好规划自己的复用库,持续地更新这个库,持续地推动项目使用复用库中的知识。
试想一下,如果每个项目开展之前,能在复用库中得到大量的帮助,对于提高项目速度、保证质量是有多么重大的意义。一个公司也只有通过这样的方式,才能让公司具备越来越强的竞争力。
每个公司都不可能网罗全部的精英,精英也不可能一直都呆在同一个公司,公司除了要关注招聘和留住优秀人才外,也需要打造自己的复用库,复用是每个公司成功的加速器!
一切可以复用,需要通过良好的持续培训制度,以及优秀的企业复用库来支撑,会复用的人才是最聪明的人,会复用的企业才是最厉害的企业!
作者:张传波
创新工场创业课堂讲师
华为某团队高级顾问
《火球——UML大战需求分析》作者