0%

2021·中章

我以为一个“技术博客”写些无病呻吟或骂街发泄的故事是不合时宜的,但近期工作上一些尤为荒唐的经历还是值得大书特书一番。故事中的人物身份、地点均已隐去,不存在侵权or人身攻击行为。偶然发现这篇博文的朋友们,若有兴趣听我发牢骚的不妨端个小板凳坐下,这故事可能有点长。

实习

2020.12,过年前的一个月,收到学校的通知,被告知“我们这一届首次采用去企业进行毕业设计”,呵~,又是“首次”。加之我还是大数据实验班的,背着这个“Buff”,还被要求做“大数据和人工智能”相关的课题。距离过年不足一个月,秋招都没参加的我找个有大数据/人工智能业务的公司谈何容易…..于是在邻居的介绍下,手忙脚乱去了南京一家“大数据”公司。老板看了简历,都没有安排面试就然我直接入职。

入职当天早上,没人给我安排任何事。桌上散落着电线和螺丝,我自行清理了大半天后,望着空荡荡的桌面,就掏出自带的笔记本开始随便写点啥。直到下午,主管Y来了,看了我一眼,叫Z同事给我安排了第一个任务:设计实验指导书。

我接触到的项目是该公司的线上大数据教育平台,类似“实验楼”这种网站,它是为某些专科高校具体定制的,提供在线实验环境。而我的任务则是设计一些大数据相关实验,如Spark的安装,Spark RDD基本算子,Hadoop的WebRank算法。第一个实验是MapReduce对某些数据集进行统计,然后用ECharts可视化。对于这种CSDNN上烂大街的Getting Start实验,我写了一小时不到就写完了,然后就没事干了。由于邻居大哥也在此上班,到了晚上6点了,大哥催我下班,我却被同事告知要留下来,我震惊道:“难道第一天就要加班?”。

果然,第一天就加班加到8点,然而加班不是干活,而是跳舞————给年会排练节目,于是就这样,我们部门的人年前几乎每天都留下来“跳舞”。

之后几天又接到一个新“任务”:给线上视频课程系统导入章节数据。数据写好在Excel里,按照他们的意思,我要做的只是复制粘贴,然后点击提交。有感于这项工作的无聊,以及身为程序员天生讨厌重复性工作,我写了个脚本,用Node从Excel中读取数据然后向接口自动POST。之后同事们果然搞出了一堆脏数据,删不了,只能重建库,他们让我再次导入一次数据。还好我之前写好了脚本,不然真要被折腾几次……再之后,我又照着知识点陆续设计了十几个其他的实验,提供源码和实验指导书,年前的任务也就完成了。

跳舞排练了大半个月,年会前几天,主管把我们几个实习生叫来,告诉我们:我们是实习生,所以年会就不“要求”留下来了。后来被旁边同事告知,这是怕我们年会上抽到奖品,导致老员工不快。没事,我本来就社恐,不去也挺好的。

2月,回家过年,之后发生了什么大家都知道了(COVID,Lockdown)

3月,疫情比预想中的严重,大家都在家看网课,老板意识到这是个推广线上教育的好机会,于是在工作群中开始了Remote Work,每日照常打卡,但主管还是催着我们尽快回去上班。3月中旬老家检查口一放开,我就火速来到南京,隔离了两周后上班。来了之后才发现,全公司没几个人,南京本地人都没来几个,我这个外地的倒是听话的很。由于人员缺少,我这个原本被安排写实验报告和打杂的,也被要求干正式工的活:录课程视频。你说我一个来写代码的,怎么就成讲课老师了呢???于是乎自己做PPT,自己录视频,干了一周。大老板对于项目十分重视,来查看课程质量,看了之后很不满意,认为质量太差(我也有同感,要是我来选,Cousera和腾讯课堂上那么多课免费的高质量课程不香吗?非得用这满是BUG排版极丑的系统折腾自己?)。主管大手一挥:“之前录了几个月的视频,全部重来。接下来一周要重做年前几个月的工作量,务必抓紧时间乘机抢占市场!”。于是开始了上午开会、下午做PPT、晚上录课的生活。上个月还在我对面开外放刷爱奇艺的主管,这个月在老板面前忽然如同打了鸡血一样亢奋。要我说,录课的同事水平不一,大部分也就刚接触大数据的概念,照着博客和百科上的介绍念稿子(我真的怀疑他们能否听懂自己讲的什么)。而审核同事把重点放在了PPT的样式上,一会儿说这边标题要大点,一会儿说那边图片移个位置,而对于空洞单薄的内容倒是不闻不问。一会儿说这是面向专科学生的,要控制视频长度,要简洁;一会儿又说这边讲的不够详细之类,合着“Hadoop的历史发展”是重点,“HDFS的备份机制”不是重点,哈哈哈哈哈。行吧,你说啥就是啥,我干就是了,我就是个打工的,你到时候给我盖个实习证明的章就行。

