美文网首页
今天,我离职了

今天,我离职了

作者: 站在海边看远方 | 来源:发表于2020-12-14 10:29 被阅读0次

2018年7月9日,在大学毕业后,以应届生的身份加入了工作2年的公司。

我司18年初,有较大的变革,组织架构调整比较大。

可能运气好一点,加入了一个听起来比较牛逼的部门:中间件团队,部门产品涉及消息队列、网关、RPC、缓存、数据库中间件等。确实都是主流。

2018年7月-2018年12月是试用期,6个月,由于大学时啥也没学,啥都不会,非常的惶恐。

部门由于是刚刚成立的,人员还不是很充足,我呢,负责接手部门的网关产品API-Gateway。

啥也不会嘛,然后第一个任务就是搭环境,我领导给了我一个ftp地址,从上面下载maven编译所需的依赖包,然后添加启动参数,启动项目,启动3个进程,就开始了第一段社畜工作。

后来由于安全需求需要增加校验,校验密码加解密、密码过期时间之类的。

这个时候菜鸡的面目就一览无余了,写了好长一坨if-else,堪称shit code的典范,给大家欣赏一下:

    if (developerDto != null) {
            //用户名正确:密码为初始密码
            if (apiGeneralConfigProperties.getDefaultPwd().equalsIgnoreCase(pwd)) {
                //状态判断,X为已失效
                if ("X".equalsIgnoreCase(developerDto.getState())) {
                    // 已失效
                    loginAttemptService.loginFailed(usrCode);
                    dict.set("USER_VALID", false);
                    dict.setMsg("Username is disabled!");
                    return dict;
                }
                //没失效,没锁定
                //判断是否要过期
                else if (!Contants.DEVELOPER_LOCKED_Y.equalsIgnoreCase(developerDto.getIsLocked())) {
                    if (developerDto.getPwdExpDate() != null) {
                        long expPwdTime = developerDto.getPwdExpDate().getTime();
                        long deadTime = new Date().getTime() + apiGeneralConfigProperties.getRePwdRemindDays() * 24 * 60 * 60 * 1000;
                        if (new Date().getTime() > expPwdTime) {
                            // 密码已经过期
                            loginAttemptService.loginFailed(usrCode);
                            dict.set("USER_VALID", false);
                            dict.setMsg("Password has expired!");
                            return dict;
                        } else if ((deadTime > expPwdTime) && (new Date().getTime() < expPwdTime)) {
                            // 密码即将过期
                            dict.set("USER_VALID", true);
                            dict.set("STATUS", Contants.LOGiN_STATUS_2);
                            dict.setMsg("The password is about to expire, please change your password within" + (expPwdTime - new Date().getTime()) + "days.");
                            String id = developerDto.getId();
                            dict.set("id", id);
                            return dict;

                        } else if (!passwordEncoder.matches(pwd, developerDto.getPassword())) {
                            loginAttemptService.loginFailed(usrCode);
                            dict.set("USER_VALID", false);
                            dict.setMsg("Username or password is not right!");
                            return dict;
                        } else {
                            dict.set("USER_VALID", true);
                            // 初始密码
                            dict.set("STATUS", Contants.LOGiN_STATUS_1);
                            String id = developerDto.getId();
                            dict.set("id", id);
                            dict.setMsg("This is the initial password ,you needs to be modified to log in.");
                            return dict;
                        }
                    }

                }
                //没失效,锁定
                else if (Contants.DEVELOPER_LOCKED_Y.equalsIgnoreCase(developerDto.getIsLocked())) {
                    Date unlockedDate = developerDto.getUnlockDate();
                    if (unlockedDate.getTime() < new Date().getTime()) {
                        //锁定时间已过
                        developerDto.setIsLocked(Contants.DEVELOPER_LOCKED_N);
                        registryManager.updateById(developerDto);

                    } else {
                        // 锁定
                        loginAttemptService.loginFailed(usrCode);
                        dict.set("USER_VALID", false);
                        dict.setMsg("Username is locked!");
                        return dict;
                    }
                }

            }
            //用户名正确,校验密码不为初始密码的情况
            if (passwordEncoder.matches(pwd, developerDto.getPassword())) {
                //断掉初始密码,该加在哪
                if ("X".equalsIgnoreCase(developerDto.getState())) {
                    // 已失效
                    loginAttemptService.loginFailed(usrCode);
                    dict.set("USER_VALID", false);
                    dict.setMsg("Username is disabled!");
                    return dict;
                }
                //没失效,没锁定
                //判断密码是否过期
                else if (!Contants.DEVELOPER_LOCKED_Y.equalsIgnoreCase(developerDto.getIsLocked())) {
                    if (developerDto.getPwdExpDate() != null) {
                        long expPwdTime = developerDto.getPwdExpDate().getTime();
                        long deadTime = new Date().getTime() + apiGeneralConfigProperties.getRePwdRemindDays() * 24 * 60 * 60 * 1000;
                        if (new Date().getTime() > expPwdTime) {
                            // 密码已经过期
                            loginAttemptService.loginFailed(usrCode);
                            dict.set("USER_VALID", false);
                            dict.setMsg("Password has expired!");

                            return dict;
                        } else if ((deadTime > expPwdTime) && (new Date().getTime() < expPwdTime)) {
                            // 密码即将过期
                            dict.set("STATUS", Contants.LOGiN_STATUS_2);
                            dict.setMsg("The password is about to expire, please change your password within " + (expPwdTime - new Date().getTime()) + "days.");
                            dict.set("USER_VALID", true);
                            String id = developerDto.getId();
                            dict.set("id", id);
                            dict.setMsg("login success");
                            return dict;

                        }
                        //加上初始密码判断
                        //if(apiGeneralConfigProperties.getDefaultPwd().equalsIgnoreCase(pwd))
                        else {
                            dict.set("USER_VALID", true);
                            String id = developerDto.getId();
                            dict.set("id", id);
                            dict.setMsg("login success");
                            return dict;
                        }
                    }

                }
                //没失效,锁定
                else if (Contants.DEVELOPER_LOCKED_Y.equalsIgnoreCase(developerDto.getIsLocked())) {
                    Date unlockedDate = developerDto.getUnlockDate();
                    if (unlockedDate.getTime() < new Date().getTime()) {
                        //锁定时间已过
                        developerDto.setIsLocked(Contants.DEVELOPER_LOCKED_N);
                        registryManager.updateById(developerDto);

                    } else {
                        // 锁定
                        loginAttemptService.loginFailed(usrCode);
                        dict.set("USER_VALID", false);
                        dict.setMsg("Username is locked!");
                        return dict;
                    }
                }

            } else {
                dict.set("USER_VALID", false);
                dict.setMsg("Username or password is not right!");
                return dict;
            }
        }

        //用户名不正确,不用校验密码,直接返回失败
        else if (developerDto == null) {
            //用户名不正确
            loginAttemptService.loginFailed(usrCode);
            dict.set("USER_VALID", false);
            dict.setMsg("Username or password is not right!");
            return dict;
        }

