Design is vital to sustainable development because in order for software to last over the long term, it must be well designed. The problem, however, is that design is hard. There is a dilemma that every project faces and that is knowing when to design up-front and how much effort to invest in up-front design versus letting the design emerge. Good design practices should stress finding a balance between up-front and emergent design and emphasizing a collaborative design process that is not built around heavy requirements for documentation of the design.
I believe it is important to start with a vision and guiding principles for the design. These are the goalposts that team members must consider every day as they make tradeoffs. From there, the design practices should stress design iteration, constant change, design visibility, and collaboration. Mistakes are inevitably made, where software is over- or underdesigned. Software teams should rely on a focus on simplicity and a desire to avoid duplicated effort plus teamwork, knowledge, experience, and collaboration to reduce the number of mistakes and their severity. It is vital that design mistakes are fixed as quickly as possible, the appropriate lessons are learned, and then the team moves on. It is also critical that the team has the guts and instincts to make difficult decisions, such as to rearchitect before the cost of change becomes too high.