Software applications are typically composed of a User Interface (UI), code to process input from a user or another system and a database that acts as the persistence mechanism. Python applications could incorporate the UI, the business logic and the data access into a single file. For very simple applications this might make sense. However, as the complexity of the domain rises there is a need to divide code intro separate files within many directories and create separate code packages. The aim of this high level code organization is separation of concerns.
The term architecture was adopted from the science of creating buildings and other physical structures [Perry1992]. Buschmann et al presented eight architectural patterns to express structural organization schemas in software systems [Buschmann1996]. One of them, the Layers Architecture enjoyed great popularity in enterprise, desktop and web applications. The Layers Architecture focuses in decomposing the application functionality into vertically stacked layers in which each layer specializes in a particular group of responsibilities [Buschmann1996]. In its strict form layers are coupled only to the layers directly below and in its relaxed form any higher level layer is permitted to couple to any lower level layer [Vernon2013].