前言
2022.3,经3轮技术面,1轮HR面,我顺利入职步步高集团旗下,小天才科技有限公司,回顾回老家这两年的工作经历,我打算写下来,也算是毕业5年来的工作回望总结吧。这篇文章我写了很久,也在一直在思考、回顾自己这两年来遇到的人和事,工作上的问题。都说“好聚好散,跳槽、离职是双方选择的结果”,离职后尽量不要去说上一家公司的不好,但有些话我必须要写下来,算是吃一堑,长一智吧。
2022年1月,我最终还是把家乡的工作辞了,选择回到深圳、广州工作。回想两年前( 2020.2 ),我从广州辞职,决定回到家乡工作,在家乡找了个Qt开发的岗位,也是找了非常久才找到这么一个合适的岗位。自2020.3.16~2022.1.27 近两年时间,做了一个项目,对,只做了一个项目,智能XX安全监控系统。这设备的功能大概就是:实现一个NVR录像机 + 采集、测量一些物理量在大屏上显示,并且要带触控交互界面。其中要对采集、测量的物理量运用相关算法,进行数据处理,并实时绘图,呈现在屏幕上。这个项目从硬件选型,方案论证、测试,到软件编码,全是我一个人,零到一,构建起来的这个项目。
为了避免不必要的麻烦,隐去了部分项目名称,也没有说产品特性与适用领域,之所以这么做,是因为这篇文章言语比较尖锐,算是我表达不满的方式,亦或抱怨吧,whatever。但这一切都是基于我个人的真实经历,以及在此过程中的真实感受。离职的期间上家对我的每一次谈话,我都有录音记录,每次微信聊天,也都有记录备份,秉承客观公正的态度,审视这段工作经历,谨在此做个记录。
回顾这个项目
1、未明确技术路线
可能,有人会觉得太慢了,确实,从业务需求的角度来说,是太慢了,这个项目前面半年多的时间,都是在各个硬件方案之间验证,研发经理与老板也没有确定使用什么技术方案,只说我们要做这么一个产品。我去到那儿,经几次会议讨论之后,管理层决定使用Linux-ARM 的方案。然后,便开始硬件选型,一开始选用的全志A40i,我验证后发现,无法满足4路RTSP视频流的解码要求,然后又换了瑞芯微RK3399。
大概是2020年10月,老板看到友商已推出了类似产品,是基于windows开发的。到此时,我用这块RK3399开发板,在SOC厂商未开源硬件解码SDK的情况下,基于Linux-Qt,用CPU软解的方式,实现了4路RTSP视频流的实时解码播放,实时延迟200ms以内,接触过这块的朋友,应该了解难度是有多大...这突然就改变方案,放弃Linux-ARM路线,让我立马转windows平台去开发...
然后用了两个月挑选、验证合适的x86工控板,还有触控屏幕的适配选型,2020.12~2021.6 windows平台的编码已完成至 80%,老板又觉得用Windows平台,客户会决定系统不稳定,异常断电可能会导致系统损坏、蓝屏,于是又让我转Linux开发,在x86工控板上装Ubuntu,基于Ubuntu上运行我的Qt程序....
emmmm,尽管Qt 是跨平台框架,但也不要这么搞吧?玩我呢?...
虽然管理层不止一次向我表达对此项目的重视,但是连技术路线没确定,今天做这一套,明天又换个方案做另一套,这怎么能快,怎么能提高效率呢?
2、需求不明确,想到啥就做啥
在刚入职,进行项目前期规划的时候,我曾提议过,应该差异化产品布局,先把需要实现的功能罗列出来,然后根据实现难度,分阶段,分层次(高端产品、低端产品)去迭代版本。不必一来就要求打造一个十全十美,啥功能都要包含的产品去吊打同行,在研发能力有限的情况下,这基本不可能实现,也不现实。功能可以分阶段去迭代实现。这样一来可以敏捷开发,迅速推出产品;二来也能避免在硬件选型与后期功能需求上的冲突。可老板一句“你先做得去”就把我呛回去了。
在2021.7,为了应付市里领导检查,老板要求我在半个月内搞定人脸识别登录...这我记得很清楚,这个需求在项目规划的时候,明确说了这个功能以后再加(老板原话是:现在不用管,后面可能会直接用人脸识别仪),因为常见的人脸识别模型在这没有GPU的x86机器上,跑不起来。可是领导来视察,这功能又一定要加,怎么办呢?那只有用在线的人脸识别接口了,这又导致另一个问题,我的程序在设计时,框架里没有预留一开机去调用摄像头,进行截图并识别的窗口逻辑,硬要加的话,窗口逻辑、程序逻辑就都乱了。这也是我后面将整个项目框架重构,全部按功能划分模块的原因,因为我永远不知道老板、客户会随时冒出来一个啥需求。说实话,那时第一次有了辞职的想法,我搞不懂,这项目产品到底是研发出来给领导看的?还是搞出来推向市场,占领市场卖钱的?
直到后来离职交接的时候才了解到,这个项目,老板向省里、市里申请了企业科技创新项目,还拿到了奖,貌似奖金不菲?(看来是我Naive了),这是公司荣誉,我也为能独立开发这个项目感到荣幸,可是通知一下不过分吧?至少是一份鼓励嘛,我不指望年终奖金分多少给我,这不现实,也不可能,可好歹干了两年,产品给你从零到一给干出来,不至于我在离职的时候说出“我辞职后丢下个烂摊子”这么伤人的话吧?不至于连只有一个月工资的年终奖都想不发吧?.....
3、这真不是差一个程序员的事儿
在2019年,那时我还在广州某公司做嵌入式MCU开发,因工作需要,自学了Qt、Linux开发。彼时,因家里催着结婚,我也在看家乡的工作机会,刚好赣州的研发经理电话联系到我,问国庆放假会不会回赣州,回的话可以抽空见面聊一下。于是那次国庆节放假,我便去简单聊了一下,他们产品功能大致了解了,所要开发的产品需求,没有很明确了解。直到我来到这边,第一次开需求讨论会议时才发现,这根本不是做一个简单的嵌入式产品的问题,他这是要搞套系统!一个结合硬件、传感器,平台和应用程序一体的系统!除了平台之外这个系统,就由我一个人负责开发!我记得当时问过,为什么不招个安卓程序员,基于安卓去开发,毕竟安卓现成的轮子多,为何要选择Linux-Qt的开发路线?给我的回答是:安卓不稳定,程序容易崩溃退出。我想:这跟安卓有什么关系??.....
明白需求之后,经咨询研发经理,Linux-ARM板子打算外包开发,不用我画板子整硬件,这挺好。前期先买开发板进行程序开发验证,公司买了全志A40i,经验证性能无法满足4路RTSP视频流解码,然后换了瑞芯微RK3399,用CPU软解的方式,Qt下基于FFmpeg库,我实现了4路720p 视频流的解码播放,到这进展还算挺顺利,因开发板适配的是7寸触摸屏,产品上要求上10寸以上触控屏,便买了一块第三方10.1寸MIPI屏幕,开发板的uboot肯定是没有适配这屏幕的,经理让我去研究一下,把这块屏幕驱动起来,???我当时就懵了,招聘要求上没有这个吧,好像只写了Qt啊,我这搞Qt应用的,现在Linux-BSP也要整了?.....
大概是在2021.8月吧,股东之一的销售总监催得很紧,老板想要搞多设备联调,要兼容原来的单片机XX系统,实现基于LoRaWAN的多机通信。我这边要做的是:需要在Qt应用端,通过串口LoRa模块,实现LoRaWAN的时分多址组网通信。可能不太好理解,通俗解释就是:在多线程Qt程序应用中,每30ms内完成一轮数据的收发,要把LoRaWAN局域网内的设备数据收进来,再把当前设备的数据发送出去,通过Qt串口传输数据,并在30ms计时周期内实现精度自动补偿;众所周知,Qt的串口是异步收发,即便使用阻塞模式,也不可能像单片机那样,可以利用DMA或串口硬中断进行收发,要在x86上实现,这...可能么?老板说:“很简单的,我的单片机都能实现的功能,你这x86这么强大,不可能实现不了”。 我想,要不...你来?
我搜集了Qt官方文档的资料,并一一实践了所有可能的方法,都达不到LoRaWAN的时分多址组网要求,串口收发数据这里就满足不了。大概是我太菜吧,于是,我去咨询一资深Qt大佬,他说没搞过这种,用Qt基本不可能;然后我又去一2000人的Qt开发群里问,大家给到的回答是:为什么要在分时系统里,搞实时RTOS系统上的强时序的需求?提桶跑路吧,搞这种SB需求不值得...此时,是我第二次有了辞职的想法。
4、在一堆C屎山里剥离算法,并实现C++移植
相信所有程序员最难受的,不外乎看祖传的屎山代码,而更令人难受的就是要你在这堆屎山里理清逻辑,分离算法了。那...是什么样的屎山呢?
- 没有注释,基本一行都没有;
- 变量没有边界,能用到的变量都是全局变量;
- 数组不分类型,作用域是从头到尾;
- if-else 随意嵌套,还夹杂上面的数组;
- 全篇从不用指针,函数、数组的传值,全靠全局变量;
- 没有任何模块化可言,函数都耦合在一起;
当拿到这份算法代码时,我大致浏览了一下,这是跑在上古8位单片机上的代码,老板写的,老板的意思是:算法是经过生产环境严格验证的,非常完美,让我不要动,直接放到Qt环境里去编译,完成移植就行。这...可能吗?我曾励志花两个月时间要把它重构了,可最终还是放弃了;没有设计文档,没有注释,全是全局变量,且只有这一部分代码,遇到不清楚的地方,去问老板,有几次,他自己都忘了这地方是干嘛的...
然后我换了个思路,既然没法从这屎山中理清算法逻辑,但是算法的设计者明白原理,那为何不直接口述,或通过画草图,亦或整理出一份程序设计文档出来,让我理解透了,这样我用自己方式来写这个算法,效率不是更高了吗?然后我向老板提议,结果被拒绝了...得到的答复是:“算法就是给你的那几个 .c 文件,好好看,我比较忙”。我不理解,明明可以抽出时间的,也都签了保密协议的,还有必要藏着掖着吗?只给部分文件,又全是全局变量的函数,让我给你移植算法靠猜吗?还是怕我掌握了你们的核心科技?这是我第三次有了辞职的想法。
离职
干程序员的总是有干不完的需求,解不完的bug,需求与开发之间的矛盾是一个永恒、无法调和的矛盾,这确实...维持这种矛盾与冲突平衡的前提,是建立在付出与回报对等的条件下,需求多点没事,大不了我加班嘛,只要钱给够;只有一个程序员,啥都要干也没事,大不了我赶进度去学习、加班搞嘛,只要钱给够;大厂996,9-11-6文化,人家的程序猿不照样活得好好地,因为大厂钱给得足够多。若是钱就这么点,还啥都要干,需求想怎么来就怎么来,销售整天牛逼的不行,今天开拓xxx的市场,出货了xxx台,明天又拿下了xxx的市场,一个劲儿催进度,还嫌我进度慢,您那么厉害,何不多花点钱,多招两个人进来呢?键盘耍地飞起,不干程序员确实可惜了。对!是我的锅,是我太菜了,那麻烦另请高明吧。画饼不能充饥,你们谋划的未来愿景有多美好,跟我没半毛钱关系,我又没有股份。两年来工资、奖金一分钱没见涨,需求却一直在不停地改,那我只能提桶跑路了...
大概是2021.9月吧,我向研发经理提出了我想年底离职的打算,让他们早点去招人跟我对接项目,因为我知道在家乡那三线小城市,想要招一个有项目经验的Qt/C++ 开发是非常难的,(不,应该是这么点钱想要招一个有经验的C++开发,我认为是不可能)所以很早就打了招呼。在2022.12月,老板一通令人窒息的操作着实把我整懵了,离职交接的那段时间里,给我列了大概十几个需求,要我在离职前搞完,可能是招人招了快半年没招到,说我走了之后没人接手项目,也没人会搞Qt....招不到人来对接跟我有什么关系?还说怪我丢下这烂摊子走人?到底是谁烂管理层真的没点x数么? 这TM是趁我走之前狠狠地薅一把?真是太过分了,新需求是不可能再给你做的,又不多给我钱,凭什么?
还有更绝的操作是,在我离职后的那个月(每个月15号发工资,离职时没有结清所有劳动报酬),到了发工资的时间却单独不发我的。我还奇怪,为什么今天工资没到账,于是去问同事,都说今天发了工资,那天晚上我发微信去问财务,财务给我的答复是:现在程序遇到问题,老板要求让我解决完才给工资....
这是人干的事儿么?离职意向半年前就说了,交接是用了两个月时间来交接,程序是手把手、一个模块一个模块地逐一讲解、交接,每个功能函数都写上了详细注释,走之前我还特地问:有没有问题了?有问题我再给你们讲讲。能做到这样,我已经是仁至义尽了,现在遇到问题了,解决不了,竟然以这种方式来要挟,压着我的工资继续给你干活?当时我就火了,大不了这个月工资老子不要了,立马去申请劳动仲裁,走司法程序,看看你给不给。
那段时间正在准备多家公司的面试,手上已经拿了2个还不错的offer,步步高这边正在准备第二轮技术面,还有汇顶科技的二面,若要去走劳动仲裁,可能我还真抽不出时间。媳妇儿问我,他们这个问题改起来难不难,我评估了一下,大概半天的工作量,然后媳妇就劝我帮他改一下,没必要跟这种老板斗气,大不了以后再也不来往了,想想也是,于是当晚加班花了2个小时解决了。第二天上午,老板来问我代码改得怎么样,我气不打一处来,说:改完了,要等工资到账了才能发给你。那天下午,工资到账了,我才把改好的程序发过去。
这个项目截至2022.1 我离职时,光是C++/Qt 程序的代码量达34+万行,不开玩笑,是真的有34w+行,还不含前期两次更换硬件方案所写的验证代码。这个Qt项目中,涵盖了绝大多数Qt的中、高阶应用,应用了包含单例、生产者-消费者、工厂、观察者模式的设计方法,分成了十多个模块,如:QPainter实时绘图,QCharts图表,多线程,EXCEL表格,线程池数据库,远程更新,Qt Quick界面布局,Qt插件系统,中、英文输入法,人脸识别,Onvif协议云台相机控制,FFmpeg库视频流解码。每个模块都以pri子模块的方式嵌入pro主工程,每个子模块即一个文件夹,资源、第三方库分文件夹存放,最大程度减少各模块间的耦合,框架结构一目了然。其中FFmpeg视频播放的解码性能,在x86工控板和RK3399下,RTSP 1080P视频流的实时延迟可以做到200ms以内,相信这在搞Qt音视频领域,应该算是非常不错的成绩吧?
如下测试图:(x86 130ms)
可以说,里面任意拿几个子模块组合拎出来,都能做一个不错的项目,就这样竟然还说出:“因我的离职,丢下这烂摊子” 这样伤人的话...招不到人来接手项目,怪我?看不懂我的代码,不会Qt,又解决不了问题,怪我?真是无语至极,以我有限的从业经验,从未见过这样的公司、老板...
这件事,把我对这家公司仅有的最后一丝好感,打击地荡然无存,也认识到了,在资本家眼里只有利益,那些画饼,那些所谓的那些美好愿景,只不过是奴役员工的手段而已,在绝对利益面前,资本家会放下面具,露出那副逐利姿态,想尽各种方法压榨员工。为什么这么说,因为就上面这一问题,过完年开工到发工资之日,他们好像搞了一个多礼拜都没有解决,又招不到人来解决,所以,哪怕是用这种押着工资的卑劣手段,也要再压榨前员工一波。可能有人会觉得,我这话说得比较重,可是你们能想象,做出上面这些令人咋舌的决策者,其身份是某大学的老师么?这是为人师表干的事儿么?
离职后
我怀疑这份工作给我整地PTSD 了,离职后还免费无偿给他们解答了半年的问题(2022.1.27——2022.6.24),不过也仅限于分析、解答问题,不写代码,不解bug,我也不知道自己咋想的。可能主要原因,是出于对给我对接的大哥的尊敬吧,亦师亦友吧,他是搞安卓、前端的,被老板叫来接手这项目,尽管...他也是公司股东之一。另一方面,也可能是老板把年终奖给了我,按他自己的原话:“我也是搞开发的,这个项目我们确实低估了开发的难度,但不给年终是公司管理层的决议,这年终奖以我个人名义转给你的”,我不知道这算不算先给一巴掌,再赏颗糖...
在2022.6.24 在解答完最后一个问题后,我退出了项目交接群,也向他们说明:以后关于这个项目的任何问题,我没有义务再做任何解答了,也没有必要再来联系我了,即使是付费也不用再联系了。我不想与这家公司有任何往来,这个产品最终会大卖,还是彻底烂掉,与我没有任何关系,到此为止吧。
思考与反思
1、对自身能力没有清晰的认识
刚去到这公司,在开完项目需求讨论会议时,没有完整、全面的评估,及时预报风险,应提醒领导:要从硬件方案选型、测试,BSP驱动,到Qt程序编码,视频解码,性能优化,完成这一完整的开发流程,打造一个产品出来,我一个人搞,难度真的很大,应该多招两个人进来。尽管最终还是将这个产品开发出来,但是完成时间,以及完成度离我的预期还是有一定差距。
我这不是马后炮来甩锅,推脱责任,这里面确实是对自身的能力认识不到位。主要体现在以下几点:
- 第一:独立主导开发大型项目的能力不够;
- 第二:缺少很强的风险预警、项目管理意识;
- 第三:对自己过于自信;
2、要懂得拒绝需求
不是什么需求都能接的,也不是什么需求都有必要去做的。在接需求前应该仔细评估其开发难度,必要性,投入时间与产出比,以及这个需求与当前项目代码是否有冲突(是否要重构代码)等等,这些都是需要去考虑的。有时候老板、客户只是头脑一热,脑子里随便想的一个需求,就要你去实现。比如:“塔机上的酒驾检测”....但凡是个脑子正常的人也能想到,特种设备的驾驶作业,能酒驾么?驾驶这种可能引起重大安全生产事故的特种设备,司机他敢喝酒么?还有,在一个高空空间里做酒驾检测,有这个必要么?你见过哪辆汽车自带了酒驾检测么?如果你二话不说,立马答应下来就吭哧吭哧的去搞,到头来可能搞得一地鸡毛。不仅打乱了原有的开发计划,万一功能没做出来,又耽误了原有进度,最终锅还是你的。
3、追随自己的内心
觉得工资低就提,如果不涨工资、干得不爽就走,不要自己觉得亏欠了谁的。给多少钱干多少活儿,免费无偿给资本家加班,他能帮你提前还完房贷、车贷么?还是年底祝贺老板喜提大奔、乔迁新别墅?可能有人会说,年轻真好,没有顾虑,想走就走。对,确实年轻真好,如果年轻的时候都不敢放开顾虑,去闯、去追求自己的内心,圈在自我舒适的圈子里不去改变,那等你老了,被傻逼老板磨没了脾气,兢兢业业地为你以为的“好公司”,“好老板”奉献了十来年,每年指望老板能多分一点年终奖,分你点股份?我觉得如果你没有不可替代的核心技术的话,他会毫不犹豫一脚把你踢开。
4、趁年轻,有能力尽量去到更大的平台历练
不要觉得小公司能锻炼人,啥都要干,这是资本家、产品经理包装出来的鬼话!你一个人包揽了软件、硬件,测试,甚至售后,一人干了3、4人的活儿,当然能锻炼人了,而资本家只要出一份工资,他这是稳赚不赔的买卖。如果遇到黑心一点的,社保、公积金不给买,或者要满一年、两年才给你买,他简直赚麻了好吗?因为他笃定你不懂劳动法,笃定你不敢去劳动局、税务局举报,笃定你会觉得“这边企业都这样,来都来了”,笃定你会任劳任怨、兢兢业业地干活...
大公司,进去最先感受到的是规范,你只需在岗位职责范围内干活,每个大型项目,你的团队只负责其中一块;在团队里,你是负责团队开发任务的某一环,与其他同事环环相扣;每次版本迭代,都能感受到其中的流程与规范。尽管工作压力会更大,加班也更多,但大厂给的多,各项福利也多!社保、公积金按工资满额缴,试问?在小公司的话,哪个小公司老板能给到这样的待遇?
对于程序员这吃青春饭的行业,在有限的工作时限内,只有进大公司才能使收益最大化。只有去到更大的平台,你才知道自己与这个行业最优秀的一批人差距有多大。人是群体动物,在一个特定环境、外界因素的影响下,会不断地改变自己去适应这个环境,良好的环境能让你不断地进步,督促自己跟上群体的步伐。若是不好的环境,可能你会不断地做出让步,一步一步成为被老板PUA的对象。
5、不要停止学习、进步
程序员是吃青春饭的。随着年龄越来越大,自身的学习能力、新技术的快速适应能力会越来越弱,而这一行恰恰又是技术更迭迅速的。所以干程序员的始终要保持不断学习的习惯,不断拓宽自己的技术栈,丰富技能树。这两年时间,我刷了两遍《c++ primer plus》、《设计模式》;把《C++ GUI Qt 4编程》、《Qt高级编程》都仔细地刷完一遍,C++/Qt的中高阶应用,内容真的非常多,这也是这个项目做了这么久的原因之一吧。
回顾这两年
1、生活节奏
回老家工作这两年,生活上给我最大的感触是:悠闲,小城市的生活节奏真的很慢,很悠闲。每天下了班就开车回家,夏天天黑得晚,还能去钓鱼,去菜地种种菜,周末带上家人去周边游玩。家住农村,晚上没有逛街、逛公园的活动,一家人坐在一起看电视,或是在书房打游戏、看书,尽管开车到县城才10分钟,但我还是更喜欢住农村的感觉,独栋三层大Hourse,大院子.
有时候我不禁在想,
版权属于:编码书生
本文链接:https://codess.cc/archives/488.html
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
除特别注明,您可以自由的转载和修改,但请务必注明文章来源且不可用于商业目的。
![]()
此处评论已关闭