我所在公司信息化项目购买的平台软件是用Java语言写成的,对这个领域一窍不通的我也偶尔随手翻翻有关Java语言的书。外行翻书自有另一番妙处,因为看不懂专业内容,只能去看其中的思想(还真的碰到一本书名就叫做《Java编程思想》),看懂了这些思想也不会用于作者所应用的领域,因为你确实不懂他的领域,你只能把其中的思想“偷”来用于自己所熟悉的领域,而这些作为他山之石的思想往往能够给你重要的启示。
Java编程思想的基础是“面向对象”,而非“面向过程”。为什么要用“面向对象”替代“面向过程”呢?“面向对象”编写的程序是一些相对独立的“原子”,可以通过消息(任务)来调用、联结为一个个“过程”。这不就是“珍珠串项链”吗?读到这些内容真的想拍大腿了。
面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。
如果说传统的面向过程式编程语言是以过程为中心、以算法为驱动的话,面向对象的编程语言则是以对象为中心、以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。
面向对象的“原子”是可以重复使用的,是可以灵活地重新结构为新的“过程”的。
这哪里是在讲编程,不就是在讲企业吗?企业设计与企业信息系统设计,难道不是同构的吗?真的搞不懂,我们的签约软件供应商在软件开发中天天用到的就是Java语言,而仅仅是把其核心思想从技术方面的应用扩展到企业层面的应用,他们为什么就感觉到难以理解、不可理喻呢?
“面向对象”的方法可以给予我们的探索以直接的启发。这个方法的重要理念就是“分离”和“调用”。跳出编程语言层面,直接从企业设计层面来理解,就是:对于一个业务流程,我们可以把其中包含的所有活动都固化起来,不再变动,这样是最省事的。但是,我们也可以把其中的每一个活动(活动的概念相当灵活,根据需要可以在不同的层次来应用,这就是活动分离的“粒度”。分离开来,根据具体任务去调用他们,以完成业务流程。虽然后者看似把业务复杂化了,但是事实上这才是正确的做法——这就是分离,这样的好处很明显。
首先,我们的能力单元可以方便地重组到任何适用的流程中,使得企业整体具备了灵活应对个性化产品生产的能力。实际上我们可以做到在每一个订单履行之前进行“流程重组”,以达到成本、交期、质量最佳——多么美妙诱人呀!
其次,这样做还可以把过去固化在特定流程中的富裕能力解放出来,使之更充分地发挥作用,这大概可以看成当年农村改革中把生产队集体生产改为联产承包责任制,以农户为单元进行生产,并实行统分结合的双层经营一样,具有解放生产力的强大效应。
第三,也是更实用的一条,是当我们把关注点从流程转向能力单元之后,可以方便地把握。因为每一个能力单元都不会太复杂,可以一眼看透,从一个一个能力单元入手来配置资源、优化作业方式方法,都不是太难的事情。
人的智慧不足以保证对一个复杂系统的设计不会出错,而当一个复杂系统被当成一个整体来设计时,哪怕其中一个微小的错误也可能是致命的,譬如航天器设计是世界上最精密的设计了,但照样会出现挑战者号那样的悲剧。航空母舰之所以打不沉,则是因为它的各舱是分离的。
老子说,天下大事,必做于细;天下难事,必做于易。珍珠串项链的方法,就是化繁为简、化难为易。从能力单元设计入手,可以有效地避免总体设计一个庞大的、复杂系统时极其容易出现的逻辑混乱,即便一个能力单元的设计有错误,也比较容易检查排除,更避免像企业信息系统开发中具有极大风险的会导致整个开发失败的业务逻辑错误。
当我们把一个个能力单元清晰地构建起来的时候,再构筑不同业务种类的流程就变成了一件令人愉悦的事情了,你可以像搭积木一样把业务流程搭建起来,越是对于大型复杂的业务,越是有此必要。越是能够分离,越能够从整体看问题。世界上到处充满了这样的悖论。
当企业所处的环境越来越具有不确定性,“唯一不变的就是变化”成了人们口头禅的情形下,企业经营战略的调整成为常规工作,企业流程重组成为经常性需要,组织学习也成为共识,“面向过程”的流程管理显示出“僵化”的特征,珍珠串项链的方式,来得正当其时。
当我们把企业整体分离成一个一个的能力单元时,我们就能够对企业能力有一个明确的把握,有一个清晰的认识,将市场与能力连接起来的定位问题也就容易解决,当客观环境发生变化的时候,要重新定位,也能够清楚地知道什么是作为依托的能力,什么是需要增加的能力,什么是已经无用的能力。
像搭积木一样把业务流程搭建起来,越是对于大型复杂的业务,越是有此必要。