软件设计的原则有哪些