The abstraction principle in software systems allows us to create more generically usable software components.
Abstraction removes details from the problem space and thus makes it easier to think about problems and solutions. This principle lets us focus on problems by reducing complexity.
Abstraction makes software components more reusable: code for specific problems is abstracted to code that applies to a broader class of problems.
The process of abstraction, or generalization, removes specific attributes or functions and replaces these with general counterparts. The abstract components can be made specific through parameters or inheritance.
Abstraction is also a modeling technique that allows logical grouping of software structures so they can be better designed, realized, and maintained. Through this grouping, a complex software solution is methodically chopped up into smaller pieces that can be handled better in all phases of a software system lifecycle.
Examples of abstraction in software systems:
The OSI networking model abstracts communication protocols in functional layers.
Messaging middleware solutions abstract the connectivity logic from the application.