图片 6

原标题:一家央企变革的三个关键时刻

设计模式 ( 十七)
状态模式State(对象行为型)

图片 1

1.概述

编者按

style=”font-size:12px”>在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if…
ellse style=”font-family:Tahoma,Arial,Helvetica,sans-serif; line-height:19px”>语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状体( style=”font-family:Tahoma,Arial,Helvetica,sans-serif; line-height:19px”>if
else(或switch
case)语句的增多或者修改)可能会引起很大的修改,而 style=”font-family:Tahoma,Arial,Helvetica,sans-serif; line-height:19px”>程序的可读性,扩展性也会变得很弱。维护也会很麻烦。那么我就考虑只修改自身状态的模式。

style=”font-size:12px”>例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,运行。每一种状态改变,都有可能要根据其他状态来更新处理。例如,开门状体,你不能在运行的时候开门,而是在电梯定下后才能开门。

例子2: style=”font-family:Tahoma,Arial,Helvetica,sans-serif; line-height:19px”>我们给一部手机打电话,就可能出现这几种情况:用户开机,用户关机,用户欠费停机,用户消户等。
所以当我们拨打这个号码的时候:系统就要判断,该用户是否在开机且不忙状态,又或者是关机,欠费等状态。但不管是那种状态我们都应给出对应的处理操作。

企业组织变革的过程包括三个关键时刻,即创建新理念、将想法转化为企业内部的迭代行动以及场景迁移。

2.问题

文 / 郭馨宇
中国移动无锡分公司人力资源部

style=”color:#333333″>对象如何在每一种状态下表现出不同的行为 style=”color:#080808″>?

张建慧 菲尔丁研究院
组织发展与变革博士

3.解决方案

约翰·奥斯汀 菲尔丁研究院
组织发展与变革教授

状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

在很多情况下, style=”color:#FF3300″>一个对象的行为取决于一个或多个动态变化的属性 style=”color:#333333″>,这样的属性叫做 style=”color:#FF3300″>状态 style=”color:#333333″>,这样的对象叫做 style=”color:#FF3300″>有状态的 style=”color:#FF3300″>( style=”color:#FF3300″>stateful style=”color:#FF3300″>) style=”color:#FF3300″>对象 style=”color:#333333″>,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。

美国菲尔丁研究院约翰·奥斯汀(John
Austin)
教授在2013年发表的《践行知识:三个关键时刻》里提出包括企业的设计和变革在内,任何机构推行新的举措时都存在着一个将知识付诸实践的转化过程。奥斯汀在文中将知识转化的发生定义为“时刻”,并总结了三个关键时刻:

4.适用性

时刻一: style=”font-size: 16px;”>创建新的理念 style=”font-size: 16px;”>,即将新的想法与企业所处环境结合,找到一个对于企业而言有意义的方案或理念。

时刻二: style=”font-size: 16px;”>将想法转化为可持续的行动 style=”font-size: 16px;”>,能够将想法落地并形成企业内部运营的惯例。

时刻三: style=”font-size: 16px;”>场景迁移 style=”font-size: 16px;”>,能够将时刻一的想法或者时刻二已经执行过的方案用于企业不同的场景中。

在下面的两种情况下均可使用State模式:
style=”color:#333333″>1) • style=”color:#3333ff”>一个对象的行为取决于它的状态,
并且它必须在运行时刻根据状态改变它的行为。
2) • style=”color:#3333ff”>代码中包含大量与对象状态有关的条件语句 style=”color:#FF3300″>:一个操作中含有庞大的多分支的条件( style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>if
else(或switch
case)语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常
, 有多个操作包含这一相同的条件结构。
State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

本文基于此理念及该论文作者之一奥斯汀(Austin)2013年的研究成果,结合2016~2018年重庆移动的组织设计与实施案例,从知识的转化、应用及建构层面将变化流程拆解为三个关键时刻片段:(1)创建新理念(战略);(2)将想法转化为企业内部的迭代行动;(3)场景迁移。

5.结构

图片 2

图片 3

时刻一 **创造新理念**

6.模式的组成

