Successful software design is the process of solving a problem or a collection of problems through the use of structured analysis and planing. In it's purest theoretical form it is not tied to a specific implementation method or platform, although in a real-world environment many pratical issues need to be taken into account by the designer to account for the standards, platforms, technology and experience of the staff in creating a design solution.
The first step in our software design methodology is the most important from our perspective. It's really a question of good project management - performing domain-analysis, defining stakeholders, defining goals and writing very generalized requirements and specifications. Why not specific requirements and specific specifications (is that an oxymoron?) We'll get to that. But it is important to know at this point what are the general goals, who are the people involved and for which platform will this be running on. We will be specifying the software during the course of the project.
When the project increases in size, it is best to use a interative development process to guarantee the project's success. Iterative development is the process of breaking down a project into initially one smaller project with a short term delivery date - such as 4 weeks. This small project is called an interation. The interation is defined through determining which issues involved are the most critical - from a business and technology standpoint. This interation is designed, implemented, tested and delivered to the stakeholders. After the interatition is completed, the next interation is planed on the basis of the experience gained from the first interation. In this manner, it is possible to adjust and react from the knowledge won from the previous interation and to react to changing requirements and business needs. Each "version" of the software is completely tested and while it may not meet the project's long term goals yet, the software features stability, quality and features which are the most important to the customer.
This may initially seem counterintuitive, but don't underestimate the chance to react! In the waterfall model ("I will specify everything before I begin to work"), risks, changes in the business model, misunderstandings and a plethorea of other influences almost guarantee that the software which results is not what the business needs. In the interative process, the project is constantly readjusted to current needs and priorities - increasing value to the customer and reducing risk.
The process of software design depends also on the scope of the problem being addressed. In smaller projects, a development process following the "waterfall" model may be superior to agile development, especially in a relationship between customer and consultant, where a very specific problem needs to be solved in a short time-frame. Ok, such a project could also be looked upon as interative development with one interation.