What is Software Design:
Typically, a “design” involves some challenges and their solutions, i.e. meeting users’ needs, within budgets and timelines, satisfying multiple constraints (some of them are time to market, cost, maintainability, usability, performance, availability, and so on) etc. The specifics and tools of design may vary from one field to another, but the goals and steps do not, and thus design can be taught and learnt in step-by-step methods.
Most designs consist of putting known design principles together in innovative ways to achieve desired outcomes. There would be appropriate accommodation, decisions and tradeoffs.
Software Architecture and its Importance:
The software architecture can be thought of as a set of components/structures/modules with their properties along with relations, dependencies & interactions (while keeping required independence) among them, needed to run a system.
Why it is important:
- To bring consensus and improve communication among all stakeholders
- To predict and drive quality attributes (i.e. maintainability, usability, performance, security, availability etc)
- May guide managers/architects to estimate costs, timelines etc
- It gives a definite direction, keeping the teams focused
- Can provide the basis for prototyping
- Identifies set of constraints and necessary tradeoffs
- Act as a guide for new joiners
Software architecture can evolve over time, but having no architecture at all is absolutely no-no.
Software architects’ responsibilities:
An architect needs to think about
- Meeting requirements: Not only the functional requirements of the system, but also the qualitative (non-functional) requirements, i.e. performance, security, availability, maintainability and so on.
- Architectural design: it explains how the system will achieve its desired outcomes, i.e. a translation of requirements into a solution. It explains why a particular component/library/structure was chosen over others with their usage/purposes etc.
- Architectural documentation: document all of the above
- Guidance to implementation teams: be involved at appropriate levels to help development team implement the arc/design
- Review: keep reviewing (by self or if needed, by 3rd party teams as well) and making adjustments, as needed, to the architecture and design, before it’s too costly to change or have chance of not meeting the requirements.
When all the requirements are not yet established, above duties are done on “best-availability” basis – what all information is available at the time of architecture/design, thus it becomes an evolutionary architecture.
Qualities of an architect:
- Align stakeholders: keeping them in-line with his/her vision, managing conflicts & needs.
- Leadership: team building, coaching, setting a direction
- Communication: communicating clearly to tech as well as non-tech members
- Management: managing budget, timelines, preparing for potential risks etc
- Technical: technological expertise, modern tools/libraries, abstraction as well as details, continuous self-upgradation, act as a coach to dev teams
- Analytical: Good in critical analysis of architecture & implementation, feedback and fix cycle