要提交企业实习证明了,拿着学校开的证明书找人事盖章,结果人事看来半天,抠出一行字眼:“公司需要监督学生完成毕业设计”,说不能盖章:万一我不好好写毕设,没有完成,是不是要企业承担法律责任,而且这个实习时间也是不确定的,要是我提前走了,是不是还要付安全责任。我当时就满脸黑人问号,心想:我拿着100一天的工资,天天加班跟你们跳舞,帮你们打杂一个月,你们还需要抠这个字眼?这么怕风险,你们招什么人。但气归气,章还是要盖的,针对他们的每一点要求,我跑前跑后给教务处打电话询问能否修改实习协议部分词句,折腾几次最终拿到了盖章的证明。

三月中旬,同学们的开题报告都已经交了,很多同学的公司Mentor把他们在公司做的项目直接作为了课题,允许他们以此作为毕业设计,而我忙着给这家公司打杂,啥也没有来得及写。这一个月内,想想自己做了啥:写实验报告、写数据导入脚本、做PPT,我总不能交个《基于PPT的大数据教学》作为题目吧?公司的几个“大数据”项目,全是保密的市政数据,我自然是摸不到的。意识到这个公司不会在毕业设计上给我提供任何帮助,我也认清现实,抛弃幻想:反正我独立完成毕业设计绰绰有余,来这里就当给你“白嫖”,你给我盖个章就行。于是我自己搞了个《基于大数据的知乎舆情分析平台的设计与实现》的开题交了上去。由于同学们很多有导师指导,有的甚至直接接手了一个已经完成了差不多的项目,他们就轻松的多。而我白天要写实验报告,做PPT,写稿子,晚上回去录视频,到了深夜才能开始搞自己的毕设。大数据相关的项目需要数据,哪里有数据?自己爬。由于受限知乎的反爬虫系统,每秒只能爬一条,开了客厅的台式机,隔壁的树莓派服务器,爬了大半个月,终于爬到了几个G的数据。3月疫情丝毫没有好转,之前要求必须去企业做毕设的学院,忽然态度一百八十度大转弯,要求全体学生不允许去企业现场实习(东B的传统艺能了),辅导员还给我家里人打电话,一天几次,要求上报位置。要毕业了,也不想和学院扯皮,不听话万一扣我毕业证咋办?只能和主管提出Work From Home。

3月底,回家干活,省去了来去的时间,终于可以挤点时间给毕业设计了,但白天的活丝毫没有少,甚至变得更多。每天还是做PPT、改PPT、写稿、录视频。我透过公司的VPN看共享文件夹,我提交的通过审核的视频不比几个老油条少。大概过了两周,主管让同事给我发消息,问我什么时候回来,告诉我“如果现在不回来就不要来了”。我先是一愣,然后感觉有点想笑,那么就不来了把,翌日前往公司,离职、交接、一气呵成。随便找了两关系较好的同事请求交接,不料他们都表示自己也要走了。整个实习期间,公司没有给我配置电脑,让我用自己的,头一次看到被白嫖时间还要求自带生产资料的。回去后,毕设的项目才开始真正推动,几乎从零开始奋战两个月,才把代码,论文等相关资料全部搞定。

由于要自己创造课题、自己提需求、自己写实现,我的毕业设计差不多付出了别人双倍的时间。那些在企业就拿到现成项目的,只需要写个论文即可,而且有真实商业背景,论据充分,着实让人羡慕。而我从零开始搞了两个月的项目,用了分布式Scrapy做爬虫,用上了HBase,Spark,Spark Streaming等大数据工具,还看吴恩达视频学了点NLP,自己训练了个LSTM的情绪分类模型,用neo4j移植到Scala Play Framework中,还自学了Typescript,用Antd Pro写了一套前端可视化,实现了一个采集-存储-分析-展示的系统。一顿操作猛如虎,最后拿的分数还不如在某些大厂实习用PHP+MySQL+JQuery写的“大数据”项目分数高,更是被保研搞炼丹术(Deep Learning)的“炼药师”摁在地上摩擦。算了,我也习惯了,多少分也无所谓了,至少我的东西每一行都是自己写的,我问心无愧。

