华为三年纪念——(9)第一年下,忙碌的新项目

七八月份这段时间最为无聊了,没有啥事情做,属于青黄不接的样子。在这里,上面的看着大家闲着,得搞点事情做才行,晚上也不得走,美其名曰安排一些培训,这点我十分反感。当时正值老技术卖不了钱的时候,大家都来学新技术。看胶片,看文档,晚上就来讲。每天都在磨洋工,为啥不下午组织时间来学习交流,非要搞到晚上?!

这段时间我经常和我的PL和PM一起走,晚上“交流”完,大概8点,大家一起走人。其实大家都想回家,只是经常走得太早,领导会看着不爽。在这种所谓的“加班”氛围中,自然做事没啥效率了。既没有真正学到东西,又浪费了时间,还少了很多自己提高的时间。

9月份,部门开始集中力量搞一个所谓的新产品出来。其实也是老瓶装新酒,不明确的需求,各种不同的方案都搅和在一起。心急的项目经理想在需求都还没搞清楚之前就让我们写代码了,美其名曰“迭代0”。那段时间我们以为真的是做新产品了,但总觉得产品的卖点很少,一直折腾折腾。

这期间的一个迭代周期,我硬是将那个乱糟糟的模块重写了,用状态机的设计模式来搞了一遍。写代码的时间,加起来也就只有几天,最终统计出来我的代码有好几千。困难重重的测试用例,用到了很多Google Test和Google Mock的高级用法。现在回想起来,由于禁锢于老代码,测试用例写的都不算太好。测试状态机时使用了太多的mock,以至于调试起来都比较困难。

带这些代码的质量确实很好,只是大家看不懂。第二年评优秀代码的时候,将我的代码提交了上去,但评委都说看不懂。简洁的函数,他们找不到调用的地方,不知道这些函数怎么用的。没有设计模式的思想,怎么能看懂呢?周围的同事的水平都很一般,只有一个同事能够看懂这些代码,觉得写得很优雅,这就够了。用State Machine Compiler工具,还能绘制出状态机的图,非常方便问题定位及修改。

当时觉得写得比较好的代码,最终还是封存在了硬盘中。连续奋战了3个月,说是要准备过TR4,结果就突然项目就没影了,停了。以至于休婚嫁回来以后,突然又做回了老版本。这意味着这个产品以失败而告终。

这段最忙的时间,也是我收货爱情的时光。9月份办完了婚事,10月到丽江旅游,这段时间至今映像深刻。休婚嫁的事,还好我做了计划。在8月份那阵已经和PL说了一下,但9月份起了项目。11月份,我们怀上了小宝宝,再不修婚嫁就比较烦了。又在11月份说了一下意向。这一年的春节过得比较早,1月10多号就是春节。为了玩的比较久一点,就想把这个婚嫁和春节在一起休。最终,在12月底,得到了PL的同意,说本来把这个模块搞好了,就可以休了。按照当时的进度,在1月初完成绝对没有问题。

就怕就怕领导插一脚。当时我们的LM生孩子去了,找了另外一个LM过来。在当我的模块做到接近尾声的时候,突然叫我到以前的项目去做一个需求。竟然要2人月时间。我的婚嫁怎么办?一肚子的火。我就只有10个工作日时间,如何完成?我要了一个人。好吧,给了我一个新员工,没差点气吐血。还好经过几天的奋战,需求搞定了。每天都是电话讨论,然后指导新员工写代码。这个新员工还好,有一定工作经验,写过代码,还算顺利完成任务。

可恶的是,这个LM给我说,婚假嘛,到时候可以拆开休嘛,给你算内部调休嘛,随时可以调休的。领导的饼,我消化不良。我没听他的,一直坚持要求要连着休,不给一丝退路。事实证明我的坚持是对的。我刚刚休完假回来,轮到另一个同事休,他就听了这个人的说法,休了一半。后面的几天,想休,那是再也无法连着休了。我真的很想骂脏话。

下半年的生活,过得算是比较辛苦。在女人怀孕的时候,要多点关照,多点温暖,早点下班,多陪陪她。切记婚假是连着休的,切勿相信领导的饼,那是有保质期的,而且特别难吃。这一年,就已经成了老员工了,人际交往中平滑而又有原则,同事相处和谐,在公司也有自己的一席地位,说话也稍微有点分量了。

写到这里,在华为的生活就已经过半了。

Enabling Dual Wan on Windows

All you gotta do is add some keys into your registry and you’ll be set!

