郭广昌:把不便作为修行的火候 |捕手志

读书之道

在此此前俺们提倡第五项修炼,就是强调建设学习型协会。现在在复星,大家比较推崇的是案例学习,尤其复星内部的案例学习,大家把商家的每一次投资决策当成案例学习的要紧部分

例如过去自家出差,自己一个人拖着箱子就走;后来本身认为多带几人,也是给大家一个协同学习的空子。因为你对那些题目怎么看、怎么谈的,别人又是怎么看的,这个都是学习。

近日商家的上学,肯定不可以像在此之前这样。过去是等人家公司成功了,被斯坦福的任课发现,协会一个社团去写作,最终写好案例再拿来教大家。现在主导等这么些进度达成,那些公司必然没戏了。因为一时发展太快了,当助教把集团的案例写好,那一个店铺早就不是当年的不得了了。现在无数商高校还在用30年前的商家案例,那有用吗?就此,要关怀的确的技能提高、关心的确的经贸案例

再有就是复盘。把具备的商贸案例复盘,那也是一种学习。其余复星每一周的晨课,还有午餐分享和夜间的享受、调换,也都是学习。大家还有两样层次的扶植布置,像星冉、非凡、超越和领越,覆盖分化等级的职工的就学要求。当然更关键的,我还间接强调要在工作中学习。

自己自己学什么?怎么学?

俺们做产业深度运营、整合和投资,很几个人都会问我:你累不累?每个体系你都要看,去和团体互换。其实,那个对自家来说,是很快乐的业务——你看来了不一致的人、认识不一的东西、通晓分歧的想法,那些都是学习。

更关键的是,我以为还要学会思考。别人做那个事、说那一个事的逻辑是哪些?没说出去的又是什么样?逻辑又是什么样?逻辑非凡主要。并不是每个人心里想怎么样就能说哪些、表达好。那不可以怪他,因为背后会有商贸敏感性的标题;但没听懂,那就是您自己的难题。如若说真的没有听懂,那自然要持之以恒去听,还要去悟。

除此以外,我每一日会给协调留一点怎么着都不想的大运,哪怕每一天五分钟。就是静下来,哪怕盘腿做个冥想。我觉得这对我会很好,因为会放空一下友好;当然练个太极也很好,也有这几个效果

同理可得,一定要给协调留给空间去考虑、去听、去看、去学学。越发是要去倾听竞争对手的想法、倾听客户的见解。当然有时候客户的见识并不见得一定是对的,所以都要去分析,能把客户的各自案例和数码相结合,那也是读书。

自家觉得,我们那辈子最甜蜜的业务是生在了一个很快变化的时期。在那几个变化的时期里,有那么多艺人在表演,更何况大家还坐在前排,可以看得很精通,可以向她们求学。

故而大家要享受这几个时代,享受那种生活,享受大家得以不断去学习、提升。

本文来源:广昌看世界、湖畔大学,转发请留言得到授权,违者必究!

4.7           小结… 10

题图:复星公司董事长 郭广昌先生

4.3           生成设备ID.. 7

25年前,靠着从亲戚朋友处借来的三万八起家,25岁的郭广昌先生和伙伴创办了复星。25年过去了,复星已经改为了稠人广众出名的投资公司。可以想象,那么些年她在工作中所总计的公司老董法学与入股之道,应该能让广大人具有启发。当您读完本文后,会发觉真正有成就的集团家,他的历史观必将是牢固且简单的。

4.7    小结

  
那样改造后,不仅可以在IO控制器对装备进行引用,也得以在其余零件使用。若是赶上类似的情事,希望利用ConcurrentDictionary类。

 

小编:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

文档下载:http://pan.baidu.com/s/1pJ7lZWf

官方网址:http://www.bmpj.net

正如郭广昌先生说的:「我是学文学的,也不懂怎么做经营,那个年我们就是一句话——边学边做,不断否定自己,看到标题然后解决难题。」