这是最能体现企业创新与创造力的时刻。最大的挑战在于其灵光乍现、捉摸不定的表象。然而,本质上仍需要借助缜密而严格的流程来引导推进。这个时刻需要处理好三个重要的行动要素:(1)适当的人员选配;(2)对现状的充分质疑;(3)投入到冲突对话里的时间。强调冲突是因为,有意义的创新往往是在似是而非、彼此矛盾的观点对峙里喷涌而出的。

环境类(Context):
 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State):
 定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState):
 每一子类实现一个与Context的一个状态相关的行为。

在这个时刻需要克服的障碍包括过于自信、害怕失败、思想或理论参照系过于狭隘,以及非黑即白的二元决策习惯。对于团队而言,要突破现有的自信或是成员间推脱搪塞、害怕失败的心态。

7.效果

行动的第一步必须保证团队内部能够公开、诚恳地面对真实信息。其次是借助相关战略分析工具作出理性判断。务必要规避团队为求和谐,将关注点放在行业或市场潮流趋势的共识分享上。如有需要也可以借助外部资源支持以拓宽视野,突破现有思维局限。简而言之,卓有成效的变革始于方案的推陈出新及战略角度。

State模式有下面一些效果:
状态模式的优点:
1 )
它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来:
State模式将所有与一个特定的状态相关的行为都放入一个对象中。因为所有与状态相关的代码都存在于某一个State子类中,
所以通过定义新的子类可以很容易的增加新的状态和转换。另一个方法是使用数据值定义内部状态并且让
Context操作来显式地检查这些数据。但这样将会使整个Context的实现中遍布看起来很相似的条件if
else语句或switch case语句。增加一个新的状态可能需要改变若干个操作,
这就使得维护变得复杂了。State模式避免了这个问题,
但可能会引入另一个问题,
因为该模式将不同状态的行为分布在多个State子类中。这就增加了子类的数目,相对于单个类的实现来说不够紧凑。但是如果有许多状态时这样的分布实际上更好一些,
否则需要使用巨大的条件语句。正如很长的过程一样,巨大的条件语句是不受欢迎的。它们形成一大整块并且使得代码不够清晰,这又使得它们难以修改和扩展。
State模式提供了一个更好的方法来组织与特定状态相关的代码。决定状态转移的逻辑不在单块的
i f或s w i t c h语句中,
而是分布在State子类之间。将每一个状态转换和动作封装到一个类中,就把着眼点从执行状态提高到整个对象的状态。这将使代码结构化并使其意图更加清晰。

2) 它使得状态转换显式化:
当一个对象仅以内部数据值来定义当前状态时 ,
其状态仅表现为对一些变量的赋值,这不够明确。为不同的状态引入独立的对象使得转换变得更加明确。而且,
State对象可保证Context不会发生内部状态不一致的情况,因为从
Context的角度看,状态转换是原子的—只需重新绑定一个变量(即Context的State对象变量),而无需为多个变量赋值

3) State对象可被共享
如果State对象没有实例变量—即它们表示的状态完全以它们的类型来编码—那么各Context对象可以共享一个State对象。当状态以这种方式被共享时,
它们必然是没有内部状态, 只有行为的轻量级对象。

状态模式的缺点:
1) 状态模式的使用必然会增加系统类和对象的个数。
2)
状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

以重庆移动的组织结构设计为例。公司新总经理2015年12月上任后发现重庆公司直接管理38个分公司,是中国移动集团内最大的管理幅度。分公司“小而全”现象突出,资源配置紧张。各个分公司的体量差距过大,竞争能力弱、分公司之间存在内耗和摩擦。分公司人才结构失衡,人力资源矛盾突出,资源效率低。

8.实现

这些困难倒逼管理者考虑优化公司组织架构和管理方法。解决方案集中指向两个目标,

我们用电梯的例子来说明:

style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>简单地实现代码:

style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>

<?php
abstract class ILift {
    //电梯的四个状态
    const OPENING_STATE = 1;  //门敞状态
    const CLOSING_STATE = 2;  //门闭状态
    const RUNNING_STATE = 3;  //运行状态
    const STOPPING_STATE = 4; //停止状态;

    
    //设置电梯的状态
    public abstract function setState($state);

    //首先电梯门开启动作
    public abstract function open();

    //电梯门有开启,那当然也就有关闭了
    public abstract function close();

