前排提示
- 这篇文章我要吐槽一下我刚入行没多久时恶心了我8个月的前前领导.
- 如果看到这篇文章的朋友在工作上如果遇到这种领导, 在公司对你的能力提升不大的话, 该跑就跑, 及时止损, 不然都没人赔偿你的精神损失费.
- 关于我的这段工作经历, 大家看个乐子就好.
我想表达个什么
先简单说下事情经过, 我上一份工作的岗位是前端开发, 我进的公司属于是一个创业中的状态, 负责技术的, 除了我, 也就是那个让我上火了8个月的后端, 关键特么老板给他的定位是技术主管, 接下来我就把这个技术主管做的一些 事情一一列举出来.
项目简介
简单说一下这个项目, 这个项目简单来说就是一个餐饮行业的点餐软件上捆绑了类似于拼多多的分享福利, 以及三级分销的一个公众号项目.
迷惑行为开始列举
1. 跨域问题
首先他的第一个神操作就是, 身为一个后端, 一个技术主管, 居然特么不知道怎么解决前后端分离跨域问题.
我特么当时人就愣住了, 当时他给我的说的就是我前端的问题, 让我看了三天左右, 我此时已经无比确信就特么是他的问题, 他打死不承认, 说要看我的源码, 我说好嘛, 他看了我用的axios请求, 他一口咬定说这是什么奇葩请求方式, 他从没见过, 我当时立马无语了.
因为我断定是他后端框架没有配置跨越, 然后我就帮他百度了允许跨域的配置文档, 你猜怎么着? 他依旧死活不认, 认为是我的问题, 我能怎么办, 我就无奈的笑一笑, 摊牌, 让他自己试, 我是做不到了.
然后他为了证明他没问题, 当着我的面新建了一个html文件, 熟悉的引入jQuery发起ajax请求, 哦豁, 跨域啦, 他佯装镇定, 让我别看了, 先忙我自己的为由支开了我, 我会心一笑, 回到工位等他自己折腾,
他从那天早上折腾到了下午4点多, 好像真的意识到了是自己的问题, 更戏剧化的就来了, 他自己百度的跨域配置文件不知道怎么放行请求, 哦豁, 后来我还是帮着他配置上了.
这一段插曲暂告一段落, 不过可让我真的长见识了, 居然身为技术主管还有不会配置跨域的, 难免让我心有些心有余悸, 因为他好像和老板有什么关系, 而且老板又不懂技术, 而且这个 迷惑还嘴皮子功夫了得, 而且还嘴硬, 没有自知之明, 导致老板特么一直以为是我的的能力不行.
2. 微信支付风波 (前端控制支付结果)
接下来说一说这个项目的微信支付, 正常来讲, 一般的流程都是: 用户完成支付, 微信服务器发起一个支付结果通知, 商户服务器解析通知提取支付结果, 然后才是进行相应处理和响应给用户端
他倒好, 这个技术主管特么直接让我在微信支付api, 也就是在jssdk中的success回调函数里的向着他的接口发送支付成功的参数??
家人们, 你们知道这是什么概念吗, 我一度向他发起质疑, 他坚持这么做, 给出的理由是一般人根本就不懂, 不用担心, 我特么又愣住了呀.
不过还别说, 那时候都2202年了, 确实, 别说一般人了, 几乎所有开发者都想不到会有这么大的漏洞, 我就算随便在大街上抓一个人告诉他这个项目有这个漏洞, 他宁可相信我是秦始皇也不相信我的这个消息啊.
更离谱的还在这个我提交的参数里, 这个参数里不光有支付结果, 还包含了支付金额, 支付时间, 他后端是完全不校验的, 我传的什么他存的就是什么, 他所有涉及到金额支付的接口都特么是这么干的, 这个项目里还有个余额的选项, 我用postman直接发起个请求, 你猜怎么着, 我的余额瞬间多了一百万, 我做梦也没想到能这么快暴富, 噗嗤.
有图有真相, 我们先看一段代码, 这里某个调用支付的位置, 我们可以清晰的看到, 他让我在支付后调用他的接口传递支付成功后的参数, 这里的afterPlay就是我的参数, 下面我给大家简单说一下.
首先是用户id, 没错, 你没有看错, 这不是演习, 他不会用jwt类似的技术拿到用户的登录信息, 所有的信息都是我手动传递告诉他是哪个用户操作的.
商家id, 套餐数量, 套餐id不做过多的赘述.
我们看到支付类型和支付余额, 在这里, 如果支付类型你传1, 代表微信支付, 他特么在后台会用前端传的wx_money这个字段判断是不是和套餐金额相等, 相等就购买成功, 余额支付也是如此, 想必看到这里, 不用我举例子大家懂的都懂了吧.
相信细心的小伙伴都看到了, 为什么我这里要写这样的判断, 还注释保留了, 因为他特么有时候这个数据结构乱改, 不通知前端, 我行我素, 出了问题全是前端的锅, 状态码也是依托答辩, 这个我稍后再讲.
3. 店铺分类标签前端写死的
这一部分是我入职的第一周接触到的, 当时我正在写的功能是商家端的店铺详情, 就在写到店铺分类标签这个模块的时候, 我让他提供一个接口返回店铺的标签分类列表, 他特么说没有, 让我照着ui图随便写几个, 我特么直接就是一串黑人问号.
在一番攀谈后特么合计着他的逻辑是这样的: 我前端直接写死一个对象, 他传一些数字过来, 让我直接渲染, 如下前端对象shopLabel是我写死的, 乍一看, 好像没什么毛病是吧, 但是这些数字也是我上传的, 他有一个字段label, 同样什么验证都没做, 我传什么就是什么, 有时候, 还莫名其妙的给我返回null, 导致页面报错, 这就又特么成我的问题了.
4. 首页定位前端计算距离(后续修改的时候他使用正方体计算公式计算经纬度距离, 神人)
在用户端, 首页有个商家列表, 他特么倒好, 直接返回每个店铺的经纬度, 让我特么自己算距离, 好在后来新进了一位后端同事, 我们联合一起指出了问题, 劝了3天他终于是决定改了.
你以为这个事情就告一段落了? no no no, 他不知道mysql 可以根据Haversine 公式计算距离, 而是手算, 手算也就算了, 各位一定不知道他是怎么个手算法儿.
他信誓旦旦的拿出笔记本, 告诉我可以使用正方体的点坐标算出距离来, 噗, 我当时差点没憋住笑出来, 我寻思着地球再怎么方也是个球体, 我和我的新同事伙伴都惊呆了这个言论, 今天让诸位也开开眼界.
5. 数据分页不会做
这部分的问题出现在所有关于列表的位置, 如题所示, 就是他不知道分页查询怎么做.
所以, 他的数据分页逻辑就是: 直接把查询结果扔了回来, 让我一个前端一次显示多少条, 慢慢的加载, 还声明他原来的公司就是这么做的没问题, 我直接好家伙, 666, 这不禁让我回想起我刷到过的一个文章, 如下标题
当时我不禁怀疑, 真的会有这种需求吗, 现在一看, 好家伙, 原来面试题都来源于生活啊, 666.
6. 状态码稀烂
关于状态码, 但凡碰过互联网的都知道, 基本的规范还是要遵守的吧, 但是, 咱们的技术主管, 他不屑, 他自创了一套状态码, 200: 成功, 201: 失败, 202: 也是失败呢:
还有依旧是有通病, 那就是, 动不动修改数据结构不通知前端导致报错.
还有一件事, 有的字段我让他返回布尔值, 你们猜他咋说? :我怕前端不好判断, 这样吧, 我返回1就是成功, 2就是失败.
我特么...., 你妈的寻思你倒是返回数字我也不介意, 你起码正常点, 你返回0和非0不好吗??? 我提出了他硬是倔着要返回1和2.....
7. 表单数据数据验证不做
这一点是发生在所有位置, 就是我前端提交的参数他是一律不校验, 直接入库, 就因为这个导致无数的问题, 真的6, 商家下个单他也不判断库存直接下单成功, 导致出现极多异常订单我来排查.
哦对, 我依稀想起来他数据库设计商品居然库存字段属性是和下单人数数据类型是text, 导致下单人数我前端忘记做了限制, 导致我填了个6b, 订单了下单人数赫然的显示为6b.....
8. 数据结构烂成屎, 随意更改数据结构不通知前端, 让它改个数组返回['1, 2']
这个问题就是前端灾难之一了, 数据结构写的稀烂, 先上图, 诸位先欣赏下这美丽的折磨:
怎么样, 诸位感受到恐惧了吗?
我要在这种屎一样乱的结构中渲染出一个点餐页, 关键是我特么还真的渲染出来了, 好家伙, 后来他改了其中的一个数据结构同样不吱声, 哦豁, 全程点菜页崩盘, 他又熟练的把锅扔出来, 他这种垃圾查询, 至少在5-6个foreach中嵌套了查询扔出来的, 而且他内部结构还充斥着各种值, null, undefined, 空数组, 字符串, 能把数据一锅乱炖成这样的人才, 正在炼丹的太上老君看了都得跪下磕头.
更可气的是有个地方让他返回数组, 原来返回的数据类型是字符串: '1,2,3',
我让他改了以后, 他返回的是: '[1, 2 ,3]'
我让它再改一次, 他返回的是: ['1, 2, 3']
我特么........... 你就说这是不是数组吧...................
9. 居家办公快捷方式细节
这是一个小插曲, 那段时间因为疫情高风险, 居家办公, 我让他帮我把公司桌面的办公文件发给我, 经过长达5分钟的等待, 他给我发了一个体积为高达612b的压缩文件, 你没有看错, 单位不是MB, 而是b.
我解压缩一看, 好家伙, 把我放在桌面的快捷方式压缩后发给我了, 这位技术主管让我回想起我初中时期, 偷偷去网吧, 点进游戏菜单, 将一堆的快捷方式拖到U盘后向同学炫耀说哥已经可以不用去网吧了的既视感.
10. 不清楚mysql事务
关于这部分, 是我新后端同事来了后发生了我才知道的, 堂堂一后端, 还是技术主管, 居然不知道什么是事务?!
你敢想吗? 我是不敢想. 但是我发现我是在掩耳盗铃, 伟大的开拓者丹恒说过, 对付掩耳盗铃的人, 唯一的解决方案就是把铃铛砸在头上, 我幡然醒悟, 这是事实, 我们技术主管不知道什么是事务!!!
当时的情形是这样的, 新后端同事正在做功能, 需要用到事务,事务不生效,发现表是 MyISAM引擎,就给技术主管说让他更新测试环境的表。后面又问新同事修改的数据怎么没变,我和新同事凑过去过去以后发现他百度搜索怎么开起事务,此刻, 我们都明了这个技术主管不知道事务是什么了,瞅了瞅他代码,他只是事务开启,并没有提交或者回滚................
当时, 新同事想科普下 MyISAM 和 innodb 的区别, 谁料话刚到嘴边, 他匆忙遏止道: 我晓得, 我晓得, 不要说了.(科普: 我晓得, 四川方言, 意思为我知道)
此刻, 虽然我不能切实听到, 但是我能隐约感受到这位新同事的心率正在不断攀升, 面对这种人家是技术主管, 你能拿对方怎么样, 我菜, 但是我不承认, 面对技术主管的常规操作, 我却已经习以为常了.
11. 对json数据响应的操作
这个是出现在一个名为套餐商品的模块, 由于设计的话结构复杂, 详细他也做不出来, 就干脆存储的数据是我上传的json字符串, 他的神操作来了, 我提交了json字符串数据, 他把数据存表了, 返回数据的时候有神经病一般的把数据json_encode了一下, 一个数据被json_encode了2次.
12. git | svn, 版本控制风波
这一部分呢, 也是从我进入公司开始震撼的, 当时我代码写好了一部分, 需要让他先部署到测试环境, 噢, 我的老伙计们, 考验考验你们, 你们猜猜他用什么方式存储和传输代码? 没错! git? 他不用, svn? 他也不用, 公布一下正确答案: USB.
没错, 他让我打包后拷贝到USB上给他部署!!! 后面我和新同事都向他发起过疑问, 他的原话是: 不搞这些花里胡哨的东西.
我: ............ 6
新同事: ........... 6
虽然结果是这样, 但是我和新同事交互合作的时候, 我们是用了svn的, 算是脱离了三分之一的苦海.
但是我和技术主管合作的时候就很痛苦了, 如果测试的线上除了什么问题, 他的解决方案更为离谱, 你想一想, 在没有版本管控的后台, 加上前后端不分离, 他让我在线上改bug, 没错, 就是他打开了宝塔面板, 双击文件让我直接在上面改, 特么的.
改了也就改了, 我本地还要改一次, 改了又要用usb拷贝给他部署, 你猜怎么着, 哦豁, 完了, 本地线上同步代码不一样, 让我来同步........他吧线上的代码下载下来后, 我本地的又没了, 天呐, 我的朋友, 你们能理解吗?
此刻我真的感慨: 如果我有罪, 请让法律严惩我, 而不是这样摧残我们...
13. 视频不压缩直接返回
这部分是项目上有个页面需要展示一个宣传片, 他特么直接返回一个服务器上的视频地址, 一分多钟的视频, 大小为400多MB, 这是什么概念, 诸位细品吧 ............
14. 不会写图片上传接口, 让前端想办法实现图片上传和存储
这事也发生我刚入职后第一个月后发生的事儿, 在后来新同事入职后, 由新同事完成的图片上传.
事情的过程是, 他问题有没有做过图片上传, 我寻思不就是图片上传吗? 一个组件加请求不就完了, 谁料他给我说了具体的需求后, 我日常愣住了一遍.
我给大家复述一下他让我实现的纯前端图片上传: 在浏览器上点击文件选择, 选择图片后, 将该图片上传至当前电脑 E盘, 并且自动新建目录shopImages, 新上传的图片在当前目录下根据时间生成目录, 例如: 2021-12-12, 并将图片存储进去, 同时店铺详情的图片就自动从这里读取.
听完这个, 我特么凌乱了, 我不知道这样实现的系统意义何在? 我甚至怀疑我真的是前端开发吗? 这种系统真的有人用吗????
如你所见, 我确实实现不了, 就这样过了几个月, 他就把图片上传的问题抛给了新同事, 然后过了几分钟, 新同事完美给出了图片上传接口, 图片上传事件也就告一段落了.
15. 让前端实现用户操作状态
最后说一下整个用户端需要登录的接口他是怎么实现判断用户身份信息的, 这位技术主管不会用jwt以及类似的技术, 所以所有的需要涉及到登录的接口, 全是我多传了一个为uid的字段作为标识, 也就是说, 但凡这个人会审查f12会看网络请求, 就可以轻轻松松的拿到用户的信息, 进行充值(因为他没有充值验证)接口的调用, 总之, 真是服了这个煞笔了.
放到最后
让大家见笑了, 因为当时我工作经验不够刚刚入行, 行情也一般, 所以一直承受着没有换公司, 这段经历发生的时间是2021-9月到2022-04月, 足足8个月的折磨, 因为4月份后老板确认了他花了8个月写的垃圾跑步起来, 就由我和新同事重构了, 现在已经上线了我也算是脱离苦海了.