记因 API 第一次挨同事骂

10 天前
 unbinilium

背景:leader 最近接手了个嵌入式上的管理后台项目,架构比较古早 Static Web <-> Nginx <-> CGI (C, via Unix Socket) <-> Backend Application (C) <-> Modules 。同事抢了前端部分的工作,我分到了和储存系统相关的后端模块。评审完原型后就开工了,我写好自己模块前端部分 API 的草案后,请前端的同事先帮我 review 一下,结果被怒批了一顿。

从对方比较尖锐的评价里我大概总结出以下几点:

对方观点:

  1. 我不会做项目,完成任务优先级第一
  2. 我不是产品经理,不要替产品经理操心
  3. 我是学生思维,抓不到项目重点,写出来的东西不专业他看不懂(用不惯企微文档,加上有些术语想不到中文的名字, 草案就先用 md 写了英文的)
  4. 我协作不到位,我写这部分前端接口没提前通知他(事实上一起开会时我不仅说了,还把规划写在白板上了)

对方理由:

  1. 他也写了这部分 API ,比我的简单很多;我的命名不符合他的规范(这点在 review 前就提醒了,我的出发点是先确定数据结构上有没有分歧,之后命名样式一定会按照他的要求改好)
  2. 他自称写过很多爬虫,也写过前端(他本职做 AI 算法的,211 硕)
  3. 不能反映到前端原型的字段上就别加,不要自作聪明以为其他人没想到
  4. 一年前上司曾批评过我过度设计,效率低

事后也虚心看了下他写的 API ,这里仅以我的视角总结一下他的思路(因保密协议就不贴代码了):

  1. 前端页面下一个子组件对应到一个 endpoint ,不再分级,组件全部信息放在一个相同的 JSON schema 里就好
  2. 根据请求类型,后端自动去 request payload 里找需要的字段用或选择性更新 response body 里的部分字段
  3. 对于一个组件内部依赖其它组件信息或状态的情况,后端应该在这个组件的 API endpoint 里也提供
  4. 不假定某个地方需要扩展,不加冗余信息,产品有需求再改,总有办法能在现有接口上承载起新需求(顶多可能会让接口变得奇怪)

下面说一下这部分我的观点(个人职场新人,非 CS 专业,目前也就做做 embedded infra ,这方面可能不专业):

  1. 前端原型里部分组件 anti-pattern 的迹象很明显,一个模块里揉合状态信息、配置信息和控制指令,我倾向做 decomposition 拆到该 endpoint 的子路径里做(我很难接受前端把这种模式通过 API 扩散给后端)
  2. 跨组件的状态信息,前端这边去调用对应的其它 API 处理,我的组件接口只维护生命周期在我模块内的信息
  3. 在后端仅读 payload 的数据结构上做扩展冗余,及 response 里加一些未来可能用上的信息,不会对前端解析处理增加太多负担(私有 C/S 场景也不必拮据带宽成本)
  4. 我的模块 leader 限制 C/C++/Rust 实现,一致性和 forward compatibility 比提前出第一阶段 demo 重要,未来有新需求需要调整数据结构或者实现时,改起来熵太高(后端规模远大于前端 / 前端 JS 解 JSON )

其它的一些想法:

  1. 在设计和评审产品原型时,从时间和交互维度审视十分重要(这次其实原型就有问题)
  2. 产品经理几乎完全决定了一个产品的命运,很多时候向前端开发推进,需要先让产品经理认识到这个设计有问题(直接告诉前端要多点工作量可能挨骂)
  3. 理想主义在职场很难行得通,某种程度上我发展得的比我同事差(比较看 leader 和项目的 context 就是了,这点确实我做得不好)
  4. 即使我的主张合理,说服了大家做对的事情往往得不到任何好处,分外的事情,让市场和用户差评教产品做事就够了(自由市场也可能首先打我的脸)
  5. 和人交好很难,这件事看出同事应该是对我有不少意见,但是自己实在想不到哪里得罪了人家(感觉很多时候我已经比较注意了,比如有些会影响到大局的细节问题在评审时我想提一下,但觉得在那么多人的会上说可能不合适,毕竟我不是产品也不是设计,leader 也没开口,也是后面单独找产品旁敲侧击让他意识到有问题)

