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