## The clean Coder - 預估 ![](https://i.imgur.com/pd2G4y5.jpg =600x) note: 今天想跟大家分享我看的這本書的其中一個小章節,叫做預估,然後這本書比較算是軟實力的部分,主要是在說身為一個專業的工程師應該要有怎麼樣的態度、原則與行動。 --- ## Cindy ![](https://i.imgur.com/EBxWfl3.jpg) - github:https://github.com/cindyliu923 - blog:https://cindyliu923.com - medium:https://medium.com/@cindyliu923 note: 我是 Cindy 這是我的 github,技術部落格跟軟文章部落格 medium --- ## 小故事 note: 在開始之前想先跟大家分享一個小故事,2018 年小美認真學會寫程式之後,開始了第一份工程師工作,當小美打開專案的時候 --- ![](https://i.imgur.com/JW1d76e.jpg) note: 小美以為他來到了深海之中,這是一個 2013 年就開始有程式碼的大專案,總共有六個 rails,在 gitlab 上有六個專案 --- ![](https://i.imgur.com/chJ9mGr.png =50%x) note: 小美待的公司很快地在小美待不到半年就結束營業了,新手小美必須找新工作,努力了一陣子,小美找到工作了 --- ## 新公司 note: 公司結束之後過了大約 2 個月左右,小美帶到了新公司,打開專案 --- ![](https://i.imgur.com/JW1d76e.jpg) note: 小美看見熟悉的身影 --- ## ~~緣分~~ note: 這讓小美了解到這就是所謂的緣分,小美遇到了前公司的專案 --- ![](https://i.imgur.com/BVMeAHg.jpg =45%x) note: 也因為這樣小美對這張圖有了更深刻的體會 --- ## 排山倒海的需求 ![](https://i.imgur.com/6O6p1Q2.jpg =70%x) 小美一個人消化 note: 剛開始接手專案,只有小美一個人負責寫 code,junior 小美和 junior PM 兩人相依為命,面對客戶如排山倒海而來的需求 --- ## 每個需求都很急 專案很大、很老、文件很多但不清楚又難找,客戶自己都搞不清楚原始的 spec,但又一直催促、逼迫 --- ## 沒有 buffer 的時間 junior 小美的估時被原封不動的提供給客戶 note: 在某天與客戶開會之後,小美最後崩潰了 --- ## 新的默契 - 小美:稍微悲觀的預估,code review 的時間要另外算 - PM:提供給客戶的時間會另外加上 code review 跟做雜事的 buffer note: 小美ㄧ直為估時苦惱,小美此後採取的作法是悲觀預估,每張票都有可能會需要花費時間研究,但客戶並不會把研究的時間算進去小美花費的時間,悲觀預估可以預防太樂觀導致客戶的逼迫,客戶如果覺得太慢小美會把詳細要做的事情先列出來給客戶看,但就會花費更多的時間在預估這件事情上,把要做的事情先列出來,再依據要做的細項做預估,預估上來說會相對準確,而且因為寫下來要怎麼做了,也相對可以簡單的 pass 給其他人來做。另外最後客戶也有發現人不夠最後這個專案有四位工程師開發。 --- # 什麼是預估? note: 那我們回到這本書,一開始書中先問了大家,什麼是預估。預估是軟體開發人員面對的最簡單也最可怕的任務之一,作者說明了他曾經預估 1 個月完成的功能結果花了 3 個月完成。 --- ### 業務方 ---> 承諾 ### 開發方 ---> 猜測 note: 問題在於不同人對於預估有著不同的看法,業務方覺得預估是承諾,開發方覺得預估是猜測,兩者相差迥異 --- ## 承諾 承諾是必須做到的,專業的開發人員不隨便承諾,除非他們確切知道可以完成。 --- ## 預估 預估是一種猜測,不包含任何承諾色彩,我們之所以要預估,是因為 **不知道** 到底要花多少時間。 --- ## 不幸 大多數軟體開發人員都很不善於預估,不是因為他們沒有掌握關於預估的訣竅 ----『根本沒有這樣的訣竅』。預估的偏差總是很大,原因在於我們並不理解預估的真實本質。 --- ## 預估不是個定數, ```.md PM:「你估計要多久可以完成優惠折扣的計算功能。」 RD:「3天左右」 PM:「這功能對客戶很重要,有可能明天給我嗎?」 RD:「不可能,光是原始碼就10萬行了。」 PM:「那給你3天,你有把握做出來嗎?」 RD:「一半一半吧...老實說先前維護系統的工程師已經離職了,我很難短時間內釐清修改這個功能對其他功能的影響多大。」 PM:「那我跟客戶約4天後討論呢?」 RD:「嗯,沒意外的話,3天可以完成,如果發生一些錯誤,會再多出1~2天的時間。」 PM:「那給你兩倍的時間去處理呢?」 RD:「好的,如果6天的時間的話我會有九成的把握。」 PM:「我明白了。」 ``` 例子參考:[為何工程師時常無法兌現進度承諾?](https://medium.com/mr-efacani-teatime/%E7%82%BA%E4%BD%95%E5%B7%A5%E7%A8%8B%E5%B8%AB%E6%99%82%E5%B8%B8%E7%84%A1%E6%B3%95%E5%85%8C%E7%8F%BE%E9%80%B2%E5%BA%A6%E6%89%BF%E8%AB%BE-4ad6f33ec127) note: 書裡也有類似的例子,那預估不是個定數,所以是什麼? --- ## 預估的結果 ![](https://i.imgur.com/CyNlsVg.png =600x) 是一種機率分佈,3 天是可能性最大的那個 note: 預估的結果其實是機率的分佈,從剛剛的例子來看,一開始 RD 說的 3 天是機率最大的數字,最後結論的 6 天是大約有 9 成機會完成的數字,RD 應該避免給出暗示性承諾 --- # 預估方法 note: 接下來作者提供了一些預估的方法 --- ## PERT ([Program Evaluation and Review Technique](https://zh.wikipedia.org/wiki/%E8%A8%88%E7%95%AB%E8%A9%95%E6%A0%B8%E8%A1%93)) 樂觀預估( O ):如果一切都異常的順利,可以在這個時間內完成。(機率小於 1%) 常規預估( N ):最有可能完成的時間。 悲觀預估( P ):如果一切都異常的不順利,可能會在這個時間後才完成。(機率小於 1%) ``` 最核心公式為「專案期望時間」= ((樂觀時間+悲觀時間+4*最可能時間))/6 標準差 = (悲觀時間-樂觀時間)/6 ``` note: 又稱為三元分析法,透過上述三個數字預估某項任務 --- ## 預估任務 ### [莫爾菲法](https://zh.wikipedia.org/wiki/%E5%BE%B7%E5%B0%94%E8%8F%B2%E6%B3%95) - **共識** - 亮手指 - 規劃撲克 - 關聯預估 (排卡片順序) - 三元預估 (上述方法分別做悲觀、樂觀、常規預估) note: 多人預估的方式,利用共識來預估,亮手指就是每個手指先約定好一個單位,然後同時大家一起亮手指,來決定預估的時間。規劃撲克也差不多,就是把手指改成撲克牌,關聯預估的話是先把每個任務先寫在卡片上,然後打亂之後大家來排序,時間最久的排右邊,排完再討論 --- ## 大數定律 把大任務分成許多小任務,分開預估再加總 --- ## 作者的結論 在大多數情況下,專業的開發人員不會直接做出確定數字的承諾,而是會提供機率預估,來描述『期望的完成時間』及『可能的變數』。對需要妥善對待的預估結果,專業開發人員會與團隊的其他人協商,以取得共識。 --- ## 反思 更想要哪種? - [ ] 花更多的時間預估,估的時間相對比較準 - [ ] 花少少時間預估,估的時間相對比較不準 - [ ] 其他還沒想到 note: 因為進公司以來我一直覺得我們的估時非常不準確,另外我也覺得我們花在預估這件事情的時間是太短的,如果小功能應該還好但如果是大功能的話絕對是不準的,我也在反思究竟該怎麼做才是好的,還沒想出答案 --- ### Thank you! :sheep: <!-- ![](https://i.imgur.com/O4ztx1j.png) note: 其他我覺得可以分享給大家的 --> <!-- Interrupt and Context Switch are the MOST Waste of Engineers. --> <!-- # 時間管理 note: 先說後面的內容是作者的想法,大家可以參考就好,有些我覺得有點兇 --> <!-- ## 會議 1. 會議是必須的 2. 會議浪費了大量的時間 --> <!-- ## 拒絕 邀請你參加會議的人並不負責管理你的時間,為時間負責的只有自己,所以,如果你收到會議邀請,務必確保出席會議可以為自己目前的工作帶來切實且顯著的成效,否則不必參與。 -->
{"metaMigratedAt":"2023-06-16T21:14:43.801Z","metaMigratedFrom":"YAML","title":"預估","breaks":true,"slideOptions":"{\"theme\":\"solarized\"}","contributors":"[{\"id\":\"293b5e6e-e5eb-4311-9c14-9ef76e059dd3\",\"add\":8247,\"del\":6500}]"}
    286 views