    //电梯要能上能下,跑起来
    public abstract function run();

    //电梯还要能停下来,停不下来那就扯淡了
    public abstract function stop();
}

/**
 * 电梯的实现类 
 */ 
class Lift extends  ILift {
    private $state;

    public function setState($state) {
        $this->state = $state;
    }
    //电梯门关闭
    public function close() {
        //电梯在什么状态下才能关闭
        switch($this->state){
            case ILift::OPENING_STATE:  //如果是则可以关门,同时修改电梯状态
                $this->setState(ILift::CLOSING_STATE);
            break;
            case ILift::CLOSING_STATE:  //如果电梯就是关门状态,则什么都不做
                //do nothing;
                return ;
            break;
            case ILift::RUNNING_STATE: //如果是正在运行,门本来就是关闭的,也说明都不做
                //do nothing;
                return ;
            break;
            case ILift::STOPPING_STATE:  //如果是停止状态,本也是关闭的,什么也不做
                //do nothing;
                return ;
            break;
        }
                echo 'Lift colse <br>';
    }

    //电梯门开启
    public function open() {
        //电梯在什么状态才能开启
        switch($this->state){
            case ILift::OPENING_STATE: //如果已经在门敞状态,则什么都不做
                //do nothing;
                return ;
            break;
            case ILift::CLOSING_STATE: //如是电梯时关闭状态,则可以开启
                $this->setState(ILift::OPENING_STATE);
            break;
            case ILift::RUNNING_STATE: //正在运行状态,则不能开门,什么都不做
            //do nothing;
                return ;
            break;
            case ILift::STOPPING_STATE: //停止状态,淡然要开门了
                $this->setState(ILift::OPENING_STATE);
            break;
        }
        echo 'Lift open <br>';
    }
    ///电梯开始跑起来
    public function run() {
        switch($this->state){
            case ILift::OPENING_STATE: //如果已经在门敞状态,则不你能运行,什么都不做
                //do nothing;
                return ;
            break;
            case ILift::CLOSING_STATE: //如是电梯时关闭状态,则可以运行
                $this->setState(ILift::RUNNING_STATE);
            break;
            case ILift::RUNNING_STATE: //正在运行状态,则什么都不做
                //do nothing;
                return ;
            break;
            case ILift::STOPPING_STATE: //停止状态,可以运行
                $this->setState(ILift::RUNNING_STATE);
        }
        echo 'Lift run <br>';
    }

    //电梯停止
    public function stop() {
        switch($this->state){
            case ILift::OPENING_STATE: //如果已经在门敞状态,那肯定要先停下来的,什么都不做
                //do nothing;
                return ;
            break;
            case ILift::CLOSING_STATE: //如是电梯时关闭状态,则当然可以停止了
                $this->setState(ILift::CLOSING_STATE);
            break;
            case ILift::RUNNING_STATE: //正在运行状态,有运行当然那也就有停止了
                $this->setState(ILift::CLOSING_STATE);
            break;
            case ILift::STOPPING_STATE: //停止状态,什么都不做
                //do nothing;
                return ;
            break;
        }
        echo 'Lift stop <br>';
    }
    
}
$lift = new Lift(); 
   
//电梯的初始条件应该是停止状态 
$lift->setState(ILift::STOPPING_STATE); 
//首先是电梯门开启,人进去 
$lift->open(); 
   
//然后电梯门关闭 
$lift->close(); 
   
//再然后,电梯跑起来,向上或者向下 
$lift->run();    
 //最后到达目的地,电梯挺下来 
$lift->stop();

style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”> style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>显然我们已经完成了我们的基本业务操作,但是,我们在程序中使用了大量的switch…case这样的判断(if…else也是一样),首先是程序的可阅读性很差,其次扩展非常不方便。 style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>一旦我们有新的状态加入的话,例如新加通电和断点状态。我们势必要在每个业务方法里边增加相应的case语句。也就是四个函数open,close,run,stop都需要修改相应case语句。

style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”> style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”> style=”color:#3333ff”>状态模式:把不同状态的操作分散到不同的状态对象里去完成。看看状态类的uml类图:

style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”> style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>图片 4

style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”> style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>代码实现:

