Software reuse is the use of existing artifacts to build new software components. Software reuse also ensures that teams aren't reinventing the wheel when it comes to solving repetitive problems. Software libraries, design patterns, and frameworks are all great ways to achieve this. By taking the time to code with reuse principles in mind as well as reusing existing artifacts, you'll save time in the long term. In short, reuse is how technologists can avoid the proverbial reinvention of the wheel.
This article covers:
- The importance of Reuse
- How to find and contribute to reusable assets
- Developing a Reuse mindset
There are several benefits to reusing existing artifacts like code or design patterns. With a robust reuse strategy, tech organizations are likely to find:
- Elimination of duplicative work: Duplicate efforts among many teams that net the same result means wasted effort, cycles, and less time spent on potentially higher value work. The potential productivity gains on higher value business constructs through the avoidance of duplicate efforts may be the most significant result for an organization.
- Consistency of system construction and behavior:_ Creating an ecosystem in which approved patterns, frameworks, and libraries are reused across many disparate systems provides for consistent, highly predictable system behavior. Additionally, as problems arise and are solved within these ecosystems, they can be more easily shared and implemented across organizations by leveraging those same components.
- Shortened software development time: Developers save time when an application they are working on requires a piece of code that already exists. Time spent reinventing wheels is always more effectively used innovating.
- Improved speed and quality in feature and system delivery: Consistent architecture and design patterns, coupled with a finite set of already codified components, can be used to quickly construct large portions of systems and features with a baseline range of acceptable security, performance, and reliability characteristics. This frees cycles and allows engineers to focus on higher value deliverables and solve ever more challenging problems.
Creating a culture of reuse at Discover®
At Discover, we have an internal community that promotes reuse and collaborative development across our company.
We embrace the open-source principles of:
- Contribution: Contributing back to the greater community empowers us all.
- Collaboration: Communities creating solutions together improves agility and accelerates innovation.
- Consumption: The preeminent term in reuse is use!
These principles encourage a culture of open sharing and reuse. We share our reuse assets through a dedicated Reuse Catalog, which the community regularly maintains and updates.
The Reuse Hub and Reuse Catalog
The Reuse Catalog is a centralized, searchable repository where reusable assets are available to the entire Discover community. The Reuse Hub includes several types of reusable assets including architecture patterns, solution patterns, code, and tutorials. Each asset has supporting documentation for ownership, support, and community engagement.
The assets can be:
- Product-sponsored and supported: construct published with full support of a defined Discover product team.
- Community-developed and supported: community developed reusable construct that has community support.
- As-is: asset published for consumption without product ownership.
Develop and build with reuse in mind
Iplementing a reuse mindset on your own team requires forethought. Before you build any new components, ask yourself the following questions:
- Can I find any reusable components others have already developed?
- If I need to develop a new component, what does reuse mean for this construct?
- How can others within or outside my area benefit from this component?
In order to develop and share reusable components, follow these guidelines:
- Specify ownership and support: Is this component supported by a fully supported product team? Is the asset provided 'As-is?' Let users know they are free to use, modify, augment, enhance, and keep the content updated.
- Low coupling with the rest of the system: A component should be independent of the environment where it is being used.
- A well-defined interface: This allows for external services to know how to interact with the component.
- Single responsibility rule: Reusable components should follow the single responsibility rule and fulfill a well-defined purpose rather than trying to satisfy multiple needs.
- Ensure the solution is well documented: Reusable components need to be sufficiently well documented so that the target audience can easily consume them with little to no assistance. Documentation should include the problem statement and the solution. You should clearly define input, outputs, and usage of your component with examples. Point to reference implementations whenever possible to facilitate their implementation and foster collaboration between teams.
- Ensure core engineering principles are addressed: As you deliver reusable components, ensure that core engineering principles such as security and observability are addressed so that your audience doesn’t have to figure it out.
- Respect original sources: Provide links and references to the original source for additional learning and credit to the original sources.
By effectively applying reuse throughout the development lifecycle, you'll avoid excess waste of time and effort and encourage effective use of your resources.