如何提升项目交付中软件复用水平

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 软件复用是软件工程领域一个非常重要的话题,但如何进行有效合理的服用,需要理解复用的本质,并且经过一些顶层设计。本文介绍了不同的软件复用形式,以及各自的优缺点,论述在项目交付场景下合理的复用形式。

1. 软件复用是提升项目交付效能的关键因素

1.1 什么是软件复用

软件复用(Software Reuse)是指将已有软件的各种有关知识用于建立新的软件,以缩减软件开发和维护的花费,是提高软件生产力和质量的一种重要技术。

软件复用对程序员来说是再平常不过的事情,可能从学校里的编程作业开始,我们就在接触复用。早期的软件复用主要是代码级复用,被复用的知识专指程序。但其实领域知识、架构设计、技术文档等知识类的沉淀,同样适用上述定义,也属于软件复用的范畴。


按不同级别划分,软件复用通常有以下形式:

1. 代码Copy:最简单直接的方式,也最常见

2. 组件复用:在一个应用工程内,通过利用已有的组件去实现部分功能。比如在阿里广泛使用的fastjson,比如Spring Cloud工程脚手架。

3. 应用复用:比组件复用更进一步,通过API方式去使用已有的服务,比如提供发短信能力的一个微服务。这个服务对消费方来说是一个黑盒,不需要对这个服务的源代码做修改。

4. 产品级复用:这里是指能够开箱即用,仅通过配置就能适配客户的个性化需求。通常是指SaaS类的产品,意味着很高的场景抽象能力,同时也和业务场景和定位有关。

复用级别上升,复用的效率也会上升,但同时适配不同客户场景的灵活度却会下降,有点像机器学习算法里的过拟合。所以并不是一味地追求高级别的复用就好,下文会重点阐述。


1.3 交付项目中软件复用的特点

在项目交付的语境下谈复用,本质就是为了提升交付的效率,加快项目从客户的想法到实际交付到客户手里的时间,并减少投入的人力的资源成本。在项目交付中,最关键的约束就是成本和时间,如果脱离这两个因素,软件复用也许不那么紧要。但对我们做项目交付的而言,这两点恰恰是最敏感的。


另外,在云计算时代,开发者是交付场景下,软件复用的主要对象(贡献&消费)云产品很强大,但大部分是PaaS产品,还需要技术加工,才能满足客户的具体业务需求。通常开发者会深耕在一个行业里面,不断积累交付经验,并有机会进行沉淀。这里的沉淀,就是软件复用的源头。


在这样的背景下,软件复用就需要考虑开发者的特点,包括不同组织之间如何进行技术资产的互相流通;包括软件是否有足够的说明文档、演示Demo和技术支持来帮助技术水平较弱的开发者也能合理地进行复用。


2. 软件复用的难点

软件复用是提升交付效率的核心手段之一,但要实施起来却也有很多困难,主要在于以下三点。


2.1 “非我所创”综合征

“Not invented Here Syndrome”,指的是社会、公司和组织中的一种文化现象,人们对不是自己所创作的软件存在一种天生非理性的排拆感。

所谓程序员重复造轮子的现象,也有这方面因素的影响。要拒绝复用,总是能找到理由,比如批评某个开源项目的API设计不够优雅等等。其实回想一下,过去我也有这种心态,有时候就有冲动按自己的想法去实现一遍。

对于核心业务模块,强调把控力而选择自建,也许无可厚非。而在强调时间和成本的场景下,复用显然来得更为重要。


2.2 软件复杂度影响复用

技术架构能过简化软件的复杂度,但再好的架构设计,它在刚完成时是“清白”的,随着实施的进行,它的复杂度也随着功能的增多而逐步累加。

实际上,如果通过代码Copy的方式去移植整个系统,也就意味这复制原系统所有的复杂度。在原有为A客户的场景所开发的代码上,去做修改,实现B客户似是而非的需求,所付出的开发和测试的代价,会让软件复用的收益大打折扣。