工作

2020.6月末尾,终于拿到了双证。想去大厂找工作,由于之前被公司业务和毕业设计压得喘不过气,还没正儿八经复习和面试过一次,心里很慌。加之疫情原因也不敢去北上广,南京又没有啥好机会,一时间很迷茫。父亲让我准备继续考研,但是家里人意见不一,争执不下。直到9月,小伙伴都工作几个月了,感觉实在压力太大,实在复习不下去,开始写简历找工作。把简历挂到BOSS上,但是看到校招都已经结束,社招的要求高的离谱(各个都要求精通,面经全是“分布式”,“微服务”,“高并发”),所以迟迟没敢主动投递。但是没几天一家公司给我早晚连续电话轰炸,一天三个未接来电,晚上又打给我,我接了。HR说这是一家做“大数据取证”的,问我是否有兴趣。由于是接到主动面试邀请的电话,我就欣然去面了。先是做题:Java基础知识 + Leetcode A+B Problem。之后技术面,面试官也就是部门主管,满口“红黑树”,“操作系统线程、死锁”这些问题,果然和网上说的八股文一模一样。结束时,他问我有什么要问的,我想到在上一家公司的经历,只提了两个问题:

  1. 有没有人带。
  2. 加班情况如何。

主管的回答是:当然有人带啊,有事才加班。后来我怀疑我是不是少听了两个字:“才怪”

之后HR就开始讨论薪资,根据我了解到同学里最低是9000,我就报了个9000,HR当场给我否了,并开始PUA。之后就是如同查户口般的填表,调查家庭背景。下午就接到电话说通过了,薪资给到税前6700 + 300餐补,问我什么时候来,我说10月初就来。招聘写的朝9晚5,签合同时HR却告诉我是大小周,虽然觉得被耍了有点膈应,但一想到单身狗周末也没啥事干,但没管那么多直接答应了。

10月3日,节后第一天,来到这里,HR给我安排了一个位置,上来就感觉有些不对劲:公司的规模和描述的明显不符,差不多只有50人,都不到招聘介绍上写的一半规模。第一天,内网的GitLab,Wiki啥的工具都没人跟我讲,我照着之前人电脑留下的历史记录,摸清了公司的基本业务和开发工具。下午,产品就给我看了一个Springboot CRUD管理系统的项目的用户使用手册,就让我加一个功能。我看了下项目,写的很乱,命名规则各种不符和规范,IDEA右侧滚动条全是密密麻麻的warning黄线,让我大为吃惊,因为我从来没见过这么离谱的代码。项目没有文档,代码也没有注释,甚至前端照着后端的拼写错误将错就错,我只能照着用户操作手册开控制台找接口,根据接口找Controller,再到Service,一步步定位到目标代码。明明实在做开发,却感觉是在做逆向。由于新功能只要加个Controller和Service和一张SQL表即可,我很快就写好了,但第一天来就要上手项目,觉得还是有点离谱,心想:这就是小公司吗,这么奔放?没人带的情况下让新人第一天做功能,还改表?出了问题算谁的?做好了之后,我就和前端联调接口了,后来才发现这个项目、乃至整个公司只有一个前端……

3天后,主管回来了,给新人考核上写了我的工作量,然后我就通过了“考核”,被拉进了正式群,后来得知,所谓的新人7天考核就是来直接安排上手项目,看新人能不能没有文档、没人带的情况下干活,不能干的的就找个理由开除。刚来的时候,看到“新人群”里就我一个人,我还在群里找到了之前来这的试用期的人写的日报:Vue安装和JDBC使用啥的,我还很奇怪为什么只有1次日报,后来才知道是这种Vue和JDBC安装都困难的人应该第二天就直接被开了……第一周最后一天晚上,老板请客去海底捞吃了一顿,劝酒,且气氛诡异,后来得知,这种团建往往是要“救火”的前兆。

