想象一下,你是一个程序员,你在维护一个非常复杂的单体应用,它有几千万甚至几亿行的代码量,这个系统没有使用任何架构模式或设计模式,代码逻辑全部糅合在一起。
突然有一天,这个系统出故障了,不定期的在屏幕上打印:「烫烫烫烫烫烫烫烫」!
你如何来处理这个问题呢?
你只能先凭经验判断可能是哪里出问题了,然后再到那里找对应的代码,确定是否真是那里出问题了。为了验证你的想法,你可能还要打点日志,甚至是debug!
边查bug,你还会骂骂娘,哪个白痴写的代码?!哦,好像是我嘛~不对,不可能,肯定是谁用我的账 改的代码。。。。
但是,bug还没找到,这个现象又不见了。你是不是更郁闷?!
你可能会说,谁会维护这种代码?还不如重写!或者直接走人!如果真是这种软件系统,可能重写的成本要比维护的成本低得多。不过可惜,有个系统我们却没法重写,也没法撂摊子走人,那就是我们的身体!
我们的身体就是这么一个设计很烂的庞然大物!你只能耐着性子好好的维护!
会有这样的想法,主要源于我这两周的就诊经历。
慌恐的确诊之路
7月15日我老婆感觉右侧脖子不太舒服,一开始以为是落枕,没太在意。接着连续去健身房锻炼了三天,运动量比较大。
第四天(7月18日)开始出现心跳早搏现象,赶紧去 区医院检查,心电图没做出来什么,血常规正常(嗜酸粒细胞低),查了心梗三项也正常。不过发现发烧38度1。因为没查出来什么,自认为应该是锻炼练过了,回去歇歇就好,就回去了。
谁知道这只是开始。紧接着第二天,右侧脖子开始肿大、压疼,间断性的发热38度左右,发热的时候头疼得厉害。赶紧又跑了一家三甲医院检查,颈部CT显示颈肩有多发淋巴结,部分肿大,最大的有30*30mm,但是血常规基本正常(嗜酸粒细胞低),医生怀疑病毒感染,让回去吃点蒲地蓝和止疼药。
吃了两天没什么效果,又换了一家三甲医院做了胸部CT、尿检、血检、心电图,全部都是正常的。血常规里还是嗜酸粒细胞低。五官科检查不是腮腺炎。医生无法确诊,也不给开药,让去感染科看看。这时候感觉问题好像有点大了。
第二天赶紧去挂了一家三甲医院的感染科专家 ,专家看了初步判定也是病毒感染,让吃点伐昔洛韦。又回去吃了两天,头不疼了,但是发烧温度高了,达到了39度,感觉脖子好像好了一点。但是,吃药的第二天晚上发烧了一晚上。
一大早赶紧又跑到另外一家医院去,抽血、胸片、肝胆胰脾肾B超全部正常。医生也不能确诊,让做淋巴活检病理。老婆一咬牙就做了,切出来以后,医生说颜色不太好,建议做免疫组化。
老婆在做病理手术的当天没有发烧,第二天早晨又开始发烧39.4,一直烧到下午塞了药才好。
期间医院主任还带了七八个实习生过来问情况,我老婆说就是发热,精神挺好的。然后主任就跟那帮实习生说:「这就叫逍遥热,一般的感冒发烧,身体会很难受;而比较严重的病比如血液病、癌症引起的发烧,病人精神相对就比较好」!我说主任,你说这话的时候能别当着病人的面说吗?!
接着就是焦急的等待病理结果,等待期间几乎每天下午开始发烧,几个小时候后烧自己又退了。想想主任的话,心里怕怕的!
病理结果拖了两天才出来,期间滋味自行体会吧。结果是「坏死性淋巴结炎」!
你以为这就结束了?不是已经确诊了嘛,医生开点药吃吃就好了嘛!不好意思,并没有!
此病发病原因不明!发病原因不明!发病原因不明!
没有特效药!没有特效药!没有特效药!
靠自己扛过去!扛过去!扛过去!
是不是和上面的场景非常的类似?而且更加的惊心动魄!万一是个什么不好的病,那心情不可言表啊!
为什么确诊这么难?
两周的时间,我和老婆去了五家医院,花了大几千的检查费,最后还是挨刀子(而且是两刀!!!)做了活检才确诊。为什么医生不能快速确诊呢?
如果将我们的身体构造和软件架构做比较,你会发现我们的身体设计有很多地方是违背了我们所推崇的设计原则或最佳实践的。比如:
我们一个个的来说!
没有完善的错误码和日志
以发烧和淋巴结来说,发热和淋巴结肿大只是一种外在表现,说明我们的身体正在受到攻击,但是具体受到什么攻击呢?不知道!!!
因为引起发热和淋巴结肿大的情况非常的多!仅以淋巴结肿大为例!有细菌感染的时候,它肿大!有病毒感染的时候,它肿大!淋巴结核了,它肿大!白血病了,它肿大!转移癌,它依然是肿大!淋巴瘤了,它还是肿大!!!还有其它的一些病,像我老婆得的坏死性淋巴结炎、猫抓热、单核粒细胞增多症、成人Still症等等一堆(都是我这两周查资料查出来的。。。。)
我们可以回想一下,我们在发烧以后,去医院检查,医生都是让检查什么?血常规:
这是不是和我们找系统bug的方式很类似?查血常规就类似于打日志。
上面的情况就可能会输出下面的日志:
你有没有发现这样的日志其实意义不大,你无法准确的定位到具体问题在哪里?
但是假设,我们的系统的日志输出像下面这样:
这样的话,我们是不是只要看下日志,就能够直接确定是什么器官受到什么感染了?不需要再做其它检查了呢?
职责不单一
导致难以确诊的第二个原因就是器官的「职责不单一」!
基本上,我们身体上的所有器官的功能都不是单一的。比如淋巴系统,主要是防御外部侵犯的。但是它又有告警功能,比如肿大和疼痛!这会导致什么问题呢?无法区分淋巴结肿大,到底是其它器官受到攻击、还是淋巴自身受损。
假设淋巴结功能单一,只有防御外部侵犯的功能,告警则通过独立的告警系统进行处理。那么淋巴系统就可以独立的去杀毒,同时通知告警系统去进行相应的告警。再结合上面明确的日志信息,就可以快速的定位问题。例如:「200022,胃部正受到XX细菌感染」!
过度耦合
一般情况下,经过血常规确定细菌感染还是病毒感染,再针对性的吃点药、挂点水,大部分的发烧基本都能退了!但是如果还是不退就要做更详细的检查了。比如,我老婆的血常规就很正常,除了噬酸粒细胞低,其它都没有问题,所以医生看不出来到底是细菌感染还是病毒感染。也就没办法开药了!
为什么我老婆的这个病,血常规是正常的呢?其中一个原因就是我们的身体器官「过度耦合」了!
我们身体的所有器官都依赖于血液来提供养分的、同时依赖分布在全身的淋巴系统来抵御外部感染,血液和淋巴系统与其它器官有着千丝万缕的联系。所以当我们身体的某些地方出现了问题,我们从血液里就能看到一些反应。
但是呢,因为血液里的指标就这么多,改变方向就两个,要么升高,要么降低,表示不了几种病症,而且有的病症引起的反应可能会相互抵消。
比如:病毒感染会引起淋巴细胞的增多;而肺部结节可能会引起淋巴细胞的减少。那么假如一个人病毒感染的同时得了肺部结节,那么可能验血的时候,淋巴细胞就是正常的。
过度耦合导致的另一个问题就是癌症转移,我们一般都知道癌症转移后一般都比较难治。这就相当于一个子系统出现了问题,可能导致整个系统的崩溃!
假如,手、脚、头、身子是能够独立运行的子系统,他们通过突触(消息)来通信,那么是否可以限制问题扩散到整个系统中呢?也同时能限制癌症的转移呢?
隐性逻辑
在「从架构层面看设计模式」一文中,提到了「逻辑显化」这么一个词。意思就是不需要深入到具体的代码逻辑,从结构就能大致了解整体的业务逻辑。这里的「隐性逻辑」就是其反义词,就是说必须要深入到代码逻辑,才能清楚的知道具体的逻辑。
问题最大的还是淋巴系统。
我们可能都知道,要确认一个肿块是良性的还是恶性的,金标准是做病理!就是把这个肿块切下来,或取一部分下来,拿到显微镜下去看!
而淋巴确诊的金标准不仅仅是病理检查!还需要免疫组化!(穿刺的准确率不是很高,因为样本不足!)
为什么淋巴的病理需要活检+免疫组化,而不是单纯的活检就可以了呢?因为淋巴的癌细胞和其它癌细胞还不太一样!一般的癌细胞在显微镜下一眼就能看出来和普通的细胞不一样!而淋巴的癌细胞不同,显微镜下可能看起来和普通细胞没什么区别,需要通过实验的方式才能检查出来!而且淋巴瘤有70多种分型,只有通过免疫组化才能确定分型,然后才能制定具体的治疗方案!!!
这就像我们要对现 环境进行远程debug一样,对软件系统来说,这基本是无法容忍的!
那我们该如何设计我们的身体呢?
你稍微留心一下,就会发现到目前为止还有很多的病,我们还不知道发病原因是什么,以及如何治疗!像我老婆得的坏死性淋巴结炎,可能是病毒引起的,没有药物治疗,2-4周后自愈!
虽然我们的身体还有很多未知,但是我们还是能参考现有系统的设计,给出一个相对于目前来说好一点的设计。
比如说,我们的各个器官是否可以独立存在,即不需要血液的全身循环来提供养分?而是能在小范围的循环来自给自足?这就能避免血液与其它所有器官的紧耦合,避免大规模的系统问题,例如癌症转移!
再比如,我们的器官是否能够只负责独立的功能?胃就只负责消化、眼睛就只负责看、肺就只负责呼吸。当这些器官有问题的时候,通知告警系统来告警,而不是自己疼或者长包发炎!只要告警系统够完善,我们就可以从一个地方监控到身体的所有问题,而不是胃疼了做胃镜、眼睛出问题了查眼睛!
另外,器官与器官之间是否可以只通过消息来通信?同时消息是不可篡改的,这样是否既解决了病症转移的问题、也解决了耦合问题呢?
总结
这篇文章是这两周带老婆看病的感慨:「如果我们的身体真的是谁设计出来的,那此人/神绝对是个不合格的设计者,他把我们设计得太烂了!」
软件开发中那么多的架构模式、设计模式、最佳实践不是说说而已的,就是为了避免编写出像我们身体这样的烂系统!!!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!