l

2020年4月27日 星期一

怎麼當好一個ScrumMaster?

April 27 12:46~14:15


演給你看不好嗎?

接觸過Scrum鄉民應該都會同意,Scrum的三個角色:Product Owner、Development Team與ScrumMaster,其中ScrumMaste是最抽象、虛無飄渺的存在,最不容易了解,也最難扮演好這個角色。

曾經有幾位客戶要求Teddy到他們家去充當短期的ScrumMaster。這是一個很合理的速成方法,如果請有經驗的人來當ScrumMaster,團隊的新手ScrumMaster就有一個「具體的範本」可以參考。日後只要依樣畫葫蘆照著做,應該八九不離十差不到哪裡去。

但就算是在缺少業績的情況下,Teddy從來沒有答應過客戶去當短期的ScrumMaster。Teddy可以當敏捷顧問、敏捷教練、碎碎念講師(看你喜歡哪個稱呼),陪著PO、團隊與ScrumMaster一起成長,但無法擔任團隊的短期ScrumMaster。

為什麼?因為Teddy始終是個外人。ScrumMaster與Product Owner和Development Team之間是一種很緊密的團隊合作關係,唯有長期承諾,讓整個團隊知道「你是在玩真的」,這種關係才會是完整的。外在環境、專案特性、團隊成員等不斷地變化,沒有固定的公式可以遵循,很能靠一個外人「演給你看」就可以了解箇中精隨。

ScrumMaster必須現時現地去體驗各種作用力、各種限制、各種壓力、各種機會,並且不斷地嘗試、調整。只是短時間加入團隊的「外派」ScrumMaster頂多在敏捷形式提供團隊參考,但這種參考非常片面,也很容易讓人誤解。

***

動輒得咎

書上說,ScrumMaster要協助團隊排除阻礙,因此有些ScrumMaster從這一點著手,最後變成團隊有任何問題都找ScrumMaster來處理,團隊變成了媽寶,而ScrumMaster變成了寶媽

書上又說,ScrumMaster採取僕人式領導(Servant-Leadership),從這一點出發,有些ScrumMaster最後成為團隊的僕人,負責幫團隊訂會議室、安排議程、寄發會議通知、撰寫會議記錄、更新Scrum Board,以及催大家準時參加Scrum會議。僕人易做,領導難行。

也有人覺得引導技能很重要,ScrumMaster要引導團隊發現自身的問題,而不是跳下去幫團隊解決問題。再加上Scrum團隊是自組織團隊,應該有能力能夠從失敗中學習,逐漸改善。因此,當團隊成員向ScrumMaster求助時,ScrumMaster總是說:「由團隊決定」,弄到最後讓團隊成員覺得ScrumMaster的存在本身變成了一種阻礙。

***

云何應住?

依據Teddy的理解,ScrumMaster之所以存在,他要解決的問題是:「如何讓Development Team、Product Owner與組織獲得Scrum的好處?」可以從這個角度切入,來思考要怎麼做好ScrumMaster。

金剛經裡面有一段話:

「菩薩於法,應無所住,行於布施,所謂不住色布施,不住聲香味觸法布施。須菩提!菩薩應如是布施,不住於相。何以故?若菩薩不住相布施,其福德不可思量。」

把「菩薩」換成ScrumMaster,就可以知道ScrumMaster要怎麼做。

ScrumMaster依據敏捷精神,無須拘泥一定的形式與方法,只求能夠幫助開發團隊、PO與組織。不需拘泥教練、僕人領導、流程專家、干擾屏蔽、阻礙排除、變革代理。ScrumMaster要專注在協助開發團隊、PO與組織獲得敏捷的好處,不拘泥於特定形式,如此便可產生有利的效果。

有些ScrumMaster很認真,為了做好自己的工作,上了很多課。但回到團隊之後,如果做得好,他變成了一個教練、一個僕人式領導者、一個流程專家、一個保護者、一個石頭搬運者、一個敏捷轉型策略大師。做不好,他成為沒打過棒球的棒球教練、任勞任怨的僕人、技術控、太極高手(推拖工作)、吵架王、嘴砲王。

