阅读视图

发现新文章,点击刷新页面。
🔲 ☆

别傻了,写出极致整洁的代码,是你升不了职的根本原因

本文永久链接 – https://tonybai.com/2026/03/15/over-engineering-trap-no-promotion-for-simplicity

大家好,我是 Tony Bai。

今天讲点得罪人的大实话。如果你是一个有代码洁癖、崇尚极简主义、总是能用最干净的逻辑解决复杂问题的“老实人”程序员,那么接下来的内容,可能会戳痛你。

因为在我们当下的技术职场里,有一个残酷的潜规则:“几乎没人会因为把代码写得太简单,而获得晋升。”

“简单是一种伟大的美德,但复杂性往往卖得更好。” —— 艾兹格·迪杰斯特拉

为什么“PPT架构师”总能赢你?

想象一个极其真实的职场年度晋升场景。

你是工程师 A。你接到了一个核心需求,经过缜密思考,你砍掉了伪需求,用 50 行极其优雅、无状态、无需外部依赖的代码解决了问题。两天上线,零 Bug,下一个接手的人一眼就能看懂。然后你默默回去修下一个 Bug。

你的同事 B 接到了类似的需求。他敏锐地嗅到了“搞一波大动作”的机会。他引入了最新的消息队列,搞了一套基于 Pub/Sub 的微服务解耦机制,外加一个极度灵活的动态配置中心。他拉着各部门开了 5 次架构对齐会,花了 3 个星期,提交了 50 个 PR。

到了年底晋升答辩,命运的齿轮开始转动。

B 在 PPT 上展示了他那张密密麻麻、满是高大上名词的“企业级事件驱动架构图”,评委频频点头,惊呼“具备极强的技术深度和前瞻性布局”,B 顺利拿到了高层级的晋升(Staff/Principal)。

而你呢?你不仅什么都没拿到,甚至连材料都写不出几行字。因为你把问题解决得太简单了,导致你的贡献变成了“隐形的”

这当然不是老板故意使坏,而是我们的评价体系出现了极其严重的“逆向淘汰”Bug。

你很难为你“没有构建的灾难”去编织一个宏大的叙事。这套错位的激励机制,甚至从你面试的那一天就开始了。回想一下系统设计面试,如果你给出一个单体数据库+直白API的务实方案,面试官会皱眉;但如果你在白板上疯狂画微服务、分库分表、分布式锁,面试官才会满意地点头。

你学到了什么?你学到的是:复杂性才能显得你聪明,哪怕它是毫无必要的。

克制,才是最高级的炫技

难道老实人就活该吃亏吗?面对职场里这种“未挣得的复杂性(Unearned complexity,那些不必要的、额外的复杂元素)”,我们到底该怎么办?

作为一名写了多年代码、也面试过N多人的老兵,我想带你看看Go 语言的生存哲学。

如果你把编程语言拟人化,Go 就是那个在技术圈里坚持写简单代码的“老实人”。

在众多技术论坛上,用 Rust 编写一个极其复杂的生命周期标注,或者玩弄高级宏,往往能赢得满堂喝彩,被视为“真正的技术极客”。而 Go 团队呢?他们拒绝加入复杂的特性,坚持去构造函数、去继承。结果常常被嘲笑“简陋”、“缺乏智力挑战”。

这就和你我在职场中的处境一模一样:人们很容易为解决极其复杂问题的精巧设计而惊叹,却极难去赞美为了“把复杂性挡在门外”而付出的巨大克制。

但结果呢?Go 凭借着这种极简,支撑起了整个云原生时代的半壁江山。Go 证明了一个硬道理:真正的工程实力,从来不是看你能堆砌多少种设计模式,而是看你能否用最直白的结构,解决最复杂的业务。

任何一个新手都能把系统搞复杂;只有具备了足够的经验和自信,你才懂得何时应该留白。

破局路径:如何包装你的“简单”?

如果你认同“简单”的价值,但又不想在绩效和晋升上吃亏,你就必须学会一套“防御性职场包装术”

记住这个核心心法:你的代码可以很简单,但你必须让别人看到你达成简单的“思考过程”有多复杂。

工作成果本身是不会说话的,你需要把“决定不做什么(Value of NOT building)”转化为你的影响力。从今天起,改变你的表达方式。

你照着做就行:晋升/答辩对线话术模板

无论是在写周报、写晋升材料,还是在架构评审会上,直接套用以下模板:

场景一:写晋升材料 / 简历