给第一个纯CRUD的XX管理系统加了个功能后就再也没碰过那个项目,我被安排接了另外一个项目:一个更大更复杂的CRUD系统。项目大概就是:隔壁C艹组从手机中取各种应用的用户数据,然后存到一个数据集里,我们的“分析系统”导入他们的数据,转存到本地表里,然后做一些分析和展示。项目是之前一个组留下的(据说他们全组集体辞职了,还有个南大的)。系统功能不少,但是很不稳定,点进去一看,一个Class 1w行,IDEA里全是Warning。数据库里全是用”+”拼接的SQL语句和参数。只要遇到某个参数里有引号,就会导致SQL语句执行错误,然后控制台打满Exception瞬间GG。我寻思:这是人干的事?2020年了,一个几万行代码项目里还有在写原生JDBC的人?为什么我之前说项目是“不稳定”,而不是“不能用”,是因为这位写SQL字符串拼接的前辈,好像意识到了参数有引号的问题,于是写了一些工具类,把拼接的字符串参数里的引号去掉,而且,只改了一部分…..所以项目也是随机出BUG。嗯,天才的设计,暴力出奇迹,可是,为什么不试试神奇的Prepared Statement呢?后来他们说这是之前写C++的老组长写的Java代码,这么大力出奇迹情有可原。嗯….可你非要用原生JDBC你不会封装个字符串转义工具吗?这好像是缺乏抽象思维能力而不是只会写C++的锅把?难道写C++的老程序员就不学设计模式了?更绝的是,他们一会儿用原生JDBC,一会儿用JPA,一会儿Controller里用JDBC Template写SQL,一会儿在Service里写SQL…..一开是我觉得写这些代码的人只是单纯的蠢,直到后来,我看他们写了个全是BUG的链接池,明明引入了Hikari还要自己写连接池,结合到之前这组集体辞职,我意识到他们可能不是蠢而是有意为之,结合我后来的经历我也能理解他们为何如此在项目代码里发泄。我们花了大半个月把一万多行手写的SQL拼接的存储逻辑改成了JPA实现,终于数据能稳定导入了。

下一个任务是修复项目中的Solr模块和词云模块。词云来自于对导入数据的分词统计,主要问题是无法及时生成,有时候多达半小时才能生成,主管要我把词云从Quartz定时任务改成主动触发。我检查代码发现词云任务的Cron表达式把0.5写在小时位上而不是分钟位上,半分钟一次变成了半小时一次,这不出玄学BUG才怪呢,改个cron表达式不久好了吗。但既然你非要从定时任务里拆掉,那就拆掉呗。至于Solr,该项目用Solr作为全文搜索引擎,之前的Solr Schema是DIH生成的,Solr实际上就是数据库的副本。最好当然是按照业务需要为特定字段设计一个统一的Schema,但是我打开数据库一看,几百张表……,代码里Solr相关15000行以上,要改Schema代码基本要重写,一个星期不可能改的完,更何况和产品沟通后他连搜索模块要搜索哪些些内容的需求都没搞清楚……于是只能拖到以后了。就这样直到离职我都没看到有单独划开时间给重构Solr业务。

来了一周左右,同事开始天天跟我阴阳怪气,说“你在不加班,就见不到你了,分分钟开除”。我不以为然,我说:“我事情都做完了,为什么要留下来”。然后过了几天,主管亲自找我,问我有没有啥想法,说最近事情多,让我留一下。我感觉最近他们的确挺忙,那我就帮帮忙吧,于是留下来了。一个月后发了第一个版本,上一批人留下的这个坑终于能勉强填平了。我以为要开始回归正常上下班了,然后我们组却开始了有规律的124加班到7点半,周35准时下班的“潜规则”(人事自诩周3为小周末)。说起潜规则,此公司从不给工资条,老板发表讲话也要统计签到,估计听老板训话也算在“绩效”里,也是条潜规则。老板在新人培训上时不时强调,新人最好要多留两小时学习,留下来看看书提升技术。对于这种“学习”行为,他们奖励留2小时的20块。反正回去也没啥事,我想想也无所谓,我这种没有夜生活的人回家也是写代码看书,正好到家8点多在健身房关门前还能锻炼一小时,我以为退让一步就能海阔天空,所以按照他们要求留下来“学习”。有同事没有主动“学习”,于是它受到了老板“友好”的“警告”。有趣的是,HR还把加班排行榜发在群里,然后迅速撤回来疯狂暗示。

由于项目太拉跨,白天我还是不断修改历史遗留问题,逐个功能重构,乐此不疲。晚上5.30他们去小店吃饭,慢慢悠悠不想回去,我催着他们回去写代码,结果被鄙视:“你是不是干活上瘾啊?”,事后想,我的确有点奋斗B了。同事告诉我“你干那么多有什么用?”,他说他刚来时也看见BUG一堆改了很多,结果主管问:“你为什么要改?程序跑了没问题你改什么”。所以他再也不自作多情了,如今成了老油条的一员。之后我又接手了主管手上的活:Python的数据导入模块,对其他厂家的各种格式的数据集,适配自家的数据库格式,支持其他家的报告导入自家系统,也就是枯燥的数据处理工作。

