大厂hr发声:35+老员工比985,211更值钱
刚刷到一个贴子,说某大厂HR私下承认:35+员工其实比985/211的年轻人更值钱。原因是经验丰富,少走弯路,项目全局观更强。
作为程序员,我觉得这话挺真实的。写代码不是拼谁熬夜久,而是看谁能少踩坑。一个bug,如果新人改可能要三天,老员工凭经验半天就搞定,效率差距就是钱啊。网友有人说学历才是硬通货,但在职场里,学历只能帮你进门,能不能站稳脚跟看的是长期积累的“debug经验”。
当然,也不能说年轻人没价值。年轻人敢试敢拼,有时候能提出新思路。但关键岗位还是要靠老员工压阵,就像打游戏,菜鸟能冲锋,老玩家才是能带飞的。
年龄不是负担,真正的核心还是“能创造价值”。所以啊,别光看35+,更要看能不能在团队里持续发光发热。【备注:文末可领最新资料】
面试题:平均工资:部门与公司比较
=昨晚十一点多,我在公司楼下买酸奶,手机里我们组小李突然问:哥,部门平均工资跟公司平均怎么比,代码应该咋写?我想了想,别整花活,就把数据清清楚楚地“分两遍走”,一次算平均,一次拿来比较,够用了。
我们有一堆员工记录:(emp_id, dept, salary)。要做三件事: 1)算出每个部门的平均工资; 2)算出公司整体的平均工资; 3)把两个平均数一比较,看看哪个部门高于公司平均;再顺手标记每个员工是否高于自己部门平均。 注意点就两个:部门可能没人(或被过滤掉)别除以 0,工资可能是小数,保留精度别乱来。
朴素但稳的做法(两趟聚合)
第一趟把每个部门的总和与人数,还有全公司的总和与人数,先堆起来;第二趟拿到平均值后再去做比较和标记。时间复杂度 O(n),空间 O(k)(k 是部门数),挺划算。
from collections import defaultdict
from typing import List, Tuple, Dict, Any
Record = Tuple[int, str, float] # (emp_id, dept, salary)
defdept_vs_company(records: List[Record], ndigits: int = 2) -> Dict[str, Any]:
# 一趟聚合
dept_sum = defaultdict(float)
dept_cnt = defaultdict(int)
total_sum = 0.0
total_cnt = 0
for _, dept, sal in records:
# 容错:跳过非法工资或空部门
if dept isNoneor sal isNone:
continue
dept_sum[dept] += float(sal)
dept_cnt[dept] += 1
total_sum += float(sal)
total_cnt += 1
# 计算平均
dept_avg = {}
for d in dept_sum:
if dept_cnt[d] > 0:
dept_avg[d] = round(dept_sum[d] / dept_cnt[d], ndigits)
company_avg = round(total_sum / total_cnt, ndigits) if total_cnt > 0else0.0
# 部门相对公司:>、=、<
dept_vs = {}
for d, avg in dept_avg.items():
dept_vs[d] = "higher"if avg > company_avg else ("lower"if avg < company_avg else"equal")
# 标记员工是否高于本部门平均
employee_flags = []
for emp_id, dept, sal in records:
if dept in dept_avg and sal isnotNone:
employee_flags.append({
"emp_id": emp_id,
"dept": dept,
"salary": round(float(sal), ndigits),
"above_dept_avg": float(sal) > dept_avg[dept]
})
return {
"company_avg": company_avg,
"dept_avg": dept_avg,
"dept_vs_company": dept_vs,
"employees": employee_flags
}
# 小例子
if __name__ == "__main__":
data = [
(101, "R&D", 23_000),
(102, "R&D", 27_500),
(201, "Sales", 18_000),
(202, "Sales", 22_000),
(301, "HR", 15_500),
(302, "HR", 16_000),
]
res = dept_vs_company(data)
from pprint import pprint
pprint(res)
这段代码干的事儿很直接:先把“钱”和“人”分别记账,再统一结算平均数,最后对比谁高谁低;同时给员工打个“是否高于本部门平均”的标记,后续做绩效分析、奖金系数,这个布尔值就挺好用。
精度、异常和一点边角料
就是那个…两个坑别踩:
精度:工资用 float够用的话就round一下;要财务级精度就把float全换成Decimal。异常:空部门、 None工资直接跳过;部门没人时不要算平均,结果里就不要放它。
如果数据规模很大,你还能把第一趟聚合写成“流式”的(比如分批从数据库读),内存压力会更小。真要再极致一点,用 Welford 在线算法也行,不过这题没必要。
想更“数据分析味儿”的写法
有人问我:“用 pandas 行不?”行,几行就完事,但得先装个包。我就不贴了,怕你环境没装…算了还是给一版,万一你正好在 Jupyter 里:
import pandas as pd
defdept_vs_company_pd(df: pd.DataFrame, ndigits: int = 2):
# df: columns = ["emp_id", "dept", "salary"]
df = df.dropna(subset=["dept", "salary"]).copy()
dept_avg = df.groupby("dept")["salary"].mean().round(ndigits)
company_avg = round(df["salary"].mean(), ndigits)
dept_vs = (dept_avg > company_avg).map({True: "higher", False: "lower"})
dept_vs[dept_avg == company_avg] = "equal"
df["above_dept_avg"] = df.apply(lambda r: r["salary"] > dept_avg[r["dept"]], axis=1)
return {
"company_avg": company_avg,
"dept_avg": dept_avg.to_dict(),
"dept_vs_company": dept_vs.to_dict(),
"employees": df.assign(salary=df["salary"].round(ndigits)).to_dict("records")
}
好,就这样。哦对,等会儿我先把酸奶喝完…
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领