style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”> style=”font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:13px; line-height:19px”>

<?php
/**
 * 
 * 定义一个电梯的接口 
 */ 
abstract class LiftState{

    //定义一个环境角色,也就是封装状态的变换引起的功能变化
    protected  $_context;

    public function setContext(Context $context){
        $this->_context = $context;
    }

    //首先电梯门开启动作
    public abstract function open();

    //电梯门有开启,那当然也就有关闭了
    public abstract function close();

    //电梯要能上能下,跑起来
    public abstract function run();

    //电梯还要能停下来,停不下来那就扯淡了
    public abstract function stop();

}


/**
 * 环境类:定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
 */ 
class Context {
    //定义出所有的电梯状态
    static  $openningState = null;
    static  $closeingState = null;
    static  $runningState  = null;
    static  $stoppingState = null;

    public function __construct() {
        self::$openningState = new OpenningState();
        self::$closeingState = new ClosingState();
        self::$runningState =  new RunningState();
        self::$stoppingState = new StoppingState();

    }

    //定一个当前电梯状态
    private  $_liftState;

    public function getLiftState() {
        return $this->_liftState;
    }

    public function setLiftState($liftState) {
        $this->_liftState = $liftState;
        //把当前的环境通知到各个实现类中
        $this->_liftState->setContext($this);
    }


    public function open(){
        $this->_liftState->open();
    }

    public function close(){
        $this->_liftState->close();
    }

    public function run(){
        $this->_liftState->run();
    }

    public function stop(){
        $this->_liftState->stop();
    }
}

/**
 * 在电梯门开启的状态下能做什么事情 
 */ 
class OpenningState extends LiftState {

    /**
     * 开启当然可以关闭了,我就想测试一下电梯门开关功能
     *
     */
    public function close() {
        //状态修改
        $this->_context->setLiftState(Context::$closeingState);
        //动作委托为CloseState来执行
        $this->_context->getLiftState()->close();
    }

    //打开电梯门
    public function open() {
        echo 'lift open...', '<br/>';
    }
    //门开着电梯就想跑,这电梯,吓死你!
    public function run() {
        //do nothing;
    }

    //开门还不停止?
    public function stop() {
        //do nothing;
    }

}

/**
 * 电梯门关闭以后,电梯可以做哪些事情 
 */ 
class ClosingState extends LiftState {

    //电梯门关闭,这是关闭状态要实现的动作
    public function close() {
        echo 'lift close...', '<br/>';

    }
    //电梯门关了再打开,逗你玩呢,那这个允许呀
    public function open() {
        $this->_context->setLiftState(Context::$openningState);  //置为门敞状态
        $this->_context->getLiftState()->open();
    }

    //电梯门关了就跑,这是再正常不过了
    public function run() {
        $this->_context->setLiftState(Context::$runningState); //设置为运行状态;
        $this->_context->getLiftState()->run();
    }

    //电梯门关着,我就不按楼层
    
    public function stop() {
        $this->_context->setLiftState(Context::$stoppingState);  //设置为停止状态;
        $this->_context->getLiftState()->stop();
    }

}

/**
 * 电梯在运行状态下能做哪些动作 
 */ 
class RunningState extends LiftState {

    //电梯门关闭?这是肯定了
    public function close() {
        //do nothing
    }

    //运行的时候开电梯门?你疯了!电梯不会给你开的
    public function open() {
        //do nothing
    }

    //这是在运行状态下要实现的方法
    public function run() {
        echo 'lift run...', '<br/>';
    }

    //这个事绝对是合理的,光运行不停止还有谁敢做这个电梯?!估计只有上帝了
    public function stop() {
        $this->_context->setLiftState(Context::$stoppingState); //环境设置为停止状态;
        $this->_context->getLiftState()->stop();
    }

}



/**
 * 在停止状态下能做什么事情 
 */ 
class StoppingState extends LiftState {

    //停止状态关门?电梯门本来就是关着的!
    public function close() {
        //do nothing;
    }

    //停止状态,开门,那是要的!
    public function open() {
        $this->_context->setLiftState(Context::$openningState);
        $this->_context->getLiftState()->open();
    }
    //停止状态再跑起来,正常的很
    public function run() {
        $this->_context->setLiftState(Context::$runningState);
        $this->_context->getLiftState()->run();
    }
    //停止状态是怎么发生的呢?当然是停止方法执行了
    public function stop() {
        echo 'lift stop...', '<br/>';
    }

}