他已經不是ScrumMaster,他被切割成好幾塊

***

無為而無不為

扯了這麼多,到底ScrumMaster要怎麼做?很簡單,在敏捷精神之下,該做什麼,就做什麼。做了之後有幫助,就持續下去。沒有幫助,思考如何改善,不斷精進。

這個過程很漫長、很痛苦,因為現實世界很危險,你要靜心,忍得住孤獨、寂寞、羞辱。你可能需要一位師父、前輩、長者,與你同在,支持你走完這個過程。

最後,你渡過河,到達敏捷的彼岸,你有能力幫助其他ScrumMaster繼續他們的旅程。

***

友藏內心獨白:是在找聖人逆!

2020年4月20日 星期一

毛書一刀未剪大公開

April 20 11:28~12:45


Teddy在2012與2014年所出版的兩本書《笑談軟體工程:敏捷開發法的逆襲》與《笑談軟體工程:例外處理設計的逆襲》已經絕版一陣子了。上個周末上【Scrum敏捷方法實作班】,有學員知道書已絕版,詢問Teddy是否能提供第一本書的電子檔?Teddy也忘了之前有沒有公開提供過,所以今天就寫一篇文章把這兩本書的電子檔公開。

因為書本最後出版的格式經過悅知出版社編輯過,這個「排版編輯」版權屬於出版社,所以Teddy只能公開當初提供給出版社的原稿。編輯前的原稿與最後出版的內容略有差異,且可能有一些尚未訂正的錯字,請讀者自行除錯。

電子檔下載:

***

友藏內心獨白:紙本的比較香。

2020年4月19日 星期日

塞翁失馬

April 19 20:37~21:28


也是疫情受害者

這兩天(4/18~19)是第32梯次【Scrum敏捷方法實作班】上課日,這梯次課程很早就確定開課,但因為前一陣子境外移入的新冠肺炎案例大增,陸續有學員取消報名,最後上課學員只剩下七位,剛好湊成一組。

原本課程最低開課人數是10人,因為目前處於疫情的特殊狀況,Teddy也沒有取消該梯次。疫情期間人少一點也好,雖然收入變少免不了有點小失望,但加減賺,至少可以付房租。

***

趁亂做實驗?

Scrum課程有一個練習活動,讓學員透過User Story Mapping(使用者故事地圖;USM)作為敏捷需求管理工具。上課前一天(禮拜五)Teddy想:「既然這次只有一組,練習活動是不是可以做一些調整,試看看改用Event Storming Workshop(事件風暴工作坊)來收集需求的效果?」。

想了一天,覺得自己沒有把握在短時間的練習活動中可以讓Event Storming Workshop達到原本USM的效果,於是決定還是先維持原本的練習活動。

昨天上了一天課,因為只有一組,Teddy反而有更多的時間與學員討論(WIP=1),講得話比往常都還要多。今天(禮拜日)早上起床,邊吃早餐邊打開電視聽新聞。突然間,不知怎麼的靈光乍現,有點想通了Event Storming Workshop與USM的差別,以及兩種方法個別合適的應用情境。

雖然在Event Storming發明人Alberto Brandolini的書中提過這個問題,但讀書的當下Teddy並沒有特別深刻的領悟。也許是緣分到了,經過一段時間的醞釀,突然有點感覺了。

***

上了台就不要想賺多少錢

Teddy在吳宗憲的綜藝節目中聽憲哥說過一句話:「上了台就不要想賺多少錢」。言下之意是說,不管此次的收入多少,身為一個藝人上台之後就是要拿出最好的表演。

***

如果不是疫情,最後報名人數只夠湊一組,人數不足是不會開課的。

如果Teddy抱持著:「只有七個人,那就不用特別準備,照以往的方式上課就好。」這兩天也就這麼過去了,也不可能有今天關於USM與Event Storming Workshop的小小突破。

