伯乐访谈之程序员在国外:张伟 – 汽车软件开发者在德国

jopen 10年前

本期访谈的主人公是在德国从事汽车软件开发工作的程序员:张伟。

伯乐访谈之程序员在国外:张伟 – 汽车软件开发者在德国

        (张伟在黑森林)

        张伟的联系信息如下:

        新浪微博:http://weibo.com/u/1630562695

        博客(德文):http://cndelive.blogspot.de

        以下是采访的全文。

        伯乐在线:请简单自我介绍一下

        我老家在浙江台州,目前在德国工作。之前在国内学习软件工程,2008 年来到德国学习汽车软件工程专业(硕士),2011 开始在德国一家做汽车软件公司写论文后工作至今。期间做过开发工程师,测试工程师,现在要转向 Program Manager(不是产品经理,还接着写代码)。

        伯乐在线:能说说 2008 年去德国读硕士申请过程和一些要求吗?

        我是在国内读完本科直接申请硕士的。自己成绩中等吧。只要专业对口,来德国读书申请还是比较容易的。我申请的时候德语还是 DSH 考试,工程类 2 (满分三分)就可以了,现在是德福了,要至少四个四(满分五分)吧,口语,听力,写作,和语法。

        伯乐在线:现在已经移民德国了吗?

        还没有。我还要一年才到资格。当然,在别的州是已经可以了,我现在所在的州要求时间更长一点。在德国,要交养老保险满 60 个月,才有资格。移民这块,基本上大学毕业有工作的年轻人他们非常欢迎。

        伯乐在线:你是在校就开始交养老保险并做了准备?

        只有有工作才可以交,我读书的时候拿的是 DAAD 的奖学金,第一年没积极去学校找工作。最后是从第二年去系里工作,之后实习,论文都算工作了。应该早做打算的,当时也不知道。

        伯乐在线:你去德国读书时,是不是已经有了移民的打算?

        应该是到了德国才有这个念头,我之前一直准备学成回国。当然现在我还是计划会回国工作几年。

        伯乐在线:为什么之前没有计划移民,到了德国才有了念头?

        我觉得我的教授和老板,大概跟我父辈年龄差不多,他们的学识修为让我更愿意在他们的指导下工作。总体上,我来德国的时候很浮躁,一心想着怎么挣钱,等等。经过老板们不停地提醒,我觉得现在自己才开始静下来。另外就是这里的生活挺适合我,在这里,我没觉得自己是外国人。

        伯乐在线:在德国没有觉得自己是外国人,你怎么体会到的?

        我觉得德国给了我一个很公平的机会,我在学习工作当中没有受到优待,也没有受到歧视。学校和公司都很信任我。在工作学习之外的休闲活动也是。在 工作中也建立了一些关系,圈子。也不需要什么背景。对德国这个国家,我了解以后也比较认同,能让一个接受了几百欧元招待的总统下台,或者是博士论文引用没 写清楚的国防部长走人,这样的国家差不到哪里去。当然我对中国也非常有信心,我们有这么多聪明的人,有这么多勤奋的人,早晚我们也会非常出色。

        伯乐在线:那为什么还有计划回国工作几年呢?

        首先,中国汽车行业跟德国汽车行业的差距对我个人是一个很好的机会。 虽然现在交流很多、合作很多,但是给中国行业能力的提升并没有带来帮助。现在只不过把市场让给了别人。我作为在德国行业工作,同时和中国行业有很持续交流 的从业者,可以把问题看的更清楚,更知道该怎么做。

        另外,我觉得在中国也应该开始设置汽车软件工程这个专业,如何更好的培养更多的人才,这实际上是对这个行业发展最重要的。如果可能的话,我也能出点力。

        伯乐在线:请简单介绍一下在德国读硕士和实习的情况

        德国课程设置是两年。我也是基本一年半把所有考试考完了。之后半年在另外一家公司实习,在目前的公司论文写了半年。实习跟最后的论文没有太大的 本质区别,但实习是必须的。不过这两年半应该算是我这人生中最用功的两年半吧。如果不是之前已经在本科在同一个学校读,并且本科就修了硕士的课程,两年读 完是不可能的。我认识唯一一个特例,是一个德国同学,在同一个学校读的本科,在本科时候就修了硕士的课程,他是两年毕业。

        伯乐在线:参加工作后,一直都在现在这家公司吗?

        是的。我没有打算挪窝,应该说在德国,在汽车软件,我们肯定是行业翘楚。当然,作为供应商,在行业外没有什么人知道我们。德国人跳槽频率比较低。如果三年内跳槽,下一个雇主肯定会问你 “为什么三年就跳槽了”。

        伯乐在线:你是如何进入现在这家公司工作的?

        我在大学用过这家公司的产品,然后觉得这公司东西做的不错,就找到他们人事 Email 地址,发了个简历过去,说想去写论文,然后就成了。我在写论文的时候投的几家公司都是因为我知道他们的产品。最后都成了。

        伯乐在线:面试的环节可以简单介绍一下吗?

        面试进行了一个小时,首先谈了我对汽车软件架构的认识、我做的项目和学校,然后是汽车总线的基本知识。 最后给了我一段C程序,让我说说运行时的状态是怎样的,(寄存器存取,堆栈操作等)基本就是汇编描述一下。

        伯乐在线:有笔试这样的环节吗?

        因为我最后是内部招聘就写论文后直接被部门接收了,所以没有笔试。但是正常流程,有笔试的,基本上是自动机实现啊,考一些C的算法。

        伯乐在线:在汽车软件相关的专业,汇编是不是比重很大?

        C 语言比重很大,本身没有汇编语言的课程,但是在计算机体系结构这门课里,有必须用汇编完成的作业。德国大学不专门教授编程语言。但是要求作业用相关语言完成。因为我们编程比较靠近硬件。所以汇编和C非常重要。

        伯乐在线:请介绍一下你现在做的汽车软件

        刚开始自己专业学习的时候,我也简单地把在汽车里电子控制单元里跑的所有嵌入式代码认定为汽车软件(狭义上的汽车软件)。随着对这个行业的逐渐 了解才发现除此之外还有很多在电脑上跑的软件也应该归为汽车软件。比如用来对在电子控制单元中程序进行测量,测试,以及标定,诊断的软件,比如用来设计汽 车软件整体架构的软件。这类软件的利润占到整个汽车软件行业非常大的一部分(广义上的汽车软件)。

        我自己工作的部门主要负责在电子控制器中跑的嵌入式代码(狭义的汽车软件)的开发。当然在开发过程中需要在电脑上跑的汽车软件(广义上的汽车软件)的辅助。 (接下来提到的汽车软件均为狭义上的汽车软件)

        伯乐在线:你现在的工作内容有哪些?

        我的工作内容可以分为两块:开发和测试。先说说作为开发工程师吧。

        一方面汽车嵌入式软件作为提供特定服务的软件,其基础功能以及接口都已经被标准化了。这里包括其操作系统以及其他功能模块。作为开发工程师在这一块并没有多大的自主权。

        另一方面因为汽车嵌入式软件本身有硬实时性的要求以及受存储空间,芯片计算能力限制的特点(是的,十六位的芯片在汽车行业还在被使用,因为成本 控制,八位的芯片也有)除此之外还有严格代码可靠性的要求(汽车软件运行时错误会死人的,看看丰田凯美瑞就知道了),所以在开发中对代码质量的要求非常 高。 比如说到底是 for 循环是应该用 for (i=0; i < X; i++) 还是 for (i=X; i !=0; i – - ) 需要在汇编层面加以考虑。

        编写C代码除了有编码风格规定,还有 MISRA-C 等标准,很多C的结构是不允许被使用的,如果一定要用一定要在代码中添加注释和相关的测试用例证明这么用是没有问题的。基本用的是一个C语言的真子集。公 司的大概四十到五十的资深工程师脑子是可以当编译器前端使用的,看到C就能翻成汇编。我也有想达到这个境界的冲动。(但是还没有什么具体行动)

        另外作为开发工程师还有很大一部分时间在写代码生成器。因为汽车平台化概念的引入很多车型共用嵌入式代码。这些车型对功能要求大体上相同,但是 部分有差别。作为汽车软件供应商的对策就是把基本功能写成静态代码,把差异分抽象出来,让他们作为动态代码存在,用动态代码控制静态代码的具体执行时行 为。最终车厂可以根据自己的要求通过配置工具配置控制参数,然后让代码生成器生成代码,最后编译链接动态代码和静态代码。 这些主要是用 EMF(Eclipse Modell Framework)下的代码生成器框架,一般用 Java 衍生的特殊语言编程。

        除此之外其余大部分工作就是对自己负责的模块和代码生成器进行测试了。因为汽车软件标准已经把抽象做的非常好,除了操作系统,和直接操作寄存器控制 ECU 硬件模块的软件模块需要在 ECU 上做测试,其他可以通过 stubs 在电脑上直接进行模块测试。

        听起来以上的工作非常有印度的感觉,为什么现在还在德国呢,原因一,如果按照标准来开发出来的汽车软件是肯定不能使用的,还有很多内容标准并没 有规定也没法规定。终究其原因,汽车软件更像是一个系统工程,首先需要对硬件特性的非常好的理解,其次要对汽车上层功能应用有非常好的了解才能把代码写 好。这两点都是印度工程师缺少的。原因二,国际标准虽说是英语写的,但是由于持笔的大多为德国工程师。所以标准里流露着很多德语式的句式,要加重了其他国 家工程师理解标准的困难。原因三,其他国家缺少这么多汽车软件工程师聚集在一起的效应,定期的研讨班,workshop,研讨会等。

        工作的关于抽象概念几点感悟。

  • UML 图非常重要,第一帮助自己理清思路,第二方便于人交流,一定要画的标准避免误解。
  • 形式表达 (Formal Specification)在系统设计中非常重要。这种表达最准确,最能够避免误解。
  • 命题逻辑在测试用例设计以及功能 Defensive Programming 上非常有用。

        伯乐在线:你提到的“基础功能以及接口都已经被标准化”,这个标准化的工作是哪些组织在主导?

        德国的车厂和一级供应商, 博世和大陆一般先在技术前期阶段成立一个技术联盟,当技术已经成熟到一定阶段,他们开始在 ISO 标准上来推行这些技术。这时候 Toyota, GM, Ford 开始进入。 标准化工作基本上就是这些人在推,德国车厂之间的技术合作是非常紧密的。可能他们在产品上竞争非常激烈。 到目前为止,德国主导了大多数汽车行业标准的制 定。因为人员流动和技术联盟,一级供应商交流。德国整体汽车工业维持着一个较高的水平,没有谁特别技术牛。基本上你有 ESP,我也有。可能时间上差个一年两年。

        总之,这些标准是由企业组成的组织在定义,不是政府机构。但是德国联邦政府资助大学的非常前期的研究。

        伯乐在线:如你所介绍 “汽车软件有严格代码可靠性的要求”,那么,你们公司通过什么机制来确保代码的可靠性呢?比如:如何设计测试用例 Review,代码检测工具,产品上线测试,软件质量问责(假设因软件质量出了事故,这其中会追究企业的责任,最后牵涉到开发者吗?)

        本身测试用例,和 review 应该和普通程序没有什么特别之处,review 会检查特别的编程标准有没有遵循,如果违反的话有没有给出理由。

        对运行时错误,我们用在航空很早就开始用的 Polyspace 用静态方法检测运行时错误。 还有要进行最坏执行时间检测(Worst case execution time analysis)。 包括对进行测试开发的工具都有可靠性评估的要求。具体在行业里有标准(功能安全标准 ISO26262)

        关于责任问题,1,首先我们为自己的代码买了保险。第二,德国有句很著名的话:“犯错误是人性”。 如果真有很重大的错误出现,在德国是认为我们的流程有问题,我们整体机制有问题,绝对不会把责任推给某一个人。

        伯乐在线:为代码买保险,德国的保险公司还有这样的业务?

        是的。

        伯乐在线:请接着讲讲测试这块的工作内容

        因为汽车嵌入式软件,input 没有键盘,output 没有显示器,所以唯一途径就是通过通讯的接口用电脑把测试的 stimuli 传进去,把状态和数据传输出来。同时考虑到一个电子控制器在现实中是连接着很多其他电子控制器的,这些电子控制器也需要通过电脑来模拟。所以整个测试框架 是一个分布式系统。考虑到汽车软件的实时性要求,就是一个实时性分布式系统。所以这样的一个测试系统的建立是非常复杂的特别是碰到硬实时的通信总线系统如 flexray。

        作为测试工程师需要对不同的功能模块设计不同的分布式系统策略,建立测试框架。因为要应付不同的硬件平台,所以测试框架代码也是通过代码生成器来实现的。在设计完框架写成C代码后,要根据C代码写出相应的代码生成器。

        除此之外,作为测试工程师的主要工作当然是理解软件功能,在软件层面上写测试用例,测试用例的代码也是通过代码生成器生成的,测试代码包括在被 测试的 ECU 上的C代码,和电脑上软件用的代码。这部分用了 DSL(domain specific language)的技术。

        人都说测试是份轻松的工作,我觉得测试是我工作以来遇到最有挑战性的工作。特别是牵扯到分布式系统实时策略的设计以及测试用例的设计。第一点是 因为实时性分布式系统设计本身诸多挑战。如时间协同。第二点是因为我们的测试不可能做到 modified decision condition coverage 百分之百,因为客户有很多配置的可能性,我们不可能把这些配置的可能性穷尽。所以每一个测试的用例都要非常好的理由,要一直问自己为什么要写这个测试用例 而不是别的。

        对这两部分工作还有个感触就是,作为车厂的软件供应商,我们最大的目标就是要满足车厂在汽车整个生命周期对软件的各种要求。所以开发的汽车嵌入式的很多功能是在汽车制造和汽车售后而不是汽车最终用户驾驶时用到的。

        在这个行业中,德国应该是比较领先的,大部分的标准也都是德国制定的,全世界所有车里的汽车嵌入式软件或多或少都是德国制造。

        伯乐在线:因为你的工作涉及到开发与测试,能不能介绍一下你所在的汽车软件公司的开发和测试团队的组织结构?

        我是在不同时期做的开发和测试岗位,前一年半是开发,后一年是测试。 和别的软件公司没有太大的区别,测试本身分为 Module Test, Integration Test 和 System Test。作为开发工程师的话,需要做前两者,作为测试工程师的话进行 System Test。 开发一般以 feature 为单位,一组 6 到 7 个人,测试组一共也只有七个人。当然大部分的测试有已经自动化了,只有 Integration Test 还没有完全自动化,

        伯乐在线:前一年半是开发,后一年是测试。这种轮岗有什么特别目的?

        我们内部的这种流动很频繁,第一,对公司内部信息流动非常有好出,因为各个部门是要协同工作的,大会小会并不能帮助我们真正理解别的部门真正在 干什么。 第二,各个部门有自己的强项,这种流动给新的 team 带来新的 know-how。和新的理念。第三,同事之间的联系比以前更紧密。第四,如果一个人跳槽了的话,总体上都有人可以挺上。最后,对我们员工来说,不断有新 的挑战,我是我到现在还留在这个公司最大的原因。

        伯乐在线:开发和测试的轮岗是自愿吗?据你了解,其他的德国企业很多也这样操作吗?另外,如何让不懂测试的开发和不懂开发的测试在第一次换岗时,顺利过渡?

        有六个月的 Mentor 期。当然这个前提首先是员工素质。我们的同事应该在我看是德国优秀的年轻人,无论是技术上和管理上(好大学,好分数)。 大家基本上都在两到三个月内迅速上手,到六个月基本上一到两个交给的项目就完成了。德国人还是很敬业的。

        伯乐在线:你们的产品上线(配备你们开发的软件的汽车出售)后,有没有出现过问题?

        到现在还没有出现过问题。一般汽车开发都有四到五年,在正式开始生产之前都经过很多测试。这个问题到现在没有出现过,上了汽车出现问题。我们的良好声誉也是建立在这一点上的。

        伯乐在线:一辆汽车所涉及的软件会由很多软件供应商来开发,虽然有标准来约束,但你们在集成时,是不是仍然会遇到彼此兼容性的问题?

        首先,在一个 ECU 单元上的软件来自于一个到两个供应商,数量相对较少,第二保证车载网络上的通讯,所有 ECU 的底层软件一般会选择同一个厂商的。 这里我说底层软件指 OS 和通讯模块。标准已经规定了接口和功能,之后出现的兼容问题一般就由一个 ECU 上软件供应商一般两个,互相协同解决。一般通过多次 Delivery。

        伯乐在线:能介绍一下工作福利与假期吗?

        软件公司的标配,最好的咖啡机,无限量的咖啡以及各种饮料,几乎每天的免费早餐,半价中餐。两到三个人一个办公室,很多各种型号的会议室,随时 头脑风暴。可以养花,没人带宠物不知道可不可以。因为 Open Door Policy。办公室要么没有门要么就是开着。大家的大门都必须打开,包括最大老板的。当然,这是公司内部的交流。工程师至上,这里,一切为工程师服务, 原来四个大老板就是编程的,现在还在一直编程。一年一次集体旅游,要么去奥地利,要么去瑞士。还成。工作时间一周四十小时,但是什么时候来,什么时候走随 意。员工穿着打扮很随意,拖鞋,光脚的,裤衩,唯一一次就是联邦劳动部的女部长来视察,前一天收到一封电子邮件,希望大家克制一下。另外还有免费德语,英 语课程等。

        公司有各种运动队,足球,长跑,乐队,攀岩,跆拳道,摩托车。干啥的都有几个。公司为每人以及家属还买了一份养老保险,反正待满五年就可以兑 现。应为德国本来就全民养老保险,所以也没注意。 公司有自己的幼儿园。比 Google 可能还差那么一点,但是在汽车行业已经不错了。公司工作语言是德语。

        关于德国的休假,国内各种众说纷纭,我就说说斯图加特的情况。(由于各联邦州法定假日不同,差最多两三天,所以总体上其他州差不离). 斯图加特所在的联邦州法定假日十二天,加上带薪的假期三十天,一共一年是四十二天。但是由于我们加班时间可以折成假日,一年我基本上还可以休上十五到二十 天的样子。基本上六十天左右。感觉一年有两个月在放羊。

        德国汽车行业的总体薪酬比医生律师和金融行业低,高于其他所有行业。中等偏上,但是德国是个福利国家,税收很高。

        伯乐在线:你平常的工作时间安排是怎样的?

        跟很多同事一样,早上五点起床,洗漱坐轻轨去上班,路上想想自己今天的任务。六点十分到办公室一直到十点开始写代码,(十点开邮箱,写写文档, 回回邮件,看看 blog 到十一点一刻)接下来就是每天的 Scrum Meeting,大家聚在厨房,说说昨天干了什么,今天要干什么,有什么困难,或者有什么是一起合作的同事需要注意的。(我们也 Agile)。

        吃完中饭后,开始捧着咖啡跟同事聊一会儿。如果有需求,开始去跟同事一起调试程序。一直到三点。然后接着咖啡休息到三点半。三点半到六点开始接着写代码,这时候同事基本走了。效率也很高。

        伯乐在线:你们公司的同事普遍都很早到公司吗?在德国你们公司算是特例?另外,为什么都选择这么早?

        我们组的同事都挺早的,我觉得早起应该是算是德国这个国家的一个特性吧。冬天早上六点,公车和等火车的人好多。当然也有非常晚,十点到公司的。 但是,银行,保险公司都是九点才开门。早上六点一刻到十点,效率最高。写代码,想问题。晚上十一点基本睡觉了。下午一般有个会,同事来找讨论个问题,没办 法专心工作。

        伯乐在线:请介绍一下德国 IT 技术圈的氛围

        首先德国的专业活动划分非常细致,没有很一般的概括性技术沙龙,比如说汽车软件工程有一个专门的题目叫做虚拟安全。(Virtual Safty). 在这个领域工作的工业界人士和学生,大学教席的研究人员就会每年定点聚在一起两三天,进行专业的 Seminar,和交流和合作。一般这是接触同行,发展人脉,交流技术的好机会。 然后就是专业标准制定的例会。在这些会议上同行之间就对已成熟的技术标准化。

        前者主要着重在研发,后者主要着眼成熟技术。 前者多由大学牵头组织,后者当然是工业界的活动。 德国大学的教授必须有在工业界工作的经历才能担当教席教授,因此有工业界的人脉,对工业界的需求也非常了解,大学和工业界的合作非常紧密。

        这些都是计算在工作时间内的。德国人工作时间之外有很丰富的业余生活,除兴趣爱好外一般不会用私人时间参加专业活动。我的印象是,专业组织活动 在德国严格按照流程,高效,效果可控,持续性非常有保障。 很多标准制定会议里标准化的技术就脱胎于研发时期的 Seminar,制定标准的很多就是参加过前期 seminar 的人,专业化非常强。一般参加会议的人员回到公司都需要做一个演讲,把收获传递给所在的单位。除此之外,德国是世界上专业杂志最发达的国家,仅仅是汽车软 件,在德国就有十多种专业期刊。这也是交流的很好的途径。

        在汽车软件行业里德国没有像美国以及中国有很多对某个专业非常狂热以及充满创业激情的人。他们对工作非常认真负责充满热情,但是仅限于工作的时 间。而且德国的年轻人更向往有保障的职业生活。这点德国明镜杂志还专门出了一期讨论德国年轻人只愿意在爱好上冒险但不愿意在职业上冒险的问题。可能互联网 行业例外吧。德国有创业精神的互联网行业的年轻人去硅谷的很多,比如说 Google Car 的负责人,Udacity 的创始人就是德国人,在波恩读的大学。

        伯乐在线:请简单介绍一下在德国的衣食住行

        德国的生活成本很底,占到工资比例比中国低的多,我生活在斯图加特,这里房价也便宜,使用面积七十平的房子加上税收什么的一百二三十万人民币 吧。如果是两个人都工作的话,五年可以还完贷款在不影响生活水平的前提下,同事们一般都是刚工作买个套间,四十岁的时候住进独立房子。作为一个工程师在德 国绝对可以安居乐业。在不影响每年旅游的情况下。 但是不是非常有钱的话就不要去慕尼黑,法兰克福这种城市,那里的房价就高的吓人了。不过跟帝都魔都还是没法比的。

        伯乐在线:从 08 年到现在,你在德国已经过6、7 个年头,能分享一下在德国的最大收获吗?

        我觉得对我影响最大的就是三句话,第一句是我的讲席教授对我说的一句话,一步一步做事 Schritt fuer Schritt。我时刻铭记在心里。第二句就是我现在的老板对我说的一句话。我们不能为了通过标准而通过标准,我们要把自己的流程做到足够好,它至少要通 过标准评估。最后一句就是我们公司最大的老板说过一句话。销售数据很漂亮,这很好也很重要,但是我想知道的是,我们今年的产品和服务的改进在哪里。我们哪 里做的还不够。只要我们的产品和服务做的足够好,销售和盈利会上去的。这三句话反应了德国这个民族的特性。在一些原则问题上坚决不妥协,不实用主义。这是 德国人很多时候显得不够圆滑的原因。但是这是一个非常正确的做事态度。在汽车工业界这种个性贯穿从供应商到整车厂。这是一个德国车值得信赖的最根本的原 因。

        伯乐在线:谢谢张伟腾出假期,和我们分享你在德国的故事。保持联系,再见。

        恩,保持联系。再见

        本文作者: 伯乐在线 - 黄余粮

        本文链接: http://blog.jobbole.com/57005/