Fork me on GitHub

一份工作坚持多久跳槽最合适?

对于一份工作,坚持多久跳槽最合适呢?是应该把一份工作至少坚持做满18个月,还是不管自己在这家公司待了多久,一有合适的时机就立刻辞职跳槽呢?

临近年关,王丽一直惴惴不安,时刻盯着手机,生怕遗漏任何重要的电话。前不久,她去应聘了一家心仪的单位岗位,过五关斩六将,已经通过了两轮面试。本打算年后辞职的,但左等右等,就是没有等来录取的offer,也没有接到不录用的通知。

思前想后,王丽不知道其中是哪一个环节出错了,就能力而言,她自信完全可以胜任面试的岗位。如果说哪里有薄弱的地方,就是自己每份工作干的时间都不长,最短的9个月,最长的也就2年。而目前的这份工作,也才刚满1年,难道HR是在意这点吗?那究竟工作几年跳槽最合适呢?

有的人认为,如果你真的不喜欢自己的工作,那就应该离开。这是你的生活,你只需要按照自己的规则生活,其他人的规则与你无关。

但是,如果一个人在4年内换了3份工作,这会引起CEO或HR的警惕。要么你太容易喜新厌旧,不能持之以恒,要么是因为你绩效不佳被辞退,或者因为你不够忠诚,随时准备跳槽等等,这会对公司团队文化和生产效率造成极大的破坏。这是任何一家企业都不能容忍的,尤其是小型企业。

是应该把一份工作至少坚持做满18个月,还是不管自己在这家公司待了多久,一有合适的时机就立刻辞职跳槽呢?人力资源专家迈克尔·O·切齐表示,这取决于你从工作中学到了多少,以及这份工作对你的职业生涯有何裨益

01

8个月内跳槽最糟糕

一份工作如果不满8个月就辞职跳槽,这是很糟糕的,除非你能找出非常客观的理由,比如公司大规模的裁员行为或工厂倒闭。

无论是HR还是猎头,对应聘者非常看重的一点便是“忠诚度”,因为一个企业不希望辛辛苦苦培养的员工到头来却为别人做了嫁衣。一个人如果在同一个单位工作年限低于2年往往会被看作“不够忠诚”,不到1年,便被视为“稳定性差”。

8个月内就跳槽,这在HR眼里,或许表明你没有通过6个月的评估或第一个绩效周期。迈克尔建议,你最好在履历中省略这份工作,将任何成就算入自由职业部分。

有些东西太糟糕了,只能被抛弃,其中就包括低于8个月的工作。

02

18个月是社会公认的下限

工作了至少18个月才考虑跳槽,这是社会公认的下限。这意味着你至少安然度过了一个评估周期。通常而言,绩效评估是按年进行的,而且公司只会对工作满6个月的员工进行评估。而这正是18个月这个数字的由来。

迈克尔表示,短期工作不能太多,如果你在一份工作中“被诱骗”,工作仅8个月就离职是可以理解的。但如果有5份工作均是如此,这似乎就是你的问题了。除非这份工作非常糟糕,否则你应该至少将这份工作做满18个月,跨越2个日历年。虽然我们不喜欢这些规则,不过许多公司非常不待见前一份工作只干了6至17个月的员工,这是现实。

img

03

48个月跳槽比较好

在其他方面相同的情况下,2年好于18个月,3年好于2年,4年好于3年。3年正是大多数正规企业第一次签合同的期限,如果被公司认可,那么接下来将会是合同续签。工作满4年了,你可以得到在那里工作的“全部学分”,除非有明显的证据证明你表现不佳或停滞不前。如果你有幸在第四或者第五年被内部提拔,那么继续在这个岗位上。

如果到了第四、五年,成绩突出却没有得到更高的职位或者薪水,那么最明智的选择就是跳槽。因为眼下的环境已经成了瓶颈,而且个人的求胜欲望和上进心处于高点,此时跳槽不仅可以得到更高的职位和待遇,也可以继续延续个人的求胜欲望。

04

72个月还没升迁,赶紧跳

工作72个月了,此时,如果你没有得到升职或更好的项目,这份工作将开始给你带来伤害。但是,如果你能不断获得升迁,这份工作可以做多长时间呢?答案是——没有上限。

一个人在进入一个新的工作环境,第一年往往是“打酱油”的熟悉过程;第二年才可能慢慢进入角色,真正融入企业文化;经过前两年的积累,到了第三年才真正出成绩,当然这也是职位和薪资提高的关键时期。工作满四年,除去入职后的第一年,其他三年没有起伏,或者有平级调动,这种情形还是可以接受的。

如果你6年之后依旧没有明显的升职记录,这就会让人觉得你胸无大志,虽然你还不至于糟糕到连工作都保不住的程度,但你也只能算是平庸之辈。

在同一个公司同一个职位上,一旦错过了3~5年的跳槽黄金期,员工对安逸的需求大于上进求胜的欲望,随着年龄的增大、家庭琐事的负担,人的惰性将越来越束缚内心,最终沦为朝九晚五混日子的上班族。

本文转载自:**https://mp.weixin.qq.com/s/2rWtOPXnZxodomBTBtbXNg

我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?

原文地址: https://mp.weixin.qq.com/s/7jgtRs6HxssL8QWV1wWLWQ

String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的。

就如本文我们要讨论的问题:Java中的String有没有长度限制?

这个问题要分两个阶段看,分别是编译期和运行期。不同的时期限制不一样。

1

编译期

首先,我们先来合理的推断一下,当我们在代码中使用String s = “”;的形式来定义String对象的时候,””中字符的个数有没有限制呢?

既然是合理的推断,那就要要足够的依据,所以我们可以从String的源码入手,根据public String(char value[], int offset, int count)的定义,count是int类型的,所以,char value[]中最多可以保存Integer.MAX_VALUE个,即2147483647字符。(jdk1.8.0_73)

但是,实验证明,String s = “”;中,最多可以有65534个字符。如果超过这个个数。就会在编译期报错。

1
2
3
4
5
6
7
8
public static void main(String[] args) {

String s = "a...a";// 共65534个a
System.out.println(s.length());

String s1 = "a...a";// 共65535个a
System.out.println(s1.length());
}

以上代码,会在String s1 = “a…a”;// 共65535个a处编译失败:

1
2
✗ javac StringLenghDemo.java
StringLenghDemo.java:11: 错误: 常量字符串过长

明明说好的长度限制是2147483647,为什么65535个字符就无法编译了呢?

当我们使用字符串字面量直接定义String的时候,是会把字符串在常量池中存储一份的。那么上面提到的65534其实是常量池的限制。

常量池中的每一种数据项也有自己的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8类型表示。

CONSTANTUtf8info是一个CONSTANTUtf8类型的常量池数据项,它存储的是一个常量字符串。常量池中的所有字面量几乎都是通过CONSTANTUtf8info描述的。CONSTANTUtf8_info的定义如下:

1
2
3
4
5
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}

由于本文的重点并不是CONSTANTUtf8info的介绍,这里就不详细展开了,我们只需要我们使用字面量定义的字符串在class文件中,是使用CONSTANTUtf8info存储的,而CONSTANTUtf8info中有u2 length;表明了该类型存储数据的长度。

u2是无符号的16位整数,因此理论上允许的的最大长度是2^16=65536。而 java class 文件是使用一种变体UTF-8格式来存放字符的,null 值使用两个 字节来表示,因此只剩下 65536- 2 = 65534个字节。

关于这一点,在the class file format spec中也有明确说明:

1
The length of field and method names, field and method descriptors, and other constant string values is limited to 65535 characters by the 16-bit unsigned length item of the CONSTANTUtf8info structure (§4.4.7). Note that the limit is on the number of bytes in the encoding and not on the number of encoded characters. UTF-8 encodes some characters using two or three bytes. Thus, strings incorporating multibyte characters are further constrained.

也就是说,在Java中,所有需要保存在常量池中的数据,长度最大不能超过65535,这当然也包括字符串的定义咯。

2

运行期

上面提到的这种String长度的限制是编译期的限制,也就是使用String s= “”;这种字面值方式定义的时候才会有的限制。

那么。String在运行期有没有限制呢,答案是有的,就是我们前文提到的那个Integer.MAX_VALUE ,这个值约等于4G,在运行期,如果String的长度超过这个范围,就可能会抛出异常。(在jdk 1.9之前)

int 是一个 32 位变量类型,取正数部分来算的话,他们最长可以有

1
2
3
4
5
6
7
2^31-1 =214748364716-bit Unicodecharacter

2147483647 * 16 = 34359738352
34359738352 / 8 = 4294967294 (Byte)
4294967294 / 1024 = 4194303.998046875 (KB)
4194303.998046875 / 1024 = 4095.9999980926513671875 (MB)
4095.9999980926513671875 / 1024 = 3.99999999813735485076904296875 (GB)

有近 4G 的容量。

Intellij Idea 导入多个maven项目展示在右侧栏Maven Projects

原文地址: https://blog.csdn.net/qq496013218/article/details/74910155

一、从eclipse切换IntelliJ IDEA 也有一段时间了,基本上功能和快捷键都用的顺手了,感受到了IntelliJ IDEA 的强大。刚开始因为不熟悉这个强大的开发工具,所以分刚开始还是多走了一些弯路。我们的项目是划分了很多分布式的项目,多个服务,每次把几十个项目的pom.xml文件选中才能在右侧栏的Maven Projects展示。今天我们演示如何一次性把多个的Maven导入到Maven Projects中,首先如下图:

选中Module from Existing Sources…,然后如下图所示,操作如下:

选中项目的根目录,然后会出现下面的这个界面操作如下:

默认情况下是选中的Create modules from existing sources,我们选中下面一个import module from external model,然后next。继续下面的操作,如图所示:

选中红色框标记的Search from project recursively,然后next,出现下图界面:

点击next,默认即可,操作如下:

最后是展示的导入maven project,点击next:

最后一步next即可,完成之后,项目自动在右侧的maven projects展示,如果没有展示请使用快捷键 ctrl+shift +a。注意:快捷键可能存在冲突,导致无法使用。

FlipaClip——人人都是灵魂画师

原文地址: FlipaClip——人人都是灵魂画师

一直以来很多人都在问我,算法题解的图是用什么软件画的?

在这里隆重的介绍一下:

我是在iPad上用FlipaClip这个软件画的,推荐配合Apple Pencil一起使用,IOS和Android平台均可下载该软件。

img

#为什么选择FlipaClip?

FlipaClip是一款绘制动画的软件,通过一帧帧的图像最后合成动画。就像小时候的动画片一样,靠着无数张图画构成了动起来的动画。

FlipaClip主要支持以下功能:

  • 基本的画笔、橡皮、套索、油漆桶和文字
  • 格尺功能,可以画直线、方形和椭圆
  • 拷贝粘贴,可以通过套索复制一小部分内容或者一帧的内容
  • 网格和洋葱皮,支持一帧多个图层
  • 可以置入视频和图片,可以导出图片、gif或mp4格式

同款类型的软件其实不少,我都进行过试用和测评,其中主要包括以下几款:

  1. 动画桌:动画桌给人一种很专业的感觉,里面的画笔种类和动画功能十分丰富。不过使用起来复杂繁琐,对于我这种非专业人士来说功能过多不是件好事儿。
  2. Folioscope:这个软件更像是为小朋友准备的,整体界面比较粗糙,功能也较为匮乏,比如导出图片、网格对齐、复制图像等十分重要的功能都没有。
  3. PicsArt Animator:这个软件很让人无语,我最开始认为它最符合我的要求,但是居然在导出图片时闪退,而且无解,所以弃疗了。

综上所述,由于FlipaClip功能全面,更符合我的需求,故而采用了它。

#怎么用FlipaClip?

为了向大家展示下这个软件有多么的好用,我将以身试法,通过三部分来讲解软件的妙用!

#第一部分:软件界面

首先进入软件,可以看到以前的绘制列表

进入软件

点击新建项目,其中画布尺寸指的是画布的宽高像素与比例,帧率指的是每秒钟播放几张图片

新建项目

进入项目后则可以看到各种功能,下图进行了简介

界面简介

#第二部分:绘制静态图

总算毕业了,拿自己的硕士毕业照开心一下,首先导入图片

毕业照

新建图层,进行描边

描边图

隐藏图片图层,上个色,看下整体效果,哇哦~~

整体效果

看到了这张图片的效果,我觉得不是很开心了,有点直击我的灵魂底线了。。。

照片可以丢了

当然,这只是个静态图描边的用法,下面我将重新来过,向大家展示下如何绘制动画

#第三部分:绘制动画

本动画一共有6帧,我先将6帧的静态图都画了出来

第一帧是小猫准备吃西瓜

准备吃

第二帧是小猫咬了一口西瓜

咬一口

第三帧是小猫开始咀嚼西瓜

咀嚼

第四帧是小猫用力的咀嚼西瓜

再咀嚼

第五帧和第六帧是三四帧的循环

我们最后将帧率设置为6,这样的话1秒钟就能将6幅图播放完毕,看起来小喵喵就比较真实了,导出gif文件

导出文件

最后就是在炎炎夏日下可爱的猫咪吃西瓜动图,可爱的绝对可以让你忘记那张毕业照~~

猫咪吃西瓜

这个软件是不是很棒呢?欢迎大家一起使用FlipaClip,绘制出你的灵魂画作!

ARTS-1

ARTS是由左耳朵耗子陈皓在极客时间专栏《左耳听风》中发起的一个每周学习打卡计划。

1
2
3
4
5
6
7
Algorithm:至少做一个 LeetCode 的算法题。主要为了编程训练和学习。

Review :阅读并点评至少一篇英文技术文章。主要为了学习英文,如果你英文不行,很难成为技术高手。

Tip:学习至少一个技术技巧。主要是为了总结和归纳你日常工作中所遇到的知识点。

Share:分享一篇有观点和思考的技术文章。主要为了输出你的影响力,能够输出你的价值观。

Algorithm(算法)

Leetcode 1 两数之和

方法一:暴力法

暴力法很简单,遍历每个元素 xx,并查找是否存在一个值与 target - xtargetx 相等的目标元素。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}

复杂度分析:

时间复杂度:O(n^2),对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)。

空间复杂度:O(1)。

方法二:两遍哈希表

为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法是什么?哈希表。

通过以空间换取速度的方式,我们可以将查找时间从 O(n) 降低到 O(1)。哈希表正是为此目的而构建的,它支持以 近似恒定的时间进行快速查找。我用“近似”来描述,是因为一旦出现冲突,查找用时可能会退化到 O(n)。但只要你仔细地挑选哈希函数,在哈希表中进行查找的用时应当被摊销为 O(1)。

一个简单的实现使用了两次迭代。在第一次迭代中,我们将每个元素的值和它的索引添加到表中。然后,在第二次迭代中,我们将检查每个元素所对应的目标元素(targetnums[i])是否存在于表中。注意,该目标元素不能是 nums[i] 本身!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
}

复杂度分析:

时间复杂度:O(n),
我们把包含有 n 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1) ,所以时间复杂度为 O(n)。

空间复杂度:O(n),
所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素。

方法三:一遍哈希表

事实证明,我们可以一次完成。在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}

复杂度分析:

  • 时间复杂度:O(n),
    我们只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。
  • 空间复杂度:O(n),
    所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。

画解

原文地址: https://draw.mdnice.com/algorithm/1.html