/**
 * 模拟电梯的动作 
 */ 
class Client {

    public static function main() {
        $context = new Context();
        $context->setLiftState(new ClosingState());

        $context->open();
        $context->close();
        $context->run();
        $context->stop();
    }
}
Client::main();
  • 一是要减小市公司的管理幅度,提高精细化管理能力;
  • 二是要整合分公司资源,增强一线作战能力。

9.与其他相关模式

在探索新方案的过程中,重庆移动的战略部门不仅仅对标其他移动分公司,同时将视野拓展到国外同行,并借鉴2015年中国军队结构调整的理念。第一轮试点方案是在2016年10月开始将城区4个分公司合并为2个。在顺利完成之后,核心团队注意到,公司曾经也有过这样的尝试,失败原因在于郊区地方政府利益诉求带来冲突,如果将直接合并的方式复制到全公司,可能带来社会风险。

style=”color:#3333ff”>1)职责链模式,
职责链模式和状态模式都可以解决If分支语句过多,
从定义来看,状态模式是一个对象的内在状态发生改变(一个对象,相对比较稳定,处理完一个对象下一个对象的处理一般都已确定),
而职责链模式是多个对象之间的改变(多个对象之间的话,就会出现某个对象不存在的现在,就像我们举例的公司请假流程,经理可能不在公司情况),这也说明他们两个模式处理的情况不同。
这两个设计模式最大的区别就是状态模式是让各个状态对象自己知道其下一个处理的对象是谁。
而职责链模式中的各个对象并不指定其下一个处理的对象到底是谁,只有在客户端才设定。
用我们通俗的编程语言来说,就是
状态模式:
  相当于If else if else;
  style=”white-space:pre”>设计路线:各个State类的内部实现(相当于If,else
If内的条件)
  style=”white-space:pre”>执行时通过State调用Context方法来执行。
职责链模式:
  相当于Swich case
  style=”white-space:pre”>设计路线:客户设定,每个子类(case)的参数是下一个子类(case)。
  style=”white-space:pre”>使用时,向链的第一个子类的执行方法传递参数就可以。
就像对设计模式的总结,有的人采用的是状态模式,从头到尾,提前一定定义好下一个处理的对象是谁,而我采用的是职责链模式,随时都有可能调整链的顺序。

style=”color:#3333ff”>2)策略模式:( style=”color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px”>策略模式的孪生兄弟)
       
状态模式和策略模式的实现方法非常类似,都是利用多态把一些操作分配到一组相关的简单的类中,因此很多人认为这两种模式实际上是相同的。
然而在现实世界中,策略(如促销一种商品的策略)和状态(如同一个按钮来控制一个电梯的状态,又如手机界面中一个按钮来控制手机)是两种完全不同的思想。当我们对状态和策略进行建模时,这种差异会导致完全不同的问题。例如,对状态进行建模时,状态迁移是一个核心内容;然而,在选择策略时,迁移与此毫无关系。另外,策略模式允许一个客户选择或提供一种策略,而这种思想在状态模式中完全没有。
     
 一个策略是一个计划或方案,通过执行这个计划或方案,我们可以在给定的输入条件下达到一个特定的目标。策略是一组方案,他们可以相互替换;选择一个策略,获得策略的输出。策略模式用于随不同外部环境采取不同行为的场合。我们可以参考微软企业库底层Object
Builder的创建对象的strategy实现方式。而状态模式不同,对一个状态特别重要的对象,通过状态机来建模一个对象的状态;状态模式处理的核心问题是状态的迁移,因为在对象存在很多状态情况下,对各个business
flow,各个状态之间跳转和迁移过程都是及其复杂的。
     
 例如一个工作流,审批一个文件,存在新建、提交、已修改、HR部门审批中、老板审批中、HR审批失败、老板审批失败等状态,涉及多个角色交互,涉及很多事件,这种情况下用状态模式(状态机)来建模更加合适;把各个状态和相应的实现步骤封装成一组简单的继承自一个接口或抽象类的类,通过另外的一个Context来操作他们之间的自动状态变换,通过event来自动实现各个状态之间的跳转。在整个生命周期中存在一个状态的迁移曲线,这个迁移曲线对客户是透明的。我们可以参考微软最新的WWF
