Merge remote-tracking branch 'origin/main'

This commit is contained in:
YuCheng Hu 2024-03-15 14:30:07 -04:00
commit a21a895236
75 changed files with 2128 additions and 70 deletions

View File

@ -8,4 +8,7 @@
</list>
</option>
</component>
<component name="explorerToolWindow">
<option name="selectedTab" value="Amazon Q + CodeWhisperer" />
</component>
</project>

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CheckStyle-IDEA" serialisationVersion="2">
<checkstyleVersion>10.12.4</checkstyleVersion>
<scanScope>JavaOnly</scanScope>
<copyLibs>true</copyLibs>
<option name="thirdPartyClasspath" />
<option name="activeLocationIds" />
<option name="locations">
<list>
<ConfigurationLocation id="bundled-sun-checks" type="BUNDLED" scope="All" description="Sun Checks">(bundled)</ConfigurationLocation>
<ConfigurationLocation id="bundled-google-checks" type="BUNDLED" scope="All" description="Google Checks">(bundled)</ConfigurationLocation>
</list>
</option>
</component>
</project>

17
.idea/dataSources.xml Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="USER@localhost" uuid="90e99aae-83cc-4a16-b72d-1a5bf25f58b2">
<driver-ref>intersystemsiris</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.intersystems.jdbc.IRISDriver</jdbc-driver>
<jdbc-url>jdbc:IRIS://localhost:1972/USER</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JpaBuddyIdeaProjectConfig">
<option name="renamerInitialized" value="true" />
</component>
</project>

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2022 ossez.com
Copyright (c) 2023 iSharkFly.Com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,35 +1,45 @@
- CWIKIUS 文档概述
- [文档介绍和快速链接](README.md)
- [联系方式](CONTACT.md)
- [文档介绍和快速链接](README.md)
- [联系方式](CONTACT.md)
- Java
- [概述和环境配置](java/_README.md)
- [核心编程](java/core/_README.md)
- [语言基础](java/fundamentals/_README.md)
- 程序语言
- Java
- [概述和环境配置](programming-language/java/_README.md)
- [核心编程](programming-language/java/core/_README.md)
- [语言基础](programming-language/java/fundamentals/_README.md)
- Mumps
- [核心编程](programming-language/java/core/_README.md)
- 框架
- [Spring](framework/spring/_README.md)
- [核心编程](java/core/_README.md)
- [语言基础](java/fundamentals/_README.md)
- [Spring](framework/spring/_README.md)
- 库和技术栈
- [FHIR](tech-stack/fhir.md)
- [JWT](tech-stack/jwt/README.md)
- [MessagePack](tech-stack/message-pack/index.md)
- [Protocol Buffers](tech-stack/protocol-buffers/index.md)
- 库和技术方案
- [JWT](jwt/README.md)
- [MessagePack](message-pack/index.md)
- [Protocol Buffers](protocol-buffers/index.md)
- 产品应用
- [Discourse](discourse/index.md)
- [vTiger](vtiger/_index.md)
- [Discourse](product/discourse/index.md)
- [vTiger](product/vtiger/_index.md)
- 组织和基金会
- [HL7](organization-foundation/hl7.md)
- 数据结构和算法
- [算法题](algorithm/_index.md)
-
- 求职
- [职场](work/workplace/index.md)
- [面试问题和经验](work/interview/index.md)
- [算法](algorithm/_index.md)
- DevOps
- [OS](devops/_index.md)
- [linux](devops/os/linux.md)
- 技术人生
- [面试](work/interview/_index.md)
- [职场](work/workplace/_index.md)
- 快速导航
- [WWW.CWIKI.US](https://www.cwiki.us/)
- [WWW.OSSEZ.COM](https://www.ossez.com/categories)
- [DOCS.OSSEZ.COM](https://docs.ossez.com/#/)
- [WWW.CWIKI.US](https://www.cwiki.us/)
- [WWW.OSSEZ.COM](https://www.ossez.com/categories)
- [DOCS.OSSEZ.COM](https://docs.ossez.com/#/)

View File

@ -1,6 +1,18 @@
- [二叉树的序列化和反序列化Serialize and Deserialize Binary Tree](/algorithm/serialize-and-deserialize-binary-tree.md)
- [岛屿个数](/algorithm/number-of-islands.md)
- [合并 2 个有序链表](/algorithm/merge-two-sorted-lists.md)
- [带环链表](/algorithm/linked-list-cycle.md)
- [电话号码的字母组合](/algorithm/letter-combinations-of-a-phone-number.md)
- [格雷编码](/algorithm/gray-code.md)
- [点积](/algorithm/dot-product.md)
- [二叉树](/algorithm/binary-tree.md)
- [二叉树的层次遍历](/algorithm/binary-tree-level-order-traversal.md)
- [下一个斐波拉契数](/algorithm/next-fibonacci-number.md)
- [一个字符串包裹函数](/algorithm/a-word-wrap-functionality.md)
- [打印 100 以内的素数](/algorithm/prime-numbers-from-1-to-100.md)
- [二进制空白](/algorithm/binary-gap.md)
- [Lambda 偶数](/algorithm/binary-gap.md)
- [Lambda 偶数](/algorithm/lambda-evens-lambda.md)
- [上下计数](/algorithm/count-up-down.md)
- [展平嵌套数组](/algorithm/flatten-nested-arrays.md)
- [机器人移动](/algorithm/robot-movement.md)
- [构建城堡](/algorithm/build-castles.md)

View File

@ -0,0 +1,47 @@
# 二叉树的层次遍历Binary Tree Level Order Traversal
> 🔔 参与讨论https://www.isharkfly.com/t/binary-tree-level-order-traversal/15118
## 中文描述
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
## 样例
给一棵二叉树 `{3,9,20,#,#,15,7}`
```
3
/ \
9 20
/ \
15 7
```
返回他的分层遍历结果:
```
[
[3],
[9,20],
[15,7]
]
```
## 挑战
挑战1只使用一个队列去实现它
挑战2用BFS算法来做
## 思路和点评
这个程序可以使用队列的广度优先算法来进行遍历。
需要注意的是,因为在输出结果的时候需要按照层级来进行输出,那么需要考虑的一个算法就是二叉树的层级遍历算法。
这个算法要求在遍历的时候记录树的层级。
## 源代码
GitHub 的源代码,请访问下面的链接:
https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode0069LevelOrderTest.java

View File

@ -0,0 +1,61 @@
# 构建城堡Build Castles
> 🔔 参与讨论https://www.isharkfly.com/t/build-castles/315
中文标题【构建城堡】
Charlemagne, the King of Frankie,
## 英文描述
请参考图片中的说明。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/a/a264461addc3a7f7ac216c90e958eb906c45b1e6_2_443x500.png)
## 中文描述
根据给出的数组确定能够盖多少城堡。
## 思路和点评
我不能确定我的思路是正确的,也欢迎大家参与讨论。
根据给出的数组,因为有重复的值,我首先想到的是将给出的数组进行一次过滤和处理,去掉重复的值。
例如给出的数组为int[] A = { 2, 2, 3, 4, 3, 3, 2, 2, 1, 1, 2, 5 };那么我希望处理为int[] A = { 2, 3, 4, 3, 2, 1, 2,
5 }; 去掉重复的值,因为重复的值在这里没有意义。
![](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/1X/9cd25f567b772c20aacfc6e6ebdc018d16f5e3a1.jpeg)
然后根据新的数组进行判断,需要判断的是 2 个端点,你需要将 2 个端点考虑为 0。
那么根据上面已经处理过的数组,你在进行遍历的时候,针对第一个值 2 ,你需要判读左侧的值和右侧的值,因为默认左侧的值一直为 0
,那么右侧的值为 3 的话,那么这里需要 v 需要 +1
第 2 个值因为第二个值的左侧3 > 2, 但右侧 3 < 4因此这个值不适合
第 3 个值左侧4 > 3, 右侧 4 >3 这个值是合适的。
从这里我们找到的规律是,进行一次遍历,找到,如果只的左侧和右侧同时小于这值,或者左侧和右侧都同时大于这个值,那么这个值是合适的取值。
需要注意一个情况就是 {-3, -3},你初始化数组的时候,这个值为 {-3},那么这个地方是最少有一个合适的值。
## 源代码
源代码和有关代码的更新请访问 GitHub
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/WayfairTest.java
测试类请参考:
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/WayfairTest.java
## 测试结果
上面程序的测试结果如下:
```
2018/12/29 00:43:16 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - V - [2]
2018/12/29 00:43:16 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - H - [2]
2018/12/29 00:43:16 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - H + V - [4]
```

View File

@ -0,0 +1,87 @@
# 上下计数Count Up Down
> 🔔 参与讨论https://www.isharkfly.com/t/count-up-down/313
这个题目是 Kayak 发布的代码挑战题目。
最简单的描述就是不使用循环,输出 0 到 5然后同样不是会用循环的方式再次输出 5 到 0。
## 英文描述
### Part 1
Write a program that counts in sequential order when given a start and end value - without using any iterative programing loops, i.e. while, for, do, for-each, etc.
You can assume that both the start and end values will always be positive and that the start value will always be less then the end value. There should only be one method with the following signature:
void countUp(int start, int end) {
// All code exercise code should go here
}
Here is example output with start=0 and end=5:
[ 0,1,2,3,4,5]
### Part 2
Continuing with part 1 change the output of the test, so that it now prints out in sequential order to the end value (only once), but then also counts down to the start value.
Again, using no iterative loops, and assuming that both the start and end values will always be positive and that start value will always be less then the end value. There should only be one method with the following signature:
void countUpAndDown(int start, int end) {
// All code exercise code should go here
}
Here is example output with start=0 and end=5:
[0,1,2,3,4,5,4,3,2,1,0]
## 中文描述
这里我不按照原文一字一字的翻译,但是尽量按照题目的要求把题目解释清楚。
最简单的描述就是不使用循环,输出 0 到 5然后同样不是会用循环的方式再次输出 5 到 0。
本题目分 2 部分,第一部分是不使用循环的方式输出 0 到 5第二部分是不使用循环的方式输出 0 到 5 以后,再输出 5 到 0。
其中需要注意的是 5 只能输出一次。
## 思路和点评
不使用 For 循环的方式输出 0 到 5 ,我们可以想到有几个方法。
第一个方法可能比较容易想到的就是递归调用,你可以根据输入的值,递归调用需要的次数就可以输出值了。你还可以采用计算机时钟的方式进行输出。
在这里我们采用递归调用的方式进行输出。
## 源代码
源代码和有关代码的更新请访问 GitHub
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/main/java/com/ossez/codebank/interview/KayakCountUpDown.java
测试类请参考:
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/KayakTest.java
## 测试结果
上面程序的测试结果如下:
```
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - TEST Count Up and Down
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - [2 -> 5]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP - [2, 3, 4, 5]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP & DOWN - [2, 3, 4, 5, 4, 3, 2]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - [0 -> 5]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP - [0, 1, 2, 3, 4, 5]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP & DOWN - [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - [-1 -> 5]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP - [-1, 0, 1, 2, 3, 4, 5]
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN
2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP & DOWN - [-1, 0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0, -1]
```

49
algorithm/dot-product.md Normal file
View File

@ -0,0 +1,49 @@
# 点积Dot Product
> 🔔 参与讨论https://www.isharkfly.com/t/dot-product/15119
### 描述
给出两个数组,求它们的点积。([Wikipedia](https://en.wikipedia.org/wiki/Dot_product))
如果没有点积则返回-1
### 样例
```
Input:A = [1,1,1]
B = [2,2,2]
Output:6
```
### 代码
请单击下面链接在 GitHub 上查看最新的源代码:
https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode1480DotProductTest.java
### 点评
这个问题的关键是要了解点积是如何进行计算的。
对输入的数组还需要进行 NULL 的校验和计算。
摘录点积的计算方法如下:
向量是由n个实数组成的一个n行1列n*1或一个1行n列1*n的有序数组
向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
点乘公式
对于向量 a 和向量 b
![|607x109](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/f/f6947f0a87ba1c1f9bce954559a000440bd81bf3.jpeg)
a和b的点积公式为
![|405x89](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/b/b4644663ff6807a7b04ca1e62fbfa5d574e1bf34.jpeg)
要求一维向量 a 和向量 b 的行列数相同。
因为要求向量 a 和 b 的行列数相同,因此在程序中需要先进行判断才可以。

View File

@ -0,0 +1,54 @@
# 展平嵌套数组Flatten Nested Arrays
> 🔔 参与讨论https://www.isharkfly.com/t/flatten-nested-arrays/314
这个题目是在 PillPack 现场面谈的时候的一个题目。
## 中文描述
题目要求比较简单:[1,2,[3],[[4]],5,6] -> [1,2,3,4,5,6]
就是数组中嵌套数组,考察一个数组[1,2,[3],[[4]],5,6]。 你怎么能够输出 1,2,3,4,5,6并不要求按照顺序输出
这里是一个嵌套数组,你需要将这个数组中的值全部取出来。
## 思路和点评
不清楚其他语言中这个数据结构怎么存储,我假设的是在 Java 中存储的对象。
可以采用队列的方式来实现,例如,在 Java 中存储了整数1 2 对象,[3] 为一个数组对象。
你可以先遍历一次 List将所有的 List 的对象都压入队列中,然后进行出队。
在出队时候,判断对象是否为整数对象,如果是整数对象,就输出,如果不是整数对象,然后将数组对象继续进行遍历,然后压入队列,然后再出队。
在这里讨论的问题比较多,还有 [[[2]5]] 这种多层嵌套的问题。
经过网站上的考古,这里有 2 个方法可以更快的实现。1 是递归的方法2 是 利用 Java 8 的 Stream 特性。
在写测试代码之前,你需要明白下数据结构的定义,要不然你没有办法测试。在 Java 中你可以定义为对象数组,如下:
`Object[] array = { ` `1` `, ` `2` `, ` `new` `Object[] { ` `3` `, ` `4` `, ` `new` `Object[] { ` `5` `, ` `new` `Object[] { ` `new` `Object[] { ` `6` `} } }, ` `7` `}, ` `8` `, ` `9` `, ` `10` `};`
然后可以利用递归,在对对象数组进行遍历的时候,如果你遇到了对象,那么你需要再次调用你的方法,对对象中的内容进行遍历,如果这个时候已经没有对象了,可以返回第二层遍历的结果,并且插入到上层 List 列表中。
如果你使用的 Java 8 的 Stream你需要对 Stream 的使用和方法比较了解才可以。这里也涉及到了递归,只是写法有点不同罢了。
还有一个更加简单粗暴的方法,当然我不认为这个方法是出题人希望考察的目标,在 Java 中你可以将数组直接转换成 String 字符串进行输出,比如说上面的对象队列,你可以转换为:` [1, 2, [3, 4, [5, [[6]]], 7], 8, 9, 10]` 字符串进行输出,然后使用 Java 的 Split 函数,进行按照逗号拆分后,然后将多余 [ 和 ] 符号去掉,然后再将内容重新放回 List。 这个有点简单粗暴,但是也一样能够达到目的。
## 源代码
源代码和有关代码的更新请访问 GitHub
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/PillPackTest.java
## 测试类请参考:
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/PillPackTest.java
## 测试结果
上面程序的测试结果如下:
```
2018/12/27 13:39:22 DEBUG [com.ossez.codebank.interview.tests.PillPackTest] - Test FlattenNestedArrays
2018/12/27 13:39:22 DEBUG [com.ossez.codebank.interview.tests.PillPackTest] - LOOP: [1, 2, [3, 4, [5, [[6]]], 7], 8, 9, 10] - > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2018/12/27 13:39:22 DEBUG [com.ossez.codebank.interview.tests.PillPackTest] - Java 8: [1, 2, [3, 4, [5, [[6]]], 7], 8, 9, 10] - > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

89
algorithm/gray-code.md Normal file
View File

@ -0,0 +1,89 @@
# 格雷编码Gray Code
> 🔔 参与讨论https://www.isharkfly.com/t/gray-code/15120
## 描述
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异。
给定一个非负整数 `n` ,表示该代码中所有二进制的总数,请找出其格雷编码顺序。一个格雷编码顺序必须以 `0` 开始,并覆盖所有的 2n 个整数。
对于给定的 `n`,其格雷编码顺序并不唯一。
根据以上定义, `[0,2,3,1]` 也是一个有效的格雷编码顺序。
## 样例
给定 `n = 2` 返回 `[0,1,3,2]`。其格雷编码顺序为:
```
00 - 0
01 - 1
11 - 3
10 - 2
```
## 挑战
O(2n) 时间复杂度。
## 代码
```
/**
* 411 https://www.lintcode.com/problem/gray-code/description
*/
@Test
public void test0411GrayCode() {
int n = 2;
List<Integer> retArray = new ArrayList<>();
if (n == 0) {
retArray.add(0);
}
for (int i = 0; i < (2 << (n - 1)); i++) {
int g = i ^ (i / 2);
retArray.add(g);
}
System.out.println(retArray);
}
```
## 点评
你需要对 Java 的位运算之间的关系和数据结构有比较深的了解。
在计算机语言中,数字的存储是按照位存储的。比如说 int 数据类型,在 Java 中定义的是 32 位。
那么 int 能在 Java 中存储的 2 进制格式为:
0000 0000 0000 0000 0000 0000 0000 0000
这里一共是 8 组,一共是 32 位。
如果你希望了解 Java int 是如何在 2 进制中表示的你可以使用方法Integer.toBinaryString(0)
这个方法不会输出完整的 32 位字符串,你需要在前面补上 0。
【0】 转换为 2 进制为【0000 0000 0000 0000 0000 0000 0000 0000】
【2】 转换为 2 进制为【0000 0000 0000 0000 0000 0000 0000 0010】
【5】 转换为 2 进制为【0000 0000 0000 0000 0000 0000 0000 0101】
在这个题目中哟 2 个地方比较关键,第一个地方是需要循环多少次,就是 2 的 n 次方,应该是多少?第二个地方就是进行位运算了,你需要需要什么样的位运算符。
对于 2 的 n 次方的结果,基本上可以使用下面的公式 2 << (n-1),比如说 2 的 3 次方,那么就需要将 2 向左位移 2 位。
移动前:
【2】 转换为 2 进制为【0000 0000 0000 0000 0000 0000 0000 0010】
移动后
【0000 0000 0000 0000 0000 0000 0000 1000】这个 2 进制转换后的结果就是 【8】 正好是 2 的 3 次方。
随后,对 i 取整后进行一次异或运算就可以得到你要的结果的 2 进制结果了。

View File

@ -0,0 +1,31 @@
# 电话号码的字母组合Letter Combinations of a Phone Number
> 🔔 参与讨论https://www.isharkfly.com/t/letter-combinations-of-a-phone-number/15121
## 描述
给定一个字符串,字符串中不包含 01。返回这个字符串中所有可能的字母组合返回结果。
数字和字母的的映射图片,请参考下面的电话拨号盘。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/6/65862d012d17784537d8f697caae99d3b8f49bde.jpeg)
## 样例
给定 `"23"`
返回 `["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]`
## 代码
GitHub 的源代码,请访问下面的链接:
https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode0425LetterCombinationsTest.java
## 点评
本题目主要考察你对递归调用的熟练使用程度。
有关递归调用的方法,请自行脑补,或者 Google 查询。
思路主要分 2 部分,第一部分存储使用的数据结构,你可以使用 Map 也可以使用数组,效果都是一样的。

View File

@ -0,0 +1,56 @@
# 带环链表Linked List Cycle
> 🔔 参与讨论https://www.isharkfly.com/t/linked-list-cycle/15122
## 描述
给定一个链表,判断它是否有环。
## 样例
给出 -21->10->4->5, tail connects to node index 1返回 true。
这里解释下题目的意思在英文原题中tail connects to node index 1 表示的是节点 5 还要链接回索引号 为 1 的节点。
一个典型的带环链表如下:
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/3/3a24ec4f15c3e0e8c4502baf90f81cb122278e78.png)
## 挑战
不要使用额外的空间
## 代码
GitHub 的源代码,请访问下面的链接:
https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode0102HasCycleTest.java
## 点评
链表Linked
list是一种常见的基础数据结构是一种线性表但是并不会按线性的顺序存储数据而是在每一个节点里存到下一个节点的指针(
Pointer)。由于不必须按顺序存储链表在插入的时候可以达到O(1)
的复杂度比另一种线性表顺序表快得多但是查找一个节点或者访问特定编号的节点则需要O(n)
的时间而顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
在计算机科学中链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成每个节点包含任意的实例数据data
fields和一或两个用来指向上一个/或下一个节点的位置的链接”links”。链表最明显的好处就是常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型因为它包含指向另一个相同类型的数据的指针链接。链表允许插入和移除表上任意位置上的节点但是不允许随机存取。链表有很多种不同的类型单向链表双向链表以及循环链表。
要判断一个链表中是否有循环,可以借助额外的存储空间,将链表插入到 HashSet
中。创建一个以节点ID为键的HashSet集合用来存储曾经遍历过的节点。然后同样是从头节点开始依次遍历单链表的每一个节点。每遍历到一个新节点就用新节点和HashSet集合当中存储的节点作比较如果发现HashSet当中存在相同节点ID则说明链表有环如果HashSet当中不存在相同的节点ID就把这个新节点ID存入HashSet之后进入下一节点继续重复刚才的操作。
这个方法在流程上和方法一类似本质的区别是使用了HashSet作为额外的缓存。
假设从链表头节点到入环点的距离是D链表的环长是S。而每一次HashSet查找元素的时间复杂度是O(1), 所以总体的时间复杂度是1*(D+S)
=D+S可以简单理解为O(N)。而算法的空间复杂度还是D+S-1可以简单地理解成O(N)。
也可以采用指针的方式。
首先创建两个指针1和2在java里就是两个对象引用同时指向这个链表的头节点。然后开始一个大循环在循环体中让指针1每次向下移动一个节点让指针2每次向下移动两个节点然后比较两个指针指向的节点是否相同。如果相同则判断出链表有环如果不同则继续下一次循环。
例如链表A->B->C->D->B->C->
D两个指针最初都指向节点A进入第一轮循环指针1移动到了节点B指针2移动到了C。第二轮循环指针1移动到了节点C指针2移动到了节点B。第三轮循环指针1移动到了节点D指针2移动到了节点D此时两指针指向同一节点判断出链表有环。
此方法也可以用一个更生动的例子来形容:在一个环形跑道上,两个运动员在同一地点起跑,一个运动员速度快,一个运动员速度慢。当两人跑了一段时间,速度快的运动员必然会从速度慢的运动员身后再次追上并超过,原因很简单,因为跑道是环形的。

View File

@ -0,0 +1,22 @@
# 合并 2 个有序链表Merge Two Sorted Lists
> 🔔 参与讨论https://www.isharkfly.com/t/2-merge-two-sorted-lists/15123
## 描述
将两个排序链表合并为一个新的排序链表。
## 样例
给出 `1->3->8->11->15->null``2->null` 返回 `1->2->3->8->11->15->null`
## 代码
GitHub 的源代码,请访问下面的链接:
https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode0165MergeTwoListsTest.java
## 点评
本题主要涉及到链表的遍历和比较,基本上不会太难。
可能在写法上有点绕。

View File

@ -0,0 +1,42 @@
# 岛屿个数Number of Islands
> 🔔 参与讨论https://www.isharkfly.com/t/number-of-islands/15124
## 描述
给一个01矩阵求不同的岛屿的个数。
0代表海1代表岛如果两个1相邻那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
## 样例
在矩阵:
```
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
```
中有 `3` 个岛。
## 代码
GitHub 的源代码,请访问下面的链接:
https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode0433NumIslandsTest.java
## 点评
本质是求矩阵中连续区域的个数,很容易想到需要用深度优先搜索 DFS 来解,我们需要建立一个 visited 数组用来记录某个位置是否被访问过,对于一个为
true 且未被访问过的位置,我们递归进入其上下左右位置上为 true 的数,将其 visited 对应值赋为
true继续进入其所有相连的邻位置这样可以将这个连通区域所有的数找出来并将其对应的 visited 中的值赋 true找完次区域后我们将结果
res 自增 1然后我们在继续找下一个为 true 且未被访问过的位置,以此类推直至遍历完整个原数组即可得到最终结果。
这里需要有一个递归的调用。在递归调用之前需要进行判断是否超出边际,如果超出边际的话,就要跳出循环。
在一个节点进行遍历的时候,需要在递归调用的时候,同时针对这个节点搜索上下左右 4 个节点,如果找到需要了满足条件的
true就继续查找如果没有找到就退出。在这个过程的时候需要将访问过的节点保存到访问控制的 2 维数组中。以便于在下次查找的时候跳过这个节点。

View File

@ -0,0 +1,89 @@
# 机器人移动Robot Movement
> 🔔 参与讨论https://www.isharkfly.com/t/robot-movement/312
中文标题【机器人移动】
这个题目是 Kayak 发布的代码挑战题目。
我认为题目本身描述的不是十分清楚,方法需要返回结果,但是结果没有说明是机器人最后的坐标位置,还是最后的坐标位置距离原点的距离。同时,机器人的初始化方向等都没有十分明确的定义。
根据测试数据,机器人应该是从下往上(初始化的方向)。因为如果初始化的方向不确定的话,最后的坐标值可能会不一致。
我这里假设程序应该返回的是机器人的最后坐标位置,并且初始化的位置为 (0,0),方向为从下往上。
## 英文描述
A robot lands on Mars, which happens to be a cartesian grid; assuming that we hand the robot these instructions, such as
LFFFRFFFRRFFF, where "L" is a "turn 90 degrees left", "R" is a "turn 90 degrees right", and "F" is "go forward one
space。
please write control code for the robot such that it ends up at the appropriate-and-correct destination, and include
unit tests.
Here is an example output with command "FF":
[0, 2]
## 中文描述
这里我不按照原文一字一字的翻译,但是尽量按照题目的要求把题目解释清楚。
这里题目的要求是,假设一个机器人降落到火星上了,我们现在需要给机器人发布指令。指令包括有 LRF 3 个。
L 表示的意思是机器人向左转 90 度R 的意思表示的是机器人向右转 90 度F 表示的是机器人向前移动一个坐标单位。
题目的表达并是是十分明确也清晰,比如说 LFFFRFFFRRFFF 应该返回是什么没有说清楚。假设 指令 FF ,返回的结果是 [0, 2]
我默认的是程序需要返回机器人最后的坐标位置0 表示的是 X 坐标2 表示的是 Y 坐标。
## 思路和点评
这个问题的思路,首先你需要明白几个点。如果需要进行坐标计算的话,请注意 L 和 F 是不会改变当前机器人的坐标位置的。
只有 F 的操作才会改变机器人的位置。考虑设置一个坐标系,那么这里需要存储 2 个信息,第一个信息为 F 移动时候机器人的位置,另外就是
L 和 F 对机器人方向的控制了。
所以你需要在程序中初始化一个二维数组,这个数组用于存储 F 操作时候的坐标变化。
同时你还需要存储一个 dir 变量,通常这个变量为每一次 L 和 R 操作的时候方向的变化。
F 存储的路径数组为int[][] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
通过这个数组,你就明白为什么我在这个 WIKI 页面前面说的,初始化方向很重要,请参考下面的图(因为不太好用计算机画图,我们用手画了一个图)。
![|517x400](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/1X/3714e7874d95dafc87ac6d279916944144d779e6_2_517x400.jpeg)
在这个图中比较明确的说明了我们定义的初始化方向为从下往上Dir 等于 0 。在 Dir 等于 0 的时候坐标数组为 int[][] move = { {
0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; 按照顺时针的方向。
在图中Dir 有 4 个反向,按照顺时针方向,分别为上,右,下,左,那么方向对应的值就分别为 0,1,2,3 。
当方向为 L 的时候,需要将方向值减 1 ,当方向为 R 的时候,需要将值 +1。
这里有个问题为循环,比如说,方向值为 RRdir 的值应该为 2。
如果方向为 RRRRRR那么值应该也为 2。所以在算法中我们使用了 dir = (dir + 4) % 4; 对方向进行取 余数。你可以看到 当你旋转
RRRRRR 后dir 的值还是为 2。
针一次转向 + 移动的操作,不管你转向多少次,调整的方方向无非就是调整 X 或者 Y 的坐标系,在下一次移动的时候应该是 + 还是 -
所以到这里方法就相对简单了。一次移动的时候,都会改变 X 和 Y 坐标的值,前提是你是希望怎么加减而已。
## 源代码
源代码和有关代码的更新请访问 GitHub
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/main/java/com/ossez/codebank/interview/KayakRobotMovement.java
测试类请参考:
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/KayakTest.java
## 测试结果
上面程序的测试结果如下:
```
2018/12/25 15:08:50 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - LFFF - [0,2]
2018/12/25 15:08:50 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - LFFFRFFFRRFFF - [-3,0]
```

View File

@ -0,0 +1,43 @@
# 二叉树的序列化和反序列化Serialize and Deserialize Binary Tree
> 🔔 参与讨论https://www.isharkfly.com/t/serialize-and-deserialize-binary-tree/15125/1
中文标题【二叉树的序列化和反序列化】
## 描述
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
对二进制树进行反序列化或序列化的方式没有限制LintCode将您的`serialize`输出作为`deserialize`的输入,它不会检查序列化的结果。
## 样例
给出一个测试数据样例, 二叉树`{3,9,20,#,#,15,7}`,表示如下的树结构:
```
3
/ \
9 20
/ \
15 7
```
我们的数据是进行 BFS 遍历得到的。当你测试结果 wrong answer时你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。
## 代码
GitHub 的源代码,请访问下面的链接:
https://github.com/honeymoose/codebank-algorithm/blob/main/src/test/java/com/ossez/codebank/algorithm/tests/lintcode/LintCode0007SerializeAndDeserializeTest.java
## 点评
本题目主要需要你对二叉树的遍历方法有所了解。
遍历二叉树主要有 2 类方法分别为深度优先DFS和广度优先BFS
在深度优先中,你有又可以使用前序,中序和后序搜索方法,你可以使用递归或者非递归算法实现。对于广度优先算法,一般都会采用非递归的实现方法进行实现。

5
devops/_index.md Normal file
View File

@ -0,0 +1,5 @@
# DevOps
从字面上来看,"DevOps"一词是由英文 Development开发和 Operations运维组合而成但它所代表的理念和实践要比单独或组合的两个词广阔的多。DevOps 涵盖了安全、协作方式、数据分析等许多方面。
## OS 操作系统

11
devops/os/linux.md Normal file
View File

@ -0,0 +1,11 @@
# RHEL 安装后初始化
最近在对公司的 Linux 服务器进行一些初始化的安装和配置工作。对一个新的机器可能遇到的问题还比较多,先记录下来供以后参考。
| 配置内容 | 内容链接 |
|------------------------|------------------------------------------------|
| Linux 安装 NTP 时间服务器 | https://www.isharkfly.com/t/linux-ntp/10441 |
| Firewall-cmd 安装和配置开放端口 | https://www.isharkfly.com/t/firewall-cmd/13715 |
| Linux 设置主机名 | https://www.isharkfly.com/t/linux/15230 |
| Linux 安装 httpd 服务器 | https://www.isharkfly.com/t/linux-httpd/15231 |
| Linux 中安装 nginx | https://www.isharkfly.com/t/linux-nginx/13951 |

View File

@ -28,7 +28,7 @@
<style>
:root {
/* Reduce the font size */
--base-font-size : 14px;
--base-font-size: 14px;
/* Change the theme color hue (0-360) */
/* --theme-hue: 325; */

View File

@ -0,0 +1,8 @@
# HL7
HL7 指的是一组用于在各种医疗服务提供者所使用之软件应用程序之间传输临床和管理数据的国际标准。这些标准侧重于应用层即OSI模型中的“第7层”。
| 网站名称 | 链接 | 备注说明 |
|-----------------------|--------------------------------------------------------------|---------------------|
| 鲨鱼君iSharkFlyFHIR 讨论 | https://www.isharkfly.com/tag/fhir | FHIR 相关技术在鲨鱼君平台上的讨论 |
| HL7中国-医学信息标准协同工作平台 | http://wiki.hl7.org.cn:81/index.php?title=%E9%A6%96%E9%A1%B5 | FHIR 标准的官方参考网站 |

View File

@ -0,0 +1 @@
- [vTiger 中文介绍](/product/vtigert/vtiger/vtiger-introduction.md)

View File

@ -0,0 +1,6 @@
# Mumps 程序语言设计
| 网站名称 | 链接 - URL | 内容说明 |
|-------------------------------------|------------------------------------------|-----------------------------------|
| Mumps Programming Language Textbook | https://www.cs.uni.edu/~okane/mumps.html | 目前网络上能找到有关 Mumps 语言比较全的教程 |
| Mumps Language Standards | https://www.isharkfly.com/t/mumps/15198 | 美国国家标准技术研究所 提供了一个有关 MUMPS 语言的技术标准 |

47
tech-stack/fhir.md Normal file
View File

@ -0,0 +1,47 @@
# FHIR (Fast Health Interoperable Resources)
如果你对上面 2 个单词不熟悉的话,那就需要先脑补下了。
## HL7
HL7 可以认为是一个标准化的组织,这个组织主要对标准进行控制。
如果你希望在医疗系统中对数据进行交换,通常 HL7 现在就是事实上的标准了。
## FHIR
FHIR® Fast Health Interoperable Resources (Index - FHIR v5.0.0) 是由 HL7 提出的新一代标准框架。
FHIR 整合了 HL7 V2,V3 和 CDA 的优点,同时利用了最新的Web标准,紧紧围绕着 implementability 开发和实现。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/6/6a4e51ecf5c5fa20ab8760a7d80416de34fca415.png ':size=680')
有点绕FHIR 是 HL7 标准化组织推出的标准,也就是现在医疗系统中使用的数据交换实现。
既然是实现,那么就需要基于 FHIR 标准有不同语言的实现了。
## FHIR Java 实现
FHIR Java 实现 目前应该使用的最多的是: https://hapifhir.io/
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/8/881a65289b6adb93efc89f812ffc92d19bba1c6e_2_690x359.png ':size=680')
这个是一个开源版本的实现,所有的代码都在 GitHub 上能找到地址为https://github.com/hapifhir/hapi-fhir
如果你需要在 Java 中使用 FHIR 的话,应该直接使用上面的代码就可以了。
## 总结
HL7 是一个标准化租组织他们定义了在医疗系统中进行数据传输的标准FHIR 就是这标准的最新规范。
针对不同语言,有不同语言的实现罢了。
## 快速参考I
HL7 的内容还是比较多的,我们在这里对收集到的文档来进行整理。
| 网站名称 | 链接 | 备注说明 |
|-----------------------|------------------------------------|---------------------|
| 鲨鱼君iSharkFlyFHIR 讨论 | https://www.isharkfly.com/tag/fhir | FHIR 相关技术在鲨鱼君平台上的讨论 |
| HL7/FHIR | https://www.hl7.org/fhir/ | FHIR 标准的官方参考网站 |
| HL7 | https://www.hl7.org/ | HL7 标准官方网站 |

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -219,4 +219,4 @@ Protocol buffers 被用来设计解决上面的很多问题:
Protocol buffers 在 Google 中成为针对数据的通用语言—— 随着时间的流逝,在 Google 内部已经有超过 348,952 .proto 文件被定义。这些被用在 RPC 系统和存储系统中存储数据。
[Annotation注解](installation.md ':include')
[Protocol Buffers 安装](installation.md ':include')

View File

@ -1 +0,0 @@
- [vTiger 中文介绍](/vtiger/vtiger-introduction.md)

View File

@ -0,0 +1,83 @@
# IT 技术岗位 2019 年北美求职流水账
> 🔔 参与讨论https://www.isharkfly.com/t/it-2019/13433
公司业务调整,虽然目前还在给公司做 Contract但是终究还是饱一顿饿一顿的后面还有嗷嗷待哺的小朋友这样下去也不太踏实。
经历了 1 个多月的折磨,虽然到现在还没有接到 Offer但是心态基本上平和了反正努力去找了至于结果是什么自己积极努力的心态就能打败一切了。也许是我应聘的职位比较高所以
On-Site 都好几次了,在没有 Offer 的情况下 HR
还主动打电话给我说,公司对我还是很感兴趣,无奈竞争比较激烈,我们也很难做出这个决定。如果你愿意的话,我将你推送给其他的同事的岗位,你看可以吗(也许只是客套话,安慰奖?)?
至少这样的回复还能让人感觉好点。
经历过电话面试Online AssessmentOn-Site 应该有多次了吧。从最开始的焦虑,到现在焦虑到不焦虑了。心态很重要。
马上又要毕业季了,希望我的经历能够帮到需要的童鞋。
在得到一个 Offer 之前,绝大部分人都会经历下面几步。每个公司的侧重点可能不一样,有些事情是我们可以控制并且做好的,有些事情已经不是我们能够控制的了。在求职阶段,最终的目的是得到
Offer。
其实针对留学生和华人求职者来说能够进入到 On-Site 就已经算是小成功了。
因为我应聘的职位大多是 Sr Developer and PM 级别的,所以竞争比较激烈,就算到 On-Site
公司后面还是有很多其他的备选方案。这个和国内求职有很大不同,一般来说能够进入到 On-Site 这个阶段首先就说明你的实例已经得到大部分认可,你可能缺的只是运气罢了。
## 求职的准备
简历和 CV。这 2 个东西肯定是要有的。
至于怎么写,每个人写法就不一样了,想想 HR 每天都能收到 N 多简历。怎么才能让 HR 能够从 N 多简历不至于直接扔到垃圾箱中。换位思考下,如果你是
HR 你会怎么做?
我觉得你可以从下面几点考虑:
对自己有信心并且与职位描述非常符合的高亮显示。
布局简洁明了,拜托,这个是简历,没有让你写小说。那种字体太小的,段落不分行的,完全不美观的简历一般都不会在考虑范围之内。
LinkedIn 需要有,但是不一定要写到简历上。因为有下面考虑,如果 HR 想搜索你的话,会通过你的名字直接到 LinkedIn
上去找。简历打印出来后,链接没有办法点。如果 HR 对你没有兴趣LinkedIn 写上去也没人看。
有些 HR 会直接到 LinkedIn 联系你,所以你还是需要一个 LinkedIn 的。切记不要在 LinkedIn
上放不是太理想的照片,那种一看上去就不想吃晚饭的和早上起来没有刷牙洗脸的自拍照就别放了。
GitHub 上的头像也要正常点,那种 IT 屌丝状的头像也别放了,哪怕你放个卡通人物都比那个强。
## Phone Interview
在我经历的面试中Phone Screen 的时间一般都是在 30 分钟左右。
基本上能到这一步,就说明你的简历已经基本上满足公司的需求了,公司也希望有更多的了解。有时候一些公司会跳过 Phone Screen 直接给你发
Online Assessment。
**跳过 Phone Screen 的 Online Assessment**
在你连 Phone Screen 都没有收到,就直接收到了 Online Assessment 的时候别高兴的太早,很多公司就是通过 Online Assessment
来拒你罢了。
当你屁颠屁颠做完代码自我感觉还不错2 周后也许你就会收到一封非常礼貌的邮件说对不起,我们不打算 moving
forward。这种情况尤其多发生在你比较向往的 IT 大厂,所以你收到这种邮件心态就要好点了。
其实他们早就想拒你了,只是找个理由罢了。
## Online Assessment
这个东西就是刷题了,其实刷不刷不构成特别影响。
我还是建议都刷一下吧,不刷肯定能把你弄懵逼了。
## On-Site
能到这一步,就说明你已经是佼佼者了。
唯一要做的就是怎么和对方进行沟通。现在 On-Site 的时间都比较长,基本上都是 4+ 小时的。
对你来说是体力和智力的双重挑战,记得吃饱了再去。
![shawshank+rain|690x387](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/e/e2dcc14559e3f77f4f4e425abccbcafc5a1782f3_2_690x387.jpeg)
## Follow Up
如果 2 个星期内还没有消息。
你就准备下一家吧。

View File

@ -0,0 +1,48 @@
# 北美亚特兰大一金融服务公司面试总结
> 🔔 参与讨论https://www.isharkfly.com/t/topic/13453
这一金融服务公司的总部不在美国,在荷兰的阿姆斯特丹。
公司的主要业务是为中小金融机构提供技术方面的业务扩展,包括 API 的服务和在这个服务上与其他公司建立的数据通道。
## 面试结果
非常不幸的是这家公司在第一轮面试完成后就明确的表示不再进行下一轮的面试的。
但公司面试的同仁还是非常客气的给出了对我这个面试人的总结。整体总结情况就是对本人的评价还是非常不错,有热情也比较符合团队需求,其他经验也比较丰富。
重点是我没有 Spring Reactive 编程的经验,有部分的 Authentication 相关的工作经验。
从后面的总结来看 Spring Reactive 是硬伤,因为没有这个 Spring Reactive 的工作经验可能没有办法适应他们的产品需求。
如果是因为这个原因被拒,那么也是情有可原也不冤枉。
随后也就搜索了下有关 Spring Reactive 的知识。
Reactor 框架是 Pivotal 基于 Reactive Programming 思想实现的。它符合 Reactive Streams 规范 (Reactive Streams 是由
Netflix、TypeSafe、Pivotal 等公司发起的) 的一项技术。其名字有 反应堆 之意,反映了其背后的强大的 性能。
Reactive Programming中文称 反应式编程。Reactive Programming 是一种 非阻塞、事件驱动数据流 的开发方案,使用 函数式编程
的概念来操作数据流,系统中某部分的数据变动后会自动更新其他部分,而且成本极低。
Spring 框架中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。Reactive 堆栈 Web 框架 Spring
WebFlux 在更高版本 5.0 中添加。它是完全非阻塞的支持Reactive Streams背压并在 NettyUndertow 和 Servlet 3.1 容器等服务器上运行。
![2021-04-30_1-18-42|647x500](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/c/caadcf01e1e85744dea281befbd9a39c6a9d3d3a.png)
简单来说,在 Spring 中可能需要更多的了解 WebFlux 框架。
如何拿 Reactive 和传统的 MVC 框架来进行下对比的话,大致的区别如上图所示,可以认为 Reactive 是相对独立于 MVC
的一种框架和调用栈,需要有时间的时候详细了解下。
## 面试总结
这次面试的整体情况还是良好的。
因为没有 Spring Reactive 的相关知识,因此被拒也在情理之中。这个也不能说明有知识缺陷,可能是在平时工作的项目中没有这方面的需求,因此也没有掌握相关的内容。
唯一需要补充的就是了解相关概念,并且在有空闲的时候进行一些充电即可。
公司面试的过程中没有涉及到算法,在线编程等内容,主要是聊天,聊天的过程还是非常愉快的,整体评价这次面试还是非常轻松和友好的,只是被拒后小郁闷了
3 分钟。

View File

@ -0,0 +1,113 @@
# 北美一工作搜索引擎公司技术岗面经
> 🔔 参与讨论https://www.isharkfly.com/t/topic/13451
公司名称就不说了,基本上很多人都会用到的一个在北美地区比较流行找工作时候使用的搜索引擎。
这次面试的岗位是技术岗加部分的管理岗位。就目前来说已经完成第二步了,但是感觉不是非常好,其实主要还是在线写代码这部分。
下面对这次面试的过程和经历进行一些总结。
## 电话面试
当你投了简历后,公司发现可能会比较符合他们的要求,通常公司都会安排一个招聘人员对你进行电话面试。
电话面试通常比较简单,基本上聊一下你过去做过的项目,你当前的职业情况是什么的,为什么想到为离开现在的公司等等。
这个套路基本上所有的电话面试都会遇到,因此不需要担心,你就把你准备好的说辞重复一遍就好了,当然可以针对公司的一些主要业务的不同来进行调整。
这家公司的电话面试在后半部分可能会问一些基础的 Java 的相关内容,在这次面试中,我被问到了下面的一些问题:
* Hashmap 和 HashTable 有什么不同
* 线程安全是什么
* 重载和重写有什么不同
* Big O 是什么
等上面几个问题,通常来说这些问题都比较简单,都是概念性的一些问题,你需要对基础概念有所了解,在这个阶段,一般来说都不太会问到具体算法的问题。有些公司喜欢问时间复杂度和空间复杂的以确保你对算法有所了解。
但是在实际的过程中,绝大部分人都在完成功能需求,真正有机会考虑复杂度的情况不多。但没有办法,面试的人有时候就喜欢搞这些东西。所以建议所有童鞋还是要复习下这方面的内容。
## 1 小时视频面试
在完成电话面试后,如果他们觉得你还不错,可能就会安排下一步的技术面试的。
通常这部分的面试时最闹心的也是最讨厌的,因为你永远不知道他们会出什么算法题,同时你也不知道他们会不会让你用你自己喜欢的
IDE。
个人感觉在这部分的发挥不是非常好,因此感觉基本上应该是没有第三轮的面试了。应该没有多久就会收到一封非常礼貌的拒绝邮件了。
但不管怎么样,我还是凭记忆写一些遇到的问题供大家参考下。
这 1 小时的技术面试分 2 部分,下面分别描述。
### 设计分析和概念解释
相对来说这家公司还是比较人性化,他们在面试的时候提出了 5 个分类让你选,这 5 个分类具体不记得了,大致应该是系统性能分析,面向对象,测试,开发流程等。
我选的是系统分析和面向对象。
在系统分析部分,他们给出了服务器上一个内存使用的图片,图片上面 CPU 使用率没有怎么变化,但是内存使用一直在增加。问题是,能通过上面的图片进行一些什么分析。
如果是 Java 的话很有可能就是内存泄漏或者线程问题这个时候你可以给出一个分析思路通常就是查看日志Dump 线程池子,检查 HTTP
访问量等等常规方法,照着忽悠就行了。
面向对象部分的问题就比较多了,但是基本上也就是一些基本的概念,依赖注入是什么,怎么注入的,控制反转又是什么,继承关系,类和抽象类,实现
等等。
基本上都是 Java 面试时候通常使用的概念,如果你对这些内容都不太熟悉或者忘记的话,那么可能就需要好好补一下了。
这些概念在面试的时候经常会被问到。
在完成后上面的问题后就是很多人都非常头疼的在线写代码了。
我问了可以使用自己的 IDE 吗?回答是不可以,因为他们说是保持对其他面试人员的公平,因为有时候使用自己的
IDE你可以导入很多你自己的类。当听到这里的时候脑袋上的乌鸦就飞过了。
哎,摆着现成 StringUtils 不用非要傻乎乎的从定义 Char 开始用,只能说脑袋有病而且是病得不轻。但是也没有办法,也就硬着头皮上吧。
问的问题我已经发到 [A “word-wrap” functionality一个字符串包裹函数](https://www.isharkfly.com/t/a-word-wrap-functionality/13452)
上面了。
有关问题的具体解答和点评,请访问上面的链接进行查看吧。
这里只说说当时的感受,因为有时间限制,所以你需要尽快理解题目的意思,我尝试用了 StringUtils ,但是在线编译器不让使用。
这个编译器可以让你使用 List但是有关 List 的方法提示反应很慢,经常提示不出来。
在现场做题的时候没有怎么想明白,想到的就是先获得字符的数组,然后获得第一个单词,然后添加 -,然后再获得第二个,然后再添加 -
,在这个过程中有可能会超过给定的长度,因此需要重新开始下一行。因为可以使用列表,所以你可以比较容易的 add 到你的 List 里面。
但是这里有很多小问题,比如说在不加 - 的时候,正好长度是给定的长度,所以导致有时候输出的不正确,有时候不应该有 -
的时候确有了 -。
在忙活了 40 分钟后终于**没有通过**测试。
所以估计这家公司应该是凉凉了。
随后在退出面试后,尝试用 IDE 自己写了下,发现如果可以让我用 StringUtils 函数也不是非常复杂。
我们可以将获得的字符串中间全部先加上 -。
然后按照 - 来进行拆分直到重构的字符串为 NULL这里你可以使用一个 While 循环来做。
可以使用的方法为 removeEnd 和 substring 等。
具体的解答和分析,请访问上面链接中有关问题的具体分析即可。
## 总结点评
这次面试应该是失败的,总结下来就是很多人都不是非常舒服的代码部分。
![0_IQNLJLjd5Wh267ei|397x500](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/8/8acd96a04f78fe9b84da7ef3e8d434999b4225a8_2_397x500.jpeg)
因为找工作之前很多人都会复习下基本概念,面向对象,和一些基本的数据结构,因此上面的概念部分只要不是特别偏,很多人都不感觉非常不舒服。
其实非常不舒服的地方就是在在线写代码部分,因为很多已经工作过的同事在工作的时候基本上不会接触到具体的算法,而且这些算法其实很多也没有太大的意义。
但是实际上算法题目非常多,很多都集中在字符串处理上面,通过这次面试,建议还是同学们需要对常用的字符串处理多进行练习。
包括有获得字符串长度,获得子字符串,如何拆分,如何获得字符串中的某一个值等等,通常这些能够帮助你更有信心去面对下一步的挑战。
其实也没有什么关系了,找工作就是在不断的失败中总结,从工作岗位到开始找工作总是需要有一个热身的部分,大家把每一次失败都当做热身就好了。
希望所有人当你有机会面试别人的时候,得饶人处且饶人吧。

View File

@ -0,0 +1,83 @@
# 一房地产数据服务初创公司的面经
> 🔔 参与讨论https://www.isharkfly.com/t/topic/13441
北美一有关房地产开发和服务的初创公司面经。
因为新冠疫情的原因,很多面试都已经放到网络上了。在北美进行面试之前,还是建议所有打算从事 IT 的童鞋对基础概念都要熟悉一点点。
如果你是学习 Java 或者面向对象的话,通常使用的一些框架,云平台(主要是 AWS都需要有一些了解才好。
针对 Java 来说,有关面向对象的概念,包括有什么是依赖注入,什么是反转,什么是组件,继承关系,接口,实现等等,都需要有一些基本的了解。
在面试的时候大部分情况都会问到上面的概念。
在搞清楚上面的概念后,就会有一些实际的算法了,其实这些实际的算法算不上难。正常人突击下基本上都可以掌握,唯一比较麻烦点的地方就是使用各种在线平台手动直接写。
其实这也能够看出来面试公司是否人性化的
## hashtable 是如何实现的
这个题目还是有点意思的。
很多人都知道 HashTable 都知道 HashTable 或者 HashMap 是用来存储 K-V 的。但是至于 HashTable
是如何实现的,可能有很多人不知道。或者就算知道可能也不是非常容易的表述清楚。
这个题目的目的就是要求你设计一个 HashTable。在这个题目中需要搞清楚几个知识点K 是怎么存储的V 又是怎么存储的,其中有一个非常重要的概念就是
K 的哈希Hash
有关什么是 Hash 和 Java 中的哈希函数,请参考文章 https://www.isharkfly.com/t/java-hashcode/13447/2 中的内容。
准确的来说进行 Hash 就是对对象进行或者数据进行散列。当你拿到散列的整形数据后,你将会考虑如何将这一个整形数据存储到一个数组中,这个就是你需要的
Hash 表。通常的算法可能就是去模了。
当然假设你有 10 个数据,但是数组正好也是 10 个,那么最好的算法就是每一个数据存储在一个空间中。
当然实际情况可能就不是这样的了,假设你有 11 个数据,但是存储空间只有 10 个,那么就肯定有 2
个数据存储在同一个位置。这个时候你就可以使用链表来将存储在同一个空间的数据链下去。
![500px-Hash_table_5_0_1_1_1_1_0_LL.svg|500x250](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/8/82069d264157d8363a6792fa19e027b09a505f34.png)
如上图显示的就是一个典型的 HashTable 的结构。
对一般的面试来说,掌握这么多的内容基本上能够考察你对基本数据结构的了解,以及对 HashTable 的了解。
如果还需要了解更多的,有关 HashTable 的负载因子,扩容等等的研究的话,其实已经超出了面试本身的范畴了。
正常人如果不是认真复习过,或者没事刷一下的话一般比较难答出来。
相信很多人都是使用 HashTable 或者 HashMap其实很少去了解里面具体的算法和结构说心里话也真心没有太大必要去了解。
在这个时候如果面试官揪着这堆东西不放,或者非要你说明白里面的很多配置。那基本上可以说明给你面试的人有病或者是有点孔乙己的意思了。
当然,还是建议在面试的时候复习下 HashTable 和 Hashmap 的关系,如果你真想啃一下的话,不妨去看看源代码。
## 100 以内素数编程,在线写
题目要求非常简单,就是将 100 以内的素数打印出来就可以了。
这个题目的难度并不大。但是如果你没有遇到过或者没有刷过这个题目的话,可能就会被搞懵逼了。
这个题目有几个关键点,首先 1 是一个特殊的素数,因此你的循环需要从 2 开始。这个很多时候和我们使用的循环从 0 开始有不同。
这个题目能够快速解答的关键就是需要使用定义的**函数来做**,尽量不要在循环里面嵌套循环,因为这样你会很难跳出这个循环,并且循环的起止判断不好判断。
了解了这 2 个点以后就可以比较容易的解决这个问题了。
有关素数的算法中间和代码请参考https://www.isharkfly.com/t/prime-numbers-from-1-to-100-100/13450 中的内容。
## 面试总结
这次面试时今年开始打算换工作以来的第一次面试,因此本身就是当成练手的性质了。
很多工作过比较长时间的人都会知道,在找工作之前,需要进行突击的算法,数据结构,基础概念的巩固。因为在实际工作中,这些东西没有人会用到,也没有人会无聊到去刷这些东西。
但是找工作的时候确不得不进行了解了。
总结这次面试来说就是准备不充分,基本上没有刷题就上去写了,而且有一段时间没有在记事本上写代码了,因此基本上是被他们搞懵逼了。
一上来就弄 HashTable 的算法,这个其实还是有点难度的,如果没有认真复习过一些常用的数据结构的话,肯定是做不出来的。
因为不是非常理想的状态来进行面试的,那么这个结果就可想而知了。
当然这 2 个题目用于巩固下基础还是非常不错的。

View File

@ -0,0 +1,90 @@
# 2021 疫情期间美国公司技术岗的面试流程
> 🔔 参与讨论https://www.isharkfly.com/t/topic/13463
相对中资公司来说,美国或者西方公司的面试流程更加复杂,考核的内容更多。
不管是那种面试,很多时候求职者会遇到:**面着面着就没了**。
当然我们这说的只是你应聘中层以下的技术或者部分管理岗。
如果你是应聘公司高层,我相信基本上都是属于互相推荐的,比较少有公司在市场中进行人才的选择,通常都是通过公司内部的晋升渠道或者是通过职业经理人的方式来进行操作了。
对大部分人来说,基本上都会面临到面试技术岗或者部分的管理岗。
中资公司在这部分的随意性比较大,与美国公司比起来更随意。美国公司的操作比较死板,大部分的情况都会按照既定的流程一步一步的推进。
通常从你开始投简历到找到一份工作的时间在几周到数月不等。
因为疫情的关系,很多公司的面试流程都有了些更改,主要还是在 On-Site 面试这部分通常都改成虚拟通过 Zoom 或者 Team 的面试了。
![2021-job-in-the-us|678x500](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/5/55828ea8f5ec2300d6451776fa11b50c087e269c_2_678x500.png)
在疫情期间的大致的流程通常如下面的几个分类,投简历阶段是第一步,一个完整的找工作流程,通常有下面的几个过程。
## 投简历Step1
这个是你唯一可以主动控制的地方。
有没有什么可以改进的地方呢?貌似没有什么太多可以改进的地方,无非就是多投,对一些大点的公司,你甚至都可以多次投。
原因很简单,不要想当然的认为公司只有一个简历库,其实大公司不同部门之间的很多数据是完全不共享的,因此你的投的简历只针对这一个发布职位的部门有效,针对其他的一些部门,可能根本没有看到过。
因此针对上面的情况,你就多投就好了,针对同一个公司,只要不是同一个部门的同一个职位,你就投它。就算是同一个职位也没啥问题,多投的最坏结果就是多次收到拒绝的邮件罢了。
在经济不是非常好的时候,很多人面临的情况就是投出去的简历根本没有回应。这个真心没有太多可以解决的办法,唯一的办法就多投。
## 初筛 Step2
不同的公司在这里的选择是不一样的。
有些公司是 HR 初筛,有些公司就直接项目经理上来做了。这一步通常是电话或者电子邮件的方式来进行沟通。
因为这一步是公司主动发起的,因此你可能会面临很多五花八门的要求。
比如说,你可能会直接遇到在线做算法题;你可能会遇到做职业技能行为问卷调查;你可能会遇到做测智商的题目;等等等等,这一步是五花八门的。
通常大公司会 HR 先和你沟通,这个沟通通常不是技术层面的,有一些小的技术层面的东西,但是不多。
如果你遇到的是项目经理的面试的话,这个时候技术层面的内容就会比较多。但大部分集中在概念上面,如果你面试的就是技术岗,那么你需要对计算机相关的东西有所准备才行。
## 小组成员轮面 Step 3
如果你运气好,通过了上面的面试过程,那么你可能需要面对的就是项目小组成员的轮面了。
这个面试的时间通常比较长,在 3 到 4 个小时左右,也有段的个把小时。
不管怎么样这个在疫情期间基本上都采取在线虚拟的方式进行了。通常会有 Zoom 或者其他视频工具的加入使用。
一般来说会有问题解答,实际的代码 Coding 技能,数据设计等等。
这部分在以前通常是做 On-Site 面试,公司会要求你本人过去公司进行面试。虚拟方式的面试有时候也比较奇葩的。
遇到过多次,所以每个公司的小组成员对不同工具的使用熟练程度不一样,在这里你就可以有感觉了。
你完全可以通过这个了解公司对各种开发工具,沟通工具的使用情况。
比如说,一些公司喜欢用 Zoom 分享屏幕的方式来让你看他们的屏幕来了解需要问的问题是什么,有些公司希望你在线 Coding
实践,但是他们也能够让你用自己的 IDE因此你只能分享你屏幕给他们了
等等奇葩的操作都能遇到。
有些公司可能会在这一轮反反复复好几次,应聘者就做好准备被蹂躏的准备吧。
## 结论Step 4
在完成第三轮面试后就是等结果了。
在公司是否能够给你 Offer通常都会在这一步决定。
这个决定对应聘者来说完全是抹黑的,你不知道公司是怎么做的决定,你也不知道你是不是有什么地方是可以进行改进的。
有些公司会给你一些回馈,包括的表现是什么样,没有发给你 Offer 的原因可能是公司需要使用的技术你并不是非常熟练,因此你不是非常适合这个职位。
用技术上的这个理由通常是常见的,另外还有一些公司文化和你个人习惯不符合这种的理由,还有就是你的沟通能力和你上司的期望可能会有出入等,这些理由过于细致,通常公司是不会告诉你的。
公司一般都会在技术层面上面找理由。
作为应聘者来说,在等了几天后 follow up 下不是坏事。至少你需要一个结果,一般正规公司都会给你一个结果,但是也有很多公司面着面着就没有下文了,在大公司这种情况也非常常见。
没啥不好意思的,丢个邮件过去就好了。

View File

@ -24,19 +24,11 @@
最新的内容在最前面(按照时间倒序排序)。
### 2023
### 2021
* [一次谈不上有点内卷的美东某金融公司面试](https://www.ossez.com/t/topic/13820)
* [美东某 IoT 公司技术流程第一轮沟通就挂了](https://www.ossez.com/t/iot/13815)
* [2021 年美东地区 IoT 公司的一次失败面试](https://www.ossez.com/t/2021-iot/13791)
* [2021 年一次比较奇葩的 AWS 面试](https://www.ossez.com/t/2021-aws/13788)
* [2021 疫情期间美国公司技术岗的面试流程](https://www.ossez.com/t/topic/13463)
* [从拒绝到被拒绝](https://www.ossez.com/t/topic/13462)
* [从一个工作到一个工作](https://www.ossez.com/t/topic/13461)
* [北美亚特兰大一金融服务公司面试总结](https://www.ossez.com/t/topic/13453)
* [北美一工作搜索引擎公司技术岗面经](https://www.ossez.com/t/topic/13451)
* [一房地产数据服务初创公司的面经](https://www.ossez.com/t/topic/13441)
### 2019
* [IT 技术岗位 2019 年北美求职流水账](https://www.ossez.com/t/it-2019/13433)

View File

@ -0,0 +1,8 @@
- 2021
- [2021 疫情期间美国公司技术岗的面试流程](/work/interview/2021/steps-for-it-interview.md)
- [北美亚特兰大一金融服务公司面试总结](/work/interview/2021/north-america-atlanta-financial-services.md)
- [北美一工作搜索引擎公司技术岗面经](/work/interview/2021/north-america-search-engines.md)
- [一房地产数据服务初创公司的面经](/work/interview/2021/real-estate-start-up-company.md)
- 2019
- [IT 技术岗位 2019 年北美求职流水账](/work/interview/2019/it-job-hunting-2019.md)

View File

@ -0,0 +1,103 @@
# 从一个工作到一个工作
> 🔔 参与讨论https://www.isharkfly.com/t/topic/13461
在美国所有的雇佣关系都是属于自愿雇佣的,换句话说公司和雇员之间的关系比较简单。
简单到,公司可以比较容易的解除雇佣关系,当然个人也可以比较随意的和公司解除雇佣关系。
经历过在周一早上开例会的时候,项目组的老大就是说我需要你单独留一下,自己以为还有什么问题需要解决的,随后突然另外一个不认识的人加入会议。
你的项目组老大就和你介绍说,这是我们公司 HR 的谁谁谁,当你听到这个介绍后,你应该马上明白会发生什么了吧。
通常你的老大就会和你说,我们也不想做这个决定,这对我来说是非常困难的选择,如果你还听不明白的话,那就只能说明你智商有问题了。
随后,和你说话的这个人,我估计你也没什么心思听他们 BB 了,唯一的要求就想知道你们补偿我多少钱呀。
在这个时候去计较你的贡献,你的东西都是一钱不值的,并且没有任何意义。
通常 HR 会在随后告诉你的最后一天是那一天,通常就是当天,你的邮箱和联系方式会在这个会议结束后马上失效,电脑需要上交。废话都登不上去了,不上交干嘛呀,当摆设呀。
![HubPage_Layoffs_Layoffs_jnlapk|500x500](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/0/0c38e9a64f1f16ce254c6635fac95ba515ab9336.png)
其实这个流程就是美国公司 Layoff 员工的标准流程。大公司基本上都会这样去操作,员工也不会被提前通知到。
没啥大不了的,又不是世界末日,可能更多的是对你心里的影响。对你心里有多大的影响在于你把这份工作看得有多重要。
## 失去工作
失去工作可能是很多人都不愿意看到的,尤其是在自己还没有准备好下家的时候被现在的雇主解雇或者因为工作职位的变化而被 Layoff。
正是因为经历过所以才会有研究,从来没有想过 HR 中间还有这么多词汇,下面就对一些词过一下,看看你是什么原因,按照从严重程度从高到底的顺序吧。
### 自愿解除合同( termination involuntary
通常这个的原因就是你已经找到了更好的去处了,并且老子不和你玩了这种提出的辞职。
有些人就想是自己创业了,或者我就想自己休息半年,没有时间和你们矫情了。这种情况都是员工自己提出的辞职。通常这种是没有任何补偿的。
还有一些情况就是退休呀,或者自己不想做了,提出的离开,都可以属于这种。
### 非自愿解除合同( termination involuntary
既然有自愿解除合同,那么也就非自愿解除合同。
通常这种情况下的解除合同是雇主发起的。最多的情况可能用到的词就是 **layoff** 了。
#### 裁员layoff
在这种情况下公司通常不会直接告诉你被解雇了。一般会用一些比较好看的包装过的词。比如说RIF reduction in force (裁员) 。
说得挺好听的,其实就是因为你的职位已经不再需要了,或者公司有其他方面的调整,你被裁员了。
一般来说这种情况都会多多少少有点补偿的。
这种情况是裁员中比较友好的一种情况。公司或者项目不再需要你了,发点遣散费打发你走了就 OK 了。
这种情况通常不是雇员自愿提出的辞职,公司养着你也没啥意思,就打发打发你走人吧。
这种情况和员工自身的表现无关,也和员工的过失无关,通常都是雇主的经营或者资金的问题,放宽心,休息下也不是坏事。
边休息边找工作吧。
这种情况唯一不太好的就是对在美国持有 H1-B 工作签证的童鞋。因为你的工作签证可能也会因为你丢了工作而失效,建议你可以和公司商量下终止合同的时间。
#### PIPPerformance Improvement Plan
这个词看起来高大上吧。
残酷的现实总有一个温柔的外表。如果你被 PIP 了,建议你想到的第一件事情就是马上开始找另外的一个工作了。
不要想着我要留下来,这个公司福利真好,也许我改进下就会变得更好了。
公司要解除雇佣关系,需要找一个高大上的理由,这个就是一个冠冕堂皇的理由。很多人不愿意离开的原因有很多,有些时候是工作签证的关系。
有些时候是因为现在公司福利非常好,自己一下子可能还找到这么好的,有些人可能是对工作的不舍。
不管是那个原因,这样想就太天真了。
PIP 就等于给你几个月的时间缓冲找工作,丢掉幻想,振作起来才是王道。
这种解除雇佣关系大部分情况也是没有补偿的。
## 下一个工作
很多人都说过,在一个岗位工作久了就忘记了自己还能干什么了。
有些人也在想是创业还是打工。其实每一个人的选择都是自己的选择,这个都无可厚非,也没有对错可以去判断。
以题主多次工作上的转换来看就是不把所有鸡蛋放在同一个篮子里面永远是一个正确的选择。
你永远不知道那片云彩是会下雨的,你也永远不知道你需要多长时间丢掉这份工作。
本人是做 IT 的,经历过 N 多的面试,很多人在面试别人的时候,在对面也许没有这种感觉,当有一天你自己需要去被面试的时候,你会发现原来的自己是多么的无知和愚蠢。
幸运的是,自己总能在一段时间找到一个相对还过得去的下家。但是不是每次都会有这么好的运气的。
年龄越来越大,市场的竞争力其实在减弱。
在任何时候准备好随时会丢掉工作,随时准备好有自己的一个 Back up对所有的职场人来说都不是坏事。
越年轻,越经历过失业,越不是坏事。要比等自己年纪大了再经历失业要好得多。失业能够让你保持清醒和冷静,不要忘了自己还缺点什么,在一个位置上混吃等死。
纪念 2021 年的一次找工作经历。

View File

@ -0,0 +1,77 @@
# 中年是危机还是重生
> 🔔 参与讨论https://www.isharkfly.com/t/topic/13434
在前一段时间最焦虑的时候,我的妻子一直陪在我的身边,一直在给我鼓励,并承担了好多,好多家庭的重担。虽然中年悄然而至,善待身边的人,相信只要一起往一个方向努力,没有什么东西是过不去的。
公司业务调整,虽然目前还在给公司做 Contract但是终究还是饱一顿饿一顿的后面还有嗷嗷待哺的小朋友这样下去感觉非常不踏实。
80 后的末尾都已经进入中年了,在北漂的时候以为当时说的中年危机离自己很远,但是真正来到的时候还是猝不及防。
闲逛知乎,无意中搜到好多中年危机,求职的话题,总想自己要写点什么。从焦虑,到不焦虑,到认真思考,也许人生每一次改变都是安排。不知道多年后我是否还能有心情和时间去写下这些文字。也许闲下来的这段时间就是让我们整理整理再出发?
经历了 1 个多月的折磨,虽然到现在还没有接到 Offer但是心态基本上平和了反正努力去找了至于结果是什么自己积极努力的心态就能打败一切了。也许是我应聘的职位比较高所以
On-Site 都好几次了,在没有 Offer 的情况下 HR
还主动打电话给我说,公司对我还是很感兴趣,无奈竞争比较激烈,我们也很难做出这个决定。如果你愿意的话,我将你推送给其他的同事的岗位,你看可以吗(安慰奖?)?
至少这样的回复还能让人感觉好点。
积极的心态,认真化解。随便写写自己的中年危机清单,想想破解方式,也许破解中年危机的最好办法就是打破自己思维的禁锢,寻求重生?
## 危机
中年的问题感觉就是精力已经开始在慢慢走下坡路了,但是前路漫漫。
买了房的还有无数的贷款要还,没有买房的却要面对高昂的房价。也许化解中年危机最好的办法就是财务自由,所有人都在想财务自由,但又有多少人能真正实现财务自由呢?
工作上已开启了一种安逸,天花板模式,上也上不去,下去却很容易。一个业务重组就能把 80
后重新抛向职场,然后你还得屁颠屁颠的拿着简历和才毕业的大学生们一起竞争。低薪连付房贷都不够,高薪又遥不可及。上不上,下不下,空有一身焦虑。
一直在想,如果是一直在创业的人会有中年危机一说吗?就算有也可能没有我们这么强烈吧,因为创业的人每天都在危机中度过,他们抗压能力更强。
中年危机这个词,体会最深的应该就是这类人:一直在格子间,每天做着相同的工作,但突然有一天这个格子间却不属于你了。
## 重生
为自己写下下面的计划,帮助自己度过中年危机,也许一切只是开始,只是重生。
找到自己可以做的,找到自己可以改变的地方,我相信一切都不会太迟,最迟的行动就是你现在还没有开始行动。
### 心态,心态
焦虑和担心都无助于问题的解决。要解决问题最需要做的就是要调整心态。最近一直发现,平时因为时间忙,一直没有去做很多自己想做却没有做的事情。每天都在为了工作上的任务拼命奔波。
何不认真去思考下自己还有什么东西能做,还需要去做什么呢?
去平衡下自己的心态,也许在学习的过程中又掌握了一门新的技能,增加了自己的实力,危机悄然化解了呢?
在最开始的时候,一直以为在公司工作那才叫工作,其他的工作要不不那么体面,要不不那么赚钱。一段时间后,我发现我错了,不是因为其他的工作不赚钱,那是因为你没有做进去。
最近和一些做代购的朋友聊天,因为身份的问题,他们也没有办法在这边合法的找到一份工作,很多朋友都顺便做做代购,我就问他们。做代购辛苦吗?都说很辛苦,我问他们赚钱吗?笑而不答,和我表达的意思是,发财难,温饱能解决。再后来一打听,收入也和我在公司上班差不多。只是多点少点而已。原来很多时候,你觉得不赚钱的事情,那是因为你没有做进去。
现在我明白了,调整自己的心态,做好自己能做的,不能做的不要勉强。不要为了微薄的收入而做自己不喜欢做的事情。因为这个事情不是你自己喜欢的,你不一定能够做出什么成绩。
不要管是什么工作,这个工作是否体面,只要是自己喜欢的,先去尝试下总没有问题。尝试了,发现自己不喜欢也没有关系,至少自己尝试了。不要等待,更不要在等待中焦虑。
摆脱危机,现在开始行动。
### 投资自己
我们可能没有资金,我们可能有很多债务。但是我们可以投资自己呀。
利用这段时间,可以多学习学习,多考考证。在去年的时候,我跟风一样的考试了房地产经纪人执业证书,说心里话,在考试的时候想着就是以后自己买房子能够少点手续费,能帮家人买卖房子的时候帮家里人省点手续费。
谁知道无心插柳柳成荫,今年才开始就有几单要成交。感谢我去年做的那个决定,也感谢我妻子在我快要放弃的时候督促我认真学习,通过考试。
其实每一次决定都没有对和不对的一说,你今天的努力就是为了明天的投资,你的努力投资了你自己。
从现在开始,从今天开始,不再观望,不再等待。
于是我开始了我的个人博客和知乎创作之旅。在帮助朋友客户找房子的时候忽然发现华人在美国买卖地产交易很频繁但是中文资料又特别少概念又特别多。想着怎么帮助大家呢我就开了一个知乎小专栏https://www.zhihu.com/people/huyuchengus
每天发点小干货,每天分享点小经验。这就是我坚持每天发一篇文章的创作来源吧。
我更认可下面的这句话:与其说是中年危机是将中年人抛向了市场,不如说是市场给了中年人重生的机会。
![21fe52f402fd4de9ae543ff1c434f4e9|690x390](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/c/c81a8c0e3f333af01d4bc9ecfdb681ddfff44c6e.jpeg)
祝福所有已经步入中年的 80 后。

View File

@ -0,0 +1,91 @@
# 从拒绝到拒绝
> 🔔 参与讨论https://www.isharkfly.com/t/topic/13462
什么时候开始有了为自己而工作的想法,什么开始尝试放弃在网络上投简历。
2021新的一轮工作季的开始你投了太多的简历太多的邮件太多的尝试而到头来收获的却是从拒绝到拒绝。
![overcoming-sales-rejection|690x364](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/2/28f6357c7deca6ae4b744606b2d599c8220e191b_2_690x364.jpeg)
一天的开始,不停的得到了被拒的消息,通常都是第一轮就被拒了。
总想要写点什么,纪念成长的经历还是被打击后的坚强?
对面试步骤不是非常清楚的话,可以参考: [2021 疫情期间美国公司技术岗的面试流程](https://www.isharkfly.com/t/topic/13463)
文章中的内容。
## 物流传感数据公司
一般都不会将公司的具体名字写上来,一是怕最后引起不必要的麻烦,只是在这里对公司的行业类型进行一些描述。
这个公司是在面试过程的第二步被挂掉的。在招聘人员电话面试完成后,招聘人员一直在强调他只是收集相关信息,然后将数据提交到后台中让项目需要的成员进行选择。
基本上来说这个公司的面试就是你自己把你的简历读一遍罢了,从大学毕业将所有的工作都过一遍,看看有没有什么问题。
时长差不多 30 分钟,没有什么亮点可以陈述。
## 软件咨询公司
这个软件咨询公司的面试流程进入到了 Step 3第三步了、
这个软件咨询公司是在美国的软件咨询公司,提供的是英文的服务。
但是不清楚为什么给面试的却是一个华人。这个有点奇怪,在面试的过程中全程使用中文,有时候会夹杂一些英文。非常不好意思的纠正了公司面试的人的发音错误,这个是明显的错误。
这个面试还是有点意思的,可以说道说道。
面试预订时间是 30 分钟,但是不知道是在那个沟通渠道上出了问题,面试我的人的认为面试时间是 1 小时 30 分钟,但是我一直认为是
30 分钟。
寒暄的时间很短,没有超过 10 分钟,余下的 1 个多小时都在做题因为我在1 小时后还有会,没有太多的时间去纠结细节。
但面试经历还是独一无二的,从来没有遇到过。
在面试的头一天,他们发了一个 GitHub 的仓库过来,在仓库中有一个原始设计好的项目,项目结构是标准的 Spring API
设计。功能也不是非常复杂,为了简化,他们没有使用数据库,使用的是写死的数据。
在面试前我就看了一眼,了解了下具体需要做的是个什么东西。
在面试的时候出问题了,首先对方问我能不能了解到要做的是什么,我说基本上了解了,一个 SpringBoot API要做的东西结构还比较清晰。
随后,下一步就是对方拿了一个完整的 Task 过来,这个 Task 是要求写一个逻辑,这个逻辑就是根据输入的数据到 API 运行后返回需要的结果。
输入数据格式没有定义,算法不复杂,但是有点内容,后台数据结构有,但我没有时间仔细看。
在这里,和面试的人产生了不少的冲突:
* 他希望是写一个测试驱动,通过先写测试然后再写逻辑,我是想先写逻辑,再写测试。
* 逻辑层的定义,我希望在逻辑层上写子函数,对方希望我先想明白再决定。
* 不停的纠正要按照算法,要求,不要有自己的想法。
* 时间不够,没有太多的沟通,面试感觉非常不好。
最后,在 1 个小时后,我提出了我有会议还要进行,没有办法完成这个 Task。然后不欢而散。
终于体验到了在美国面试 IT 技术岗的时候,防火防盗,防中国人。
总结下这个公司的面试问题有下面几点:
* 公司提出的内容太多,没有办法在 1 个小时内完成所有的逻辑。
* 参与面试的对方过于强调自己要什么,并不是非常在意或者不允许应聘者有自己的想法,这个可能和公司的业务性质有关。公司是软件外包公司,他们只关注实现,并不在意做的东西是什么。
* 面试题目的出发点是好,通过一个完整的逻辑来考察面试人的状况,但他们忘了,我不是来帮你们解决 Task 的,这个 Task
和我无关,我并没有责任去保证你的 Task 的完成情况。
* 沟通非常不顺利,对方并不了解我想什么,我也没有心思去了解对方想什么。
整体来说这次的面试是一个非常失败的面试。
我认为对我自己来说是失败的,对对方公司来说也是失败的。实在无法想象,如果以后还要和他成为同事,这种情况如何进行沟通。
不希望每天上班都是折磨,应该是互相的把工作做好,因为我们是一个团队,我们是一个小组。
## 博彩数据分析
这个公司是一个初创公司,但是公司的发展和经验非常迅猛。
在 2019 年的时候投过这个公司的简历,但是不幸的是第一步以后就没有下文了。今年不甘寂寞的再投了一次,不幸的是还是在第一步就被拒绝了。
也许和他们没有缘吧。
上面将最近几次的面试小总结了下,发现了可能是因为已经有 Offer 了并且也准备过去上班了。所以对面试也没有太当回事情了。
也许能够通过上面我的经历对还需要面试的人提供一些线索吧。

View File

@ -0,0 +1,178 @@
# 公司裁员日常的骚操作和警告
> 🔔 参与讨论https://www.isharkfly.com/t/topic/14465
如果想自己在裁员的时候是最后一个知道被裁的,并且打一些有准备的之战的话,下面的雷区一定要认识到。
这些雷区通常能够给你提供一些警告,因为本次公司裁员真的属于教科书级别的,以前都没有太当回事情,反正也抱着无所谓的心态去的,很遗憾上面的内容都一一验证了。
裁员对被裁的员工当然是有影响的,就算还算幸运留下来的话,也会有很大的打击,士气上肯定是没有以前那么好了。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/6/60b062215ac171351d04b4155e03ce87d766c28b_2_690x388.jpeg)
下面的内容也参考了网上的一些文章,同时结合自己的实际总结出来的。
## 管理层变化
**警告等级【4 星】**
在未知情的情况下,管理层出现了非常大的变化。
我们公司的情况是在 2022年 11 月,创始人+CTO创始人+CFO 离职。
一个公司只有 5 个创始人,其中 2 个创始人在同一天离职,这个意味着什么,你品品,细细品品。
因为 CTO 离职了,职位空缺了 3 个月,在今年 2 月份左右的时候新招了一个 CTO这个新 CTO 我个人不认为能力有非常强的感觉,但是马上肯定就意味着要重组。
果不其然1 个月以后,负责开发副总被解雇,对公司 VP 级别全部大换班和调整,保留了其中开发人员和测试人员都认为比较奇葩的 VP。
3 个月后,公司技术岗裁员 70%。
具体的时间轴,会在另外的一篇文章上写些总结。
另外,当被裁后,发现公司负责市场的总裁在 3 个月之前离职,目前已经就职在另外一家公司。
## 现金流
**警告等级【4 星】**
不管公司怎么说,资金是不会说假话的。尤其是对上市公司或者财务要求公开的公司来说就更是这样。
如果公司在 2 到 3 个季度内都没有办法达到财务预期,那么裁员就是要快发生的事情了。
投资人是不会让公司在不赚钱的情况下不停的烧钱的。
这个对应的是人事变动,如果负责财务的团队或者主要负责人有非常大的变动的话,那么说明公司的资金状况可能并不是非常理想,这个时候要小心了。
## 同事离职缺勤增加
**警告等级【3 星】**
如果你发现近期,你身边的同事离职增加了,并且很多和你关系还不错的同事都在偷偷开始找工作的时候。
这个你要小心了,可能大家的感觉都差不多。
因为现在多是远程工作,最大的体现就是各种会议的时候同事通常开始请假,并且总有各种理由不参加一些本来安排好的会议。
如果你找你的同事要求处理一些问题的时候,通常要等更长的时间才能收到回复。
这种情况更多的是你的同事在参加各种面试,没有时间同时照顾 2 个会议。
如果有时间冲突的话,他们肯定是选择更加重要的会议,换你不也这样吗?
## 和上司沟通的时候提供信息更少
**警告等级【3 星】**
很多人和上司都有一个固定时间的 1对1 沟通。
在和上司进行 1 On 1 进行沟通的时候,你会发现上司提供给你的有关公司的信息越来越少,每次都好像有什么要说的,又没有什么要说的。
这次,我没有把这个放在裁员的考察之内。
原因是:我们公司这次的裁员规模和比率,连我上司自己都被降职减薪了,他自己也不知道要发生这些事情。至少他自己是这么说的,我也姑且相信他一下吧。
他说,没有任何人找他对他的手下做任何评估,我相信这是真的。因为按照这个裁员规模,是不需要对要裁的人进行任何评估的。
裁员手法就是砍项目,降低到最低可维护水平。
## 项目并不重要或者价值不高
**警告等级【3 星】**
公司安排的项目对公司来说并不非常重要,或者说并不是影响运营的,更多属于优化这种。
另外,你的项目完成后,公司并没有后续项目让你继续进行。
我们这次组被裁,因为我们做的是财务和支付处理流程。这个流程现在已经有一套 PHP 的版本在用,虽然用得很难受,但是也是可以用的。
在处理财务和支付流程的时候,他们还是手动的方式导入 CSV 文件来进行处理,我们需要把这个流程做成自动化。
如果公司业务在高速发展的时候,这个需求是非常紧迫的,因为我们可以替代 3 到 4 个财务人员的工作,并且可以降低错误。
但是,公司业务出现问题的时候,这个功能改进其实就没有什么太大价值,或者意义不大到没有任何价值。
因此整个团队在这部分被处理掉,这个很正常也可以理解。
## 被提示需要改进工作
**警告等级【3 星】**
北美这边有一个 PIP。PIP全称为 Performance Improvement Plan中文为绩效提升计划。
据闻 PIP 起源于亚马逊意为针对业绩排名靠后的员工进行绩效辅导。进入到PIP中上级会给员工制定一个绩效目标员工需要在特定的时间里去完成这个目标这个时间通常从30到90天不等。
当员工在 PIP 中出色的完成了目标,将会留下来继续工作,否则将面临被辞退的命运。
据悉亚马逊一年会有两次比较大规模的员工绩效评估绩效排名在后10%的员工都有可能被放进PIP名单当中。
PIP名单由上级主管决定一旦进入到PIP名单若想要从名单中剔除则需要部门总监甚至VP的批准才可以从名单中移除而不是由主管来决定。
PIP中的绩效目标要比正常工作的业绩目标稍难甚至难得多。
由此可见进入PIP的业绩提升计划本来就难从PIP出来还需要层层领导审批无形中又增加了走出PIP的难度。
如果你被 PIP 了,建议就是稳住工作的同时,马上寻找下家。
我们组因为新的奇葩架构师的问题,被 VP 提示过 1
次。因为这个新来的架构师的要求实在太奇葩了,实在是无法接受,甚至你觉得你接受这些要求,等于是在公司工作没有任何提升还会影响你后续的求职,因为没有公司是这样玩的。
这次提示的时间大致是在 2 到 3 月之前。
因为 VP 自己没有判断能力,或者他过于依赖这个架构师提供的信息,就等于是听床师这种,难免就会对组内成员产生看法。
这个看法是由我的上司传达给我的,我也开始要求他们接受所谓的新的代码规范,但是无奈实在是阻力太大。
## 冻结招聘Hiring Freeze
**警告等级【2 星】**
这个项目的警告等级完全是属于可大可小。有时候招聘冻结可以算是 3 颗星,有时候也仅仅可认为是 2 颗星警告。
有关招聘冻结的定义和可能发生的情况如下:
在招聘冻结期间,公司通常停止增加新员工。然而,如果冻结被解除,企业可能会恢复其原有的增长计划,包括雇佣额外的人员。
各种情况可能导致招聘冻结,包括不确定的经济时期或企业内部发生的个别事件。当管理层冻结招聘时,公司员工通常会意识到;通常情况下,在经济放缓期间,现有人员有望保持或提高生产率。
上面的定义是书面上的定义。我认为中西文化在这个定义上面是有误解的。原因是中国的公司规模相对比较小,更多是老板一个人说了算。
美国公司这方面的行为比较规范,尤其是一定规模的公司,在公司经营比较正常的情况下,通常不会轻易冻结招聘。
原因是,公司本身需要保持一定的流动性,因为公司的员工可能有自然辞职,意外等各种情况,公司需要保留一定的人才储备,这个人才储备就是通过招聘过来的。
因此招聘冻结,就意味着公司在短时间内不再需要一定的人才储备,甚至对已有员工的离职和意外也认为有足够的能力去解决。
因此,冻结招聘在西方文化的语境里面就是公司的经营状况由增长转变为持平或者下降了。
结合这次我们的公司的实际情况所有的问题就都是从冻结招聘开始的。公司冻结招聘的时间是在2022年的9月份。
在 2022年8月份的时候公司还是处于积极招聘的状况从经济学的角度来看就是从增量经济转变为存量经济了。
### 冻结招聘的时间
这里冻结招聘的时间长度也非常重要,如果只是短时间的冻结几周到个把月的时间的话,通常是不需要过度担心,通常可以结合其他信号进行观察。
这是因为,公司可能需要几周时间对公司内部进行调整,或者公司的经营方向有些变化,相关岗位不再需要太多的人,公司需要对这些岗位进行调整。
另外,需要注意的冻结招聘不是说整个公司的招聘都冻结了,而是只针对你的部门或者岗位。
比如说,我们的技术岗冻结招聘。
再结合我们公司的实际情况,从 2022年9月冻结招聘以来公司有关技术岗的招聘就再也没有开启过直到现在这次大规模裁员。
因此,如果对冻结招聘对我们这次的影响来看的话,这次应该的星级更高,应该到了 **3 颗星** 的水平。
对于中资公司来说,冻结招聘所占的权重并不是太高,因为中资公司的整个招聘流程还是相对比较随意。这里还是有一个比较大的中西方文化差异的理解。
可能还是因为文化差异,这次大意了。
## 总结
上面是我从这次公司裁员中获得的一些经验和教训。
虽然不是非常全面,但是也希望能够起到一些抛砖引玉的作用,如果我还想到了什么就再补充补充,供大家参考下。
如果有 3 星以上的警告出现一个的话,真的要认真考虑下是否要选择下一家或者开始准备了。
如果有 2 个 3 星以上的警告同时出现的话,没有什么好犹豫的,积极准备,因为裁员或者被裁就会发生在不远的将来。

View File

@ -0,0 +1,101 @@
# 上一年工作中猫腻的总结
> 🔔 参与讨论https://www.isharkfly.com/t/topic/14464
任何一个公司都有自己独特的管理方式,但是在裁员和人员管理上,只要人数超过一定规模的公司基本上都是有一个 SOP 了。
如果你没有被裁员,主动离职的,那么恭喜你不需要经历这个 SOP 流程,如果你是被动的,那么这个 SOP
流程肯定你会遇到请参考文章https://www.isharkfly.com/t/topic/14461#h-3 内的裁员过程部分。
这篇短文就是为了不被吓着自己,在公司里面可以玩的小手段能帮助你获得更多的信息来决定自己在公司中的去留。
## 管理层的鸡汤要过滤
管理层的鸡汤有些看起来很不错,有时候又可能就是毒鸡汤了。
在一个星期之前的 All Hands公司管理层还说今年形势大好完成了多少多少的计划反正就是给你一个公司运营非常不错各个地区的市场占有率都在节节攀升这种情况。
谁知道,在一个星期以后的 All Hands就进行了大规模的裁员这次裁员比例据说是高达 50%
以上,这哪里叫裁员呀,这个就是削减掉所有的开支,保持公司最低正常运营,所有的开发和功能全部暂停。
技术岗更是重灾区,所有外包和驻外的开发团队全部裁撤,北美地区裁员 40%,如果按照人数比例来说的话,技术岗裁员高达 70%,而且是一步到位。
简单来说就是保障系统的最低运营就行,所有的开发全部暂定和不再继续。
所以,我们公司的这个 All Hands 简直就是毒鸡汤,好在大部分人是信而不信,在这么高的裁员比例下,就算留下来的也是降薪降职。
## 小道消息多打听
我们组里面有个同事,非常喜欢打听各种消息。
他能够在管理层里面活得相当滋润,属于非常擅长社交之类。我们组的小道消息都是从他那里获得的,这次他也才被裁员之列。
在裁员当天,他说路过管理层的窗户的时候,他们都不敢直视他。我们就说你这过了喔,裁员是管理层的决定,他们只是具体执行的人,只是他们有选择谁的权力罢了。
在这个时候,他们肯定会选择自己用得顺手的听话的,或者工作不咋地但是和他们套近乎不错的。
比如说那个奇葩的架构师,显然是留下来了,因为整个公司的 PHP 转 Java 是他们推动的,不管整个过程有多奇葩,但是现在把他弄走了不是啪啪打留下来这个副总的脸嘛。
公司这次裁员的保密工作做得非常好,可能是因为裁员规模非常大,已经削减掉了 50%,甚至有些人还在度假 PTO公司为了稳住他们在他们
PTO 的时候就没有说,直到他们返回公司。
这种更好玩,度假回来打开电脑,工作没了。
我们组这个包打听也不好使了。
## 对上司保持冷静
在本次裁员中,我们的直接上司是留下来了,他手下本来有 4 个组的,从留下来的人数上看,肯定要重新合并,最后公司可能就会留下 2
个组搞开发,一个 DevOps 搞搞部署。
留下一个奇葩的架构师搞 Java ,另外一个维护 PHP 的已有产品线。
在裁员的当天,我们的直接上司也是懵的,他完全不知道,至少他自己是这么说的。
事后,他也单独找我们说,他是真的不知道,他知道所有的选择就是副新来的 CTO + 原来 PHP 提拔上来的副总 + 测试副总 3 个人决定的。
没有任何人问过我们直接上司名单的意见,工作能力等任何问题。姑且我们也想想他把,按照这个规模比例的裁员来说,手下人的表现和工作能力其实不是他们考虑的目的,他们需要考虑的目的就是一次性削减成本到位。
原来公司架构师有 5 个人,从最后的裁员列表上看就是裁掉 1 个,降职 1 个,保留了 3 个,可能另外那个因为我们不熟悉,沟通少,也可能被降职了。
学到的就是,自己上司有时候也没有办法帮你,不是很多信息他也知道的。
我们公司这次裁员可以说是完全不按套路出牌了,说得好听叫重组,说得不好听点就是经营出现了严重的困难,必须要削减掉大部分的开支。
如果经营持续恶化的话,那么进一步的开支削减就在路上的不久发生。
## 对自己有定位
每个人在公司中的位置是不同的。
有些公司的文化比较开明,个人和公司的关系也是合作的关系。有些公司与员工的合作关系比较融洽,这种公司容易让人有代入感,让你觉得你还真是公司的主人了。
首先想说的是,对我现在这个公司真没有什么代入感。因为产品线的相关负责人实在是让人很困惑,只喜欢听他自己喜欢人的建议。
举例,所有人都反对的把代码放在一行超过 1000 个字符的这种事情,他们都在公司一直强推。可想而知这个阻力有多大了。
你这是反人类呀,但是还是推下去了,不是因为这个东西是正确的,你把握了 PR 的权力和 PayCheck别人自然会选择退让不选择退让的人就开始离职了。
对于自己,这次需要深刻检讨的地方在于拖延症,其实一直在准备离开的事情,只是没有那么急迫的下定决心。
所以说,自己在公司中应该有比较明确的定位,一旦发现公司和自己的合作关系并不融洽,或者你对一些事情的看法无法接受。
那么换地方的想法就要马上进行实施了,不要拖延,不要把所有鸡蛋放在一个篮子里面,而且这个篮子还不非常舒服的情况。
## 心态
心态的转变是需要一个过程的,不得不说人的适应能力还是很强的。
被裁的当天,大家还是有点郁闷的。但是第二天大家都好了,被裁掉的同事建了个群,用来分享下生活小事和面试招聘信息。
连 3 个月之前被裁掉的副总也拉进来了。
也不得不说,美国人这心态也是绝了,此处不留爷,自有留爷处。同时说,就让这奇葩的架构师和奇葩的副总自己玩吧。
一同事是前端转 Java学 Java 是学得挺费劲的。这回他说终于又可以回到他最爱的前端了。3 个月学 Java ,学了个寂寞。
如你也被裁员了,想分享分享,欢迎加入我们。
![2023-06-03_07-21-47|361x500](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/3/3ddefa6185f9ffcbec99502794a2232d254ddbf5_2_361x500.png)
可扫描加群,讨论下内推,刷题和面经,以及避下雷。

View File

@ -0,0 +1,150 @@
# 北美 2023 被裁员的感悟
> 🔔 参与讨论https://www.isharkfly.com/t/topic/14461
不贩卖焦虑,就事论事,希望能帮助到有需要的朋友。
很多人觉得在裁员之前是没有任何迹象的,其实真的不是这样。
公司在裁员的过程中有很多要裁员的迹象,我会在另外一篇文章中对我遇到的一些裁员信号设置一些雷区和警告,当你遇到上面的这些信号的时候,直觉告诉你需要
**马上**考虑寻找下一个替代方案了。
因为当这些信号的任何一个或者多个同时出现的时候就意味着裁员在进行中了,通常会在 3 到 6 个月左右发生。
![WeChat Image_20230602102637|666x500](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/4/4ad39cac698544e454eb808075141f126361fb2f_2_666x500.jpeg)
## 在公司的职位
在被裁公司的职位是 Tech Lead。
虽然这个职位并不意味着你对其他同事而言能够获得更多的有效信息,但是通常可能会让自己与上级有更好的沟通管道。
但是,非常不幸的是这家公司的沟通渠道非常有问题。
因为负责相关开发部分的副总是从 PHP 转 Java 的,对 Java 的很多情况都不非常明确,所以他非常依赖一个架构师。
但,公司大部分人都认为这个架构师的要求是错误的,并且是非常愚蠢的。
比如说要求代码必须要放在一行上面,导致代码上面有不少行甚至超过了 1000 个字符。
所有开发都对这个要求非常不理解,并且多次提出这种要求是无理并且愚蠢的,我们组是对这个要求反应最激烈,并且抵触最大的(也有可能是因为我的原因,我不希望在明显错误的地方让步;我可以让步,但是需要给一个能说服的理由)。
然而,这个所谓的架构师就利用 PR 合并的权力,不停的让我们的组员进行修改。
## 裁员之前
正是因为在公司的职位和上面说到的和架构师直接的冲突。
在 6 个月之前,我就已经和组里的同事说要准备进行下一步了,你们该面试的就面试了,不要拖延。
在这个中间过程中,我的领导还找我谈过一次。领导的意思就是他非常同意我们的有关代码 PR 的要求,也觉得这些要求都是狗屁。
但,负责开发的副总,认为我们组现在是所有组里面最差的。
可能当时没有认真理解这句话的意思,我们组从所有组里面最好的,变成最差的只用了 2 周(一个 Sprint的时间。
在这次谈话后,我更加坚信让我的组员找下一家的信息了,对他们中途要面试其他公司我都放开一面。
非常不幸的,我自己那该死的拖延症,我是把我自己的简历准备好了,但是还没有来得及投就等来了真正裁员的这一天。
深刻的教训和学到的经验:
如果公司的运营或者管理让感觉到不舒服,并且已经有开始寻找下家的想法的时候,**一定要尽快准备,马上实施,不要拖延**。
这就是我在上面标黑**马上**的原因。
## 裁员过程
裁员过程非常简单和迅速,并且在毫不知情的情况下进行。
在周四的时候,公司的高层提示所有的会议今天全部取消,并且把应该 11 点开的全公司会议提前到了 9 点。
因为很多人都没有准备,所以很多人也没有参加。
后来才知道9 点就是宣布裁员的开始,事后知道裁员比率为 40%。
然后就是各个部门找自己的被裁的员工开会,这个会议通常首先是一个 Zoom 的 Group 会议,说了一堆屁话,就是什么这是不得已的决定呀,什么乱七八糟的东西。
当然,在这个时候你还需要或者期待公司给你什么合理的理由呢?
然后就是 P&C 人员说话,基本上就是每个人 15 分钟的时间单独 Zoom。
这个 15 分钟,主要就是读下文件了,至于 2 个会议上是不是开摄像头,随意。
你愿意开也行,不愿意开也行,反正上面的所有人都心不在焉。我是懒得开,因为和你谈话的人,你都根本不认识。
第二个会议就是 P&C这个会议主要就是和你说说被裁员后可以有的一些福利和什么的对我个人来说我更关注的是补偿。
至于 401K 和里面的资金都是可以自行转的,也没啥需要他们说的,了解到补偿就是 6 周工资,不算多也凑合能接受。
负责裁员的人说,还有什么需要问的,我简单的回答了下 All Set 然后 have a nice day 就好了。毕竟他们只是具体做事的人,问他们也问不出个所以然,这有啥的。
## 裁员之后
裁员之后,感觉所有认识的被裁的同事都是懵的。
开完 15 分钟的 P&C 会议后,基本上电脑和邮箱马上就不能用了。公司貌似说电脑可以自己留着,但是上面的数据会被远程清理掉。
留在公司里面的东西会有人收拾后寄到家里。
我在公司里的办公桌就属于离职型办公桌,简单的来说,上面只有一台不属于我的显示器,另外就是从其他地方拿过来的一盒消毒湿巾,公司里面压根没有我需要的东西。
很多人认为公司禁用账户有点太不讲人情,其实从技术层面来说根本没有什么,因为所有的管理都是 LDAP直接在 LDAP 上禁用你账户就好了,没啥稀奇的。
中午的时候,被裁的同事都互相留下了手机号码,感觉大家因为我在裁员列表里面感觉有点扯。另外更扯的同事在这个公司工作了 7
年了,也在列表里面(所有 PHP 的基础架构都是他写的和建立的)。
虽然最开始和这个同事有过一些摩擦,但是这个印度的同事真的挺好的,我们都觉得他挺不错,也愿意和他一起共事。
很多人,包括我。都对这个同事感觉不值,也觉得这很扯。
奈何公司的选择就是一些阿谀奉承,天天扯淡的人,比如说那个奇葩的架构师。
没多久,被裁的同事建了一个群,然后把我给拉进去了,主要还是我们组里面的同事,大家希望能够分享一些面试经验和机会,偶尔吐槽下。
在晚上的时候,突然收到另外一个同事的 LinkedIn 好友邀请,他不在这次裁员内。
但是他也被降职了,他本来是 Sr 开发人员和小组长,后来被提拔成架构师了,现在连小组长都不是了。
他和我说,如果需要帮助的话,他会尽量帮忙,并且还给他的一些曾经的招聘专员账号推送给了我。
我也非常感谢他们,虽然经历过,但是也收获了一些朋友,虽然说在美国职场比较难收获朋友,但是也并不是完全这样的。
没有了利益的纠葛,更容易说点实话。
# 北美 2023 被裁员的感悟(一周以后)
> 🔔 参与讨论https://www.isharkfly.com/t/topic/14495
https://www.isharkfly.com/t/topic/14461 发布一周以后,没想到在网络有了好几千的围观还收获了不少的评论。
更多的是情绪的另外一种转变。
![IMG_2763|666x500](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/3/3204bb2c3e741864fd78ff78c753b04c12987e26_2_666x500.jpeg)
可以开始在外面烤点,顺便思考下一步的发展和路径。
有时候,环境的变化更会刺激去思考。
## 情绪
裁员或者被裁这种事情,本身就每天都在发生的事情,其实并没有什么太多要说的。
可能最近因为经济的下行,讨论这个问题的内容越来越多。同时,类似前公司的这种裁员方式有点出乎意料,主要对情绪上的影响还是从一个已知的环境抛向到未知的环境,并且要强迫自己离开舒适空间的一种不适应。
很多朋友把再找到工作叫做上岸,有时候也需要思考下这个上岸是往回游找到类似的工作叫做上岸,还是像有些人往更远的地方游去找到其他的地方上岸呢?
## 收获
这次小的经历其实也是收获满满的。
从事情的发展上认识到了还有很多的不足,需要改进的地方。同时,也收获了不少同事和朋友。
昨天在 LinkedIn 上突然收到了前组员的好友邀请和消息,他没有在这次裁员的名单中,他的职位是中级软件开发工程师。
他和我说:非常感谢这 1 年来对他和整个团队的照顾,并且我们团队一直在改进和努力中。实在没有想到会以这样的一种方式结束。并且感谢我这一年来对他的帮助,让他能够学到了更多的东西。如果需要 reference 的话,他非常愿意帮我写个 reference。
收拾好情绪和心情,再出发。
正如,同组同事说的,更光明的未来在前面等着。
祝福每一位朋友,不管是认识的还是未知的。

View File

@ -0,0 +1,43 @@
# 2023 重新开始
> 🔔 参与讨论https://www.isharkfly.com/t/topic/14456
感觉搞 IT 的日子最近都有点不太好过。
早上接到公司电话说今天是一个大日子。
![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/8/8a06ade0bace4c0e74c0a60ba8843867e28fcaf5_2_690x362.jpeg)
为什么是大日子,相信所有人都是懂的。这次公司将会经历一次非常大的裁员,很不幸也在列表中。不过感觉这个好像也没有什么关系。
因为早就在意料之中的事情,经历过去年 CTO 的主动自行离职,今年初的开发部技术总监被迫离职,这一切貌似都不会太远。
## 裁员比例
根据公开的文档和准备裁员的职位列表,公司的裁员比例高达 40%。
换句话说就是把技术岗位的 40% 都裁掉了。
## 感触
说心里话,真没有什么什么感触。
因为觉得这天早晚都会来到而已了,只是有点没有期待会以这种方式结束罢了。
公司有公司的选择,主要的裁员原因是公司是一个初创型的公司,在今年第二季度的时候公司的增长没有达到投资方的预期。
那么投资方肯定能会要求公司削减开支,这个削减的过程自然是很多人都会受到影响。
公司会采取某种方式的运营来进行。
早上的时候收到这个消息还是有那么一点点吃惊的。
没有任何征兆,没有任何沟通,裁员的模式就是整个产品线都不要了,如果你现在做的东西不是非常重要和紧急的话,整个产品线就全部裁掉。
## 写在后面
早就准备好这一天了,只是早晚而已。
写写文章也不错,难得有那么几天清静的可以在这里补充不同的内容和面试找工作的经历。
祝福身边人,开心就好。

View File

@ -0,0 +1,128 @@
# 公司大规模裁员的时间轴
> 🔔 参与讨论https://www.isharkfly.com/t/topic/14472
正如我们常说的公司在大规模裁员之前是有很多征兆的,不是就拍怕脑袋决定的。
这次公司的裁员真的属于教科书级别的裁员,因此觉得记录下公司整个过程的时间轴是有意义的,希望能够给所有朋友有个参考。
![2023-06-05_01-25-47|690x209](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/1/125c812be9367033af391cfdad4f063d4c94ad84_2_690x209.png)
**也很想知道的是,如果是你,你会选择在几月份开始积极找工作呢?**
欢迎在下面回复喔!
## 2022年1月
被猎头以高软件开发工程师的职位挖到这个公司的。
不到一个月被提拔为 Team Leader负责组建自己的新团队。最开始的计划是团队有 8 到 10 个人左右,虽然不大,但是也算可以干点事了。
## 2022年2月
团队组建完成时只有 5 个人外加一个不属于任何团队的软件架构师。
同时这 5 人中间还有一个人是东欧开发团队的,我们负责培训这个东欧开发团队的成员成为团队的 Leader负责在东欧团队中创建另外的开发团队。
同时,我们被告知将会负责公司最重要的项目,因为这个项目已经被拖延了 3 月,无法继续进行。
随后的几个月项目开发都比较顺利,完全是按照开发计划进行。
向领导提出要为团队加人,领导也非常支持,并且面试都按照计划在进行中。
在这个过程中,只选择了一个中级程序员加入我的团队,其他人员面试的较多,但是很多时候并不符合录取条件,或者好的程序员要求过高,不愿意过来。
在 8 月份的时候,公司给我们提供了一个高级程序员,这个程序员水平还是不错,比较能适合开发,同时项目推进非常顺利。
## 2022年9月
上级通知我们,招聘在减缓,公司暂时冻结招聘。
如果我们还需要人的话,只能从其他团队进行调整,在这个时候其他团队也缺人,所以没有给我。
另外负责培养东欧的团队 Leader 计划已经完成,东欧团队成员从我们团队离开。
我们团队在这个时候还是出于十分缺人,任务比较重的情况。
## 2022年10月
项目正式上线,并且上线也非常顺利没有什么太多困难。
在项目上线完成后,公司还开了庆功会对我们团队进行了奖励。
虽然不是我们团队一个团队的事情,但是整个计划还是非常顺利的。
在项目上线完成后,我们和另外 3 个团队合并在一起来进行另外一个快速重要的功能开发。这个功能的开发要求在 3 个月内完成。
2 个 Sprint 以后,这个项目被在毫无预兆的情况下撤销,理由是法务问题。
## 2022年11月
创始人加 CTO 和 创始人加 CFO2 个人在毫无预兆的情况下离职,公司一共 5 个创始人。
整个公司技术层面一脸懵,不知道理由是什么。
最后,在公司 All Hands 会议上给出的理由是CTO 要选择继续进修,所以选择离职。
我们团队因为项目撤销,所以负责一些技术债务的清理和合并工作。
## 2023年2月
新 CTO 就职。
在项目上面我们继续进行技术债务的清理工作,在这个期间,我们团队中的唯一高级程序员被另用而离开我们团队。
在这个阶段,公司管理层给我们团队的评级为全美团队里面表现最优秀的团队。
就在本月,奇葩的架构师在完成一些基础类的设置后,开始全面在公司强推奇葩的代码规范,受到的阻力可想而知。
我会在另外一篇技术类的文章中列举一些奇葩的要求。
就在本月,我已经通知团队成员注意公司变化可以开始其他求职计划。
## 2022年3月
这里需要说明下 2 个人物。
2 个人都是 VP副总一个为加拿大人一个为印度人。
负责开发的副总被在毫不知情和预先通知的情况下被解职并辞退(印度副总)。
个人认为这个印度的同事的专业素养还是不错的,要比和他同级别的另外副总(加拿大副总)水平要高。
加拿大副总,在印度负责被解职后,全面负责公司所有的开发,运营,方面的工作,除了测试。
需要注意下的是,奇葩架构师是加拿大副总招聘进来的,用来在公司对 Maven 项目进行重构。
举例一个奇葩的要求:所有 IntelliJ 有警告必须被修改。
如果有任何的 IntelliJ 有警告, PR 合并全部被拒绝,不管有些警告是不是有点奇葩,不知道有用 Eclipse 的公司是不是所有人都得跳楼。
如果你是程序员,从 Apache 克隆一些代码,你会看到上面有成千上万条警告,我们在公司上面提出过这个问题。得到的回复是:因为 Apache
Commons 的包的警告被很多人证明这不是问题,所以不需要去处理。
## 2023年4月
因为和架构师的冲突和很多的不理解的奇葩代码规范,我们团队从领导那里得到是所有团队最差的团队的信息。
并且技术债务的修改,因为 PR 合并的阻挠,进展缓慢。
## 2023年6月
公司宣布大规模裁员。
所有东欧和印度团队全部解散,北美技术团队裁员 40%。
如果全部按照人数的比率来看的话,裁员比例高达 70%。
## 总结
从上面的时间轴我们来看,是不是每一步都是一个需要离职的信号?
可惜我的拖延症把这些信号都给忽略掉了,事实上早在今年年初和架构师有冲突的时候就应该开始下定决心换工作了。
无奈自己的拖延症有点耽误了。
当公司出现有一些并不确定的信号的时候,从公司层面来看看,应该是经营和管理出现了困难,作为职员来说,需要提前做好准备。
如果你是我,那么你会选择在什么时候下定决心开始找工作呢?

View File

@ -12,12 +12,5 @@
按照发布时间的倒序进行排列,最后发表的在最上面。
如想参与支持相关的讨论和分享你的一些经验,请访问 https://www.ossez.com/c/37-category/jobs/19 页面中的内容,我们热忱的期待您的参与和分享。
## 相关文章列表
* [公司大规模裁员的时间轴](https://www.ossez.com/t/topic/14472)
* [来聊聊才离职就被拉黑禁用的这些事](https://www.ossez.com/t/topic/14469)
* [公司裁员日常的骚操作和警告](https://www.ossez.com/t/topic/14465)
* [上一年工作中猫腻的总结](https://www.ossez.com/t/topic/14464)
* [北美 2023 被裁员的感悟](https://www.ossez.com/t/topic/14461)
* [2023 重新开始](https://www.ossez.com/t/topic/14456)
如想参与支持相关的讨论和分享你的一些经验,请访问 https://www.isharkfly.com/c/code-for-life/programmer/19
页面中的内容,我们热忱的期待您的参与和分享。

View File

@ -0,0 +1,10 @@
- 2023
- [公司大规模裁员的时间轴](/work/workplace/2023/timeline-for-layoff.md)
- [公司裁员日常的骚操作和警告](/work/workplace/2023/daily-operation-layoff.md)
- [上一年工作中猫腻的总结](/work/workplace/2023/last-year-workplace-issues.md)
- [北美 2023 被裁员的感悟](/work/workplace/2023/north-america-2023-layoff.md)
- [2023 重新开始](/work/workplace/2023/restart-2023.md)
- 2021
- [中年是危机还是重生](/work/workplace/2021/middle-ages-for-it.md)
- [从拒绝到拒绝](/work/workplace/2021/refuse-to-refuse.md)
- [从一个工作到一个工作](/work/workplace/2021/another-job-opportunity.md)