2020年,大厂员工别总想着走人!

2020年,大厂员工别总想着走人!

为啥突然要写这么一个题目呢? 因为职业并不是HRor猎头的倪叔,过去的2年一直都在帮朋友找工作,而其中很多人都是拥有互联网大厂背景的。 当然,倪叔的朋友们最终都找到了下家,但除开个别在企业核心岗位,掌握稀缺资源的幸运儿之外,对于大多数人来说: 一方面,过程普遍都很漫长,互联网进入寒冬之后,家家都在精简人员,招聘的需求相当有限,核心岗位更是一坑难求。 因而当大家跳出来的时候,发现远没有想象中那么受欢迎; 另一方面,最终的归属,无论从待遇,还是公司发展,还是团队人员质素,相比于前东家来说也谈不上理想,往往只能作为个人在这两年动荡时期的过渡选择。 而且,薪资待遇上大部分都只能做到平薪调动,这个时节还能涨薪的也是少数。 在过去的两年中,对于身边还在大厂工作的朋友,倪叔给出的工作建议都是:能不出来就尽量不要出来,在整个行业的下行时期,大厂是最好的避风港。 但建议归建议,整个2019年发生工作变动的朋友还是不少的。因为整个互联网行业下行的变动必然深刻的影响着每一家公司。 创业公司倒闭裁员自是不在话下,而身处大厂,虽然未必有裁员优化的威胁,但市场变化对行业巨头的业绩影响是惊人。 而要对抗这种影响,就势必造成内部压强的放大:难以完成的业绩目标,极其严苛的考核要求,长期的熬夜加班等等都会给个体施加巨大的压力。 再结合上长期以来的上升空间受限,人事关系复杂等等老问题就非常容易促使人做出离职的决定,但结合外部环境来看,这时候决定往往不是好的选择。 原本以为熬过了2019年就是胜利,哪知道2020年又是一个“地狱模式”的开局,很多与线下有关的业务都面临冲击。 再加上财年末的末尾淘汰和组织架构调整带来的人事变动,又造成了新一波的人员变动。 就在这几天,倪叔又开始接到一些朋友的电话,说想通过倪叔看看外面的机会,然后倪叔又开始balabala,苦口婆心的劝对方不要乱动,保住现在的工作…… 而在接到了第四通类似主题的电话之后,倪叔觉得有必要通过一篇文章来让大家意识到: 虽然大家都是大厂员工,都非常优秀,但这一次外界的环境真的不同了,企业和人才之间的供需关系发生根本性的改变。 以前是企业需要人才,现在是人才更需要企业的历史时期。 01现在人才更需要企业 为了加深大家对“现在人才更需要企业”这个结论的理解,说几个倪叔自己的亲身经历: 在2019年,一个有BAT背景,后在独角兽担任高级总监的朋友,因为家庭原因要换城市,让倪叔帮忙找工作。 而让倪叔没有想到的

Dockerfile 中命令的两种书写方式的区别

Dockerfile 中命令的两种书写方式的区别