4.5    得到装备列表

有五个得到装备的构造函数(GetDevices),紧假诺满意差其余行使场景。

请参见“4.1接口定义”。

   
另外,得到高优先运行设备的GetPriorityDevice函数在上一章节已经介绍了。

■按:

4.1    接口定义

    先定义一个接口(IDeviceManager<TKey,
电视alue>),确定设备驱动管理器都要做到什么意义,伸张设备、删除设备、得到装备和列表、以及别的的效应。接口代码如下:

public interface IDeviceManager<TKey, TValue> : IEnumerable<TValue> where TValue : IRunDevice
{
       /// <summary>
       /// 新建设备的ID,且唯一
       /// </summary>
       /// <returns></returns>
       string BuildDeviceID();

       /// <summary>
       /// 增加设备
       /// </summary>
       /// <param name="key"></param>
       /// <param name="val"></param>
       void AddDevice(TKey key, TValue val);

       /// <summary>
       /// 删除设备
       /// </summary>
       /// <param name="key"></param>
       void RemoveDevice(TKey key);

       /// <summary>
       /// 移除所有设备
       /// </summary>
       void RemoveAllDevice();

       /// <summary>
       /// 获得值集合
       /// </summary>
       /// <returns></returns>
       List<TValue> GetValues();

       /// <summary>
       /// 获得关键字集合
       /// </summary>
       /// <returns></returns>
       List<TKey> GetKeys();

       /// <summary>
       /// 获得设备的ID和名称
       /// </summary>
       /// <returns></returns>
       Dictionary<int, string> GetDeviceIDAndName();

       /// <summary>
       /// 获得高优先运行设备
       /// </summary>
       /// <param name="vals"></param>
       /// <returns></returns>
       TValue GetPriorityDevice(TValue[] vals);

       /// <summary>
       /// 获得单个设备
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       TValue GetDevice(TKey key);

       /// <summary>
       /// 获得设备数组
       /// </summary>
       /// <param name="para">IP或串口号</param>
       /// <param name="ioType">通讯类型</param>
       /// <returns></returns>
       TValue[] GetDevices(string para, CommunicationType ioType);

       /// <summary>
       /// 获得指定IP和工作模式的网络设备
       /// </summary>
       /// <param name="remoteIP"></param>
       /// <param name="workMode"></param>
       /// <returns></returns>
       TValue[] GetDevices(string remoteIP, WorkMode workMode);

       /// <summary>
       /// 获得指定工作模式的网络设备
       /// </summary>
       /// <param name="workMode"></param>
       /// <returns></returns>
       TValue[] GetDevices(WorkMode workMode);

       /// <summary>
       /// 获得设备数组
       /// </summary>
       /// <param name="ioType"></param>
       /// <returns></returns>
       TValue[] GetDevices(CommunicationType ioType);

       /// <summary>
       /// 按设备类型获得设备
       /// </summary>
       /// <param name="devType"></param>
       /// <returns></returns>
       TValue[] GetDevices(Device.DeviceType devType);

       /// <summary>
       /// 判断设备是否存在
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       bool ContainDevice(TKey key);

       /// <summary>
       /// 根据输入参数,判断是否包括设备
       /// </summary>
       /// <param name="para">IP或串口号</param>
       /// <param name="ioType">设备通讯类型</param>
       /// <returns></returns>
       bool ContainDevice(string para, CommunicationType ioType);

       /// <summary>
       /// 设置用户级别
       /// </summary>
       /// <param name="userlevel"></param>
       void SetUserLevel(UserLevel userlevel);

       /// <summary>
      /// 设置是否注册
       /// </summary>
       /// <param name="isreg"></param>
       void SetIsRegLicense(bool isreg);

       /// <summary>
       /// 获得可用设备数
       /// </summary>
       int Count { get; }

       /// <summary>
       /// 获得设备的计数器的值
       /// </summary>
       /// <param name="key"></param>
       ///<returns></returns>
       int GetCounter(TKey key);