Browse into:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetBTParameters

and add these Dword Keys/Values:
RandomAdapter = 1
SingleResponse = 1

Reboot your computer.. and you’re set! Plug each modem on your ethernet board and enjoy!

华为三年纪念——(8)第一年上

一年的事情,回想起来好长。

转正后享受着早上8点到9点的弹性,也就用不着那么早起床了。但如果每天都这么玩的话,每天的平均工时自然是不够的。所以,来得很晚的同事,为了将每天1个小时补足,只能. . 4晚上多干两个小时左右。弹性工作当然是针对所有的研发员工,但要享受这个待遇,坐班车是不可能了。租房的、开车的、抑或走路骑车的,都可以享受到这样的待遇。我总想下午早点走,所以每天早上弹性时间不久,最怕的是下午下班时,突然接到电话,说晚上要干啥干啥。

一个人的力量,是无法撼动整个地球的。大家是一个团体,你的效率在搞,和一群效率低下,只想着晚上加班的人在一起,只得适应这样的生活。

转正后,交接的两位同事也会深圳了。剩下的项目组的几个人奋斗。第一次经历产品TR5发布前的测试,真是折腾死人。一堆一堆的问题接踵而至,似乎这些问题之前都隐藏了起来。越到后面,修正问题的成本越高,每修改一个问题,都要经历自测试、代码检视、手工测试,然后提交。其实内部的DTS系统的流程还是做的比较规范的,每个步骤都有,用起来还是可以,只是稍显麻烦。虽然经历了这些步骤,但我接手的那两个模块由于太复杂,有很多的特殊条件,也没任何的Low Level Test,造成质量很难评估。

有一次,刚刚修改了问题上库,成都测试没问题,但刚刚要发布,深圳那边爆出了一个严重问题,由于我的修改导致。其实我就修改了一点点,牵一发动全身的这种感觉,你会觉得毛骨悚然。当时交接的同事还和我一起写的那些代码,每一行都是他看过的。居然还出现问题,那到底是我技术有问题,还是代码本身有问题?我更相信后者。我总结的只要会if..else,在这里就能混下去了,有些还混得很好。

我最讨厌的是出了问题以后,领导过来分析原因,扯上一堆人,最后得出一个“低级错误”。什么变量赋值又出问题啦,数值为BYTE的被赋予了WORD型造成截断啊啥的。总是批评说我们不认真、不仔细,不遵守“编程规范”等等。其实,人本来就是一个容易出错误的高级动物而已。明知道变量类型有可能改变,为什么还在用匈牙利命令法,并且最新的编程规范已经不推荐使用了。更可怕的是很多人以这个作为判断类型的。如果一个行代码这么写:

void func(BYTE byInput)
{ BYTE byVar = byInput;
} 说不定哪天接口改成了WORD,虽然你修改了头文件和实现,但恐怕很难再去修改这个byInput,造成迷惑。后续代码检视时,往往可能看中间的部分,如果没看函数头,则很容易认为你这是对的。所以,我的代码中不写匈牙利命名。以至于PL批评我和大家的风格不统一,每次代码检视都给我提出。后来也为了不麻烦,还是用了一下。

上半年,加班不算太多,但部门已经开始慢慢的衰退。我刚才进公司时,导师给我介绍产品时,就说这个产品已经是夕阳了。每次大领导开会时,都会提到现金牛几个字来鼓舞人心。前几次,我还听得兴奋不已,后来再听的时候,只觉得是耳边风罢了。

这一年,公司利润很好,分红很高。在天府软件园B7楼下,还没发奖金和股票,一群售楼的就每天轮番轰炸。一些资历老一些的同事拿了分红,买个车。可见,在华为干得比较久的真是高富帅一群。但对于我们应届毕业生来讲,一切都是浮云,第一年拿到一点点奖金,只能途个羡慕。

上半年加班最晚的一次到了凌晨2点过到家。年中,产品过了TR6,没啥事情干了。. 7月正是慢慢火热的时候,但我感觉还比较清闲。这段时间就用来读书,我喜欢看书,看《重构》一书。

机遇总是给已经准备好了的人。PL找到我说有一个顾问要过来,问我有没有时间和他一起将我那个糟糕的模块做一些重构。我说有啊,PL也相当支持我的工作,至今我都感激他给了我一周的时间,能够和敏捷顾问一起坐下来,全职的投入到重构中。顾问也觉得幸运,我能有那么多的时间。他说很多时候只能到一个项目组待上一两天,零零散散的,总被员工的一些杂事或者需要定位问题等打断。

