Wednesday, February 8, 2012

What is Software Architecture?


 “Perfect is enemy of good enough”, that is one of the phrase I always trying to remember when I got things to finished on time. Finishing things perfectly will take unimaginable time, but make it good enough will take the time that has to take truly. This I wanted to remind at the start of this article, because of , this is 100% true concept for the Software Architecting too.  
Knowing the basics will always put you on behind the safe margin always. Before going to look at what we can do with the “Software Architecture”, let’s see what the actual mean of it is,

Software application architecture is the process of defining a structured solution that meets all of the technical and operational requirements, while optimizing common quality attributes such as performance, security, and manageability. It involves a series of decisions based on a wide range of factors, and each of these decisions can have considerable impact on the quality, performance, maintainability, and overall success of the application.

This definition is not a one that I wrote myself, but I copied it from Microsoft web site, where you can find lots of resources on software architecture. There are lots of definitions that have been published by different peoples and organizations, for the Software Architecture. You can take time to Google and see more definitions.

Why is architecture important?
Like any other structure, Software also needs to have architecture itself to make sure few key requirements,

    ·         How will the users be using the application?
    ·         How will the application be deployed into production and managed?
    ·         What are the quality attribute requirements for the application, such as security, performance, concurrency, internationalization, and configuration?
    ·         How can the application be designed to be flexible and maintainable over time?
    ·         What are the architectural trends that might impact your application now or after it has been deployed?


The Goal of Architecture
What Architecture is trying do is, build a bridge between business requirements and technical requirements by understanding the Use Scenarios (Use Cases or User stories). In generally Architecture should,
·         Expose the structure of the system but hide the implementation details.
·         Realize all of the use cases and scenarios.
·         Try to address the requirements of various stakeholders.
·         Handle both functional and quality requirements.

The Architecture Landscape
It is always better to keep in touch with the architectural trends that shape the Software Architecture today.  There are key forces that demands to change this area of Software development,
 1.       Users and Business demands for faster results
 2.       Better support for varying work styles and workflows
 3.       Improved adaptability of software design


These are few of  key trends in Software Architecting,
 1.       User Empowerment
 2.       Market Maturity
 3.       Flexible design
       4.       Future Trends

The Principle of Architecture Design
Architecting and Designing the things upfront is almost impossible. Things are getting improved stage by stage as you learn more. These are the question that we have to consider while we create an Architecture Design,
·         What are the foundational parts of the architecture that represent the greatest risk if you get them wrong?
·         What are the parts of the architecture that are most likely to change, or whose design you can delay until later with little impact?
·         What are your key assumptions, and how will you test them?
·         What conditions may require you to refactor the design?
Always we have to keep options open for future changes.

Key Architecture Principles
These are the few of key architecture principles which I found,
·         Build to change instead of building to last. Consider how the application may need to change over time to address new requirements and challenges, and build in the flexibility to support this.
·         Model to analyze and reduce risk. Use design tools, modeling systems such as Unified Modeling Language (UML), and visualizations where appropriate to help you capture requirements and architectural and design decisions, and to analyze their impact. However, do not formalize the model to the extent that it suppresses the capability to iterate and adapt the design easily.
·         Use models and visualizations as a communication and collaboration tool. Efficient communication of the design, the decisions you make, and ongoing changes to the design, is critical to good architecture. Use models, views, and other visualizations of the architecture to communicate and share your design efficiently with all the stakeholders, and to enable rapid communication of changes to the design.
·         Identify key engineering decisions. Use the information in this guide to understand the key engineering decisions and the areas where mistakes are most often made. Invest in getting these key decisions right the first time so that the design is more flexible and less likely to be broken by changes.
It’s is always need to use incremental and iterative approach to refine the architecture.

Testing the Architecture
We can consider answering following questions while we are testing the architecture,
·         What assumptions have I made in this architecture?
·         What explicit or implied requirements is this architecture meeting?
·         What are the key risks with this architectural approach?
·         What countermeasures are in place to mitigate key risks?
·         In what ways is this architecture an improvement over the baseline or the last candidate architecture?

Conclusion
This is just an overview of what Software Architecture is. This is not complete coverage of the topic, but I wanted to remember and write things that I leaned from few sources. Most of time it’s Microsoft web site.  Hope to continue this discussion further with few key topics of Software Architecture.

Regards

Lakmal