相对代码copy这种方式,如果对软件进行足够的模块化设计,每个模块按照高内聚低耦合的规则去设计,仅实现原子化的功能。模块可以是组件、或者服务的形式,对外提供SDK或API。那么在软件复用的时候,就可以仅仅复用这些模块,而舍弃原来项目中用于粘合各个模块的业务代码(通常集中了客户定制化的需求,对应整洁架构中所谓的防腐层)

当然,这些模块对调用方来说是黑盒的,所以组件的设计和与内部实现开放程度会决定软件复用的程度。


2.3 获得技术支持难

如果是开源软件,当我们开源它的源代码,供人复用的时候,不会强制提供技术支持SLA。这也是为什么很多开源软件除了有社区版,还有对应的企业版,它的核心在于提供专业的技术支持。

所以在决定是否要复用软件资产的时候,除了软件本身的功能和质量,是否能获得技术支持也是决定性因素。对开源软件而言,就是看它是否在持续更新,社区是否活跃。


3. 适合交付项目的软件复用形式

建筑设计 vs 土木工程

有些业务场景,可以通过SaaS化的软件,来实现“拎包入住”。但阿里云总集的大型项目,它的特点都是客户的场景并不那么“标准”,或者说本质上就是在做数字化转型的探索,需求的边界比较模糊。

此时的项目交付,其实非常像造大楼。首先,需要技术架构师绘制蓝图,关注宏观的架构设计,并和客户确认。架构设计决定了这个建筑的上限,能否成为地标性建筑(所谓的地标,就是与众不同,无法整体照搬)。

然后到了落地实施环节,软件复用就像土木工程,关注实施的细节过程。软件复用好比搬运和安置土木砖块。它决定了这座大楼能不能如期建成,以及建成之后能矗立多久。


模块化的软件复用

理想的软件复用,和打造火神山、雷神山医院有异曲同工之妙,在工厂里做好预置的模块,运输到工地现场,组装起来,通过这种方式去大大缩短工期。

软件复用的颗粒度越大(对应之前说的复用层次越高),它的复杂度就越高,需要现场去适配和调整的代价就越大。甚至可能需要用户来削足适履。而独立模块,功能上越内聚,并且对外部依赖越小,它才越容易被复用起来。

所以适合交付场景的复用,就是做好模块化拆分,以是组件、或者服务的形式去打造预制件。就像乐高积木一样,颗粒度尽可能小,才能方便地被插拔到各个地方并重新组合。至于怎么根据客户定制化的需求,通过“胶水”代码去调用组件,进行装配的工作留给交付现场。


4. 建设资产市场,提升软件复用度

4.1 建设资产市场

前面提到,客户的个性化需求是复杂而多变的,大多数情况下,开箱即用的产品并不能满足。比较而言,完成特定功能,供交付项目按需取用的预制件要来得更适合。

知道要建设什么样的资产,我们还需要一个在线的资产市场来承载它们。能对资产做集中管理,并供潜在的用户浏览和发现。


举个例子,我们都知道应用的安全性重要,但在项目交付中,有时候又是比较容易忽视的,防范不到位。这个时候,如果有一个好的通用安全组件,并提供给开发者去使用,帮助大部分的项目把安全防范提升到一个及格的水位。


4. 总结

在交付场景下,客户的定制化需求非常多。没有两个项目的客户需求是完全一样的,很难通过单纯的产品复用来解决客户需求,定制开发是必不可少的。在这里,我们关注的是土木工程,通过高质量的预制件来提升交付的效率。通过构建一个在线的资产市场,使得资产的标准能够得到统一,并且是通过一个开源社区的运作模式,伙伴的开发者也被引入进来一起共建。

