程序員,困在敏捷里
一次次猝死事件新聞報(bào)導(dǎo)背后,是程序員已成為高危職業(yè)的討論。
一個(gè)在數(shù)字化轉(zhuǎn)型領(lǐng)域制造了巨大價(jià)值的行業(yè),為什么同時(shí)也是一個(gè)社會(huì)問題的制造者?為了找到這個(gè)問題的答案,程序員朱家瓦進(jìn)行了多年的臥底觀察,通過頻繁跳槽輾轉(zhuǎn)數(shù)個(gè)進(jìn)行數(shù)字化轉(zhuǎn)型的企業(yè),全身心投入到包括初創(chuàng)公司、家族企業(yè)、科技巨頭、國(guó)內(nèi)大廠、知名外企等等的技術(shù)團(tuán)隊(duì)的日常工作中,答案漸漸浮現(xiàn)。
是的,文章明顯模仿了《外賣騎手,困在系統(tǒng)里》,這真是一個(gè)諷刺,因?yàn)槲以?jīng)說過:《我,不想做外賣員》,因?yàn)樽鐾赓u員很危險(xiǎn)。而諷刺在于,程序員本就是一個(gè)高危職業(yè)。
文章不長(zhǎng),我試圖通過對(duì)程序員朱家瓦同學(xué)所經(jīng)歷的不同團(tuán)隊(duì)實(shí)施的同一個(gè)敏捷流程進(jìn)行簡(jiǎn)要解讀,讓更多程序員一起思考一個(gè)問題:數(shù)字化轉(zhuǎn)型時(shí)代,敏捷究竟應(yīng)該是一個(gè)怎樣的存在?
變化
又有需求發(fā)生變更了,又有兩小時(shí)的時(shí)間搭進(jìn)了拉通會(huì)里。
程序員朱家瓦清晰地記得,十幾年前,敏捷開發(fā)還不太流行,但也會(huì)存在加班的情況,一般是在項(xiàng)目上線前一周。而據(jù)統(tǒng)計(jì),到了 2018 年,90% 的軟件開發(fā)都采用了敏捷,他所呆過的不同技術(shù)團(tuán)隊(duì),也無(wú)一例外全部采用了敏捷開發(fā),崇尚擁抱變化,持續(xù)發(fā)布(也就是項(xiàng)目持續(xù)上線),于是加班變得頻繁了。從前,項(xiàng)目發(fā)布的間隔期以月計(jì)甚至以年為單位,但從采用敏捷流程開始,就變成以周、甚至天為單位。
由于敏捷崇尚擁抱變化,因此開發(fā)團(tuán)隊(duì)不能再對(duì)需求變更持抵制態(tài)度。而且敏捷強(qiáng)調(diào)承諾精神,迭代開始承諾要做完的故事卡,就一定要做完。由于迭代期間產(chǎn)生的變化因素,以及敏捷所鼓勵(lì)的頻繁溝通,導(dǎo)致程序員往往一直在開會(huì)、討論,只有在下班后才有時(shí)間寫代碼。
一個(gè)迭代中,一個(gè)程序員并不只一次地臨時(shí)要被拉進(jìn)變更拉通會(huì)里。
敏捷流程有能力有動(dòng)力接連不斷地吞掉寫代碼的時(shí)間,對(duì)于某些人來說,這是值得稱頌的進(jìn)步,是響應(yīng)市場(chǎng)變化的體現(xiàn) —— 鼓勵(lì)在開發(fā)的任何階段產(chǎn)生變化,敏捷流程減少了成本、降低了風(fēng)險(xiǎn)。Kent Beck 等人在敏捷宣言里表示:響應(yīng)變化高于遵循計(jì)劃。他們說,這是更好的軟件開發(fā)方法。
而對(duì)于實(shí)踐軟件開發(fā)方法論進(jìn)步的程序員而言,這卻可能是瘋狂且要命的。
在敏捷流程里,故事點(diǎn)是最重要的指標(biāo),而延期是不被允許的,一旦發(fā)生,便意味著回顧、業(yè)務(wù)部門的不尊重,甚至被淘汰。有程序員抱怨自己和外賣員很像,雖然知道交通規(guī)則,但是不得不被逼著去違反。自己在寫代碼時(shí),做得最多的就是放棄最佳實(shí)踐,不斷妥協(xié)。
程序員們很難去對(duì)抗最終被分配的故事點(diǎn),估點(diǎn)時(shí)如果出了比較大的數(shù)字,就需要解釋。一旦解釋,就會(huì)有人來“幫”你,最終大家就妥協(xié)了一個(gè)較小的數(shù)字。一位程序員告訴朱家瓦,他呆過好幾個(gè)團(tuán)隊(duì),不同的團(tuán)隊(duì)有不同的估點(diǎn)方法,點(diǎn)數(shù)也有不同的含義。但是最多的都是一點(diǎn)代表一天。雖然一個(gè)故事點(diǎn)的需求卡不算很復(fù)雜,但是完成的定義(Definition of Done)內(nèi)涵特別豐富。因此要在一天完成的前提是沒有打擾,屁股不能從工位上挪開一次。
不寫測(cè)試、重復(fù)代碼、完全沒有文檔(項(xiàng)目的 README 都沒有)、代碼復(fù)審流于形式……在優(yōu)秀程序員朱家瓦同學(xué)看來,這些舉動(dòng)無(wú)異于反模式,但卻是程序員們長(zhǎng)期在敏捷流程的控制與規(guī)訓(xùn)之下做出的不得已的代碼實(shí)踐,而這種反模式的直接后果就是 —— 程序員陷入軟件焦油坑的概率急劇上升,從而造成更多加班的惡性循環(huán)。
DevOps

