有道雲筆記蔣煒航:敏捷開發的實戰經驗

2021-02-15 21CTO

網易有道筆記負責人談敏捷開發的實戰經驗:什麼時候適合使用「敏捷開發」呢?我們的經驗是需要兩點:

一、團隊有三名或以上的研發工程師;

二、團隊內有一名合適的Scrum Master。

  作者:蔣煒航,網易有道筆記負責人

  有道雲筆記團隊成立於從2010年,從成立伊始我們就一直積極地在實踐中嘗試Scrum(敏捷開發的一種項目管理方法)的做法。到2012年底,3.0發布時,我們在5個主要平臺(PC、iPhone、Android、iPad、Web)上總共發布了46個版本,累計了近千萬激活用戶。在這個過程中,我們逐漸摸索出一套適合以產品和技術創新為核心的中等規模(數十人)研發團隊的Scrum實踐經驗。

  1、Scrum不是萬能藥,要在時機成熟時推行。

  什麼時候算時機成熟呢?我們的經驗是需要兩點:一、團隊有三名或以上的研發工程師;二、團隊內有一名合適的Scrum Master。

  剛開始的時候,一個開發團隊可能只有一名或者兩名研發工程師。這時候並沒有全面推行Scrum的必要,而可以借鑑Scrum中的一些做法。比如有道雲筆記的Web團隊最初就是這個情況。當Web團隊只有一名研發工程師時,我們就儘可能地尊重他的工作方式。同時為了保證項目進度可控,我們引入了Scrum的sprint機制——以sprint為開發周期,每個sprint進行一次Web產品演示。這不但能夠讓工程師有一個以sprint為期限的壓力,還能夠讓其他同事即時地了解項目的進展,以便做出相應調整。當Web團隊擴充為兩名工程師時,我們又引入了結對編程、持續集成、相互代碼審核等做法。直到Web團隊的規模進一步擴張時,我們才開始考慮全面啟用Scrum。

  當團隊內無法找到合適的Scrum Master時,不要輕易推行敏捷。如果你的團隊是由新人組成,或者即使有資深員工但是他並不了解或認同敏捷開發的話,那麼你需要等待合適的Scrum Master出現。

  合適的Scrum Master需要具備幾個特質:首先,他要認可敏捷開發這種方式;其次,他要熟悉業務,起到教練的作用,能帶領團隊走正確的流程;並且,當團隊遇到問題時,他要有能力和擔當引導團隊做出決定,在團隊成員遇到困難時,他要協助成員解決;最後,他要能識別重要和緊急的事情,而並不是事無巨細的反饋到產品負責人那裡。

  敏捷開發雖然希望團隊自我管理,但是這需要一個過程,開始的時候,一個合適的Scrum Master至關重要。有道雲筆記的Web團隊在成立一年多以後才開始推行Scrum,很大的一個原因是在培養合適的Scrum Master。依據我們的經驗,最勝任Scrum Master的人選是技術主管。我們也曾嘗試過讓產品經理擔任Scrum Master,但是由於產品經理本身往往擔當產品負責人,兼任Scrum Master會影響他在產品機會和產品體驗等方面的投入。

  2、限制Scrum團隊的規模,建立Scrum團隊之間的協作機制。

  隨著業務的發展,團隊會變大。這個時候不拆分團隊的話,效率會變低。

  有道雲筆記移動端團隊就經歷過這樣一個過程。很長一段時間Android和iOS的研發工程師組成一個Scrum團隊,有共同的產品負責人和Scrum Master。但是隨著移動端團隊人數的增長,Scrum會議的效率卻降低了。雖然Scrum會議只有不到半小時,但是當說一個平臺的事情的時候,另一個平臺的工程師會覺得無所事事。發現了這個情況後,我們把移動端團隊按照平臺拆分成了兩個Scrum團隊,以確保Scrum會議上說的是每一名參與者都關心的事情。總的來說,參加Scrum會議的所有人,包括產品、開發和測試,不應該超過9個人。

  按照平臺拆分團隊,限制了Scrum團隊的規模,提高了Scrum的效率。與此同時,多個Scrum團隊之間必須進行有效的協作。

  在初期,我們鼓勵研發工程師通過面對面地商量,快速推進來處理平臺之間協作的需求。但是隨著業務的發展,這樣的協作越來越多,也越來越複雜,這樣面對面的討論往往會疏忽細節需求。比如說,有道雲筆記3.0版本中的待辦事項功能,就需要PC、Web、Android、iPhone以及Server等多個Scrum團隊一起,對這個功能進行產品定義和確定技術方案。這樣複雜的協同需求需要額外的機制來保證。這個機制就是Scrum Master的定期會議。在這個會議上,我們會討論各個Scrum團隊相互依賴的項目,安排好各Scrum團隊的開發順序。對某一件具體的事情,其中的一位Scrum Master會被指定為具體負責人來驅動跨Scrum團隊的協作。同樣,只有當Scrum團隊間的協作任務比較複雜的時候才需要引入這個機制。

  3、產品經理和研發工程師要擁抱Scrum帶來的變化。

  在引入Scrum之前,一般的項目管理方式是版本式(瀑布式)的,產品經理決定下一個版本做什麼,預期發布的時間,然後由產品負責人或者技術負責人來兼做項目經理。這個時候遇到的問題是項目往往會延期,但是產品經理會有一種對項目把控的感覺。

  引入敏捷開發之後,這個事情變了,發布是跟著sprint走的。基於持續交付的原則,一次發布包含一個或者多個sprint的內容,而這些內容是由團隊整體決定的,而不是產品經理個人決定。產品經理只是定義了功能需求的優先級,這些功能需求與代碼重構、開發工具、以及市場運營等的推廣支持等需求一起排期,最後由整個團隊決定一個sprint做哪些東西。

  從表面上看起來,產品經理對產品的把控小了,為此,團隊一位資深產品經理有過質疑。最後,我們還是說服了他接受敏捷。事實上,接受Scrum並不困難。這樣,產品經理可以把重心放在對產品需求的把握上,而不必整天問這個咋樣了那個咋樣了。而且,團隊的開發效率,功能點完成的速度並沒有因此而降低。

  研發工程師同樣要擁抱Scrum,調整自己的工作方式。Scrum不鼓勵過度設計,而採用湧現式設計。這意味著開始往往不會把技術架構做得大而全,而是鼓勵快速出成果。當然這並不是說程序架構能夠設計得很糟糕,而是說不要花太多的精力在未知的事情上,小步快跑。為此,代碼重構是必須的(編者註:在不改變軟體現有功能的基礎上,通過調整程序代碼改善軟體)。我們並不建議整個sprint都去做重構,更建議持續重構,把代碼調整也分解成任務,每個sprint做一些。在一些大版本發布之後,重構任務的比例可以適當高一些。

  4、量化衡量團隊的執行力的指標:完成度、評估準確度、計劃合理度

  當Scrum團隊不大的時候,可以依靠主觀感覺來評估執行力。有道雲筆記團隊在初創的一年內,對sprint的完成情況是沒有量化的評估的。

  Scrum教材對執行力的量化評估用的是故事點和速率。由於團隊成員實際上都是有道雲筆記的用戶,能夠直觀理解產品經理提出的需求。因此我們省去了用戶故事,由產品經理提產品需求,而團隊把需求分解成任務。經過一段時間的探索,我們定義了幾個量化指標,其中最重要的是完成度,我們用這個指標來衡量團隊的執行力:

  完成度=1-計劃內未完成任務的剩餘時間/計劃內任務評估時間

  (完成度的數值在80~90%之間比較好。過高的完成度說明sprint計劃過於保守。)

  有些管理者會懷疑完成度的準確性:第一是,團隊是否會把計劃內任務的評估時間評估得過長,使得完成度看起來高?事實上根據我們的經驗,團隊對計劃內任務的評估往往是偏樂觀的;第二是,計劃內未完成任務的剩餘時間是如何出來的?這個是由團隊在sprint末尾評估出來的,因為這時技術設計多已完成,這個時間是比較準確的。我們也曾嘗試過燃盡圖,發現並不如完成度來得直觀。

  另外,我們還定義了兩個指標來作為輔助參考。一個是評估準確度(計劃內任務評估時間/實際使用時間),一個是計劃合理度(計劃內任務使用時間/計劃外任務使用時間)。這兩個指標的歷史數值可以讓我們更加了解團隊執行的情況。

