初做系统设计,积累一些心得,大家一起讨论。
1、 关于需求:
初做系统设计,容易先入为主,收集需求的时候就考虑人力,技术等原因,在很前面的就把某些功能砍掉。
如果这样分析问题,整个系统就没有全貌,容易出现需求遗漏,设计不清楚,整个系统不完全,后续无法扩展。
A、 收集需求时,应该梳理系统全景图,业务场景,输入,输出,流程描述等。
B、 尽量用客户的语言,而不是抽象后的设计语言。用客户化的语言方便和客户做需求澄清,同时避免过早提炼设计导致需求变形。
C、 做需求排序。
D、 需求收集清楚后,映射到具体的系统架构/功能组件上,评估工作量。
E、 工作量评估出来之后,根据工作量和需求排序裁剪功能和需求。
2、 关于系统架构:
A、 需求澄清之后,抽象成系统架构,常用UML,0/1层架构图等工具。
B、 根据需求列出功能全景。
C、 列出关键技术点。
D、 做竞争分析,业界是否有开源项目分析。
E、 对业务在做系统架构时,对功能和技术要做足够的抽象,抽象层次不充分,后续考虑系统的扩展性会极大受限。
3、 技术选择:
选择合适的技术,这块需要经验积累。有经验积累才了解每种技术的优劣以及和业务的适合度。而同时因为设计师本身对某项技术有积累,而倾向于选择熟悉的技术。
这块建议重点参考业界经验。每项技术有优势,也必然有坑。
A、 编程语言方面:
对系统性能要求高,优先考虑C/C++。
企业级应用,优先考虑JAVA。
要求快速开发,可以考虑PYTHON。
B、 组件/框架:
各种开源框架很多Spring,OSGi,MVC,ESB等。
要充分考虑系统的扩展性,选用成熟的组件框架。这块对于JAVA程序员来说,比较容易理解,C/C++程序员需要转变思路。
C、 系统
选择比较少,一般就是windows/linux,而且往往根据系统的应用很早就确定了。如果要支持多系统,就要考虑代码移值性,越是高级预言,一般来说,移值性越好。
4、 编码:
业界这方面很多思想,如
A、 面向接口编程
B、 组件化/模块化
C、 设计模式
D、 开放封边原则
归根结低,就是要足够抽象,足够开放,足够易扩展。
另外一个原则是在系统设计的时候就要充分考虑编码问题,以及代码框架,风格等。
1、 关于需求:
初做系统设计,容易先入为主,收集需求的时候就考虑人力,技术等原因,在很前面的就把某些功能砍掉。
如果这样分析问题,整个系统就没有全貌,容易出现需求遗漏,设计不清楚,整个系统不完全,后续无法扩展。
A、 收集需求时,应该梳理系统全景图,业务场景,输入,输出,流程描述等。
B、 尽量用客户的语言,而不是抽象后的设计语言。用客户化的语言方便和客户做需求澄清,同时避免过早提炼设计导致需求变形。
C、 做需求排序。
D、 需求收集清楚后,映射到具体的系统架构/功能组件上,评估工作量。
E、 工作量评估出来之后,根据工作量和需求排序裁剪功能和需求。
2、 关于系统架构:
A、 需求澄清之后,抽象成系统架构,常用UML,0/1层架构图等工具。
B、 根据需求列出功能全景。
C、 列出关键技术点。
D、 做竞争分析,业界是否有开源项目分析。
E、 对业务在做系统架构时,对功能和技术要做足够的抽象,抽象层次不充分,后续考虑系统的扩展性会极大受限。
3、 技术选择:
选择合适的技术,这块需要经验积累。有经验积累才了解每种技术的优劣以及和业务的适合度。而同时因为设计师本身对某项技术有积累,而倾向于选择熟悉的技术。
这块建议重点参考业界经验。每项技术有优势,也必然有坑。
A、 编程语言方面:
对系统性能要求高,优先考虑C/C++。
企业级应用,优先考虑JAVA。
要求快速开发,可以考虑PYTHON。
B、 组件/框架:
各种开源框架很多Spring,OSGi,MVC,ESB等。
要充分考虑系统的扩展性,选用成熟的组件框架。这块对于JAVA程序员来说,比较容易理解,C/C++程序员需要转变思路。
C、 系统
选择比较少,一般就是windows/linux,而且往往根据系统的应用很早就确定了。如果要支持多系统,就要考虑代码移值性,越是高级预言,一般来说,移值性越好。
4、 编码:
业界这方面很多思想,如
A、 面向接口编程
B、 组件化/模块化
C、 设计模式
D、 开放封边原则
归根结低,就是要足够抽象,足够开放,足够易扩展。
另外一个原则是在系统设计的时候就要充分考虑编码问题,以及代码框架,风格等。