最早的初衷是要研究一下运行 Docker 容器时如何向其传递参数,却冷不防掉入了另一个深渊,不得不关心起 Dockerfile 中命令(包括 RUN, CMD 和 ENTRYPOINT) 的两种不同写法上的区别。 所以呢,先要稍稍了解一下 Dockerfile 中 RUN, CMD, ENTRYPOINT 这三个指令 RUN 执行命令并创建新的镜像层,常用于安装软件包。可以多个,为避免创建过多的镜像层,我们尽量把命令合在一起,用分号或 &&。它与容器运行期无关。 CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够在启动容器时被覆盖。多个 CMD 只有最后一个是有效的 ENTRYPOINT 配置容器启动时运行的命令。多个 ENTRYPOINT 也是只有最后一个有效 关于以上三个命令的区别,这儿有篇文章讲得很清楚 RUN vs CMD vs ENTRYPOINT - 每天5分钟玩转 Docker 容器技术(17),此处也照搬了些文字。 RUN, CMD 和 ENTRYPOINT 都支持两种写法,即 exec 和 shell 格式,见 Dockerfile reference #ENTRYPOINT 对这两种方式的解释。RUN 只影响如何构建镜像,所以镜像中不保留 RUN 命令。CMD 和 ENTRYPOINT 都可以在运行容器时执行命令,这里不讲述它们间的区别,而要说的是它们所支持的 exec 和 shell 两种格式的写法。此篇以 ENTRYPOINT 为例说明两种格式的区别,CMD 类似。 exec 格式 ENTRYPOINT ["executable", "param1", "param2"] 必须清楚了解命令 "executable" 的每一个参数,一个萝卜一个坑,不能随便乱拆与合并。例如执行 jar 文件的命令 java -Xmx256M -jar /app.jar 写成 exec 格式就是 ENTRYPOINT ["java", "-Xmx256M", "-jar", "/app.jar"] 而不能写成 ENTRYPOINT ["java", "-Xmx256M", "-jar /app.jar"] 否则 docker run 运行它时出错 Unrecognized option: -jar /app.jar Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. "-jar" 和 "/app.jar" 分别是两个参数。 exec 格式是一种数组形式,该格式的 ENTRYPOINT 能接收 CMD 或 dock run <image> 后的参数作为附加参数,相当于是往这个数组中附加元素。例如 Dockerfile 中写成 ENTRYPOINT ["echo", "Hello"] 假设置构建出的镜像名(repository) 是 test(以下都以 test 作为镜像名称), 那么执行下面 docker 命令 $ docker run test World and China 输出是 Hello World and China 使用 exec 格式的 ENTRYPOINT 与 CMD 同在时还能接收 CMD 送过来的参数,如 Dockerfile ENTRYPOINT ["echo

让线程按顺序执行 8 种方法

让线程按顺序执行 8 种方法