fr<x>ame_00001.png

fr<x>ame_00002.png

fr<x>ame_00003.png fr<x>ame_00004.png fr<x>ame_00005.png

Review(点评)

是什么让你成为团队中的优秀程序员?

  1. 积极态度: 专注,积极,耐心
  2. 良好的沟通技巧: 出色的沟通技巧与卓越的技术技能直接相关。
  3. 精通时间和任务管理: 非常可靠,并牢记最后期限
  4. 一个优秀的团队合作者: 无私地分享他们的知识并帮助其他开发人员改进的愿望是优秀开发人员的另一个优秀品质。
  5. 高度关注用户: 而伟大的程序员会为最终用户做最好的事情
  6. 优秀与伟大: 一个优秀的程序员是聪明的,而一个伟大的程序员是明智的。

Tip(技巧)

java -jar 后台运行

1
2
3
nohup java -jar XXX.jar >log.out &;

解析: 把此进程作为后台进程运行,且把日志输出到log.out文件中

Share(分享)

产品观点

如何超过大多数人

原文地址: https://coolshell.cn/articles/19464.html

当你看到这篇文章的标题,你一定对这篇文章产生了巨大的兴趣,因为你的潜意识在告诉你,这是一本人生的“武林秘籍”,而且还是左耳朵写的,一定有干货满满,只要读完,一定可以练就神功并找到超过大多数人的快车道和捷径……然而…… 当你看到我这样开篇时,你一定会觉得我马上就要有个转折,告诉你这是不可能的,一切都需要付出和努力……然而,你错了,这篇文章还真就是一篇“秘籍”,只要你把这些“秘籍”用起来,你就一定可以超过大多数人。而且,这篇文章只有我这个“人生导师”可以写得好。毕竟,我的生命过到了十六进制2B的年纪,踏入这个社会已超过20年,舍我其谁呢?!

P.S. 这篇文章借鉴于《如何写出无法维护的代码》一文的风格……嘿嘿

相关技巧和最佳实践

要超过别人其实还是比较简单的,尤其在今天的中国,更是简单。因为,你只看看中国的互联网,你就会发现,他们基本上全部都是在消费大众,让大众变得更为地愚蠢和傻瓜。所以,在今天的中国,你基本上不用做什么,只需要不使用中国互联网,你就很自然地超过大多数人了。当然,如果你还想跟他们彻底拉开,甩他们几个身位,把别人打到底层,下面的这些“技巧”你要多多了解一下。

在信息获取上,你要不断地向大众鼓吹下面的这些事:

  • 让大家都用百度搜索引擎查找信息,订阅微信公众号或是到知乎上学习知识……要做到这一步,你就需要把“百度一下”挂在嘴边,然后要经常在群或朋友圈中转发微信公众号的文章,并且转发知乎里的各种“如何看待……”这样的文章,让他们爱上八卦,爱上转发,爱上碎片。
  • 让大家到微博或是知识星球上粉一些大咖,密切关注他们的言论和动向……是的,告诉大家,大咖的任何想法一言一行都可以在微博、朋友圈或是知识星球上获得,让大家相信,你的成长和大咖的见闻和闲扯非常有关系,你跟牛人在一个圈子里你也会变牛。
  • 把今日头条和抖音这样的APP推荐给大家……你只需要让你有朋友成功地安装这两个APP,他们就会花大量的时间在上面,而不能自拔,要让他们安装其实还是很容易的,你要不信你就装一个试玩一会看看(嘿嘿嘿)。
  • 让大家热爱八卦,八卦并不一定是明星的八卦,还可以是你身边的人,比如,公司的同事,自己的同学,职场见闻,社会热点,争议话题,……这些东西总有一些东西会让人心态有很多微妙的变化,甚至花大量的时间去搜索和阅读大量的观点,以及花大量时间与人辩论争论,这个过程会让人上瘾,让人欲罢不能,然而这些事却和自己没有半毛钱关系。你要做的事就是转发其中一些SB或是很极端的观点,造成大家的一睦讨论后,就早早离场……
  • 利用爱国主义,让大家觉得不用学英文,不要出国,不要翻墙,咱们已经是强国了……这点其实还是很容易做到的,因为学习是比较逆人性的,所以,只要你鼓吹那些英文无用论,出国活得更惨,国家和民族都变得很强大,就算自己过得很底层,也有大国人民的感觉。

然后,在知识学习和技能训练上,让他们不得要领并产生幻觉

  • 让他们混淆认识和知识,以为开阔认知就是学习,让他们有学习和成长的幻觉……
  • 培养他们要学会使用碎片时间学习。等他们习惯利用碎片时间吃快餐后,他们就会失去精读一本书的耐性……
  • 不断地给他们各种各样“有价值的学习资料”,让他们抓不住重点,成为一个微信公众号或电子书“收藏家”……
  • 让他们看一些枯燥无味的基础知识和硬核知识,这样让他们只会用“死记硬背”的方式来学习,甚至直接让他们失去信心,直接放弃……
  • 玩具手枪是易用的,重武器是难以操控的,多给他们一些玩具,这样他们就会对玩具玩地得心应手,觉得玩玩具就是自己的专业……
  • 让他们喜欢直接得到答案的工作和学习方式,成为一个伸手党,从此学习再也不思考……
  • 告诉他们东西做出来就好了,不要追求做漂亮,做优雅,这样他们就会慢慢地变成劳动密集型……
  • 让他们觉得自己已经很努力了,剩下的就是运气,并说服他们去‘及时行乐’,然后再也找不到高阶和高效率学习的感觉……
  • 让他们觉得“读完书”、“读过书”就行了,不需要对书中的东西进行思考,进行总结,或是实践,只要囫囵吞枣尽快读完就等同于学好了……

