In this chapter, we will look at several important nonfunctional requirements and see how these are supported by the architecture that we discussed in the previous chapter. The main focus will be on a number of nontrivial system capabilities that are most affected by the nature of cloud computing, such as scalability. Obviously, there are many more nonfunctional capabilities than discussed in this chapter. We chose to leave out the nonfunctionals that are not any different when building traditional Java applications.
Maintainability is probably the system capability that benefits most from a modular architecture. Even very large code bases become understandable when divided in small isolated modules. We can change or completely replace implementations without having to worry that we break code that has a dependency on certain implementation classes rather than interfaces. As stated before, modularity is the ultimate agile tool.
Of course, we should be realistic and remember that there are many other aspects that influence maintainability. Even a highly modular system can be a maintenance nightmare if we have tangled, cyclic dependencies, no unit tests, and unreadable code, just to name few. Modularity is by no means an excuse to forget about other programming best practices. It does, however, give us maximum flexibility when it comes to replacing (pieces of) implementations.
Many systems require some kind of plug-in ...