       /// <summary>
       /// 设置计数器的值
       /// </summary>
       /// <param name="key"></param>
       /// <param name="val"></param>
       void SetCounter(TKey key, int val);
}

 4.2    设备容器

  
设备驱动管理器是对Dictionary<Key,Value>的卷入,Key是设备驱动的ID,Value是IRunDevice设备驱动接口。设备驱动管理器须要跨线程应用,所以对Dictionary操作要加线程同步锁。

   当时利用的是.NET Framework 2.0框架,没有ConcurrentDictionary(Of TKey,
电视机alue)字典类,这些类的装有国有和受保险的积极分子都是线程安全的,使用原子性操作,适合多个线程之间同时使用。再重构时可以行使ConcurrentDictionary类代替Dictionary类,因为ConcurrentDictionary的所有操作使用到了Monitor线程同步类,不须求协调再拓展打包。

   不贴ConcurrentDictionary类的源代码了,具体选拔参考MSDN。

基本力量

二十五年走过来,我长远地精晓要贯彻多少个对象真的不不难。假若不是天才团队,一定没办法成功。就此,复星向来都是要制作一个天才团队

复星眼中精英的正经,我想可以用「0.01」来概括,即:咱俩需求找到那么些可以比最快的人还要快0.01的人;大家盼望找到那多少个比旁人在念书上更强0.01的人;大家更愿意雇佣那么些可以比别人多积累0.01的人

本身一直觉得复星有二种资本,一个是账上的财力,一个就是姿色。从创造复星先河,我们就把人才放在最要害的岗位。二十五年来,复星能从一个无技能、无资金、无人才的「三无」集团发展成今日的全世界化集团,依靠的大旨能力就是红颜。这一个年里,复星是怎么用人的?若是要我来做一个计算的话,我对红颜的观点可能有上面多少个地点:

1)集团家精神

在复星,我一向强调每一个人都要有「公司家精神」,何谓「公司家精神」?具体来说,就是你在合作社工作,要充满工作的豪情,可以积极衔接复星生态系统内的各类资源,不断地换代、创建,不断去学习思考,境遇标题能创建性地想方法化解。每日为此而努力

怎么了解它?如果把公司比喻成一个球队,我们各类集体成员,都要有限帮忙踢球的情形,不可以懈怠。即使有人不在状态,可能就会失球,球队想要获胜就没那么不难了。

2)学习的能力

各类人都有欠缺,大部分人的智慧和协商都大概,但逐步差异就出来了,差在何地?看您会不会学习,不断完善自己。自己直接说,复星唯一提倡的就是读书,要比人家学得更快,领会越来越多。学习是我们最最首要的一个边境线,是和别人竞争的最最重点的壁垒

自身是学管理学的,也不懂如何是好经营,这个年大家就是一句话:边学边做,不断否定自己,看到标题然后解决难题,就是那般一步步走过来的

3)不为经验所困

诚如的话,有经验的员工在合营社比较受欢迎。但对于经历,其实也要辩证地看。经验丰裕的人做政工或者会百发百中,但多年来形成了一定的行事习惯,思维方式也会相对固定,改变起来会比较难。我担心那样的人反而不难为涉世所困,在经历里走不出去,很难利用公司的资源去做对的、难的和大的工作。

有一种员工,就是所谓的「大白象」,有肯定年龄,经验也很足够,工作中也没怎么错,但尚无立异力,失去工作热情,也不愿意再狠抓了。

哪些避免?仍然不断学习。有些年纪大一些的职工,依旧保持着好的工作情形和事业的上进心,愿意不断学习,那是格外值得肯定的。而对小伙子来说,他恐怕经验不足,但万一可以持续学习和沉思,努力开展自己的界线,这样的小伙是本人所喜欢的。

4)不爱好一贯跳槽的人