最后,在认知和格局上,彻底打垮他们,让他们变成韭菜。

  • 让他们不要看到大的形势,只看到眼前的一亩三分地,做好一个井底之蛙。其实这很简单,比如,你不要让他们看到整个计算机互联网技术改变人类社会的趋势,你要多让他看到,从事这一行业的人有多苦逼,然后再说一下其它行业或职业有多好……
  • 宣扬一夜暴富以及快速挣钱的案例,最好让他们进入“赌博类”或是“传销类”的地方,比如:股市、数字货币……要让他们相信各种财富神话,相信他们就是那个幸运儿,他们也可以成为巴菲特,可以成为马云……
  • 告诉他们,一些看上去很难的事都是有捷径的,比如:21天就能学会机器学习,用区块链就能颠覆以及重构整个世界等等……
  • 多跟他们讲一些小人物的励志的故事,这样让他们相信,不需要学习高级知识,不需要掌握高级技能,只需要用低等的知识和低级的技能,再加上持续不断拼命重复现有的工作,终有一天就会成功……
  • 多让他们跟别人比较,人比人不会气死人,但是会让人变得浮躁,变得心急,变得焦虑,当一个人没有办法控制自己的情绪,没有办法让自己静下心来,人会失去耐性和坚持,开始好大喜欢功,开始装逼,开始歪门邪道剑走偏锋……
  • 让他们到体制内的一些非常稳定的地方工作,这样他们拥有不思进取、怕承担责任、害怕犯错、喜欢偷懒、得过且过的素质……
  • 让他们到体制外的那些喜欢拼命喜欢加班的地方工作,告诉他们爱拼才会赢,努力加班是一种福报,青春就是用来拼的,让他们喜欢上使蛮力的感觉……
  • 告诉他们你的行业太累太辛苦,干不到30岁。让他们早点转行,不要耽误人生和青春……
  • 当他们要做决定的时候,一定要让他们更多的关注自己会失去的东西,而不是会得到的东西。培养他们患得患失心态,让他们认识不到事物真正的价值,失去判断能力……(比如:让他们觉得跟对人拍领导的马屁忠于公司比自我的成长更有价值)
  • 告诉他们,你现有的技能和知识不用更新,就能过好一辈子,新出来的东西没有生命力的……这样他们就会像我们再也不学习的父辈一样很快就会被时代所抛弃……
  • 每个人都喜欢在一些自己做不到的事上找理由,这种能力不教就会,比如,事情太多没有时间,因为工作上没有用到,等等,你要做的就是帮他们为他们做不到的事找各种非常合理的理由,比如:没事的,一切都是最好的安排;你得不到的那个事没什么意思;你没有面好主要原因是那个面试官问的问题都是可以上网查得到的知识,而不没有问到你真正的能力上;这些东西学了不用很快会忘了,等有了环境再学也不迟……

最后友情提示一下,上述的这些“最佳实践”你要小心,是所谓,贩毒的人从来不吸毒,开赌场的人从来不赌博!所以,你要小心别自己也掉进去了!这就是“欲练神功,必先自宫”的道理。

相关原理和思维模型

对于上面的这些技巧还有很多很多,你自己也可以发明或是找到很多。所以,我来讲讲这其中的一些原理。

一般来说,超过别人一般来说就是两个维度:

  1. 在认知、知识和技能上。这是一个人赖以立足社会的能力(参看《程序员的荒谬之言还是至理名言?》和《21天教你学会C++》)
  2. 在领导力上。所谓领导力就是你跑在别人前面,你得要有比别人更好的能力更高的标准(参看《技术人员发展之路》)

首先,我们要明白,人的技能是从认识开始,然后通过学校、培训或是书本把“零碎的认知”转换成“系统的知识”,而有要把知识转换成技能,就需要训练和实践,这样才能完成从:认识 -> 知识 -> 技能 的转换。这个转换过程是需要耗费很多时间和精力的,而且其中还需要有强大的学习能力和动手能力,这条路径上有很多的“关卡”,每道关卡都会过滤掉一大部分人。比如:对于一些比较枯燥的硬核知识来说,90%的人基本上就倒下来,不是因为他们没有智商,而是他们没有耐心。

认知

要在认知上超过别人,就要在下面几个方面上做足功夫:

1)信息渠道。试想如果别人的信息源没有你的好,那么,这些看不见信息源的人,只能接触得到二手信息甚至三手信息,只能获得被别人解读过的信息,这些信息被三传两递后必定会有错误和失真,甚至会被传递信息的中间人hack其中的信息(也就是“中间人攻击”),而这些找不出信息源的人,只能“被人喂养”,于是,他们最终会被困在信息的底层,永世不得翻身。(比如:学习C语言,放着原作者K&R的不用,硬要用错误百出谭浩强的书,能有什么好呢?)