if套if,if套else,搁现在再回去看,不忍直视啊,19年的时候抽空去重构了一下,没用啥高深的方法,就是非法情况提前返回,减少嵌套。

这个就是我刚毕业做的第一个功能了,虽然代码丑陋了点,不过还好可以达到目的,泪目。

大概18年9月的时候,几个中间件的产品都各自有1个web页面,都重复依赖了我们公司的前端框架,姑且叫portal吧,然后就开始了管理平台页面的改造之旅。

想法是各自的web页面都依赖同一个portal公共组件,我们自己的web页面可以改造成springboot,然后通过nginx挂载到portal上,这样公用组件就可以复用了。

第二个阶段的工作就是这个web页面改造了,期间还接了个公司基于Dubbo维护的RPC框架的支持的活。

这个阶段的状态可以归结为一条SQL写一周,就整理web页面的菜单SQL,然后融合进portal的数据库里,可以说是相当的有挑战了。

周报汇报的时候:本周工作内容,整理菜单SQL。

在这个阶段,18年9月到11月,接触了Dubbo,对RPC和ZK有了一些认识,还写了第一篇博客介绍ZK鉴权模式:
zk单机开启sasl认证

后来19年又补充了一篇关于ZK集群鉴权的文章
zk集群开启sasl认证

当时阅读zk官方文档,还是全英文的,看的头疼,靠谷歌翻译续命,不过也算是自己第一篇写出的文章,还是有价值的。