我这奋斗B似乎就成了背锅的最佳人选。有一次,主管吧一个内外网功能模块让我实现,结果去了现场后发现外网文件过不来,说是我写的BUG,还指出一行报错。我一看,寻思:这地方不是你写的吗?都跑了几个版本了能有什么错?大概率是网闸配错了啊。于是我让他检查网闸,一步一步来,但他坚称网闸没问题,说:“我不管,现象就是这个”,我就很无语,我都告诉你了怎么测试,你动动你高贵的手和嘴有事吗?一直跟我强调“现象就是这个”是铁了心要我背锅?出差系统装没装成无所谓,有人背锅就行是吧?后来电话里听到有人说“网闸错了”,你啪就给我电话挂了,很快啊!第二天,我记得你说我路径写的不合理,我还信以为真了,可同事告诉我,就是网闸配错了,呵呵。之后网闸模块大改的阶段,客户打电话想试用新版本,你好像完全没有记得之前的麻烦吗?我还没写,测试也没测,你就答应第二天就去装。你对我的水平这么信任,我真是诚惶诚恐!

半泽直树真是青年人的职场教科书。

2021年初,老板来检查我们新年来一个月项目的进度,看到我们只做了个上传进度条的功能大为光火,然后每周固定3天加班到7.30的日子也到头了,主管开了个会说:“我们这么加班,也不是个办法,老板说了,不要刻意一周三天加班,就这样把,忙的时候多加点,松的时候少加点。所以这周开始忙,加到8.30吧”,听到这里,我一开始居然天真的相信了,但奇怪的是,这个“忙”月,根本没有什么事可以做。同事们除了抱怨几声,还是同意了,在吃饭的时候,好几个同事还是表达了消极怠工的情绪。正当我为这种莫名其妙的加班感到匪夷所思的时候,主管在说出了那句让我记忆深刻的名言:“现在市场竞争都很激烈,我们也不知道能不能做出好的产品,但是只要你肯加班,你就对得起你自己”。这句话,简直震碎了我的三观,加班=对得起自己?这是哪个高人发明的等式?

雇佣更少的人干更多的事,尤其在互联网行业,企业宁可安排一个人干两个人的事,给出大于两个人的工资,马督公认为这是互联网行业性质的必然性:企业的目的是为了减少沟通成本并提高效益。牢厂和火星厂也许业务的确多,加班多、高工资、勉强可以解释,但我们这种百人小公司,不足20个的开发,开着大厂1/5的工资,干着“本分厂”的工作时长,您哪来的勇气?我们只是为了满足老板的虚荣心:看到8:30时园区里最亮的那一层,让老板从潜意识里认为自己是互联网公司老总?我想有这层原因,但更深层次的目的是:控制。还记得来的时候这种留下来的行为叫“学习”,可是我晚上闲的时候真的拿起了书,为什么忽然就“有活儿干”了?是怕老板认为部门很闲?有钉钉不用,隔三岔五逼我摘下耳机给我安排鸡毛蒜皮小事?你在怕什么?

从“松紧制”实行后,就没松下来,一忙“忙”到了四月,但感觉干的活反而少了。4月的版本发布后,客户导入了远超设计考虑的数据,结果卡的系统进不去。回来后,主管又说出了第二句名言:“你们开发难道对技术没有敏感性吗,你们来这儿难道是为了赚钱?”。hhhhh我啸了,你呢?很早我就说过分库分表的问题,说过部分代码要花时间重构,不让改是你,让改也是你。合着你的目的是:想要系统稳定运行,又不愿意承担责任?可是世界上,哪有身居高位、拿着高薪、不需要担责任的活儿啊,“高处不胜寒”,懂?4月来了个做CV的研究生实习生,正好我们系统有自动识别和归类图片的需求,让研究生写了个分类器。结果让人家自己一个人爬图片,自己训练模型,自己评估,还给我们封装SDK。完事了还怪人家识别的不准。产品事先不做任何识别准确性评估,等我们这Springboot调用识别模块开发集成好了再把功能直接砍掉,让我们这个月等于啥都没干,于是又有理由加班了,嘿嘿。

我还没去过福报厂,却吃到了PUA:产品和主管一唱一和演双簧:“还好加班,不然路上堵车都回不去”,我都替你们尴尬;还没去过国企,却吃到了国企的官僚:大领导来讲话你还敢来不听?没去过牢厂,却感受到了部门之间沟通效率之低下。一份工作,三分经验,吃到我撑。

