(3) 没有自我重复,但重复别人。指一个功能有很好的免费开源框架或者标准可以依据,但设计开发时没有采用,而重新发明轮子,导致不能重用已有的标准或开源框架的优势。
记得几年前参加的一个企业信息管理系统的产品开发,该产品从底层MVC框架开始开发,还开发了界面UI控件、自己的XML流程引擎实现等,然后才是在这个基础上开发该企业的信息管理系统。最后结果如何可想而知:投入产出比失衡,以失败告终。这是一个典型的"没有重复自己,但重复标准或免费成熟框架"的例子。
在商业中的专业分工、竞争优势理论和软件架构思想有很多相通之处。一个开饭店的,不应该去种大米、白菜或养猪,而应该抓住自己的核心竞争优势,开好饭店。相同的,种菜的、养猪的,也不应该无缘无故跑去开饭店。除非他们各自都想转行,进入另外的专业化分工领域,同另外领域内公司竞争。
在软件业中也是一样的道理,每个产品都有其核心竞争力,每个产品都应该把握住本产品的核心竞争力,并投入最大的人力物力去经营。而对于其它的标准、辅助工具、框架或产品等,应该持开放的态度,复用已有的标准、成熟框架或产品。当然,除非你想重新定位你的产品。
这种类型的错误技术人员经常会犯,但作为产品的架构设计师,应该尽量杜绝这种错误的发生。
(4) 开发过程中信息重复,如软件过程中用到的工具(项目管理系统、开发工具、测试计划及用例、Build工具、版本管理工具等)之间的信息重复;还有软件过程中各种角色的沟通重复,如开发人员报告进度给开发组长、开发组长又重新报告进度给项目经理等。如下图所示:
对这一类型的自我重复,一个集成的协作平台能解决问题。基于这个协作平台,软件过程中所有角色、工具和流程都能无缝的协作,消除了信息重复和沟通重复,加快开发效率。如下图所示:所有的工具无缝集成,消除了信息重复;所有的角色都基于一个协作平台,能够实施反映产品的状态、信息、各种历史记录等,极大降低了沟通重复。
(5) 缺乏重构导致自我重复。这一种自我重复是最幼稚且低级的重复,但在很多产品的代码和文档也大量存在。一个功能在不同模块中重复拷贝使用、对象继承和组合关系混乱、文档关系混乱等都属于这一类的问题。
对于这一类型的自我重复,对软件进行持续重构是唯一的好方法。代码重构具体请参考《重构》这本书;至于文档重复,大家不妨把《重构》的思想应用于文档,也必有所得。
总结
Don't Repeat Yourself,是软件开发的非常好的实践,良好的软件开发应该是非自我重复的,同样按照非自我重复思想设计开发的软件,往往是好的软件。
· DRY,消除软件开发的各个阶段之间的重复,以客户和需求为中心,加快开发速度。
· DRY,遵循"组件化"、"服务化"、"层次化"的架构设计,使得架构清晰,层次分明,并易于重用。
· DRY,不自我重复,也不重复别人,特别是标准和成熟的开源框架,使得架构开放,稳定,并减少成本。
· DRY,不重复信息,不重复沟通,改进管理流程,加快开发速度,达到有效沟通。
· DRY,持续重构代码,文档等,保持软件简介、清晰,便于维护。