-
Sanchez Tang posted an update 6 months, 1 week ago
Philippe Kruchten, Grady Booch, Kurt Bittner, and Rich Reitman derived and refined a definition of architecture predicated on work by Mary Shaw and David Garlan (Shaw and Garlan 1996). Their definition is:
“Software architecture encompasses the group of significant decisions about the organization of a software system including the selection of the structural elements and their interfaces by which the system is composed; behavior as specified in collaboration the type of elements; composition of these structural and behavioral elements into larger subsystems; and an architectural style that guides this organization. Software architecture also involves functionality, usability, resilience, performance, reuse, comprehensibility, economic and technology constraints, tradeoffs and aesthetic concerns.”
In Patterns of Enterprise Application Architecture, Martin Fowler outlines some typically common recurring themes when explaining architecture. He identifies these themes as:
“The highest-level breakdown of a system into its parts; the decisions that are Hard to change; you can find multiple architectures in something; what is architecturally Significant can change over a system’s lifetime; and, ultimately, architecture boils Down to regardless of the important stuff is.”
Software application architecture may be the process of defining and creating a solution that is well structured and meets each of the technical and operational requirements. The architecture will be able to take into account and improve upon the normal quality attributes such as performance, security, and manageability.
The main focus of the program architecture is the way the major elements and components in a application are used by, or interact with, other major elements and components within the application. The selection of data structures and algorithms or the implementation details of individual components are design concerns, they are not an architectural concerns but sometimes Design and Architecture concerns overlap.
Before starting the architecting of any software, there are some basic questions that we should strive to get answers for. They’re as follows:
How the users of the machine will be interacting with the system?
How will the application form be deployed into production and managed?
Do you know the various non-functional requirements for the application, such as for example security, performance, concurrency, internationalization, and configuration?
How can the application be made to be flexible and maintainable over time?
What are the architectural trends that may impact your application now or after it’s been deployed?
Goals of Software Architecture
Building the bridge between business requirements and technical requirements is the main goal of any software architecture. The goal of architecture is to identify the requirements that affect the essential structure of the application form. Good architecture reduces the business enterprise risks associated with creating a technical solution while an excellent design is flexible enough in order to handle the changes that may occur as time passes in hardware and software technology, in addition to in user scenarios and requirements. An architect must consider the overall aftereffect of design decisions, the inherent tradeoffs between quality attributes (such as for example performance and security), and the tradeoffs necessary to address user, system, and business requirements.
Principles of Software Architecture
The essential assumption of any architecture ought to be the belief that the look will evolve over time and that certain cannot know everything one have to know up front. The design will generally need to evolve during the implementation stages of the application as one learn more , and as one tests the look against real world requirements.
Keeping the above statement in mind, let’s try to list down a number of the Architectural principles:
The system should be built to change rather than building to last.
Model the architecture to investigate and reduce risk.
Use models and visualizations as a communication and collaboration tool.
The key engineering decisions should be identified and acted upon upfront.
Architects should consider utilizing an incremental and iterative approach to refining their architecture. Focus on baseline architecture to get the big picture right, and evolve candidate architectures as one iteratively test and improve one’s architecture. Usually do not try to get it fine the first time-design just as much as you can so that you can start testing the look against requirements and assumptions. Iteratively add details to the design over multiple passes to make sure that you get the big decisions right first, and then focus on the details. A common pitfall is to dive into the details too quickly and get the big decisions wrong by making incorrect assumptions, or by failing woefully to evaluate your architecture effectively.
When testing your architecture, consider the following questions:
What were the primary assumptions which were made while architecting the machine?
What are the requirements both explicit and implicit this architecture is satisfying?
Do you know the key risks with this particular architectural approach?
What countermeasures are in spot to mitigate key risks?
In what ways is this architecture a noticable difference over the baseline or the final candidate architecture?
Design Principles
When getting started with Software design, one should remember the proven principles and the principles that adheres to minimizes costs and maintenance requirements, and promotes usability and extensibility. The main element principles of any Software Design are:
Separation of concerns: The key factor to be kept in mind is minimization of interaction points between independent feature sets to accomplish high cohesion and low coupling.
Single Responsibility principle: Each component or module ought to be independent in itself and responsible for just a specific feature or functionality.
Principle of Least Knowledge: A component or object should not know about internal details of other components or objects.
Don’t repeat yourself (DRY): The intent or implementation of any feature or functionality ought to be done of them costing only one place. It should never be repeated in a few other component or module
Minimize upfront design: This principle can be sometimes known as YAGNI (“You ain’t gonna need it”). Design only what’s necessary. Especially for agile development, one can avoid big design upfront (BDUF). If the application requirements are unclear, or when there is a possibility of the look evolving over time, one should avoid making a large design effort prematurely.
Design Practices
Keep design patterns consistent within each layer.
Do not duplicate functionality in a application.
Prefer composition to inheritance. When possible, use composition over inheritance when reusing functionality because inheritance escalates the dependency between parent and child classes, thereby limiting the reuse of child classes. This also reduces the inheritance hierarchies, which can become very difficult to cope with.
Establish a coding style and naming convention for development.
Maintain system quality using automated QA techniques during development. Use unit testing along with other automated Quality Analysis techniques, such as for example dependency analysis and static code analysis, during development
Not only development, also consider the operation of your application. Know what metrics and operational data are required by the IT infrastructure to guarantee the efficient deployment and operation of your application.
Application Layers: While architecting and designing the machine, one needs to carefully consider the various layers into which the application will be divided. There are several key considerations that require to be considered while doing that:
Separate the regions of concern. Break your application into distinct features that overlap in functionality as little as possible. The main benefit of this approach is that a feature or functionality could be optimized independently of other features or functionality
Be explicit about how exactly layers communicate with one another.
Abstraction ought to be used to implement loose coupling between layers.
Do not mix various kinds of components in exactly the same logical layer. For example, the UI layer should not contain business processing components, but instead should contain components used to take care of user input and process user requests.
Keep carefully the data format consistent within a layer or component.