后来18年11月就开始了一个漫长的拉锯战,接手API-Gateway并进行维护支撑。

我们公司主营业务是运营商,当时国外有2个项目现场要用API-Gateway,这个活就从我领导那光荣的交接到我的身上了,当时非常的害怕,我凑,我要负责项目了,不会出BUG吧,不会背锅吧,事实证明,确实是会出BUG的。

我司的网关产品咋说呢,功能还是有的,就是服务编排比较麻烦,使用的是activity+freemarker,这个freemarker语法相当的怪异,老是会出现各种问题。

前期几个月的时间基本浪费在这个freemarker语法上了,为此还写了几篇文章记录了一下遇到的问题及解决方案:
https://www.jianshu.com/p/5d252721b7ec
https://www.jianshu.com/p/784c4983d151

18年12月月底的时候,经过转正答辩,就正式的从P3升级为P4正式员工了。期间我们部门离职了好几号人,入职了好几号人。

当时有点不解,我们部门不是挺好的吗,咋离职这么多。后来过了2年后,也逐渐理解了大家的想法。马云说过,离职不外乎2个原因,钱没给到位和工作受委屈了。

19年过完年回来,从3月份开始吧,开始负责国外的2个项目的上线支撑,和2个项目的交付在所内配置freemarker,天天解决模板语法问题,有时候可能会到12点。

当时还是处于成长期,虽然工作价值不大,不过也还能接受,现在再来看的话,写自动化工具自动处理模板或者把模板配置的工作交出去是对个人最有利的。

一个是我当时代码能力不强,二是自己有点老好人的心态,所以自己吃的亏多了一点。

其实工作中还是要尽量只专注自己的事,不该自己问的事还是少问为好,免得最后吃力不讨好。

19年4,5月份,经过2个月的忙碌,配置联调工作差不多了,所内交付开始准备去现场,出国,我的工作轻松了一些。

之后国外现场那边开始部署测试,也还是出现好多问题,感觉现场的交付流程有问题,不管怎么测都是会有问题,最后上线是顶着无数的BUG压力上的线。

我负责的这个网关产品,受限于当时的能力问题,对一些问题的解决也不太到位,导致测试流程也不太顺畅,还是要努力提升自己,解决问题尽量一步到位。

19年6月份到19年9月份这几个月,接触了一个MQ的知识,给MQ加了几个小功能,算是入门了MQ。

这个阶段没事就改改前端,加个按钮,改个文档,过的非常非常的闲,这个阶段还每天都记录时间分配,年底看的时候一地鸡毛,做的东西都是个啥啊,基本啥产出也没有,白白浪费了时间,这也是第一次萌生离开的想法,因为对未来感到困惑。

19年9月和19年11月这2个月分别是项目现场上线的日子,就是不断的测试,修改,发布。涉及到项目上线,要求也多了起来,要有各种checklist,不过还是出现了问题,一个是我代码功底不够,一个还是测试不充分。

当时先上线的现场A,发现URL404了,排查了一下,发现是由于更新了API,然后通过ZK通知更新后台服务的缓存(一个map),由于根据URL重新加载的,表里有个字段叫BASE_URL,根据这个重新加载,BASE_URL是会有重复的,导致map里的kv被覆盖了几个,导致了服务不可用。