當Scrum團隊不大的時候,可以依靠主觀感覺來評估執行力。團隊擴大後,詳細的數值評估必不可少。

  5、高效的sprint計劃會的要素:預先梳理需求、合適的任務粒度、隨機認領任務、運營調研任務、任務評估。

  Scrum開發中,最重要的會議是sprint計劃會。但是在這之前,產品經理和研發工程師可以預先梳理一下需求,以保證sprint計劃會可以更加高效和準確。我們嘗試過多種方式來預先梳理需求:發郵件、產品與研發麵對面溝通、開需求梳理會。哪種方式更好,目前還沒有定論。

  Sprint計劃會主要討論幾件事情:將需求分解成任務、評估每個任務的工作量、分配任務。每件事情都有各自的技巧。

  首先,任務分解的粒度應該如何?Scrum開發一般認為任務分解得越細越好,但是在實際操作中我們發現如果分得太細的話是有問題的。比如說,認領任務、記錄每個任務的工時和完成情況,都會帶來時間消耗。我們經過較長時間的實踐,發現0.5至3天一個任務是一個合適的粒度範圍。

  如何評估工作量和分配任務這兩個事情是關聯的,不同的人做同一個任務,往往時間會相差很大。所以這時候有一個艱難的選擇,是讓大家做自己熟悉擅長的事情,還是隨機認領任務以達到團隊人員對所有模塊都很熟悉的狀態。一個短期見效,另一個長期可發展。

  有道雲筆記PC平臺的Scrum團隊經歷了一個從前者轉向後者的過程。在開始很長一段時期裡,Scrum團隊把自己PC客戶端按模塊進行拆分,每個模塊由一位研發工程師負責,工作量的評估也以這個人判斷為準。這個辦法幫助團隊快速開發了PC的第一個版本和後續幾個小版本。但是慢慢的,這種做法的瓶頸就出現了。之前的模塊劃分隨著項目發展變得有些過時,有的模塊出現了瓶頸。在最近的幾個sprint裡,PC平臺的Scrum團隊已經開始隨機認領任務的方式。

  此外,在實際研發工程中,往往會有一些由於團隊沒有相關的經驗而比較不確定的事情。對於這樣的事情,我們會先安排一個調研任務,並且將這個任務儘量安排在sprint的早期,並且憑藉經驗會在計劃會上留出後續實際開發的時間。如果調研任務確定這個事情的複雜度可控,我們會在後續的sprint會議上根據調研成果分解出詳細的任務,另一方面,如果這個事情的複雜度太大,那麼我們會把完不成的內容放到下個sprint。

  任務評估的辦法,或者用紙筆寫下後同時公布或者用估算撲克,兩者本質上沒有區別。當有較大分歧時經過討論後再次評估,次數不宜過多,一般1-2次就好,不超過3次。如果討論不清楚,Scrum Master不妨先定一個時間,讓會議進行下去。後面實際開發過程中會越來越清楚。敏捷開發本來就是漸進的過程。

  6、流水化安排開發環節與測試環節。

  如何安排測試與開發,是從項目一開始我們就反覆思考和嘗試的問題。經過一段時間的實踐,我們目前採用流水化的方式來安排開發環節與測試環節。具體來說,就是在開發sprint結束後再開始測試這個sprint的產出版本;而在開發的sprint內,開發團隊解決上一個sprint的產出版本測試出的bug。雖然這意味著開發團隊要在測試環節還未開始之時(Sprint計劃會上),就要估計並預留出上個sprint產出版本的bug修改時間,但在實際操作中,開發團隊能夠通過歷史數據做出比較準確的估計。因此這種方式的效果是良好的。

  7、版本發布基本按照sprint周期。

  我們通常在一個或者多個sprint之後(在測試環節之後)發布版本。具體選取幾個sprint往往會參考一些市場情況的考慮,比如說將一個做了較多重構的sprint與一個做了較多新功能開發的sprint打包作為一個新版本發布出來。我們基本上不會為某個大版本打亂我們的sprint周期。

  8、Scrum需要配備合適的工程實踐,例如單元測試、代碼審核、持續集成、項目管理工具。

  我們要求研發工程師必須要寫單元測試和相互審核代碼。測試驅動開發和結對編程目前還有許多爭議,我們也不建議貿然嘗試。在實踐中,我們採用了簡化版本,對可以寫單元測試的模塊都要求測試覆蓋,並且通過測試覆蓋率來量化單元測試的力度。此外我們將研發工程師兩兩結對,相互檢查對方的代碼,只有經過檢查的代碼才能最終提交。

  此外,我們對代碼進行了持續集成。每天凌晨持續集成系統會自動下載前一天的代碼,進行編譯和部署。Web端會直接部署到Web測試伺服器,而客戶端(PC、iPhone、iPad、Android)會自動拷貝到一個內部伺服器上。測試人員或者感興趣的人每一天一上班就可以用到最新的版本。

  關於Scrum的任務管理,我們採用過不同的項目管理工具,包括白板、開源軟體等等。總的來說,工具只是簡化了一些統計,Scrum最重要的還是敏捷開發本身的思想。