2)信息质量。信息质量主要表现在两个方面,一个是信息中的燥音,另一个是信息中的质量等级,我们都知道,在大数据处理中有一句名言,叫 garbage in garbage out,你天天看的都是垃圾,你的思想和认识也只有垃圾。所以,如果你的信息质量并不好的话,你的认知也不会好,而且你还要花大量的时间来进行有价值信息的挖掘和处理。

3)信息密度。优质的信息,密度一般都很大,因为这种信息会逼着你去干这么几件事,a)搜索并学习其关联的知识,b)沉思和反省,c)亲手去推理、验证和实践……一般来说,经验性的文章会比知识性的文章会更有这样的功效。比如,类似于像 Effiective C++/Java,设计模式,Unix编程艺术,算法导论等等这样的书就是属于这种密度很大的书,而像Netflix的官方blogAWS CTO的blog等等地方也会经常有一些这样的文章。

知识

要在知识上超过别人,你就需要在下面几个方面上做足功夫:

阅读更多...

缓存穿透、缓存击穿和缓存雪崩实践

作者:xiaolyuh

https://my.oschina.net/u/3748347/blog/2995017

我们使用缓存的主要目是提升查询速度和保护数据库等稀缺资源不被占满。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数据库资源占满,引起数据库故障。今天我主要分享一下layering-cache缓存框架在这个三个问题上的实践方案。

概念

缓存穿透

在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接落到数据库上,如活动系统里面查询一个不存在的活动。

缓存击穿

在高并发下,对一个特定的值进行查询,但是这个时候缓存正好过期了,缓存没有命中,导致大量请求直接落到数据库上,如活动系统里面查询活动信息,但是在活动进行过程中活动缓存突然过期了。

缓存雪崩

在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。

常见解决方案

  • 直接缓存NULL值
  • 限流
  • 缓存预热
  • 分级缓存
  • 缓存永远不过期

layering-cache实践

在layering-cache里面结合了缓存NULL值,缓存预热,限流、分级缓存和间接的实现”永不过期”等几种方案来应对缓存穿透、击穿和雪崩问题。

直接缓存NULL值

应对缓存穿透最有效的方法是直接缓存NULL值,但是缓存NULL的时间不能太长,否则NULL数据长时间得不到更新,也不能太短,否则达不到防止缓存击穿的效果。

我在layering-cache对NULL值进行了特殊处理,一级缓存不允许存NULL值,二级缓存可以配置缓存是否允许存NULL值,如果配置可以允许存NULL值,框架还支持配置缓存非空值和NULL值之间的过期时间倍率,这使得我们能精准的控制每一个缓存的NULL值过期时间,控制粒度非常细。当NULL缓存过期我还可以使用限流,缓存预热等手段来防止穿透。

示例:

1
2
3
4
5
6
7
8
9
@Cacheable(value = "people", key = "#person.id", depict = "用户信息缓存",
firstCache = @FirstCache(expireTime = 10, timeUnit = TimeUnit.MINUTES),
secondaryCache = @SecondaryCache(expireTime = 10, timeUnit = TimeUnit.HOURS,
isAllowNullValue = true, magnification = 10))
public Person findOne(Person person) {
Person p = personRepository.findOne(Example.of(person));
logger.info("为id、key为:" + p.getId() + "数据做了缓存");
return p;
}

在这个例子里面isAllowNullValue = true表示允许换存NULL值,magnification = 10表示NULL值和非NULL值之间的时间倍率是10,也就是说当缓存值为NULL是,二级缓存的有效时间将是1个小时。

限流

应对缓存穿透的常用方法之一是限流,常见的限流算法有滑动窗口,令牌桶算法和漏桶算法,或者直接使用队列、加锁等,在layering-cache里面我主要使用分布式锁来做限流。

阅读更多...

是什么让你成为团队中的优秀程序员?

原文地址: 是什么让你成为团队中的优秀程序员?

大多数软件开发人员不仅希望成为一名称职的专业人士,而且也是一名优秀的专业人士。

如今,随着在线访问许多课程,没有必要再学习成为一名优秀的软件开发人员。然而,许多伟大的程序员去了大学并专攻计算机科学。因为获得CS学位有助于更好地理解架构,并为我们提供未来软件开发世界的整体视角。

当我看到许多程序员时,我发现他们总是试图了解新技术,语言,趋势等。

我也知道编码知识是必须的,但这并不意味着我们应该学习互联网上的任何东西。

没人能学到一切。

我在一些优秀的专业人士身上看到的是,他们不仅精通技术技能,而且精通商业和人际技能。他们了解企业的需求并提供公司所需的产品。他们知道如何有效地与他人合作,并提供比单独完成更多的工作。

事实上,如何成为一名优秀的程序员,还有很多方法,但最好的方法可能是成为优秀编程团队的贡献成员。

这里有一些优秀的软件开发人员的品质:

1.积极态度

一个伟大的程序员关心产品。他们专注,积极,耐心,能够解决最繁琐,最具挑战性的问题。他们为自己的代码贡献感到自豪,并使团队中的其他开发人员易于阅读和理解。

