from 1988. The numbers represent the typical cost of each phase. Software companies aim to deliver a high-quality product on time and under budget. A challenge is that
software development effort estimation is often inaccurate.
Software development begins by conceiving the project, evaluating its feasibility, analyzing the business requirements, and making a
software design. Most software projects speed up their development by
reusing or incorporating existing software, either in the form of
commercial off-the-shelf (COTS) or
open-source software.
Software quality assurance is typically a combination of manual
code review by other engineers and automated
software testing. Due to time constraints, testing cannot cover all aspects of the software's intended functionality, so developers often focus on the most critical functionality.
Formal methods are used in some safety-critical systems to prove the correctness of code, while
user acceptance testing helps to ensure that the product meets customer expectations. There are a variety of
software development methodologies, which vary from completing all steps in order to concurrent and iterative models. Software development is driven by
requirements taken from prospective users, as opposed to maintenance, which is driven by events such as a change request. Frequently, software is
released in an incomplete state when the development team runs out of time or funding. Despite
testing and
quality assurance, virtually all software contains
bugs where the system does not work as intended. Post-release
software maintenance is necessary to remediate these bugs when they are found and keep the software working as the environment changes over time. New features are often added after the release. Over time, the level of maintenance becomes increasingly restricted before being cut off entirely when the product is withdrawn from the market. As software
ages, it becomes known as
legacy software and can remain in use for decades, even if there is no one left who knows how to fix it. Over the lifetime of the product, software maintenance is estimated to comprise 75 percent or more of the total development cost. Completing a software project involves various forms of expertise, not just in
software programmers but also testing, documentation writing,
project management,
graphic design,
user experience, user support,
marketing, and fundraising. ==Quality and security==