问题发生了,如果吃个一级故障单,肯定是吃不了兜着走,写BUG还是要充分测试,充分检查才行。

后上线的项目现场B,上线也吃了一个故障,发生死锁了,由于引入了ehcache-core-2.6.6这个缓存模块,不知道是使用不当,还是这个缓存框架确实有问题,反正这个死锁,我查了好久,还问了我领导,别的部门的同事,死活查不出来,卒,工龄1年3个月。

其实当时上线前压测的时候就发生了504了,也是死锁造成的,吃光了tomcat线程池资源,导致504,不过当时不会看jstack,也不会jmap,所以也没看出来,重启了事,结果上线10天就死锁了,唉,人生艰难,后来把ehcache换成了ConcurrentHashMap,再也没有死锁了。

解决不了问题,就解决提出问题的人的一个典型案例。

之后就开始进入了平稳期,19年11月到19年12月,没工作做,响应公司的安全要求,进行代码的安全改造。

升级第三方依赖的jar包,升级的痛不欲生,尤其是ElasticSearch组件从2.4升级到6.8,es版本更迭很快,升级过程痛不欲生。

转眼到19年年底了,19年就这么不痛不痒的过来了,写了几个BUG,freemarker模板配置练的炉火纯青,安全改造日益熟练,前端划水功底也在加深。

可是这一切的一切对个人能力的提升基本没有。不能说没有,只是提升的太慢了,速度不够,外面毕竟已经卷的天翻地覆了。

2020年,是个特殊的一年,不知道多年过后,大家再回顾这次疫情,会不会有别的感悟。

2月远程办公,领导列了一系列条款,需要我们执行,远程办公确实效率会低下,不过列了这么多条款就像是被监视了,毕竟上班的时候绝对不会有这么些屁事。

大部分还是需要一定的管理,远程办公确实低效,如果不是自制力特别强的话,上班其实也是一个约束自身的好办法。

3月份回公司上班,然后要把MQ的相关知识整理成在线文档,这样方便向外输出MQ的知识,提升团队的影响力。在线文档依托DevOps和gitbook,构建,发布,访问确实很方便,我自己平时也会去在线文档看一些自己拿不准的内容。

诚然,在线文档对部门,对其他部门的人来说是有价值的,可是我作为整理人,花了1,2个月的时间整理文档,不仅要整理文档,还要录制文档对应的视频。

整理文档我觉得至少有价值,我自己也会去在线文档查一些资料。可是录视频是为啥,不太能搞明白,就是把文档的内容,口述一下,还要学视频剪辑,费事费力不讨好。

感觉做出录视频的这个决定相当奇怪。

后来4,5月份,推进高可用演练,基于阿里的chaosblade整了个页面出来,调度故障注入实验,要人工手动整理故障实验,整理了大几百条故障实验,一条一条需要手动往页面上录故障。

高可用演练这个如果可以固化下来,形成自动化演练,其实也还行,不过在我这就止步于手动录入故障了,自动化我刚开始写脚本,还没完善,就被安排了。

四月底的时候领导突然安排我和部门的另一个小伙子去别的部门支援,27,28号左右过去吧,过去就996,然后五一要加班4天,3号休息,1,2,4,5要去上班。

然后28号过去,搭了几个环境,主要是前端缺人,安排2个后端过去写前端,还是2个不会前端的人,what the mother fuck。

加班,996,五一加4天,加4天只有1号发了200块钱也就算了,最最重要的是,说是过去写前端,然后从28号,到5月6号,7,8天的时间,就搭了个环境,然后也没任务分配。

这种拍脑袋人力分配,不知道是我的错觉,还是确实有问题,让2个前端废去写css,去了还啥事没干,陪着996。

