不知不觉间,在现在这家公司已经工作了一年多的时间,中间正好跨越了一个绩效考核周期。

其实还是挺在乎这个绩效考核的结果的。倒不是因为绩效跟工资挂钩,会影响收入,而是比较看重公司(或是准确地说是看重领导)对我工作能力与态度的评价。

周五领导跟我进行了绩效面谈,从面谈结果知道领导对我的工作还是很满意的。虽然今年部门整体绩效水平不高,但是我的绩效在部门内部还是属于比较高的水平。能有这样,我就很知足了。工作这么多年,我已经对收入什么的都看得很淡了,只在意一点,那就是:领导对自己工作能力的认可程度。

这时,不由得想起了在上家公司的工作经历:在上家公司工作一年半,个人认为自己的工作能力已经在工作中体现出来了,而且工作成果也拿得出手,但就是没办法获得我的上级领导(CTO)的认可。他在2021年年终绩效评定的时候,给我打了一个组内最低绩效C。这个绩效如果再降一等,按公司规定就得被辞退了。这个C级绩效,按公司制度,得降薪。我实在无法忍受这样的结果,就愤然裸辞了。对一个年过40,还一直在一线进行编程工作的人来说,裸辞是非常危险的,因为一旦裸辞,可能很长时间或是说再也找不到工作了,将面临失业的风险。但我在综合考虑之后,还是决定裸辞了,一是面子根本挂不住,二是领导对我的那个态度也让人受不了,后面的时间,上班跟上坟一个感觉,不想再浪费时间了。

详细描述一下我在上家公司的工作经历。

我所在的部门是技术实验室。通过名字就能知道,它主要是做一些比较前沿技术的预研的。公司所属的行业是云计算行业,所有的云计算公司,又都会用到一个软件叫qemu。它是一款虚拟机软件,它能模拟多种硬件环境的能力,从而可以在qemu软件上,安装不同的操作系统,是云计算公司主要的硬件虚拟化软件。我去公司的唯一任务,就是预研如何实现qemu下的windows系统下的显卡驱动,使虚拟显卡具有3D加速能力,可以支持OpenGL及DirectX的程序运行。

其实有过相关工作经历的朋友一定知道,这件事的难度该有多大,主要技术难点如下:

  1. windows显卡驱动的技术规范没有完全公开,微软只向几个显卡大厂开放了相关的技术规范文档。
  2. 微软没有完全开放显卡硬件技术规范,也只有那几个显卡大厂清楚技术细节,qemu想模拟,都无从下手。

我刚开始接到这个任务的时候,人都是蒙的,我以为微软开放了显卡驱动的所有技术细节,我只要努力研究与学习,就可以把相关的技术细节都搞清楚,实现相关的功能只是时间问题,可是现实并不是如此。

目前在全球有windows平台下虚拟显卡驱动实现能力的公司或组织,也就微软,NVIDIA,AMD,Intel,VirtualBox及vmWare。其中有实际产品的,就vmWare与VirtualBox,也许微软有实际产品,但我没有接触过。这些公司全都是IT界赫赫有名的大厂,国内目前没有一家公司有相关产品。其实也并不是在国内没这个需要,而是有非常大的需求量。如果你卖的云主机所在的行业,对3D加速能力有要求,例如要运行DirectX或是OpenGL程序的话,那么如果你用的qemu这个软件模拟出来的windows系统里的显卡,没有3D加速能力的话,你的这个云主机方案就不能在这样的行业推广。现在业内遇到这种情况的解决方案,就是使用NVIDIA的vGPU方案,这个方案是由特殊的硬件显卡加上特殊的显卡驱动配合在一起去完成相应的功能的。这些个云服务的提供商,要为这种使用方式,向NVIDA交授权费。

我在毫无相关技术背景的情况下,花了一年半的时间(其实准确说是一年,因为有半年,技术方向搞错了,浪费了半年时间,但是有些技术被我拿到了后面的方案里面使用,所以我仍然认为是花了一年半时间),让qemu里面的virtIO显卡驱动,在windows 7下可以运行一些简单的DirectX与OpenGL程序,Google Earth可以基本正常地在DirectX模式下运行,OpenGL模式下会有一个蓝色的底色无法去掉,其它方面功能正常。DirectX SDK里面的DirectX9的演示程序,大多数都可以正常运行,同样硬件3D加速能力,是VirtualBox的一倍,比如说同一个场景,同样的硬件,VirtualBox运行测试程序可以跑20帧,我的qemu下的驱动就可以跑40帧。

显卡驱动从来都不是一个人可以完成的项目,况且我这个还是虚拟显卡驱动,我需要处理原来需要硬件工程师参与处理的一些工作,所以一年半了,这个驱动还是无法达到商用的水平,BUG多,同时对全屏模式下的3D程序支持的不够好,也不支持win10的系统,因为win10的系统桌面本身运行,就是一个全屏的DirectX的程序。我最初以为这个项目只是个实验性质的项目,因为公司里谁也不知道这个驱动应该怎么弄,所以如果我能拿出一个demo出来,那么就会有更多的工程师参与到这个项目中来,可惜一直到我决定离开,都没有人深度参与这个项目。

由于这个驱动搞了这么久,仍然不能商用,所以我公司的CTO就给我打了个C的绩效,我对这个绩效不满意。按公司相关的规定,被打了绩效后是需要跟员工进行沟通的,我打算在沟通的时候,好好跟CTO沟通一下我的绩效问题,可是一直到过年,他都没有找我沟通绩效问题。过年后,我见他还不找我沟通,我就先去找了一下我们研发副总聊,聊完研发副总的意思是他相信CTO对我的评价是公正的,我可以找CTO去聊一下,如果中间有什么误会,他是可以介入的。研发副总这样一个态度,我就知道这事不好弄了,后面的事果然应证了我的猜测。

