我的工作

Grifters, believers, grinders, and coasters

文章的描述来自于 Grifters, believers, grinders, and coasters 这篇文章,里面很好地阐述了公司里的不同人群以及相处的方法,推荐阅读。

Grifters, believers, grinders, and coasters

简单解释一下公司中的 4 种角色:

Grifter:骗子,擅长伪装形象获得公司领导层的重视,擅长充当项目负责人
Beliver:信仰者,重视公司的使命和客户的需求,擅长充当产品和品质保证
Coaster:杯垫,完成分内的工作,避免不必要的工作
Grinder:研磨机,埋头解决问题,可以迅速完成工作

以我的经历而言,在不同公司可能会承担不同的角色。

例如,在上一家 AI 创业公司里,我突然成为了核心角色,必须成为 Grinder 才能迅速地完成 MVP 和工作交付。 而在目前这家公司,我是边缘角色,在刚开始工作的时候我是 Grinder,只顾着埋头写代码,不重视工作成果和上级反馈。 但是在经历了几次否定过后,我学着成为了一个 Coaster,只完成分内的工作。 同时意识到了我的项目负责人是个 Grifter —— 他不会写代码、经常偷懒睡觉、职位是测试,但他依旧成为了领导重视的核心人物。

我是如何做好一个 Coaster 的呢?其实不难。

  1. 稍微关注一下工作成果反馈,在我们公司则是 pingcode 工作项。
  2. 将自己边缘化,每天完成一个小目标即可,我的情况下就是每天写 100 行代码,其实用不到 2 个钟。
  3. 不要尝试一次性完成大量工作,你的工作进度永远需要和项目负责人协调。
  4. 没有工作时,一定记得督促你的项目负责人。
  5. 注意在 scrum 会议上不要让别人知道你什么都没干,如果直接和领导开 scrum 会议,记得多讲讲自己怎么和其他成员协作,怎么解决问题。
  6. 永远记住,拿自己的尺子去度量别人是件愚蠢的事情,指望得到别人的认可更是一件天真的事情。

所幸我的项目负责人是 Grifter,对我也比较关心。 在我成为一个 Coaster 后,每天只需要写不到两个钟的代码,其余时间都可以干自己的事情。 例如之前写的 CMU 15-445 和博文,还可以拥有大量时间阅读 Follow,可以让我专注个人的提升。

成为一个 Coaster 就意味着你的目标不再是得到领导的认可,或者在公司承担核心架构工作之类的。 这些工作轮不到你,我有个资深级别同事干了一年每天也只是做业务。 以我的感受来说,能够得到一个较重要的业务模块开发工作,就是你在这家公司的目标了。 没有也没关系,平时注重个人提升,再跳槽下一家即可。

工作

关于目前在干的这家公司,我的职位是 C# 后端开发。 其实之前从来没接触过 C#,只有 C++ / Go 是我唯二掌握的静态语言。 入职动机也比较单纯吧,就是听说 C# 写起来挺舒服的想试试。

编程语言

说到「舒服」,我就很想吐槽 py 和 js 总有很多方言。

py 值得吐槽的是,类型标注一坨、from __future__ import annotations 需要运行时 eval、ForwardRef 混乱等问题,还有 asyncio 的任务取消在复杂场景下很难绷,经常需要写出这种方言:

1
2
3
4
5
6
7
try:
    await asyncio.wait_for(task, 5)
except (asyncio.TimeoutError, asyncio.CancelledError):
    # asyncio.CancelledError caused by parent cancelling
    task.cancel()
    with contextlib.suppress(asyncio.CancelledError):
        await task

3.11 还新增了一个 uncancel(),是真的难绷。

js 值得吐槽的首先就是 Object.keys / hasOwnProperty 这些方言,就不像个现代语言。 还有就是 Array.sort 省略参数的话,排序数字默认会把数字转字符串,按照 ASCII 排序,这点挺反直觉的,这个在 MDN 有记载。

上面讲的都是 js 语言上的问题,此外还有 ejs / mjs 导出兼容和依赖兼容,double import 的问题(这个我目前没遇到)。 还有就是 js 没有上下文的概念,只有全局变量,像 vue 提供的上下文都是在 compile 阶段完成的,比如 setup 之前会设置 currentInstance,所以要是在异步函数里面引用这些上下文函数会引发意料之外的问题。

相比之下,C# 的历史遗留问题还是挺少的。 好用的特性也蛮多的,比如 Linq、导航属性、拓展方法、delegate 等,异步设计也挺优秀的。 不过也有一些问题,比如数组协变导致性能差,多泛型 interface 和重载实现会出现混淆,这里就不细讲了。

感想

这边就不过多废话了,继续聊聊(吐槽)工作吧。

其实 12 月份和朋友聊了一下,我才大约知道了自己做的是个什么性质的工作。

简单来说就类似工厂 IT。 主要股东是一家卖家具的公司,我们公司主要就是做他们跨境电商的云平台支持。 具体业务模块就包括物流、供应商、采购、财务、报表等,对接亚马逊平台。

我对目前这家公司印象算不好不坏吧。 印象差的原因既不是加班,也不是被 PUA,而是每天工作太闲了…

在公司里有摆烂人,也经常出现状态不同频的情况。 摆烂人就是每天装忙,其实与我无关倒还好。 但是我的项目负责人是个摆烂人,这在刚开始的时候令我很痛苦。 某一次不知道需要推进什么工作的时候,被责骂的是我,反而不是项目负责人,挺逆天的。

每天大家都不知道是装忙还是真忙,经常能看到别人在看短视频。 下班点到了也不走,非要多待半个钟,不过没有加班倒还好。 不过我每天都是那个准点下班的勇士,已经习惯了。 日报也是重复废话一大堆,没有周报月报什么的倒还好,日报也没人看。