註:名詞詳細解釋

  敏捷開發:相對於傳統的版本式(瀑布式)開發模式。以往的開發模式中,一次會做一個大版本,在這個版本的開發過程中定義需要開發哪些功能,需要多少資源,需要多長周期,最終一次性交付這樣一個版本。敏捷開發則是將一個很大的版本儘量細分為小的功能、模塊或階段,每次做其中一部分,做完以後立即發布一個小版本給用戶。

  Scrum:敏捷開發的一種項目管理方法,通常表示敏捷開發所承擔的一個階段性任務,做完這個任務就可以發布小版本。在做這個任務的過程中團隊稱作Scrum團隊,負責人是Scrum Master。這種Scrum團隊和以往的團隊相比,要求每一個團隊成員掌握更全面的知識,而不是以往軟體開發不懂測試,軟體測試不懂開發。每個人都需要有獨立解決問題的能力。對Scrum Master來說,需要了解整個Scrum的全貌,並具備整個過程中各個領域的知識,因此通常是技術牛人,而不是項目管理者去做Scrum Master。

  Sprint:表示Scrum中的一個階段,是對Scrum繼續的細分。比如分給某個人開發50行代碼的一個任務,他的第一個sprint可以是閱讀需求文檔,第二個是寫代碼,第三個是debug。好的敏捷開發中每個Sprint的任務量需要有較好的定義,不能太少,也不能讓人做不完,因為每個Sprint的時間是固定的。