吃亏的普通写法:

“独立负责了功能 X 的开发,编写了 50 行核心代码,按时上线,没有出 Bug。”
(评委:这活儿实习生也能干。)

高绩效的降维打击写法:

“主导了功能 X 的架构演进。深度评估了包括事件驱动架构、自定义中间件抽象等三种高并发方案,从 ROI(投入产出比)和系统熵增角度,排除了现阶段不必要的过度设计,为团队节省约 15 人日的研发与运维成本。最终敲定极简直白架构,两天内完成交付,并在过去 6 个月内保持零故障运行,确立了团队‘务实驱动’的工程标杆。”

场景二:架构评审会遭遇“过度设计”逼问

当有人在会议上质问你:“难道我们不应该加个抽象层,为了未来百万并发做防范(future-proof)吗?”

不要立刻妥协去加代码。

教科书级硬核回击:

“我做过推演:如果以后确实需要扩展,添加这个层级只需要大约 2 天的重构代价;但我同样评估了,如果现在就强行加上,会立刻增加 30% 的系统复杂度和长期的维护成本。基于目前的业务增速,这属于‘未挣得的复杂性’。权衡之下,我认为我们现在的架构决策应该是‘等待’。”

你不是在对抗,你是在向所有人展示:你看到了复杂性,并且你用专业的工程判断力,主动选择击碎了它。

写在最后

无论你是写日常业务代码,还是设计分布式系统,“简单”永远是最难达到的境界。

如果我们继续只奖励复杂性,无视简单性,就不要对屎山代码越来越臃肿感到惊讶。希望这篇文章,能帮到那些依然在坚持写出整洁、克制代码的无名英雄们。

今日互动:

你在公司里,是那个苦逼的“工程师A”吗?你见过最离谱的“PPT过度架构”是什么样的?

欢迎在评论区吐个槽。


突破瓶颈,构建属于你的“极简工程审美”

很多读者问我,如果不去学那些花里胡哨的设计模式,怎么提升核心竞争力?我的答案是:深入理解一门把“简单”做到极致的语言,去品味它背后的架构决策。

如果你的 Go 技能卡在了“熟练”到“精通”的瓶颈期,渴望提升软件设计能力,驾驭复杂项目却缺乏章法——

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力。目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变!


认知升级:跳出内卷,成为“定义规则”的人

有很多读者看完可能会问:Tony老师,如果我不去卷那些花里胡哨的复杂架构,在这个技术内卷的时代,我该如何建立自己不可替代的核心竞争力?

我的答案是:转换赛道,从“拧螺丝的人”升级为“造工厂的人”。

尤其是在大模型爆发的今天,如果你还在试图靠“手敲成千上万行复杂的代码”来证明自己的不可替代性,你不仅会输给那些擅长写PPT的同事,更会被不知疲倦的 AI 无情淘汰。因为机器,比你更擅长制造复杂的代码。

真正的聪明人,早就停止了这场无效的内卷。他们把“简单”的工程哲学发挥到了极致:他们只专注于最高价值的“定义目标与架构决策”,然后把所有繁琐的、底层的“拧螺丝”工作,统统外包给 AI Agent。

厌倦了为了晋升而制造复杂性?想要彻底跳出旧的评价体系,实现开发效率的降维打击?

我的新专栏《AI原生开发工作流实战》正是为你准备的破局利器。在这个专栏里,我不教你虚无缥缈的理论,只教你如何把 AI Agent(如 Claude Code)变成你手下最不知疲倦的“高级外包”。

  • 告别低效内耗,重塑开发范式:用 AI 抹平代码复杂度的壁垒,让你专注于业务与架构本质。
  • 驾驭 AI Agent 工作流:手把手教你实现从需求分析、代码生成到测试的自动化流水线。
  • 实现职场跃升:带你从苦哈哈的“AI 工具使用者”,进化为规范驱动开发的“工作流指挥家(软件工厂厂长)”。

不要再用战术上的勤奋(写复杂的代码),去掩盖战略上的懒惰(拒绝使用新杠杆)。

扫描下方二维码,开启你的 AI 原生开发之旅,把复杂留给机器,把晋升留给自己。


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

🔲 ⭐

eks使用efs dynamic provisioning 创建非root容器提示 Operation not permitted


作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220125450139/
相关话题:https://www.cnsre.cn/tags/eks/


前言

