OEM在與軟件供應(yīng)商合作時(shí),總會(huì)遇到一些挑戰(zhàn)。這里從實(shí)際工作中總結(jié)了六條經(jīng)驗(yàn)。汽車(chē)上的軟件開(kāi)發(fā)會(huì)需要多家供應(yīng)商為車(chē)輛的不同功能提供軟件。成功地從所有供應(yīng)商那及時(shí)獲得高質(zhì)量的軟件是一個(gè)巨大的挑戰(zhàn)。為了應(yīng)對(duì)這一挑戰(zhàn),汽車(chē)公司通過(guò)國(guó)際標(biāo)準(zhǔn)、企業(yè)標(biāo)準(zhǔn)、功能規(guī)范和工程合同等來(lái)規(guī)范供應(yīng)商的工作。但是在日常工作中,如何處理與軟件供應(yīng)商的合作,使其達(dá)到想要的結(jié)果呢?我在軟件開(kāi)發(fā)項(xiàng)目中擔(dān)任過(guò)兩年的軟件質(zhì)量工程師,接觸過(guò)七家供應(yīng)商。我的工作是為DRE提供技術(shù)和計(jì)劃支持,他們則監(jiān)督供應(yīng)商的軟件開(kāi)發(fā),使項(xiàng)目的成功執(zhí)行。這種支持涵蓋了合同管理、項(xiàng)目規(guī)劃、需求工程、設(shè)計(jì)、實(shí)施、供應(yīng)商和內(nèi)部測(cè)試、可追溯管理、過(guò)程改進(jìn)、質(zhì)量保證、符合標(biāo)準(zhǔn)、風(fēng)險(xiǎn)和機(jī)會(huì)管理、處理器和內(nèi)存負(fù)載監(jiān)控、和產(chǎn)品交付。我經(jīng)常與供應(yīng)商進(jìn)行溝通,并不斷協(xié)商我們?cè)谶@些領(lǐng)域的責(zé)任。此外,在一個(gè)項(xiàng)目的生命周期內(nèi),我們會(huì)與供應(yīng)商進(jìn)行了幾次聯(lián)合審查,這意味著親自前往供應(yīng)商現(xiàn)場(chǎng),并在2 - 3天的聯(lián)合會(huì)議中審查他們的過(guò)程和工作產(chǎn)品。這項(xiàng)工作讓我對(duì)軟件開(kāi)發(fā)有了一個(gè)整體的看法,從而產(chǎn)生了一系列后續(xù)行動(dòng),讓雙方能夠克服項(xiàng)目瓶頸。這些都是我的工作,除此之外,我還觀察和記錄總結(jié)了這個(gè)過(guò)程中最重要的經(jīng)驗(yàn),這些經(jīng)驗(yàn)對(duì)項(xiàng)目執(zhí)行的成功有明顯的影響。經(jīng)驗(yàn)一:如果需要與供應(yīng)商進(jìn)行長(zhǎng)期的合作并且有密集的功能開(kāi)發(fā)需求,那就建立一個(gè)敏捷合同
OEM外包軟件開(kāi)發(fā)的常見(jiàn)操作之一是為每個(gè)軟件增量向供應(yīng)商付款。如果供應(yīng)商負(fù)責(zé)開(kāi)發(fā)一個(gè)比較大的軟件,那么總是有功能增量的需求。在這種情況下,雙方通常建立功能開(kāi)發(fā)或變更計(jì)劃,這里每個(gè)功能開(kāi)發(fā)的周期設(shè)置為十周,但在不同的實(shí)踐中會(huì)有所不同。
在這十周的開(kāi)始,供應(yīng)商會(huì)收到需求或者變更請(qǐng)求,即一些新功能和舊功能的變更。供應(yīng)商工程師設(shè)計(jì)變更,并估算開(kāi)發(fā)需要的時(shí)間。然后供應(yīng)商管理層進(jìn)行審查和批準(zhǔn)。接下來(lái)OEM也會(huì)對(duì)其進(jìn)行審查和批準(zhǔn)。最后就按照這個(gè)計(jì)劃開(kāi)發(fā)。圖1(a)顯示了十周時(shí)間段內(nèi)所述活動(dòng)的簡(jiǎn)化圖。
圖1 a 傳統(tǒng)的開(kāi)發(fā)計(jì)劃 b 敏捷開(kāi)發(fā)計(jì)劃這種合作模式的一個(gè)缺點(diǎn)是開(kāi)發(fā)組織必須詳細(xì)估算開(kāi)發(fā)時(shí)間,并等待管理層批準(zhǔn)。另一個(gè)缺點(diǎn)是一個(gè)開(kāi)發(fā)周期必須足夠長(zhǎng),這樣在減去前期評(píng)估和審批的時(shí)間,仍然有足夠的時(shí)間進(jìn)行開(kāi)發(fā),結(jié)果就是開(kāi)發(fā)周期變長(zhǎng)。對(duì)于一個(gè)大型ECU開(kāi)發(fā),一年中花在前期評(píng)審和審批的時(shí)間高達(dá)13-17周,這種方式阻礙了在雙方之間構(gòu)建快速反饋和缺陷解決的持續(xù)集成鏈。這種浪費(fèi)可以通過(guò)開(kāi)發(fā)敏捷模式來(lái)消除。該模式的本質(zhì)是,OEM不僅要為勞動(dòng)力付費(fèi),還要為開(kāi)發(fā)的功能付費(fèi)。這意味著OEM應(yīng)該從供應(yīng)商那里雇傭敏捷團(tuán)隊(duì)。由于該團(tuán)隊(duì)位于供應(yīng)商處,一個(gè)好的程序是有專(zhuān)門(mén)的產(chǎn)品負(fù)責(zé)人,一個(gè)來(lái)自供應(yīng)商,一個(gè)來(lái)自O(shè)EM。然后任何更改請(qǐng)求都會(huì)發(fā)送給產(chǎn)品負(fù)責(zé)人,他們一起分析并決定即將到來(lái)的開(kāi)發(fā)時(shí)間段的下一項(xiàng)工作。OEM產(chǎn)品負(fù)責(zé)人關(guān)心的是根據(jù)需求的緊急程度和開(kāi)發(fā)工作對(duì)變更請(qǐng)求進(jìn)行優(yōu)先級(jí)排序。當(dāng)然,供應(yīng)商產(chǎn)品負(fù)責(zé)人也會(huì)評(píng)估方案的可行性和開(kāi)發(fā)團(tuán)隊(duì)的工作量。這種方式審批浪費(fèi)的時(shí)間被消除了,所以開(kāi)發(fā)的時(shí)間可以減少,從而使快速反饋和對(duì)供應(yīng)商的響應(yīng)變得有效。經(jīng)驗(yàn)2:盡管有工程合同,但要注重積極的聯(lián)合審查
汽車(chē)開(kāi)發(fā)的慣例是,OEM會(huì)有一份全面的書(shū)面工程合同,詳細(xì)說(shuō)明供應(yīng)商應(yīng)該遵守的每一個(gè)實(shí)踐和供應(yīng)商應(yīng)該達(dá)到的每一個(gè)指標(biāo)。一個(gè)常見(jiàn)的慣性思維是,只要制定好了,項(xiàng)目就能成功。
但是這其中有兩個(gè)問(wèn)題:第一,大多數(shù)實(shí)踐和指標(biāo)在持續(xù)應(yīng)用時(shí)是有價(jià)值的。例如,如果不遵從MISRA編碼規(guī)范,修復(fù)缺陷會(huì)引發(fā)創(chuàng)建新缺陷的高風(fēng)險(xiǎn)。這幾乎適用于所有領(lǐng)域,如復(fù)雜性管理、內(nèi)存優(yōu)化、處理器負(fù)載度量、風(fēng)險(xiǎn)管理等等。當(dāng)OEM不積極地去審查供應(yīng)商的交付物以及開(kāi)發(fā)過(guò)程時(shí),為了滿足合同上的條款,供應(yīng)商經(jīng)常發(fā)送指標(biāo)報(bào)告,而沒(méi)有后續(xù)動(dòng)作。
第二,有一種說(shuō)法是,如果項(xiàng)目失敗了,供應(yīng)商將承擔(dān)后果(如合同中所示)。但事實(shí)并非如此。即使供應(yīng)商可能會(huì)因?yàn)橛腥毕莸漠a(chǎn)品而支付罰款,或者可能會(huì)因?yàn)轫?xiàng)目失敗而得不到付款,但對(duì)OEM的影響是巨大的。OEM無(wú)法提供承諾的功能,失去信譽(yù)。在實(shí)踐中,合同是OEM和供應(yīng)商的工程師組織協(xié)作的法律、道德和實(shí)踐框架。這種協(xié)作越系統(tǒng)化,項(xiàng)目進(jìn)行的就越無(wú)縫。這樣的合作主要通過(guò)聯(lián)合審查的方式進(jìn)行,雙方可以陳述他們的關(guān)注點(diǎn)、困難、需求、需要的支持、變更請(qǐng)求等。他們還會(huì)就合同范圍之外的小問(wèn)題進(jìn)行談判,并慶祝進(jìn)展中的小成功。系統(tǒng)化和詳盡的聯(lián)合評(píng)審對(duì)產(chǎn)品的成功至關(guān)重要。正是在這些審查過(guò)程中,看似業(yè)余的問(wèn)題可能可以識(shí)別到關(guān)鍵的問(wèn)題和風(fēng)險(xiǎn)。也正是在這些評(píng)審期間,工程師們?yōu)榱艘粋€(gè)共同的有意義的目標(biāo)團(tuán)結(jié)在一起,并為長(zhǎng)期合作建立前提。經(jīng)驗(yàn)三:監(jiān)督供應(yīng)商與二級(jí)供應(yīng)商的關(guān)系
在某些情況下,軟件供應(yīng)商有自己的供應(yīng)商。例如,如果一個(gè)供應(yīng)商承擔(dān)了一個(gè)節(jié)點(diǎn)的主要功能的開(kāi)發(fā),他們可能會(huì)從另一個(gè)供應(yīng)商那里購(gòu)買(mǎi)該節(jié)點(diǎn)的操作系統(tǒng),而后者則是OEM的二級(jí)供應(yīng)商。與工程合同規(guī)范OEM和供應(yīng)商合作的方式一樣,它們也規(guī)范供應(yīng)商和二級(jí)供應(yīng)商的合作。一方面,OEM不能強(qiáng)制二級(jí)供應(yīng)商遵守工程合同,因?yàn)楹贤皇侵苯釉谒麄冎g簽訂的。另一方面,迫使供應(yīng)商要求二級(jí)供應(yīng)商遵守合同是具有挑戰(zhàn)性的。雖然這個(gè)問(wèn)題在合作中似乎是次要的,但如果不從一開(kāi)始就仔細(xì)考慮,它可能會(huì)成為一個(gè)棘手的問(wèn)題。假設(shè)由于一些法律和實(shí)際原因,工程合同要求供應(yīng)商在OEM需求和供應(yīng)商測(cè)試用例之間顯示完整的可追溯性。同樣,假設(shè)供應(yīng)商和二級(jí)供應(yīng)商在二級(jí)供應(yīng)商只開(kāi)發(fā)和交付工作功能而沒(méi)有測(cè)試用例的條件下合作了很多年。這個(gè)問(wèn)題可能在一開(kāi)始就不明確,因?yàn)楣?yīng)商可能認(rèn)為購(gòu)買(mǎi)的功能符合工程合同,而OEM可能不這么認(rèn)為。之后,在項(xiàng)目文件交付過(guò)程中發(fā)現(xiàn)問(wèn)題,出于法律原因,解決方案不會(huì)很明顯,強(qiáng)調(diào)三方的關(guān)系。另一個(gè)相關(guān)問(wèn)題是,供應(yīng)商專(zhuān)注于自己的工作以遵守工程合同,但在沒(méi)有適當(dāng)溝通的情況下將合同轉(zhuǎn)讓給二級(jí)供應(yīng)商。這種情況下,供應(yīng)商可以展示其開(kāi)發(fā)部分的合規(guī)性,但無(wú)法展示二級(jí)供應(yīng)商開(kāi)發(fā)部分的合規(guī)性。至關(guān)重要的是,二級(jí)供應(yīng)商的開(kāi)發(fā)可能占整個(gè)軟件開(kāi)發(fā)的50%。解決這些問(wèn)題需要大量的時(shí)間和精力,甚至涉及到更高的管理層。建議OEM質(zhì)量工程師和項(xiàng)目經(jīng)理要求二級(jí)供應(yīng)商的關(guān)鍵工程師參與合同的制定過(guò)程。他們應(yīng)討論并商定在項(xiàng)目開(kāi)始時(shí),合同合規(guī)性的可接受范圍。達(dá)成這樣的協(xié)議通常需要付出出乎意料的巨大努力,因?yàn)槿街g的工程政策總是存在沖突,但這些協(xié)議正在為積極合作奠定堅(jiān)實(shí)基礎(chǔ)。另一個(gè)建議是,OEM工程師應(yīng)該詢問(wèn)供應(yīng)商與二級(jí)供應(yīng)商的關(guān)系如何,雙方合作是否存在瓶頸,是否存在可行性問(wèn)題,交付問(wèn)題等等。這樣的對(duì)話通常會(huì)發(fā)現(xiàn)看似很小的問(wèn)題,但在項(xiàng)目接近尾聲時(shí)可能會(huì)發(fā)展成大問(wèn)題。但當(dāng)OEM工程師表現(xiàn)出關(guān)注和興趣時(shí),這些問(wèn)題就會(huì)自動(dòng)變得重要,并在后續(xù)過(guò)程中得到解決。經(jīng)驗(yàn)四:建立績(jī)效KPI,以管理項(xiàng)目進(jìn)度的合規(guī)性
供應(yīng)商軟件管理的一項(xiàng)基本任務(wù)是了解供應(yīng)商何時(shí)完成開(kāi)發(fā)。實(shí)踐中的一個(gè)問(wèn)題是,從業(yè)者有時(shí)要么不使用任何KPI,要么使用無(wú)效的KPI。在這兩種情況下,實(shí)踐者都以一遍又一遍地?zé)o用的討論而告終。
常見(jiàn)的無(wú)效KPI是靜態(tài)KPI,忽略了時(shí)間軸,因此是朝著完成日期發(fā)展的趨勢(shì)。一個(gè)例子是餅圖,顯示60%的需求已經(jīng)實(shí)現(xiàn)。
相反可以構(gòu)建一個(gè)KPI,它可以預(yù)測(cè)完成日期。圖2顯示了兩個(gè)這樣的KPI。第一個(gè)KPI(圖1 a)適用于確定總體需求數(shù)量的項(xiàng)目。這是幾周內(nèi)實(shí)施需求的趨勢(shì)(橙色線),旨在在目標(biāo)周內(nèi)達(dá)到需求總數(shù)(藍(lán)色線)。例如知道目標(biāo)是第26周,從業(yè)者可以預(yù)測(cè)開(kāi)發(fā)將延遲2-3周。
在實(shí)踐中,用圖1(a)構(gòu)建另外兩個(gè)趨勢(shì)可以更全面地概述發(fā)展趨勢(shì):1、分解的OEM需求(有多少原始要求分解為供應(yīng)商的內(nèi)部設(shè)計(jì)要求);監(jiān)控這三種趨勢(shì)將有助于確定開(kāi)發(fā)中哪些主要活動(dòng)是滯后的,因此可以在各自的活動(dòng)中增加更多的資源,或者重新確定需求的優(yōu)先級(jí)。圖2 a已定義產(chǎn)品需求集發(fā)展趨勢(shì)的KPI第二個(gè)KPI(圖1 b)適用于只定義了即將到來(lái)的待定項(xiàng)的功能的項(xiàng)目。因此燃盡和堆積趨勢(shì)對(duì)于監(jiān)控進(jìn)度遵從性是有效的。趨勢(shì)(圖2 b)顯示了一個(gè)為期四周的敏捷迭代,團(tuán)隊(duì)在27天內(nèi)燒掉了40個(gè)故事點(diǎn)(綠線)。同時(shí),新的故事點(diǎn)在開(kāi)發(fā)期間堆積在現(xiàn)有的待定項(xiàng)之上(橙色線),提高了實(shí)際趨勢(shì)(黑色線)。在第17天,如果添加了更多的描述點(diǎn),那么團(tuán)隊(duì)有按時(shí)發(fā)布產(chǎn)品增量的風(fēng)險(xiǎn)。圖2 b 未定義產(chǎn)品需求集發(fā)展趨勢(shì)的KPI
經(jīng)驗(yàn)五:建立質(zhì)量KPI,以管理質(zhì)量合規(guī)性
供應(yīng)商軟件管理中的另一項(xiàng)基本任務(wù)是了解所開(kāi)發(fā)軟件的質(zhì)量。軟件KPI是監(jiān)控質(zhì)量和指導(dǎo)改進(jìn)活動(dòng)的有力手段。同樣,關(guān)鍵是選擇有效的KPI并持續(xù)使用,并采取后續(xù)行動(dòng)。
然而,一個(gè)大問(wèn)題是供應(yīng)商只是偶爾進(jìn)行衡量,并將結(jié)果發(fā)送給OEM,而不采取后續(xù)行動(dòng)。因此,OEM負(fù)責(zé)人應(yīng)要求KPI報(bào)告,以證明持續(xù)改進(jìn),如每周或每?jī)芍?。這種態(tài)度建立了基于客觀和準(zhǔn)確度量的軟件質(zhì)量密切協(xié)作和討論。雙方的實(shí)踐者在討論質(zhì)量時(shí)使用相同的語(yǔ)言。供應(yīng)商了解到,遵循KPI并提高質(zhì)量不是一項(xiàng)獨(dú)立的活動(dòng),而是開(kāi)發(fā)過(guò)程中的一個(gè)自然部分。
質(zhì)量KPI的另一個(gè)大問(wèn)題是,從業(yè)人員被許多眾所周知的KPI弄糊涂了,這些KPI不準(zhǔn)確,因此最終對(duì)任何質(zhì)量改進(jìn)活動(dòng)都是無(wú)用的。例如計(jì)算代碼行數(shù)或眾所周知的復(fù)雜度數(shù),如圈復(fù)雜度、Halstead度量等。測(cè)試中類(lèi)似的例子是決策和條件覆蓋率的計(jì)數(shù)。這里我列出了一些KPI,它們明顯地幫助顯著提高了軟件質(zhì)量。
1、OEM需求測(cè)試的覆蓋范圍
2、嚴(yán)重違反MISRA的數(shù)量
3、高度嵌套的源函數(shù)數(shù)量
4、未跟蹤的需求/測(cè)試/代碼的數(shù)量
第一個(gè)KPI的目標(biāo)值為100%;在交付給OEM之前,應(yīng)在供應(yīng)商現(xiàn)場(chǎng)對(duì)所有OEM要求進(jìn)行功能測(cè)試。這樣的測(cè)試最好與開(kāi)發(fā)同時(shí)進(jìn)行。第二個(gè)KPI的目標(biāo)值為0;所有嚴(yán)重違反MISRA的行為都應(yīng)該在引入這些行為后“及時(shí)”得到解決。第三個(gè)KPI的目標(biāo)值為0;所有超過(guò)最大嵌套級(jí)別4(最大嵌套<5)的源函數(shù)都應(yīng)該在引入它們時(shí)“及時(shí)”進(jìn)行重構(gòu)。第四個(gè)KPI的目標(biāo)值為0;所有客戶需求都應(yīng)與內(nèi)部供應(yīng)商設(shè)計(jì)需求、源功能和測(cè)試用例有明確的跟蹤鏈接。有更多的KPI可以用于提高軟件質(zhì)量:例如MC/DC覆蓋范圍,應(yīng)具有基于軟件關(guān)鍵性級(jí)別的目標(biāo)值;處理器和內(nèi)存負(fù)載趨勢(shì),應(yīng)像上一節(jié)中的實(shí)現(xiàn)趨勢(shì)一樣進(jìn)行監(jiān)控。在軟件開(kāi)發(fā)中持續(xù)使用這種有效的KPI,并要求供應(yīng)商及時(shí)解決問(wèn)題,可以獲得以下三個(gè)大的好處:
1、在整個(gè)開(kāi)發(fā)過(guò)程中,所開(kāi)發(fā)的軟件功能始終符合OEM的要求;
2、許多缺陷都是在供應(yīng)商方面提前發(fā)現(xiàn)的,不會(huì)浪費(fèi)系統(tǒng)測(cè)試的時(shí)間,也不會(huì)占用測(cè)試設(shè)備;
3、源代碼保持可維護(hù)性,以便更快地添加新功能和修復(fù)缺陷,尤其是在項(xiàng)目完成后很長(zhǎng)時(shí)間。
經(jīng)驗(yàn)六:考慮讓你的供應(yīng)商參與后續(xù)項(xiàng)目,即使有更便宜的替代方案
在持續(xù)的大型產(chǎn)品開(kāi)發(fā)中,新項(xiàng)目通常是一個(gè)帶有一些附加功能的舊項(xiàng)目的后續(xù)。新項(xiàng)目與前一個(gè)項(xiàng)目有很多功能重疊,可能會(huì)外包給不同的供應(yīng)商。在這種情況下,功能的設(shè)計(jì)是圍繞OEM之前指定的一組需求發(fā)展的。同時(shí),在新供應(yīng)商現(xiàn)場(chǎng)重新開(kāi)發(fā)新的項(xiàng)目代碼。
因此,這兩個(gè)連續(xù)的項(xiàng)目有不同的預(yù)算、負(fù)責(zé)人,而且往往有不同的供應(yīng)商,即使它們的功能重疊。每次啟動(dòng)新的后續(xù)項(xiàng)目時(shí),都應(yīng)選擇供應(yīng)商。本次選擇考慮了兩個(gè)主要方面:成本和能力。選擇了一個(gè)具有合理價(jià)格和較高軟件開(kāi)發(fā)能力的供應(yīng)商。
但是,如果舊供應(yīng)商已經(jīng)擁有為新項(xiàng)目開(kāi)發(fā)的大部分功能,是否有機(jī)會(huì)選擇新供應(yīng)商?現(xiàn)實(shí)情況是,新供應(yīng)商通常給其他OEM開(kāi)發(fā)類(lèi)似的功能,這些OEM與當(dāng)前OEM有很大的功能重疊。因此,供應(yīng)商之間的競(jìng)爭(zhēng)是真實(shí)的,因?yàn)樗麄兌加幸恍┮呀?jīng)開(kāi)發(fā)的功能。
然而,供應(yīng)商評(píng)估中經(jīng)常忽略的一個(gè)微妙的考慮是,即使開(kāi)發(fā)的功能相似,新供應(yīng)商的代碼也不同:首先,功能相似性仍然包含不同汽車(chē)之間細(xì)微的行為差異,這些差異表現(xiàn)為代碼中某些變量的不同范圍和初始值。其次,代碼的內(nèi)部設(shè)計(jì)和結(jié)構(gòu)不同,因?yàn)樗鼈內(nèi)Q于公司的開(kāi)發(fā)人員和編碼實(shí)踐。
然而,這兩個(gè)細(xì)微的差異在實(shí)踐中產(chǎn)生了重大問(wèn)題。首先,供應(yīng)商應(yīng)了解所有產(chǎn)品要求,盡管已經(jīng)開(kāi)發(fā)了大部分功能;這需要大量的詳細(xì)需求評(píng)審工作,以確保產(chǎn)品符合需求。其次,供應(yīng)商應(yīng)確保軟件與硬件的集成:軟件兼容性、信號(hào)交換技術(shù)以及硬件處理器和內(nèi)存負(fù)載要求。第三,更改現(xiàn)有代碼中某些變量的初始值和范圍以符合OEM要求可能會(huì)觸發(fā)一系列軟件缺陷、更正和更新,這些缺陷、更正和更新只會(huì)隨著時(shí)間的推移而消退。如果變更或缺陷很多,可能會(huì)影響生產(chǎn)。
如果供應(yīng)商在軟件開(kāi)發(fā)方面有很強(qiáng)的能力,那么上述問(wèn)題就會(huì)得到緩解。但是高能力只能解決部分問(wèn)題。另一部分在于軟件的性質(zhì);如果在開(kāi)發(fā)中有足夠多的更改,那么軟件缺陷肯定會(huì)出現(xiàn)。軟件是一個(gè)復(fù)雜的工件。預(yù)計(jì)變化的后果是不可能的。時(shí)間是一個(gè)獨(dú)立的參數(shù),它允許軟件的成熟和缺陷的消退。因此,每次OEM考慮為后續(xù)項(xiàng)目更換供應(yīng)商時(shí),都應(yīng)該考慮到新供應(yīng)商需要更長(zhǎng)的時(shí)間來(lái)實(shí)現(xiàn)軟件的成熟和適應(yīng)。
申明:整理自外文文檔,侵刪