Compared to the traditional software several decades ago which were simple machine instructions or the combination of data
structures and algorithms, current software are more complicated and harder to control and maintain. Normally, software systems
are constructed through the assembly of components, whatever those which are developed according to new specifications or
those which are stored in the libraries. In this circumstance, a team is needed to face different facets of the system. Some
of them deal with the necessary functions to be implemented or reused in components, while others have to focus on how the
work from different divisions can be coordinated and communicated correctly. Meanwhile, in this process some qualities of
software must be guaranteed in order to approach the success.