一个程序员的编年史
00-前言
诗人问:“你见到过凌晨四点钟的太阳吗?”
程序员:“见到过啊,那时候我通常刚下班。怎么了?”
诗人无言以对。
我做软件开发已经15年了,从小鲁到鲁工,到鲁经理,再到鲁总监。有些公司,做着做着就没了;有些项目,做着做着就黄了;有些团队,做着做着就散了。社会的浪潮汹涌澎湃,我们都是浪花中的一粒水珠,随着这个大潮起起伏伏。
01一行代码五万元
2007年,我在太皓电子担任.net工程师,公司在张江软件园,老板是一个留美归国的博士。那时候我们开发了一个叫芝麻网的远程教育系统,它无须专用的教室录制,只需要在普通教室增加一点设备,就能完成课件的录制,将线下课程直接拓展到线上。
需要增加的设备,是一个带支架的摄像头,一个挂在老师身上的无线话筒,一个套在笔上的发射器和一个装在白板边缘的接收器。当白板笔在白板上写字的时候,发射器发出信号,记录下的白板笔的位置,接收器收到后,将数据发送给应用软件,软件就可以将笔划还原出来。
分为三个部分,我做的是一个.net的管理平台,在上面可以创建网校,开通课程,上传课件。还有一个c++的录制工具和一个Flex的播放器,分别包给了一个自由程序员和一个软件开发公司。到了约定期限,平台和录制工具按时完成,播放器出了延误。于是,我每天带着电脑,到乙方所在公司监工。
那段日子是最惬意的,什么都不用做,就是看着别人做项目,感觉挺好。因为我每天都去,乙方碍于面子,加大了这个项目的人员投入,很快这部分也完成了。
然而在集成的时候,却出现了问题。每个部分单独运行都正常,放到一起就不行了。我们三方再三检测,最后发现出在设备上面。
设备是老板从美国带回来的,老板给厂家打了电话,厂家说派一个工程师过来看,来回的差旅费用和工程师的酬劳一共5万元,需要我们承担。老板打完电话,看到我正在摆弄那些设备,就兴致勃勃地对我说:“想不想挑战一下自己?我给你一个星期的时间,如果你能解决,咱们就不让厂家派人了。如果解决不了,再让厂家的人过来。”
我那时候是个软件工程师,对于硬件设备其实不是很懂。但仗着自己的年轻与无畏,我接下了这个任务。那一星期,我开始了通宵达旦的工作。我面前摆着一大堆英文资料,设备的线路图、驱动程序、通讯协议等等,我逐一阅读。遇到不认识的技术名词,就上网查询。
那时候每天晚上都睡到凌晨两点,感觉一个星期补上了硬件专业一学期的课程。临到最后一天,终于被我发现端倪,这个设备用错了通讯协议,rtmp和rtsp协议虽然很类似,但也有很大的不同。于是我在驱动程序中修改了一行代码,将rtsp改为rtmp,然后问题就解决了。
老板听了我的汇报,非常高兴地说:“你这一行代码,就值5万块钱!”
然而那个项目终于还是没做起来。按照老板的设想,它的目标客户应该是那些开课外辅导班的老师,这些老师本来就有一定的生源,如果将他们的教室扩展到网上,就会额外增加一道收入。于是老板招聘了一个营销副总,让副总挨家去那些辅导班做推销。但是副总有自己的想法,他想召集一批老师,开个教学新技术研计会,采用会议营销的方式来做推广。但是老板没有同意他的想法。
后来他们去了几个学校推销,还没有拿到订单,老板投资的50万元便消耗殆尽。最后老板将公司卖给了在北京发展的好友,我也随着公司,从上海到北京。
搬家的时候,正值国庆放假,买不到上海到北京的火车票。于是老板给我支了一招:“你先坐火车到天津,然后再坐京津城钱到北京。”也就是在从上海到天津的火车上,我完成了自己的第一部文学作品《海天之间》,发表在晋江文学城上面。
02每天都差一分钱
2008年,我在成易佳禾担任.net工程师。那时候我住在回龙观,而上班的地方在海淀。因为上班路远要起得很早,我练成了在车上睡觉的本领。一到公交车上,不管是坐着,还是站着,我都能睡着。当然,在车上睡觉不算是本领,而我的特别之处是,不管睡多长时间,只要到了该下车的站,就会自动睡醒。
我在公司的电子政务项目组,承接各地省厅的政务审批项目。电子政务项目对数据权限很敏感,一般要做三级数据权限,每级操作员只能看到自己区域的数据。而出于性能考虑,在迭代多级树形数据的时候,不能使用递归,要使用包含全路径信息的编号来标识节点,然后配合模糊查询实现类似递归的效果。
我在公司做了很多政府项目,但是这些项目并没有给我留下太多印象,倒是有一件事情,让我记忆非常深刻。那时候金融项目组做了一个银行的项目,已经完成了,但是验收测试期间,每天对账都会差上一分钱。一分钱并不算多,但是因为差这一分钱,就说明系统不可靠,不可靠的系统无法通过验收。
当时做这个项目的人员已经离职了,老板就指定让我来修复这个错误。我照例还是把代码看了一遍,很快就找到的错误的原因。错误的原因有两个,一个是精度不够。众所周知,在计算机中浮点数是近似值,像float、double这种类型都是近似的,比如你写一个变量等于3.0,它实际存储的可能是2.99999999. 在低精度的场景下,四舍五入到两位数不会有什么误差,但是在银行这种高精度环境下就不行了。虽然原来的程序用了decimal,精度达到了小数点后60多位,但它终究不是精确值。这个错误好改,将数据类型换成BigDecimal完事儿。还有一个原因,在汇总当天数据的查询语句中,用了大于等于当天0点0分0秒,小于等于当天23点59分59秒这样的条件,这样的条件在数据库中存储的时间精确到秒时,不会有什么问题,但如果数据库中存储的数据是以毫秒为单位,它就会漏算一秒的数据。这个也很好改,把小于等于23点59分59秒改成小于第二天的0点0分0秒完事儿。
这种都是新手才会犯的错误,有些小公司滥用新手,就是给自己挖坑。新手搞出问题来解决不了,然后撒手就走,最后公司还是得找老手来解决问题。所以别看新手工资低,但是算下来并不省钱。
08年中国发生了很多事,北京举办了奥运会,汶川发生了大地震,南方发生了大雪灾。而我在那年结婚了,爱人是在07年初就认识的,她原来在师范学校学的中文,后来跟我去了上海。因为她也想做软件相关的工作,于是报名参加了一个软件测试的培训班。刚培训完还没来得及找工作,就随我去了北京。因为在北京没找到软件测试的工作,就去中搜在线做了网站编辑。当时中搜推出了个人门户,招了一大批人来制作门户网站,我爱人就是其中之一。12小时两班倒,有一半的时间要上夜班。爱人受不了这种日夜颠倒的生活,于是跟我商议之后,我们辞职回到了郑州。
03臭名远扬中工网
2009年,我在中软宏大担任.net项目经理。当时我们公司承接了总工会的中工网项目,而我带领的项目组负责其中教育培训、就业择业、维权帮扶三个子系统。
中工网上线后,曾经受到了很大的非议。原因是当时有个闲着没事的人,在看招投标网的时候,发现中工网的采购价格为670万。而他认为这个网站也就二三十万就能做出来,质疑相关部门在采购过程中虚报价格,假公济私。然后就是一帮不懂装懂的媒体跟着起哄,要求对这个项目进行审计。
我就是中工网的开发人员之一,所以我很清楚这里面的原委。首先,我们交付给总工会的并不是一个网站,而是一个建站系统,这个网站是用这个系统设置出来的,而总工会付的是整个建站系统的钱。而且合同中除了包括中工网这个网站,还包括下属的十几个子系统。就以我负责的教育培训系统为例,需要支持全国4千万工会同时在线授课,在线考试在线发证,单把这一部分拎出来,规模就超过了当时大部分的在线教育系统。还有就业择业,建立了一个服务全国工人的招聘网站,单拎出来也是一个规模庞大的招聘系统。还有维权帮扶,几乎集中了中国所有的律师事务所和司法部门。这些系统的用户量,连当时的淘宝都是没法比的。我们当时做的教育培训系统,除了支持国内主流的三分屏课件,还支持国际标准的scorm课件,并且在前端中使用了虚拟桌面,总之在项目中使用了很多尖端技术,报那个价格是完全合理的。
最后审计部门介入,没有发现采购过程中有任何违规现象,这件事最后不了了之。 我所在的公司是个国企,拥有国企固有的一些弊端。比方说我们工资很低,所以大家都想尽办法赚一些加班费。上午的时候,大家几乎都是不怎么工作的,开完会分完任务,就喝杯茶看看新闻,一直磨蹭到中午。下午集中精力工作半天,然后到下班的时候一看工作没有完成,就申请加班。晚上的加班费是工资的1.5倍,周末是2倍。而且晚上加班有餐补,还会报销出租车费。我们经常下班后坐公交车回家,然后找出租车票报销。餐补说是给加班的人吃晚饭用的,但事实上我们都会捱到回家再吃饭,把餐补这点钱也收入囊中。最后到月末算一下,加班费比工资还要多一些。
我在那里一直负责到项目结束,然后有家私人企业找到我说想让我去他们公司,他们打算新成立一家电商公司,让我去当技术部经理。我犹豫再三,我那时虽然是个项目经理,但项目组却有十几个人,而邀请我去的那家公司,技术部总共才四五个人,工资也只多出五百元而已。我其实不想去,自己所在的好歹也是中字头的大公司。但是那家公司找了我好几次,我盛情难却,就答应了。
04代码应该交给谁
2010年,我在中国智赢担任技术部经理,负责开发一款电子商务系统。系统是在两个开源软件的基础上改进出来的,一个是ecshop,一个是ecmall。将它们的账号打通以后,增加了一个代理和分销系统。
那是我第一次做php项目,以前我都是做.net 、用了php之后,才感觉php更加灵巧、轻便,于是喜欢上了这门语言。当时我们技术部门总共4名员工,办公室是在居民楼里,里面有厨房,然后我们就自己买菜做饭。营销中心在离我们不远的一个写字楼里,公司的其它部门都在那里。公司说这样安排是因为我们技术部的工作需要保密,其实谁都知道这样只是为了省钱而已。
公司聘请的营销总监以前是做传销的,非常推崇各种传销制度,什么双轨制,五级三阶制等等。然而公司的总经理和董事长都是守法的商人,不允许他把项目搞成传销。于是他在代理分销系统中设计了九级提成,算是规避了传销的风险。
系统的精髓就在这个分润体系,但是当时国家正在打击传销,所以这个系统在推广的时候就遮遮掩掩的,推广人员给人宣传,也是云里雾里,用了很多酷炫的词汇。什么店连店店中店店锁店,什么万业互动千年共赢等等,但是又讲不出系统的特点。客户经常会问:“你这个系统跟京东淘宝有什么区别?”"我淘宝用得好好的,为什么要换你这个系统?"
系统定位不清晰,那目标客户也就不明确。招商的时候,什么客户都想抓,根本不管他是什么行业,导致网站上什么产品都有,根本没有什么特色。所以那个项目在举办了几次轰轰烈烈的招商会后,走到了十字路口。
总经理和营销总监还在向董事长描绘着项目的美好前景,忽悠董事长继续投钱。而董事长看着只出不入的财务报表,打算结束项目及时止损。
董事长在决定关停项目之前做了一个调研,找了很多基层员工进行访谈,得到的结论是大家都不看好这个项目,于是启动了关停项目的程序。而总经理和营销总监总觉得这个项目大有可为,于是开始在私下里找新的投资人准备接盘。
最后的关停方案是项目取消,公司注销,人员遣散。办理交接的时候,总经理给了我一个硬盘,让我把所有的程序源码和说明文档都给他拷贝一份。
这些源码和文档是我们技术人员开发将近一年的成果,也是公司的主要资产。我当时犹豫了一下,因为知道总经理有另找投资继续项目的打算,那这种行为无疑算是盗窃。但想想如果不给他,这些代码也没有任何价值了,况且当时公司还没有解散,他还是总经理,我把资料给他似乎也无不妥。
后来董事长找到我,问我为什么要把程序交给总经理?他是公司法人,也是投资人,他才是公司的实控人。我想想也很有道理,程序是他出钱雇人开发出来的,理应由他处置才对。但由于一般公司都很忌讳越级汇报,所以我能跟董事长说上话的时间其实不多,也就失了先机。
事情过去好多年了,每次想起这件事,我都会反思自己到底做得对不对,不过至今也没有想出结果。
05同事之间有情谊
2011年,我在博腾环保担任.net工程师,我们当时做的主要项目是天瑞的EMS项目。 天瑞的项目非常复杂,几十家工厂用的都是不同的设备,要把所有的能耗数据全部接入进来,有些甚至需要对厂家原来的工艺进行改造,把一些老式的模拟仪表换成可以数字远传的。对性能的要求也非常高,我所负责的数据采集模块,一秒种就要传输几千项数据,所以这个项目一开始就是高标准严要求。项目人员开发测试比达到2:1 。程序员完成一项功能,需要找另一个程序做同行评审,再找一个测试做案例展示才能提交。而且提交的注释都有 严格的要求,起初很多人因为注释不合规范被退回。每周举行一次代码审查会议,总监会把那些写得不好的代码公布于众,让大家讨论怎样写才更加规范,更加高效。为了让我们了解业务,公司安排专车载着我们去十几家工厂实地察看。 而且这个公司是我工作过的所有公司中,最象家的公司,因为这个公司管中午饭。每到中午吃饭时间,都会派出几个同事到合作餐厅把午饭带回来,然后大家在会议室里集中吃饭。吃饭的时间聊的话题都比较轻松,所以大家在一起也逐渐有了友情。
因为这家公司太好了,所以后来我爱人也应聘了进来。她是直接在人才网投递的简历,我没有给她作任何的推荐和介绍。起先一段时间,我们以同事相称,很多同事并不知道我们是夫妻。工作上我们也一直秉公处理,不夹杂任何私人感情在里面。比方说别的测试挑我毛病的时候,她从不插言,她工作上出现错误的话,我也从不偏袒。中午吃饭我们也不会凑到一块,一般是她跟女同事一起我跟男同事一起。下班回家我们也不同时走,一般是谁先做完工作谁就先走。直到后来有一个细心的人资发现我留的紧急联系人电话号码是她的,而她留的是我的,大家才知道我们这层关系。 在我以前和以后经历的那些公司中,一旦离职同事们几乎都不会互相来往的,但只有这家公司例外,同事们在后来的很多年里都保持联系。后来离开这家公司的同事,我们建了一个小群,经常在里面聊天,聊天时说得最多的一句话就是“我们在博腾的时候啊……”
我们知道同事不会成为朋友,所有教职场生存法则的书里都会告诉你,不要把同事当朋友。但这家公司真的是个例外,同事不仅是朋友,更是家人。遇到困难大家一起分担,从不计较个人得失。后来项目结束了,公司接不到新的项目,老板仍然不降工资不减绩效。但我们不愿意看到公司继续亏损下去,所以陆续的辞职走掉了,临走时给老板留下一句话:“你什么时候有项目了通知我,我随时准备回来。”
06首次被同事陷害
2012年,我在知途网络担任.net工程师,我们当时做的是一个叫知特产的电子商城,网站几乎是照抄淘宝网的特产中国。在这家公司遇到一些事情,才让我知道职场的人心险恶。
我当时做的有一个功能是支付宝支付,这个功能开发测试都没发现什么问题,但是上线后发现无法使用,系统无法收到支付宝的回调。我把程序反复检查,没有发现任何问题,在测试系统上完全正常,只在线上系统有问题。我怀疑是线上系统配置有误,但是系统管理员信誓旦旦地告诉我,系统配置没有问题,因为其它功能都正常。我又再三检查程序,确定程序没有问题,最后在我再三要求下,系统管理员同意让我检查生产系统。我在生产系统打断点调试,发现确实收不到支付宝回调,但是检查支付宝的交易明细,显示回调已经发出。就是说支付宝正常发出了回调,我们的程序却没收到,既然程序没有问题,会不会被其它软件拦截了呢?我多少还是有点信息安全的知识的,于是我将服务器上的安全软件逐一关闭,然后调试程序,最后发现是一个叫网站安全狗的软件拦截了支付宝的回调。问题找到了,然后我让系统管理员在安全狗的拦截规则里加一条例外,程序就通过了。
本来事情解决了,但没几天我听到公司流传,说我水平太低,一个回调调试一个星期,最后还是在系统管理员的指导下才解决的。我听到这个,肺都气炸了。
后来有一天,老板把我叫去,说你做的程序有问题。老板在测试站点上操作,不断的在买家中心下达订单,然后在卖家中心查看,然而卖家中心一条记录也没有。老板很恼怒,说是你做的买家中心吧,怎么连个下单的功能都做不好?我记得这个功能是正常的,但是有谁动了我的代码让它失效了也说不定,于是我说回去检查一下。我下个订单,卖家中心查不到,进数据库一看,数据完好进入了数据库,再找到卖家中心的代码一看,是卖家中心的查询条件不对,导致查不到这些记录,并不是我下单那部分的问题。我找老板想去解释,但是老板态度很冷淡,说你自己做错了就要虚心接受,不要找别人背锅。
我回去之后仔细想了想,那个做卖家中心的程序员,就是当初散布我支付宝问题的那个人。这个人程序写得不怎么样,但是拍老板马屁是一流,每天跟在老板后面说好话,团队里面有功劳他都往自己身上揽,出了问题就往别人身上推。公司有这种人本来也没有什么,但问题这种人反而混得风生水起,不管他怎么信口雌黄,老板都会相信。
我出来工作是来卖力气的,不是来受委屈的,别人的误会我都能容忍,但这种明张旗鼓的陷害我不忍。然后我就辞职走掉了,让那些爱拍马屁的人去做事吧。
07打赢黑客攻防战
2014年,我在天玺金融担任技术总监。当时我们做的是互联网金融p2p借贷项目,其实我们入局的时候,这个风口已过,市场格局已定,市场被几家大型p2p企业瓜分。但我们的投资人坚信小企业也有自己的生存之道,所以还是在一片质疑声中上马了。为了节省开发时间,我们买了一套现成的网贷系统,连源码一块买了回来,方便我们以后修改。代码是用play frameword做的,这个框架在SSH充斥的年代,显得很小众,但因为它的安全性非常强,所以用来做金融系统其实是蛮合适的。因为安全,始终是金融系统最重要的指标。
说到安全,在这家公司我参与了我人生中的第一次和专业黑客的攻防战。当时我们的业务已经开展多月,有一天我们的客户QQ上加了一个陌生人,他对我们的客服说:“告诉你们老板,我要封你们网站。”我们客服把这事报给了老板,老板召集了我们几个总监开会,最后一致认为,只有国家监管部门才可以查封我们的网站,而国家监管部门显然不会用QQ办案,再说我们也没有违反任何法律法规,政府也没有理由查封我们,最后决定不予理睬。
然而过了一个小时,客服上报说系统无法访问了,我大吃一惊,赶紧上后台查看。因为我们当时用的是阿里云的服务器,阿里云后台显示,系统遭到了DDOS攻击,瞬间到来的巨量访问压垮了公司的系统,我们遭到黑客攻击了!因为服务器进行过加固,而且我每天都进行巡检,几乎不可能有系统漏洞,而且阿里云的防火墙也非常强大。黑客找不到其他进攻方法,就选了DDOS这个最简单也最耗钱的攻击方法。
DDOS通过控制大量计算机向网站发出正常的访问,依靠瞬间高并发的流量将系统压垮。因为他们都是正常的访问,所以很多安全软件都会放行,所以实施起来非常简单,但是他们控制大量的计算机访问系统也会产生高额的流量费用。所以可以说是伤敌一千,自损八百。
意识到到遭到了攻击,马上向领导汇报。这时候黑客已经联系上了我们老板,索要5千块钱。老板说不能给,如果给了以后,黑客尝到甜头,以后会源原不断地发起攻击。于是我马上启用阿里云的防DDOS系统进行清洗,将无效访问转到黑洞里。阿里云的防护系统非常强大,但是代价也相当高昻,因为它是按流量收费的。我这边抗了半个多小时,就已经耗光了我们在阿里云预存的所有费用。这样硬抗不是个办法,我一边联系财务往阿里云系统继续充钱,一边启用了备用系统。备用系统上线后,我们的客服马上通知所有客户使用备用系统进行交易。
为了让黑客相信我们还在拯救以前的系统,免得他们注意到我们的备用系统,于是阿里云的钱到账后,我马上又把系统启动起来,黑客发现以后,又开始了新一轮的攻击,这次我在黑客攻击持续十五分钟后,关闭了防护,于是系统又被压垮。又过了两个小时,我再次启动系统,黑客继续攻击,这次持续5分钟后,我主动下线。然后就再也不再启动那个系统。
从黑客的角度看,他们三次攻击我都没有抗住,这三个回合应该都算我输了。但在我这方面,我只是输掉了第一回合,之后备用系统上线,后来两次佯装上线,只是为了吸引黑客的注意力。最终黑客没有发现备用系统,我们业务持续进行,所以算是反败为胜。
所以,兄弟们,备份系统是何等重要!存储你系统的硬盘可能会坏掉,存放你服务器的机房会发生火灾,有些损坏是永远不能恢复的。所以不要侥幸,做好异地备份计划吧。
公司入不敷出地维持了一段时间后,国家出台了新政策,要求所有的p2p贷款金额不能超过10万元,这对我们来说是致命 的,因为我们主做的是房抵贷。抵押一套房子只能贷10万块钱,这好像不会是正常人能做的事情,然后公司就清盘出售了。
08醉卧街头君莫笑
2015年,我在E修联盟担任总工程师。当时我们做的是一个修车服务平台,试图打通汽修产业链。我们设想的是,如果车主的车在路上有故障了,拿起手机用我们的APP就能找到附近的维修店,维修过程中如果需要什么购买什么配件,维修师傅拿起手机用我们的APP就能订购配件。因为在当时,垂直电商的风头正兴,很多创业都都想在细分领域分一杯羹。
我负责系统的总体设计还有即时通讯功能的开发。因为当时还没有融云那种的SDK,所有的功能都要自己开发。我用OpenFire搭建了消息服务器,采用Xmpp协议传输数据。用FreeSwitch搭建了语音服务器,用SIP作通讯协议 。然后用Red5作为视频服务器,Rtmp作为传输协议。
那时候我们公司附近有一所大学,我们中午都混进大学食堂吃饭。那个公司离我家也很近,骑自行车就能回去。就这样辛辛苦苦干了大半年,临近春节的时候,产品终于完成了。
庆功宴上,老板首先表彰了我们研发中心,然后敬我三杯酒。然后其他部门人员纷纷跟随,一人敬我三杯。我瞬间蒙了,一般在酒桌上我们技术人员基本处在可以忽略的位置,敬酒陪酒之类的跟我们没多大关系。我们就安心吃菜,然后听业务部门的人喝洒猜拳,发表一些豪言壮语,拍胸脯表忠心。现在倒好,敬酒的都冲我们来 了,敬完我之后,又去敬我们研发中心其他工程师,不到10分钟,我们技术人员几乎全趴桌上了。我一直坚持到最后,虽然没有趴下,但起身时已是头重轻脚,走不稳路了。
临走老板要我打车回去,我虚荣心作祟,为了表示没喝多,坚持要骑自行车回去。然后骑上车之后,车子歪歪扭扭,没走几步就摔倒了。然后勉强骑上,走几步又摔了。这次摔在路边的花坛里,压倒了花坛边的铁丝网,有一根铁丝穿透了我的棉衣,直接扎进肉里。那个位置离心脏也就一两公分,要是再偏一点,我可能就玩完了。
在花坛里躺了好一会儿,好几次想爬起来,但浑身瘫软无力。索性就睡在花园里,任寒风刺骨,雪花纷飞,我只沉沉睡去。
第二天去上班,才知道这顿酒不是那么好喝的。老板叫我到办公室谈话,大概意思是开发已经完成了,公司不需要这么多技术人员了,要裁撤研发团队,只留运维,问我有什么想法。我能有什么想法?
从那以后,我开始反思。因为我以前都是进的初创公司,初创公司一般有两种结局,一种是研发出来的产品投入市场没有反响,公司倒闭。另一种是研发完成后研发团队解散,只留运维人员。不管是哪种结局,对于我们研发人员来说都一样:要找另一份工作了。所以当时我决定,再找工作就进成熟期的公司,不再去初创企业了。
09最不喜欢换老板
2016年,我在真汇网担任技术总监。当时公司已经有一款比较成熟的B2B电子商务平台真汇网,采用.Net+Sqlserver的架构,业务量已经做到了全国领先的水平。但是由于上线了批量发布系统后,系统性能严重下降。我入职后对系统进行了升级改造,将产品信息和评论等移入mongodb数据库,同时将Sqlserver 数据库做成读写分离集群,用Elasticsearch引擎替代数据库全文检索,使系统性能有了很大提升。
真汇网是针对产品的,我们又开发了一套针对服务的交易平台,叫真汇金街,账户与真汇网打通。我们除了开发自己的产品,同时也会开发一些定制项目。所以我们技术中心有两个部门,一个叫平台研发部,一个叫定制研发部,加起来总共有45人 。
公司的风气很好,周一上午会开全员会,会上会进行一些集体的娱乐活动。每天上午8点半各部门开晨会,晨会安排好当天的工作后,会玩一些集体游戏,比如狼人杀,逛三园,疯狂猜词,谁是卧底等等。一场游戏玩下来,大家都很开心,然后就以这样开开心心的状态开始一天的工作。
不过这种状态并没有维持太久,因为公司上市了。公司上市后,为了满足上市公司的要求,对企业各方面都进行了改革,从公司初创就带领大家开拓市场的总经理被换掉了。新来的总经理为了财务报表上好看,开始严格控制成本。从此饮水机旁边没有了茶包,卫生间里没有了卷纸。这还不算,新老总把我们尚未赢利的项目比如真管家和真汇商城全都停掉了,同时停止了一切新产品的研发活动,开始代理其它公司的成熟产品。因为研发就要投入,投入会计入成本,却不会在短期形成利润,这样把公司从一个研发型的公司转为销售型公司。
公司转型为销售公司以后,开始扩大销售人员规模,同时压缩技术人员人数。在一次总经理办公会后,给我们下了裁员令,要求技术部门裁减一半人员,由我提供名单,人资负责面谈。
那是我最绝望的一段日子,当了几年的技术总监,我就是喜欢招人,不喜欢裁人。说实话,能通过面试,通过试用的都是相当不错的员工,因为差劲的员工压根就过不了试用,甚至连面试都过不了。就是这么优秀的一群人,在任务繁忙的时候跟着你一起加班,在遇到难题的时候给你出谋划策,当系统出现问题的时候,一边抱怨一边积极补救。你说裁谁呢?
首先运维人员得留下来,新产品的研发停了,原有的产品要保持运行。同时还要保留最低限度的程序员,因为系统出了问题,或者小规模升级,总得有人来写程序。美工可以外包,产品经理就不需要了,测试人员工作排不满,只能也裁掉,让留下的程序员兼职测试工作,数据库管理员和文档专员,也可以减掉。
然后我拟定了一个毫无私心的名单,并未曾因为哪个员工跟我关系好而有所偏袒。名单转给人资之后,就看到我们部门的人一个个被叫进洽谈室。洽淡室就在我办公室旁边,听不到里面说话的内容,但能听到说话的语气。被叫去的人中,有义愤填鹰地大骂的,有悲痛欲绝失声痛哭的,有默不作声地保持沉默的。同事们听到风声,早已统一了口径,就不主动辞职,要赶我们走就让公司辞退。但公司肯定是不给辞退的,因为辞退就要给补偿。所以裁员的工作推进得很艰难,大概进行了两个星期,然后人资总监辞职了。临走跟我说了一句话,这个公司待不下去了,你也早做打算吧。
新来的人资总监态度强硬,总算完成了裁员的工作,但对员工的积极性打击太大了。留下来的员工开始消极怠工,工作任务完不成,无限期推诿。只要工作发下去,就回给你一句话:这个工作我不会,只有XXX能完成,你把XXX裁掉了。所以这工作没法做。我听了心理很难受,好像是我把他们裁下去似的。但是大家已经不再信任我,工作没法开展,我也只好辞职。
后来离开公司之后三个多月,遇到那个公司的同事,聊起来才知道,三个月内,其它6名总监也都相继辞职了,很多从公司创立时就在公司的元老也都走了。当时公司离职率70%,除了上市时刚来没多久的,原来的员工几乎被换了一遍。换一个总经理,就意味着你要换掉所有的员工。
有时候我常常会想,要是我们那年没上市该有多好啊。
10寻找失踪的员工
2017年,我在伟宏科技担任技术总监,当时我们做的是汉能的MES系统,这个系统极其复杂,要对接很多德国的设备。为了弄清需求,我们需求分析人员进驻厂区,辛苦了三个月终于完成了上千页的需求分析说明书。甲方派出两个代表,逐字逐句和我们核对需求,那时候我们每天晚上忙到凌晨两点,每人带个折叠床,晚上就睡在办公室里。当时我们团队有个成员叫曾经,他每次出差都带着老婆,晚上不和我们一起住,他们自己在外面开房间。
需求搞完了,大家就进入紧张的开发阶段,因为我们研发中心并没有真实的生产设备,所以程序的调试用的都是模拟设备,而我负责所有模拟器的开发。因为公司的总部是在北京,而研发中心设在郑州,所以研发中心的管理相对简单。
有一天一个女人闯进我们研发中心,直言要找这里的负责人,前台就把她请进了我的办公室。她说她是曾经的老婆,说曾经已经三天没有回家了,她就来公司找他。我当时心里很疑惑,曾经的老婆我出差时见过啊,不是像她这样的。但是他说曾经三天没回家,我顿时感觉到事情严重了。因为他已经三天没上班了,没有请假,也没有告知任何一位同事。因为我们技术人员普遍轻视审批流程,有时候家里有急事就先去办,回来补假条的情况也有,我也没有在意。但是现在,他既没上班也没在家,这个事情就严重了。
我们给曾经打电话无人接听,发微信钉钉留言也不回,拨打他入职时填的紧急联系人电话,结果找到我们公司的那个女人电话响了。 我只能让那个女人先回去,说只要曾经跟我们有联系马上通知她,同时建议她如果还找不到人就去派出所报案。
处理完这事刚回到家,电话响了,打电话的人自称是曾经的老婆,说有重要的事情问我,约我晚上见个面。我听声音这不是白天找我的那个人啊,然后核对了一下电话号码,确实不是白天找我那个女人的。然后我就懵了:曾经到底有几个老婆?
晚上见了面,才发现她就是曾经出差时带的那个老婆。她也是来找人的,说曾经已经3天没有跟她联系了。然后交谈中才知道,她跟曾经是婚外恋,白天那个才是曾经的原配。她想让曾经跟原配离婚跟她结婚,但是曾经的原配老婆不同意。她这边一直催逼,然后曾经受不了就跑了。她现在联系不上曾经,因为曾经给她留过我的电话,就找我来问问。
我如实相告,说曾经已经三天没来上班了,然后承诺如果曾经联系我们就马上告诉她。送走她以后,感觉曾经这个人真是没劲,老婆才刚生下小孩不到1年就搞婚外情,而且出了事不去面对只会逃避。
后来曾经给我回了电话,说他去深圳了,在朋友那里。我把这个消息告诉他两个老婆,让她们放心。结果曾经那个婚外恋人一听这个消息,马上买了一张机票飞去深圳。
后来项目忙起来,我也没再关注这件事。两个多月后,曾经和他那个婚外恋人把我约出去,说了很多感谢的话,然后给了我一包喜糖,说他们要结婚了,邀请我去参加他们的婚礼。
那个婚礼我没去,因为那不是我希望看到的结局,我不知道曾经原来的那个老婆,带着个不到一岁的孩子该怎么办。但世事太抵如此,许多事情不会照着你希望的方向发展。因为汉能的项目我们郑州的技术人员需要长期到北京出差,公司领导一合计,不如直接把研发中心迁到北京。我那时候小孩已经在郑州上学了,不想去外地,然后只好辞职另谋工作。
11达到事业的巅锋
2018年,我在华诺科技担任技术专家 。这是一家外企设在中国的子公司,工作比较自由,不打卡不签到,不固定办公室不固定座位。基本上是只要有网络的地方,在哪里办公都可以。但我们基本上还是去公司,因为公司有咖啡,有点心,有下午茶,当然最重要的是同事们交流方便。
我当时参与的是一个5G规划项目,因为5G频段高,所以5G碁站的覆盖范围要比4G小很多,为了增加覆盖就需要部署更多的基站。我们先用无人机在城市上空飞一遍,用双目摄像机拍摄城市的影像。拍完后视频做两路处理,一路转换为城市的三维模型,另一路做语义分割,识别出拍摄到的物体,然后根据不同物体对信号的影响,自动解算出适合安装基站的地点。然后再把这些结果输进城市的三维模型中,由人工进行一些细微的调整。
那是我人生中最快乐的一段时光,外企中的人际关系相对比较简单,也很少有加班的情况发生,下班后基本上不会接到任何工作电话。公司会定期举办各种娱乐活动,比如汉服大赏,卡拉OK比赛,程序员日,工程师日等等。最精彩的是老板服务日,在老板服务日这天,所有的领导都要为自己下属提供服务,比如捶肩、擦电脑、买奶茶等等。具体服务什么不重要,重要的是一种态度。因为公司部门分布在全国各地,所以公司会定期组织各种团建活动,方便大家认识交流。
外企的规章制度比较完善。比方说出差,只要领导批准了你的出差申请,就会有人给你买好机票订好酒店,几乎不需要自己垫钱。
有一段时间我有幸去公司总部出差,到了之后简直惊呆了。公司总部绿化面积很大,建筑物很分散,就像建在花园里似的。里面不但有图书馆,体育馆,影剧院,还有一个博物馆。博物馆里陈列着很多欧洲古代的盔甲和刀剑,图书馆里的藏书比我见过的大学里还多,让人很难想象这居然是一家商业公司。班车上午10点才截着员工到公司,下午4点就出发载员工回家。中午12点到下午2点是吃饭和午休的时间,算下来一天只工作4个小时。
虽然待遇优厚福利好,但同事们的责任心还是很强的。疫情到来,我们除了留下一些通信保障人员以外,其余全部居家办公。武汉建设雷神山和火神山医院,公司征集人员前去建设配套的通信基站。那时候,所有的人全都举起了手,没有一个人犹豫,没有一个人退缩。身为通信人,去灾区进行通信保障在我们的观念里那是理所应当的。最终我没有得到这个机会,这个光荣的任务交给了一些年轻的同事,他们出色地完成了任务之后,又自觉地进行隔离。
美好的日子总是短暂的,在㺯国打压中国企业的大背景下,外企在中国的生存也很艰难。我记得那年移动5G集采,我们没有中标,后来联通和电信联合集采,又没有中标。拿不到5G的业务,我们这些5G规划人员没有了用武之地,公司将我们疏散到其它部门,给我的安置是到福州做Java开发,但我不想离开郑州,于是只好辞职,开始下一段征程。
12遭遇人生滑铁卢
2020 我在中音讯谷担任技术专家,当时我们做的是一个无纸化会议项目。无纸化会议的难点一个是文件协同编辑,另一个是投屏。协同编辑我们集成了一个OnlyOffice开源组件,投屏就使用Nginx+ffmpeg,类似直播的技术。
公司主要是要会议系统软硬件集成的,以前用的无纸化软件都是从别的公司采购的,公司想自研这个软件,但是投入又很少。技术中心有十几个人,但大多从事硬件维修,软件研发部门只有4个人,我用修改ffplay的方式做出了一个PC的客户端,然后又用Android原生技术做了一个Pad的客户端。因为在项目设想的应用场景中,主会议桌上会配置windows工控机和可升降屏幕,而后排的临时座位使用平板电脑。
公司位于郑州远郊,离家很远,交通不便。那时候北三环正在修路,开车太慢,我只好骑电动车上班,每天骑行30公里。骑电动车夏天还好,一到冬天,冷得刺骨。我即使穿上厚棉袄,给车装上挡风被,还是冷得受不了。有一次半夜里下雨加雪,早上起来发现车把套都淋湿透了,手放进去钻心地疼。因为来不及买手套,只好把擦车用的毛巾裹在手上,骑上前行。后来上淘宝买了一种自发热的鞋垫,垫在鞋里,热气从脚上传遍全身,才感觉到些许暖意。
公司的气氛也很好,公司创办有自己的杂志,每个月都要在全体员工中征文。也会举办各种暴走竞赛,从公司徒步40公里到黄河边上。尤其是元旦联欢晚会,办得是很有水平。因为那年疫情的原因,晚会改为线上举行。各部门要把节目录好然后在线上会议上播放,最后大家投票评比。
我们部门的节目是一个小品,两个工程师拿着损坏了的月光宝盒,误入非洲部落,被原始人逼迫喝了好几桶水(水是真喝的)。我演一个维修工,负责修理损坏的月光宝盒。我们的.net工程师小吕,从写剧本开始,仔细琢磨每一个镜头,反复推演每一个桥段,简直跟专业人士差不多。最后节目获得了全公司第一名,然后我们得到了一个结论:能得冠军并不在于你节目做得好不好,而在于你部门人数多不多,因为在全公司投票的时候,每个人都会把票投给自己部门的作品。
软件按部就班地开发完成了,然而在测试的时候,性能达不到要求的指标。首先是android版本的投屏延迟在3到4秒,因为我用的是直播的技术,直播系统中这个延迟是可以接受的,因为你看不到播放源就感觉不到延迟。但是在会议现场,是有大屏的,主席台上的大屏幕和会议桌上的PC端瞬间就收到画面,而android平板要过几秒才能收到,这个延迟就感觉很明显了。还有一个问题,就是连续播放四五个小时之后,画面就会卡住,不知道是什么原因。
为了解决这两个问题,我们又耗费了很长时间,反复检测程序,测量内存和带宽的占用,调整各种参数,但却一直没有取得有效突破。为此我们专门招聘了一个测试工程师,反复验证bug,试图模拟出现问题的条件,寻找问题出现的原因。但也是一无所获。就在我们徒劳无功在折腾一段时间以后,总经理终于没有了耐心,停止了项目,这也成为我软件开发史上唯一一个失败的项目。
13哪怕洪水浪涛天
2021年,我在京硕科技担任技术总监。那时候我们做的是共享打印项目,我去的时候项目已经运转5年,公司已经投放出去3万台共享打印机,但系统性能开始下降,经常出现服务器不返回结果的情况。我让测试团队做了一次压力测试,测出系统容量上限是3万6千台,于是开始对系统进行扩容改造。
服务端用的php,数据库是mysql,设备端用的是c++,用户端用的是微信小程序,还有一个python做的用于读取文件页数的服务器,通讯协议用的Websocket。我把服务器全部改成集群部署,将php升级到7.4, mysql升级到8.0,用户端改为uniapp,将系统容量扩充到20万台。
当时公司的营销策略,就是拿高额补贴换取市场份额。平均每一个点位一个月可以赚50元,但为了拿到这个点位,每月要补贴出去100元,所以公司一直是亏损经营。年初老板定下的目标是今年要赚一块钱,但到年底一算账,这个目标并没有实现。虽然公司年年亏损,但靠着源源不断进来的风险投资,公司的日子过得也挺滋润。
7月20日,所有郑州人都不会忘记的日子。那天暴雨如注,倾盆大雨一直泼了一天。有很多公司收到预警都提前下班了,我们因为老板不在没人做决定,一直到下午6点正常下班才出来。
出来的时候我蒙了,路上的水已经淹到膝盖。电动车是没法骑了,只能趟水往回走。我顺东风路往东走了一段,水越来越深,遥看花园路那边,水已经淹到了行人的胸口。我于是折回,准备走信息学院路回去。东风路在经过文化路的时候有一个下穿式隧道,这个路段的水流变得特别急。我站在东风路口,看着路上没过膝盖的水流,正在犹豫到底能不能过去。旁边还站了几个人,都在观望不敢下脚。这时候有个穿中学校服的小孩走过来,前脚刚踏进水流马上就被冲倒了,眼见着就要随着洪水冲进隧道。我马上右脚跨前,伸出右手直接抓住了那个孩子,因为不敢双脚都踩进水里,我左脚还踩在路边石台上。抓小孩的时候,左手本能伸开以保持平衡,但是我的左手刚伸出就被路边的人抓住了,我顿时感觉全身充满了力量。另一个人见状,也采用我的姿势抓住了小孩,我俩一点一点地把小孩拉回来。
小孩子吓得不轻,然后大家就挤在路边一家饭店里,等着雨停。我担心家里的孩子,于是继续往西,找到一段水流不太急的地方,像螃蟹那样横着走,才趟过了东风路。然后在信息学院路上,全程都在齐膝深的水里趟,走了几百米腿就开始酸痛。但是不知道家里孩子的状况,只能咬着牙往前走。回到家才知道,孩子早在中午就提前放学,已经顺利到家了。看到孩子平安,我马上给同事打电话,询问同事们的情况。得知家在东边的同事看到花园路无法通行,滞留在公司了。他们已经买了食物,准备在公司待一晚上,第二天再回去。
然后我又跑到小区附近的停车场,因为公司离家近我上班并不开车,平时车就停在那个停车场里。结果去的时候,只看到一片汪洋,里面一辆车也看不到,水已经把车顶都淹没了。
这次水灾,郑州死亡失踪人数高达380人,受灾最严重的是京广路隧道和地铁5号线五龙口段。京广隧道里面很多汽车堵在那里出不来,结果水灌了进去,连人带车都淹了。地铁5号线没接到预警照常发车,结果在五龙口段遇阻,水从两头灌进来,一列车的人全被淹了。我损失一辆汽车,但好在家人平安。
公司的财务一直依靠投资,新的投资进来,用于给付以前投资的利息,所以欠款越来越多。最后有一笔投资没有按时到账,结果公司的资金链出现问题,先是工资发出不来,然后供应商的货款也结不出了,公司在负债中艰难度日。为了能拿到投资,领导让我篡改系统数据。我不想干违法的事,再加上欠薪已达五个多月,所以我就辞职了。
14没有硝烟的战场
2022年,我在红帽科技担任技术专家。红帽科技也是做共享打印的,不过跟京硕业务方向不同,红帽主要投放在学校和政务大厅,所以它的机器比较高端,一般都带有触摸屏,能够高速连续打印。而京硕主要投放在小区和学校门口的便利店里,都是打印机直接贴个二维码,主打一个机器便宜点位多。
我从京硕离职当天,还没来得及去投简历,就接到了红帽的邀约电话。这让我很㤞异,怎么京硕的事情红帽知道得这么详细?莫非是有卧底?然后我就问红帽是怎么知道我离职的,红帽说是一个供应商推荐的。然后我就明白了,京硕采购硬件一般都是款到发货,但最近由于资金紧张凑不出货款,导致有一批货(大概5千台控制盒)厂家已经生产出来了,但京硕没钱发不了货。所以供应商只好给这批货找别的买家,于是就找到了红帽。
红帽其实并不想做社区这块,因为它在校园和政务这块已经做得很好了。但耐不住供应商一顿忽悠,再加上因为疫情很多学校封锁,机器维护很不方便,所以就打算在社区领域试一下。
我去了之后,主导开发了红帽打印的社区版本,同时也参与了其它版本的维护升级工作。为了避免和京硕可能存在的纠纷,我使用了和京硕完全不同的技术方案,服务器端用Java,设备端用Python,通讯协议采用MQTT,总之每个部分都使用的京硕完全不同的组件。
红帽的老板是军人出身,对质量的要求近乎苛刻。比如我们有一款室外的机器,一到冬天打印就会重影,老板了解到是因为低温所致,后来就在所有的机箱里增加了加热装备和温控模块。还有我们的社区版,响应时间会随着文件大小而减慢,比如上传50页以上的文件,打印机可能要等一分多钟才能响应。虽然我们再三给老板解释文件传输是需要时间的,但老板不听,坚持要求我们提高响应速度。最后我们采用文件拆分的办法,先传输第1页,然后再传输2-5页,然后再传6-10页,最后传输剩下的内容。这样不管有多大的文件,打印机都能在10秒钟这内做出响应。
那天正上班,忽然听到业务部门一阵骚乱,我们的两个业务人员被抓去派出所了。因为我们两个业务员出去投放机器,结果投在了京硕公司楼下。京硕的人一看,用的是他们的控制盒,马上慌了。因为京硕并不知道供应商已经把他们的货卖给我们了,一看到我们在投放他们的机器,马上想到是不是我们把他们的点位给撬了,用我们的设备换走他们的,然后又用他们的设备投放新点位。因为京硕在撬别家公司点位的时候,也是这么干的。所以他们就报警了,说是我们偷了他们的设备。
然后我们老板出面,出示了购货合同和给供应商转账的回单,两名业务员被当场释放。但是供应商不高兴了,因为供应商当时跟京硕签的排它协议,这种设备是专门为京硕定制的,不能销售给其它公司。所以供应商卖给我们设备的事情其实是暗地里进行的,现在这么一闹这件事情就暴露了。
后来供应商跟我们一起喝酒,抱怨说京硕做事太不地道了。原来并不是因为京硕付不起货款,而是因为京硕买通了供应商的一位工程师,知道了他们代工的厂家,然后从厂家以更低的价格直接进货,把供应商完全撇开了。供应商心里很恼火,因为京硕暗地里从厂家进货的事情他们并不知道,所以还在继续向代工厂下单生产,这才造成了货品的积压。
京硕和红帽的运营模式完全不同。京硕依靠各省各市的代理商来开拓市场,维护设备,而红帽一直依靠自己来进行投放和维护。所以京硕能够把机器投放到全国各地,而红帽只能覆盖郑州市场。因为共享打印机这个东西,是需要经常维护的,正常情况下就需要不断地加纸加墨,还会出现卡纸夹纸等异常情况,一旦出现了就必须马上派人去解决。京硕的设备主要投放在便利店里,给店主有分成,所以加纸取纸这些事情可以让商户来进行。但红帽就不同了, 他要组建一支庞大的运维团队到各处去进行维护。后来的事实证明,这种方式不适合社区项目这种点位大量且分散的情况。而且京硕不追求赢利,一直是以赔钱占市场的方略,而红帽要求投放出去的机器必须尽快赢利,所以在投放一段时间后,老板看到利润不足以覆盖成本,就把这个项目停掉了。
从那以后,我又开始了反思,以前一直以为动荡不安的生活是因为我入职的都是初创公司,所以后来有意识进成熟公司。但是又能怎么样呢?虽说公司不会倒闭,但是业务部门也是说撤就撤,同样没有一点保障,或许,是时候该离开这个行业了。
我不知道我转行以后还能做什么,但我开始尝试写作。我写了一部小说《另一个世界》,如果读者们有兴趣,上晋江文学城搜作者“鲁那西”就能看到我的全部作品。
15后记
2023年,我在美团担任外卖员。IT行业就是这样,来去自由。你来,他不劝阻,你走,他不挽留, 浪潮不会在意一滴水珠。所有的程序员都是从Hello world开始,又是从Goog By Code 结束。没有什么懊悔,也没有什么遗憾,有的只是无尽的怀念。
免责声明:因为这个回忆录记录的都是真实事件,为免泄露他人隐私,所以文中出现的公司名称和人名皆为化名。如有与现实中的公司重名,请勿追究并通知作者修改名称。
附录:月薪变动表