如果有必要,他们会加强并且不会受到挑战的劝阻,因为他们关心他们正在做什么。

他们不会让他们的自我妨碍反馈。相反,他们正在等待/寻求关于他们的工作和行为的建设性反馈。

2.良好的沟通技巧

出色的沟通技巧与卓越的技术技能直接相关。

一个优秀的开发人员可以清楚地理解问题,将其分解为假设,并提出一致的解决方案。

他们通过提出正确的问题,然后记录收到的答案,不仅为自己而且为团队,快速理解概念。

此外,通过成为更好的沟通者,他们可以利用他人的力量和专业,并为他们周围的人提供自己的优势。

3.精通时间和任务管理

这意味着它们非常可靠,并牢记最后期限。他们知道人类在预测完成任务所需的工作量和时间方面很糟糕,但他们通过使用技术,策略(如敏捷点)和帮助他们的工具变得擅长。

4.一个优秀的团队合作者

无私地分享他们的知识并帮助其他开发人员改进的愿望是优秀开发人员的另一个优秀品质。

当他们陷入困境时,他们会帮助队友,并且因为他们对团队成就比个人更感兴趣而受到批评。他们教授新技能,为开源做贡献,并编写文档,不仅可以帮助团队成员,还可以帮助开发人员社区。

5.高度关注用户

一个优秀的程序员会对他们提出要求,而伟大的程序员会为最终用户做最好的事情。

他们会建议构建最适合最终用户的解决方案,即使这是一个更复杂或更困难的观点。

优秀与伟大

一个优秀的程序员是聪明的,而一个伟大的程序员是明智的。

同样,一个优秀的程序员可能会在他们的代码中使用大量的算法。一个伟大的程序员知道要使用哪些库,因此他们不必经常编写算法。

一个优秀的程序员确保每个功能在交付之前完美运行。一个伟大的程序员管理项目的范围,以便在截止日期前提供关键功能。

一个优秀的程序员通过创建复杂的定制代码来展示他们的天才。一个伟大的程序员尽可能简单有效地解决问题。

事实上,从一个优秀的程序员到伟大的程序员的转变往往来自于激情,奉献,实践,理解,诚实的努力,时间和多样化的经验。

(十年的不同背景远大于一年重复十次)。

有时它们的声音和行为有点像企业主。不像技术怪人。他们理解他们在增值链中的作用,并知道他们不仅编写代码,而且还为用户,业务和周围的人提供新的价值 - 新的机会。

最优秀的程序员是可爱的,并且总是有时间为团队中的其他开发人员。

成为优秀的开发人员背后有很多东西,我刚刚列出了我认为在优秀软件开发人员中最重要的特性。

我的目标之一与您的目标相同:成为优秀的软件工程师。关于这个旅程的更多信息,我将在每周时事通讯中分享(+奖励“专业网络备忘单”)。

我希望这篇文章对您有所帮助,如果您想到优秀软件开发人员的任何其他基本功能,请在下面发表评论或在推特上与我联系****。

谢谢你的阅读!🙏

如果您喜欢这篇文章,请与您的朋友和同事分享!

干杯,
ilonacodes

在CentOS 7上安装Jenkins(翻译)

原文地址: How To Install Jenkins on CentOS 7

Jenkins是一个基于Java的开源自动化服务器,它提供了一种设置持续集成和连续交付(CI / CD)管道的简便方法。

持续集成(CI)是一种DevOps实践,其中团队成员定期将其代码更改提交到版本控制存储库,然后运行自动构建和测试。持续交付(CD)是一系列实践,其中代码更改自动构建,测试并部署到生产中。

本教程将指导您使用官方Jenkins存储库在CentOS 7系统上安装Jenkins的步骤。

先决条件

在继续本教程之前,请确保以具有sudo权限用户身份登录。

安装Jenkins

要在CentOS系统上安装Jenkins,请按照以下步骤操作:

  1. Jenkins是一个Java应用程序,因此第一步是安装Java。运行以下命令以安装OpenJDK 8程序包:

    1
    sudo yum install java-1.8.0-openjdk-devel

    当前版本的Jenkins尚不支持Java 10(和Java 11)。如果您的计算机上安装了多个Java版本,请确保Java 8是默认的Java版本

  2. 下一步是启用Jenkins存储库。为此,请使用以下curl命令导入GPG密钥:

    1
    curl --silent --location http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo | sudo tee /etc/yum.repos.d/jenkins.repo

    并使用以下命令将存储库添加到系统:

    1
    sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
  3. 启用存储库后,键入以下命令安装最新的稳定版Jenkins:

    1
    sudo yum install jenkins

    安装过程完成后,启动Jenkins服务:

    1
    sudo systemctl start jenkins

    要检查它是否已成功运行:

    1
    systemctl status jenkins

    你应该看到类似的东西:

    1
    2
    3
    4
    5
    6
    ● jenkins.service - LSB: Jenkins Automation Server
    Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
    Active: active (running) since Thu 2018-09-20 14:58:21 UTC; 15s ago
    Docs: man:systemd-sysv-generator(8)
    Process: 2367 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
    CGroup: /system.slice/jenkins.service

    最后启用Jenkins服务以启动系统启动。

    1
    sudo systemctl enable jenkins
    1
    2
    jenkins.service is not a native service, redirecting to /sbin/chkconfig.
    Executing /sbin/chkconfig jenkins on

