最近,父亲在老家建了一座三层楼的房子,从此在老家有了个根据地。由于时间紧张,三楼还没有装修,但这已不妨碍我们入住体验了。
如果未来的房子可以用3D打印机打印出来,有两种打印方式:从左到右打印和从下到上打印。你认为哪种方式更好?
如果让我来选,我还是会选从下到上一层层打印。因为假设打印机中途发生故障了,我还是有可能住进完整的第一层;而不是一个四面漏风的房子中。
在软件开发,这种思路叫做解耦。房子的每一层都是解耦的,每一层都可以独立提供一个较为完整的居住体验。从左到右的打印,则把每一层耦合到了一起,除非全部打印完,否则是没法住人的。
房子可以住人,在软件开发中就如同产品可以交付给用户使用。如果将产品也划分为一层一层进行分层构建,就可以进行持续交付。用户每过一段时间便能体验到新的功能,然后根据用户的反馈进行下一轮的调整,这便是当下流行的敏捷开发思想。
导航
从深圳骑行到北京,怎么能以最快响应速度给出一条可行的路线?
在游戏开发中,这是一个经典的寻路问题。以应用最为广泛的AStar寻路为例,其寻路的时间跟整个路径上要搜索的网格数成正相关。
如果以街区类比网格,从深圳骑行到北京,粗略估算要途径上万个街区。这样寻路的时间会变得非常漫长(百度地图甚至无法给出骑行路线),用户难以接受这么慢的响应时间。
有没有一个办法可以立刻给出一条可行路线呢?
答案是分层寻路。
我们可以以简单的行政区划进行分层:省,市,县,乡和街道。
首先,在省这一层,我们可以规划出,从广东到北京需要途径哪些省份。中国只有34个省级行政区,所以这一层最多要处理34个网格。
接着在广东省内,我们可以规划出,从深圳到下一个省需要途径哪些市。广东省有21个地级市,所以这一层最多要处理21个网格。
接着在深圳市内,我们可以规划出,从我们这个区到下一个市要途径哪些区。深圳市有10个区,所以这一层只需要处理10个网格。
我在南山区,可以规划出从我住的街道到下一个区要途径哪些街道。南山区共有8个街道,所以这一层只需要处理8个网格。
……
进行分层后,每一层要处理的网格数便降低到一个非常低的量级,这样每一层都可以非常快速的给出答案,最后的时间正比于层数层的网格数,远低于总的网格数,所以总耗时将大大降低。
当然,有人会问了,我并没有给出其他省份和市区的内部路线;但是实际上这些路线可以放到后续进行进一步计算,不耽误你立即出发。
分层寻路能快速求解的本质在于每一层的添加都降低了整个问题的复杂度。
复杂度是软件工程师的大敌,一个好的工程师可以管理并驾驭复杂度,使得软件容易维护;而一个差的工程师则容易因管理不好复杂度而失去对代码的控制,要么bug丛生,要么难以维护。
组织架构
一个集团军通常有5-10万人,假设你是一个集团军司令,请问你该如何去指挥这10万人呢?
你的精力有限,你无法去指挥每一个人的行动。因为根据邓巴数,每个人通常只能与150个人维持比较紧密的关系,这个数字受到人类大脑皮质的限制。
作为一个司令,你指挥不过来每一个人,也无需去指挥每一个人。
- 你手下大概会有5个师或旅,你对这些师长或旅长们发号施令;
- 一个师或旅下面会有4个团,他们负责指挥这些团长;
- 一个团下面大概会有4个营,团长负责指挥这些营长;
- 一个营下面又有4个连;一个连下面又有4个排;
- 一个排下面大致有3个班,一个班里有10个人,而班长则负责指挥这10个人进行具体作战任务。
通过分层,每一个长官需要直接管理的下属会少于10个,大大降低了指挥的复杂度。
军队的层级是一个典型的金字塔结构,越高职位的人越少,越低职位的人越多。这与当今的绝大多数组织的架构一致。
然而现在却有一种「扁平化」的趋势盛行于高科技互联网公司,这又是为什么呢?
凡事都有双面性,有利也就有弊。
层的划分,可以使每一层解耦,降低了管理的复杂度;但是同时引入了沟通的问题。
每一层的沟通都是有代价的,信息在每一层中传递都会伴随着损耗。这些损耗可能是上层表达的含糊不清,中层的误读曲解,抑或是下层没有理解到位。
这有可能是致命的,层数越多,最上层的信息传到底层时被扭曲的可能性就越大,而基层的真实情况则很难传达到最上层。
提倡扁平化的原因,就在于通过把层数的缩减,使得沟通的损耗降到最低,从而使高层的战略意图能够更快更准的得到执行,基层的意见和情况能直接传达到高层,为决策提供辅助。
解放军在某些时期也实行过一段时间的「扁平化」。1965年开始,解放军取消了军衔制,这种情况一直延续了20余年,最终又恢复了军衔制。
为什么取消了又恢复呢?因为在对越反击战中,军队的建制经常容易打散重建,当一个师长和一个团长都被重建到一支队伍中时,由于他们两可能互相不认识,这时候能唯一快速明确指挥关系的就是军衔。军衔低的服从军衔高的,这是一条简单明了的规则。取消了军衔制后,由于大家都没有了军衔,所以这一简单的规则被打破了,导致了打散重建时的指挥混乱。
从这里我们能再一次看出硬币的两面:绝对的扁平化既不利于管理,也不利于沟通。
扁平化 vs 分层
引入了层,可以降低管理复杂度,解耦并促进分工,提高效率;另一面,则提升了沟通复杂度,降低了沟通效率,使信息损耗变大。
分层或扁平化?这是一个问题。
有两种解决办法:
- 严格分层,用其他方法保证信息传达高效且准确
- 适当扁平化,通过基层自我管理降低管理复杂度
前者的一种代表就是军事化管理。严格强调纪律,下级无条件服从上级,令行禁止,确保命令能够自上而下得到执行。
军队从古至今就一直遵守着这种模式。军人的天职就是服从,军纪严明,军法严厉。用纪律这一点来确保命令可以得到彻底的执行,信息从上传递到下的路径非常高效。
现如今,也有许多企业和学校甚至传销组织采用半军事化管理,实际上就是通过严苛的纪律来规范信息的传达高效且准确。而且作为补充,频繁的洗脑也是一种强化信息传达的手段。
这种方法的问题在于,基层变成了执行机器,丧失了部分自由和人权,而且容易压力过大,内心会比较压抑。
后者则是精简层级,适当扁平化。但这样不可避免的引入了管理复杂度,对应的解决办法是使基层进行自我管理,从而降低管理复杂度。
自我管理要求组织成员有较强的能力和自驱力,能够进行自我管理,从而可以减少上层的监管。
有两种办法可以让成员自我管理,一种是通过招聘和考核进行筛选;还有一种是培训学习,提升成员能力。创业公司没有太多时间用于培训新员工,所以初创团队成员的自我管理能力就显得非常重要。
我们可以看到,在劳动密集型的企业,比如富士康,就会采用半军事化管理的策略。因为生产线上的工人可能素质没有那么高,自驱力也没有那么强,需要设立纷繁的规则来进行管理。
而在硅谷的高科技企业,比如Facebook,则提倡扁平化管理。因为其招聘标准较为严格,招来的人基本都是高手,而技术人也不喜欢受到太多的管制和约束。
康威定律:设计系统的架构受制于产生这些设计的组织的沟通结构
可以看到,不同的组织架构,具备不同的沟通方式。是分层设计还是追求扁平化,不能一概而论。应该结合组织的实际情况来判别。
假如组织上是脑力密集型,则应该追求适当扁平化,放权给基层,让基层形成自驱;如果组织是劳动密集型,则需要通过层级去减少管理复杂度,通过纪律和规范来使信息高效传达。
分层的思想本质是一个分解问题的思想,一个大问题,通过分层进行解耦,从而让复杂度可控。这是一把思想的利剑,可以劈开很多看似复杂的问题。
锤子定律:如果你有的只是一个锤子,那么所有的东西看起来都像一个钉子
当然,我们也应避免锤子思想,痴迷于用分层去解决所有问题。该如何用好「层」这把武器?我想爱因斯坦已经给出了答案:
事情应该力求简单,不过不能过于简单。