目录:
2009-2010小结(一)毕业前夕
2009-2010小结(二)初入职场
2009-2010小结(三)加班考验
2009-2010小结(四)抑郁重重
2009-2010小结(五)离职始末
在正式转到 H 手下之前,有件小事,不知道这件事有没有对后来起什么影响,但愿是我多虑了。那一次L1出差一周,所带的我这边项目交给H代管。有一次发不知道正式的还是非正式的release notes,H问我,SVN number要不要写的?我理解成他问我先前做法是怎样的,于是顺口回答说:不需要的。H说,你写上吧。我说好。我隐隐突然意识到不对劲,他只是代管一下,怎么会改变一些既定做法?
没有预料到之后不久,便有了前文所说的行政上的调整,这个项目也归H了。之后有一次台北的产品经理发需求过来,要添加的一项功能是,在Win7任务栏添加图标。经过一番调研之后我跟他汇报说,这事儿正规途径做不了,微软特意不允许以编程方式添加任务栏图标的;真要做只有hacking方法,blabla。言下之意是想让他拒绝掉这个需求。没想到他居然同意了用hacking手段!这在L1时代是完全不可能发生的,哪怕是一点点没有正规文档给出的方法都不许使用,宁可少点功能。同意归同意,他又不表示立即实施,时不时来问一下你准备如何如何,然后探讨探讨。
过一两天,有一次他又跑过来(位置还没换,所以隔得比较远),说,这功能我可不可以让D来做呀?我奇怪了:当然可以啊!(你说了算么)于是他表示要让D来做。那我就扔着,不做,网上东逛逛西看看。又过了一两天,那一天下午他过来让我加班,因为那功能需要做好。我又奇怪了,不说让D来做了么,做没做好,关我毛事啊,怎么又让我加班呢?由于这是第一次他让我加班,我什么也没说。到了晚上,我不管三七二十一,把那个他准备让D做的功能给做了——不是说因此加班么,那我给你搞定不就完事了?不知道他葫芦里卖的什么药。看到SVN提交的邮件以后,他又立马跑过来,带点惊讶地问我,你改了?然后又来看代码,问这问那,最后离开。
大家可能猜到了,我的期待彻底破灭,接下来是一段极其抑郁的生活。开始的时候加班是挺少,几乎没有。但是偶尔有的话,不会是那种任务很明确的,但就是让你呆着,好在都不是很晚。
关于刚才那个项目,还有另一番进展。不久以后,H突然跑过来跟我说,这个项目也差不多了,剩下的都是些维护工作了,我想把它先转给M(当时是我和M一起维护)和D,再慢慢转给D,把你们两个都空(解脱)出来。我说我手上只有这一件事了,那我干什么?他语焉不详地说了些什么,意思表示得好像是还有别的什么(重要)事情让我干。于是这项目便开始慢慢从我手上溜走。猛然间我感到一阵害怕,我手上都没事了,公司留我做什么?H是不是有什么想法?可是看H平时和和善善的,也很难揣摩他能有什么歹意。
接下来给我做的事情,是陆陆续续的好多survey。一开始叫survey一下Windows驱动。我问,公司有这样的项目么?他说有,并举了例子。好,我去survey。过了些天,我看他给的那个例子就是个简单的WinIO驱动,告诉我通讯协议我大概也能抄一个吧。于是我跟他汇报,那个例子基本上看得懂了,接下来要看什么/干什么?他像之前每次跟他汇报时一样,为难地抬起头,使劲想了想,然后叫我去看下文件系统过滤驱动。
好,看就看,找些电子书,挑一些可看性比较强的,打印了二三十页下来,慢慢磨。又过了些日子,觉得资料上面说的我大致能理解了,但是由于框架实在是太庞大了,不想去实验,就跑去问,这方面公司到底有什么要做的么?H说他觉得这些技术蛮有用的,以后肯定会用到的,云云。嗯?敢情是想拿我当技术储备?我就是survey帝啊!
再后来,让我去survey一下某品牌机自带的一键还原软件。我特意问,我们要做这个的?他说要的。于是我就拿着那个本子折腾来折腾去,耗了个把月吧。到最后实在想不出可以干什么,于是天天格它硬盘,拿着自己写的demo程序还原之。期间H偶尔过来看看,大多数时间不太理。
又想到一件事。某个加班的晚上,忘了是为了调试什么,H让我过去看他调。可能由于之前某一次他看到我开着OllyDgb玩(我只是会一些很简单的操作,知道怎么断住MessageBox罢了),他自言自语地嘀咕“那个叫什么名字来着”,然后打开了OllyDbg。他又问我是怎么操作的。我说我是截哪个函数,然后怎么怎么瞎看的。于是看他操作。只见他按键飞快,F8长按,整个屏幕滚下去,过会儿又作不对劲状,重新开始,又是飞快状,不知道他要干什么,于是我忍不住开口了,跟他说,我当时是先这样,然后看什么什么,大概可以得出什么结论。然后他有点儿照做的意思,可是过会儿又是操作飞快,整个屏幕在闪,看不出什么思路。我琢磨着他是不是没怎么用过这玩意儿啊,不会用就别拿出来显啊,拿你拿手的出来嘛。于是我又多话了。后来我也觉得我“提示”得多了,想不说,可是又觉得他是期待我说的样子;想说,又觉得他没叫我插嘴的样子;想走,又觉得他没叫我走的样子。十分尴尬。只好有一搭没一搭地说着。后来H终于怒了:你走!我一愣,怀疑是不是没听清楚,确定好像是真的,于是飞也似地跑了。半个小时以后,H拿了一些巧克力来分给我们,算是了结。之后我再也不敢在他面前提/玩OllyDbg,要玩就玩WinDbg,因为WinDbg我基本上完全不会用。
转眼到了年关,H给我的考核还是不错的。据模糊了解,不管是奖金还是涨幅,似乎都在平均水平之上。这里还要感谢下财务的W姐,给双薪的时候把我的实习期也算进去了,多少有点点心理安慰。
过年回来后仍是无所事事,3月初H到米国总部去了一趟,更加没事情做。M和D一直做着之前哪个项目的维护工作。H回来后,带来了米国老大们的一些新主意,M和H一个老部下L3以及H自己被H安排来做这件事。大约三月底左右吧,H手上有多出一个项目,是手上将个新项目的升级更新程序。他自己开始搭最初框架,然后扔一点活给我和另一个同事做。没过多久,H又表示要将它丢给我。他说,我们要重视一些设计工作。于是他拿StarUML画了些图,跟我说这个调了那个,那个调了谁。对着代码一看,果然不错,完全事实描述。可是你那些图仅仅表达了你是怎么做的,这怎么够?一点也没看出来为什么要这样设计。当时我第一次看到什么时序图啊,还有点抵制,这点我要做自我批评。虽然图不会看,可是代码还是会看的。不夸张的说,这整个代码一团糟,各种糟糕。一堆单件(一堆全局变量);业务代码中会充斥着一大段API调用序列(底层API没有封装到一两句话表达业务的程度);还有那个 WinInet 的返回结果里,case 到 timeout 之类的,老是来个 OnConnectFail(),搞得像个框架,可是正确的情况又直接刷刷刷写下来了,不见什么OnConnectSucceed(),到底哪部分框架那部分是用框架?仅仅一处小小的多线程部分,搞得到处锁。总而言之,一个模块,互相纠缠着的几个类,一层结构。为了搞个运行入口,居然建了个MFC SDI项目,在文件菜单建了一项来进入整个模块。
大家可能怀疑我说得太夸张了,这一点我不能举出什么证据。当然,也许牛逼的人喜欢看纠结的代码,这是水平。像我这样的菜鸟只喜欢看简单的代码,除非有必要才增加模块和层次,这才变得复杂一点点。我从那时起开始怀疑技术到底是什么,是不是多会用几个API就是技术达人?
好了言归正传,这个项目脱离demo,要变得正式一点,H让我把他整成一个 Windows Service。好,我整,去掉哪个MFC的框,重新建了个 Service 的框架,然后入口放进去。我以为很轻松的一件事。结果,编译不过,一看,有写代码用了MFC的类,CFile啦,CFindFile啦,,,好在总量不是很恐怖。我去跟H说,代码里有一些用到MFC的,Windows Service有没有界面,加上涉及到的一些功能用MFC也不见得多方便,都改为Win32 API吧。H不置可否,大意上说了句,程序里用MFC我觉得蛮常见的,大多数都用的吧。我反驳了句,那也看场合啊,我们现在完全没必要引入MFC这个大依赖么。H没有再说什么。我回头将它们全部改掉,用CreateFile,FindFirstFile……。这边刚改完,H又提交了一部分代码,又是CFindFile,像是刚才什么都没跟他说过似的。日!继续改!
接下来两天,一直在考虑这个东西丢给我我能维护多久。思来想去觉得会坚持不住,我非常不愿意一个系统从一开始就是“老系统”。于是给H发了封邮件,说这些代码虽然“有设计”,可是结构化不是很到位,然后给了一张通俗的框图,表示这块干什么那块干什么,这块只知道什么只需要处理什么,那块又如何,而不用大家谁都知道谁。H过来表示“是啊”的感慨,然后又说了一些不着边际的话(也许是着边际的,只不过我没记住),最后什么决定也没做出。接下去几天,我时不时追问他,可不可以动手改,他总是用一些话来搪塞,大概是些——“我觉得…总体是好的,只是,……”,“我觉得OK啊,不过明天的版本先出了”。我在问的同时,也在积极准备着,终于,在某个不得不改的时刻,我把它们全提交上去了。原来的代码仍旧放在那个目录不动,我不敢特意去做删这个动作,太敏感。过了一会儿,大概H看到邮件了,又跑过来问:改了?会不会有什么问题?云云。
——这是我在H手下干的最傻逼的事情,没有之一。这件事我跟一些人提过,今天把它完整的写出来,也期待大家批评。我尽我的努力使我的描述尽可能客观,但主观性仍然是不可避免的。关于那个代码是不是真有那么糟糕,是最容易带有主观性的,请大家自行判断吧,我只能说很糟糕。做这件事情之前曾请教过M到底做不做好,M说如果为了项目好就应该做。回想起这一番,我有时候心理阴暗面来了,也会怀疑M那时候是不是阴我。不过M似乎没有阴我的动机,可能在L1手下我比他稍微春风得意一些,但在H手下他明显比我滋润,没必要啊。(M如果看到请别介意哈。)
之后挺明显的感到H不愿意管这个项目了,也有点选择性不了解该项目。经常有什么新需求就答应下来,也不考虑现有设计能不能容纳,我过去问他,他又装作不知道的样子,只说这怎样怎样就可以了,是可以做的。我又问那么这个改过之后接下来那些部分可能要改的可能不会改的,我好做应对,他又不知道了。不知道可能是选择性的,但是对于需求的控制他这是发自内心的。因为在他自己也参与的那个项目里,也是不停地改,三天两头改,最后H跟PM闹起来,干脆不理PM了。后来只好请QA MM J姐帮忙中转。所以现在我想,他原来那个一层式结构确实是适合这样折腾的。反观L1带的东西,几乎所有未来一两个月内的新需求,都是不会伤害到现有基本框架的,很多都是落入我们的预测的,往往变成了改个配置项这样简单的事情。曾经沧海难为水啊。当然H也会设配置项,可是设置的时候没有逻辑性,某个选项代表什么没法用一句话概括出来,大多数只能总结为,某个选项打开表示PM某个需求所要求的功能开启。
关于H,我想我可以可以写好多好多。
H曾经看到我写 CString.Relpace(“{PlaceHolder}”,“XXX”),问,为什么不用 sprintf 呢?我无言以对。
H看到我开着IE,会问,你为什么不用Firefox?我无言以对。
H看到我开着IE,会问,你为什么不用Chrome?我无言以对。
H看到我开着IE,叹了口气,你就是个微软迷……我,我作委屈状。
H看到我在Word里打公式,会问你为什么不用Mathtype?我无言以对。
H看到我写注册表,会问,你为什么不写ini文件?我不知道我写ini了他会不会问我为什么不写注册表。
……
从此讨厌“为什么不”的问法。
自从我改了H的代码之后,H就经常的说我的程序都是同步的,没法即时退出。限于水平问题,当时没一下子理解。好在是个服务程序,业务上也需要持续不断跑,只有关机或者关闭服务的时候停止就可以了。这时候我安全退出和系统来强制结束的表面效果没多少差异。等我明白这个问题之后,在9月份的第二版本中,我把这个问题全部改掉了,不留一丝同步的影子,H之后便没说什么了。只是第二版的上线,由于对TP提供API等等,需要H对外公布。而H处于对此不管事状态,加上别的项目也比较紧,一直没上,直到我离职,也只是内部release,没有出正式版。
自从改了H的代码之后,H就不太让我碰C++的东西了,有一次H曾让我去survey FileFox 插件。当时看了两天,写了个 Hello word 级别的插件,然后报告survey结束,有什么正式需求。结果让继续survey,并被问有没有做这个方向的兴趣,有的话可以和Linux端的人一起做那方面的项目。我或委婉或直接地表示不要写js,不要为mozilla的野心服务,不看好FireFox平台,我要继续玩C++。过了些日子,被要求二选一,FireFox插件,或者Windows下的可能涉及D3D的另一个项目。我断然选择了后者。这个项目一开始也是在H手上的,可是不知为什么后来突然被L2拿去了。L2派手下T来做,因为我那时已经为此survey了一些时候了,便让T和我一起做。这时候才感到L2的好啊。除了加班,对于L2我真的挑剔不出什么了——据说L2现在也会安排周任务了。我想多花些时间在L2的项目上,H又说他这边的更新程序任务重,那边的优先级低,有一次主动为我向那个项目告假2周,导致后来我进度上落后于T,其实这边也就是几个顽固bug而已。
其中一个bug是crash,各种表现。最后查出是crash在InternetOpenUrl的函数里。摸索了一段时间后,发现使用过 SH 系列 API 后,在某些机器上就会 100% crash,为此当时还在这里发了一篇文章。把 SH 去掉之后,现象平息了一阵子。后来,随着测试的深入,又报了。这下可没办法了。H自己也没办法。再很后来很后来,我找到了一篇微软的文章,说 WinInet 不支持在 Service 里使用,并建议转用 WinHttp。至于为什么用WinInet,这里又有一段故事。很早的时候,在我刚进去不久的时候,当时那个项目也有网络交互,当时年少无知的我找了一段例子,是socket的。(那个作者还写了这么一句注释://If it works, it is written by masterz, otherwise I don't know who write it.)我用它搞了个支持 Http Get 和 Http Post 的小玩意儿。后来项目转到H手上的时候,H看了说,你为什么不用WinInet呢?你的不能支持跳转,不能支持https,并给了一堆WinInet函数名。(可是他为什么不指导我完善它呢?)我说我当初并不知道WinInet的存在,并问他改吗。他说不用改了。所以后来他把升级更新程序的网络下载模块丢给我的时候,我就用WinInet了。好,回到现在,我发了封邮件给H,说WinInet在Service中不被支持,这可能是crash的原因,建议使用WinHttp,并告知WinHttp在没有打SP1的XP里不支持。他回复说他觉得“OK”,但是他认为需要支持不带SP1的XP。这相当于被变相打回了。但是他有没有因此宣布此bug可以不修复,之后的日日夜夜,J总是因为这个bug的各种表现来找我。
H自己手上那个项目据说忙得很,他和M、L3甚至忙到天天加班,却从不要我加班,也不让我参与。有时候碰上几个界面的,M说ATL写界面不方便,H就叫我写个网页,M在外面套个IE控件,这才零星有我一点点事。有一次我跟V姐抱怨了几句,说在H手下被边缘化了,什么都没我的事。V说怎么会啊,H每次说起你都说你挺不错的,他很喜欢你的。(是吗?)也不知道V有没有帮忙传达过什么,第二天H就让我加班,找的理由是我写的界面跟他们也是有关系的,要发版本,要确保没问题。我就做着网上随便逛逛,最后跟他们一起回去。之后每次加班H都要叫上我了,大部分时间事情都不是很多,我就当放松下,大家一起玩玩,再蹭顿晚饭了。其实到了这时,由于长期无事,倒是有点期待加班了,之前对于加班的憎恨也不知不觉地化解了。我细细地观察了H的加班,其实跟L2的加班是一模一样的,都是没有明确的下班目标,都是由于临近发版本,都是由于更早的时候没有做好任务安排以至于到了快发版本了才发现时间不够。
我手上那个升级程序的项目,H几乎没怎么管过,搞得我每天都不知道做什么。我只知道大约几个月后要发布。至于周任务、月任务,都是没有的。有一次H可能真的被他那边的事情纠缠地搞不清楚了,终于召集他手下所有人,把接下去几天的任务说了下,并且也说了这件事谁做那件事谁做。他是画在白板上的,我们都没抄下来,结束的时候拿手机拍了下。我满以为他会发邮件再通知一遍的,哪知道神马也没有。我不知道他开那个会干嘛来着,也许不是为了明确我们的任务,只是为了用我们所有人的力量为他整理思路而已。
长期的空闲状态让我压抑,并且效率明显降低。同样一件事,现在的我比两年前的我肯定完成得慢很多。我开始担心自己的前途问题。我现在写的所有关于H的,都是在空闲的时候反反复复回忆过的、思考过的,我很惊讶我尽然花了这么多精力去思考那么多事,也惊讶尽然有那么多事让我久久不能忘怀。我总结了H的一些特点:
- 不看邮件。往往发给他的邮件了,过了大半天跑过来问,告诉他邮件里写了,回答我没看。
- 不看文档。每次看他打开WORD文档,就滚得老快,像很熟悉似的,但找不着要找的内容。
- 喜欢在谈业务的时候说技术名词。(例:本来说升级程序连接上服务器了应该查询什么信息,会被描述成:我们会发一个TCP包,……)
- 喜欢在谈上层业务的时候时时刻刻问底层实现。(例:跟他说“连上服务器了,然后怎么怎么”,会被打断问:是一次TCP连接吗?)
- 喜欢在谈上层技术的时候问下层实现。(例:明明我们用的全是HTTP层次的API,非得每次说TCP包)
- 以为只有技术问题。(例:明明某些bug只是我们这样定义,QA认为应该那样定义,只是定义问题,争论不下去找他,他会先问我,“你这样做有什么困难?”)
- 没有逻辑。(例:有一次好像企图让某应用程序包含升级程序,想让被包含着的升级程序又包含该应用程序。)
- 没有业务概念。跟他讲话没法跟他概括出功能名词,提“某某功能”。如果要提某某功能,只能把这功能的全部API调用序列罗列一遍,他才能精确明白我在说什么。同样,他会用某些技术词汇来描述某某功能,我也听不懂。甚至不知道什么意思自造词,如:“我记得XP的是支持System Level的MUI的,Vista开始才支持Application Level的MUI的。”从来没有明白过这两个Level是什么意思,虽然我知道MUI在XP和Vista里有区别。
- 没有设计理念,虽然会画UML,忠实表达他代码是怎么写的。
- 不会拒绝需求,也不会预测需求以利于提前设计。
- 不主动向上请示。遇到我不好决定的事情,去问他,他也不好决定,也不问上级,也不做个有预测性的决定,任由我不知所措。
- 开会经常闲扯,每次被他打断好多次,不局限于部门内的会议里。让人不能专心。可能他认为这是制造轻松氛围的方式。
- 怕给别的部门造成任务。所以不管某些内容应不应该放在我们这边做,经常认为需要自己做,以为让别人做是态度不端正,“事情总是要做的”。那个升级程序的第二版,之所以要设计API,就是为了不要包含各种应用程序的复杂需求,但TP同事说下载失败了,他就来问我,你有没有做重试啊。我说当然没有啊,我只是给出了一种机制让他知道是成功还是失败了,要不要重试、用怎样的重试策略,明显应该他来么。见我坚决,他又装着很抱歉的样子,跟TP同事说我们重试没有做,你们那边方不方便做一下……
- 怕别人给自己造成任务。Test case 评审的时候,见J列了好几屏的case,他就抱怨说,你们搞得也太细了吧,这么多条,能测完么?那一次QA老大A义正言辞的说:这些需求,这些功能,本来需要这么多case来保证;这些都是我们分内的事,不管多还是少,只要是我们该做的,我们就要做。听得我暗暗感动了一番,自此以后总是在心里默默地钦佩他。
- 不给别人发言机会。就算自己业务不熟,也抢别人话,结果传达的总是有偏差。听他沟通以及与他沟通都是很辛苦的,不知道在谈业务还是在谈技术,反正一会儿这个一会儿那个,很具有跳跃性。有一次他让某同学做主题演讲,分享前阶段survey的内容,结果人家放了PPT开讲,他在下面的补充占了80%的时间,上面那个倒像是主持人了。
- 最重要的一点,不花心思好好安排别人的任务,总是专心写代码,与民争活。
刚到他手下的时候,我总觉得不对劲,我前前后后跟他谈过好多次(当然后来死心了不找他谈话了)。有一次他说“我可能对于自己作为RD还是作为Leader,身份上没有区分清楚”,仅这一点,既然自知,何必占这个位置呢?不是每个人都能管人的,这要影响到别人的职业生涯,还要影响到公司的人员流失问题,后果非常严重啊。他的组,从09年中手下十多号人,到现在的三四个人。有点点想法的人,要么去别的公司了,要么去别的部门了。我想他没有好好思考过。倒是给离开的人编好了冠冕堂皇的理由,以便与人解释。
用一个已经离职的同事的话说,XX项目,从需求、技术、搭框架、写代码,H都能一个人搞定,要我们干什么。
另一个同事说:H是个全才,但他不会做Leader。
我想,H要是一个和我平级的同事,除了对他没有设计理念这一点不看好以外,我应该也会蛮崇敬他的吧,毕竟人家会用这么多API呢。
H还说,对于项目,我必须亲手搭个框架写写代码,才能知道水有多深。可是,你要亲手体验水有多深又是何必呢,让手下人告诉你水有多深不也一样么?
今年六月份,公司有一次计划外的加薪,H对我还是很给力的;年中的奖金也不少。另有一次我生病了,H叫了另一个有车的同事一起把我送回住处,还帮烧了开水,嘘寒问暖一番后才离开。还有当初是H让我第一次通过了一面,从而拿到人生第一个offer……可以说,除了具体工作上,H对我真的还是非常不错的,他也曾几次和J诉说:我觉得我对他还是不错的啊。也许我不该对他有那么多看法。可是,每次有不同意见,你为什么老是以“我觉得你对我有意见”强制结束讨论并且不问具体“意见”呢?
我记得CppBlog里有一位貌似从事管理的朋友发了一些文章,说要如何如何管理,并要如何永不重用某些手下。我一对照,某些情节和H的做法非常相似,于是在评论里比较激烈的回复了他,希望他的手下好运。
本篇就写了两个晚上了,就到这里吧,字里行间可能充满了怨怼,如果影响您心情了,小弟这厢给您赔礼了。下一篇将谈谈离职始末。关于我对H的种种,我知道也是充满了偏见的,如果有做得/想得不对的,希望大家多些批评,多多纠正。
----------华丽的分割线,如果以后又想起H其人其事忍不住想添加,就加在后面----------
2009年3月,公司要搞QT培训,H部门,也就是我所在的部门出人的。但是H压根儿没跟我说有这回事。后来别的组的人都在各自老大的通知下知道了,我是本组的却不知道。H从米国回来后问我有没有去听啊,我说没有。我不知道他为什么认为我已经知道了这个消息了。搞得好像我没兴趣似的。不过这培训我确实可能没兴趣,演讲者一般只是介绍API使用,鲜有自己的思考。关键在于H通知不到位。
posted on 2011-01-25 22:17
溪流 阅读(2141)
评论(10) 编辑 收藏 引用 所属分类:
Other