目录
相关文章
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
96553 33
超详细Netty入门,看这篇就够了!
|
4月前
|
人工智能 Linux 网络安全
不动编辑器写代码:OpenClaw保姆级部署(阿里云/Win11/Mac/Linux)+AI编码(口述修Bug+PR提交)+FAQ
“发现Bug→打开IDE→定位代码→调试修复→提交PR”,这是开发者的常规操作流程,一套下来至少花费半小时。但2026年,OpenClaw(昵称“小龙虾”)的AI编码能力彻底颠覆了这一模式——参考文章作者仅通过口述需求,就让OpenClaw自动拉取代码、分析Bug、编写修复代码、启动测试服务器,全程零代码操作,甚至能直接提交PR,将修Bug的时间从“半小时”压缩至“几分钟”。
2334 14
|
9月前
|
机器学习/深度学习 人工智能 算法
火眼金睛:如何检测文本内容是否出自AI之手?
火眼金睛:如何检测文本内容是否出自AI之手?
1592 115
|
SQL JSON Java
Java开发业务接口规范
规范点 说明 推荐方式 等级 文档唯一性 文档出处来源(人员和设备)必须统一,建议文档服务器,统一发布人。   重要 接口环境 要明确给出各个环境的调用地址。
5406 2
|
12月前
|
机器学习/深度学习 人工智能 边缘计算
AI 视觉识别技术在工业园智能安监中的应用实践
本文详解AI安监系统的技术架构、核心算法与工程化方案,展示其如何通过计算机视觉实现全场景风险主动防控。
645 0
|
XML Java 测试技术
Graalvm 替代 JVM 真的可以带来巨大的性能优势吗?
介绍 Spring Boot有助于轻松开发独立的、可用于生产的 Spring 应用程序。它对 Spring 平台和第三方库采用固执己见的方法:以最少的配置简化设置过程。优势: 易于使用:Spring Boot 简化了独立 Spring 应用程序的创建,无需复杂的配置。 嵌入式服务器:它允许直接嵌入 Tomcat、Jetty 或 Undertow 等服务器,从而无需单独部署 WAR 文件。 Starter 依赖项:Spring Boot 提供预配置的“starter”依赖项,降低了构建配置的复杂性。 自动配置:Spring Boot 自动配置 Spring 和第三方库,最大限度地减少手动设置工
|
机器学习/深度学习 算法 数据可视化
数据驱动是什么?数据驱动的深层次理解!
在企业数字化转型中,“数据驱动”常被提及,但其内涵却未必人人明晰。本文从应用层次与价值实现机制两方面解读“数据驱动”,分为四个层次:监测(记录事实)、分析(诊断问题)、挖掘(深度算法)和使能(赋能业务)。同时提出DIPOA模型,将数据视为生产原材料,通过链条完成价值转化。
|
SQL NoSQL Oracle
关系型与非关系型数据库的区别
关系型数据库是依据关系模型来创建的数据库,所谓关系模型就是“一对一”、“一对多”、“对多对”等。常见的关系型数据库有Oracle、MySQL、SQL Server等。非关系型数据库主要基于“非关系型模型”,其中非关系型模型有:列模型、键值对模型、文档类模型。比如redis属于键值对模型。 MongoDB属于文档模型 关系型数据库的优点: ● 易于维护:都是使用表结构,格式一致。 ● 使用方便:SQL语言通用,可用于复杂查询。 ● 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。 关系型数据库的缺点: ● 读写性能比较差,尤其是海量数据的高效率读写。 ● 固定的表结构,灵活
|
存储 安全 算法
物联网发布者在发送数据时如何保证数据的安全性和完整性
数据加密、密钥管理和数据完整性验证是物联网安全的重要组成部分。对称加密(如AES)和非对称加密(如RSA)分别适用于大量数据和高安全需求的场景。密钥需安全存储并定期更新。数据完整性通过MAC(如HMAC-SHA256)和数字签名(如RSA签名)验证。通信协议如MQTT over TLS/SSL和CoAP over DTLS增强传输安全,确保数据在传输过程中的机密性和完整性。

热门文章

最新文章