Modularity of software has long been the primary mechanism used in software development to improve reuse and support maintainability. However, certain concerns do not fit the module boundaries in contemporary software-development paradigms. The consequence of such crosscutting concerns, such as logging, persistence, security, and so forth, is that the responsibilities of the individual modules are not clearly demarcated. Not only is a module responsible for its core state and behavior (pertaining to its business functionality, for instance) but also for that of the crosscutting concern (such as logging). This phenomenon is referred to as tangling. At the same time, we observe the scattering effect whereby a given crosscutting concem,for example, logging, is not modularized in a single element and hence hampers our ability to reason about its effect and behavior with respect to the other modules; such reasoning requires inspection of all the modules where logging is realized. This requirement goes against the established best practice of separation of concerns because the crosscutting effect results in software that is difficult to understand and maintain. Addressing this problem of crosscutting is the main focus of aspect-oriented software-development (AOSD) techniques. In this article, we provide an introduction to AOSD by highlighting how it provides systematic support for identification, modularization, and composition of crosscutting concerns throughout the software lifecycle.