Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
One of the most important roles for an architects is in the requirements engineering phase; this is how architects help define the solution that best satisfies all stakeholders. Ranju Saroch
customer was very happy with that consultants work and assured me that the business analyst had captured all of their intentions and needs. Datum wanted to build a management information system (MIS) which would not only satisfy the current user requirements, but also provide the basis for quickly developing future applications. Months were spent in designing this application. As demonstration and release dates drew closer, the team began to panic. Design and code reviews were being scuttled, and more developers were added to the project to meet the deadline for the first demo. The first demo did arrive, and the users liked what they saw. However, they surprised the demo team when they immediately started making additional demands. They asked for validation functionality to be built in, which was never captured in the original requirements. They also asked for restricted access to certain fields on a particular form, based on user type. Afterward, an architecture assessment revealed that some of the new requirements like user security, validation, and so on, could not be met by the current architecture without significant rework. Designs started degenerating and quality problems started to creep in. The project schedule was changed, and the team worked day and night to rewrite the code to include the new changes. Finally, the application was released. The application met the critical customer requirements but failed to meet the organizations goal of developing future application quickly with minimal maintenance. Also, the customer was not happy as one of their functional requirements for opening reports in Word format was never captured in the original requirements phase. Also. compared to the original estimates, the application development cost had increased significantly. Furthermore, application maintenance had became a nightmare; even adding small features took lot more time than we had originally planned, and sometimes required significant rework. Many architects have faced these types of issues. Looking back, I feel the lack of documenting and tracking non-functional requirements made it hard to prioritize and make trade-offs between the quality of the system and the cost to develop and enhance it. In my case, the lack of documentation of the different user types, access criteria, and report output format had a direct impact on the design and the quality. This in turn had a negative impact on maintenance processes and cost. Still, most organizations have created a separation between Requirements and Design phases. These organizations use their Requirements phase to address business problems, while they use their Design phase to address the solution to those problems. Current requirements engineering approaches are mainly used to gather functional requirement (FR) which capture the intended behavior of the system, but fail to gather the non-functional requirement (NFR) which impose constraints on the product/application being developed. Due to the lack of NFR, requirements are not mapped directly and explicitly from requirements engineering to the architectural design phase. Moreover, requirements omission are often detected very late in the process and result in significant
rework, which increase the cost of applications and affect the quality of systems, even to the point of failure. From my experience, I realized that the architect is accountable for the system being good, right and successful. Therefore, an architect should be involved in the development of requirements in order to help them create a design that achieves a compelling user experience, thereby making decisions that will have huge consequences for the life cycle of the system that best satisfies all stakeholders. This does not mean that the architect needs to do all the requirements work, but the architect needs to be involved and have direct contact with stakeholders. An architect needs access to business management in order to understand the strategic direction and lifecycle cost goals for the system. They also need to understand the users goals and requirements in order to make sense of the context into which the system will fit.
tasks are more time critical and if the system is down during that time it can frustrate users. Reliability refers to the probability of the system executing without failure for a specific period of time. An architect needs to establish quantitative reliability requirements based on how severe the impact would be if a failure occurred and whether the cost of maximizing reliability would negatively impact performance. An architect needs to specify replication and failover scenarios as well as security plans to protect the system from hackers. Usability refers to ease of use and user-friendliness of the product or application. An architect needs to make sure that the users are able to access the system using all desired channels of communication. For instance, the architect may have to document that the users desire to access the application over the web using three types of browsers. Efficiency refers to how well the system utilizes processor capacity, disk space and memory. An architect needs to assure that the systems make efficient use of given resources as, for instance, 100% resource usage can severely affect the performance of the system. Flexibility refers to how much effort is needed to add new capabilities to a system. Flexibility is very important when the system is being developed in an incremental, iterative fashion through a series of successive releases. If the architect anticipates system enhancements, then he or she can choose design approaches that maximize the softwares flexibility. Security refers to precluding unauthorized access to a system, ensuring that the software is protected from virus infection, and protecting the privacy of data entered into the system. There is no tolerance for error concerning the security of the system. Interoperability refers to how easily the system can exchange data or services with other systems. The architect needs to know which other applications the users will employ in conjunction with the product and what data they expect to exchange. Robustness refers to the extent a system continues to function correctly when confronted with invalid input data, defects in connected software, defects in hardware components, or unexpected operating conditions. In conjunction with the users, the architect needs to identify all expected error conditions in order to determine the robustness goals of the system.
administrators, and operators cannot figure out how to manage their applications, they will not survive past the first release. For example, with regard to my work with Datum, maintaining the application became a nightmare as adding a small feature took a lot more time and sometimes required significant rework. Portability refers to the effort required to migrate a piece of software from one operating environment to another. The architect needs to build a plan to migrate the system to the latest version of the software. My MIS application was not easily portable as every new release of the framework had integration issues that were very time consuming to resolve. Reusability refers to the extent a software component can be used in applications other than the one for which it was initially developed. Developing reusable components costs more compared to developing an application-specific component. An architect needs to specify which components of the system will be reusable and needs to create a library of the reusable components that can be easily integrated with other applications. The MIS application at Datum was designed as a reusable application, which increased its cost of development tremendously. Testability refers to the ease with which the software components or integrated products can be tested to find defects. Testability is very important if the product is being developed incrementally. Frequent testing at each development increment can help determine whether changes damaged any existing functionality. The MIS system I worked on went through many enhancements, and it was very hard to test, understand and maintain, as its cyclomatic complexity was very high. Cyclomatic complexity is a measure of the number of logic branches in a source code module. The more logic branches a system has, the more test scenarios must be developed in order to test these branches.
Availability Efficiency Flexibility Integrity Interoperability Maintainability Portability Reliability Reusability Robustness Testability Usability + + + +
y y lit lit bi y bi ss ty t a y y ty cy ili y ili ity ity na lit ne er lit ili i i n b il lit st ab r bi ie op nta la ab ib ab u s i bi g r t t c ia x i r s fi e te te a va el eu ob sa A Ef Fl In In M Po R R R Te U + +
+ + + + + + -
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+ + +
+ + +
Figure 1 shows the positive and negative relationships between various quality attributes. A plus sign in a cell indicates that increasing the attribute in the corresponding row has a positive effect on the attribute in the column. For example, design approaches that increase a software components reusability can also make the software more flexible, easier to connect to other software components, easier to maintain, more portable, and easier to test. A minus sign in a cell means that increasing the attribute in that row adversely affects the attribute in the corresponding column. Efficiency has a negative impact on many other attributes. For example, the tightest and fastest code written using a specific compiler and operating system is hard to maintain and enhance as well as resistant to porting to another environments. More examples of these can be found in Karl Wiegers book on software requirements, which is also an excellent resource in general for the aspiring software architect.
Lessons Learned
At the end of the project with Datum, I realized I had made tremendous growth as a software architect. I realized that architecting is about finding the best possible solution that addresses the functional requirements of an application or product within many constraints. Therefore it is very important for me to be involved during the requirement phase as these constraints are generally not captured by business analysts or project managers. There are many constraints within which we architects need to work: development timeframe and cost, computing resource availability, external systems we need to interact with, component reuse choices, capacity plans, and so on. And these constraints should be captured during the requirement phase in order to satisfy the needs of all stakeholders depending upon the application or product we build.
o What parts of the system are likely candidates for later modification? o What sorts of modifications are expected? Physical Environment o What is the physical environment and will it be deployed in one or several locations? Security o Should there be control on the system or any data? o Is physical security an issue? Resources and Management Issues o How often will the system be backed up? o Who will be responsible for the back up? o Who is responsible for system installation? o Who will be responsible for system maintenance?
Sources
[Botzum, et al. 2006] Botzum K, Brown K, Hambrick G. 2007 January 24. Why do nonfunctional requirements matter? IBM DeveloperWorks [Internet]. [cited 2007 January 10.] <http://www128.ibm.com/developerworks/websphere/techjournal/0601_col_bobrha/0601_col _bobrha.html> [Malan 2007] Malan R. [date unknown] Requirements and innovation. The Architecture Discipline [Internet]. [cited 2007 January 10.] <http://www.bredemeyer.com/ArchitectingProcess/VAPColumns/RequirementsA ndInnovation.htm> [Malan, Bredemeyer 2001] Malan R, Bredemeyer D. 2001. Defining non-functional requirements [PDF]. Bredemeyer Consulting [Internet]. [cited 2007 January 10.] <http://www.bredemeyer.com/pdf_files/NonFunctReq.PDF> [Malan, Bredemeyer 2002] Malan R, Bredemeyer D. 2002 February. Architectural requirements in the visual architecting process. The Architecture Discipline [Internet]. [cited 2007 January 10.] <http://www.bredemeyer.com/ArchitectingProcess/ArchitecturalRequirements.ht m> [Malan, Bredemeyer 2003] Malan R, Bredemeyer D. 2003. Architecture strategy. Software Architects: Knowledge, Activities and Characteristics [Internet]. [cited 2007 January 10.] <http://www.bredemeyer.com/ArchitectingProcess/ArchitectureStrategy.htm> [Mitchell 2004]. Mitchell S. 2004 April 28. Nonfunctional requirements. University of Maryland, Baltimore County (UMBC) College of Engineering [Internet]. [cited 2007 January 10.]
<http://www.csee.umbc.edu/courses/undergraduate/345/spring04/mitchell/nfr.htm l> [Wiegers 1999] Karl E. Wiegers. 1999. Software requirements. First edition. Redmond: Microsoft Press.
Glossary
Functional Requirements (FR). They are specific functions, tasks, features or behaviors the system must support. Non-Functional Requirements (NFR). They are reliability, usability, maintainability, cost, development time. Cyclomatic complexity. It is a measure of the number of logic branches in a source code module.