所以說,認真把事情做好,其他事情就交給老天爺吧。

***

友藏內心獨白:活在當下。

2020年3月12日 星期四

英文不好

March 12 22:08~10:50


今天在北科大上軟體架構,有一位同學說他英文不好所以不知道怎麼表達作業中的一個名詞。後來我請這位同學上台畫給大家看,反正Quality Without A Name,名字雖然很重要可以幫助溝通,但名字背後所要表達的Quality更重要。

回家後想起幾年前有一位設計模式入門班的學員跟Teddy聊天時提到他有一個學習上的困擾:「我英文不好,有些patterns的英文名字記不起來,一些英文專有名詞也聽不太懂。」

在科技業走跳,英文程度好當然是大大加分的能力,甚至有不少人專案能力中等,但靠著流利的英文能力在公司(特別是外商公司)很吃得開。

但是,先不要想太遠,拉回現況,這位學員當下在學習設計模式,每一個patterns的英文名字一下子記不起來沒關係,先記中文就好。專有名詞聽不懂或看不懂,現在Google翻譯那麼方便,用軟體幫忙解決就好。真的都查不到,也可以問周邊的同事、朋友或臉書(凡事問臉書XD)。

***

英文能力目前不好,這是事實,但和學習設計模式絕對沒有必然的關係。與其不斷掛念著自己的短處而妨礙自己發展長處的機會,還不如先誠實承認自己的短處,放下它然後認真精進自己的長處。等待自己的長處發光發亮的一刻,建立信心之後,再回頭看看,也許此時原本認為的短處已經不再那麼重要。也有可能此時的自己已非吳下阿蒙,學習力已經增加,依據需要加強必備的英文能力即可。把學習英文當成產品釋出規劃,找到自己所需英文能力的MVP—最小可行性產品。

***

英文能力不能幫助你成長,只有你自己可以。

***

友藏內心獨白:先建立舒適圈再考慮跳出舒適圈。

2020年3月11日 星期三

可是誤一生

March 11 12:36~13:47

▲Ada:我有問題!


可是思維

成立泰迪軟體這些年,教過的學員也有數幾千人次。Teddy很歡迎學員發問,從問題中可以了解學員的困難以及學習狀況,也可以檢驗自己的知識是否足以回答問題,並刺激自己思考的角度。

但有一種學員的反應讓Teddy很無言,Teddy稱之為可是學員,他們總是在聽了你的建議之後,經常使用可是作為拒絕改變的藉口。

***

可是學員:我們軟體的bug很多,有沒有什麼做法可以改善這個問題?

Teddy:你們有寫單元測試嗎?

可是學員:沒有。

Teddy:是不是可以考慮先從寫單元測試開始,至少可以確定基本軟體元件的正確性。

可是學員:可是我們工程師都沒時間啊,程式就寫不完了不可能要求他們寫單元測試。而且他們也不知道怎麼寫,專案時程那麼趕也沒時間讓他們學。要讓他們寫單元測試這不可能啦。

Teddy:Code review呢?

可是學員:可是我們工程師程度都不好,沒有能力review別人的程式。

Teddy:難道都沒有資深工程師嗎?

可是學員:是有幾位資深工程師,可是他們覺得code review很浪費時間,沒人想做。

Teddy:是不是可以跟團隊成員溝通,透過code review可以協助資淺人員能力成長,改善產品品質,提升整個團隊的能力?

可是學員:可是公司也不想浪費資深人員的時間,畢竟他們的薪水比較高。公司希望他們專心開發核心程式,而不是花時間去幫其他人做code review。

Teddy內心獨白: (我的棍子放在哪裡!)

Teddy:有試過Pair Programming嗎?

可是學員:我在社群活動中有聽過Pair Programming介紹,可是公司一定不會同意。專案那麼趕怎麼可能讓兩個人一起寫程式,這不可能,打死都不可能。

