明白了價(jià)值和浪費(fèi)的概念,但改進(jìn)應(yīng)從何處入手?畢竟一個(gè)工廠里有太多的事情。父親的辦法是先從成品處開(kāi)始觀察,因?yàn)槌善犯嬖V了我們有多少產(chǎn)品流出這個(gè)車間,然后沿價(jià)值流逆向回溯,以發(fā)現(xiàn)瓶頸所在。這里的價(jià)值流指一個(gè)產(chǎn)品從概念到實(shí)際生產(chǎn)、從訂單到交付的過(guò)程中所需要的全部活動(dòng),包括了增加價(jià)值的活動(dòng),也包括不增加價(jià)值的活動(dòng)。沿價(jià)值流回溯時(shí),經(jīng)常能觀察到瓶頸,瓶頸是整個(gè)加工過(guò)程中一個(gè)緩慢的步驟,因?yàn)樗荒軌驖M足下游工位的需要,所以在制品會(huì)在那里堆積,瓶頸是不能增加價(jià)值的一個(gè)標(biāo)志。注意,這里父親的操作與日常思維習(xí)慣相反,我們一般是習(xí)慣順價(jià)值流從上往下去考慮問(wèn)題,先進(jìn)行需求分析、然后是設(shè)計(jì)編碼、再是測(cè)試、最后是版本構(gòu)建發(fā)布,而精益分析則先從版本構(gòu)建發(fā)布開(kāi)始觀察問(wèn)題,因?yàn)橹挥袠?gòu)建完交付給用戶的軟件功能塊才真正是產(chǎn)生價(jià)值的地方。
逆價(jià)值流觀察完整個(gè)工廠后,父親請(qǐng)菲爾做出選擇,請(qǐng)他決定改進(jìn)從何處開(kāi)始。菲爾的痛點(diǎn)在于"最主要的問(wèn)題就是及時(shí)把STR型號(hào)的訂單生產(chǎn)出來(lái),為此我們需要把每周50件的產(chǎn)量擴(kuò)充到100件”,由于一套STR設(shè)備需要四件斷路器,也就是說(shuō)他現(xiàn)在最希望的是工廠的斷路器生產(chǎn)能力能由每天40個(gè)擴(kuò)大到每天80個(gè)。雖然父親已經(jīng)看到工廠中需要改變的東西很多,但他認(rèn)同改變一定要從某個(gè)點(diǎn)開(kāi)始,所以,他必須在菲爾下定決心,選擇這個(gè)切入點(diǎn)后,再?gòu)拇颂庨_(kāi)啟改進(jìn)之旅。這個(gè)問(wèn)題,在我們今年的敏捷推進(jìn)過(guò)程中也遇到了,任何改進(jìn)最怕的是一把抓,如果能集中力量從一個(gè)點(diǎn)出發(fā),效果要好很多。但是現(xiàn)實(shí)中我們總是遇到想改進(jìn)的東西太多,但資源又極為有限,不同人理解的敏捷及目標(biāo)也不一致,結(jié)果稍不注意就發(fā)現(xiàn)實(shí)際操作中坑挖了不少,但離真正達(dá)成突破還有很遠(yuǎn)距離,這是值得我們深刻反思的。
菲爾選中改進(jìn)點(diǎn)后,父親告訴他,如果想賣更多的STR型產(chǎn)品又不增加固定成本的話, 需要通過(guò)提高質(zhì)量、降低庫(kù)存、縮短生產(chǎn)周期來(lái)提高生產(chǎn)率,也就是說(shuō),重點(diǎn)是三個(gè)目標(biāo)數(shù)字:質(zhì)量目標(biāo)、庫(kù)存目標(biāo)(先考慮在制品庫(kù)存)、生產(chǎn)率目標(biāo)(斷路器個(gè)數(shù)/人/天):
質(zhì)量目標(biāo)關(guān)注生產(chǎn)線上的廢品率,比起在客戶那里發(fā)現(xiàn)的不合格產(chǎn)品數(shù),生產(chǎn)過(guò)程中出現(xiàn)多少不合格品的數(shù)量更有價(jià)值,畢竟越靠近成品的下游工位發(fā)現(xiàn)不合格品,付出的代價(jià)越大。在這個(gè)問(wèn)題上,追求的目標(biāo)是零缺陷。這要求生產(chǎn)線上的每一個(gè)工人都先被訓(xùn)練能識(shí)別上一個(gè)工位傳下來(lái)的不合格品,如果發(fā)現(xiàn)了就拒絕接受。為此,需要有將質(zhì)量建立在系統(tǒng)內(nèi)部的思想,保證當(dāng)一個(gè)不合格品被發(fā)現(xiàn)的時(shí)候,不管是什么原因,流水線一定要盡早停下來(lái)調(diào)查。這個(gè)目標(biāo)如果映射到軟件企業(yè)中,那就是,比起泄露故障,我們更要關(guān)注軟件開(kāi)發(fā)過(guò)程中內(nèi)部發(fā)現(xiàn)的故障,而且要把質(zhì)量意識(shí)建立在整個(gè)開(kāi)發(fā)過(guò)程中,而不僅僅是測(cè)試處。為了提早發(fā)現(xiàn)故障,我們需要有持續(xù)集成(CI)系統(tǒng),并且把該系統(tǒng)和代碼審查、各級(jí)自動(dòng)化測(cè)試工具連起來(lái),并且要有嚴(yán)格的CI紀(jì)律,一旦CI失敗,要禁止所有人再簽入代碼,直到問(wèn)題解決(此規(guī)定是為了避免一些深層次問(wèn)題被掩蓋,后面章節(jié)會(huì)提到)。
生產(chǎn)率目標(biāo)關(guān)注每個(gè)工人每天能生產(chǎn)多少件成品。為提高這個(gè)值,需要盡量降低生產(chǎn)周期。這里的生產(chǎn)周期指一件產(chǎn)品從生產(chǎn)開(kāi)始到生產(chǎn)結(jié)束(交付出去)所需要花的時(shí)間,計(jì)算公式為“周期 = 全部在制品庫(kù)存 / 生產(chǎn)率”.比如,菲爾的工廠中發(fā)現(xiàn)生產(chǎn)線上有147個(gè)完成的和未完成的斷路器庫(kù)存,而工廠每天大約生產(chǎn)40個(gè)斷路器,那么裝配每一個(gè)斷路器大概需要的3.7天,也即大約30個(gè)工作小時(shí)。這和單個(gè)斷路器的裝配時(shí)間(約45分鐘)相比,價(jià)值增加比率極為低下。最理想的情況下,整個(gè)生產(chǎn)以單件流方式進(jìn)行,才可能得到最短的生產(chǎn)周期。比如:一個(gè)完整的斷路器裝配需要45分鐘,現(xiàn)在把裝配工作分給生產(chǎn)線上的6個(gè)工人依序完成,假如每個(gè)人工作的任務(wù)劃分比較均衡,則每個(gè)工人的加工時(shí)間為8分鐘。在按單件流方式生產(chǎn)時(shí),每個(gè)工人一次只處理一個(gè)零件,那么單個(gè)斷路器的裝配周期就是45分鐘;但如果每個(gè)工人都是成組的干手上的活,每組包括5個(gè)零件,那么在一個(gè)工人每次加工1個(gè)零件時(shí),其余4個(gè)零件會(huì)處于等待狀態(tài),也即每個(gè)工人需要花5*8=40分鐘才會(huì)把這批零件交到下一個(gè)人手上,這樣最終下來(lái),每個(gè)斷路器的實(shí)際裝配周期將變成40*6=240分鐘。這點(diǎn)在軟件開(kāi)發(fā)上的意義和制造業(yè)是一樣的,理想情況下,最好也是單件流,同一時(shí)候,每個(gè)人手里只做一件事,但軟件開(kāi)發(fā)中單件流的威力要發(fā)揮,需要解決版本發(fā)布問(wèn)題(版本發(fā)布類似于一次交付一組貨物),只有做到持續(xù)交付,才能形成最短的生產(chǎn)周期(后文章節(jié)還會(huì)提到)。曾經(jīng)我統(tǒng)計(jì)過(guò)一段時(shí)間團(tuán)隊(duì)需求的生產(chǎn)周期,結(jié)果發(fā)現(xiàn),如果以需求規(guī)劃開(kāi)始算,到新功能版本發(fā)布為生產(chǎn)周期,開(kāi)發(fā)人員投入時(shí)間是以3至5天算,而開(kāi)發(fā)周期則是以1至2月算;如果以用戶需求提交開(kāi)始算起點(diǎn),到新功能版本正式發(fā)布為生產(chǎn)周期,則周期更是長(zhǎng)達(dá)1至6月。這正是為什么開(kāi)發(fā)團(tuán)隊(duì)覺(jué)得自己已經(jīng)很賣力,而外面總覺(jué)得這邊交付速度太慢,兩種感覺(jué)差異的由來(lái)。這個(gè)現(xiàn)象在大衛(wèi)安德森《看板方法》一書開(kāi)頭舉的那個(gè)微軟案例中也有提及。對(duì)此問(wèn)題的解決,目前我們更多是采用特殊補(bǔ)丁方式,即對(duì)于外面很緊急的功能,特別安排臨時(shí)補(bǔ)丁,開(kāi)發(fā)一完成后,就立即通過(guò)補(bǔ)丁方式外發(fā),以縮短周期,但是,補(bǔ)丁安排畢竟只是應(yīng)急流程,當(dāng)應(yīng)急流程成為常態(tài),也會(huì)對(duì)正常的開(kāi)發(fā)流程產(chǎn)生沖擊,所以,如何探尋更好的解決辦法,很值得我們研究。
庫(kù)存目標(biāo)雖然從長(zhǎng)遠(yuǎn)看,是是要降低所有庫(kù)存,但前期來(lái)說(shuō),更關(guān)注在制品庫(kù)存的降低。在制品庫(kù)存多,至少暗示了如下幾個(gè)問(wèn)題。一者,在制品多意味著更長(zhǎng)的周期時(shí)間,這點(diǎn)前文已通過(guò)周期公式和單件流案例加以說(shuō)明,不再贅敘。二者,在制品多,說(shuō)明作業(yè)流程不平衡,我們需要做的是盡量消除這種不平衡,而不是認(rèn)可這種不平衡,而任由庫(kù)存增加。比如,A和B兩個(gè)工位,A在B的上游,A每小時(shí)生產(chǎn)10個(gè)零件,B每小時(shí)使用5個(gè)零件,則A和B的工作之間存在不平衡,如果我們不去設(shè)法消除這個(gè)不平衡,當(dāng)A和B都全力工作時(shí),在制品庫(kù)存就會(huì)在A處堆積起來(lái)。這點(diǎn)在軟件開(kāi)發(fā)中的常見(jiàn)案例為,比如A是開(kāi)發(fā),B是測(cè)試,由于軟件團(tuán)隊(duì)中往往是開(kāi)發(fā)人數(shù)遠(yuǎn)大于測(cè)試人數(shù),于是測(cè)試經(jīng)常來(lái)不及測(cè)試開(kāi)發(fā)完成的功能,這時(shí)候如果置之不理,則導(dǎo)致大量開(kāi)發(fā)完畢的功能無(wú)法對(duì)外發(fā)布;如果放任未測(cè)試過(guò)的功能對(duì)外發(fā)布,就是降低了質(zhì)量目標(biāo),將來(lái)會(huì)付出更大的代價(jià)。所以,這時(shí)候合理的做法就是讓開(kāi)發(fā)介入測(cè)試工作,以消除不平衡,而不能放任開(kāi)發(fā)對(duì)測(cè)試不管不顧,又去忙著領(lǐng)新需求。三者,在制品庫(kù)存多,還意味著存在質(zhì)量風(fēng)險(xiǎn),因?yàn)樘鄮?kù)存存在,當(dāng)后面工位工人發(fā)現(xiàn)問(wèn)題時(shí),很難判斷是什么原因?qū)е逻@個(gè)問(wèn)題。這就好比開(kāi)發(fā)一個(gè)功能馬上測(cè)試一個(gè)功能(或者CI系統(tǒng)在開(kāi)發(fā)人員小步提交代碼后立即觸發(fā)檢查),這時(shí)候發(fā)現(xiàn)的問(wèn)題就很好定位,因?yàn)榇嬖趩?wèn)題風(fēng)險(xiǎn)的代碼量很少,定位原因也快。如果等到開(kāi)發(fā)都做了十幾個(gè)功能后再進(jìn)行測(cè)試(或者CI兩次檢查間已經(jīng)有成百上千行代碼提交—對(duì)應(yīng)CI運(yùn)行速度太低或者開(kāi)發(fā)不習(xí)慣原子提交,而是累積大量代碼后再一次提交),問(wèn)題的定位和原因檢查代價(jià)就大多了。
目標(biāo)方向制定后,就要考慮具體的細(xì)化,后面,父親將從節(jié)拍時(shí)間入手引導(dǎo)菲爾的工廠進(jìn)行深入改善探索,這些將在下一篇讀書筆記中繼續(xù)探討。
大家可能會(huì)問(wèn),成本為什么不是目標(biāo)?父親的回答是,在憂慮成本之前,應(yīng)先找到賺錢的方式。首先需要控制交貨期(因?yàn)榭蛻魸M意永遠(yuǎn)是第一位要求),在保證交貨的前提下再開(kāi)始減少庫(kù)存。在庫(kù)存能控制時(shí)才開(kāi)始處理成本問(wèn)題。處理成本時(shí)一定要搞清楚哪些成本可以節(jié)約,哪些不能碰。畢竟我們要做的是節(jié)約成本,而不是削減成本。這一點(diǎn)在制約法理論(TOC)經(jīng)典的《目標(biāo)》一書中也有過(guò)類似提法,在成本的世界和有效產(chǎn)出的世界中,改善所追求的應(yīng)該是有效產(chǎn)出上升,而不是單純的降低成本。這個(gè)話題說(shuō)來(lái)話長(zhǎng),這里就不繼續(xù)分析了。