李连杰电影版《倚天屠龙记》里有个经典的名场面,祖师爷爷张三丰花了三分钟教张无忌太极拳,张无忌学成打败了对手。三丰爷爷的教学思路是这样的:爷爷演示太极拳让张无忌跟着练,边练边问张无忌记住了多少,等张无忌把所有的招式全都忘记了,就算出师了。
这和工作中一样,实际上做事需要处处体现章法,但是大家却不会经常把某事某事用到什么方法论挂在嘴边。都已经是内化了自然而然的思路。就好像边打架边念叨:白鹤亮翅、双峰贯耳…… ,说明还在一个初级的阶段。但是反过来是不行的,之前面试过一个高阶人员,问他什么什么事情是怎么处理的,有什么方法和原则。他回答全凭经验。这就好像不会功夫的人打架一样,和绝世武功内化成无招胜有招有天壤之别。
咱们来回顾一下一些经典的原则,然后用实例讲解这些是怎么内化成做事章法的。
面向对象的七大原则如下图,想了解SOLID原则的具体内容,可参考我之前写的《架构之思-分析那些深入骨髓的设计原则》:
还有大家常常挂在嘴边的:高内聚低耦合,模块化、分层架构、积木化。其实这些原则核心就是:分解和组合。
在《righting software》这本书中,方法被定义为
方法=系统设计+项目设计
顺便说一句,我这半年没怎么写文章,这段时间我把英语能力提高到了雅思7.5的水平,没有实际参加考试,在家自测的。现在看英文书籍真流畅。
系统设计是总体蓝图,项目设计是系统设计的分解,还是一样的思想。下面来看这个思想怎么用。
假如咱们是做金融收单的。就是说咱们的业务是上游有人请求咱们,咱们把请求的数据落库,落库的数据就是单据。然后咱们请求下游进行实际处理。
刚开始的时候,咱们只对接了支付宝,开发小哥哥快速上线,把系统做成了这样:
开发小哥哥是有分层的,但是没有考虑扩展。一旦对接方发生变化,比如增加了微信支付。但是支付宝量已经比较大了,怎么办呢?老系统放着不动,新设计一个扩展性更强的,承接新业务。或者一开始设计成这样:
增加微信的话,就好办了:
设计成标准接口,接口是更面向核心的,要想清楚我要什么,而不是别人有什么。想想迪米特法则,支付宝是一个实例,接口定义要减少对实例的依赖。同时接口要满足开闭原则,对修改关闭,但是可以扩展成对接多样化的下游。
咱们的业务越做越大,下游增加了人行。人行不同于微信和支付宝的http接口,它用的是MQ。设计就变成了这样:
这时候客户提出了需求,我原来是对接支付宝的,我不愿意太多改动,就想换个接口地址了事。因为这是个战略性的大客户,得满足啊。所以设计就变成了这样:
业务越做越大之后,数据要进行分析、清洗,又要购买一批设备了。而之前这一整套处理主要在通信,是IO密集型的。而数据处理主要耗CPU,怎么能有效利用资源呢?逻辑上不能耦合了,物理上可以有效利用,这就用到了容器技术。
以上是简略示意项目设计怎么演变成系统设计的。在公司里,可能没有人要求你这么做,但是想做好必须要做的事就是尽量多的去了解大的架构,部门的、事业群的、整个公司的。利用逆向工程自己做出尽量大的架构图。
咱们在一步步扩展的过程中,最初的模块改动很少,一般是在外围做扩充。这也是公司发展的一般思路,核心就是分解和组合的模块化思想。
之前有人说的:面试造航母,工作拧螺丝。实际老板并不希望你拧螺丝,而是希望你把自己的模块做好之后,来cover更大的模块。很多时候人自身的发展取决于对自身的定位。