调整防火墙

如果要在受防火墙保护的远程CentOS服务器上安装Jenkins,则需要移植8080

使用以下命令打开必要的端口:

1
sudo firewall-cmd --permanent --zone=public --add-port=8080/tcpsudo firewall-cmd --reload

设置Jenkins

要设置新的Jenkins安装,请打开浏览器并键入域或IP地址,然后输入端口8080

1
http://your_ip_or_domain:8080

将出现类似于以下内容的屏幕,提示您输入在安装期间创建的管理员密码:

使用以下命令在终端上打印密码:

1
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

您应该看到一个32个字符的长字母数字密码,如下所示:

1
2115173b548f4e99a203ee99a8732a32

从终端复制密码,将其粘贴到管理员密码字段中,然后单击Continue

在下一个屏幕上,系统将询问您是要安装建议的插件还是选择特定的插件。单击该Install suggested plugins框,安装过程将立即开始。

安装完成后,系统将提示您设置第一个管理用户。填写所有必填信息,然后单击Save and Continue

在下一页中,将要求您设置Jenkins实例的URL。URL字段将填充自动生成的URL。

要完成设置,请单击Save and Finish按钮确认URL 。

最后,单击该Start using Jenkins按钮,您将被重定向到以前面一个步骤中创建的管理员用户身份登录的Jenkins仪表板。

如果你已达到这一点,那么你已经在CentOS系统上成功安装了Jenkins。

结论

在本教程中,您学习了如何在基于CentOS / RHEL的系统上安装和完成Jenkins的初始配置。您现在可以访问官方Jenkins文档页面并开始探索Jenkins的工作流程和插件模型。

如果您有任何疑问,请在下面留言。

5个软件开发人员的不良习惯

原文地址: 5 Bad Habits Of Software Developers

关于程序员应该如何编程,没有严格的规则。所以,如果你有自己的编程风格,没有错。

程序员没有固定的习惯,但我想提一些妨碍程序员进步的行为。

以下是开发人员应该避免更快爬上梯子的五大习惯:

1.没有代码结构或代码风格

统一大规模的代码结构(架构)和商定的小规模代码风格是必须的。有时程序员从一个项目开始而没有定义这些项目,因此,当项目变得越来越大时,管理它就变得很困难。

此外,当多个程序员正在处理项目时,代码结构和样式在某些条件下有所帮助 - 它易于进行代码管理。

2.盲目复制粘贴代码

毫无疑问,我们都在互联网上使用代码。

事实上,不重用代码并不是最明智的想法。但是每次使用某些代码时,你是否盲目地粘贴它并检查它是否有效?好吧,如果是的话,你错过了学习的机会。

您查找代码的原因是您要么不知道如何操作,要么想节省时间。尝试了解您至少在较高级别使用的代码段。您不必逐行遵循代码,但至少要了解所使用的方法。

下一级是从头开始重现相同的解决方案。也许甚至可以让它变得更简单。这样,您将充分利用这一点。

3.晚上熬夜

大多数程序员都是夜猫子。

这通常可以追溯到这样一个事实,即大多数程序员总是会在深夜编程,导致程序员在白天处于较不专注(或更主动)的程序员(更多时间进行调试和编译而没有饱和的服务器),并且没有会议。

为什么晚上?因为夜晚有机会独处,而且只是直接计划。这就是为什么程序员通常在深夜工作时效率最高的原因。

感觉富有成效但并不意味着我们实际上是。如果所有这些工作都必须被丢弃并重新加工怎么办?因为明天早上与同事交谈时的新信息?

此外,开发人员仍然必须在早上去上班。而在深夜,在这种情况下,将累积疲惫和压力。没有(随着时间的推移)良好的睡眠,精神和生理问题将开始堆积,这可能造成倦怠,抑郁,疾病等的负面自我强化循环。

这里的解决方案是定期睡个好觉,精神焕发,并在白天学习如何提高工作效率。

4.缺乏文档

认为文档是一种负担,应该在可能的情况下被推到一边,而当它不是时就会匆忙。

这会导致技术债务,并且是将新开发人员加入团队的主要障碍。

如果人们为文档付出更多努力,那么就会创建更好的流程来处理这个问题。

这将开始提高快速有效地交叉训练开发人员的能力。

5.编写代码而不进行测试

抛开关于TDD优缺点的争论,进行一些测试几乎是必须的。

有些人喜欢先写它们,有些人则先编写测试。无论哪种方式都比没有测试更好。

拥有良好的测试覆盖率可以鼓励开发人员更自信地进行更改,并减少错误,并更频繁地修复代码中的结构问题。这反过来又提高了团队速度,并允许更多的价值交付给最终用户。

截至目前,只要注意这些行为,并尝试纠正你的习惯,一旦它成为你的模式,你将自动知道什么最适合你。

如果您想了解更多关于如何在没有压力的情况下取得成功,请在我的每周时事通讯中找到有用的提示,以及 免费的专业网络备忘单

谢谢你的阅读! 🙏

如果您对此帖有任何想法,请随时在Twitter上与我联系 ,并在下面发表评论。

照片来自Pexels的Basil MK

  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信