软件设计的核心方法及实例解析

李连杰电影版《倚天屠龙记》里有个经典的名场面,祖师爷爷张三丰花了三分钟教张无忌太极拳,张无忌学成打败了对手。三丰爷爷的教学思路是这样的:爷爷演示太极拳让张无忌跟着练,边练边问张无忌记住了多少,等张无忌把所有的招式全都忘记了,就算出师了。

这和工作中一样,实际上做事需要处处体现章法,但是大家却不会经常把某事某事用到什么方法论挂在嘴边。都已经是内化了自然而然的思路。就好像边打架边念叨:白鹤亮翅、双峰贯耳…… ,说明还在一个初级的阶段。但是反过来是不行的,之前面试过一个高阶人员,问他什么什么事情是怎么处理的,有什么方法和原则。他回答全凭经验。这就好像不会功夫的人打架一样,和绝世武功内化成无招胜有招有天壤之别。

咱们来回顾一下一些经典的原则,然后用实例讲解这些是怎么内化成做事章法的。

面向对象的七大原则如下图,想了解SOLID原则的具体内容,可参考我之前写的《架构之思-分析那些深入骨髓的设计原则》

3b3cb739a006697678862f35d29db731.png

还有大家常常挂在嘴边的:高内聚低耦合,模块化、分层架构、积木化。其实这些原则核心就是:分解和组合。

在《righting software》这本书中,方法被定义为

方法=系统设计+项目设计

df81e7ab70fc83df05c2c6428abe73a4.png

顺便说一句,我这半年没怎么写文章,这段时间我把英语能力提高到了雅思7.5的水平,没有实际参加考试,在家自测的。现在看英文书籍真流畅。

系统设计是总体蓝图,项目设计是系统设计的分解,还是一样的思想。下面来看这个思想怎么用。

假如咱们是做金融收单的。就是说咱们的业务是上游有人请求咱们,咱们把请求的数据落库,落库的数据就是单据。然后咱们请求下游进行实际处理。

刚开始的时候,咱们只对接了支付宝,开发小哥哥快速上线,把系统做成了这样:

a399097a3a238bc246a469135d391830.png

开发小哥哥是有分层的,但是没有考虑扩展。一旦对接方发生变化,比如增加了微信支付。但是支付宝量已经比较大了,怎么办呢?老系统放着不动,新设计一个扩展性更强的,承接新业务。或者一开始设计成这样:

a5837d02b12c75e654528f21ee57c9ac.png

增加微信的话,就好办了:

f96d76db1d9abf04ec56c28554157447.png

设计成标准接口,接口是更面向核心的,要想清楚我要什么,而不是别人有什么。想想迪米特法则,支付宝是一个实例,接口定义要减少对实例的依赖。同时接口要满足开闭原则,对修改关闭,但是可以扩展成对接多样化的下游。

咱们的业务越做越大,下游增加了人行。人行不同于微信和支付宝的http接口,它用的是MQ。设计就变成了这样:

d80141fabd90af0b22c971f7ec30cdcb.png

这时候客户提出了需求,我原来是对接支付宝的,我不愿意太多改动,就想换个接口地址了事。因为这是个战略性的大客户,得满足啊。所以设计就变成了这样:

e9474cd4a93c26c41739916a8759fbe0.png

业务越做越大之后,数据要进行分析、清洗,又要购买一批设备了。而之前这一整套处理主要在通信,是IO密集型的。而数据处理主要耗CPU,怎么能有效利用资源呢?逻辑上不能耦合了,物理上可以有效利用,这就用到了容器技术。

以上是简略示意项目设计怎么演变成系统设计的。在公司里,可能没有人要求你这么做,但是想做好必须要做的事就是尽量多的去了解大的架构,部门的、事业群的、整个公司的。利用逆向工程自己做出尽量大的架构图。

咱们在一步步扩展的过程中,最初的模块改动很少,一般是在外围做扩充。这也是公司发展的一般思路,核心就是分解和组合的模块化思想。

之前有人说的:面试造航母,工作拧螺丝。实际老板并不希望你拧螺丝,而是希望你把自己的模块做好之后,来cover更大的模块。很多时候人自身的发展取决于对自身的定位。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值