0%

一天看冯大的文章,里面有个词语叫 本位主义,知识渊博的我,不得不去百度一下,看看到底啥意思。然后竟然有意外收获,还找到了其它两个主义,感觉挺有用的,做个记录,告诫自己!

三大主义分别为:

  • 本位主义
  • 老大主义
  • 怨职主义

本位主义

指在处理单位与部门、整体与部分之间的关系时只顾自己,而不顾整体利益,对别部、别地、别人漠不关心的思想作风或行为态度和心理状态。

这种主义是我见过最多的,基本上呆过的公司都存在这种人才,营销尤盛。这种人其实我是很不喜欢的,因为我太无私了,哈哈!没有其实我也顾自己,但是我不只顾自己,我是正儿八经的为大家放弃小家的那种革命人士,只要公司或者领导没有对我不仁我绝对是把公司、领导的利益放在我前面的。好了夸了自己半天,说回正题。本位主义的人他们有个优势,就是通常他们的kpi都是比较不错的,至于原因你想想kpi的重点不就是考核个人么,只为个人,能不kpi好么。幸好我做的是技术岗,通常这类人很少在身边。

老大主义

老大主义为特权主义、目中无人、不知天高地厚,总感觉自己现在已经是天下第一,殊不知天外有天人外有人。

这类人 是我敬仰的一批人,对他们来说没有所谓的雨天,能装逼天天是晴天。这种人也遇到过,国企尤盛,之前在国企待过一段时间,天天看他们装逼,是在看不下去然后就走了。有两把刷子你在装逼呗。千万不能成为这种人,幸好我看了看镜子中的自己,没有这份潜力,我就安心了。主要是太低调。

怨职主义

怨职主义就是公司某些员工天天抱怨公司不好、产品不好、待遇不好,整天怨天尤人,总认为自己的这份工作干不干无所谓,从不考虑自己是否对这份工作做专、做精、做透、做熟的一种现象。

这类人应该是比较普遍,我也偶有这样的情绪,因为总避免不了遇见傻逼,当然也可能是我看你是傻逼,你看我也是傻逼。我一度自己思考过为什么会抱怨,后来总结了一下主要是两点,一点是不公,另一点是遇见了傻逼队友。现在的我很少抱怨了,因为我发现首先不公是到处存在的,要想天平往你这边倾一点那你就创造更大的价值,说起来俗,但最后其实就是看这个。另一个你不能避免遇到傻逼队友,你知道吧,生活就是这样,哪来一帆风顺,你想想西游记没了猪八戒,你能想象么。而且一个人负能量不能太多,多了容易长皱纹。

要以此为戒,做一个三无主义的好青年。

定义参考:

事业部老大从17年开始就在推OKR,以前都是说KPI,所以我想知道OKR又是个啥,以此文章做个记录。

什么是OKR体系?

OKR体系的全称是Objectives & Key Results,即目标与关键成果。所谓OKR,O = Objective 可以理解为企业目标,KR =Key Results 可以理解为关键成果。浓缩在一起就是“为确保达成企业目标的关键成果分解与实施”。

二、OKR与KPI的区别

如果要说 OKR 和 KPI 的区别,区别就在于 KPI 只能让驴使劲走,而 OKR 用于保证驴头朝正确的方向,有些驴拼命想往前走,不希望落后于别人,这时候 OKR 用于帮助驴少走曲线。

OKR考核:“我要做的事”,KPI考核:“要我做的事”,理解不同,但二者都强调有目标,同时也需要有执行力。OKR的思路是先制定目标,然后明确目标的结果,再对结果进行量化,最后考核完成情况。KPI 的思路也是先确定组织目标,然后对组织目标进行分解直到个人目标,然后对个人目标进行量化

解释来源于:

第一次接触dubbo好像是在14年吧,13年参加工作时,在一家半国企,当时他们用的是axis2,当时那一堆代码+XML,让我怀疑是否应该继续干IT,觉得太难用了。后来接触了dubbo,觉得这玩意好,省了很多事,感概开源的力量和大公司的体量。用起来真实很通畅。

当然我们公司也没有作妖,非要选个与众不同所以还是选了dubbo作为服务之间的通信框架。

我这儿也不做什么源码解析了,比我专业的细致的网上很多,我主要解析一下我在用dubbo过程中遇到的问题相关的源码。比如今天讲的就是dubbo的异常机制、序列化协议hession相关的源码。

问题起因在于我们系统中定义了自己的一套异常处理机制,有个自定义异常

图中的ApiException是我们定义的针对接口异常的异常类,长成下图这样。

红框的部分是这次发生问题之后加的一个构造参数,加完之后就搞定了。那为什么呢?我们跟着异常信息我们知道是dubbo用的hession那块反序列化报了异常,跟下源码看下。

  • 我们找到JavaDeserializer的instantiate方法,找到_constructor,发现是个Constructor,找到赋值地方,在JavaDeserializer实例化时赋值,进入JavaDeserializer构造方法,根据赋值代码,并且因为我们的ApiException是不知一个构造函数的所以_constructor肯定不会为null,所以
    public JavaDeserializer(Class cl) {
    	this._type = cl;
        this._fieldMap = this.getFieldMap(cl);
        this._readResolve = this.getReadResolve(cl);
        if (this._readResolve != null) {
            this._readResolve.setAccessible(true);
        }

        Constructor[] constructors = cl.getDeclaredConstructors();
        long bestCost = 9223372036854775807L;

        for(int i = 0; i < constructors.length; ++i) {
            Class[] param = constructors[i].getParameterTypes();
            long cost = 0L;

            for(int j = 0; j < param.length; ++j) {
                cost = 4L * cost;
                if (Object.class.equals(param[j])) {
                    ++cost;
                } else if (String.class.equals(param[j])) {
                    cost += 2L;
                } else if (Integer.TYPE.equals(param[j])) {
                    cost += 3L;
                } else if (Long.TYPE.equals(param[j])) {
                    cost += 4L;
                } else if (param[j].isPrimitive()) {
                    cost += 5L;
                } else {
                    cost += 6L;
                }
            }

            if (cost < 0L || cost > 65536L) {
                cost = 65536L;
            }

            cost += (long)param.length << 48;
            if (cost < bestCost) {
                this._constructor = constructors[i];
                bestCost = cost;
            }
        }

        if (this._constructor != null) {
            this._constructor.setAccessible(true);
            Class[] params = this._constructor.getParameterTypes();
            this._constructorArgs = new Object[params.length];

            for(int i = 0; i < params.length; ++i) {
                this._constructorArgs[i] = getParamArg(params[i]);
            }
        }

    }

根据下面这段代码,从JavaDeserializer的构造方法中可以看出,这里_constructor会被赋予参数最少的那个构造器,即找到ApiException一个参数的构造方法 public ApiException(Throwable cause),

有根据下面这段代码,我们知道Throwable不是primitive(原始数据类型),所以_constructorArgs值为null。

**this._constructor.newInstance(this._constructorArgs)**使用反射调用构造方法时,要求给的参数必须是原始类型或者其包装器

但是我们给的参数值都为null,,传入的参数不合法,造成了上面的异常。

解决办法

所以绕了这么大一圈知道了原因,那怎么办呢,最简单的方式ApiException提供一个无参的构造方法。就会这样调用:ca.newInstance(new Object[]),即无参构造则不会再抛异常了。

小结

其实这块还会牵扯处很多东西,比如为什么ApiException要那么设计?为什么Java本身的反序列化机制能过而Hession不能过?再比如Constructor.newInstance()和我们经常看到的Class.newInstance()有什么区别?…哎 学海无涯苦作舟