Software design is the process which translates the requirements into a detailed design representation of a software system. Good software design is a key to produce reliable and understandable software. To support software design, many techniques and tools have been developed. In this paper, important techniques for software design, including architectural and detailed design stages, are surveyed. Recent advances in distributed software system design methodologies are also reviewed. To ensure software quality, various design verification and validation techniques are also discussed. In addition, current software metrics and error-resistant software design methodologies are considered. Future research in software design is also discussed.Index Terms-Design methodologies, design representation, design verification and validation, distributed software system design, errorresistant software design, software design technique, software metrics.