vb3nqnvn11064012788817.gif
1 w; n1 z3 M( y点击上方蓝色字体,关注我们
' ~0 W1 s" P' e s h0 t关于这个问题主要听到了两种声音:
% c% n0 b4 U; u { g3 C. z4 w |+ q5 U: Y( ]7 V
一种视敏捷开发为豺狼虎豹,认为敏捷开发就是“MMA”(无规则格斗),抛开一切规则撸起袖子使劲干,认为使用敏捷开发的软件都会存在严重的质量问题,使用敏捷开发的公司都是草菅人命。7 r! ~0 T& n6 [# t. \7 ^0 m
6 p0 @ R$ l" k! Y另一种声音认为单纯的敏捷和现有的ASPICE都不完全适用域控开发,应采用V+敏捷的进行结合,创新地根据公司实际情况适配,既不能完全按敏捷一套快速迭代,也不能仅仅为了通过BP而找补文档。
! J ]7 D) {7 {- O, D: A; {) q4 J+ f' @4 v' R
对于第一种声音,我个人只能说尊重百花齐放的意见,欢迎继续评论。可能确实有MMA那样的“敏捷开发”,但其实这种不叫敏捷,这种叫没有开发流程。
* Z" r8 y$ Q& q+ l! O; g$ c }4 J) P. V# O8 q: \: D
还有动不动就说要ASPICE的,您真的过过审吗?您知道里面的工作量有多少吗?V可以,ASPICE?HELL NO!可能很多传统汽车电子行业出身的工程师没有真正使用过敏捷,这不是问题,怎么说呢,空杯心态很重要吧。
8 H* m3 B7 U5 f6 m6 G* A# }* @* Z8 B% ~: x4 {* p* W
对于第二种声音,本人举双手双脚赞成。可以把一个scrum看成一次小V,也可以通过FFI的方式把功能和监控分开成两个小项目实施,以达到功能安全的要求,还有建议把what to do部分V化,How to do部分scrum化,这具体展开就涉及到各家拆招的能力了,没有统一答案,主要看各家practice上的经验了。2 A J, z9 h$ h. s( R9 ^
2 ~" g' F1 g7 l" ^, c2 j) G9 y
开写前先唠两句,只要与开发工程师多聊两句,你就会很容易地发现,开发工程师几乎是一边倒的支持敏捷开发,笔者曾完整地参与过一次ASPICE认证项目,也在敏捷模式下进行过较长时间开发。8 f% |7 N! }: p' s4 O t, t
- H5 s% O q0 J! x3 I( a% S从开发工程师的角度出发,使用敏捷进行开发的体验吊打ASPICE(或者V模型)九条街,但我们今天讨论的话题是哪种模式更适合“更快更高质量”地输出产品,而不是哪个模式对工程师更友好。8 {5 a5 c2 @( u" a2 a+ Y# S0 N
/ f* m- l$ L7 f$ ?$ X6 A
那么我们就来探讨一下这两种开发模式在域控时代的适应性。
0 h1 v0 `' {; a/ J& Q6 v( f* E' Q5 \0 q5 E6 S& ~
当汽车电子电器架构还处于分布式的年代,ASPICE(或V模型)可以说是唯一的答案,就没听说过哪家Tier 1或者OEM是使用敏捷去开发一个发动机控制器的。
$ o/ T4 O) f2 M1 z" [$ J) \3 {
4 a. v1 Z( p+ M7 S到了域控时代,新的玩家入场,开发逻辑出现不同声音,特斯拉,蔚小理等硅谷/互联网背景出身的新玩家都使用敏捷进行开发,做出来的产品用户体验确实让消费者有种“诺基亚转安卓”的感觉,难道说敏捷就有如此大的魔力?可以给软件赋予生命力?ASPICE和敏捷的差异和思路究竟在哪?
T3 [: g8 V! w1, N" r0 N7 N( y+ y
ASPICE:堂正之师" j5 s) o! z1 S
1.1. 简述
9 S) `. ^4 G; yASPICE的核心思想就是DRIFT(Do things right in first time)。% g2 i9 B& c. _8 R. _, U
/ ?0 L# s) d2 s! Q* C; C' v
ASPICE认为:+ W E) R' t( I t; I1 g- Y
软件缺陷修复的成本是随着软件进度的开展,成倍数级提升的,BUG越早发现,成本越低;
3 O4 P7 ~' U( b6 C) Z y7 n# D1 g6 H+ g2 Q) T- D5 a- H/ j
0e4455t32cb64012788918.jpg
4 X# M& B6 k( ]4 @* Q9 z8 x) i: h
: g% D! b3 |- \* o6 }3 E2 k' ~
在关键控制器上(比如动力总成的ECU),某些Bug可能是致命的(字面意义上的)且难以被发现的,因此,对代码的态度必须慎之又慎;传统的合作关系上,通常是Tier1供控制器(Turn-key or Customer-sharing),OEM集成到车上,对于软件这种无形的资产,又是闭源交付,OEM管控是很难的,唯一的监管方式就是交付物,所以ASPICE既是开发过程,也是质量证据。
% I4 x7 t: \' p: Y8 [
f. L+ f3 P8 |" B+ b" U$ [因此,ASPICE讲究走一条最康庄平坦的大道。: w5 A9 R& s# a4 j/ W5 V& W' w
' Y/ c; s k" w6 L6 O
一份不偏离相关方(stakeholder)意图的工程需求---->按照意图,考虑所有corner case,基于选型芯片资源,设计考虑完备的软件架构---->将软件架构进一步细化到模块与函数级别的详细设计---->与详细设计思路一模一样的编码---->验证是否与详细设计一致的单元测试---->验证是否与软件架构设计一致的集成测试---->验证是否与软件需求一致的合格性测试。
' _( ]* j: {7 g1 r. z
3 f9 U& T3 }) ^! I说白了,就是:
0 U: h! ]7 R0 L1 ~V左半边:保证每一行代码都能知道是为哪一条需求服务的。V右半边:保证每一行代码都在正确的实现每一条需求。
* V* a/ S% {- z- k# \3 X* V: P S! X# M" |
5njz4d3bvyq64012789018.png
1 B# [) T: i8 ~* v* C1 m- i- w: ?2 x k: Y0 ?+ f
1.2. ASPICE的缺点8 c" j! h% }5 b; d" }
ASPICE统治了汽车软件这么多年,自然有他的必要性与优势,但ASPICE的缺点也非常致命。
. |+ n4 P \9 o- L
1 v: F: O2 r7 {: o& u; n4 [
/ p) d$ A p2 j5 Q E0 f7 ^1. 难以拥抱变化2 v. V' {3 j7 B) D6 w
从上文可以看出,一套V模型撸下来,都是一环套一环的,下一步的输出完全依赖上一步的输入,如果需求发生了变更,而且需求还是与原需求互斥的,那整个项目的改动量将是灾难性的。
) _2 S; K1 z$ O
/ Y" S: Z% O9 k5 |所以有些OEM的DRE可能会很疑惑,为什么看起来一个小小的CR(change request)发下去,会被Tier1告知一大笔的开发费用,甚至是拒绝?流程可能就是其中一个原因。
|' b% s' F& k: A
2 T- E: Q: D5 p# ~/ G8 [( U只要代码需要变更,好嘛,相应的设计文档作废,重新设计,测试重新做……想想都头疼。而国内的项目氛围又是“最爱”拥抱变化的,hmmm……
- H6 }( }2 L3 Y6 B3 S1 ]2 {' O
nby1tnaubdo64012789118.jpg
# C1 R" S1 c! s C* u+ K9 _/ `7 `+ d% ~
2. 对人力消耗巨大
" k$ j3 ~* v0 q' _: P我贴一下SWE.3(软件详细设计与单元开发)的BP出来给大家感受一下。
; `& Q* t+ G* J8 R |% I2 z- B& z- f
vtey0nr5uro64012789218.jpg
; G* S& ~1 u' g5 V" B) ^
5 X7 v U b' r- r2 W; T随便说几个工作量大到离谱的:
$ H/ x8 Z* \1 c+ G l0 B4 WBP3:很多时候模块间交互是很难穷尽描述的,特别是大型软件,应用层,或者高聚低耦做得没那么好的模块,在不同场景,不同条件下,都可能走不同逻辑,整个交互路径都穷举一遍是很难的,画出来的seq图也很难阅读BP5:每一步的流程都要求这个,做过的dddd(懂的都懂),有DOORS相对好点,用excel去管理这玩意就是个灾难,还感觉没什么卵用
9 g0 ~5 j& ?0 a6 I% y* ~
% }' j3 B; ?' W$ u其实每个BP要求的工作量都很大,我做过大概的统计,执行ASPICE的人力需求是不执行的3倍,除此以外,就像我之前说的,这个流程既是开发流程,也是质量证据,属于监管与被监管的关系,繁重的文档任务深深的打击了工程师的积极性。
' |& |0 s' N) {5 R2- c, Z0 v3 t+ W& j
敏捷开发:短平快,拥抱变化$ N8 j5 n0 \! I6 B; j, J8 c
2.1. 简述
- t- k& i0 V0 E) _ t
g0tgvmhbs0e64012789318.jpg
% \$ Y3 s, G% A- A& W" ]3 T0 s5 b! ^2 D/ W
敏捷开发的核心逻辑是解构,把软件需求分解成Epic or story,通过一轮开发迭代(sprint)实现相应的功能。1 c$ a: i [: }% K( Q. |
; y0 @4 O- |1 f8 T! F' {4 v; L
一轮sprint包含:需求确认->方案制定->coding->台架验证->实车验证->rolling candidate版本验证->代码合入。' k+ T, ]4 N) a- u6 x$ n+ ]* J
4 A+ O& k3 o) |+ J7 q
敏捷的优点在于:
8 i) \* ?+ ^+ P拥抱不确定性,发生需求变更,那就直接来一轮sprint,如果还不够,那就来两轮;出活快,一个sprint的迭代以周为单位;充分调动工程师积极性,(相对)轻文档,重代码;2 m! x# T4 R7 i1 @9 a
+ `2 o+ J8 N3 \$ A' M C5 d2.2. 敏捷的缺点/ V9 v* f0 t/ h m( [
说完敏捷这枚硬币的正面,下面说他的反面。
" ?2 z" \' [8 \- K3 y- z* m7 t2 B) `/ _- @" y, c2 g1 d; j! I
相比ASPICE或者V模型,敏捷少做的事情:缺少统筹全局的进行软件架构设计,导致模块很难做到高类聚低耦合,比如Sprint A实现的一个功能,其底层模块其实可以被Sprint B的某个功能部分复用,但由于Sprint A没有考虑Sprint B的开发需求,所以该底层模块并不能被完全复用,Sprint B可能就要重新开发一个底层模块去覆盖他自己的需求。多轮sprint下来,可能会有重复造相似轮子的情况出现。这样会导致软件比较臃肿,代码量大,执行效率低,且代码质量不高;缺少集成测试,导致新加的功能可能对已实现的功能有潜在的影响而不能被发现;由于短平快的特性,很多时候单元测试也不能充分进行,比如动态单元测试;与FUSA的流程完全不兼容。ISO26262也好,ISO61508也好,ISO34590也好,都是植根于V模型,使用敏捷开发的软件,很难满足功能安全的开发要求,也无法做功能安全分析,无法做FFI。
6 u% [( \# U2 w[/ol]7 S f5 e; V, Z# [' s- N! P: |
3
& |6 Y9 X) n+ P2 S- D, [谁是自动驾驶时代答案?7 ?7 P* M: a, X7 w
两种开发流程各擅胜场,也有其出现的背景,在传统汽车时代,各个控制器没有花哨的功能,但要求软件稳定可靠,这种情况下,使用ASPICE或者V模型进行开发无疑是非常正确的。
$ S; O P P0 K ^9 v8 h
! I3 w( _( e% m* E* Q) h域控时代的来临,最主要的变化有三点:' `% C" ?- U( b* L& P5 U
功能众多:带来的变化是软件复杂度指数式上涨,相关方众多;产业链合作关系改变:从一功能一盒子,由Tier1软硬件一起交付,OEM负责集成,到所有功能集中在域控,Tier1只提供底软和硬件,应用软件由Tier1,Tier2,OEM联合开发;
3 J- A$ ^* z' u2 i& e7 B1 C: `# O8 H y
3 F* {. C5 e. e- n
ja3bwnmui2q64012789418.jpg
1 b6 o% z5 F) Q6 r* k0 L
- S; L( ~& v4 F [' M4 n
我的观点是:ASPICE不适合用于开发智驾域控软件,敏捷相对更合适,但必须根据汽车软件的特点,进行适配(一家之言,如果有使用ASPICE完整开发过智驾域控到SOP的经验,非常非常欢迎留言探讨)。& A0 o v8 U" ]( S, J
/ \5 ?5 _3 E" l7 T0 ^+ x6 Q
3.1. 为什么ASPICE不合适用于开发域控?* T- S' m T n/ A( F
第一,ASPICE下对发生变更的代价是巨大的,因此需要一次把所有功能都定义,设计完美。
/ ` C. x1 o5 o- F) B
1 F$ y9 O a5 F% O. }: Y7 |然而在域控这种软件复杂度下,我不认为有哪个人或者团队可以在项目开发初期,就能一次把所有的需求都定到完美。
- p2 f7 l( K+ F/ Y" p( y+ U u: g R' }% ^* E6 f, F6 ?
不完美,后期增改功能,好嘛,又一轮完整的V迭代,所有文档改掉,软件配置管理做版本管理,恐怕需求没开发完,工程师跑一大半了。" U5 U1 @$ g+ I9 D l( O0 E9 H
v. m- J/ ~& O; u- {
to0mqwpswrq64012789519.jpg
6 \; v3 _* s6 e8 q
, V8 f* R3 t$ C) d8 Z9 k0 c第二,退一万步讲,就算有优秀的产品团队可以一次把所有需求缕清,肯定也需要漫长的时间,试想下,两家公司同时开始项目,使用敏捷的小步快跑,不断试错,都已经有产品在投放市场了,使用ASPICE的可能还在需求制定阶段……3 W+ f, r5 |2 g" [0 t( B C
7 k ~- t2 _: l2 M$ ?( W- \
3.2. 敏捷开发需要做什么适配?
5 Q F& o) n& t- w% C, {" h敏捷开发需要克服的困难主要在于提升软件质量和满足功能安全要求。. X# Q8 G7 {( n. e5 N5 {0 `6 a7 f
+ [6 ]$ A6 d+ @6 N+ r
并不是用敏捷开发出来的软件架构就会松散,臃肿,而是敏捷的环境让工程师更容易输出这样的结果。8 v, V- M; ?6 X {3 a: k' |
9 c7 e$ N" R) F' y3 Y5 D7 l4 C所以我认为以下措施的执行能有效改善软件质量:4 @9 c2 U/ ]2 I }3 J/ M6 K+ s
适当延长sprint周期;严格的编码规范与培训;使用TDD(测试驱动开发)思路强大的devops能力作为技术保证;引入自动化单元检查工具;) q2 D' S! |$ U2 |0 X' S' ]+ a) |3 H
" s9 F) U( }1 Q3 f* z, |% x
满足功能安全要求,话只有一句,其实是个悖论,因为软件功能安全=V模型开发。
# W. [5 K8 k7 N4 f) x) ^4 x: O# d
可能的一个解决方案,是利用ISO26262中FFI的思路,通过前期技术规划,将软件架构分解成功能。) j( D# m. P3 @1 s6 u4 H
, C9 ~: _8 H& q- U) o l# M: D- t
QM(D)和功能安全软件D(D),功能分区使用敏捷开发小步快走,功能安全分区还是按V模型进行开发(思路是这么个思路,但做软件安全分析和安全架构设计需要非常小心,而且仅适用于safety goal为fail safe的域控,如果L4以上需要做fail operational的,又不能这么玩了)。
1 V. m- P D$ ?& W7 B' Y$ ?3 ^' G+ b; G
asljdhitrfr64012789619.jpg
: C( z: k6 w5 \/ H6 N
! f% j) h o/ W# M% r* }( v2 T, @; ~! }
作者:FragmentedSword
/ r7 n; C. W9 n! k链接:https://www.zhihu.com/question/393230142/answer/2613414502
5 T. k. Z) h$ x$ w3 \3 U- c/ _9 R来源:知乎
b! i5 N5 `% g$ Q; X' b
xw111uklxta64012789719.jpg
) e1 o: l/ o9 |1 h: |
zg20sumyw0l64012789819.gif
3 q3 H. k& |9 D2 [) T点击阅读原文,更精彩~ |