怎样做好软件的架构设计

 

      设计软件架构的人一般被称为软件架构师,软件架构师也是很多程序员的技术发展方向(程序员也可以作管理),然后对于软件架构师来说怎样才能设计好一个软件架构呢?

      首先,明白软件架构的意义。对于软件(软件,包括产品型以及项目型)来说,架构是其骨架,如果架构不好的话,那么就如同一个人得了软骨病,其命不久。为了我们的软件能够活的更久、为了我们的软件更强壮,撇开业务不说,架构是其核心。

      其次,做好构思和需求调研。任何软件存在的目的是为了解决业务的问题,为业务服务。软件架构依附于具体业务,如果业务方面搞错的话再好的软件也没有意义,那么其软件架构也就没有了存在的价值了,当然这样的架构或许存在研究的价值。

      如论是MSF中的Envision阶段还是UP中Initialize阶段,都强调了构思。构思的目的在于讨论该软件有没有价值以及构思如何来实施该软件。对于项目经理来说,构思的一般是项目的计划、怎么去实施、项目资源等。对于架构师来说此时需要构思软件的整体架构,是采用B\S、C\S,还是Smart Client或者是混合方式。当然不管是哪一种架构其核心都来至于客户的需求,根据客户的具体业务情况来定义。对于大多数情况客户可能已经定好一种架构风格,例如B\S,此时架构师需要做的就是怎样根据业务更好的实现该架构。

      第三,关注软件的非功能性需求。非功能性需求是一个软件是否优雅的重要体现。资深架构师与非资深架构师的主要区别就在于对软件非功能性的处理。软件架构的主要体现也在于非功能性需求方面。

      那么什么是软件的非功能性需求呢?非功能性需求主要指:安全性,可扩展性、可靠性、可用性、性能、用户体验、区域化支持等。

      安全性一般分为程序安全、系统安全、数据安全。程序安全是指开发的程序是否是安全的,程序上有没有安全的漏洞,例如Web开发中服务器代码没有对输入的参数进行验证,从而导致客户端机器人轻易的获取数据。系统安全指的是系统整体的安全,例如安全的粒度,未经授权的用户是否可以轻易的访问非法的数据等。数据的安全是对数据的保护,数据库中数据有没有做审核,用户之间是否会跨数据等。

      可扩展性指的是当系统达到瓶颈的时候怎样在不修改代码的情况下提供系统的负载能力,扩展一般分为Scale UP和Scale Out。一般我们会综合运用UP和OUT。例如,增加服务器的性能可以提高系统的处理能力,但是任何计算机都有有一定的瓶颈,当增加服务器性能不能提高系统性能的时候我们就考虑横向的扩展服务器,也即Scale Out。在Scale Out时一般需要我们的系统是状态无关的,即Statless。

      可靠性一般可可用性成对出现,可靠性考虑的是系统是可靠的不会Crach掉,可用性指的是系统即使Crash掉系统也能在很短的时间内能够自己复活或基于Cluster技术来转移到别的服务器继续的提供服务。

      性能一般会和可扩展性在一起,当性能不能满足的时候就需要可扩展性,提高系统性能一般通过减少用户的请求数、请求数据量、Cache,数据库的性能通过Index,Hash Table等技术。

      第四、整体设计。由于任何的软件都会有Dead Line。所以架构师在分析完系统的功能需求和非功能需求后,就需要和PM进行讨论。根据时间项目的资源、结束时间来综合的考虑架构设计。在架构设计时需要考虑:1、技术风险,新的技术尽量不要使用。2、人员,人员的流动、人员的水平。3、开源思想,在架构中尽量的吸收一些开源的思想。

posted @ 2009-07-02 22:23  agaric  阅读(1004)  评论(0编辑  收藏  举报