一切皆可复用

标签: 复用 | 发表时间:2014-10-07 18:10 | 作者:
出处:http://kb.cnblogs.com/

   你有复用习惯吗?

  你是程序员吗?我们经常要写数据库连接的代码,这些代码都类似,无非是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中提到资产库,资产库的重要组成部分就是复用库,复用库可以包含组件、代码、设计方案、各种工作模板、工作指导书等等,然实有利于以后更好地工作的,这些内容都可以纳入复用库中。每个公司都应该好好规划自己的复用库,持续地更新这个库,持续地推动项目使用复用库中的知识。

  试想一下,如果每个项目开展之前,能在复用库中得到大量的帮助,对于提高项目速度、保证质量是有多么重大的意义。一个公司也只有通过这样的方式,才能让公司具备越来越强的竞争力。

  每个公司都不可能网罗全部的精英,精英也不可能一直都呆在同一个公司,公司除了要关注招聘和留住优秀人才外,也需要打造自己的复用库,复用是每个公司成功的加速器!

  一切可以复用,需要通过良好的持续培训制度,以及优秀的企业复用库来支撑,会复用的人才是最聪明的人,会复用的企业才是最厉害的企业!

相关 [复用] 推荐:

一切皆可复用

- - 博客园_知识库
我们经常要写数据库连接的代码,这些代码都类似,无非是new一个connection,然后配置connection的参数,然后open. 很多编码新手,常常会在不同的地方编写这段类似的代码. 其实很简单,这段代码应该抽取出来供每个地方调用. 如果你编写的代码中发现很多类似的甚至相同的代码到处都是,应该好好考虑重构一下了.

JavaScript代码复用模式

- - SegmentFault 最新的文章
代码复用,顾名思义就是对曾经编写过的代码的一部分甚至全部重新加以利用,从而构建新的程序. 在谈及代码复用的时候,我们首先可以想到的是 继承性. 优先使用对象组合,而不是类继承. 在js中,由于没有类的概念,因此实例的概念也就没多大意义,js中的对象是简单的键-值对,可以动态的创建和修改它们. 但在 js中,我们可以使用构造函数和 new操作符来实例化一个对象,这与其他使用类的编程语言在语法上有其相似之处.

看透面向对象的复用技术

- - 博客 - 伯乐在线
来源: RayChase 的博客. 本文翻译自 这篇文章,这篇文章写于1998年,作者是Scott Ambler,真的挺久远了. 看看上个世纪末的时候, 程序员的视角和观点. 想从面向对象复用技术中真正获益,你就必须理解不同种类的复用,并且自如地在不同场合下使用它们. 复用性是面向对象技术带来的很棒的潜在好处之一.

【转】使用Netty实现多路复用的client

- - 开源软件 - ITeye博客
       Netty只提供的异步传输数据的方式,但是并没有实现多路复用的client. 一个分布式的客户端代码基本是这个样子的:. 首先通过channel发送一个请求到server,然后等待server返回的结果. 但是Netty是异步的,writeAndFlush这个方法,只是告诉server,我要发数据了,然后就马上返回了.

高性能网络编程5--IO复用与并发编程

- - CSDN博客云计算推荐文章
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接. 同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发. 服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽.

我对中台的定义:企业级能力复用平台

- - 人人都是产品经理
笔者对中台的定义是“企业级能力复用平台”,本文将针对这九个字进行拆解分析,具体讲述:中台是什么. 《白话中台战略》已经写了三篇,尤其是第一篇「中台是个什么鬼」收到了很多朋友的反馈. 写“白话”这个系列主要是想通过写文章来驱动自己思考,并借此和更多人一起交流和探讨中台这个话题. 幸运的是,确实有很多朋友在公众号后台给我留言来表达自己的想法,在此摘出来一个具有代表性的:.

GitHub - cnlh/nps: 一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。

- -
nps是一款轻量级、高性能、功能强大的. tcp、udp流量转发,可支持任何. tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还. 支持内网http代理、内网socks5代理、. p2p等,并带有功能强大的web管理端. 做微信公众号开发、小程序开发等----> 域名代理模式.