Software design is an iterative process that transforms software requirements into a structured internal model, producing a Software Design Specification document which serves as a foundation for code development. There are two levels of design: high-level architectural design that outlines components and their interactions, and detailed implementation design that specifies coding requirements for each component. Effective design emphasizes modularity, cohesion, coupling, and adherence to design principles to ensure the software is maintainable, understandable, and meets user requirements.