也想听听大家的建议(比如技术方面或为人处事方面)

嗯,再补充一些细节吧:

  1. 产品经理能 vibe coding 把原型网页做出来(虽然很粗糙),我模块的原型有问题要改结果一个星期还没改好,于是定接口时同事拿有问题的原型跟我对峙(产品想学习我理解,不过既然项目赶时间,老老实实上个 Figma 或者什么的不好吗)
    1. 原型里显示一个可能包含几十万个文件的文件夹没有分页,不加排序、过滤和搜索的情况下,期望用户能一下子找到自己想要的文件
    2. 原型过于简化,将操作/状态隐含在数据对象内,比如用户想临时关闭日程功能,做法是把之前辛辛苦苦写好的日程都删掉
  2. 同事写的 API 规范中,很多字段应该是谷歌翻译的(概念不合适且有不少拼写错误),以及他开始打算 HTTP 明文传输密码,后面其他人说不安全换成了传密码的 sha256 (不加 salt 和开始有什么区别...)

(应该还有不少,就不浪费社会资源吐槽了)

4359 次点击
所在节点    程序员
37 条回复
unbinilium
10 天前
@rabbbit 嗯,我确实复杂化了。

不过我上面还有一层意思是,冗余设计覆盖到了我能想到的产品那边的未来需求:比如之后储存组件需求变化,大概率后端不需要任何调整( e.g. 加个进度条,增删合并分区,安全弹出之类的),只是前端来调整对后端接口的使用就好。

不过反思了下我这种冗余设计确实不妥,相当于把 OS 的接口间接暴露给前端了,还是应该先等原型改完再定。
zacard
10 天前
对方是有点咄咄逼人了,接口定义他要有异议提出来就行,再有分歧大不了拉个会再评审下。不过如果是在国内你用英文写文档就有点装了,什么术语能想不到中文啊。然后什么语法拼写错误的,真没有必要抓这些
a33291
10 天前
我个人的习惯也是"轻前端",也就是只负责呈现,回收数据,所有必要的数据都由 api 准备好(api 职责单一,通过多个 api 组合使用完成业务)
这个事从结果来看,都能完成任务,从过程来说,就是个人偏好和团队偏好
就 OP 描述的事情来说,感觉不是纯技术输出,带点情绪
NotLongNil
10 天前
@unbinilium #12 看到你说 RESTful ,我就知道你领导说你过度设计是对的,这玩意过于理想化,在实际业务中强行使用,除了增加工作量,完全没有其他收益。内部系统,按照功能写接口才是最优的。我曾经跟领导有过这样的对话:“这个设计有问题,后面很难维护”,“这个功能都不知道会不会继续改,可能明年系统都下线了”。
NotLongNil
10 天前
你是不是还在实践 DDD ?
e3c78a97e0f8
9 天前
我最好奇的是,你们单位没有任何规范吗?比如我其实不喜欢 RESTFUL ,但是我们公司是明文规定要用 RESTFUL ,而且还有一堆细节设定,所以大家都得用。

如果没有明文规范,那以前的项目是哪种模式,照做就可以了。再不行,就问领导,让领导给意见。这种主观的东西,说到底看权力,没什么好争的。
unbinilium
9 天前
@zacard 啊,我的问题,忘说了… 英文版对方没看,当时 review 的是我这边重新在他企业微信文档里补充的中文版,命名样式没来得及改成他定的规范,提前也说是主要看结构,样式尽快改好(我工作日常 linux ,企微跑在 qemu 里面确实不太好用)