由于老模块的腐化很严重,一个“模块”,一个.CPP就1万多行代码,你说不乱么?我们对整个CPP做了分析,手工拆出来几个函数变成类。然后我们针对两个高达500多行的两个复杂函数,也是很容易出错的函数进行重构。对于这种大型代码,《重构》一书中提到边覆盖边重构的思路,很爽。我也是拿了书,和顾问一起,他用的方法我叫他在书中帮我提示一下,每天回家后再仔细看一下。

这样,我们用Google Test和Google Mock对函数进行一次一次的打桩、测试、重构、测试,将这两个函数拆成了很多个小函数,原来庞大的一个函数变成了10行以内函数,清晰度很高。每个小函数集中功能。顾问对函数的命名也颇为讲究,总是反复和我讨论抽取的函数的职责,反复研讨函数名。对于复杂逻辑,我们写真值表,将以前看起来复杂不堪的逻辑简化成了几个条件或者函数,一目了然。代码分支覆盖率100%,每一个函数都测试到了,重构起来相当放心。这种体验真是棒极了!

但,这个重构后的代码,并没有用于产品中,理由是大家认为这些代码没有经过长期测试,放上去怕出问题。好吧,这次的经历对我来说难得,这个星期的学习,真正让我的软件能力提升了一个档次,知道了重构的方法,为我后续的成长指明了道路。

华为三年纪念——(7)转正

转正周期是6个月,从入职开始算起。那么,2011年1月份就转正了。

刚入项目组时,第一个月在一个项目组呆了一段时间,写了一点点代码,做了些CI的工作。主要是在效率提升上,将产品的编译速度提高了15倍。为此还得了金网络奖。这种奖励就是部门的奖励而已,比较小,200块钱,但还是不错了。新员工刚入职不久能得到这种奖励的凤毛麟角。其实,作为一个程序员来讲,并不是光了解程序就好了,对程序开发以外的东西,例如工具、硬件、系统等都要有一些了解,整个知识面才是完整的。在华为我做了很多的工具,有自动下载合并网元日志、自动代码比较报告获取等很多工具,后续我想起了再详细讲一下。

9月份的时候,被告知要到另外一个项目组去了,说是去做骨干。当初听“骨干”这两个玩意儿,以为自己还很牛逼呢,才来了一个多月就成了“骨干”。后来才搞明白,原来做的产品是骨干网络上用的产品。汗死。从深圳过来的两个同事,分别交接工作给我,然后还有一个同事到成都,就组成了后续成都的项目组。人也不多,就三个,外加一个PL。

交接的模块是产品中比较重要的两个模块,一个负责算路径,一个负责将路径发送到各个单板中。当然,作为骨干设备,大容量高规格,使得这两个模块的维护显得比较麻烦。有趣的是,虽然交接期也只有4个月,但我还是尽量不加班,下班没事就跑了。以至于他们写邮件给我,说成研所有不成为的规矩,星期1,2,4是需要加班的。好吧,我就好好地表现了几天,又开始准时下班了。以至于一直到离职前,有些同事对我晚上加班都觉得比较稀奇。为啥晚上要在哪里磨蹭呢?为什么不以提高效率来高效工作呢?为什么我要看别人的脸色来呢?我不怎么做得到。我期望我的生活是高效的,期望我的时间过的是充分的。我想多给我家人一些时间在一起,即便我在家里看看书,或者打打游戏,只要一家人在一起,能够吃个饭,再累再辛苦,也是值得的。所以我近几年的劳动态度都是B,全年绩效一直B+。如果我晚上10点过再走的话,肯定几年就A了。有必要么?

当时我还很担心国庆节要不要加班呢?在华为生活几年都被加班的阴云笼罩着。国庆节前就有小道消息说可能要加班4天。总共才7天加班4天,加来干啥呢?管他的,已经订好了机票到广州,任你怎么折腾吧。结果到了国庆节,一天都没有加班。

第一年的国庆节到晓东家来了一趟,前几天在深圳去了海边,吃了小肥羊。这一次到广州之旅,算是一个转折。见了当时的阿姨叔叔,然后回成都。经历了两三个月的考虑和周折,终于在12月24号圣诞节,宝贝来了成都。

