人到中年,感觉以前听的大道理都是人生真理,比如"求上得中,求中得下"。先来看参考[1]:
引自[1]: The Most Significant Skills for Automotive Software Developers
Skill 1: Industry Expertise
Software developers in the automotive industry must be familiar with various industry standards. You should know what an infotainment system and a head unit are, what components are behind them, how they can be connected and what forms of data transmission and storage exist. Tier 1 suppliers like Bosch will require hands-on experience in embedded programming. Automakers will also value your ability to develop and test software for ECUs (Electric Control Units) microcontrollers, microprocessors, debuggers, etc.
Skill 2: Experience with Large-Scale Projects
In a large scale project, you will be required to communicate and interact with the teams of engineers, designers, testers as well as involved executive managers. If you’re an inexperienced software developer, brace yourself for overwhelming complexity of processes, tight deadlines and multiple interchangeable operations of geographically distributed teams. Therefore, before stepping up into any development activities, it’s better to study the entire structure of an organization, project requirements and only then, narrowing down to your specific job responsibilities.
Skill 3: Technology Competency
If you are attentive to details and can demonstrate a good technology competency, you’ll be able to cope with an extensive codebase of an embedded system that can have different versions and modules, their complex logical dependencies and mathematical algorithms. In addition, it will be also valued if you understand how to alter the code to provide new functions without affecting the functionality of existing solutions. The act of balancing between technical requirements, changing business requirements and high standards to the functional safety of any in-vehicle solutions is also a part of this competency you may hardly find in any job description.
Skill 4: Communication Skills
Software development in the automotive industry has many factors to consider. Among them are project requirements, project planning, basic architecture, quality requirements and process changes. At every stage of software development, you will have to put into practice your communication skills and professional approach to the entire delivery process including numerous iterations of the same feature.
Skill 5: Good Knowledge of English
Frequently, automotive projects are international and people from different countries are expected to have a decent level of English to find a common language with other team members. Besides, your English fluency will be also highly estimated by the management of the project deciding on which IT service company and team to pick up during the tender.
Skill 6: Responsibility
New releases in the automotive industry have far-reaching implications. The more features are added, the more complicated the entire embedded system becomes. And most importantly, these are mission-critical systems and any unnoticed mistake may incur more than just repair expenses. Perhaps, you remember a much-talked-of fatal test drive by Uber self-driving car[ that failed to recognize a pedestrian in the darkness. In this case, not only testers but also automotive software developers must have a strong sense of responsibility in terms of the code quality and deadlines.
首先谈需求,没有需求就没有V流程后面的设计和测试。先看下需求的标准定义:
引自:ISO/IEC/IEEE 15288:2015(E) terms and definition
requirement:statement that translates or expresses a need and its associated constraints and conditions.
其次谈文档规范。认真对待文档规范,你将会有意想不到的收获。软件工程师一般都不喜欢写文档,写了一份又一份,关键最后还可能几乎没人看,但规定要去写那还必须得写,些许无奈。那何不换个角度,先从认真对待开始,接下来就会逐渐思考如何写?如何写好?为什么文档模板这么安排?不知不觉就会去看一些标准规范,通过这些就能逐渐去理解文档的别有用心以及这些模板的由来,一般标准会提供一些参考模板,比如图4(源引自:IEEE Recommended Practice for Software Requirements Specifications,IEEE Std 830-1998)。然后结合自身工作经验,再来理解这些文档,会发现文档不再那么抽象,其实非常科学,非常严谨,最后会学着利用这些文档来帮助自己形成一个更有逻辑更有层次的表达。所以认真对待文档规范(也包括流程),有了这方面的强烈意识,我觉得一方面不管是要符合ASPICE,还要AUTOSAR,应该都可以很快遵循这些规范来指导实践;另一方面也极有助于我们从项目管理和软件工程角度来看待项目。
最后谈测试。本质上就一句话:纸上得来终觉浅,觉知此事要躬行。从零开始的项目一般还好,边开发边测试;有base的项目,最好得主动多仿真多测试,通过数据和现象来快速理解。说到测试,分享一个小故事:曾经看着德国同事准备集成测试报告的图,类似于下图5,他创建了多个子窗口归类地来分别显示数据,调好数轴标尺等操作,以使得他人一眼就看懂测试结果。当然他就是这么想的,然后我就照学了。看个反例(图6),自行对比感受下。
所以,应该加强从功能层面理解好软件,当然模型或代码层面也很重要,这样宏微观上都能切换自如,软件就会被你玩的溜溜的。
4.1 软件方面
先谈软件方面,曾经为了了解从软件到硬件的最终执行,我花了几个月听计算机科学课程,从计算导论与C语言基础(北京大学,李戈):记得当时听明白了计算机硬件如何实现0101,图灵机怎么工作等等,讲得非常精彩。
再到计算机系统要素(Build a Modern Computer from First Principles: Nand to Tetris,希伯来大学): 记得讲到布尔运算(两个结论:Any Boolean function can be represented using an expression containing AND and NOT operation. Boolean function can be represented using an expression containing only NAND operations),寄存器,CPU,汇编语言,编译原理,特别有意思。
最后到数据结构(清华大学,邓俊辉):记得讲到搜索算法改进,最终我都买了本邓教授的书。
整个听课过程下来,虽然我没有做作业,忘了绝大部分,但是我觉得从软件到硬件怎么运行,我基本上有个概念,假如真要我去做这方面的深入,给我时间肯定没问题。
总的来说,从广度上对软件要有一定的认识。当然,从深度上对软件也需要很深的认识。比如:运行时序问题,一定要明白先有谁后有谁;精度(scaling)问题,配置就要求很细致;内联函数问题,使用就要特别小心。
4.2 工具方面
再谈工具方面,以MATLAB/Simulink为例。我个人受益于两方面:一方面是来自同事,有同事的悉心指导和用心分享,也有看同事怎么做的,去模仿学习怎么做,去思考谈论为什么这么做(当然更多时候后者去看去试去悟);另一方面来自mathworks提供的demo和研讨会视频。比如入门变速箱控制模型时,我就找到了一个特别有用的demo包,如图7示意,通过这个demo包做仿真做调试,这样很快就上手建模操作。另外通过一系列的研讨会视频,很快就入门了MBD,以及如何使用Simulink工具做模型检查,验证与确认等,如图8。所以,把握身边的和网上的,工具肯定没问题。