Overview of Design Goals
Developing an application of any significant scope typically begins with a perceived problem and the desired solution that is implemented through the use of software. As a result, an application is in simple terms a collection of software that has been consolidated to solve a defined set of problems.
Solving such problems through the practical application of software is referred to as software engineering. As with any other engineering project, whether it is building a bridge, an aircraft carrier, or even something seemingly as simple and mundane as a can opener, a considerable amount of effort is put forth before laying a single brick, riveting a single rivet, or forging the first piece of steel.
During this initial phase, called the design phase, several elements will impact and shape the design of the application. Some of these elements are typically non-negotiable or finite resources, such as time, money, and manpower. Others, such as available technologies, knowledge, and skill, are dynamic and will vary throughout the development life cycle.
While these elements influence the design of the application to some extent, the problem dictates what capabilities the application must possess to develop a satisfactory solution. Although other capabilities could be addressed here, we will focus on six, which are (in alphabetical order): availability, manageability, performance, reliability, scalability, and securability. These are in addition to the obvious required ability of solving the original problem.
Although it would be ideal to address and satisfy each capability completely when designing an application, more often than not tradeoffs enhance one capability at the expense of another. For example, an application that deals with the personal financial information of clients may sacrifice a degree of manageability to provide greater securability. In another example, an application that monitors a patient's vital signs might sacrifice broad scalability for improved reliability. It is very important to identify early on the priorities of each capability to ensure that application architects make design decisions with proper regard.
When identified and prioritized, the capabilities of the application constitute the fundamental design goals. While some minor adjustments can be made later in the development life cycle, significant changes will most likely have significant impact on the available resources. Each of these capabilities will impact the performance of the application.
Application performance is a crucial characteristic that is often a measure of how successfully the application has been constructed. Application architects must pay significant attention to application performance during the entire development life cycle. If the application solves the problem, it will still be considered a failure if it does not perform adequately.