Teddy:那……找QA或工讀生,用人工測試呢?

可是學員:可是公司根本沒有QA部門,也不可能撥預算找工讀生來測試。

Teddy:那還有一招,外包給客戶,請客戶幫你們測了

可是學員:我們現在就是這樣啊。

***

挑戰現況

凡事把可是兩字掛在嘴邊,很可能是一種不思改變只想找藉口拒絕改變的反射性動作。如果只是朋友之間互相訴苦,並不是真的想解決問題,那倒也無妨。但若是工作上遇到問題也抱持著這種心態,就無法突破現況並有所改善。

軟體工程,特別是敏捷實務做法,並不是什麼艱深理論,都是經過多年、多人、多團隊、多公司的實務經驗。也許這些經驗與你自己目前狀況不符,但也不要立刻否定,先把它當成一種假設,然後思考要做出何種改變、要如何努力,才有可能讓假設成真。

學員:我們軟體的bug很多,有沒有什麼做法可以改善這個問題?

Teddy:你們有寫單元測試嗎?

學員:沒有。

Teddy:是不是可以考慮先從寫單元測試開始,至少可以確定基本軟體元件的正確性。

學員:我們工程師都忙到沒時間,程式寫不完了要如何讓他們願意寫單元測試?

Teddy:你們應該是把寫production code和test code 看作是兩件事,而工作上只有要求完成production code即可,才會有這種「程式都寫不完了哪有時間寫測試」的想法。

學員:對啊,不都是這樣嗎?

Teddy:我認為單元測試是開發不可分割的一部分,所以做完的定義不是只有production code寫好就可以,應該也要包含足夠的單元測試。這在敏捷開發(Scrum)裡面叫做DoD—Definition of Done。藉由調整DoD(逐步增強),可以改善團隊的產品品質。

學員:聽起來滿有趣的,但我們團隊目前都沒有這樣的觀念,還是停留在犧牲品質以便趕上進度的狀況。短期間或許可以交差,但是對公司來說中長期發展會受到傷害。像最近客戶對於品質不良的抱怨聲音就很大,而且團隊成員工作也沒有成就感,流動率很高。

Teddy:解決方法不一定只有或只是單元測試,還有很多種解決方案,依據你們專案的情境(Context)可以選擇不同的方式。

學員:我回去跟我老闆討論一下,看看有沒有可能找一個新的小專案來試看看,做出一些改變。

***

想解決問題但卻不想做出任何改變,只想從別人口中聽到「你好辛苦」、「你好委屈」、「你好棒棒」、「公司好爛」、「同事好混」這類的話,那還是不要開口問Teddy問題好了。

***

友藏內心獨白:這樣不就不溫柔了XD。

2020年3月10日 星期二

相依不相依

March 10 15:18~16:31

▲圖1:Customer/Supplier(客戶與供應商)關係圖


上下游相依性

相依性,或稱為依賴耦合,無論是在做人做事,或是在軟體開發上,都是一種讓人又愛又恨的特性。

父母對妳的男朋友不滿意,嫌他太窮、薪水太低,因此反對妳的婚事。妳不敢違背父母,也不想分手,因此一直處在進退兩難之間,終生大事的時程(schedule)因此被延誤了。身為專案經理的妳,卻是一點辦法都沒有。

你的部門需要客服部門提供API讓你們查詢並分析客訴情況與進貨廠商之間的關係,但是客服部門覺得這不是他們的工作,而且他們太忙根本沒有時間可以幫你們開發這個API。這件工作一直卡住,從老闆的眼中看來,工作交派給你的部門但卻一直沒有完成,你的部門因此黑掉,黑到發亮。

以上例子如圖1所示,女兒和父母之間的關係,你的部門和客服部門之間的關係,稱為Customer/Supplier(客戶與供應商),父母、客服部門是供應商,是價值鏈的上游(upstream),女兒、你的部門是客戶,是價值鏈的游(downstream)

***

解決方案