一个人对工作一经没有耐心,不敢锲而不舍,不去做、不去积累,就做不成事情。我最不欣赏一向跳槽的人。工作上从不定力,总是觉得现在的平台糟糕,那山望着那山高,觉得人家、其余集团更好。他干活做得糟糕,一直不从自己身上寻找难题,总是把原因归纳于外人,归咎于集团给他的空中不够。

实际上每个商家都设有一些难题,发现难点是很不难的,抱怨和距离也是简单的,真正考验人的是面对难点,主动想艺术缓解难题,而不是一走了之

5)勉励一定水准的竞争

自我经营公司强调一个「灰度」的定义,公司管理有灰度,各种业务企业之间的政工边界不是截然清楚,有肯定灰度;新业务的前行,边界也再三不是很了解。把每个人的职分范围的一清二楚,每个人都像螺丝钉一样工作,在那么些年份是低效的。

团伙当中的每个人最好能有限帮忙一种适于竞争的景色。例如大家一致领域的投资团体会有几支,大家各自寻找最好的不二法门切入。许多好的投资、立异的好产品,都是从客户要求出发、从里面灰度竞争中迸发出来的。

其它,你想在哪里投资,就必然要去到那里,去呼吸那里的氛围,去感受他们的活着,去和他们交谈,那是不行丰盛关键的。那种感觉可能是您在办公室里读1万遍报纸都得不到的

本人在经营店铺的时候就说,对于每一名职工来说,你可以做哪些,不得以做什么样,也不会有相当强烈的分界。假设你到复星来,老是问「你要我做什么,我要如何做」,等着自我来配置工作,这你就来错了地点。应该是您投入一个公司,想选用那一个店铺的资源做怎么着事,解决哪些难点

6)结果导向

说一千道一万,你在店铺是不是做出了成就,那是绝无仅有的正儿八经,也是终点的正儿八经。过程紧要,但结果更爱惜。每个人都在工作中,都要对结果承担。

复星有KPI,但自身并不主张僵化的KPI考核。我在店铺鼓励我们,专注工作,做对的事,做难的事,丰盛利用公司的阳台和资源,想方设法创造性地做事,做大的工作。要耐得住寂寞,每一天提高一点点,追求长久的结果,为合作社、也为个体创建更大的价值。

对于那多少个专注工作、有情怀、做出成绩的员工,一定要积极肯定,给予他们更好的物质和振奋激发,提供更大的提升空间

4.6           设备计数器的超常规用处… 8

深信不疑的力量

实则集团营业和私家景况同样,总会有高高低低的时候。我觉着做人、做集团就是一场修行,有时候,要把各类困难作为你修行的一个机遇。

本人个人比较器重的人品是水,看上去水很柔性,不过它也很坚韧,它无孔不入。水往低处流,可是不见得它没有能力,假以时日,水恰恰是最有力量的

多多事物,只要您想领会了,其实就这么回事。最重大的不是困难来的时候你如何做,而是常常您怎么办。如若您在不顺畅的时候能形成安心,那肯定不会去拜天拜地了,而是你相信自己日常所做的一切都是对的。相信是最重点的事物,要相信自己,相信每日所做的事体。

自然那一个「相信」,一定是依照你经常要咬牙去做对的事。借使您平时胡作非为,那要铭记一点,出来混总是要还的。归根结蒂,不要等到你赶上难题的时候才去修行,而是没来难题的时候就要去做,那是最重大的。马云(阿里巴巴创办人马云)有一句话,我蛮认同的:您要修屋顶,要找阳光灿烂的时候,你要更新,一定要在铺子好的时候。假诺您那时候懈怠了,风雨来的时候就完了

比如,复星一开首就是体系和规范兼顾。大家很已经看到了大家的瑕疵所在,所以在专业化上下了功夫。复星医药就是配专业做医药的;复地就是特地做地产的范围投资;要做钢铁,我们就找钢铁业中最标准的组织来做;复星要整个世界化,大家在中外上布局,推行Glocal战略,就在国外当地寻找最理想的团伙。