公司对自己人的操作秀到飞起:

休息日还要求加班,园区修路导致同事迟到,他拿着额外加班去抵扣却被告知“主管没有申请加班,不算加班”,秀啊。

偷偷改钉钉考勤规则,抽几天考勤规则改成中午也要打卡,导致当天考勤旷工(算0小时),成功拉低工作时间统计,秀啊。

把技术支持出差装系统的活推给部门的人去干,部门有人出差算0工时,借此拉低部门加班时间,秀啊。

这些对付自己人的点子花在项目上,东西能做成这样么?被20人规模的小公司的产品超过,很意外吗?这项目拉一个人独立写前后端,或许3个月能写出个更好的,真就3个和尚没水喝?

我和同事开玩笑道:我们项目开始走下坡路始于年初,年初做上传进度条做了一个月,老板不开心了,之后越加班效率越低。可是为什么会做这么久呢,产品不该掺和开发?还是开发偷懒?二者兼而有之。不合理的加班制度催生了第二点,缺席的培养机制催生了第一点。还记得我来时提过的唯二的问题吗,现在得到了回答。我至今不能理解,这个公司是这么有脸理直气壮的在招聘宣传上造假,把大小周吹成双休,把体系化的加班吹成“偶尔加班”,把CRUD单机项目吹成大数据,把打杂鼓吹成“培养”来诈骗应届生————或许他们本来就不需要招人,本来就是骗应届补贴的?真如主管所说公司靠老板人脉吃饭,大概率我们都只是来配合老板演戏的小丑。

系统中上传需要的本地程序是隔壁C++组写的,自我参与项目后便一直听到同事抱怨隔壁写的东西有BUG,上传速度贼慢。可是主管只让自查,又不愿问问隔壁要代码。是哦,部门之间多一事不如少一事,人家有BUG,怎么能让高贵的C++程序员改呢?小的不冤,是写C++的老爷冤!小的不应该DEBUG用Wireshark抓包,才无意发现了写C++老爷的BUG,小的该死,小的这就去兼容他的BUG!。谈到项目改进目标时就开始讲:“这项目还是要看隔壁C++组做数据采集的,他们采的全卖的就好”,合着我们组干啥也是全部木大木大木大木大,那你们招Java干嘛呢,招个机器人只要交点电费不就好了吗?还能无限加班听老板画大饼。

在公司一半时间听产品和老油条吵架,一半时间帮运维干活。项目用到了一大堆组件:nginx、node koa、tomcat、springboot、rabbitmq、erlang、redis、mysql、zookeeper……我一个开发自己都得装办小时,而那些非科班的运维就更离谱。运维大概是没有做过任何培训,只会照着开发给的安装手册敲,甚至看不懂报错,例如:cd cloudpluss如果敲成cd cloudplus,他们不顾cd: no such file or directory: cloudplus的报错会一直敲下去。于是这样运维出去装系统的时候都成了开发的噩梦,运气好一点:开发需要远程开着向日葵帮运维干活,运气差一点:客户不让用外网,运维拍照让开发解决问题。我接触到的运维基本上都是就装几个组件,然后把烂摊子交给开发收拾,装一半让你去解决问题往往比让你从头安装更恶心人,经常如此一整天就浪费掉了(好耶,0产出,加班加班)。作为开发我也是觉得系统难装,安装文档写的稀烂不说,很多组件都是不必要的。前端部署在tomcat上,静态资源(附件)部署在nginx上,下载资源为了改个HTTP Response Header居然单独用node + Koa!经过我一顿修改,前端,静态资源,下载都通过nginx解决,一下省去了安装node和tomcat。rabbitmq实现两个服务的解耦,只定义了几个channel,我们这么点qps杀鸡焉用牛刀?于是自己在Springboot里写了个轻量级JSON RPC调用框架,用对象JSON序列化反序列化,依赖HTTP请求实现RPC,这下干掉了rabbitmq,顺带干掉了Erlang。因为项目有个位数的接口用到了Dubbo的RPC,而Zookeeper只是为Dubbo装的,这部分也迁移到自己实现的JSON RPC后成功干掉Zookeeper。这么一来系统简洁多了,只剩下nginx、springboot、mysql、redis。我写了个脚本一键安装,然后就可以喝杯咖啡等5分钟看结果了。本想推广自动化安装,提出来很多方案如docker,打iso镜像、打vmdk镜像、用shell脚本,都被主管拒绝了,原因是“不给运维锻炼的机会”。可是我看运维也没能得到锻炼,倒是我们自己得到了锻炼,如果运维出差只要跑个脚本就行,那么以后系统装不成功岂不是就没法甩锅了?最终,我还是偷偷做了个脚本交给了隔壁运维的某人,不知道他们用的如何,我是感觉从此以后他们似乎骚扰我的频率下降了不少。针对安装文档稀烂的原因,我觉得是文档还在用xml写,没人愿意维护,于是提出来用markdown重写。我自己开了个头选了模板,写了markdown的pandoc编译脚本,但是无人响应,加上主管也不支持,于是重构文档不了了之。