唉,当时五一加班的时候,一个大厅,4,500号人在那996,领导说的话是现在加班是为了以后不加班,现在看之前4,5月的话,还是有点戚戚然,真的实现了一小部分人加班,换取了其他人的提效吗?不见得。

之前主力攻坚这个项目,大概投入4,500人,加班加点2,3个月,为了5月底可以达到里程碑,996成了常态。

不知道这几个月中有多少人的付出成了泡沫,这种项目攻坚应该很多公司,很多时候都会有。

身为打工人,还是要为自己多想一想,付出什么,会得到什么,能容忍的底线在哪。

后来这个项目组攻坚实在没我俩啥事,我俩就被这个攻坚项目组的一个小组的领导,捞过去打杂了。

在那打杂了一个月,做安全治理,对照买的安全扫描工具,逐条治理,度过了一个月的时间。这一个月虽然996,但是也是常态划水,一张单子做一天的那种。

虽然心理上不累,不过身体上还是会有反应,晚上9点下班之后会饿,饿就想吃东西,这一个月吃了不少泡面和油炸,胖了一些。

6月的时候,部门有一个小组,人基本走完了,然后就回来了,又开始做回了部门的内容。

6月的时候出去面试过几家,南京的大公司还是不多,选择比较少,面试的内容也不深,问一问项目,问一问springmvc就差不多了,给的工资也不是太多,涨幅不大。

当时也没想好到底要不要离职,离职欲望不太强烈,所以当时只是面了3家,1家愿意给offer,没去,后面就没继续面了。

后来三季度,7,8,9月份,三个月,页面重构,我负责了一部分前端的页面改造,写js和css真滴是痛不欲生,就这还是在有人搭好页面布局的情况下写的,前端实难。

写前端虽然压力不大,也不难,不过还是使用jQuery,和目前的主流框架一点都不搭,不知道是不是白写了。

前端太难了,移动互联网如此发达的今天,不知道写这种页面的意义是否很大,虽然是给公司员工用的管理页面,其实也不用做的太花哨,不需要像移动端做得那么好。

9月职级晋升,P4升P5,我们部门升了2个,都是18届入职的,然后我不知道为啥没能升上P5。

不知道确实是我业绩不够,还是能力不够,还是就是不配,反正我是不知道了。这件事我本人算是有一点不满意吧,可能我觉得我做的挺多的,但是在领导那没价值,这个就是没价值。

年终奖发了一个月,这个可能是没有季度S,有季度S就发2个月,没有就发一个月,这个我没拿到S,认了。不过别人拿着2个月,心理还是会有些酸酸的。

薪资保密,绩效保密,可能就是为了避免同事间互相了解,产生一些负面情绪吧。

10月的时候18年一起入职的小伙伴提了离职,裸辞,我自己也觉得差不多了,这次是真的要走了 ,不在是6月份的时候,不知所措,想着出去面一面的那种状态了。

我和我的领导提出了离职的意愿,领导平时对我也还可以,我刚入职的时候就是他带的。

如果和领导关系不是太好,不建议让领导知道你的离职意愿,不然工作上可能会有点难受,会患得患失的。

我是因为决定好要离职,并且对领导性格有把握才告诉领导要离职的,不然最好还是偷偷的出去面试比较好。

领导让我先别急着裸辞,先出去找,拿一些offer再说,我的工作年限只有2年,选择不多,并且南京没啥互联网氛围,外包比较多。

最后面了一家拿了一个offer,然后就正式提了离职。11月10号提的离职,在送走10月提离职的小伙伴当天提的。

流程一提,正式开始了离职手续 ,手续慢慢走,离职流程走了大概一个多月吧,11月10号提的,今天是12月14号,手续还差最后一步,走完就正式结束了。

大部分年轻人都会有跳槽的经历,跳槽之前要想好为什么要跳槽,当前工作有哪些不满,下一份工作想要获得啥。

