本人硕士毕业后的头几年是主要在通信设备商(他们研发生产通信设备(如基站)卖给电信运营商(如中国移动))工作,那时是通信业的黄金十年,单是通信设备商就有很多家,国内有华为、中兴、大唐、烽火等,国外有爱立信、诺基亚、西门子、摩托罗拉、朗讯、北电、阿尔卡特等。这里面的有些公司现在刚毕业的可能都没听说过,因为它们要么被兼并要么倒闭了,这要“归功”于华为(是华为打的他们无还手之力导致要么兼并要么倒闭的)。现在这个领域主要有四个玩家了,国内的华为和中兴,国外的爱立信和诺基亚。这个诺基亚跟手机领域的诺基亚当年可以说是兄弟关系,是诺基亚公司的两大业务:手机(通信终端)和通信设备。后来诺基亚把手机卖给了微软,通信设备就成了诺基亚的主营业务了。现今的诺基亚可以说是多家通信设备商的综合体,包括诺基亚、西门子、朗讯、阿尔卡特、北电、摩托罗拉,即这么多家最后并成了一家叫诺基亚。上面说了那时是通信业的黄金十年,同时外企明显强于国内公司,是毕业生眼里的香饽饽,很多毕业生都进了外企,其中不乏相当优秀的。这跟现在完全不一样了,现在是移动互联网的黄金时代,毕业生都想进移动互联网公司。这也很正常,大家都想进处于黄金时期的行业。我就在那时进入了一家外资背景的通信设备商,做媒体网关(media gateway)上的语音软件开发,从刚开始的啥都不会要人带到后来的我带别人。做了几年后由于我们这个产品的开发要transfer到其他site,我要去做其他领域软件开发。当时觉得前面几年的积累用不上太可惜了,也就不太愿意做其他领域开发,于是就换了公司,到一家芯片公司继续做音频相关的开发。这么多年过去了,现在想想当时出来是正确的,通信设备商的黄金时代早已过去,人不能逆趋势而行。今天就聊聊我在那段时间技术上的得与失。
先说得吧。好多做技术的前一两份工作就决定了自己的技术方向,我也是这样。进入通信设备商做媒体网关上的语音软件开发,而且一做就是几年,这就决定了我的技术方向是音频相关。直到现在我仍然做着音频相关的工作,只不过现在音频知识面更广了,做的东西难度更大了。如果后面还在做技术,我想还会是音频相关。所以这第一得就是得到了我的技术方向。我是学自动化(控制理论和控制工程)出身,而音频属于信号处理。记得刚进公司的时候听着周围人讲的术语基本都不懂,觉得自己好弱。一听到不懂的就记下来,下班后回家到百度上搜(那时公司里只有部分人能上网,我作为一个新人肯定没有上网的权限)。老大交待的任务完成后就主动要求做新的任务,好使自己快速上手。经过一段适应期后,我可以很好的跟大家讨论技术问题了。就这样从刚开始的什么都不懂到后来通过做不同产品形态上的音频开发掌握了除算法(算法主要是理解基本原理,然后去优化使用)之外的绝大多数的音频知识。做音频技术的相对偏冷门,做的人不多,我能坚持下来,并且一做就是这么多年,我也挺佩服自己的,哈哈。
这第二得是得到了较为全面的语音通信知识。整个通信网络分为通信终端(用户)、接入网和核心网,大意如下图:
通信设备商一般做接入网和核心网(刚开始时一些通信设备商连通信终端都做,后来陆陆续续的把通信终端卖掉了,专心做通信设备,比如阿尔卡特和西门子),而在接入网和核心网里都有好多网元,一般一个网元都有一个具体的产品部门做。做开发的除了关注自己开发的网元内部实现外,还要关注与之交互的其他网元的行为,如果没有兴趣一般就不会关注整个通信网络的架构了。我除了关注自己开发的以及与之交互的,对整个通信网络也十分有兴趣,想知道整个通信过程是如何进行的,比如两个手机之间打电话,信令是怎么交互的,语音数据是怎样从手机经过接入网核心网传输给对方手机的。公司除了有产品部门外还有整体解决方案部门,他们不做具体开发,关注网络整体方案,同时还要负责对外交流,告诉客户公司的从接入网到核心网的整体一揽子方案是什么。这种部门一般会写很多关于网络或解决方案之类的PPT,他们也会把这种PPT放在公司内网上供内部员工学习交流。我在公司的中后期正处于3G研发已成熟刚开始布网(国内上3G比国外迟了好几年)同时4G(LTE)已开始研发的阶段。我就从内网上找到一些关于通信网络架构的PPT学习,先学习了3G的接入网和核心网有哪些网元它们之间从控制面到数据面是如何交互的,后来重点放在了4G的网络架构上。4G是一个全IP的网络,即全是PS域(Packet SwitchedDomain,分组域)不再有CS域(Circuit SwitchedDomain,电路域)。接入网从3G时代的两个网元(分别是RNC和NodeB,RNC负责控制面,NodeB负责用户面)演进到只有一个网元(eNodeB,控制面和用户面都在eNodeB上处理)。核心网演进到EPC(Evolved Packet Core)。为了实现全IP下的语音通信,提出了VoLTE(Voice over LTE)的概念,通话双方都有4G网络时就用VoLTE通话,否则就回落到2/3G网络在传统CS域通话。VoLTE实质上也是VoIP,在终端上对语音数据编码后码流也用RTP/UDP打包。跟固网的VoIP相比,主要是网络承载不一样,固网是以以太网(ethernet)为承载,而VoLTE从终端到接入网是无线承载。语音通信时在核心网会用到IMS(IP Muitimedia Sub-system, IP多媒体子系统)。我当时做的媒体网关属于核心网网元,刚开始时属于NGN(Next Generation Network,下一代网络)下的一个网元。随着IMS的提出,NGN的概念慢慢淡化,媒体网关就成了IMS下的一个网元。就这样利用零散时间的学习,逐渐的掌握了整个通信网络的架构,尤其是语音通信方面的。
通信设备商都是大公司,做事风格上都会讲流程,相对正规些。在这样的环境下工作了几年,个人觉得也养成了相对良好的工作习惯,这是我的第三得。软件工程师的日常工作有设计、写代码、调试、解bug等。当时在软件设计阶段一定要写设计文档,还要开会review,确保在设计阶段尽最大可能想明白想清楚,然后再去写代码,不允许返工,因为越到后面返工的代价越大。我做了那么多feature,没有一个返工的,周围同事也是如此。后来在其他公司工作,我也是先尽最大可能想清楚然后再写代码,只是由于公司的风格不同,有时候就不再写设计文档了。在编码阶段,遵循部门制定的coding rule,有注释方便他人阅读,在关键处有log,方便后面调试。代码写完后还要给他人review,再后来就是自测,根据自己设计的测试用例测试,发现bug并fix掉。最后是给测试人员测并做bugfix。测试人员设计的测试用例会更复杂综合些,如果测试人员发现了一些简单的bug说明自测没做好,这会影响到年底的KPI,所以那时大家的自测做的都是不错的。
以上主要是三得。再来说说失吧。这第一失就是失去了在二十几岁的黄金时间做相对核心技术的机会。硕士毕业已经二十五六岁,刚从学校出来没多久,基础理论知识还在,可以做相对核心一点的技术,比如做算法。再加上二十几岁,精力旺盛,又单身,一人吃饱,全家不愁,可以把全部的精力放在工作上。哪像现在,有老有小,虽然老的目前不需要自己花什么精力,但是小的花了好多精力,不管是刚出生时的带娃还是大一点后的教育,都是很花精力的,尤其在教育上,由于忙而忽视小孩的教育,以后会后悔的。我想工作多年且家里有小孩的肯定有同感。我那时虽然是做语音开发,但是解决方案是芯片供应商做的,我们只是调提供的API(或者说我们只是做适配层),具体的实现对我们是黑盒子,我们是不清楚的。当我从通信设备商出来进芯片公司做voice engine的时候已经三十出头,学校里学的那些基础理论知识已经忘了好多了。前面说过我是学自动控制出身,信号处理只是学了一下应付了考试,学的不精通,现在做的是音频,算法就是信号处理方面的。毕业多年后再把信号处理理论知识拾回来难度是特别大的,我最终还是选择了做工程。我想如果毕业一出来就做算法,尤其是做控制上的算法,是能做的(我在读硕士期间就做的控制算法的具体实现)。这跟大环境有关,当时是通信热,硕士班上的同学绝大多数都去做通信了;外资热,同学们以进入外资公司为荣。当时的外资通信设备商在国内都设有研发中心,但做的都不是核心技术,甚至有的很弱。现在想想好多985甚至C9的毕业生都去做这些有点弱的技术,是对中国人才的一种浪费。我当时做的媒体网关是从国外的研发中心transfer到国内的,除了系统设计和部分测试在海外做,开发等都是在国内做,已经算是不错的了。即使是内资公司,当时除了华为中兴真正做核心开发的也没几家。
这第二失是失去了做更多东西的机会。当时公司非常注重流程。就拿开发一个feature来说吧,先需求分析、软件设计、测试用例设计,然后写代码、自测并且bugfix,再后给测试人员测试同时bugfix。做了四五家公司,我觉得做软件开发流程是要的,但是不能太拘泥于流程,不然效率偏低。就以写文档为例,要写的文档有设计文档、测试用例文档。我觉得模块设计和复杂的feature一定要写设计文档,一些简单的feature就没必要写文档,认认真真想一想怎么做,然后大家讨论一下就可以写代码了。现在想想那时花两个月做一个feature,现在两三个星期肯定能搞定了。再说当时写的那些文档,除了系统架构设计模块设计,那些小feature的文档事后基本上是没人看的,花了那么多时间写些事后基本没人看的文档真是浪费,还不如做快些,让项目早完成,早交付给客户。