云平台的负责人呢,会议里一句话能概括的事情,他可以讲成一篇文章,主打废话文学。 还有虽然他没有在飞书明着说,但是经常能听到他在工位大声讲,问他也不知道怎么解决,他也不知道是哪个小组的 bug 不知道归谁管,问他的话他还要再同频到对应小组,他说效率低,纯纯的甩手掌柜。

我的工作就是一边学习一边干着 python 的 ui 自动化测试基建。 最开始我还会想他们招我过来不会就是为了写 python 吧,不过他们真的不重视这个项目,可有可无。 这个工作倒是挺简单的,就是 selenium 网页自动化 xpath / css selector 封装和 POM 架构开发。 不过 ui 测试本身就挺傻逼的 —— “测了一半,如测”。即使页面点击了,流程也通了,但是不知道结果对不对,断言还要拉取网络响应包,或者从页面上想办法断言。

我曾多次提出给 python 开发加上格式化器和代码检查器。负责人也只是嘴上说着接受意见,但是一直摆烂。 你摆烂就算了,还非要拉一些工作去支撑自己的工作内容,你连 python 基础都没打好。 结果就是,本来我一个人写的好好的模块,硬给我改成一片红,经常会有逻辑错误、传参错误,还有一堆 repeat code。 python 代码格式不规范就算了,缩进甚至还不一致,我看着你的代码,简直像是浑身上下有蚂蚁在爬。

这就是所谓的 重视架构 的企业。 我一直觉得架构是为良好的技术基础服务的,连个代码都写不明白的人,整天在空谈架构,就很魔幻。 整天讲 SOLID,讲 DRY,结果一看代码惨不忍睹。

看一眼就会毙命:

1
2
if items[0]["title"][0].css(".more-operation > button"):
    items[0]["title"][0].css(".more-operation > button").click()

我还经常在群里看到很多问题,比如他们后端很多微服务的参数无校验、foreach async 逆天写法等。 前端更是一坨,图片没剪裁压缩,一个 index.css 有 500 多 KB,一大堆直接引用没有 code splitting 的 js 资源,lighthouse 性能跑分 58,LCP 4s,而且还是内网服务器。

使用这个平台能遇到一万个 bug,严重阻碍自己开发

特别地,我使用 cloc 分析了一下后端代码库,其中 C# codegen 127w 行,C# 73w 行。 看似很多,但实际上很多是 infra,其中业务层代码大约有 28w 行。 看似也很多,但 DDD 设计中有很多接口设计,比如 ICommand / ICommandHandler / IRepository 之类的,还有微服务的 RPC 调用。 另外我甚至还看见一大堆重复 IService 定义,不清楚这具体有什么意义可能是我目光短浅了。

减去这些代码,其实估计也就 10w 行左右,我实在不认为这是多大的代码量,以至于可以产出这么多的 bug。

这一切也不怪他们,只能怪我自己太菜了,没能进入到更厉害的公司。

至于我闲到什么程度呢?就是 3 个月试用期过去了不管不问,也没什么进度和规划,我当时忍不了了便督促他们尽快给我渡过学习期。 但是换来的却是对我的冷嘲热讽,即便从 commit 历史记录上争不过,但还是非要挑点刺出来,比如说我每天准时到点就走人,说我和同事关系不好,说我遇到上司也不问好。 我只想说,你不会真以为你们代码库是什么金子吧 😅

在那之后我就觉得寻求别人的认可是个很天真的事情。 后来我就转变成了一个 “Coaster”,你们爱咋地咋地吧。

不过我也学到了很多,例如掌握了新的编程语言 C#,语法糖多,linq 写起来也很爽。 架构和软件设计原则更熟练了,以前都没有特别在意这些。 比如说我之前用过依赖注入,甚至实现过,但是掌握了依赖倒置原则后,我可以明白这么设计的优点具体在哪里。 其实大多数场景的架构模式都成熟了,没有必要从头设计。 平时写代码还是那样子写,没什么太大的变化。

还有就是学习到了 Domain-Driven Design (DDD) 这个比较新颖的设计模式,对这个的印象还是不错的。

开了一个 C# 大项目的坑,是很久之前就想写的一个动漫客户端,调研过很久,想要集成 wiki / bangumi / mal 之类的。

后记

总的来说呢,这份工作还算不错。 每天的工作量非常小,基本上 2 小时之内就可以搞定,公司资金也看似「稳定」。 虽然我并不是想摆烂,只是不想把时间浪费在各种库/工具/业务的学习上,目前我的主要目标是掌握数据库和分布式,但是轻松的工作还是令我感觉很舒适。 此外,绩效占比低,所以我都不在意绩效评优。 团队也没有内卷,挺友善的(除了大家聚一起吐槽公司之外 🤣)

至于跳槽,应该暂时没那么快,想先做点业务模块再说吧。 后端比较卷,跳槽还不一定能涨到多高的薪,这是一个需要经验的职位。 深入学学 react 和 v8 再跳槽到前端的话也挺不错。 主要还是想尝试一下进入大厂,最好还能是比较好的项目组。

我已经 23 岁了,技术其实也就干那么几年,就算进入大厂也赚不了多少钱,也就图个好奇和满足愿望。

海外不是经常会讲 Work Life Banlance (WLB) 嘛。 最近在 这篇文章 里看到了一个新的角度:「你并不需要 Work Life Balance,生活是一切,工作只是工作。」 我觉得也挺有道理的,工作只是赚钱的一个手段,而诗和远方只存在于日常生活之中。 不过在深圳的生活还是不错的,目前我的通勤 40 多分钟,8 点半起床,晚上 7 点半可以到家,也能租到便宜还不错的房子。

CC BY-NC-SA 4.0 License