一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下: [1] 使用线程的join方法 二.实现 我们下面需要完成这样一个应用场景: 1.早上;2.测试人员、产品经理、开发人员陆续的来公司上班;3.产品经理规划新需求;4.开发人员开发新需求功能;5.测试人员测试新功能。 规划需求,开发需求新功能,测试新功能是一个有顺序的,我们把thread1看做产品经理,thread2看做开发人员,thread3看做测试人员。 1.使用线程的join方法 join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。 应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。 package com.wwj.javabase.thread.order; /** * @author wwj * 通过子程序join使线程按顺序执行 */ public class ThreadJoinDemo { public static void main(String[] args) { final Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println("产品经理规划新需求"); } }); final Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { thread1.join(); System.out.println("开发人员开发新需求功能"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread thread3 = new Thread(new Runnable() { @Override public void run() { try { thread2.join(); System.out.println("测试人员测试新功能"); } catch (InterruptedException e) { e.printStackTrace(); } } }); System.out.println("早上:"); System.out.println("测试人员来上班了..."); thread3.start(); System.out.println("产品经理来上班了..."); thread1.start(); System.out.pr

通俗理解SSL/TLS协议区别与原理

通俗理解SSL/TLS协议区别与原理

区别(历史) TLS 1.0又被叫做SSL 3.1。 换算关系: 1 2 3 TLS 1.0 = SSL 3.1 TLS 1.1 = SSL 3.2 TLS 1.2 = SSL 3.3 综上,简单说,它们的区别只是版本更迭而已。 展开说的话,历史: 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。 1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。 1996年,SSL 3.0版问世,得到大规模应用。 1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。 2006年和2008年,TLS 1.1版和TLS 1.2版发布。(TLS1.2已经获得主流浏览器支持) 2008年8月,TLS 1.3版发布,性能好。移除了很多东西,速度快了很多,少了一次握手。 综上,可以先用TLS 1.2。 原理 和以前莉姐课上说的PGP协议差不多,都是三板斧:摘要、非对称加密、对称加密。 要解决的问题 1. 窃听。解决方案:加密 2. 篡改。解决方案:摘要 (解决数据完整性) 3. 冒充。解决方案:数字签名 (解决中间人攻击) 架构 ISO七层协议: TCP : 传输层 TLS : 会话层 表示层略 HTTP: 应用层 (TLS+HTTP=>HTTPS) 所以是先进行3次握手建立TCP,然后4次握手建立TLS,然后进行HTTP数据传输。 如果在TCP层抓包的话,里头是TLS加密过的数据。(中间人无法知道内容) 如果在HTTP层(应用层)收取数据的话,是已经解密过的明文。(但是中间人不太可能在应用层,除非已经嵌入到业务层代码了。) 简化版加密通信 假设用三个算法做一下加密通信,可以怎么实现呢? 定义如下: RSA: 一种非对称加密算法 AES: 一种对称加密算法 SHA1: 一种摘要算法 方案1:AES(K,data) 假如客户端是C,服务端是S,C和S要传输的数据data。 直接传明文肯定是不行,可以加密一下。用一个密钥K,加密成AES(K,data)。 这里为啥用AES呢,不用RSA呢,因为非对称加密(RSA)太慢了。 问题: 虽然别人不知道你俩传输了啥,但是可能悄悄得在中间篡改了数据,双方察觉不到。 解决方案: 加上摘要算法。 方案2:AES(K,data+SHA1(data)) 可以在数据后面加上数据的摘要,然后再加密,这样中间人一旦乱改东西马上就会被检测出来,类似于校验位。 问题: 上述方案都有一个前提,就是通信双方使用同一个K进行加解密。 那么一开始的时候怎么约定、协商这个密钥K呢? 解决方案: 先用RSA协商出一个对称密钥K。 协商密钥 最安全的方法当然是线下见面,约定一个密钥K。但是这个通信效率太低了,并发也不高。 为了避免中间人攻击,这个问题的关键点在于确认对方的身份。

踩到一个关于分布式锁的非比寻常的BUG!

踩到一个关于分布式锁的非比寻常的BUG!

提到分布式锁,大家一般都会想到 Redis。 想到 Redis,一部分同学会说到 Redisson。 那么说到 Redisson,就不得不掰扯掰扯一下它的“看门狗”机制了。 所以你以为这篇文章我要给你讲“看门狗”吗? 不是,我主要是想给你汇报一下我最近研究的由于引入“看门狗”之后,给 Redisson 带来的两个看起来就菊花一紧的 bug : 看门狗不生效的 BUG。 看门狗导致死锁的 BUG。 为了能让你丝滑入戏,我还是先简单的给你铺垫一下,Redisson 的看门狗到底是个啥东西。 看门狗描述 你去看 Redisson 的 wiki 文档,在锁的这一部分,开篇就提到了一个单词:watchdog https://github.com/redisson/redisson/wiki/8.-distributed-locks-and-synchronizers watchdog,就是看门狗的意思。 它是干啥用的呢? 好的,如果你回答不上来这个问题。那当你遇到下面这个面试题的时候肯定懵逼。 面试官:请问你用 Redis 做分布式锁的时候,如果指定过期时间到了,把锁给释放了。但是任务还未执行完成,导致任务再次被执行,这种情况你会怎么处理呢? 这个时候,99% 的面试官想得到的回答都是看门狗,或者一种类似于看门狗的机制。 如果你说:这个问题我遇到过,但是我就是把过期时间设置的长一点。 时间到底设置多长,是你一个非常主观的判断,设置的长一点,能一定程度上解决这个问题,但是不能完全解决。 所以,请回去等通知吧。 或者你回答:这个问题我遇到过,我不设置过期时间,由程序调用 unlock 来保证。 好的,程序保证调用 unlock 方法没毛病,这是在程序层面可控、可保证的。但是如果你程序运行的服务器刚好还没来得及执行 unlock 就宕机了呢,这个你不能打包票吧? 这个锁是不是就死锁了? 所以...... 为了解决前面提到的过期时间不好设置,以及一不小心死锁的问题,Redisson 内部基于时间轮,针对每一个锁都搞了一个定时任务,这个定时任务,就是看门狗。 在 Redisson 实例被关闭前,这个狗子可以通过定时任务不断的延长锁的有效期。 因为你根本就不需要设置过期时间,这样就从根本上解决了“过期时间不好设置”的问题。默认情况下,看门狗的检查锁的超时时间是 30 秒钟,也可以通过修改参数来另行指定。 如果很不幸,节点宕机了导致没有执行 unlock,那么在默认的配置下最长 30s 的时间后,这个锁就自动释放了。 那么问题来了,面试官紧接着来一个追问:怎么自动释放呢? 这个时候,你只需要来一个战术后仰:程序都没了,你觉得定时任务还在吗?定时任务都不在了,所

联系我们

联系电话

4000-640-466

联系邮箱

service@f-li.cn

办公地址

上海黄浦区外滩源1号

谢谢,您的信息已成功发送。
请填写信息。