Single responsibility: Every class/software component/microservice should have only one job. Do not let them become coupled with others.
Open–closed: Classes/modules/functions should be open for extension, not modification.
Liskov substitution: A sub-class must be able to substitute for its superclass without errors.
Interface segregation: Make interfaces client-specific. A client function should not have to depend on an interface they do not use.
Dependency inversion: Depend on abstractions, not concretions. Do not let high-level modules depend on low-level modules, let both depend on abstractions. Details should depend on abstractions, not abstractions on details.
Full post here, 12 mins read