當兩個個體或組織屬於Customer/Supplier關係,而Supplier佔有絕對主導權或是完全不想鳥你的時候,身處於下游的Customer做起事來就會很辛苦。為了獲得父母的支援,妳可能選擇遵從他們的想法(Conformist):「好吧,既然父母不喜歡這個男朋友,我就再找一個合他們意的對象」,不然就擺爛裝傻雙方僵在哪邊。

除了完全服從之外,你還可以選擇切斷對上游的依賴。反正結婚後不想拿家裡的好處,就走自己的路(Separate Way)吧。

但如果你父母是好野人,完全切斷來自他們的幫助有時並不是明智之舉,因為妳可能會損失少奮鬥10年的機會。但妳又不想委屈自己放棄目前交往的對象,此時可以考慮找一個中間人,吸收父母之間對於妳男朋友不滿的負能量,在婚後一方面應付父母,另一方面保持自己家庭和樂。這個防止毀壞層Anticorruption Layer)可以由妳自己當任,或是找父母信任的第三人,例如家族中的開明長輩或自己的哥哥、姊姊。

以上三種解法:Conformist、Separate Way、Anticorruption Layer,就是在《Domain-Driven Design》書中提到的三種不同的Bounded Context之間的關係。

除了上述這三種關係,還有第四種選擇可以避免下游被上游綁架,就是套用Dependency Inverse Principle相依反轉原則),如圖2所示。


▲圖2:套用相依反轉原則改變上下游的相依性


你不用無止境地等待客服部門提供API,反之,幫你所需要使用的服務定義一個介面,然後便可以依據此介面開始開發程式。等程式寫好,你便可以跟老闆回報進度。

你:報告老闆,您要的功能我們開發好了。

老闆:我看看……嗯,沒錯,這就是我要的功能。什麼時候可以上線使用?

你:我們的部分已經沒問題了,但是客服部門還沒有完成他們的開放資料API,實際上線時間要問客服部門。

老闆:客服部門的人在嗎?!

透過相依反轉原則,你成功把球丟給客服部門,進度就不是卡在你們這邊了。

***

友藏內心獨白:等來等去等成仇。

2020年2月26日 星期三

【還少一本書】Clean Agile

Feb. 26 15:00~16:54


Clean Agile

Clean Agile: Back to Basics》是Robert C. Martin(Uncle Bob)最新著作,這本書算是他老人家對於敏捷開發的歷史回顧,以及他對於敏捷開發應該長成什麼樣子的個人意見

***

第1章

第1章Introduction to Agile談到談到敏捷的歷史,從1880年代的Scientific Management(科學管理)演變到Waterfall,再到1980年代末期~1990年代早期的敏捷改革時期,Uncle Bob提到當時多個輕量級軟體開發方法的興起,到2001年17位輕量級流程愛好者在美國猶他州雪鳥滑雪聖地的聚會,誕生了敏捷方法與敏捷宣言

第1章最後提到Ron Jeffries所畫的The Circle of Life這張圖,它表達了XP的12個實務做法,《Clean Agile: Back to Basics》這本書的核心基本上是圍繞著The Circle of Life,由外而內分成三章解釋這張圖。

讀完《Clean Agile: Back to Basics》之後,Teddy覺得Uncle Bob所謂的Clean Agile底子裡其實就是XP,這很可能是因為Uncle Bob一開始接觸的敏捷方法就是XP,而且他是個TDD堅定信仰者的關係。

▲The Circle of Life,節錄自《Clean Agile: Back to Basics

***

第2章

第2章The Reason for Agile,對Uncle Bob來說,理由很簡單:「讓自己以及軟體開發這個行業變得更專業」。如果你夠專業,你就有勇氣可以拒絕長官不合理的要求,你敢說No。你軟體會變軟,你會持續改善與學習,且無懼改變。你的軟體品質會很好,QA應該找不到任何bug。客戶與開發人員各遵其職,相互合作。基本上算是一種軟體開發的大同世界XD。