10月份的交接工作,进展的紧张而又繁琐。代码的质量,算是有些折腾,经常会看到乱七八糟的代码,在代码中随时都能闻到臭味道。长函数、各种标志的使用,让人摸不到头脑。还好Eclipse或者SlickEdit有代码折叠功能,否则很难理解一段代码。没有单元测试,让功能的修改只能靠手工的验收,很担心修改一行代码影响到了另外的功能。这种事情在我身上发生过两三次。即便很小心,也难于彻底避免这种情况。我认为应该在代码层次上就要控制这种问题。长代码、标志,嵌套数层的if…else,都应该从设计上避免。在离职前,我最后的代码中,我很不忍心的写下了一些switch…case。因为项目紧张,一个烂的设计,能解决问题,功能正确,也就OK了。没人关心你背后的心血。在离职之前一年,软件部的领导们终于认识到这些问题,提出功能正确的代码是基本,要写更好的代码。

另外,在公司我觉得很不爽的是对于公司绝大部分人的选择——SourceInsight,真是个彻底的文本阅读器。刚来公司我还以为这个是标配呢,后来发现原来这个东西真的太烂,几年没有更新不说,对于Unicode、类层次浏览、函数跳转浏览、正则表达式查询、代码折叠、等支持的太过于初级。我放弃使用这个玩意儿。

我的选择很多:Eclipse、Kdevelop、CodeBlock、VIM、Emacs、SlickEdit。

Eclipse:当年的Eclipse的CDT很烂,对于大型代码的解析不给力,所以没办法,放弃了。但12年开始,Eclipse伽利略版本,CDT就很爽了,后续的Juno更爽了,用到我离职。

KDevelop:针对于KDE还可以,但我们代码中没法用。

CodeBlock:轻量级的,还是很好用,但我没用,功能不太满足需求。

VIM、Emacs:学习成本太高,对于C的支持靠Ctag或者cscope。但这两个都对C++的代码理解不到位,很难浏览代码。对于C的应该很爽。

SlickEdit:比较重量级的,跨平台的商业软件。对于C++的支持还不错,浏览代码啥的都比较给力。唯一的缺点就是速度较慢。在Eclipse伽利略之前,我用了这个1年多。

最终的选择,就是SlickEdit,然后是Eclipse。工欲善其事必先利其器,花点时间选择一款好的工具,会让您效率倍增。之前有新员工入职时,我推荐他用Eclipse,但需要一些小小的配置才能用的比较好。我帮他配置好了以后,用了一段时间,但最终还是随大流用回了SourceInsight。在走之前,还看到他们艰难的浏览着继承结构的代码,要从SourceInsight N多个文本搜索结果中选择一个合适的、没有正则表达式匹配查询函数等等,我就很淡定的给他们演示Eclipse中的类结构跳转、对于虚函数的导航、模糊查找、代码折叠等功能。当然,他们仅仅是觉得哇,好强大而已,未曾尝试过新鲜事物。萝卜白菜吧……扯远了。

其实感觉6个月时间,算上第一个月的培训,第二个月的刚入职适应期,只剩下三个月时间好好地做一些事情。在这期间,我获得过两次金网络奖励,抓住效率低下的地方,真正提高了效率体现了实力。对我了解的人都不会由于早走而说我。

12月底,开始准备答辩了。当时由于项目不算紧张,PL给了我大把的时间做好PPT。当然,做PPT也是我的强项,当年毕业的时候做的3D PPT就把老师些看傻了。同样的,毕业答辩的PPT也需要别出心裁。另外,PPT在华为,也称之为“胶片”。所以走到外面一听到胶片二字,多半这人在华为干过。

我参考了一下其他同事的转正胶片,都依照转正答辩胶片模板那样的“朴素”。模板就是模板,仅仅是一个参考而已。

第一页,我就创新的贴了一个整个团队的照片,然后附上PL和思想导师的头像,这样就生动多了。然后每一页的PPT的换页都是精心选择,反复播放。文字不多,以精美的图片和动画代替文字,给讲解留下空间,并且能够很好地展示对知识的理解。这个胶片,以至于参加过我答辩的MDEG组长都称赞非常棒。

当然,答辩的PPT是一方面,精心的组织语言是另一方面。幸运的是,在答辩前,我们进行了一次预答辩,对讲解中的不好的地方又重新组织了语言。答辩完了,我们当时的LM帮我去问了一下,悄悄告诉我说,答辩的专家都非常满意,我忐忑的心终于落下来了。最终公布结果的时候,顺利的得到了A。

一个良好的开端很重要,踏踏实实的做一些事情,最终会收获很多。

华为三年纪念——(6)成研第一天的生活

飞机起飞了。按照晓东的嘱咐,必须要起飞后才能拆盒子。拆开盒子,有许多的星星,躺在星星上面的还有一本小笔记本。翻开日记本,每篇都写满了我们的回忆,那差点就逝去的记忆,被定格在一页一页之中。你在楼顶看我的飞机飞过么?城市的上空,装满了思念,眼眶中,充满了泪水。我不忍大家看到我的软弱与无助,不想看到别人说男儿有泪不轻弹,只因未到伤心处。伤心了,泪点大滴大滴。打开笔记本电脑,写下一万米高空的思念。

回到家,稍事整理,第二天就上班了。

早上上班比较早,8点钟就要刷卡。未转正的员工是没有弹性上下班的,所以必须得早到。到部门报道后,先是去找了秘书,然后就分配了项目组,找到了PL。PL戴总很热情的接待,带我到LM办公室去参观了一下,但LM人不在。当时还不知道LM是个啥,只知道是PL的头头。办公室是一间一间隔开的,比较安静,环境还可以的。我本以为就在这里工作了,结果PL说,走,我带你去实验室。

下了一楼,来到了实验室。一条一条的长的绿色的桌子,上面摆了电脑。到处噪音很大,设备的啸叫声、电话声参杂一片,完全感觉是步入了工厂。不是吧?以后我就在这种环境中工作?!PL给我介绍了一下整个项目组,这个是吴总、这个是秦总、这个是耿总。PL走到一个叫吴总的人旁边,给我说这就是我的思想导师。也就是新员工刚进来的时候的导师。然后安排了一个坐位坐旁边。好吧,我还真要在这里工作了。感觉电视里面看的那种干净、安静的办公室真是一种奢侈的享受了。

花了一些时间介绍了一下自己以及自己做了些什么,然后去领了电脑。配置了NOTES办公软件,加入域等等以后,基本上就可以开始干活了。中午,终于见到了LM,LM叫“杜邦”,其实真名不是这个。中午在天府软件园B7楼下的车库里面吃的饭。饭菜那些还真是差强人意,和深圳的比起来还是有点差距。主要是在车库里面吃饭,又热又暗,觉得很不爽的样子。餐盘和狗盘盘一样,咋我总觉得和这个业界牛叉的通讯公司的身份不符呢?中午吃饭就随便聊了聊。自己也是话多,啥都说。

但有一个事我半天没想明白,怎么这里的人都是X总X总呢?

中午可以睡个午觉,这个是华为的传统。有些外面的人说呢,床垫是为了晚上加班用。事实上,这个床中午用来休息的,还是不错。至今,晚上加班用,我就用过一次。那次是定位一个很复杂的问题,需要测试的同事来重现问题。问了一下需要多久,重现一次需要至少3个小时。算了,我知道今晚必定是很晚回家。我就吃晚饭,打了地铺睡一会儿,等结果出来了我就上。一般来说8点40之前,都是所谓的“正常加班”时间。看成正常上班就好了。一个人在睡,其实也睡不着,休息一下也是好的。当时我们的LM是一个胖胖的MM,人挺好,走过我这里的时候发现躺在地上,觉得事态严重,问了我一下咋回事,有没有不舒服啥的。我就如实说了,她说这个思路好。晚上10点过,终于出来结果了,上。这时候,精神抖擞,到凌晨2点过终于找到问题所在。还是要感谢睡了那么一觉,感谢有个床,能够睡得好一点。

下午熟悉一下公司的各种制度和IT环境,也没啥事干。下午5点半下班了,看师傅还在,就没有赶走。师傅说,走了走了,没事下班就走。好吧,我就打了个招呼,就出发了。事实上,对于新员工,基本上不提倡“加班”的。周末也不加班,因为实习期内没有工资。当然,悲催的是我离开前那一批新员工,由于项目的原因,他们“被加班”了。

下班就走,我延续了很久,以至于很多同事觉得我有点不入流。很多新员工都留下来晚上“自愿加班”,而我不干。后来转正答辩的时候,我这个不加班的,也能轻松的得到唯一的一个A。“加班”并不是一个工作好坏的直接判断标准,如果这个单位只看时间不看真正的产出,真真是拼时间,那我就觉得在这里是呆不了多久了。

第一天感觉,就是这样,平淡又真实。一个好的开头,直接影响到了后续三年我在华为的发展。不加班、高效率、高技术,成为了后续我在华为发展的三个目标。