状态机工作流实现思想。
     
在状态模式中,状态的变迁是由对象的内部条件决定,外界只需关心其接口,不必关心其状态对象的创建和转化;
而策略模式里,采取何种策略由外部条件(C)决定。
     
他们应用场景(目的)却不一样,State模式重在强调对象内部状态的变化改变对象的行为,Strategy模式重在外部对策略的选择,策略的选择由外部条件决定,
也就是说算法的动态的切换。但由于它们的结构是如此的相似,我们可以认为“状态模式是完全封装且自修改的策略模式”。 style=”color:#3333ff”>即状态模式是封装对象内部的状态的,而策略模式是封装算法族的

于是从2016年12月开始,公司再度密集调研,结合本次组织设计的初衷(减小管理幅度,整合资源强化一线实战),最终创造性地提出了“一企两制”的结构,即在公司内实行主城区和远郊区县两套管理模式,形成横向和纵向两种职能部门,38个分公司整合为10个区域经营机构。

10.总结与分析

主城区和直辖市城区模式相同,由原来7个分公司整合为3个。在各区县成立了7个区域事业部。事业部作为市公司派驻的横向管理机构,协助管理31个区县分公司,但非法人机构,总体定位上与区县分公司区隔。在沟通上,对外便于区县分公司协同开展与区县政府等合作伙伴的沟通;对内可消除一线经营主体弱化的顾虑,有利于公司生产经营稳定。这样增设了区域事业部一级,乍看背离了当下强调极端扁平化的组织结构潮流,以至于初期在设计团队内部也有质疑。

        style=”color:#080808″>状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数;其缺点在于使用状态模式会增加系统类和对象的个数,且状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱,对于可以切换状态的状态模式不满足“开闭原则”的要求。

但是随着讨论的深入与完善,大家认识到“一企两制”恰好应对了重庆独特的大城市、大农村的二元结构,是区县资源整合利用最合适的选择。从2015年12月新总经理到岗发现问题,到2016年10月出台试点方案,再到2016年12月总结试点成功经验,发现风险,从而最终提出“一企两制”方案,其过程至少有两轮关键的“时刻一”,第一轮是试点方案,即分公司合并的提出;第二轮是修正第一轮试点方案,确定“一企两制”。

图片 5

时刻二**将想法转化为内部迭代行动**

企业内部多大程度上能实现这种转化,取决于组织惯例在变革压力下的自我更新效能,这和各层级的领导能力以及组织内部长久以来应对变革所形成的“认知框架”密切相关。

时刻一的核心是能够激发核心设计团队的智慧,借鉴外部资源;时刻二的重点在于如何启动、强化执行类惯例的势能,从而推动“企业认知框架”的演变。此时要求能够引导群策群力,用目标的认同及荣誉感激发团队的主观意愿;同时借助企业内部学习机制促进从个体到群体的认知变化,以阶段性反思的方式将这些变化外显,迭代“企业认知框架”。

重庆移动从2017年3月宣布改革方案之后,就始终要求各个团队用动态复盘的方式确保小步走的同时及时进行调整。各层级的管理者在此过程中,要有意识、有技巧地将绩效目标与团队不成文的“认知框架”交叉互动,激发团队动能尤为重要,领导力是这个时刻不可或缺的首要前提。

处理这个时刻需要把握三个重要特点,首先是理解各相关方在利益上的不同,不厌其烦地与利益相关方交流对话,达成共识。其次是用项目化管理方式推进变革方案落地,与此同时提供时间及资源上的持续支持。

重庆移动改革方案最终公布是在2017年3月,从当年10月开始分别针对新结构里各个部门决策职能、人员及资源配置再度出台优化方案。在间隔期(3~10月)里通过组织7个跨区域跨部门的职能团队分别以项目制方式,做出落地细化方案。项目管理机制在全过程里扮演了重要的角色,由总经理领头,战略部日常协调,7个跨职能项目经理由职能部门人员兼任。在把控一个完整财年的时间窗口前提下给予各个团队及时支持。项目管理的原则是主次清晰,模糊不清之处以支持绩效为优先原则,务实为本、在矛盾中前进反而激励了团队认知框架的进化。

