Numerous software engineering processes have been developed with the primary goal of increasing the quality of software created. In earlier times, and even in many cases today, software was simply hacked out without much thought given to design and testability. Today, most good software engineers practice a thorough process that helps them create software that meets the needs of the customer.
The most widely known and used process is the "waterfall method". It is called the waterfall method since the process is composed of several phases in a fixed sequence, much like how water might flow down various rocks in a waterfall. The biggest weakness of the waterfall method is that it can be very difficult to get everything right the first time.
The first phase is the requirements-gathering phase. Requirements state how the software will behave and any requirement should be capable of being tested. A simple example would be, "the software will allow the user to enter a name for an account". Requirements are taken directly from the customer or stakeholder, who describes how the software should behave. A good software engineer will gather thorough details about the product so nothing is missed. It is often a good idea to go over the final requirements with the customer to make sure that everything is correct and covered.
Once requirements are developed, the next phase is design. During design, the software engineer determines what technology (languages, platforms, etc.) will allow the creation of software that fits the requirements. Some languages are better than others for certain purposes and this is an important factor to consider. The design phase also typically consists of determining what objects will be used in object-oriented programming and developing a UML diagram of the classes with their member functions and variables. In many cases, the design phase is the most difficult phase of the software engineering process and makes implementation easy.
The next phase is implementation of the design. This typically consists of setting up the project in and IDE and writing the code. In some cases, you can derive a class structure from the UML diagram using automated programs like Rational Rose to decrease implementation time. Implementation is the grunt work.
After implementation, the testing phase begins. Tests are developed based on the requirements, ensuring that every requirement has a corresponding test case. After developing the test, the test is performed and any bugs are fixed. Although the waterfall method intends for no bugs to be present, it is highly unusual for software to go through all the phases in a linear fashion with no bugs.
Finally, after testing, the software is released to the customer. Often the customer will have complaints, requiring further design, implementation, and testing. However, ideally the waterfall process will be entirely linear, with no oversights or bugs, but unfortunately the reality is that essentially every project has bugs or misses a requirement.
Other processes have since been developed, including the iterative development process. In iterative development, small changes are made at a time to the software, followed by testing. This process is intended to make development more efficient by taking care of bugs sooner when the code is fresh in the engineer's mind. If you wait to do testing until after all of the coding is done, you may end up with hundreds or thousands of bugs that take a long time to work out. Iterative development is the basis of the Agile method.
Despite the development of newer processes, most software teams continue to use the waterfall method, simply because it generally works well as long as it is done carefully. Additionally, the Agile iterative development method does not work well with certain types of projects. It is likely that the waterfall method will remain the most commonly used for the foreseeable future.