软件系统的生命——概念一致性

  • #Software Architecture
  • #Engineering

什么是概念一致性?

来自《人月神话》的一个比喻:

“绝大多数欧洲的大教堂中,由不同时代、不同建筑师所建造的各个部分之间,在设计或结构风格上都存在着许多差异。后来的建筑师总是试图在原有建筑师的基础上有所“提高”,以反映他们在设计风格和个人品味上的改变。所以,在雄伟的哥特式的教堂上,依附着祥和的诺曼第风格十字架,它在显示上帝荣耀的同时,展示了同样属于建筑师的骄傲。

与之对应的是,法国城市兰斯(Reims)在建筑风格上的一致性和上面所说的大教堂形 成了鲜明的对比。设计的一致性和那些独到之处一样,同样让人们赞叹和喜悦。如同旅游指南所述,风格的一致和完整性来自8代拥有自我约束和牺牲精神的建筑师们,他们每一个人牺牲了自己的一些创意,以获得纯粹的设计。同样,这不仅显示了上帝的荣耀,同时也体现了他拯救那些沉醉在自我骄傲中的人们的力量。”

如果把生命的定义放宽一点,软件系统也有生命和演化诉求。软件设计师仅仅在系统的发展早期扮演了造物主角色,系统到了成长期会衍生出她自己的需求;设计者并不能完全控制她,而是要帮助她演化出自己的个性。

这并不是出于情怀,而是出于现实用途:拥有概念一致性的系统增强了易用性,扩大了设计师的能力。

你创造的东西开始约束你

无论在哪个行业,设计师都会面临多种多样的需求,这些需求超出了原有的设计方式,挑战系统的实现能力。在toC的互联网行业里,产品经理作为主要的需求归集方已经承担了综合各方需求,进行妥协和选择,以便限制复杂度的无序增长。但是在toB的行业内,客户定制需求作为一种刚需,会更频繁超出原有的系统能力,匆忙地满足客户定制,只会让系统的设计思路支离破碎。这时候通常有两种选择:

  • 方式1:强制植入你的新需求或者新设计,开启系统的多元化之路
  • 方式2:重新构建系统的概念,以囊括新的需求和设计

软件系统有高昂的研发成本和研发周期,这决定了她天生就喜欢标准的、固定模式的需求,而厌恶多元化,讨厌变化。你植入的新东西越多,她就越分裂,这种疯狂的增长总有一天会反噬设计者,摧毁设计者的交付能力。多数情况下,设计者不得不抛弃旧系统,重写一个新系统。即便系统从一开始设计时就考虑到了需求的多样性,从而可以包容部分变化的需求,也迟早会有超出的那一天。

在今天的互联网行业,以精益的观念来对待这种困境便是:如果第一次碰到新状况,请强制植入,当你第二次碰到,请务必重建概念,扩张内涵,督促系统走上适合她的演化之路——寻求属于她的概念一致性。

如何获得一致性?

精英统治还是民主政治?

《人月神话》的结论是:概念的完整性要求设计必须由一个人,或者非常少数互有默契的人员来实现。今天的场景下,不太容易碰到原书中那么大型的开发团队,以个人的经历来改写下这句话:一个模块的概念完整性需要由一个人来保证。在密切合作的小团队里,每个人之间的思路和代码或多或少都有些差异,要5个人对10个模块的所有设计都达成一致,不仅难度高,也非常浪费时间;每个模块都有它细分的特征,分而治之,让不同的技术人员成为某个模块里的“精英统治”,可以很好地保证概念一致性。

精英专制是否意味着其他技术人员的创造性天分和构思被压制?

答案是否定的,因为确定模块规范并不是比具体设计实现更富有创造性,它只是一项性质不同的创造工作而已。在给定规范下的设计实现,同样需要同确定模块规范一样的创造性、同样新的思路和卓越的才华。实际上,产品的成本性能比很大程度上依靠实现人员,就如同易用性很大程度上依赖模块规范设计者一样。有很多行业和领域中的案例让人相信纪律和规则对行业是有益的。实际上,如同某艺术家的格言所述,“没有规矩,不成方圆。”最差的建筑往往是那些预算远远超过起始目标的项目。巴赫曾被要求每周创作一篇形式严格的歌剧,但这似乎并没有被压制他的创造性。

类似的,外部的体系结构规定实际上是增强,而不是限制实现小组的创造性。一旦他们将注意力集中在没有人解决过的问题上,创意就开始奔涌而出。在毫无限制的实现小组中,在进行结构上的决策时,会出现大量的想法和争议,对具体实现的关注反而会比较少。

其他领域的概念一致性

题图的正弦波里,主轴便是概念一致性,上下的波动便是偏离原有概念的那些意外事物,无论振幅多大,终究还是会回归主轴。

这种模式不仅在建筑行业、软件行业频繁出现,也巧妙地描述了人是如何形成自己的世界观——那些所有的意外要么被剔除,要么成为主轴的一部分;主轴是经纬,那些波动则是权变。