前期我还做一些Java相关的活:维护Solr模块、正则提取敏感信息、数据挖掘,后期基本上就只用Python做数据导入了,这时候遇到了项目期间最棘手也是最滑稽的一个BUG。我们用户上传的文件有两种,一种是目录,一种是压缩包,无论哪种都有十多GB。上传是通过本地上传程序实现的(把本地文件拷贝到远端SMB服务的某个目录),上传完成后触发解析。判断一个上传任务完成居然是Python这边进行的,之前人做的判断原理是:监听任务目录大小,60s不改变了就认为上传完成了,然后解压或者直接解析。我们发现上传压缩包经常会解压失败(文件损坏),一开始主管觉得是我Python写的不对,他也说不出哪里不对,直到后来我灵光一现把解压失败的压缩包用Hex Editor打开,发现文件后半段全是0,这才意识到问题。原来SMB上传文件到Linux会先创建stat,分配磁盘空间写0,然后异步拷贝。这就导致了上传目录时,拷贝的都是小文件,60s可以够小文件拷贝成功,而上传压缩包这种大文件60s内是无法拷贝完成的。面对十多GB的压缩包,SMB会先创建文件并写0,然后文件大小就不在变化了,但是实际拷贝会持续远超60s,于是执行后续流程解压的时候文件大概率是损坏的。跟主管报告了这个问题,他来了一句:“我就说是这问题嘛”,给我整的目瞪口呆。关于解决这个问题,必须更换检测上传完成的方法,这肯定要修改本地上传程序要它主动通知。由于涉及到隔壁C++组,主管又开始让我们兼容BUG,他告诉我:“客户网络是万兆网,什么文件都一秒传完,没这个问题”。

后来全部数据解析模块都迁移到了我这里,之前Java里那1w行的屎山终于可以删掉了。为了Python这里实现数据解析,我利用Python的函数式编程特性,将数据处理逻辑函数写进了配置,自己写个框架就行,教会测试后让他帮我写数据处理配置,这一下就轻松了很多。这样干掉了大量的if语句,还能更快速定位问题的源头。公司能采集到的数据不全,于是想着去逆向其他厂商的数据格式并提供大一统平台的确是个不错的思路,可是公司不愿购买一套其他厂商的产品,也不让运维部门提供完整的数据样本,逆向也不能对着空气虚空逆向吧?最终就是数据根本导不全。

要不是4月遇到了一位志同道合、有点技术追求的苏宁老哥,也许我4月就打算拍拍屁股走人了,他的加入使我一度觉得这项目还有救。然而四月底,老板又是一顿喷,主管使用了最终大招:“要么封闭式开发,要么彻底996”。我选择第三条:拜拜了宁勒。好像是老板嗅到了什么,提出了加薪,我在第二天,交上了《离职告知书》。我相信这是一次正确的决定,要我说我这6个月做错了什么,那就是到现在才意识到问题:整个公司就是建立在诈骗上的:招聘写双休955,来了变大小周,一周变976,一个月变986,再往后996,等我接受了996,是不是还要我接受封闭式开发?976的时候亏了钱,996的时候亏了身体,等真被骗去“封闭式”,怕是进了传销窝小命不保。

还记得交离职报告那个早上,人事先是一惊,旋即让我找领导同意。我告诉他,我不需要领导同意。在她坚持不收的时候,我严词告诉她:“我觉得这是你的责任,无论领导同不同意,你都要收下”。随后主管和我谈话,说人事认为我刚才很“生气”,我否认了。但真不生气是不可能的:“都摊牌了还要骗人吗?”。如果你以为《离职告知书》还要申请同意,我认为你身为人事业务不精,是蠢;如果你知道它的涵义,还要我去“申请”,那就是坏。

