劉華:事實證明,假敏捷都比瀑布優秀

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"“"},{"type":"text","text":" 兩個項目的直接對比,充分說明即使是假敏捷都比瀑布優秀。"},{"type":"text","marks":[{"type":"strong"}],"text":"”"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ec/ec0f7b292d22ddbd2e285bd581f03744.jpeg","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"01 假敏捷的“獵狗”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“獵狗”項目始於2019年初,當時公司簽了一個大客戶,並十分激進地計劃在2019年10月份上線。據說,公司和客戶籤的協議還蠻嚴苛的,延期交付是要被客戶被罰款的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個項目的複雜度很高,其業務模式和在我們系統上運行的現有業務也不一樣。交付風險非常高。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了儘快啓動開發,項目組臨時招聘了大量熟悉該業務的業務人員和開發人員,他們對新業務很熟悉,但對我們的系統和內部業務流程則一無所知。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"項目組也決定完全採用敏捷開發的方式進行管理。每五個星期爲一個迭代。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"之所以迭代週期那麼長,是因爲核心系統是由第三方開發的,又是一個複雜的單體系統,還要顧及現有業務,開發難度大、風險高。原計劃每個迭代預留兩週做開發,兩週做業務驗收測試,一週做迴歸測試。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"公司高層對這個項目非常重視,因爲這是我們最重要的客戶之一。而且,公司一直在推動敏捷轉型,也想把這個項目做成敏捷開發的“模範家庭”,證明如此複雜、依賴第三方開發的項目也可以實現敏捷開發,其他更簡單的項目就別再唧唧哇哇地找藉口不轉型了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"初心是好的,但現實很殘酷。這個項目很快陷入了泥潭。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"前面提到,由於在項目組中,不管是參與的業務人員還是開發人員,都是新聘的,他們對我們的環境完全不熟悉,需求難以落地,缺乏全局視角,很多坑沒有預見。此時不得不臨時抽調我們團隊的“老司機”去救火,但由於大部分人都在忙其他項目,早期能抽調的人手很有限。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於每個迭代只有兩週的開發時間,第三方覺得時間太緊,並以此爲由,只開發、不測試,代碼交付給我們時其實是“裸奔”的。而且很多時候實際開發時間要三到四周,壓縮了迭代內的測試時間。質量問題嚴重。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於每個迭代時間都很緊,項目組寄望能通過自動化測試加速測試進程。但是由於第三方開發的系統對我們來說就是個黑盒子,我們沒有代碼,只能進行通過UI做黑盒測試。自動化測試難度大,一直沒有很好的思路,自動化測試框架的開發停滯不前。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這就導致每個迭代開發的東西都沒有進行充分的測試。而且由於整個項目涉及到多個系統,各系統的開發進度也很難同步,集成測試無法在迭代中完成,只能在項目後期進行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以,這其實是一個"},{"type":"text","marks":[{"type":"strong"}],"text":"假敏捷"},{"type":"text","text":"的過程,"},{"type":"text","marks":[{"type":"strong"}],"text":"每個迭代只是不斷輸出不能上線的半成品"},{"type":"text","text":",集成測試集中在後期,也就是"},{"type":"text","marks":[{"type":"strong"}],"text":"把風險累積在上線前"},{"type":"text","text":"。項目也因此不得不延期了幾次。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/5e/5e6bc069f94c9204a1d2f12fc4a79b58.webp","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7b/7bf0f12d7a3c73dbdefba3a333bdc5a5.jpeg","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於大部分的項目組成員不熟悉我們的環境,不斷踩坑,經常把問題上報到項目組高層來解決。項目組高層也經常要四處拉人救火。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,這個項目磕磕碰碰,延期了兩次後,在2020年6月份上線,上線後雖然有一些問題,總體上還算是順利上線。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"02 瀑布的“熱帶雨林”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“熱帶雨林”項目啓動於2017年。和“獵狗”相似,也是爲了一個大型客戶,也和客戶簽署了類似的懲罰協議。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正因爲這是一個對客戶有承諾的項目,當時項目組高層認爲計劃與承諾非常重要,所以,項目整體上是採用瀑布形式來管理的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於這個原因,做詳細的計劃和不斷地重新做計劃貫穿着項目的整個過程。我有一段時間直接參與該項目某個模塊的交付,就被這個計劃過程整得死去活來。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"瀑布計劃通常需要根據當時已知的需求和資源做長期的詳細計劃,更要命的是,我需要對這份計劃"},{"type":"text","marks":[{"type":"strong"}],"text":"畫押"},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當時幾十頁的需求文檔還沒有消化完,連需求是否完整還不能確定,系統的詳細分析也沒有做完,有很多的不確定性,要我做一份精準的計劃還要畫押,臣妾實在做不到。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而且當時和PM的另一個爭論是,一方面我們做交付都不夠時間和人手,又要花費大量時間和人力來做計劃,到底是交付重要還是計劃重要。很顯然PM也是要向上交差,他當時關心的真的只有計劃。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不是說計劃不重要,但是長期、全盤的計劃只能用來窺探項目全貌,用作確定預算和資源配置,不能當成承諾,也不能作爲執行的唯一依據。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"幸好我後來離開了這趟渾水,否則我可能真的要約PM去爬六峯山了。後來聽繼續參與該項目的小夥伴說,做計劃這事在項目過程中沒完沒了,耗費了大量時間和人力。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"早期由於有足夠預算,項目組當時就圈了一大羣人,但由於需求都還沒有談,而且因爲是瀑布模式,需求沒有全部確定前,後續的工作也開展不了。因此很多人其實是在空耗着,或者實際在做其他項目的事情。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這種要做幾年的項目,人也很難有急迫感,難免有“瞎忙”的情況。而且項目延期了幾次,造成嚴重的超支。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"起了個大早,趕了個晚集。“熱帶雨林”起步比“獵狗”要早得多,現在“獵狗”已經在2020年6月上線了。而“熱帶雨林”折騰了幾年,目前最新的計劃是在2021年1月份上線,現在正在跟客戶進行聯測。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這一測,要命了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"客戶在這個時候提出了很多新需求。而現在離計劃上線的日子已經不多了。其實我們都知道,這"},{"type":"text","marks":[{"type":"strong"}],"text":"哪是什麼新需求,只能說明原來寫的很多需求都不成立"},{"type":"text","text":"。由於項目是以瀑布形式來管理的,現在纔有機會讓客戶驗證那些需求,醜媳婦見公婆的時間太晚了而已。"},{"type":"text","marks":[{"type":"strong"}],"text":"反饋太慢、太晚恰恰就是瀑布的最大硬傷"},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然“熱帶雨林”的劇情還在發展中,它能否在2021年1月份順利上線還是未知數,現在判斷它的結局爲時尚早,我有被打臉的可能。但目前聯測的情況是真不樂觀,我當然也不介意被打臉,希望它能順順利利。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"03 兩者對比"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從複雜度、性質來說,“獵狗”和“熱帶雨林”是差不多的,雖然“獵狗”也有超支、延期的情況,但總算在一年半時間內順利上了線。“熱帶雨林”在2017年就啓動了,現在是否能按最新計劃順利上線還很懸,孰優孰劣,一目瞭然。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼對比“獵狗”和“熱帶雨林”,“獵狗”“優秀”在哪裏呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"究其原因,有以下幾點值得一提:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"雖然每個迭代只有輸出而不是成果,但這個機制保證了每個迭代進行一次短期計劃和覆盤,也保證了持續的優先級梳理,雖然開發出來的還是半成品,但總歸有實際的進度。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"儘管集成測試不能跟隨每個迭代進行,但項目組還是想方設法把集成測試提前。雖然沒有避免延期,但還是更早地暴露了問題。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"項目高層一直跟項目組成員強調遇到任何問題都可以直接越級上報,高層也做到了及時響應,組織會議四處拉人救火。儘管這個過程很頻繁,令人怨聲載道,但從結果上看,確保了及時滅火。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"反觀“熱帶雨林”,它有以下問題:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"雖然經常做計劃,但這種長期計劃需要對項目的細節有完整的理解,太南了;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"所有的需求只有到最後聯測纔有機會驗證,太晚了;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"項目組高層的風格也不一樣,雖然口頭上也是說有什麼問題都可以越級上報,但如果沒有充分準備就上報,會被罵得很慘,所以有些時候,項目組成員多一事不如少一事,問題沒有得到及時的曝光和解決,壓抑了;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":4,"align":null,"origin":null},"content":[{"type":"text","text":"由於缺乏像敏捷這樣的定期、頻繁的會議機制,缺乏及時的迭代計劃、優先級梳理和覆盤,對項目的實際進度也很難把握,霧裏看花。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"04 總結"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"拋開敏捷、瀑布這些學說,想要項目成功,以下幾個因素很重要:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"短週期迭代、頻繁的定期儀式確保了持續、及時的計劃、進度跟蹤和覆盤,也能營造緊迫感,避免人浮於事;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"想方設法縮短反饋週期和提早反饋;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"營造寬鬆、透明的環境,讓項目組成員遇到阻礙和問題時,樂於及時溝通與上報。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"覺得文章不錯,順手轉發給朋友們吧。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/dc/dc7a0d2b8d25699e76da35299eef0f46.png","alt":null,"title":"分割線 卡通","style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MzI1MjQ3NzE2Mw==&mid=2247484445&idx=1&sn=2448130b92f3f0476cbf15c8e2ba1d3c&chksm=e9e26f99de95e68fd502b7c4df8b59be512bc6a7e6f824f0be204abfe7bb7ca79df71705a722&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"爲什麼軟件交付要快?因爲要有贏的感覺!"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"http://mp.weixin.qq.com/s?__biz=MzI1MjQ3NzE2Mw==&mid=2247484520&idx=1&sn=563ac14a876cf3d13a950a4be7d0ef9e&chksm=e9e26fecde95e6fa1522b7b1603120b24202925a854f8d14c2165d858310b8fccd2139191561&scene=21#wechat_redirect","title":null},"content":[{"type":"text","text":"劉華:上雲還是不上雲,這是一個問題"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"關於作者"}]},{"type":"horizontalrule"},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"劉華(Kenneth)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"敏捷、精益、DevOps專家"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"公衆號“敏於思 捷於行”博主"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"精通極限編程、Scrum、看板方法、測試驅動開發、持續集成、行爲驅動開發、DevOps工具棧"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"曾在GDevOps、DevOpsDays Meetup、中國軟件技術大會、ArchSummit等論壇發表主題演講"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"著有《獵豹行動:硝煙中的敏捷轉型之旅》一書"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/3a/3a33850b87a94cbb886dee479644d37f.webp","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"小說體敏捷/DevOps轉型教科書和實戰經驗分享"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"購書指南"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"紙質書、電子書在"},{"type":"text","marks":[{"type":"strong"}],"text":"京東"},{"type":"text","text":"、"},{"type":"text","marks":[{"type":"strong"}],"text":"噹噹"},{"type":"text","text":"、"},{"type":"text","marks":[{"type":"strong"}],"text":"亞馬遜、微信讀書"},{"type":"text","text":"等渠道已全面上架,搜索關鍵字“"},{"type":"text","marks":[{"type":"strong"}],"text":"獵豹 敏捷"},{"type":"text","text":"”即可找到。點擊"},{"type":"text","marks":[{"type":"strong"}],"text":"閱讀原文"},{"type":"text","text":"可直接購書。有聲書已登錄"},{"type":"text","marks":[{"type":"strong"}],"text":"喜馬拉雅、微信讀書"},{"type":"text","text":",適合路上聽書的你。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章