拼写语法这些都是小问题,我从没提过,这里提一嘴是因为讨论时对方先批评了我,以及后面我理解他的文档十分费解。

@a33291 嗯,是有一点。当时临时 review 双方应该也是没想好,对面找我问题,我应该是没把我这边的设计思路用语言很好地传达给对方,表达能力还是太重要了。
GuangXiN
9 天前
经典的 API 设计一般要么贴近页面内容,要么贴近数据模型。

贴近页面的 API 一个 endpoint 对应一个页面,其优势在于前端只需要一次请求即可拿到全部需要的字段,加载/错误状态处理非常简单,字段数据按设计图填充即可,汇总拼装数据的工作主要在后端完成。这种方式的缺点在于页面内容是随产品迭代经常修改的,这意味着每次需求变更都需要变更接口数据结构以适配页面变化。如果要无缝升级,要么给 endpoint 加版本号,要么确保只新增字段不修改、删除现有字段。

贴近数据模型的设计一般每个 endpoint 对应一个数据库里的一个表,汇总拼装数据的工作由前端完成。这种方式的优点在于数据模型相对页面更稳定,受需求变更影响更少,而且真有变更大都是加字段的行为,比较容易向下兼容;缺点是前端需要组织从多个 endpoint 加载数据,管理它们之间的依赖顺序,记录跟踪每个请求的状态、错误处理等,前端复杂度会增加不少。
badreamm
9 天前
我随便一扯,你这长篇大论我只看了一半,我估计你设计的 api 也是这样
iseki
9 天前
大家不是你的同事,没办法只通过描述判定你俩画的 API 好还是不好。
API 好不好要看情况,我大概能猜出你俩的分歧实质上在于前后端对问题的建模不统一时,中间的适配器谁来写的问题。当然,这是抛开那些关于“过度设计”、“太理想化”这样的屁话不谈的。这种问题如果没有一个专门的第三方来完成,那基本上只能是你俩 battle ,属于复杂的人和复杂的职场问题,与技术无关。一个潜在的解决方案是多和领导沟通,有时候把他搬出来当仲裁官是有用的,但是这个就全看你对上班这件事的能力了……
unbinilium
9 天前
@GuangXiN 嗯,我实际情况感觉是更适合混合模式做,初期决定先试试贴近页面的方案
iseki
9 天前
我在这种事上就比较缺乏耐心,处置手段很低级:
前端:你给我把前端文案拼好了我多省事呢?
我:我 NM 把你活干了多好呢?你工资给我吗,让我给你擦屁股?
isnullstring
9 天前
针对“理由”
1 、前端写什么 API ?不都是后端先出 API 或者先定义名字给前端,不影响各自开发进度
2 、过(能力背书)
3 、他说的对,UI 上不显示、前后端交互也用不上的字段,肯定不加
4 、刚出来工作确实容易犯这个,有时候任务完成更重要,扩展性(也不是完全不考虑,需要自我平衡)、效率 后面再说。
unbinilium
9 天前
@iseki 很准确的定位,谁写中间件是核心矛盾,也确实没有第三方来做。

另外一方面是我希望通过产品精细化原型定义来消除部分和前端之间的建模误差,这一步虽得到认可,但是进度缓慢,开发受到阻碍。

所以着急的话大概率还是得麻烦领导决策。

技术方面的话主要是觉得我在这方面缺乏体系,寻建议不是为了定夺谁好谁坏,想看看其他人在这方面有没有书籍或项目推荐。
wupher
9 天前
大家都是来上班的,工作中上有纠纷应该协商解决。

他凭什么骂你
KinBob
9 天前
楼主是不是在香港读的大学?中英文混杂表达感觉很像方言
iseki
9 天前
@unbinilium 前后端建模不统一是必然的,这是前后端分离的产物,或者说,前后端分离的一个目的就是可以分开建模,尝试强行统一不切实际。原则上来说应该引入某些人口中的 BFF 层,但现实上大多数小厂应该是不称这个的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1166753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX