我独自完成了该嵌入式前端产品上的软件开发工作。其中包含的大致技术内容有:从编程的角度精通x86处理器架构; PCI、IDE硬盘、网卡、串口、闪存等总线或外设的驱动;实时操作系统内核的移植工作;MINUX操作系统的文件系统的移植; XINU操作系统的TCP/IP协议栈的移植工作。移植工作往往会碰到各种技术细节问题,等移植工作完成,对被移植模块的实现和背后的原理也已了如指掌。正应如此,这一时期的工作让我对操作系统的实现原理有了很深的理解。
除了软件方面的进步,我在大立公司时的硬件知识也得到了很强扩充。不仅能轻松地阅读数字电路原理图,还自学了VHDL语言,使得拿到逻辑器件CPLD的VHDL程序就能调试软件(通过VHDL程序,可以了解编程所需的译码端口、相关信号的操作时序等)。还学会了如何使用逻辑分析仪辅助软件调试工作。前面提到的这位兄长式硬件工程师调侃我说:“你让我看到了中国软件的希望!”,而我将这话当成了对自己的鼓励。另外,这期间还考入了浙江大学专升本的通讯工程专业,给自己充电(2001年入学,2004年毕业,获多学期“优秀学生”和“优秀毕业设计”)。
由于大立公司是浙江省测试技术研究所的子公司,它或多或少带有事业单位的气息。加上公司的技术舞台有限,以及妻子也在同一家公司工作,我于2003年4月份左右离开了大立公司。在我离开之前,浙江省科委已批复了公司的申请,分配给我一套福利房。在我离开之时,房子仍在建,不少同事对于我的离职很是不解,也劝我拿到房再走。但我有我的职场第十三感悟:当短期利益与长远利益无法得兼时,选择长远利益。
在大立公司工作期间,很希望自己能入职UTStarcom这样的通讯企业(那时的UTStarcom是多么地辉煌!)。计划离开大立公司之际,我向UTStarcom提交了求职简历。这次求职开始好像很顺利,但到我真正入职UTStarcom的过程却很是曲折。
一开始当我收到UTStartcom的面试通知时,可能太希望能进入这个公司了,在没有很深入了解这个岗位的前提下,就去面试了,且马上拿到了Offer。但后来才了解到,我拿到的是生产部测试开发岗位,与实际研发部门是有区别的。 当时很纠结 — 这是我想进的公司,但却不是我想要的岗位。如果拒绝生产部的Offer,我很有可能与UTStarcom无缘。考虑再三,我还是选择了拒绝(参见我的职场第十三感悟)。并重新向研发部门投了简历。
经过度日如年的一个多月等待(那会儿刚好发生了SARS疫情),在觉得入职UTStarcom研发部门无望的情况下,我入职了另外一家小公司。令人意外的是,在入职那家公司的第二天,我收到了UTStarcom研发部门的面试通知。在HR面试的那一轮中,HR对我说,“你是我所面试的人中最有工作激情的”。那时的技术面试官中,其中一位是我日后入职后的上司 — 夏青(现在是恒生电子通讯事业部的总经理),他是我的伯乐。由于我的学历问题,在技术面试通过后,别人只要一位VP面试通过就行,我却需要两位。我的职场第十四感悟:学历是很重要的敲门砖,即便你的能力很强;学历尽管很重要,但能力才是最终的通行证。
2003年6月份左右,我正式入职UTStarcom研发部,从事小灵通基站控制器(后面简称为基站控制器)的软件开发工作,也从此踏入通讯行业。在入职之初,由于自认为对于操作系统的原理很精通,又完整地做过软件项目,有点飘飘然,觉得自己是个“小牛牛”。然而,入职后一接触工作就发现,内容没有想象的那么简单!
首先,基站控制器的软件规模比我以前主导开发的项目要大很多,而且需要熟悉通讯行业的相关信令。其次,尽管我那时精通x86处理器,基站控制器用的却是PowerPC 8250,这意味着我得重新掌握它。再次,实时操作系统用的是前美国军方的、开源的RTEMS,那是我第一次接触。最后,UTStarcom的工作语言是英语,写文档和邮件都得用英语。尽管我那时能无障碍地阅读MSDN和各类芯片手册,但要着手写,却是一大挑战(口语不作要求,因为不需直接接触老外)。
一入职所分配的工作是网元网管部分告警抑制软件模块的开发。尽管PowerPC处理器和RTEMS操作系统技术细节的掌握与否并不影响日常开发工作,但我仍将掌握它们作为自己的努力目标,因为我的职场第十五感悟:技术细节掌握得越深,解决问题时就越能游刃有余。
那时工作时间应付日常开发工作,业余时间则先将精力集中放在熟读PowerPC 8250处理器相关的技术手册上(晚上还得上夜大)。加起来超过2000页的英文资料,我读了不少于3遍。随着时间的推移,当我对PowerPC 8250处理器很有感觉之后,我将工作重点转移到了熟悉RTEMS操作系统的实现细节上。先处理器后操作系统的学习安排,是基于我以往在x86处理器上的工作经验而得出的,也是因为我的职场第十六感悟:技能的发展应采取深度先于广度且交替进行的方式,只有这样,面对大量的新知识才能更淡定。
RTEMS是一个类UNIX的实时操作系统,也正因为接触这个操作系统我才意识到了自己在软件设计能力上存在很大的提升空间。尽管我对操作系统的实现原理胸有成竹,但却无力于构建一个象RTEMS那样优雅的操作系统,也真切地体会到了RTEMS的设计之美。那时基站控制器上运行的RTEMS操作系统是由美国的新泽西研发中心移植好的,杭州研发中心只需在之上做应用开发。为了就RTEMS操作系统获得更好的学习效果,我又一次运用了我的职场第四感悟,设定了自己完成RTEMS新版本移植这一目标。
RTEMS新版本的移植工作虽不在公司的日常工作范围内,但却得到了上司的支持。由于那时RTEMS还在开发新的功能,并不是很稳定,在移植过程中碰到各种奇怪的问题,有些问题还与GNU的binutils工具集有关(binutils中包括nm、ld、objdump等工具。RTEMS是用GCC编译的)。在无法确认是GNU工具集的问题之前,我甚至还向Wind River公司(其知名产品是VxWorks实时操作系统)寻求过帮助,因为那时用的是它的JTAG仿真器。移植工作虽曲折,但最终还是成功了(我所移植的版本并没有运用到产品中,后来的同事又做过了RTEMS4.6.0pre4的移植,且运用于产品中)。这一移植经历,让我对GNU的binutils、RTEMS操作系统的实现有了更为深入地掌握。
在UTStarcom工作的前期,我大多从事的是RTEMS操作系统相关的代码维护工作,工作内容除了OS内核,还包括FTP、Telnet等协议。直到中期转为做E-Box产品的互联网接入模块的开发工作。