Much of the difficulties concerning software acquisition, development and use are related with its essential characteristics [9]. Software is embedded knowledge, structured in the form of instructions, databases and documentation. Software is changeable, differently from products, which are usually unchanged after manufacturing, being superseded by later models. Software is embedded in a matrix of applications, users, laws and machines, which all change continuously, and these changes forces changes in software systems. Software is invisible, and it cannot be represented geometrically. Geometrical abstractions have been extensively used in all engineering areas, in order to prototype new product development. Although some powerful software modeling techniques have been developed during last years, software remains inherently unvisualizable, and it does not permit the mind to use some of its most powerful conceptual tools.
One fundamental characteristic of software is the repeatability of its development process. Software development always includes four fundamental processes, which must be performed in all software projects [10]:
1. 1. Software specification: methods, techniques and tools for the definition of the functionalities of the software and constraints on its operations; includes requirements analysis and definition, which should be understood and agreed by customers, users and development team.
2. 2. Software development: comprehends methods, techniques, and tools to design software architecture and develop it; includes system and software design, which partitions software requirements, generates the overall system architecture and detailed design, and software implementation, when software design is realized in sets of programs.
3. 3. Software validation: comprehends methods, techniques, and tools to guarantee that the produced software does what the customer wants; includes unit program tests and system testing;
4. 4. Software evolution: comprehends methods, techniques, and tools to evolve the software to meet changing customer needs; each evolution cycle can be considered a small software development cycle.
Because software development follows a repeatable pattern of activities, software engineering theorists have been working on the development of frameworks that represents sets of best practices for the performance of these activities. Those frameworks can be divided into two major groups: formal and agile methodologies. We present some of the most important features of these development frameworks, emphasizing the most important contributions provided by the research community for the activities concerning software acquisition and supply.
Currently, one of the most important formal software development methodologies is the Capability Maturity Model Integration (CMMI), an evolution of prior capability maturity models developed at the Software Engineering Institute (SEI). The model prescribes good practices for developing and maintaining software products and services during their complete lifecycle, since inception until delivery [3]. The practices, sub-practices and examples that flesh out the model guide software professionals in making decisions about the adequacy of a range of process implementations; however, there are no practices in the CMMI concerning specifically software acquisition and supply activities.
The Unified Process (UP), currently supported by IBM, aims to provide a disciplined approach to assigning tasks and responsibilities within a software development organization. The software lifecycle is broken in four consecutive phases: inception, elaboration, construction and transition [11]; similarly to the CMMI, the Unified Process doesn’t address specifically software acquisition and supply activities.
The Extreme Programming (XP) is an agile software development process, developed specifically for small to medium teams building software in the face of vague and / or rapidly changing requirements. The process is intended to be highly dynamic, where development teams deals with requirements changes throughout an iterative life-cycle with short loops [4]. Specifically about the relationship between software users and developers, XP claims that customers should be completely involved in development activities, participating in all decisions that are made during the iterative development.
Finally, the ISO/IEC 12207 – Software Lifecycle Process
.- aims to be the most comprehensive document concerning software development, describing the complete set of tasks required to develop it, since its inception until its maintenance and discontinuity [12]. This norm forms the basis of the ISO/IEC 15504 – Software Process Improvement and Capability Determination [13], which is also used to evaluate the maturity of development processes at software companies. The ISO/IEC 12207 provides a common language for software practitioners, including buyers, suppliers, developers, maintainers, operators, managers and technicians. It is divided into three major groups of processes: primary life cycle processes, supporting life cycle processes and organizational processes. Primary life cycle processes include acquisition, supply, development, maintenance, and operation. Supporting life cycle processes include documentation, configuration management, quality assurance, verification, validation, joint review, audit, and problem resolution. Organizational processes include management, infrastructure, improvement, and training. The five primary life cycle processes are divided into "activities," and the activities into "tasks”. Acquisition process includes activities that should be performed by software users and the process starts with the definition of the need to buy a software; supply process includes activities that should be performed by software suppliers, and the process starts with the decision to respond to a