我第二天就找了个机会去找CTO,表示要跟他聊一下我的绩效问题。我怕聊的过程中有些事说不清楚,也防止他给我穿小鞋,我是开着手机录音,然后去找的CTO,然后我们就在某会议室进行了近1个小时的沟通。

我问他:“为什么给我打了一个这么低的绩效?”
他说:“主要是你的驱动功能没有完成。”
我反驳说:“这个评判标准有问题。首先目前国内没有任何公司有这个技术能力完成这项功能,我凭一己之力,已经把demo搞出来了,已经有阶段性的成果了。再说了,显卡驱动项目,本来就不是一个人可以完成的项目,我一个人做到现在这个程度,已经很可以了,以这一点对我进行评判是不合适的。”
我接着说:“我这个人,只知道做技术,没有心计,你不是信任L某么?你还记得不记得,当他在你要求让他来接手这个项目的时候,第一反应是什么?他当时就说:‘我手里还有其它任务,我要搞这个事,就不知道什么时候能出来了!’他们都是聪明人,就我这个人老实,你这不是欺负老实人么?”
我这样反驳后,他又补充说:“你在开发过程中对项目信心不足,这是我不喜欢的。你之前不是说XXX功能很难么,怎么我一介入就解决了呢?”
我解释到:“这个事又是你搞错了。我对项目的难度的评价,是我基于对项目的理解。你参与实现的那个功能,我当时也是奇怪,为什么这样简单几下就能解决了呢?这个情况,以我对这个项目的了解程度,是不应该发生的。后来我仔细测试了一下你实现的那个功能,它只能在某些特定情况下工作正常,但是在另外的情况下,它就工作不正常,我当时还把测试结果给你看了,你还记得不?以我对项目的了解,这么实现这个功能肯定不行,这不符合整个软件的架构,哪怕你功能完成了99%,有1%情况,你处理不了,你这个功能也不能叫完成啊。再说我之前评估项目的研发进度,时间是非常准的。不管你承不承认,项目的研发进度,一直是按着我评估的时间走的,并没有按照你评估的时间走,同时我也没有在项目中偷懒,不是么?”
经过这样的谈话后,他可能也感觉到我这个人不是这么好糊弄的,就又补充道:“我就是不知道为什么,怎么跟你合作就这么难?”
我说:“你能说具体的事么,你这样做结论,但是没有具体事实支撑,不太合适吧?”
他想了一会儿,说:“你在项目开发过程中不愿意听我的建议。”
我回答道:“我不是个固执的人,只要建议是合理的,我肯定接受。”
接着我举了两个例子,第一个例子我对他说:“我不知道在windows内核态,可以直接将用户态的一个地址直接映射后,在内核态拷贝里面的内容。在Linux下,这种操作是要进行地址转换,然后再操作的。我知道你说的这种方式后,马上进行了学习,然后采纳了你的建议,使用了这种方式读取用户态的数据。”
另外个例子,我说:“我没有按你的建议使用你设计的内存分配与管理算法,而是坚持要自己设计一个,是因为我已经明显感知到了你算法设计的随意及不合理,我坚持自己设计是因为我认为一定存在一个比你的算法要好的算法。而且事实证明也我用了三天设计与实现的内存分配与管理算法,除了理解上不太直观以外,在性能及内存访问越界时对程序运行产品影响方面,都比你的算法要优秀。我的算法在绝大多数情况下的效率都是O(1),极端情况下才是O(n),并且你设计的算法,把管理结构跟数据区放在一起,当数据区被误操作后,会影响到管理结构的正确性,从而来带来灾难性的后果,定位BUG也非常不好定位。”
后来CTO实在没办法了,便使出了对任何人都管用的杀手锏,他说:“你上班的时间玩了手机的。”
这个杀手锏是我没有想到的,我愣了一会儿,然后我说:“我承认我上班时间用手机处理过私事,但是这是全体员工的共性,并不是我一个人的问题,你拿共性东西来说事,这是不合理的,但是我接受。不过我要补充一点儿,我有时候用手机,也是处理公司上的事。我在项目遇到困难的时候,我动用过关系去问过NVIDIA的人,看能否问到点儿技术细节。虽然最终还是自己解决的,NVIDIA的人没有帮上忙,但我确实是用手机处理过公司上的事。你既然把话都说到这个份儿上了,那我也没什么话好说,这个绩效结果,我接受,没什么可聊的了。”

其实我后来想了一下,这个CTO不喜欢我,确实是因为我犯了“不给领导面子,领导的错误马上指出来”的职场大忌。我感觉他总想在一些场合来秀一下他的技术水平,但是又正好遇到我比他懂的情况,所以几次都弄的他有点儿下不来台,从而就产生了对我的厌恶感。我对技术比较较真,遇到明显的错误,我确实会据理力争。

不过也无所谓了,我就是这样的一个人,如果我能处事圆滑,早就是另外一种生活了,也不会这么大年纪了,仍然在写码第一线写码,哈哈。

我离开上家公司的时候,我怕他们把显卡驱动完成不了的责任推到我一个人身上,说我没有做好交接或是之类的问题,也是对我之前所做工作的总结(我职业生涯做过的最难的项目,没有之一),我在走的时候,给他们写了一份4万多字的文档,把我所知道的相关技术细节,详细地进行了叙述,还用了两个PPT文档做题纲,同时对关键技术细节也着重进行了介绍,告诉了我是怎么解决的,依据是什么,相关的资料都是在哪里查到的。

我是2021年的3月底离职的,我在2022年9月份的时候还问了一下原公司同事,这个显卡驱动仍然处于开发状态,还是没有形成正式产品。