All software construction involves essential tasks and accidental tasks. — Frederick P.Brooks,Jr 《No Silver Bullet》 译:所有软件构建都包含其本质部分与偶然部分。
业务的复杂
Frederick P.Brooks,Jr在1975年写下了软件界的一本著作The Mythical Man-Month,国内也巧妙的译为人月神话。书中提到软件的复杂度包括本质复杂度和偶然复杂度。本质复杂度就是在解决问题时,无论如何都必须要面对的复杂度;而偶然复杂度,是由于选用的做事方法不当,导致额外增加的复杂度。我们不否认在交易场景、订单场景、支付场景等,可能天然存在非常复杂的业务逻辑,但同样也并非所有的系统都像淘宝天猫一样复杂。随着业务的分拆,组织职能的划分以及微服务的普及,我们面临的问题与场景越来越小越来越聚焦。业务的复杂性天然存在,当我们看着那捉摸不透宛如天书的功能代码时,我们试问一下自己的业务是否真的有那么复杂。
系统的混乱
Despite all their heroics, overtime, and dedication, they simply aren’t getting much of anything done anymore. All their effort is now consumed with managing the mess. — Robert C.Martin 《Clean Architecture》 译:不管你们多敬业、加多少班,在面对烂系统时,你仍然会寸步难行,因为你大部分的精力不是在开发需求,而是在应对混乱。
Simplicity has been difficult to implement in modern life, because it is against the spirit of a certain brand of people who seek sophistication so they can justify their profession. — Nassim Nicholas Taleb 《Antifragile:Things That Gain from Disorder》 译:在现实生活中,简单的做法一直难以实现,因为它有违某些努力寻求复杂化,以证明其工作合理性的人所秉持的精神。
为什么大家更偏向复杂而远离简单,除了缺少思考,找不到问题的核心解以外,还有一个重要原因就是为了所谓的“证明自己”。Nassim Nicholas Taleb在Antifragile:Things That Gain from Disorder中提到一个观点:在现实生活中,简单的做法一直难以实现,因为它有违某些努力寻求复杂化,以证明其工作合理性的人所秉持的精神。如同DDD在中小系统所带来的灾难一样,根本原因更多是因为大家并不愿意承认自己的系统是中小系统,自己所承接的业务是偏向简单的业务。最终导致简单的模块赋以复杂的束缚,最终效率被工具本身所制约。曾经我们有一个搜索器增量推送的诉求,当时用的blink来支持,blink支持海量数据处理,分布式集群能力等等。而我们本身并没有海量数据,也没有超高并发,最终上线后不仅用不上blink超强的能力,还因为blink的性能调优、自定义函数异常、类型转换异常、资源申请及降级,以及为新人带来的认知负荷等等,带来了更大的不便。后面通过手写JAVA,调用搜索器增量推送SDK的方式进行重构,简单清晰,查问题成本也更低。当然,将blink画到PPT里,那确实还挺高大上的。‘复杂’总是伴随着光环,当我们解决一个复杂问题后,我们会得到更多人的肯定,向大家证明和展示自己的实力。而简单往往更‘暗淡’,如同上文提到的互换瓶盖,大家并不会因此认可服务生的能力,甚至觉得也没什么大不了。如此往复,让大家更青睐复杂,更远离简单。
『简单』其实更复杂
Simple can be harder than complex: You have to work hard to get your thinking clean to make it simple。 — Steve Jobs 译:简单比复杂更难,你必须尽力理清思路才能做到简单。
Keep it Simple and Stupid — Robert S. Kaplan 译:保持简单和笨拙
KISS原则是Robert S. Kaplan提出的一个理论,Kaplan并非是一个软件学家,他是平衡积分卡 Balanced Scorecard 创始人,而他所提出的这个理论对软件行业依然适用。把事情变复杂很简单,把事情变简单很复杂。我们需要尽量让复杂的问题简明化、简单化。KISS原则的实现看似简单,但实则并不容易。以最简单的做法完成任务,但不断引入复杂度并腐化系统的做法,被John Ousterhout教授称之为「战术龙卷风」。当你不断打着KISS原则的旗号,以最简单的做法堆叠功能时,最终会得到一个终极复杂体。软件设计是一门艺术,前人的经验可以给我们提供前进的方向,但我们也一定要时刻有自己的判断。
UNIX的艺术
1974年UNIX系统在Communication of ACM上发表,正式向外界披露了UNIX系统。UNIX的成功也诞生了诸如Linux、BSD、Solaris、MacOSX等多个UNIX变种。UNIX奠基人之一的Doug Mcllroy曾经说,UNIX的设计理念就是一个程序只做一件事,并做好。
All the philosophy really boils down to one iron law, the hallowed ‘KISS principle’ of master engineers everywhere. — Eric Steven Raymond 《The Art of Unix Programming》 译:所有的UNIX哲学浓缩为一条铁律,那就是各地编程大师们奉为圭臬的KISS原则。
UNIX的哲学根本,就是一部在持续践行KISS原则的卓越工程。『维护如此重要而成本如此高昂,在写程序时,要想到你不是写给执行代码的计算机看的,而是给人–将来阅读维护源码的人,包括你自己』–The Art of Unix Programming
遗失的奥卡姆剃刀
Entities should not be multiplied beyond necessity. — William of Ockham 《Occam’s Razor》 译:如无必要,勿增实体。
小时候打台球,见到能翻袋,下底,长杆的人真厉害,幻想自己有一天能厉害到怎样难的球都能打进。长大后发现,真正厉害的人,母球永远不会轻易停在难打的地方。有能力解决复杂问题的人,我们给予掌声,而能够持续保持简单保持纯粹,应该得到更高的赞许。参阅书籍: 1、《Antifragile:Things That Gain from Disorder》:https://book.douban.com/subject/34978407/ 2、《The Art of Unix Programming》:https://book.douban.com/subject/1229959/ 3、《The Mythical Man-Month》:https://book.douban.com/subject/6039354/ 4、《Clean Architecture》:https://book.douban.com/subject/26915970/