之前在 aws 中创建了 eks,在数据存储这一块中,我选择了使用 AWS 的 EFS 具体部署配置参考Amazon EKS 中 EFS 持久性存储。文章中的动态供给是 AWS 官方给的示例,使用的是root用户启动的容器。在我后面的测试中发现,我在使用非root用户启动容器的时候,发现使用静态供给是有权限并且没有报错的。但是在使用静载供给的时候出现了 Operation not permitted 的报错。

问题描述

我根据efs dynamic_provisioning 创建了 dynamic provisioning
root用户的容器运行没有问题,但是非root用户容器运行时提示 “Operation not permitted”

pod配置清单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

StorageClass配置清单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: fs-xxxxx
  directoryPerms: "700"
  gidRangeStart: "1000" # optional
  gidRangeEnd: "2000" # optional
  basePath: "/dynamic_provisioning" # optional

分析和检查

该报错是由于采用了dynamic provisioning PV部署方式,这种模式的实现需要利用 efs-ap:access point访问点 模式做 EFS 挂载。从 EFS 的角度来讲,EFSaccess point 模式挂载的 EFS 卷,客户端不可修改 uid/gid ,只拥有使用权(读写)详情点击查看。从自己的pod环境也可以看到,客户端挂载目录/dynamic_provisioning 的uid跟gid都是一个随机数字。 ls -l /dynamic_provisioning可以看到是 `1018 (不同环境uid会不同)。

EFS-AP模式指的是access point访问点模式。关于访问点的介绍:
EFS Access Points:
An access point applies an operating system user, group, and file system path to any file system request made using the access point. The access point’s operating system user and group override any identity information provided by the NFS client.
简单来讲,EFS-AP也就是access point访问点挂载模式下,efs客户端的路径user/gid是不可被修改的。的客户端用户只有使用权(读写),但是不可以修改owner。因此遇到的报错是该配置的预期表现。

EFS-AP模式的配置是在storageclass中定义的:provisioningMode: efs-ap,比如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kind: StorageClass
apiVersion: storage.k8s.io/v1 
metadata:
  name: efs-sc-dynamic
provisioner: efs.csi.aws.com 
parameters:
  provisioningMode: efs-ap    <<<<<<<<<<<<<<------------------------------EFS访问点挂载模式
  fileSystemId: fs-xxxxxx
  directoryPerms: "700"
  gidRangeStart: "1000" # optional
  gidRangeEnd: "2000" # optional
  basePath: "/dynamic_provisioning" # optional

目前AWS EFS的 dynamic provisioning 模式的实现就是使用 storageclassefs-sc-dynamic 模式。
这种模式的弊端已经在 github 中有issue在跟踪,详情点击查看,但是由于该模式也有一定的设计意义 详情点击查看,所以目前还没有明确的结论。

临时解决方法

使用静态模式创建

可以创建EKS pv/pvc时使用static模式部署PV,不会使用access point模式挂载EFS卷,那么可以顺利修改uid/gid。
详情参考Amazon EKS 中 EFS 持久性存储

在pod中指定 uid 和 gid

在创建pod之前,先创建 pvc在创建完pvc后查看uid 和gid

1
2
3
4
5
[root@ip-10-0-100-206 ~]# ls -l /efs/dynamic_provisioning/
total 12
drwxr-xr-x 5 1015 1015 6144 Jan 20 02:44 pvc-40b922c7-8d4d-47d9-8783-60d25abe123
drwxr-xr-x 5 1017 1017 6144 Jan 20 04:22 pvc-4ee000a8-7ab2-4ffc-8fd3-72ef31b7123
drwx------ 5 1014 1014 6144 Jan 20 01:08 pvc-f6622cb3-7c24-4172-a427-d4b9a996122

将输出内容的pvc的uid gid 记下并在pod的yaml清单中指定uid已经gid让pod拥有该目录的权限。
pod配置清单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      securityContext:
        fsGroup: 1014
        runAsUser: 1014
        runAsGroup: 1014
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

检查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
kubectl get pv|grep  mysql 
pvc-f6622cb3-7c24-4172-a427-d4b9a9962cd8   5Gi   RWX   Delete   Bound   default/mysql-pv-claim   efs-sc      5d23h

kubectl get  pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound    pvc-f6622cb3-7c24-4172-a427-d4b9a9962cd8   5Gi        RWX            efs-sc         5d23h

kubectl get  pod
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-mysql-6f6455f449-52zrp   1/1     Running   0          5d7h

作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220125450139/
相关话题:https://www.cnsre.cn/tags/eks/


❌