Layering is a common technique used by software designers to break apart complicated software systems. Each layer has a well-defined interface and dependencies with other layers, implementing one technical function like data access. The pros of layering include understandability, separation of concerns, reusability, and independent development. The cons are that layers do not encapsulate all things well and extra layers can harm performance. Layers and tiers are often used interchangeably, but tiers imply a physical separation. Common layers in information systems include the UI, application, business, services, data, and unit testing layers.