modularity modern software systems typically consist of several different components that must interact correctly in order for the entire system to work properly keeping these interactions straight requires that these different components be well organized modularity refers to an organizing principle in which different components of software system are divided into separate functional units as real-world analogya house or apartment can be viewed as consisting of several interacting unitselectricalheating and coolingplumbingand structural rather than viewing these systems as one giant jumble of wiresventspipesand boardsthe organized architect designing house or apartment will view them as separate modules that interact in well-defined ways in so doinghe or she is using modularity to bring clarity of thought that provides natural way of organizing functions into distinct manageable units in like mannerusing modularity in software system can also provide powerful organizing framework that brings clarity to an implementation in pythonwe have already seen that module is collection of closely related functions and classes that are defined together in single file of source code python' standard libraries includefor examplethe math modulewhich provides definitions for key mathematical constants and functionsand the os modulewhich provides support for interacting with the operating system the use of modularity helps support the goals listed in section robustness is greatly increased because it is easier to test and debug separate components before they are integrated into larger software system furthermorebugs that persist in complete system might be traced to particular componentwhich can be fixed in relative isolation the structure imposed by modularity also helps enable software reusability if software modules are written in general waythe modules can be reused when related need arises in other contexts this is particularly relevant in study of data structureswhich can typically be designed with sufficient abstraction and generality to be reused in many applications abstraction the notion of abstraction is to distill complicated system down to its most fundamental parts typicallydescribing the parts of system involves naming them and explaining their functionality applying the abstraction paradigm to the design of data structures gives rise to abstract data types (adtsan adt is mathematical model of data structure that specifies the type of data storedthe operations supported on themand the types of parameters of the operations an adt specifies what each operation doesbut not how it does it we will typically refer to the collective set of behaviors supported by an adt as its public interface