七月流火,出梅后的上海温度日日攀升,在上研所一个小小的实验室内,X产品的开发及测试工作也进入了如火如荼的收官阶段。有的在一处低语讨论,有的专注于面前的显示屏,还有几个人坐在一个40寸液晶电视前面悠闲的喝着咖啡,经历了一个月的封闭开发,每个人都在开始检阅自己的劳动成果,我们离成功只差一步之遥!
这一个多月来,在新的工作环境,我结识了很多新同事,对自身的不足之处也有了深刻的认识,而我认为最宝贵的是自己对软件开发工作的理解又上了一个新的台阶,对本职工作的新感悟必然对日后的工作实践中提升和增强自身实力产生巨大的帮助。
优秀的代码模块是部门一贯倡导的目标,这次工作经历真正让我体会到了其中的巨大优越性。在这个团队,我负责的是X的关键器件驱动开发,主要实现芯片的初始化,协议支持。进公司以来,我都在从事协议的相关工作,并且在前一阶段,我们小组对自己负责的代码模块进行了重构,目标之一就是移植方便。不过,A项目采用了与之前B设备不同的芯片,底层协议实现都依赖于此芯片,而这一块是我以前都从没有接触过的,因此得到任务时,除了兴奋,还有一丝担心。幸运的是,A项目中的另一款Y产品也是采用同一款芯片,去年另一小组已经实现了Y的芯片的初始化及底层协议实现,并且准备了许多关键的接口,代码风格也按照部门代码质量指标进行了规划。并不费劲地阅读完这块代码,我惊喜的发现这也是一个非常优秀的代码模块,在此基础上,只需进行极少量的编码工作,就实现了两个代码模块合并,并整合到了A的项目代码之中,因此只用了很短的时间就完成了初步的编码工作,省出了大量时间来进行相关协议的学习。
剑乃百兵之君,而程序员打交道最多的莫过于代码模块,一个可以重复利用的代码模块,是否就可以称之为长生剑。
前期的编码工作轻松得让我自己都觉得有点惶恐,在等待硬件到位的漫长时间里,我开始强迫自己深入地学习先前小组所写的芯片驱动代码。单个函数好理解,但是为什么要把它们连贯起来为什么就那么困难呢?而且协议的一些功能需要驱动代码的支持,虽然他们已经准备了很多接口,但是我怎么知道哪个接口是对应哪个功能呢?在初步理解了这部分代码的结构之后,我不得不转向学习相关协议和标准,毕竟换了一个芯片,我的工作不再仅仅局限于上层协议了。阅读了协议和标准的相关章节之后,了解了关键概念和实现,再返回来阅读代码,思路逐渐变得清晰,开始能够理解作者的构思和动机,达到了事半功倍的效果。而且,在之后的调测工作中,无论是协议无缘无故断链,还是重新连接失败,又或是莫明其妙的丢包,在对相关协议了解的基础上,总是能快速找到关键问题所在。
枪之所指,所向披靡。丰富扎实的业务知识,对相关协议的深入了解,是一个通信工程师能够在日常工作中游刃有余的必备条件,而协议标准在业界的地位正可由“霸王”来形容。
对于开发芯片驱动,对芯片各个寄存器的定义和功能的掌握自然是必不可少,驱动程序通过这些寄存器与芯片进行交互,对寄存器的具体设置实现编码者的意图,又或者从寄存器了解芯片的工作状况以进行相应的处理。而对于芯片驱动开发者,所作的工作却不仅仅局限于对这些寄存器的处理,了解芯片内部的功能模块和工作机制流程,理解数据在芯片内部的处理过程才是工作的重点。在单板调试初期,由于对芯片不熟悉,碰到一个故障不得不反复试验,通过查找复现规律来定位问题;在与芯片厂商沟通的过程中,往往也只能够提供一些表象和直接数据而抓不到问题的关键,因此浪费了大量时间和人力。在参加了芯片厂商为我们组织的讲座,同时在合作方技术支持人员现场定位问题的时候,通过观察他们的操作学习到一些芯片级的调试手段,对芯片的内部逻辑结构和流程有了初步认识之后,自己解决问题时也能够通过比较深入的检查和确认,猜测故障根源的大致范围甚至是定位出故障原因。
一刀两断,对芯片内部有了充分的了解,才能够对其涉及的故障进行深层次的剖析,从而迅速定位和解决问题。
调试工作无疑是繁琐的,往往前期编码工作中的一个小小失误就能够导致程序功能的缺失甚至致命的错误,而调试就是要将代码中隐藏的错误找出来,从而保证程序的正常运行。嵌入式产品的调试工作出于效率或者硬件限制的原因,通常都脱离集成开发环境提供的调试器,而以打印信息作为跟踪故障的线索。而打印信息的设置和组织大有讲究,过多会给信息分析工作带来麻烦,少了则会导致定位不精确。以各个处理流程为导向,在处理流程的关键位置设置标记量,打印或是进行统计,而且这些信息的打印输出应该是可控的,可以选择关闭与当前流程无关的打印信息滤除当前阶段的非必要信息。之后的调试工作和故障定位的过程中,就能够从这些打印信息获取重要的线索,从而极大的减少工作复杂度,加快工作进度。
关键扼要,组织合理的调试信息,并非程序的必要元素,但是如果使用恰当,能够使程序的流程或是关键数据的流向一目了然,对于定位问题无疑是莫大的帮助,而在正常情况下,也可以选择关闭打印,加快程序运行速度,避免干扰其它操作。可隐可现是武林人士所用暗器的共同特质,一旦打开打印开关就能让错误无所遁形,那就达到“例无虚发”的至高境界了。
在我们这样一个大公司,任何一个产品都是集合了各个方面许许多多的人才来共同实现的,而其中还不可避免的使用到了其它公司的一些产品,一个人的能力对于整个产品来说都是微不足道的。所谓术业有专攻,有些工作需要一个人花费大量时间精力才能够解决,换上另一个人也许就是手到擒来的事情。而且,公司存在大量同类型或者近似的产品,又或许不同的产品在某个时间产生了同样或类似的需求,因此你当前手头的工作有可能其实是别人已经做过的,这时候如果能够找对人,产生的效益那更是可观。对于如我这样入行不久的次新人,当力所不及的时候,不吝向身边的人求助,无疑会比单单依靠自己的力量去解决一些或许已超出自己能力范围甚至职责范围的复杂问题要有效得多。而且在别人解决问题的时候,可以接触到一些新思想和新手段,这比通过自己摸索艰难地获得提升也要来得直接。
一个人的能力总是有限的,而我们工作有可能涉及到的知识是无数人的经验和实践的积累综合,关键时刻善于从他人处寻求帮助,找到合适的人协助解决眼前的问题,是工作效率的重要保障。
在这个小小的实验室里,朝夕相处的一个月时间,我结识了这样一群让人敬佩的同事。lx,我的直接领导人,在我遇到困难的时候总是坐在我的身旁,帮助我分析问题定位故障,开始测试的时候,由于我忙于查代码,是他向测试仪器的技术支持学习使用方法然后转教给我,可以说自进入这个实验室以来,所有工作都是他与我共同完成的。xsd,他带领的小组是A项目的开路先锋,在完成了Y的基本测试之后,又转而开发相关设备驱动。在我们开始封闭开发之初,A的调试还未正式起步,他们负责的设备基本功能测试已是接近尾声,然而,在我迫于进度需求不得不加班到深夜的时候,发现他也依然坐在自己的电脑前面,或是检查代码,或是统计测试数据。lwc,负责X的硬件设计,对于故障敏感到了神经质的地步,测单板,换器件,乃至翻资料,查寄存器,甚至有将我这个软件人员取而代之的势头,誓将问题一查到底。实验室里虽然仅仅十几个人,每个人都有让人感动的地方,项目在我们的齐心协力下一步步迈向成功。
拳头,人皆有之却各有不同,没有其他兵器的华丽,也不需要技巧,简单直接但往往很有效。在完成工作的过程中,发现问题就解决问题,只有一个目标,那就是成熟的产品,也只有一种手段,那就是努力。
此次封闭开发临近尾声,回顾这一个多月的时间,遇到过困难,认识到了不足,接触了一些新方法和新思路,学习到了很多新知识,这些都是非常宝贵的经验。在项目实施阶段,往往都是目标驱动型的,甚至是被压迫式的做事方式,为了达到目标,可能会走上错误的道路,通过不断的尝试和修正,最终完成任务,而且采用的方法也不一定是最好的方法。在一个项目完成之后,对前期工作积极地进行反思,从中总结经验教训,强化对这阶段新接触到的知识、手段和问题解决思路的理解和认识,对这个过程中发掘出来的自身优点进行有目的的加强,无疑会对日后的工作带来巨大的帮助。
路漫漫其修远,在通信工程师这条成长的道路上,对自身修为的提升永无止境,困艰为良师,瑾瑜成佳伴,结项憾离别,慎思利笃行。