原文:http://tech.sina.com.cn/i/csj/2013-01-22/18528003613.shtml關於21CTO

21CTO.com是中國網際網路第一技術人脈與社交平臺。我們為國內最優秀的開發者提供社交、學習等產品,幫助企業快速對接開發者,包括人才招聘,項目研發,顧問諮詢服務。

看微信文章不過癮,請移步到網站,誠摯歡迎您加入社區作者團隊。

網站地址:www.21cto.com

投稿郵箱:info@21cto.com

QQ群: 79309783 (歡迎掃描下列二維碼關注本微信號)

相關焦點

  • 《用leangoo做Scrum敏捷開發》成都站實戰課
    Eric Liao 廖靖斌Leangoo和Scrum中文網創始人兼CEO中國敏捷聯盟副秘書長,中關村智聯聯盟理事CSM,CSP(Scrum聯盟認證Scrum專家)實戰派Scrum和敏捷顧問及教練·      廖先生是中國Scrum和敏捷領域的先行者、實踐者,擅長Scrum敏捷開發、網際網路產品研發, 2006年開始實踐
  • 《ASP.NET Core 與 RESTful API 開發實戰》-- (第10章)-- 讀書筆記
    開發實戰》-- (第9章)-- 讀書筆記(下)《ASP.NET Core 與 RESTful API 開發實戰》-- (第9章)-- 讀書筆記(上)《ASP.NET Core 與 RESTful API 開發實戰》-- (第8章)-- 讀書筆記(尾)《ASP.NET Core 與 RESTful API 開發實戰》-- (第8章)-- 讀書筆記(下
  • 《打造敏捷開發模式》第二章:什麼是Scrum
    什麼是ScrumScrum作為敏捷的落地方法之一,用不斷迭代的框架方法來管理複雜產品的開發
  • 敏捷開發的根本矛盾是什麼?從業十餘年的工程師在思考
    Scrum的本質就是通過各種Scrum工具實現產品開發的扁平化管理,以最大限度的激發工程師的主動性和創造力。有做項目管理的同學提出無法理解上一篇文章裡提到的「儘量不控制」。這裡舉兩個例子也許可以幫到有此類疑惑的同學。
  • 規模化敏捷:SAFe和LeSS同於不同,不要撕逼
    涉及範圍不同:SAFe不僅要解決多團隊之間聯合開發的問題,還從更高的組織層面去思考投資組合和戰略層面的問題,也包括財務如何支持的問題;而LeSS更多還是考慮如何做好多團隊之間聯合開發的問題,並沒有涉及太多戰略層面的問題。
  • 什麼是敏捷以及中小銀行如何打造敏捷組織
    商業銀行數位化轉型的核心就是要以客戶為中心,敏捷組織則是快速響應市場變化和客戶需求的基礎保障。「敏捷」最早起源於軟體開發行業,雖然最初是為了改進軟體開發的方式,但目前「敏捷」已經擴展到技術領域以外的各個領域,影響著不同組織在不確定的環境中運作。 敏捷可以說始於一種全新的 「綠地」 環境。
  • 經驗總結 | Docker 使用筆記
    收錄於話題 #經驗總結-aq)Docker 資源清理docker container prune docker image prune docker network prune docker volume prune       docker system prune       docker system
  • 編程開發 | 171128DUBBO分布式項目實戰 數據交換平臺項目+SpringMVC+maven+dubbo項目+商城系統
    18.mp4│  ├單點登錄19.mp4│  ├單點登錄20.mp4│  ├單點登錄21.mp4│  ├單點登錄22.mp4│  ├單點登錄23.mp4│  ├分布式實戰項目1.mp4│  ├分布式實戰項目10.mp4│  ├分布式實戰項目11.mp4│  ├分布式實戰項目12.mp4│  ├分布式實戰項目13.mp4
  • 麥肯錫系列-敏捷組織的五大標誌
    ,運營,營銷和組織學科的專業知識,整合了深厚的經驗和思想領導力,從麥肯錫的全球經驗中汲取最佳經驗,希望可以為企業轉變為敏捷組織提供幫助。最後,所有部門的受訪者都認為他們的員工應該採用敏捷的工作方式(平均而言,受訪者認為68%的公司員工應該採用敏捷方式,而目前的員工比例為44%)。本文的其餘部分根據我們最近的經驗和研究描述了敏捷組織的五個基本「標誌」。渴望建立敏捷組織的公司可以將這些商標作為其進展的具體標誌。對於每個商標,我們還確定了一套新的「敏捷實踐」 - 我們觀察到組織在實現敏捷性方面所採取的實際行動(圖表2)。
  • 敏捷之上——自組織中的 ICPO 模型
    當然因為"只緣身在此山中"的緣故,多數團隊依靠自身力量是無法達成一個有效轉化的,不過這也就是我這種"敏捷教練"存在的價值和意義了。今天我要分享的是用敏捷思維幫助團隊做的一個小例子,同時也是我自己在"敏捷方法"之上提出的一個簡單模型。之所以拿這個來說,是因為在我之前從沒有人提過這個模型——換句話說這是我首創的,所以感覺更能體現我對于敏捷實踐的深度挖掘能力。
  • 敏捷組織:組織未來運營的法則
    敏捷代表的是對傳統組織架構的一種根本性轉變,它提供了一種完全不同的公司經營方式。麥肯錫對敏捷組織的定義是:能夠以高成效的運營模式,快速靈活地適應環境,抓住機遇、創造價值,並凝聚員工能力的組織。敏捷組織的核心特點是:剛柔相濟——既要有穩定的基礎,也要有動態的能力。一方面,要確保敏捷組織的穩定基礎,包括流程、架構的穩定性以及文化的穩定性。
  • 高效轉型:打造VUCA時代的敏捷型組織
    最重要的關鍵,真正敏捷的組織,必須既穩又快:兼具穩定性(韌性、可靠和有效率)和活動力(快速、靈活、能適應)。如何實踐敏捷模式?VUCA時代,為了不被市場所淘汰,打造「敏捷型組織」已成為企業追求的新標杆。但這種轉型是巨大的變革工程,必須從策略、結構、流程、人員和科技,全面重新設計。一起來看!
  • Jira實戰 | 培訓用戶,快速入門
    建議關於《JIRA策略管理實戰手冊》本文節選自《JIRA策略管理實戰手冊》,為Jira管理員提供配置、清理和維護Jira的模板。敏捷實踐倡導者,Atlassian產品粉絲。2018規模化敏捷峰會組委會成員。中科院工程師、系統集成高級PM、PMP、CSM、CAL、Prince2、SAFe SA 、CMMI ATM。
  • Open source UEFI BIOS開發實戰簡介開發實戰簡介
    固件C字營·版權所有 ---    本文介紹基於開源UDK+FSP方案在Intel 10代酷睿Cometlake-U硬體平臺上實現power on實戰
  • 敏捷組織 2.0 | 掌握組織設計的要素、敏捷組織的特點和效能
    星盟天下基於每年服務的上百個獵頭項目,陪伴20多家行業獨角獸企業,助力企業完成4萬個人選獵取,積累了豐富的行業經驗,梳理出完善的課程體系
  • 乾貨 | Elasticsearch 開發實戰常用命令清單
    開發實戰環節,我推薦使用:kibana Dev-tools。原因如下:本文結合多年實戰經驗和網絡資源,梳理出開發環節最重要的命令清單,希望對你有幫助!有了上面的背景知識,下面的常見開發相關的常用命令清單看起來就相對容易了。2、狀態 & 統計相關命令清單 最有用的 API 調用通常與集群的運行狀況,狀態和統計信息有關,例如:2.1 獲取版本和集群名稱等信息。
  • STM32物聯網實戰項目 - HAL裸機開發38 - TFT屏幕移植GUI(LVGL)
    GUI(LVGL)STM32物聯網實戰項目開發板:老司機開車,請坐穩。<lv_demo_widgets例程>STM32物聯網實戰項目 - HAL裸機開發30 - TFT屏幕填充色彩STM32物聯網實戰項目 - HAL裸機開發37 - TFT屏幕觸摸