軟件行業(yè)日益清晰地認(rèn)識(shí)到:為了按時(shí)交付軟件產(chǎn)品和服務(wù),開發(fā)和運(yùn)維工作必須緊密合作。敏捷開發(fā)的擁抱變化使得強(qiáng)調(diào)穩(wěn)定的運(yùn)維人員不得不走出舒適區(qū)。DevOps 理念很棒,但是現(xiàn)實(shí)很骨感。脆弱難用的工具鏈,讓程序員不得不深入了解運(yùn)維細(xì)節(jié),使得程序員的日子雪上加霜。
測(cè)試左移
測(cè)試左移,號(hào)稱給程序員賦能,就是說測(cè)試同學(xué)給程序員賦與一種似乎他們本來不會(huì)的能力,讓他們有能力去完成測(cè)試。比如降低測(cè)試門檻、使用測(cè)試工具(自動(dòng)化)、培養(yǎng)測(cè)試意識(shí)。然而現(xiàn)實(shí)就是一種去掉專門的測(cè)試人員的實(shí)踐。朱家瓦同學(xué)呆過的團(tuán)隊(duì)中,測(cè)試人員總是不足,甚至有的團(tuán)隊(duì)完全沒有測(cè)試人員,全部由程序員自己保證質(zhì)量,美名其曰:敏捷測(cè)試之道。
有限游戲
作為現(xiàn)實(shí)中的敏捷體驗(yàn)者,朱家瓦同學(xué)很想對(duì)所有的業(yè)務(wù)方提出一個(gè)建議:可以讓所有的業(yè)務(wù)方和 Scrum Master 們都去當(dāng)一個(gè)月程序員,這樣,他們才會(huì)知道敏捷流程對(duì)程序員的壓迫有多么嚴(yán)重。

敏捷中的程序員們,其實(shí)和外賣騎手一樣,都急著把東西在 Deadline 前成功 Deliver 出去,猛踩油門,闖紅燈,抄近道,但是干擾項(xiàng)很多,天氣、擁擠的人流……
敏捷中的程序員們就像瘋狂的司機(jī),一直在危險(xiǎn)駕駛、疲勞駕駛。這顯然不可持續(xù),只是一個(gè)有限游戲,出事兒是必然的,下場(chǎng)是悲慘的。
造成這種結(jié)果的原因,朱家瓦同學(xué)很困惑,要么是敏捷方法本身不對(duì),要么大家對(duì)敏捷的理解不到位。
但是,朱家瓦同學(xué)只想告誡各位程序員:就算周圍的司機(jī)們開車多么野,作為看到此文并且讀到最后的你,希望你安全駕駛,做個(gè)專業(yè)的程序員,敢于說不,謹(jǐn)慎承諾。就算你在偽敏捷團(tuán)隊(duì)中生存不下去,但是你能避免猝死。只要你能避免猝死,活得長(zhǎng)久,就有可能將程序員的職業(yè)從青春飯變成無(wú)限游戲。
