[2020.05初写] 这些天有些空闲,觉得应该把近些年的工作经验记下来,等年龄大了自己回头再看看也是比较有趣。 文字功夫很差,高考语文没有及格,准备采用流水账的方式瞎写,为避免无聊的麻烦,公司名称虚构,专业术语虚构,本故事纯属虚构.
-
98年毕业后,开始了程序员的生涯,那时程序员还是比较容易找工作的,陆陆续续进入了各种行业的开发, 公安、交通、外贸、房产...,主要是管理信息系统方面,技术栈主要是各种流行的数据库跟GIS,话说当时也都能玩的转,主要开发工具是Powerbuilder/Delphi/ Mapinfo。 02年左右,工作之余为提高编程能力用PB写了一个数据窗口设计器,10万行代码左右,当时正好Sybase中国公司在搞开发比赛,就直接拿去参赛了,后来公布成绩应该是第10名左右,当时也是蛮高兴的。(代码还在家里的老台式机硬盘里面,如果有人要可以联系我)。
-
时间继续走,来到了05年,这一年所在的公司走了下坡路,估计比较难维持了,我准备找下家,老板是科大的博士,人非常好,主动帮忙联系了一家电信下面的公司HX(就在家门口),过了笔试应该就差不多了,还好平时在工作之余C/C++/Java都有在学习,非常顺利的进入国企,开始了C程序猿生涯。话说国企也真的是好舒服,一到下午下班时间,公司的大门就要关了,你想加班估计还要跟提前跟保安打好招呼,在这里除了钱少一切都好。好吧开始悠闲的安心工作吧,在这里主要是维护老的电信软件系统,其实都没有什么难度,主要难度在于早期的开发人员把数据字典设计的有点让你看不懂,这也没什么,多看多问也就是了。 读代码的过程中发现电信代码简直是一坨哎你知道的, 代码巨大,没什么注释,到处充满了C/C++跟嵌入式SQL的混用,也只有一直在这里工作的老家伙才明白程序是在干什么。好吧那就玩点别的吧,空闲时间比较多,于是仿照Java iBatis用C++写了一个持久层的简单框架,起码能把C++中的各种嵌入式SQL给抽出来,这样即使业务变动了,也大概率可以做到不用编译整个C++服务。技术老板也比较支持,抓了好多开发骨干来评估这个小框架,让我给大家介绍。介绍时我突然发现大家的目光是呆滞的,几乎没有人在想,事后我想,这样搞应该是加大了别人的学习力度(我嵌入式SQL玩的这么好,无缘无故来跟你学持久层框架),框架的事不了了之。搞业务都是老家伙的事,搞技术小P们也无门,此时,呵呵,想走了.
-
06年,机缘巧合,同学J推荐我去他们的台资公司M笔试(公司又在家门口),没有出什么意外,顺利的过了笔试面试,到最后才处了一点小岔子,负责技术的大老板HAI说我有点不乖,跳槽的比较频繁,我给了他一个坚定的眼神,并且请老板放心,保证5-10年左右不会再动,老板最后笑了笑还是要了我,事实证明我做到了,接下来13年我都在为这个公司卖那个不值钱的命,最好的青春也都给了这个烂公司,同学J居然后来也把我给坑了。
进入了骚骚跨国外企M,开启了新的篇章,工作范围是数字电视,代号06016/40117。目标重新设定,好好学习认真干活,挣钱养家。
-
06年,拿到部分总部的HW API,开始做一个simulate项目,主要目标是:在没有硬件开发板的情况下,RD在桌面端可以用这个simulate来开发和验证。我的部分是一个RTC的驱动模拟,当时同事都用Visual C++开发,我也现学了一下VC,还开发一个Remote Control的模拟器,后来这个项目貌似是被抛弃了,因为后来很快总部把真正的开发板陆续的寄了过来,那模拟器也就没什么用了。
-
07年,公司开始启动一个Low Cost项目,LM主管拉我进去。认识了牛逼的春哥,春负责做WGL,我用他的WGL库来开发Menu APP,就是家里遥控器按Menu出来的那个东西。美好的记忆,跟春配合很愉快,春也是我觉得公司里面为数不多的有正义感的有为青年之一。
-
08-12年,HF分公司这边陆陆续续开始接手总部的MW Module,我接到了一个E.V.C.T.X module的维护和开发任务,这个Module简而言之就是分析出信号线中传输的节目数据并给到AP展示,这个module的地位非常重要,产品要想销售到欧美市场必须要过很多很多认证,每年都有很多相关的认证跟这个module相关。这个Module的代码也只能用呵呵来描述了,效率差这个问题一直都是存在的,关键是对于一些非标准的数据就无效了,牛逼的是有些认证机构会特意的制作一些非标码流来测试产品,对比其他公司的产品却可以完美的解析码流,而我们的代码中却死死把自己的功能给限制住了,完全没有扩展的机会,这个问题属于从一开始设计就存在的架构问题,于是可苦逼了我,出了问题后我得花费大量的时间一次次的分析码流,一次次的写出各种分析报告给客户看,告诉他们是因为码流的数据不对而不是我们无能,时间长了连客户都开始烦了,客户质问我们为什么别家的产品可以而你们的却这么烂。我这边也只能苦笑,总部的Fan也很了解这边的痛苦。于是我们私下讨论过干脆把这个Module推倒重写,当时的我干劲冲天直接就答应了。
恰巧,HF这边第一次有了TW总部的同事来挂职当领导,RDO是个帅气的领导,知悉我要改写这个重要的Module,给我了巨大的支持,在重写的过程中RDO让我拔了电话线,所有要找我的人都先找他,这样大约2到3周的时间主体部分基本写完了。这么多年一直也没学会吹牛逼这个技巧,做完后我只是淡淡的写了封邮件抄送了相关人员,这一年绩效不错拿到了100分,年底还多拿了一些奖金,总之感觉一切都好。后来关于这个Module的认证问题也就越来越少了,问题少后上级领导自然也会少注意到这个module。
穿插介绍一下这个牛逼外资公司HF分公司的背景,HF这边基本上还是本地化管理,几乎所有的小领导都来源于HF工业大学/安徽大学,在这里小领导也称之为2级(简称2),通常一个2下面会有10来个屌丝开发人员,也称之为苦逼RD,2的上面是1级,1基本上是凤毛麟角了,混到这个级别基本是登天了。2基本是不用写代码的,主要工作是开会、看小说、逛电商买东西、讲热门话题、投资、健身。他们的技术档次,呵呵,也只能用呵呵了,他们除了全心全意的去迎合自己的上级领导之外也就是不停的接受下面RD的迎合了,也就是他们口中的玩政治,他们根本没有时间去关心代码方面的事。公司每年都有绩效考核,按道理应该仔细考核下面人都干了些什么,其实不然,我坚信公司的Git上很多2根本都没有账号,有账号也会多年不上,谁谁谁写了什么?写的怎么样?花费了多少精力,解决了多少问题?他们完全是根据自己的感觉决定,谁他妈迎合自己、傍自己大腿谁的绩效就好,在RD口中他们被称之为A老板B老板。在公司这么多年,我相信99%的2s都没有能力在开发板上跑起来一个Hello World,吹起牛B来都是顶尖级高手。这些2们大部分年资很老,公司成立时就来了,虽然没什么技术本领但是凭借自己的资历也混到了2级,还有一部分人是由于公司扩大从屌丝RD升级上来的,这帮人还是有一定的技术背景,起码在某个module上算是顶尖级,进入2这个圈子之后他们也就渐渐的被同化了,变成了真正的2。所以到这里基本能看出来其实外资也不是一个靠本领吃饭的地方,真正有本领的人将永远永远在最底层,因为有本领的人是很难做到去迎合2的喜好、去抱2的大腿。
下面再聊聊屌丝RD,最苦逼的就算是这群人了,我也在里面。通常情况下一个RD同时会维护开发多个module,资本家会尽可能的利用你的价值,这点可以理解,估计哪里都一样。但是在这里大部分RD的工作状态可以用心力交瘁混吃等死来形容,在工作中听到最多的是RD的叹息声,RD头发的日渐减少、变白是常态。为什么会这样?因为工作完全是痛苦的扭曲的,RD的工作是被2指派的,这是一帮什么样的人上面已经说过了,除了技术相关的是2不关心的外其他都是他们care的因素,稍微有点年资的RD也深知这个问题,所以还有谁会去好好研究技术呢?没有人去想着把自己module变得更好、更容易维护、更优雅,这些根本就进不了公司评价RD的标准,相反如果有些傻逼RD做的太好了那就会得到更多的工作,薪水也没有多拿反而把自己累死了。在这些因素的影响下,你不叹气也没有用。记得第一次拿到EVC..这个module的源代码,即使还是年轻的我也被惊呆了,整个套路是没有大问题的,但是拉屎的痕迹随处可见,比如一个Function 7000多行,if 跟下一个if else隔了1000多行,在某一个判断分支里面还会有2~3个for 循环嵌套,更崩溃的是代码居然没有有效注释,再有受不了的是代码的缩进有空格有TAB,非常没有规矩,当然这都是RD们一代代拉出来的,到了我们这代维护能做什么呢?痛定思痛后,显然我们不会去做重构,因为做这件事除了满足自己的欲望增加很多加班时间外没有任何好处,去跟2谈的话100%会被呛,2会说“嗯,这件事产生不了短期效益,最好不要做,另外自己其他的事也要做好”,所以通常RD会放弃重构的想法。虽然维护的工作变得非常累、可怕、不可控但也没有办法,只好继续拉屎,当出现bug要修改code后,RD会很小心的在超级复杂的代码中再写一个else if (...)。这个(...)中的条件会复杂到让人惊叹,&& || 函数调用 混合判断的逻辑加在一起超过20行。如此,每一个Module在经过时间的考验后变得臃肿不堪,RD一代比一代更痛苦,代码一代比一代更复杂,重构的希望一代比一代更渺茫,恶性循环下去,会死在那一代?不知道,反正也没人care这件事。在这种恶劣的大环境下有些RD就开始突破了,他们开始傍2的大腿,想办法把自己手上的事情transfer给其他的RD,尽可能的去搞一些类似PPT EXCEL的活,多多的曝光在领导的范围内,在2的提拔下,当有空位子出来后他们就顺利上位,从此摆脱屌丝RD的痛苦生活。背景介绍完毕。
这期间同时维护的Module还有PA. SECA. Engine & DVB..SI & DT & T.B.L. Mngr,这些Module还好,问题都不算太多,大多都是复制出问题后从海量的log中分析问题点后再找上下游的Module Owner讨论,最后成功的甩锅给别人:)。 这期间值得一提的是12年左右,在DVB..SI的问题上,有很多人找我来澄清码流中的问题,没办法,我这边是拿到的是数字码流中的基础底层数据,查问题只有从我这里开始,对于各种非标的码流还需要具体分析到具体数据传输的时间点,用于跟SPEC规定的做比较,当时市面上还没有完全能达到要求的工具,由于对这个需求相当了解,所以决定在家花点时间做一个,全当学习和练手。一开始就萌发了一点开源的想法,所以决定把这个工具设计的有趣一些。大概需求是:做数字电视有相当多的SPEC,这些SPEC中会有非常多的描述信息定义,这些定义基本都用伪代码描述,有点类似C语言,RD们会根据这些描述写代码来获取码流中的相关信息,在结合自己业务去处理。我给自己定的目标是:从SPEC中copy出相关的描述伪代码作为基础资源,用词法语法分析器分析伪代码(Antlr)并且翻译成Java源代码->在运行时编译Java代码为class字节码再装载进JVM(Janino)->根据给定码流产生结果数据以Web形式展示。 这个项目大约断断续续花费了2年的时间,如果有空每天抽出1-2个小时编写。 14年左右开源到GitHub (已闭源) 目前修改为 dvbsi4j。 同期,工作中经常要用串口跟嵌入式设备发送交互式命令,这些命令之间可能存在上下文关系,比如命令2的组成需要依赖命令1的返回结果中的数据,为了满足自动化需求就需要有工具来帮忙,网上又没有类似的工具,于是决定写一个,14年左右开源到GitHub JavaSerialPort。 -
13年,公司开始走Android TV,需要把原有的linux下实现的功能对上提供Android服务,MW这层由我来探路,MW之上由春哥负责,很愉快又跟春再次共事,春哥的Common logic 给AP开发提供了极大的便利一如既往的牛逼,我也不能瞎搞,当时考虑到Google后期更新Framework可能会来带麻烦,后来只在Framework层增加了一行代码把 TV Service给加了进去, TV Service的部分精心的设计了一个极简且容易扩展的架构,用AIDL给Common logic提供RPC接口,TVM设计Callback机制让上层可以得到通知。由于之前Linux的代码都是用C写的,LM老板非常担心JNI的部分,我就设计了一个TV JNI的框架,这个框架应该让RD很少有机会犯错,因为在编译期就能发现问题,为此还写了图文并茂的文档(墨宝请同事收藏,以后有机会再发给我看看)。在Android TV上除了定制架构外,还担任了2个TV Service的Coding工作(EPG & Analog Channel manager),好像一直没有歇息过,一直是在忙碌中...但愿有付出就有回报吧!!!
-
14年吧,记不太清了,还是忙的一P,Android TV Framework/ EPG service/ Analog channel service/ DVBSI/ TBL MNGR/ EDB/ 动不动还要出个差,这一年徒弟离开公司了,徒弟离职我是支持的,大好的青春没必要在这里耽误,徒弟是东北汉子,人高马不大,卷毛,面部有棱角,典型的美男子,徒弟明智的技术移民到新西兰,赞,非常牛B。徒弟的工作暂时回到我手中,此时帅气的RDO又给我接了个活:HBB..TV,这个里面关于EPG的部分非常复杂,我也只能接下了。 此时感觉人身到达了巅峰。这年好像绩效也还好吧,记不清了。转眼间RDO从TW到HF已经2年了,他要回去了,呵呵,有个2的位子出来了,没什么争议J顺利的顶了上去,J和我之间还有层同学关系,我想日子可能会好过一些吧。哈哈,只能说2会让人改变的,屌丝RD升级后的感觉常人估计是无法理解的,什么关系、什么情谊都是狗屎,照样要按套路来。由于手头事情太多,J给的新任务 HBB..TV Task Leader的活我拒绝了,中间也发生了在我看来是一些不太严重的事,比如站在RD的角度去说一些自己对公司安排的看法...。猜测大概率是这些看法引起了J的巨大的憎恨,J找了个理由给我打了从进公司后的最差PMD分,然后安排我换一个Team,也就等同于把我给Reset。这年我37岁。所以说2的确是狠,2的确是牛,他们分分钟就可以把一个勤劳干活的人给按住,从后来我从其他人口中得知J当年捅了一刀后,还在他自己2的圈子里说我不好管理,这就为后面我遇到的各种其他操作打下了伏笔,操。关于此人我也不想多说了,在他最失意的时候我们陪着他,他写2行代码就能让我负责的module发生内存访问越界并且需要花费大量时间做Stress test才能测试出来,最后查出来我也是尽量帮忙按住事情不在扩散... 如此如此,有些人你对他好是没有用的,他觉得都是应该的。他为了享受一下整人的乐趣会抛开所有因素,干就完了。他应该不会笨到做这些事请后还以我的智商会看不出来,所以说他觉得得罪我应该是无所谓。之后的几年有机会坐在桌面上大家也还是有说有笑,当什么事都没有发生,只不过我知道从此我再不认识他了。在这家公司这样的事情是常有的,也没什么奇怪,就看谁当倒霉蛋了。
-
15-17 年 J把我给Reset到Y team,Y这个人就更了不起了,当官的威风耍的是淋漓尽致,每个RD都要听从他的安排,不能有一丝反抗,不然就干你。过来后我开始把手头原有的事情一件件的移交给J Team的RD,这边先干起了US SI的事,也还算过得去。后来总部交过来一个叫Cross..Mxxnt 的活,这个活从一开始我就判断会是一个没有意义的注定失败的事,估计YC从跟我的谈话中也有了解,所以很顺理成章的我接了这个案子,日常协调开发..测试..维护..加班..参加CEC MWC。大约干了 2年左右,果不其然,案子不了了之。我曾经想过就在Y Team里面干吧,最多跟很多其他RD一样混吃等死而已,只要不被“关注”到就好。当时公司Au..dio team出了点混乱,很多RD都跳槽了,搞到后来连解BUG的人都找不到,Y毅然决定要让我去搞Au..dio,我们讨论了几次,我的技术长处和兴趣跟这个方向实在差的是太远了,期间我还下载了公司AD的code看一下,有一种被吓尿的感觉,估计每个人看了后感觉都会不同,没有烂只有更烂,我觉得如果我去维护这个Module起码会少活10年,我给的建议是找年资浅的有冲劲的小伙子去干,效果一定会比我干的好。Y也没说什么,年底给了个I-的绩效(相当于100分中的40分),这意味着2年内没有任何升职等的机会,加薪也跟你无关,我上次一升职等还是RDO给评的,到这个当口,Y算是给了完美的一击。 跟Z提出离职,Z是Y的老板,当然Z如果愿意我离职的话,后面我是准备去争取N+1的补偿的。Z说要不在换个Team reset下试试,我看也好就答应了,准备进入TAO的team。 从16年起,渐渐的就开始对公司失去了信心,即使干事认真、即使有能力解决问题,但是只要2看你不舒服就不会有好果子。而且有种感觉,公司要开始对大龄RD动手了。这年开始,中心开始往家庭转,白天干完事,晚上下班就回家。这样以来就有更多的时间陪儿子玩了,儿子当时都10岁多了,我们父子开始玩第一个智力游戏“魔方”,我先学会了,再挑逗儿子学,从3阶4阶,到最近才买的11阶,复原都没有问题,还可以在高阶魔方上转出自己想到的字。这年在一个安静的夜晚也第一次盲拧3阶魔方成功,第二天还写了日志。也是这年,开始了学习Android/IOS/MacOS APP的开发,首先就制作了3D的魔方教学APP,目前IOS上已经下架,因为说我使用了Rubik's cube的字样,我也懒得跟Apple沟通。MAC上还在,国内只上了应用宝. 然后陆续写了一些其他的益智类小游戏,基本都是儿子在玩耍中提出简要需求后我再做整理编码。 解交叉 / 数独 / 算24 / 除法计算 / 空间方块 小游戏(H5)在github page上也有托管一份GCreate Demo(Github page在国内访问可能受限,需要多刷新几下),在写游戏的过程中,我发现界面的绘制跟布局是一个比较麻烦且耗时的过程,所以期间又写了一个简单的游戏设计器,我起名为GCreate,意为游戏创造者。上述小游戏界面的部分都是由这个工具定制出来的。将来可能考虑用来赚点小钱或者开源。总之这几年还是比较好的,公司虽然开始慢慢的抛弃我,但由于自由时间多了一些,自己可以干一些想干的事情,Coding功力又增加了点。
-
17年 加入Tao team,跟久违的Liang仔开始共事,事情主要也跟Android SI相关,事情不算多,基本白天干完绰绰有余,晚上回家就自我娱乐。这年公司启动ATSC..3.0.的项目,由于手痒就申请加入了,我主要负责一个叫iTV的Module,从设计到编码我都认认真真的去完成,文档、代码注释都写的很认真,不求领导能看懂但求搞出来的东西能过得了自己这一关。开发到一大半的时候,领导突然找我谈话,BBDD说了很多,中心思想就是想把我换到一个叫IMB的部门做一次大的Reset,这意味着我要放弃在TV部门的所有技术转去去搞一个全新领域的东西,我内心是很不愿的,但是也没什么办法,看来TV就是很想让我离开,JZ当时劝我乘这个机会提出离职,很大可能能搞到N+1的补偿,可我却又一次傻逼了,我决定看看公司后面还会怎么玩,并且IMB部门还有我的很多老哥们,我们又可以天天在一起抽烟吹牛逼了。Z在我要转会之前问我有什么要求,我点了两个2级的名字ZJ/FJY,希望能进入他们的Team,Z说可以帮忙通融。
-
18年中,进入IMB,我希望能进入的2个Team一个都没进成,领导说他们的Team不缺人,把我安排进了Yun的team,开始做从来没有干过的硬件驱动,虽然没有做过,通过学习也慢慢掌握了Driver开发的套路,我维护的module 不算太复杂,原作者代码写的也比较工整。日子也算过得去,此时离YC给我打40分2年期限也快满了,貌似、说不定还能重新燃气我的斗志,毕竟我知道自己还是有能力的(别人认不认可不知道)。18年底,Yun很自然的又给打了一个40分,一切归零,好吧,牛逼,记得当时在公司网上看到结果时,我露出了会心的微笑,我已经决定要离开这个烂公司了,是公司故意要清退老人还是2看人不喜欢,我已经不Care了,他们是一伙的。接下来就是讨论补偿金的问题了,干了这么多年,我可不愿意做净身出户的傻事,没有人夸你是英雄只会说你是傻逼。没想到想搞个N+1也是那么的费劲,按照我的13年的年资如果再混个几年,公司想解雇我估计要花更多的钱。找了一些老领导新领导谈过,大家都是嘴上说的特别的好听,但是就不愿意帮忙争取,如果继续留在公司也还是可以的,但是我实在是不想再待在这里了,简直就是浪费生命,而且我也担心哪天控制不住就把2b们从楼上踢下去了。于是跟领导达成协议,请4个月的带薪假回来后办理离职手续,请假期间LM长官(也是我进这个公司的第一个直接领导)打来贺电,说帮忙跟上面争取了一个6个月补偿金,需要立即离职。前前后后大约花了2个小时的时间我跟这个公司彻底拜拜了。
这家公司其实还是不错的,业界也比较有名,公司的整体工作流程、工作环境都是一流的,在有那么多2的瞎搞下,在压抑了很多有高超技术的工程师发挥的前提下,还能做成那样真心不容易。 以我的经验,现在回头再看看在这家公司的生存法则: 技术高手:有牛逼的技术那基本上就跟2无缘了,因为2真心的跟技术是没有关系的。不能当2那就得搞技术方面的事情,平时安安静静就好,当有发生别人解决不了的问题,当有机会能体现自己能力的时候,要有策略,要想办法利用自己的技术优势去提升自己的价值,别傻BB的把活都干了还捞不到好。虽然你技术了不起也千万不要一不小心得罪了那帮2,因为他们的独特的思考方式你是理解不了的,他们什么都不会顾忌,什么都不怕,他们可能分分钟会灭了你。另外,在大公司干,即使是技术高手也通常是在某个领域,说白了就是一个螺丝钉,除了同类公司同类领域可以跳槽外,基本没设么卵用,出去后照样可能面临找不到工作的问题。所以除了在公司好好把自己领域的事搞熟以外,最好在平时也多多的接触一些其他的知识,即使公司歇菜了,有能力照样还可以有饭吃。 技术小白:这是普遍存在的一大类人,没有办法,只有慢慢修炼、忍住痛苦、在一大堆垃圾代码中遨游,争取有朝一日能熬成技术高手。还有一种办法就是巴结2,仔细的揣摩2的需要,充分的巴结他,当2说了一个不好笑的笑话,你也得放出开心的笑声,如此如此,即使你水平不高,也能拿到好的绩效。
19年初,偶然的机会,Lei介绍认识了两个摇滚青年,TY&ZL,他们是北漂回HF来创业,决定要开发一款硬件输入式设备,他们在KickStart上发布了自己的创意并且开始众筹,大约筹到了20万美金,这个成绩比较好,接着合肥高新区拿出了150万的种子轮投资。硬件部分基本OK了,但是迫切需要有人在桌面上开发跨平台的软件来跟硬件交互。在沟通了需求后我花了一些时间帮忙做了一个简单的Demo,TY邀请我加入他们的公司一起创业并承诺给一些股份,当时正处在对M公司彻底失望的时间点,19.5我就过来了,从起初的3、5个人到目前的20多人,从起初的在民房里编码到进入众创空间,公司在他们的带领下慢慢的壮大起来。我主要负责软件的部分,几个月的时间写了4万多行代码,填平了很多未知的坑,1.0版软件最终还是顺利的交付了。
9月公司拿到了天使轮投资400万,我们的第一批产品也顺利量产,目前KickStart上众筹客户的产品都已经到客户手中了,客户的反响不错,下一步公司的方向是打入日本和台湾市场,预祝顺利。
在程序猿职场上,我选择了认真做事、积极学习、不巴结这条路,在M公司这条路看似是死路,但在T公司却才开始,塞翁失马焉知非福。作为42岁老程序猿,我觉得职场才刚刚开始,继续修行...
[2021.05续写]
经过2年多的艰苦奋斗,公司的规模已经扩大了,现在合肥总部+广州分公司已经有35+个兄弟姐妹了。我们的产品是TO C的,目前已近有2.5W+的客户,分布在全球50多个国家,每天都还不断的有新用户的加入。2020年销售额已过千万人民币。目前正在积极准备第3轮融资。我们的产品