最后是灵活的执行。这点在各个区域事业部人员到岗环节尤为凸显。

由于区域事业部是增设部门,从原有各自子公司里调配人员涉及能力、个人兴趣、工作场地转移乃至家庭等要素,容易出现冲突。因而在3月方案公布时,除了党、政、法这些岗位之外,其他职能岗位遵循“宁缺毋滥”“业绩导向、有为才有位”的原则,由对应的项目团队细化人员选聘标准流程细节,同时通过灵活机制确保所需职能不受干扰。

方案公布后,远郊对于区域事业部业务岗位支持需求激增,人员又迟迟不能到位。但在绩效目标动力激发下,业务部门自发找到了“人员派驻制”这个迭代方案——在总部确定支持区域事业部的技术人员,借助各种通信技术加上短途差旅方式即可完成工作,无需涉及人事关系变动,也就没有必要按照传统思维,将人从市区搬迁到各个事业部所在地(“企业认知框架”的进化)。但必须强调执行过程中灵活度与边界的把控,两者的动态平衡是对领导力在变革实施环节里最为核心的挑战。

图片 6

时刻三**场景迁移**

场景迁移是指在某个方案试运行取得成功之后,从某一个区域、部门或阶段的成功向更广阔的范围推行。所谓成功可以复制,正是人们在这种场景下心理预期的真实写照。然而,从知识管理的角度,这个时刻有几个风险需要考虑。

首先,人们通常在选择试运行时,本能地选择容易成功的区域、部门或阶段,这往往导致习得经验普遍可复制性的欠缺。

其次,人们的自我认可本能偏见,容易让视野受限于收集佐证能够成功的信息,忽略推广时可能遭遇的复杂市场独特性的挑战,这点对于负责试运行的团队而言尤其需要警惕。比如宝洁公司,在中国市场的前20年里始终沿用总部成功的经验,反而最终失去对快速变化成长的中国消费品市场的掌控。

重庆移动在2016年10月将城区4个分公司成功地合并为2个,当时团队的第一反应也是将此经验直接复制到全公司。但审视历史上的类似失败案例之后,团队冷静比较城区与郊区在重庆独有的体量特征,这个环节便是时刻三。之后,团队再度寻求内外部信息支持,通过时刻一的过程拿出了最终方案。可见,即便是同一家公司内部,复制试点成功经验,通过时刻三也有可能需要重复时刻一的环节。

在技巧层面而言,时刻三的把控核心在于新场景与之前试点的异同。在理解以上三大风险基础之上,团队可以借助于工具如重新排序环境不确定因素、重温利益相关方分析图、练习Klein项目倒逼分析(假如场景迁移失败了,会是哪些原因造成的)、更新客户(市场)痛点等更好地制定场景迁移方案计划。

重庆移动从2010年开始其上级单位中国移动集团就想借助行业自有优势,推进大平台共享,强化前端的市场属性。后来的“一企两制”虽然与最初目标不一致,但得到了内外部的认可及经营绩效的佐证,成为中移动2017年的集团明星和示范。可见法无定法,变革方案可以适时调整,若过程引领得当,即便是人们脑海里偏保守的西部地区团队,也能如此有效地将迭代成长的理念融入行动。

这恰是本文想强调的观点:变化过程里或许未必始终伴随着知识的产生,但是知识的应用转化、迁移乃至创建本身必定构筑该轮变化的关键节点(里程碑),并为变革提供相对应的价值创建。

三个关键时刻旨在抓取变革过程里这些有价值的片段,如同运动场景中的拍照定格。当照片积累足够数量之后,可由点入面,描绘每一轮与知识相关的变革轮廓,找寻其独有的运行轨迹。企业也可以参照本文提供的管理工具,运用到变革过程中,帮助企业实施变革管理。

style=”font-size: 16px;”>本文有删减,原文全文刊载于《中欧商业评论》2018年8月刊,后台回复“转载”了解转载详情 class=”backword”>返回搜狐,查看更多

责任编辑:

admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注