经过软件工程概论、软件需求工程、软件测试、软件过程管理这一系列的软件核心课程的学习,对软件这个词刚刚有了初步的了解。印象最深刻的就是要以用户为中心,因为只有真正了解了用户的需求,站在用户的角度去开发软件才能取得最好的效果。碰巧的是,在架构漫谈这一系列的博文中,也是一直在强调寻找问题的所在,寻找问题的主体,只有把问题的主题找到才能试着去寻找最佳解决方案;反之,如果看到客户需求之后,一上来就找到一大堆解决方案,往往会迷失方向,从而忘记问题的根源所在,出现在中期阶段将所有完成的工作全部推翻这种情况。通过这几篇文章,谈一下自己对软件架构的理解。
软件大多是给人来用的,而由于人对目标系统有越来越高的要求,比如说QQ这款大家最常用的软件,它从一开始只有单纯的社交功能,到现在丰富的视频聊天、QQ钱包里买电影票、交话费等功能。而这个时候,传统的软件开发模式想必已经完成不了对这个庞大的系统开发,需要站在架构的高度将它进行进一步的拆分。本着用户至上的目的,在收集客户需求后进行分析确定业务目标来对任务进行划分。在网上找到的数据显示,腾讯的技术方面大概分为互动娱乐、移动互联网、网络媒体、社交网络、技术工程几个部分,虽然不太知道这几个部分之间是怎么联系组合起来的,但是这几个部分的划分是很明显的。这样把开发团队进行划分就会使工作人员各司其职,发挥自己的长处来使软件开发进展地更好。
对于切分这项工作,需要做到责任和义务的均衡,本着这个原则,尽量使得每个利益相关者(stakeholder)的权责对等。当然为了使效率最大化,最好使架构的划分结果层数少一点,就好比一个项目经理,分管几个部门经理,如果再有很多很多级别的话,高层的真正想法会很难传达到下层,造成信息失真。
然后,对于软件来说,它就像是模拟人生活的一种方式,著名的邱琦-图灵论题说到:一切视觉上能行可计算的函数都可用图灵机计算,反之亦然。好比是ATM机就是在模仿人们在银行里办理的存取款、转账等一系列的业务流程。仔细分析的话,这个嵌入式的小软件的每一个小的业务流程都可以一一列举出来,那就跟人真实的操作是一样的。其次,在完成这个软件系统的时候,最重要的就是交互、业务和数据的分离。我们学的SSH框架,MVC理念等一系列的技术应该都是为了将这个分离进行实现和完善。因为当数据变得非常非常大的时候,如果不能做到将数据和业务关系分离的话,必然会使系统无限的膨胀,难以维护甚至造成瘫痪。而如果业务和与用户的交互不能分开,那业务稍加变化系统前台就会有很大的变化,这显然不能满足用户的实际需求。
总之,架构就是首先明确用户的需求,即明确要解决的问题以及其主题,这时相当于完成了很大一部分工作;然后提出解决问题,对整个软件系统进行合理的拆分,再利用特定的模式将其有机地结合起来进而完成软件的设计的过程。