对投资来说,资金很要紧,所以大家要找双轮驱动,要做保障公司,要多元融资,要找到更好的资源。近期大家要聚焦家庭,也是因为复星看到了未来的商海所在、机会所在。

自我做公司落成现在,自己越来越感觉人是索要相信一点什么样的。人在面对前景时并不可能看得很清晰,公司家在追求「商业真理」的长河中,也永远要习惯自己形影相吊地去做决策。

此刻公司家最器重的是不可能失去自己的主旋律,那么公司家该如何做?该怎样抵挡诱惑、克服贪婪与惧怕?到底你心中一定要有温馨的思想意识,一定要相信点什么。你最真切相信的东西,往往最有力量。那里可以跟你分享自己深信的几点:

首先、相信集团家精神。我觉着,马云(英文名:马云(英文名:Jack Ma))所说的公司家精神,其实最基本的内蕴,是强调对结果承担的创业集团家思维。创业公司家的思索,就是讲求作用、讲究结果导向,讲究削尖脑袋也要把这么些事情做成

第二、我相信中国的学问,包含伊斯兰教、道家和法家,是很平衡的。它会率领大家回去内心,回到真正所急需的东西。以前我看看儒释道三家有三句话觉得蛮有道理:

佛为心。佛家讲究慈悲为怀,咱们创业从心里深处依然乐意为社会做点事,即使没有这一个观念,你会委屈死

道为骨。墨家是一个修身的学识,人身体不佳的时候工作会受很大影响,所以我倡导打太极拳,这样可以方便于健康

儒为表。道家讲究入世,讲究义务感。所以复星从第一天开首就提议「修身齐家立业助天下」的铺面文化,这几个观点也是从墨家的「修身齐家治国平天下」来的。墨家强调要持续学习、要入世、要为那一个社会做点事情,我也用那三点来持续鼓励自己。

其三、相信自己。任何人必须要为自己做的每一个操纵付出代价。很四个人在做一个说了算时候,他以为付那么些代价很情愿,但真让她负担那些代价的时候,他会说登时以此决定是因为外面种种原因决定的。

农学上有一句话很有道理:人是自由的,你无法不要为你作为自由的人作出的主宰负总责

有些人只会说,公司在市场环境下,政坛应当给他即兴决策的义务,可是集团家要万分了解,你做其余一个决定,都要为此承担义务,越发是不当的决定。无法说因为我是为人家考虑、因为自己是饱受各类诱惑,所有的借口都是颠三倒四的,至少你可以操纵不做。

 

4.3    生成设备ID

    查寻设备驱动管理器中最大的装置ID,并在此基础上加1。那块代码很粗略,

如下:

public string BuildDeviceID()
{
       if(_dic.Count>0)
       {
          int maxID=_dic.Max(d => d.Value.DeviceParameter.DeviceID);
          return (++maxID);
       }
       else
       {
              return 0;
       }
}

   
扩张设备驱动是需求转移设备ID,一般采纳手动伸张设备驱动,所以在那块不必要加线程同步锁。

4.1           接口定义… 2

4.6    设备计数器的差异平常用途

    在接口定义中有SetCounter和GetCounter三个函数,用在广播宣布进度中。

   
应用场景是这么的,在产出和约束通信方式中,设备驱动平昔处于在广播揭橥正常的图景下,不过忽然爆发线路中断或任何原因造成不可以吸纳到多少时,那么设备驱动向来无法吸收到数量,也无力回天对报导状态举行检测以及变更相应的数额音讯,也就是说现实际情况状已经发出改变,可是设备驱动却不可以得到响应。

   
为了防患那种状态的面世,设备驱动每一趟发送数据时,通过GetCounter函数得到当前配备驱动的计数器,对计数器(变量)+1操作,并透过SetCounter函数把计数器(变量)再写到设备驱动管理器中。在非凡接收数据的时候,执行同样的流水线,不过进行-1操作。假诺一直发送数据,而并未收取到数码时,当前装备驱动的计数器就会直接在累加。固然当先等于某个值的时候,就会通过RunIODevice(new
byte[]{})驱动当前设备,执行总体设施处理流程,二次开发的代码块就会被调用,来成功此类应用场景的图景改变和数据变动。代码如下:

int counter = DeviceManager.GetInstance().GetCounter(dev.DeviceParameter.DeviceID.ToString());
int sendNum = SessionSocketManager.GetInstance().Send(dev.DeviceParameter.NET.RemoteIP, data);
if (sendNum == data.Length && sendNum != 0)
{
       DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, "发送请求数据");
       Interlocked.Increment(ref counter);
}
else
{
       Interlocked.Increment(ref counter);
       DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, "尝试发送数据失败");
}
dev.ShowMonitorIOData(data, "发送");
if (counter >= 3)
{
       try
       {
              dev.RunIODevice(new byte[] { });
       }
       catch (Exception ex)
       {
              DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, ex.Message);
              GeneralLog.WriteLog(ex);
       }
       Interlocked.Exchange(ref counter, 0);
}
DeviceManager.GetInstance().SetCounter(dev.DeviceParameter.DeviceID.ToString(), counter);

  
对于发送和接收数据会在不一致的线程上做到,在对计数器(变量)举办+1和-1操作的时候使用到了Interlocked类,用于多少个线程共享的变量提供原子操作,防止在多处理器上并行操作时可能引发的老大或数量遭到破坏。

4.4    对设施容器操作的排挤

框架平台具有组件要共享设备驱动管理器,所以会提到到跨线程应用,更加

是当集合暴发转移的时候,可能会出现非凡。例如:启动框架平台的时候,IO控制器已经启动,IO控制器从设备驱动管理器提取自己的配备列表,但是此时有可能还不曾加载完设备驱动,当有新的装备驱动扩张到设备驱动管理时,可能会吸引顶牛。

   
所以,在追加设备、删除设备和获取装备列表的时候扩大了线程同步锁,例如:lock
(_SyncLock)。

4.2           设备容器… 7

第四章     设备驱动管理器的安排性

   
设备驱动管理器是对IRunDevice设备驱动接口的管住,是框架首要的组成部分之一。不管设备驱动管理器怎么规划、以什么方式存在,在概念上自然是存在的。设计好的装置驱动管理器对于框架平台的安澜运转重点。

  
在介绍装备驱动管理器此前,先简单介绍一下IO控制器(IIOController),它根本承担对IO和设施举行调度,并驱动装置运转,在《第5章
串口和互连网的IO设计》进行详尽的介绍。也就是说一个IO控制器可能会对应四个设施驱动(插件)。

  
早期的时候,每个IO控制器都有一个设施驱动管理器。在框架平台启动的时候,根据设备驱动的报导参数把相应的装置驱动分配到对应的IO管理器;当IO参数爆发变化的时候,会接触事件,把该设施驱动从当下IO控制器移动到另一个IO控制器。

  
从作业角度来考虑,那样做并不曾什么难题,并且平素运行的很平稳。不过,从模块化、扩大性角度来设想,不是太美丽,假使在其它地点调用某一个装备驱动时,不可以直接、很快的找到该设施驱动,要求遍历IO控制器再合营相应的装置驱动,并且操作麻烦以及功效不高。

  
在对框架平台展开重构的时候,把该难点展开了重新考虑,并把相关联的难点一道解决。把种种IO控制器中的设备驱动管理器举办了咬合,用一个设备驱动管理器来形成框架平台的和谐工作。

  
那块涉及到的技艺并简单,也很简单明白,可是在规划进度中要求留意一些细节难题,那么些题材恐怕影响框架平台的稳定性。

4.5           获得装备列表… 8

第四章           设备驱动管理器的设计… 2

4.4           对装备容器操作的互斥… 8

目       录