***

第3~5章

接下來的三章分別介紹The Circle of Life的三個圈圈:

  • 第3章Business Practices:介紹Planning Game、Small Releases、Acceptance Tests、Whole Team這幾個實務做法。本章一開始簡短的介紹Story和Story Point,以及軟體估算的幾種方法。然後提到Velocity、小規模釋出、驗收測試以及敏捷團隊的組成。接觸過XP或Scrum的朋友讀起來應該沒什麼困難。
  • 第4章Team Practices:這一章提到Metaphor、Continuous Integration、Collective Ownership、Sustainable Pace,除了Metaphor以外其餘三個實務做法都很容易理解。Metaphor在XP剛提出的時候其實很抽象,不好解釋。但後來有了Domain-Driven  Design(領域驅動設計;DDD)之後,Metaphor就有了一個完美的解釋方式,就是DDD裡面的Ubiquitous Language(通用語言)。
  • 第5章Technical Practices:這一章提到Simple Design、Pairing、Test Driven Development、Refactoring,算是軟體開發人員比較熟悉的內容。

***

第6章

第6章Becoming Agile,這一章原本是最吸引Teddy的章節。如何變得敏捷?Uncle Bob又回頭偷Kent Beck的四個XP價值觀:

  • Courage
  • Communication
  • Feedback
  • Simplicity

這章還有三點Teddy覺得很有趣的部份

  • Transformation:敏捷轉型是這幾年很熱門的話題,作者認為˙(大型)組織的敏捷轉型很多都是失敗收場,因為「中間管理層」所存在的目的與敏捷精神相違背,因此他建議「產生新的組織來實施敏捷而非將現有組織轉型」。
  • Coaching:近幾年敏捷圈很流行的Coaching(敏捷教練),Uncle Bob的看法異於常人,他覺得敏捷團隊不需要,或是只有偶爾需要聘請教練。
  • Agile in the Large:Uncle Bob認為敏捷就是為了解決中小型軟體開發團隊所誕生出來的方法,所以根本沒有所謂「大規模敏捷」的問題。因為大規模團隊合作的問題在5000年前已經被解決了。

***

第7章

第7章Craftsmanship,本章不是由Uncle Bob執筆,而是「外包」給寫了《The Software Craftsman: Professionalism, Pragmatism, Pride》的作者Sandro Mancuso,寫得出乎Teddy意料之外的好。

Software Craftsmanship Manifesto(軟體工藝宣言)在2009年提出,Teddy之前一直覺得既然已經有敏捷宣言了,為什麼要畫蛇添足?是要另立山頭佔領地盤嗎?

廣義來看它可視為一種對於敏捷宣言的補充說明,身為一位軟體工程師,Software Craftsmanship Manifesto 的內容原本就是自己一直以來所重視與實踐的方向,落實敏捷不就是這樣嗎?!

還真的不是,敏捷經過這麼多年的演化,即使只將敏捷限定在軟體開發組織中,很多時候還是偏向A Name Without Quality,變成一種口號與行銷工具。所以這章重回敏捷軟體開發的初心,軟體工藝,也算是呼應了Uncle Bob在第二章所提到的專業

***

結論

這本書提到很多敏捷這個詞被提出前後的歷史故事,以及重新詮釋XP的12的實務做法與4個價值。雖然書中對於Clean Agile的看法可能與現今主流趨勢相差甚遠,但這應該是作者有意為之的結果。從正面來看,可以讚賞作者不忘初心,方得始終。從負面來可,可以批評他食古不化,沒有與時俱進。

看完《Clean Agile: Back to Basics》,Teddy立馬買了《The Software Craftsman: Professionalism, Pragmatism, Pride》,且興起把當年沒看懂的XP系列書籍拿出來再看一次的衝動。

▲年輕時購買的XP系列叢書,現在回頭讀應該比較看得懂吧XD。

***

友藏內心獨白:是初心不是粗心。