我离职的原因有下面几个

  • 工资太低,对收入不满意
  • 做的工作对个人提升没有太大的帮助
  • 厌倦了一些部门之间的扯皮,以及对公司一些流程制度不太满意

大家跳槽一个是为了涨薪,一个是个人能力有成长,对公司而言,职员是要给公司解决问题的,而职工的个人诉求是收入和能力提升。

当这2方面不满意的时候,或者对工作环境忍受不了的时候,其实可以考虑动一动。

面试我觉得应该长期保持,比如一年出去试一试,面一面,不一定要走,面一面,看看自己在市场上值多少,自己还有哪些欠缺,对自己真的需要跳槽的时候还是有点帮助的。

跳槽首要考虑的其实也不是薪资问题,我觉得还是要为以后考虑一下,需要考虑在新的公司可以收获多少工作技能之外的东西,对未来2-3年的成长有帮助。

这样2-3年跳槽的时候收获的就不仅仅是那么点工资了,还有个人能力、履历、见识方面的成长。

另外跳槽之前最好要有一个大概的目标,要准备哪些东西,要去哪个行业,哪家公司发展,并为之做出相应的准备,才能提高一下通过率。

我本次其实跳槽也是比较草率的,离职决心是下了,不过对于以后做什么,要提升哪些方面,还是一团浆糊,就Boss直聘上主动投简历,或者等着别人找你,没有一点目标,这样效率也低一些。

平时还是应该多认识一些人,内推方便一些,也可以多了解一下公司以及部门的实际情况。

离职跳槽还是要多准备一些东西,多收集一些信息,进行多方交叉验证比较,免得选错了以后后悔。

我就是因为准备不充分,万事随缘,这样不好,免得哪一次就掉坑里取了,这个还是要改一改。

好了,应届毕业之后的2年多时间,记了个流水账,希望后面的工作生活会比这2年会更丰富一些吧。

昨晚南京下雪了,今年的第一场雪,下的挺大的,瑞雪兆丰年,挺好。

相关文章

  • 今天我离职了

    当我们的HR一本正经的拿出离职申明表,让我签字的时候,我一笔一划,工工整整的写下了我的大名和日期。 漂亮的小姐姐说...

  • 今天我离职了

    2018年10月31日,我离职了。 这是我想了很久,但一直犹豫没去做的事情,但最近几天发生了点意外,所以很坚决的说...

  • 今天我离职了

    不知道从什么时候开始,我对生活没有了太大的乐趣,对工作也没有了激情,想想3年前的自己是多么的亢奋,总想着闯出一片天...

  • 今天我离职了

    今天是2018年5月9日,我离职的日子,还记得2016年11月28日是我到XX公司第一天上班的日子,紧张与喜悦交集...

  • 今天,我离职了

    2018年7月9日,在大学毕业后,以应届生的身份加入了工作2年的公司。 我司18年初,有较大的变革,组织架构调整比...

  • 今天我离职了

    今天早上十点到公司,最后一次上班打卡,找相关部门领导签离职单,一切比较顺利,中午前一切搞定,正式离职。 ...

  • 8.30,今天我离职了

    亚楠,我觉得我大概花了有二十年的运气才换来这个暑假在咱们培训部实习,并认识你,有一个道理是在咱们第一次谈话后我从你...

  • 今天,我被离职了

    我在路上漫无目的的走。平静的接受了自己已成为无业游民的现实。 就在昨天,我还焦虑要怎样去招聘兼职来完成接下来即将启...

  • 今天,我“被离职”了

    “以你的能力,相信你能够找到更适合的工作。”听到老板这句话,小雯一下子懵了,以至于老板接下来说的话,她一句...

  • 就在今天,我离职了

    昨天半夜,又被胃痛折磨得睡不着的时候,我发了一条信息给组长,说:“我想离职了。” 今日醒来,看到组长回复:“好,今...

网友评论

      本文标题:今天,我离职了

      本文链接:https://www.haomeiwen.com/subject/ecarwktx.html