我为什么开始看供应链相关的书
背景
确实是一个挺奇怪的问题,我在大学期间没有学过供应链相关的知识,工作之后做的事也跟供应链没有关系,但是最近我却开始看供应链相关的书了。
最近看的这本书叫《采购与供应链管理》。看这本书的源头其实是因为我发现在我工作虽然与供应链无关,但是有很多相关的知识点的名词属于供应链以及生产相关的术语,于是令我感到有点好奇。
在这么些年工作和学习中,不难发现软件工程现有的很多概念,都是从工业时代发展的优秀实践中借鉴过来的,例如近几年的Devops
,精益
等等思路,其实都是工业时代落地的很成熟的实践。那么工业时代非常非常重要的供应链管理,是否也有很多有价值的处理方式可以借鉴呢?
关系?
从狭义上来说,或者说从正常人的理解上来说,计算机行业确实与供应链毫无关联,但是我认为从广义上来说,是有一定关联的,并且在某些程度上,软件工程里面的很多行为,都是供应链相关活动的抽象。 举个例子,在做环境治理的时候,需要收集服务的二进制文件,配置等相关内容,存放这些东西的地方我们叫它“物料仓库”,“物料”这个词明显就是供应链相关的概念了。所以如果从广义上去理解的话,确实可以说二者是有关联关系。
从整个软件工程的实践来看,确实是有很多已经被借鉴的地方了,例如供应链强调信息流和商品流的一致性,而软件工程同样也强调数据的一致性。供应链中强调原材料模块化和标准化,在软件工程中同样强调模块化和标准化。描述的对象不同,但是核心思路是一样的。
分享一个例子
在最初接手环境治理平台相关工作的时候,整个环境治理一片混乱,所有的人听到有环境问题就本能的畏惧。工程的复杂度本就比较高,再加上没有做很好的进行归纳整理,前一任负责人基本上每天都在到处“救火”,每天看起来非常繁忙,实际上并没有多少产出,仅仅是体力活罢了。 我们接手之后进行了一下基本的分析,总结起来其实就是几类问题。
- 二进制未更新引起的
- 二进制与配置不匹配引起的
- 路由过期引起的
- 业务数据不正确引起的
- 其他问题
- 业务实时链路过长
问题归类了,就一个一个解决就好了。
个性化问题
5这种基本上属于很个性化的问题,总体量少,遇到一个处理一个就好了,不是特别占工作时间。遇到了直接处理,如果能归类的,再进行归类后分析处理。
链路问题
6这种属于整体的链路问题,在软件工程中,我们总是会做一些很蠢的事情,如果跟实际映射起来就会发现这些设计真的是非常不靠谱。
原本的流程是开发起容器的时候,实时的去拉取二进制,配置,构件依赖环境,再打包成镜像,最后才是起容器。这一套流程下来10分钟左右的耗时看起来好像是能接受的。
但是我们把这个场景映射到现实生活中来看,简直是愚蠢至极。
开发起容器实质上就是使用一个镜像。我们可以把这个镜像看成交付的商品,就像我们开一家店,卖的商品是牛肉粥。按照之前的设计,相当于是客户到店点了一碗牛肉粥,这个时候店家才去杀牛种稻子,等牛杀完了,稻子成熟了,再煮成牛肉粥。这个方式任何一个人看了都会觉得不可行,但是由于计算机的计算速度极快,这个很离谱的链路花的时间总体也还可控,因此这种设计就被实现了出来。
解决方案参考常识即可,买好牛肉煮好粥,当客人要点牛肉粥的时候,直接把牛肉和粥放一起煮熟了即可。这个思路放到我们的环境治理的时候,就是提前打好镜像,开发要起容器的时候直接用现成的镜像起容器即可。
原材料问题
123这三类问题,从本质上说,就是供应链中的原材料的问题,还是按照前面的牛肉粥的例子来说。这些问题其实就是牛肉粥的牛肉变质了,粥变质了,所以客户没办法吃了。
按照常识来看,客户的牛肉粥变质了,那么店家解决问题的方法其实就是: 给客户一碗新的牛肉粥。
这个解决方案对应到前文的案例,其实就是某个容器有问题了,那么就新建一个容器给开发。
从常识来看这些问题,好像都很简单,但是实际上我们做的事情完全不符合常识,之前的维护人员就在不停的修容器,例如去人工更新二进制文件,人工更新配置文件。把这个行为放到牛肉粥这个例子来看,就是这碗牛肉粥有问题了,就先去排查是牛肉有问题,还是粥有问题,发现问题(比如牛肉过期了,但是粥没问题)之后,就把过期的牛肉剔出来,用原来的粥再加新鲜的牛肉去煮。这明显就是不合理的处置方式。
上面的处理方式不仅花了很多时间(先要定位问题,找到问题之后再修复)而且效果不好(变质的牛肉粥换新鲜的牛肉重新煮一遍,是个人都不会满意)。在顾此失彼的“灭火”行动中,把自己所有的精力都浪费了。
商品多样性的问题
开发由于使用习惯的问题,有很多看起来很奇怪的要求,例如有些开发希望环境维护人员要维持二进制配置等信息最新,有些开发希望环境人员啥都不管,他自己全部包办了所有。还是以上面的牛肉店为例子,本质上还是牛肉粥,只不过有些需要辣一点,有些需要咸一点。解决方案就是我提供辣椒酱和盐这两种调味料,这个解决方案很简单,任何人都能想得到,但是放到我们的环境上,则产生了很奇怪的做法。
原来的做法就是纯人工去处理,就像上面介绍的那样,每当有问题的时候就人工去更新。成本高的同时,还不能提前发现问题。就像客人需要吃辣一点的牛肉粥,店家就把牛肉粥拿回厨房放辣椒,放了之后再拿回去。实际上只要提供辣椒酱,让客人自己放即可。
原材料是固定的(二进制
、配置
和路由
)。这些原材料最终提供一个商品(镜像),最终起容器的时候还会有一个运行环境。而如果需要多种多样的特性,可以给他们调料(路由包,配置包等),他们需要的就自己加。在供应链中这种基于标准间拼装的设计,会便于整个供应链的管理,同样的对于软件工程来说,也是一个比较好维护的设计。
库存问题
还是以牛肉店为例,牛肉店每天都要进货,要备足牛肉和大米,按照原材料的特性来分类,大米是可以存放一定周期的,而牛肉不行,如果过量的进牛肉,卖不完就浪费了。
我们的环境也是同理,原材料(二进制
、配置
和路由
)虽然没有过期这种说法,但是大量囤积会占用库存成本,在降本之前,我们都忽略了这个问题,导致我们的仓库存储了5T+的数据,在精简之后,仅保留了10G+的数据。
原材料加工问题
从上面的库存问题衍生过来,在库存的时候,我们准备的是牛肉和大米,而不是牛肉和粥。很明显,常识上就能知道库存不会是牛肉和粥,因为大米可以存放很久而粥不行,所以我们存放的原材料尽可能的原始,这样就能方便后面的任意加工。比如牛肉店业务发展了,现在要提供牛肉饭和牛肉粥,那么库存不需要变,只需要在大米的处理上做一个额外的工序即可。
在软件工程相关的设计上也是如此,我们很多时候都是从仓库(数据库)直接拿数据然后实时计算后再返回,在设计数据库存储数据的时候尽量原始,不要有额外的加工,由于计算机速度快,因此数据处理成本是很低的。即使在一些特殊的情况下,计算速度不够的时候,也可以引入缓存来解决计算和IO的瓶颈。
启发
在软件工程的设计上,我们常常由于计算机的计算速度这种因素设计了很多反常识的设计。后续在设计思路上,可以参考供应链中的一些思路,规避一些无意义的工作投入,减少那种反常识的设计。