晚上,人事老大找我,我以为要谈交接,结果她问:“你剩下一个月能不能继续加班?不然会打击他们的士气”,听完我血压都上来了:毕竟我不能影响一个不存在的东西。但是最后一个月,我还是加了大半个月的班,这次我倒是主动的,原因是最后一个月接手了隔壁C++组写的本地Qt程序,找到了有意义的事情可以干了。我在本地程序上加了些新功能,还用Go重写了一份(完事后我才发现C++组的写的东西混乱程度和我们也五五开嘛,可能也是加班搞的?)用Go重写了隔壁的项目后,才发现以往的上传速度真不能怪网速,不是运维接错了千兆网网口,而是代码太垃。重写后的本地程序修复了拖了6个月的BUG,还支持了数据厂商类型的自动检测,希望这可以节约下一波接盘该系统的人时间,让下一波人不要因为测试传错了包互相扯皮。此外还大大优化了上传和解析流程,原来遇到十多G的数据要半小时才能完成上传和解析,如今上传和解析异步执行,同样的任务甚至1分钟就可完成,这让我在表演加班和维护屎山几个月后感受到久违的成就感。离职后我在家从头写了一个功能加强版的超大文件通用上传器smb-uploader,额外支持了断点续传、托盘、进度显示。

最后一个月和第一个月,是最快乐两个月,第一个月是新鲜感的快乐,最后一个月便是找回自我的快乐。

有所思

我感觉,我还是幸运的。在这个大环境下,我至少干着自己喜欢的事,还没有柴米油盐之愁,没有房贷,不是必须要修福报。在我大学四年和工作所见的同学同事中,大多入行计算机只是为了生活罢了,能乐在自己喜欢的行业中何其幸运。高中的时候,父母让我读金融,我说:那都是操作资本,收割大众的行业,我没兴趣,我要做能够创造价值,惠及大众的职业。我觉得计算机行业的伟大之处是他创造的生产力融入各行各业,解放劳动力,从而给予个体更多自我发展的机会。作为程序员,我乐意看到自己做出的东西节约了一个群体的时间,而认识到时间的宝贵也使我厌恶他人浪费我自己的时间。我在这两二家公司做了事,浪费了自己的时间,也没能节约别人的时间,这是我必须要离开的一个原因。

都说必然性寓于偶然性之间,并通过偶然性表现出来。连吃两次亏已经不再是偶然了,而是存在必然,究其根本还是我个人性格的弱点:太唯意志了,就是自负、轻选择、重努力。在学校时,各门实验课上我从不挑队友,总觉得求人不如求己,相信自己能卷,能摆平一切。于是到了社会,我也是这种学生思维,天真的觉得:小公司又有啥?还是要靠个人努力。直到设身处地才知个人在这荒诞现实中的渺小。

塞翁失马,焉知非福。相比那些依然身处象牙塔的同学们,我浪费了不少时间,但社会,何尝不是一所大学呢。

后话

后来,听人说,第一家公司的那主管被公司开了,不知道是公司要上市的原因还是他自己的原因。

后来,第二家公司人事找我谈话,说知乎上关于公司的恶评影响到了招聘。我告诉他:我当初看过言辞更激烈的,我不还是来了,但你们留住我了吗?(如今我觉得她可能怀疑是我写的)

后来,听同事讲,项目要黄了。有点开心,也有点难过,毕竟是自己付出心血的东西。

再后来,测试也走了,据说部门拆了,估计是没招到人,也许是老板的耐心达到了极限。

离职后在看准网上才发现各种负面评价,其中一条还是南大某同学写的,他是这个项目的上一波人。看他字里行间控诉公司这种骚操作,如同在看自己的经历,此时此刻,恰如彼时比刻。一波一波人重复新的轮回,每年都会有新鲜的应届生被收割。不光是我们来了没多久,其实我们主管也是新来不久的啊,这流动性简直了。同事曾告诉我,干的越快,老板炒你越快,之前一组没能消化老板的大饼,集体跑路了,或许是我的这位主管大智大慧,怕发挥全部实力容易被老板迅速榨干价值然后开除呢?(笑)

离职半年,那个让我离职期间继续加班的HR,他的钉钉认证也消失了,它在我之后来,一年也没干满。她也和我抱怨过工作难做人难招,自己上有老下有小。原来每个人都不容易啊。可能老板觉得:“我这么好生待你们,你们写出这狗屎了对得起我吗”;可能主管觉得:“之前一组没干下去,都是老板贪得无厌”。一方是迷茫的投资者,一方是面临中年危机只想安稳混日子的人。到底是谁的问题呢?或者说,他们都没问题?

Disqus评论区没有正常加载,请使用科学上网