從 Clean Architecture 我們學到要把程式架構畫出來,把核心邏輯與其它細節分開來, 避免核心被汙染,達到最終目標:「最小化軟體生命周期的總成本+最大化程式設計師的生產力」。書本裡面給了一個四層的架構圖:Enterprise Business Rules, Application Business Rules, Interface Adapters, Frameworks & Drivers。簡單說前面兩個就是策略、業務規則、核心價值,後面兩個則是細節、資料庫、框架、通訊協定…等等。在這樣的分層規劃下,我們得以確認依賴關係是由外向內的。如果有需要,我們會利用依賴反轉(Dependency inversion principle,DIP)來維持核心的整潔,這樣的架構也允許我們延遲細節的決定。
事件風暴
第二堂課, Teddy帶我們體驗事件風暴(Event Storming),事件風暴是一種快速讓群體進入狀況, 跨部門達成共識的方法,不限於軟體,其實可以應用在各種業務領域,協助建構模型。事件風暴的介紹網路上可以查到很多,規則與範例就不在此贅述,因為事件風暴最重要的是溝通的過程,使用文字敘述很難體會,課程後我與YK(同事)為了讓更多同事也能了解這個溝通方法,因此辦了一個小workshop,邀請了三個不同部門的同事,其中包含測試部門、韌體研發、新技術開發部門一起共同討論「韌體自動化測試工具」這個主題。
共通語言
首先,大家想的真的都不一樣。我們先把12個人分成四個小組,讓大家各自列出這個系統中應該存在的Entity再來互通有無一下,結果發現:有一些東西大家都有共識(每一組都有塞一個專家),一定會有test case,也一定會有report,有一些東西則是我有你沒有,你有我沒有。但是即使是一樣的東西,各自表述之後就會發現,你的report跟我的report可能又不一樣,A組的包山包海,測試結果/細節步驟/結果統計圖,B組的只有成功與失敗,另外還有一個叫做debug log的會包含細節,沒有一個絕對的答案, 重要的是我們要找到共同的語言(ubiquitous language)。共通語言除了釐清彼此的想法以外,還有加速溝通的效果,建立共通語言後,可以提升溝通效率,不論是文件、程式或開會。例如當要做一個跟影像有關的專案的時候,我們可以在早期建模的溝通過程中,發現是不是所有成員都有3A的觀念,知道AE, AF, AWB是什麼,避免專案走到後期,才發現彼此有很大的誤解。
可視化流程
除了共通語言以外,事件風暴還提供了一個全面的可視化流程,我們同步大家的共同語言後,把四組合併成兩個組進行事件風暴,我們故意讓大家先用傳統方法從Entities開始發想,再補充上use cases,讓大家先跑一次流程。
事件風暴跟從核心出發不一樣,而是從領域事件開始展開(我們認為有點像是從use cases展開),兩組分別列出我們在乎的領域事件,看到大家不斷的貼上、移動、調整,對整個流程重新順一次,我想這就是事件風暴要的效果,最後產生一個看得到的用戶故事(User stories)。
我感覺event storming有點類似非coding版本的mob programing,用一種方法把群體的思維聚焦在同一個問題上,並且利用交流讓整體意識調整到相同頻率取得共識,共識後的產物是經過大家認可的業務邏輯與範圍,所以真正執行或實作的時候大家是朝同一個目標努力的。
|
在我們團隊快要一年了
一年的時間
寶寶可以長牙
台灣可以賣出 10 億杯飲料
營業額可以突破千億…
營業額可以突破千億…
經濟部統計處: 飲料店營業額在台灣逐年攀升 |
不說飲料
最近回顧了這一年的行事曆
我是有點吃驚的
我是有點吃驚的
OMG!
原來工作的方式,可以這樣影響生活
越工作越有活力
原來工作的方式,可以這樣影響生活
越工作越有活力
如何影響呢?
我先賣個關子,先來看幾個大部分的組織會遇到的現象。
第一個常見現象:開週會
Why are meetings so ineffective?
一個規模不大的四人團隊
一人報告一小時
一場 weekly meeting 就是四個小時
一人報告一小時
一場 weekly meeting 就是四個小時
如果你曾經有在電影院睡著的經驗
應該不難體會四個小時以上的會議有多累
應該不難體會四個小時以上的會議有多累
為什麼 weekly meeting 要開這麼久?
畢竟是一週的進度回報,如果每個人報告一個小時
相當於把他五個工作天,一天八小時的工作量
用 40 倍速的快進,講給你聽
奇怪的是,我們心理從來沒有出現這樣的聲音
“哇! 我聽到了 1/40 的超級濃縮精華/乾貨耶! ”
我們只希望他能再快個 40 倍
這不能怪同事,就像在電影院睡著其實也不能怪導演
這不能怪同事,就像在電影院睡著其實也不能怪導演
沒有哪個導演拍片是為了讓觀眾睡的
比較可能的是 —
那個議題和你沒有共鳴
Great movies tell stories that have deep emotional resonance
|
第二個常見現象:同事間的工作互換困難
Why is collective work difficult?
我們很常因為負責了某個案子,後續的東西都交給你來處理
因為這是短期看來最省時間的做法
因為這是短期看來最省時間的做法
當你在公司一陣子了,你會自然而然地有一個對照表:
“X module 的問題要找同事 A
Y module 的問題找同事 B”
“X module 的問題要找同事 A
Y module 的問題找同事 B”
你應該也對這種情況不陌生 —
同事 B: “A 請假耶,這問題要等他回來才能處理喔! ”
很少同事 B 會說: “A 請假,那你先把東西給我,我可以處理”
同事 B: “A 請假耶,這問題要等他回來才能處理喔! ”
很少同事 B 會說: “A 請假,那你先把東西給我,我可以處理”
但其實,這種工作互換、集體協作的例子,在生活中明明很常見
比如說便利商店的店員,A 忙著做咖啡、B 來幫忙結帳
從沒見過哪個店員跟你說:
“不好意思我不能幫您結帳,負責收銀的今天請假,我只會泡咖啡”
“不好意思我不能幫您結帳,負責收銀的今天請假,我只會泡咖啡”
上述這種情況在組織裡卻很常發生,原因是什麼呢?
可能是訓練文化
不知不覺把 ”人” 訓練成一台 “機器” (咖啡機/收銀機)
不知不覺把 ”人” 訓練成一台 “機器” (咖啡機/收銀機)
因此當我發現這裡的 team member 可以輕鬆的交換手頭上的工作
我是很驚訝的
我是很驚訝的
Machine learning or human learning?
|
第三個常見現象: 加班
Why work overtime?
你有玩過比手畫腳這類的傳話遊戲嗎? 通常結果都是各種歪樓
你可能會說,如果大家都能看到題目就不會有問題
No,還是不行
比如先前 U Think I Do 系列
就把朋友、家人、社會、學校、自己
看到一件事情的不同面向
放在一張圖裡,非常有趣
比如先前 U Think I Do 系列
就把朋友、家人、社會、學校、自己
看到一件事情的不同面向
放在一張圖裡,非常有趣
不同角度的生命科學系
|
撇除那種時程明顯不合理的情況
大多數的加班來自於
每個人對事物的理解不同:
大多數的加班來自於
每個人對事物的理解不同:
以為自己了解對方想要的功能
↓
發現不是對方想要的功能
↓
“盡量” 修改,改不完就加班
↓
發現不是對方想要的功能
↓
“盡量” 修改,改不完就加班
這個 “盡量” 可能妥協了很多事情
如果前面幾次靠著加班,都很幸運的在 deadline 前完工了
如果前面幾次靠著加班,都很幸運的在 deadline 前完工了
再遇到這種情況的時候,就會習慣性的把加班變成解決方法
而忘了去想該修正哪些流程
而忘了去想該修正哪些流程
又下班了?! 我還想工作
|
PM、RD、UX 都用自己的角度去理解、開發功能,在溝通不足、流程不透明的情況下,這個專案就會越來越像一個黑盒子
當老闆問這件事情什麼時候可以做完
是不會有人知道的
是不會有人知道的
高中物理就告訴我們,根據不確定性原理
專案的完成和沒完成,是同時存在的
只有打開黑盒子的一瞬間才會塌縮到一種可能性上
這種 “既完成又沒完成”
把人逼的 “既死又活” 的現象
把人逼的 “既死又活” 的現象
我們稱之為 —
薛丁格的專案
Schrödinger’s Cat 薛丁格的貓
|
本篇文章未完,你可以現在前往 Part2
也可以往下滑留下一些意見
The Year of Being Agile (Part 1)
我們再歸納一下,一般的組織常遇到三個現象:
1. 開冗長的週會
2. 同事間工作互換很困難
3. 加班
2. 同事間工作互換很困難
3. 加班
而我們 team 恰恰相反,有這三個很獨特的地方:
1. 不用開週會
2. 協作容易,你的同事就是你的分身
3. 不用加班
2. 協作容易,你的同事就是你的分身
3. 不用加班
這些特徵好像很難同時並存,你想,不開會怎麼知道同事在做什麼?
同事之間不了解,溝通成本就大
人越多就越複雜,花的時間也多
怎可能不用加班事情還能準時做完?
敏捷開發
Why OverCooked can teach you agile?
來講講 OverCooked 這個遊戲
一開始食物的訂單不多,每個人可以各司其職
專門切肉,專門煮菜,專門洗碗
而隨著訂單暴增和廚房地形改變
如果還是一個人只負責做一件事,時間肯定是不夠用的
一款具備敏捷精神的遊戲
|
Get back in sync
左上角可以看到現在的訂單有哪些
一回合的時間完成越多訂單得分越高
這是一款用嘴巴打仗的遊戲
你準備要拿料還是煮菜
需要什麼幫忙
哪邊需要修正
都要即時說出來
每個玩家都可以看到夥伴的狀況
這種快速 team sync 的方式就是 —
daily scrum meeting / standup meeting
Realtime review
這款遊戲一次最多四位玩家
如果有八個人玩呢?
一般情況就是多出來的四個會在旁邊
觀戰並且嘴砲給建議
等到下一回合再換這一組人拿搖桿
這種 driver & navigator 的方式 —
pair programming / mob programming
The programmer as navigator
|
介紹完遊戲,應該就不難回答我們一開始的問題
How to avoid boring meetings?
這個 team 不是不開會
而是不開沒有效率的會
daily meeting 有一些限制:
最多 15 分鐘,站著開
類似遊戲一回合的計時制
講求快速同步最新狀況
How to develop a cohesive team?
再來講協作:
關心不等於了解
想要了解一件事情
沒有什麼比實際參與還有效的
針對複雜的 task 安排 pair / mob
提倡 collective code ownership
簡單說就是共榮共享
但這樣講可能有點土
所以來看一下維基百科的定義:
合作或協作(英語:Collaboration)是指一種由兩個或兩個以上的個人或團體作為一個共同的目標而交集或在一起共同工作,舉例說明:一個知識分子可以透過合作的關係而去分享知識,再而經過學習和共識達到創作的目標
從上面描述看的出來
合作和凝聚力脫不了關係
那怎樣才能有好的凝聚力呢?
借用本公司的四大核心價值
誠信、 關懷、創新、當責
誠信、 關懷、創新、當責
肯定每個人的付出
讓每個人都看到自己的貢獻 —
一個人走得快一群人走得遠
Why collective intelligence matters?
電影環太平洋裡面
龐大的機器人無法由一人駕駛
需要兩位駕駛員連接彼此的腦神經
共享對方的情感、記憶、經歷
並且認同對方的處境之後
才能同步操控
Pacific Rim: Uprising (2018)
|
好的溝通和協作
就是用心和時間
灌溉的共同記憶
他會形成一個生命體
持續成長
或者說他就是一個生命
你們必須承擔起照顧這個生命的責任
也是這份承擔
讓你們之間的關聯
獨一無二
True collaboration yields better results
|
Iteration based method
Iteration 翻成中文『迭代』
在敏捷方法中是指
把一個大任務切成許多小週期可以完成的的任務
把一個大任務切成許多小週期可以完成的的任務
騰訊創始人馬化騰說:
小步快跑、快速迭代
小步快跑、快速迭代
這是他的產品思路
也成為互聯網創業法則
也成為互聯網創業法則
敏捷開發裡的迭代週期是一個 sprint
sprint 這字有短跑衝刺的意思
很符合迭代的概念
一個 sprint 一般為 2 ~ 4 週
sprint 這字有短跑衝刺的意思
很符合迭代的概念
一個 sprint 一般為 2 ~ 4 週
由團隊討論這個 sprint 能完成的功能
並在 sprint 結束時做個『試營運』
並在 sprint 結束時做個『試營運』
拿到客戶的 feedback
並且快速的衡量修正
並且快速的衡量修正
為了好懂,借個圖舉例
比較了傳統方法與敏捷開發法
如何在三個迭代週期完成蒙娜麗莎
如何在三個迭代週期完成蒙娜麗莎
Jeff Patton did an Iterative Mona Lisa.
|
先來看傳統的開發方法:
在第一階段可以看到蒙娜麗莎的頭
第二階段能看到蒙娜麗莎的左下半身
第三階段是完整的蒙娜麗莎
在第一階段可以看到蒙娜麗莎的頭
第二階段能看到蒙娜麗莎的左下半身
第三階段是完整的蒙娜麗莎
換成用敏捷開發會怎樣呢?
在第一階段是極簡主義派的蒙娜麗莎
第二階段是簡單上色派的蒙娜麗莎
第三階段是佛羅倫薩畫派的蒙娜麗莎
第二階段是簡單上色派的蒙娜麗莎
第三階段是佛羅倫薩畫派的蒙娜麗莎
不論哪個階段都是最小可行產品
很傳神地描述了敏捷的精神 —
很傳神地描述了敏捷的精神 —
接受反饋、迅速擴張
盡快給客戶有價值的產品
盡快給客戶有價值的產品
敏捷帶來的影響
How does agile affect my work and daily life?
所以回到一開始我賣的關子
那個讓我吃驚的行事曆
那個讓我吃驚的行事曆
我發現從以前到現在
晚上時間的利用有了很大的改變
從同事電腦辦公桌變家人散步吹吹風
以前晚下班總要負責關公司的門
有時候關得太順就會不小心鎖到別人
下圖的例外就是我補充的
關門 SOP
|
這一年有了固定的下班時間後
我開始能每天帶著媽媽去運動
我開始能每天帶著媽媽去運動
運動的地方是學校的操場
晚上學校警衛要關門的時候
看著警衛一邊關燈一邊趕人
看著警衛一邊關燈一邊趕人
這種熟悉又親切的感覺 —
等我退休了或許可以來當警衛吧 😝
前是把家當旅館現在是家事盡量管
The Year of Being Agile (Part 2)
在 LeSS 最後一天,聽到別的公司在導入敏捷時,也成立了很多很多的實踐社群 CoP (Community of Practice),其中一個是 心靈成長 CoP,讓我印象非常深刻,這邊來聊聊為什麼 :)
在第五項修練中,彼得聖吉一直在強調"整體":
「遠古的人類並未把自己跟所處的世界加以區分。那時的人類所看見的世界是一個未被打破的整體,人與自然合而為一。但不知自何時起,我們學會了區分自己,
視自己為分離的個體。我們刻意凸顯個人意識,強調獨立的意志、個人需求和個人的願望。這種自我意識的演化愈來愈強,我們也愈來愈與他人以及上帝所創造的萬物區分。
這對人類的演進而言,是福,也是禍。」
「在企業裡,行銷部門與製造部門處於對立狀態;第一線的管理人員對總公司管理當局懷有近乎憎惡的敵意;各部門的競爭更甚於跟同業的競爭。」
ODD-E LESS@上海 後記 PART 4
在 Scrum Team 中很強調 透明(transparency),這次跟大家分享的是 Developer Resource 透明化帶來的好處。
傳統團隊
在傳統的開發方法上,常常都是以”月”、”季”為時間單位,因此常會聽到 PM 說:可不可以再加這個 X 功能、這個 Y 功能,還有那個 Z 也順便加進來好了,這一季完成這些,應該沒問題吧?
身為 developer 能拒絕他嗎?有點難,因為感覺一季的時間應該可以做蠻多事情的,就算你覺得不可以,PM也很容易這樣感覺:一季耶,三個月你竟然沒辦法幫我多做 X+Y+Z?
在 Developer Resource 不透明的的狀況下,還真的很難回答。而不透明的原因,其實是因為週期太長、功能多且不明確,倒不是因為什麼溝通或互信的關係。
敏捷團隊
但在敏捷團隊中,我們在每個 Sprint Planning Meeting 時,便會先算出這個 sprint 有多少資源可以用:6(hours) * 6(developer) * 8(days) = 288 points
接著在 Story 介紹、Story Point 估算、決定 priority 等等活動之後,便開始討論 PO 這次最後決定的 stories:A,B,C,D,E,F,把這 6 個 stories 再細拆分成各個 tasks,例如 Story A 可能會被拆分成下列 tasks:
- QML:這個功能有 UI 介面,需要實作 QML
- C++:實際功能由 C++ 完成
- Unit Test:要對 C++ 實作單元測試
- UAT:要完成自動化驗收測試
- Code Review:這次的 C++ 還蠻難的,雖然有 Unit Test,但還是要進行 Code Review
然後,接下來團隊成員根據每一項 tasks 開始打牌,決定每一項的 tasks 所需的時間。這裡是關鍵,因為要由這過程去弄清楚 PO 真正想要的東西,也讓 PO 了解這個 task 為什麼需要這些時間來開發。
以 C++ 這項 task 來看,如果一開始大家出的點數差異有點大,例如:3,3,3,5,20,3,5,便要請出3及20的成員們分別說明一下他認為是3及20的原因。
張飛(RD):我覺得這個 雙向語音 很簡單,用原本單向語音模組來改就可以了!
關羽(RD):可是他不是全雙工嗎?這樣我們要改很多地方才能做全雙工..
劉備(PO):耶,不用考慮全雙工,我們這個應用基本上只要雙工就可以了!
關羽(RD):原來如此,是我想太多了..
在一番討論後,大家才能真正清楚 PO 想要的東西,而不會多做或少做,或著方向不對。此時再出一次牌,通常就能取得共識了。
在經過撲克牌大賽後,可以得到每個 tasks 需要的時間:QML 5, C++ 20, Unit Test 20, UAT 20, Code Review 8,合計73小時。
剩餘的 Story B ~ Story F 也是照一樣的方式去得到需要的時間,可能是 B:80, C:100, D:64, E:38, F:48,這樣 PO 就很清楚,在這個 sprint 有限的資源內(288),可以去完成那幾個 stories(D應該做不完,E跟F就不要想了...除非運氣很好。
在 PO 很清楚知道資源有限的狀況下,他就必需去做抉擇。如果現在只有 1 個 sprint 的時間,你沒辦法 A~F 全做,你要考慮清楚最重要、對客戶最有價值的到底是那幾個!全做當然最好,但資源攤在你眼前,很清楚的告訴你:不可能!
所以我覺得透明性的帶來的好處,除了明確了解需求外,也可以讓 PO 理解資源有限,他必需非常認真的選擇他要的功能!
註1:我們認為每位 developer 一天當中完全專注在工作上的時間是六小時左右,扣掉上廁所、休息、上網,工作轉換的overhead等)。
註2:一個 sprint 為二週,扣掉第一天的 Planning Meeting 及最後一天的 Review & Retrospective meeting,剩下8天。
註3:估算的過程重點在”溝通”,實際上的時間可能還是會不一樣。
敏捷當中的 透明性 帶來什麼好處?
很多人問我為什麼要在 Hackathon Taiwan 做無償的講師(當然,還要感謝另一位被我拐來的 Jack Yang),我可以從中獲得什麼好處呢?
坦白說,並沒有,就像我在 Qt@Taiwan 中社團簡介寫的一樣:"非營利"。
那我到底幹嘛吃飽這麼閒呢..
我很單純的,希望可以看到台灣有更好的軟體發展環境,有更多熱血青年可以投入這個領域,用軟體(包括firmware,所以軟硬體結合的產品也在我講的範圍內)帶領台灣走向下一個世代、走出國際。
我個人對 Qt 的 source code 研究還算不少,我覺得在 Lars Knoll 的領導下,Qt 真的是一個非常棒的設計,不論是你要拿來開發 Application,或是想從他的架構中得到啟發,我覺得它都是個很好的典範,而且 QML 讓開發效率與執行效能達到一個完美的結合!因此,我很努力的推廣Qt / QML,希望讓更多人可以認識 Qt,並從中學習到東西(當然,網路上還有很多偉大的 project 值得我們去挖寶)。
剛才在高鐵上不斷有人傳訊來問我今天 Qt/QML 的問題、有人告訴我他要用今天教的東西打造出他想要的作品,我覺得,還是很多熱血青年的啊 XD(所以我剛剛在整理 sample project 整理好給他,然後就又熬夜了....)。
如果說真能得到什麼好處,大概就是有機會接觸到一些不錯的小朋友,可以拐進公司跟我一起工作吧 XD
但是我的初衷是一樣的 - 讓有心的熱血青年,可以在一個好的工作環境中成長!
Diro但是我的初衷是一樣的 - 讓有心的熱血青年,可以在一個好的工作環境中成長!
我為什麼要在 Hackathon Taiwan 做無償的講師
很多書都在強調 code review 的重要性。在我們的軟體部門剛開始成立,並沒有 code review。這個狀況持續了幾年,一直到前年,我才開始認真思考,不做 code review 真的對嗎? 於是我們從那個時候開始逐步推動 code review。
在沒有 code review 的時代,有兩件事情讓我印象深刻。第一件事情已經七、八年了,有一個週末,我們因為程式在下一週初要 release,想當然爾,工作是做不完地。所以我決定週末來加班。那時候我自詡應該當規劃者,所以平常是不寫程式碼地。可是真的來不及了,所以我得跳下來自己幹。沒想到那個週末,當我打開 project 的程式碼一看,我快嚇傻了。一個函式長達一千多行,眼睛東瞄西瞄看到的是許許多多重複的程式碼。這個該怎麼改呢? 到最後就是能頭痛醫頭腳痛醫腳,可想而知,那一個週末沒有什麼好下場了。第二件事發生在三年前左右,我們一個產品內的某一個 service,在屢次的進測,總是領到最多的紅牌。最後在產品被追殺的階段,我們發現那一個 service 無法收斂了。這時候我們開始投人進去那一個 service 進行 code review。不看不會怕,看了之後才知道多可怕。那一個 service 竟然高達一萬四千多行。可怕的是,這一萬四千多行在同一個檔案。是地! 一個 service 就一個檔案。最厲害的地方是,這個 service 破了之前的一千多行記錄,有一個函式高達三千多行。最後那一個 service 只能靠硬測的方式讓他自然地收斂。然後在後面安排 refactor。Refactor 後剩下八九千行,當然也拆了不少的檔案。可以看出來原來的作品中重複的程式碼有多嚴重。我們稱這種大函式叫:"吾碼一以貫之",這種一個函式殺到底的寫作方式,對於寫的人來說當然過癮,不用想太多次該怎麼擺變數,想一次就可以用 "很久"。但是對於看的人來說,實在是痛苦至極,看到第三頁的時候,已經不記得這個變數什麼時後宣告、什麼時候改值。諷刺的是一個函式不能太長這件事,在公司的 coding rule 當中是有提到地,為什麼還會看到這樣的事情出現?問題就在於事情沒有人去看,就容易歪掉。
這種事情就是這樣,開始總是最難地。前年開始推 code review 的時候,第一個遇到的難題就是人力的問題。這其實是一個弔詭的問題,本來寫 code 寫得很用力的團隊,突然要 "插" 一件 "本該做的事",卻變成當時團隊多出來的事情。於是我只能動用手上所有的資源幫忙 review。然後因為遇到大家的時間不容易湊在一起,所以也請成員架上 Reviewboard 來協助分散式 code review。然後先是一個團隊持續地看到 review 活動,然後是另一個團隊的重要修改也開始 review。最讓人驚艷的是去今年初,已經有一個團隊將 Pre-commit review 自動化架好了 (用 Git + Gerrit + Jenkins)。只要 commit code,系統會自動驗證可否 build,然後會寄出 review request 給設定好的人。所以現在信箱一天會收到將近十封的 review request (說實在,加上 build 成功的訊息,一天信箱會被灌入 3, 40 封信,很快就會爆了 XD)。這樣的自動化,最有趣的地方在於讓你的 code 沒有被 review 過就不能夠 commit。因此現在對那個團隊而言,已經不是 optional, 而是 must。所以 review 活動就會被持續執行。而現在也會發現,因為 code review 的工作被拉出來,組長的工作裡頭自然會加入此項 task,所以比較不會像剛開始一樣覺得根本排不進去。
那麼到底這樣強推 review 有沒有什麼效果呢? 說句老實話,如果你期待 code review 可以大量減少 bug 數量,是比較不切實際地。但是他對於防範 non-trivial 的 bug,尤其是架構性問題、易維護問題、後續加新功能的 side effect 的防範,是有比較大的效果。另一個重點是,因為強制 code review,你可以在無形中強迫 member 去看到其他人被要求了哪些東西,下次他自己寫的時候就不容易重複同樣的錯誤。另外,自己寫的東西有人在看的時候就會比較小心一點,這些都是無形的效果。
現在開始有團隊在導入 scrum 了,在該團隊中更增加了 peer 的 code review。不再單純是上對下的 review。我覺得這樣做又有更進一步的效果,那就是懂 code 的人更多了,對於未來 task 的相互支援,也會變得比較有可能性了。這是我們在 code review 開始前享受不到地。
所以 code review 重要嗎? 非常重要。你們開始做了嗎?
Code review 真的重要嗎?
討論是很重要的一件事,而且有時侯一圖勝萬言,因此如果有白板可以讓大家討論是很重要的一件事。在我們團隊的辦公室中,我們便規劃了三面白板,其中一面是當做sprint wall & burndown chart,另外二面就是 member 可以自由討論的地方,以目前團隊人數(10)來說是還蠻夠用的。這個sprint有一個功能是3位成員一起合作完成的,因此我們在白板上畫出了架構與流程來溝通討論介面該如何設計,溝通清楚後,大家在座位上一抬頭就可以看到當初討論的結論了,真是個好白板 XD。
此外,我們這間還有一台投影機及一台電視,電視最近加上了chromecast,讓團隊成員要分享畫面更加容易,有時侯要分享或討論的東西在電腦上,只要按個鈕就可以顯示在電視上跟大家討論,還挺方便的(不過FPS不高,要做影片的分享較不適合,可能還是要裝個 Apple TV 比較好)。
敏捷團隊很重視團隊成員的互相討論與分享,但如果環境因素讓成員不易分享與討論,就很難讓大家願意去分享與討論了。
你的工作環境會讓成員願意討論嗎?
給團隊成員易於討論的環境
為什麼人才是最重要的?因為我們需要的是群體智慧!在 敏捷開發 中,強調了群體智慧的重要性。在 點子就要秀出來 一書中,也提到了人類歷史上能夠閉門造車而成功的藝術家,幾乎沒有,大部份的人都是透過交流、互相學習而得到新的創意與作品。
從「從A到A+」到「Google 模式」,從「點子就要秀出來」到 「敏捷開發」,不論時間新舊、領域的差異,大家強調的精神都是一樣的-對的人 + 集體智慧。
你是先決定要做什麼,再找人才,還是先找人才,再由人才幫你決定要做什麼?
你是先決定怎麼作菜再找廚師,還是先請廚師再來決定怎麼作菜?
先找對人,再決定要做什麼
家裡附近有幾家早餐店,其中一家大部份只有老闆娘一個人獨撐大局,另外二家則是有好幾個員工。每家早餐店的客人數量感覺都差不多,不過員工多的反而常常出餐慢、上錯餐點,而一人早餐店卻可以做的非常有條理,速度也不錯。根據我長久以來的觀察,我發現了其中的奧秘...
一人早餐店:老闆娘具備了明星早餐店員工該有的特質:
人海早餐店:這裡的員工通常不具備明星架勢
不過我的心得是,軟體開發跟開早餐店有許多相同之處,軟體開發應該要找明星級人才來,而不是找一堆普通的人才,明星級人才可以一個人獨立完成相當規模的程式(C++ 5,000~100,00行),他不需要花時間在與其它人溝通,但如果你雇了三個普通的人才,他們花在溝通協調的時間(甲:喂,我這個不是thread-safe哦!乙:為什麼呼叫進去會block住這麼久?丙:你的介面很難用耶),可能明星級人才都已經把事情做完了(一個人做,他很清楚怎麼設計最好,別人還在 Multi-Thread 打滾時,他已經想出了一個高效的 Single-Thread 解法)。
你還認為三個臭皮匠勝過一個諸葛亮嗎,我不認為,因為扣除溝通這一點外,還有一句人月神話裡的名言:「在接受相同的訓練、同樣都是兩年資歷的情況下,優秀專業程式設計師的生產力要比差勁的程式設計師好上十倍」。如果要打造一個大型的軟體,你需要的會是幾個諸葛亮,而不是一堆臭皮匠。
後記:
今天早上又去了人海早餐店,點完餐,報紙翻沒幾頁時,店員竟然已經拎著我的早餐給我,對我說:「先生,你的餐好了,一共NT$135」,我眼淚都快流出來了,你們真的進步了,出餐的速度變快了。回到家,我真的流下淚來,我點了蘿蔔糕、漢堡、鐵板麵加一杯豆漿及薏仁漿,但是袋子裡面只有漢堡、鐵板麵跟薏仁漿,也就是有40%的餐點是沒有給我的(不過錢倒是100%都有算到)..............我無言了。只能說加油了....
一人早餐店:老闆娘具備了明星早餐店員工該有的特質:
- 記憶力超強、超級會認人:她可以一邊接電話收預訂早餐的訂單,一邊聽在現場的客人跟她點餐,而且不會搞混。當你點過一次鐵板麵加半熟蛋後,以後你再來點鐵板麵加蛋時,她就會直接跟你確認:「蛋半熟厚?」,點過漢堡不加生洋蔥,以後她就會直接跟你確認:「洋蔥不要厚」。
- 手腳快:是的,他一個人可以顧好四台烤箱、一排烤麵包機、正在煮的義大利麵跟那檯永不停息的鐵板爐,而且每當有一些新訂單進來時,他總能瞬間將生產排程最佳化
- 心算快:要結帳時,他瞄一眼你的桌子,就知道你總共吃了那些,總共多少錢~
人海早餐店:這裡的員工通常不具備明星架勢
- 記憶力普普:你講過一次的東西他可能在覆誦時就漏了,還有打電話來訂結果做錯餐的,當然,這裡的員工也不大會記得你愛吃什麼,什麼要加什麼不加,蛋是全熟還半熟,所以你每次都必需交待一遍(不過更慘的是,現在交待的也不見的記得清楚就是了..)
- 手腳快不起來:每個人速度還好,但是做一個漢堡要三個人做->A對甲說:幫我烤一份漢堡,再對乙說:幫我煎一個豬排,最後再由A統一加工,每當A說:再幫我烤一份漢堡時,甲就開始想到底是剛才要烤的那份還是要再加一份,然後就需要進行「溝通」,每當有新的訂單進來時,也無法將生產排程最佳化,因為每個人都只能看到 local 的東西,沒有辦法綜觀全局。甲還不時要同步一下,問說:「所以現在總共烤二個嗎?」
- 心算普普:當你結帳時,櫃台那位還很有可能要轉頭問另一位店員說:「他的多少錢?」,天啊,這樣不是很像冗員嗎.........而且被問的那位還要看看單子慢慢算,真的是很慢啊 =.="
不過我的心得是,軟體開發跟開早餐店有許多相同之處,軟體開發應該要找明星級人才來,而不是找一堆普通的人才,明星級人才可以一個人獨立完成相當規模的程式(C++ 5,000~100,00行),他不需要花時間在與其它人溝通,但如果你雇了三個普通的人才,他們花在溝通協調的時間(甲:喂,我這個不是thread-safe哦!乙:為什麼呼叫進去會block住這麼久?丙:你的介面很難用耶),可能明星級人才都已經把事情做完了(一個人做,他很清楚怎麼設計最好,別人還在 Multi-Thread 打滾時,他已經想出了一個高效的 Single-Thread 解法)。
你還認為三個臭皮匠勝過一個諸葛亮嗎,我不認為,因為扣除溝通這一點外,還有一句人月神話裡的名言:「在接受相同的訓練、同樣都是兩年資歷的情況下,優秀專業程式設計師的生產力要比差勁的程式設計師好上十倍」。如果要打造一個大型的軟體,你需要的會是幾個諸葛亮,而不是一堆臭皮匠。
後記:
今天早上又去了人海早餐店,點完餐,報紙翻沒幾頁時,店員竟然已經拎著我的早餐給我,對我說:「先生,你的餐好了,一共NT$135」,我眼淚都快流出來了,你們真的進步了,出餐的速度變快了。回到家,我真的流下淚來,我點了蘿蔔糕、漢堡、鐵板麵加一杯豆漿及薏仁漿,但是袋子裡面只有漢堡、鐵板麵跟薏仁漿,也就是有40%的餐點是沒有給我的(不過錢倒是100%都有算到)..............我無言了。只能說加油了....
做早餐 vs 做軟體 - 早餐店老闆也該看人月神話
大教堂和市集(The Cathedral and the Bazaar) 是一篇相當有名的文章,不過之前一直沒有看,直到後來讀了Dreaming in Code 一書後,才把這篇文章仔細讀完。這篇文章是由 Eric Steven Raymond 所寫,內容在描述 Linux 的開發模式(市集)及Raymond 自己仿照這個模式開發 fetchmail 的過程,並探討其為什麼成功,其中列了十幾項格言,有幾項個人還蠻有感覺的,如果你覺得你的團隊現在碰到了一些瓶頸,推薦你可以讀讀這篇文章。
http://www.linux.org.tw/CLDP/OLD/doc/Cathedral-Bazaar.html 這篇文章的翻譯翻的蠻好的,推薦!
[格言 1] 好軟體都是起源於程式發展者要解決切身之痛. [格言 14] 任何的工具以我們所知道的方法來使用都會有用, 但一個真正了不起的工具會以你從未想過的使用方法來發揮它的功能. [格言 19] 假如專案發展協調者擁有至少跟網際網路一樣好的媒體, 而他也不靠強制力來領導, 那麼一群人必定勝過一個人.
其中我認為最要的,仍舊是格言 1,因為它背後的含意是"熱忱",有熱忱才能開發出好的軟體,如果你的團隊不知他為何要打造這個軟體?這個軟體到底有什麼用處?那麼,這個軟體註定不會成為一個優秀的軟體。
軟體開發之道 - 大教堂和市集
VIVOTEK Digest
這裡是 VIVOTEK 晶睿通訊 的技術部落格,我們在這裡分享與敏捷、Qt/QML及其它軟體相關技術
Trending
-
「不要試圖覆蓋所有使用案例。Spec.不是用來替代組合回歸測試的。」 - Spec by Example 中文版 p.151 但我們明明覺得現在用 Robot Framework 實現自動化 UAT 來替代組合回歸測試是很正確的做法,為什麼作者覺得這樣不對? 我認為...
-
平常 C++ 的開發工具是 Microsoft Visual Studio,然後現在的測試框架是使用 Google Test,以前都是一邊寫,一邊手動執行 test case 來驗證,沒有辦法跟 VS 內建的 Test Explorer 做整合,真的蠻原始的 =.= 最近因為...
Categories
Programming
19
Culture
11
Testing
6
scrum
6
Agile
5
performance tuning
4
Book
3
Code Quality
2
Qt
2
Event Storming
1
database
1
file system
1
virtual machine
1
聯絡我們
與我們交流
如果你有任何想法、問題,歡迎在這裡留言與我們連絡 :-)