// API callback
related_results_labels_thumbs({"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearchrss/1.0/","xmlns$blogger":"http://schemas.google.com/blogger/2008","xmlns$georss":"http://www.georss.org/georss","xmlns$gd":"http://schemas.google.com/g/2005","xmlns$thr":"http://purl.org/syndication/thread/1.0","id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872"},"updated":{"$t":"2025-09-18T07:02:56.138+08:00"},"category":[{"term":"Programming"},{"term":"Culture"},{"term":"Testing"},{"term":"scrum"},{"term":"Agile"},{"term":"performance tuning"},{"term":"Book"},{"term":"Code Quality"},{"term":"Qt"},{"term":"Event Storming"},{"term":"database"},{"term":"file system"},{"term":"virtual machine"}],"title":{"type":"text","$t":"VIVOTEK Digest"},"subtitle":{"type":"html","$t":"Journey of Software Development"},"link":[{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/posts\/default"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/-\/Testing?alt=json-in-script\u0026max-results=8"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/search\/label\/Testing"},{"rel":"hub","href":"http://pubsubhubbub.appspot.com/"}],"author":[{"name":{"$t":"diro"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/13292247339970268280"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"16","height":"16","src":"https:\/\/img1.blogblog.com\/img\/b16-rounded.gif"}}],"generator":{"version":"7.00","uri":"http://www.blogger.com","$t":"Blogger"},"openSearch$totalResults":{"$t":"6"},"openSearch$startIndex":{"$t":"1"},"openSearch$itemsPerPage":{"$t":"8"},"entry":[{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-5686579162423854061"},"published":{"$t":"2019-08-30T18:26:00.001+08:00"},"updated":{"$t":"2019-08-30T18:28:25.450+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"Agile"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Culture"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Programming"},{"scheme":"http://www.blogger.com/atom/ns#","term":"scrum"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Testing"}],"title":{"type":"text","$t":"The Year of Being Agile (Part 1)"},"content":{"type":"html","$t":"\u003Cdiv class=\"graf graf--p\" name=\"c3e2\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"c3e2\"\u003E\n在我們團隊快要一年了\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5ad9\"\u003E\n一年的時間\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"7275\"\u003E\n寶寶可以長牙\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"116a\"\u003E\n台灣可以賣出 10 億杯飲料\u003Cbr \/\u003E\n營業額可以突破千億…\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"116a\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh9YpCSD1g7TmrG5FmuZ8YtPPJWpVIAj9NtanXGXEhBxFvTbUa0jGUYPlvy5MQZTtZffSjcWO8Ml3mrp4ThuxG9hCsSO4gprm3WSJHgeHnCqnsw3Fi_pDkmYYQSoHAYf_iynhh-6yXnh_U\/s1600\/20190830_medium_1_1.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"262\" data-original-width=\"701\" height=\"235\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh9YpCSD1g7TmrG5FmuZ8YtPPJWpVIAj9NtanXGXEhBxFvTbUa0jGUYPlvy5MQZTtZffSjcWO8Ml3mrp4ThuxG9hCsSO4gprm3WSJHgeHnCqnsw3Fi_pDkmYYQSoHAYf_iynhh-6yXnh_U\/s640\/20190830_medium_1_1.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E經濟部統計處: 飲料店營業額在台灣逐年攀升\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"b179\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"b179\"\u003E\n不說飲料\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3bcc\"\u003E\n最近回顧了這一年的行事曆\u003Cbr \/\u003E\n我是有點吃驚的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3c97\"\u003E\nOMG!\u003Cbr \/\u003E\n原來工作的方式，可以這樣影響生活\u003Cbr \/\u003E\n越工作越有活力\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5688\"\u003E\n如何影響呢？\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2271\"\u003E\n我先賣個關子，先來看幾個大部分的組織會遇到的現象。\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2271\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ch2\u003E\n\u003C\/h2\u003E\n\u003Cdiv\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ch2\u003E\n第一個常見現象：開週會\u003Cbr \/\u003E\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EWhy are meetings so ineffective?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h2\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"1881\"\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003E\u003Cbr \/\u003E\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"772a\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"772a\"\u003E\n一個規模不大的四人團隊\u003Cbr \/\u003E\n一人報告一小時\u003Cbr \/\u003E\n一場 weekly meeting 就是四個小時\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"7210\"\u003E\n如果你曾經有在電影院睡著的經驗\u003Cbr \/\u003E\n應該不難體會四個小時以上的會議有多累\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d548\"\u003E\n為什麼 weekly meeting 要開這麼久?\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"8ceb\"\u003E\n畢竟是一週的進度回報，如果每個人報告一個小時\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"b727\"\u003E\n相當於把他五個工作天，一天八小時的工作量\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0b91\"\u003E\n用 40 倍速的快進，講給你聽\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5663\"\u003E\n奇怪的是，我們心理從來沒有出現這樣的聲音\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p graf--startsWithDoubleQuote\" name=\"11d1\"\u003E\n“哇! 我聽到了 1\/40 的超級濃縮精華\/乾貨耶! ”\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"a3c0\"\u003E\n我們只希望他能再快個 40 倍\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n這不能怪同事，就像在電影院睡著其實也不能怪導演\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"09ce\"\u003E\n沒有哪個導演拍片是為了讓觀眾睡的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d782\"\u003E\n比較可能的是 —\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"1881\"\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003E\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5105\"\u003E\n那個議題和你沒有共鳴\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5105\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiF3aQ45wGgW44KKQPv5hPxF3Af9i5_kgZuCVOG3kMXSBCPOiIgFpcSo-IW7OMPOgkVJwfsnArh-vdit7EI9zIKypzdFKLI2LpYOASNEEQwlaStc4qrvt1PjXkkj6mwuR2fnHPjlTGa_Wk\/s1600\/20190830_medium_1_2.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"387\" data-original-width=\"693\" height=\"355\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiF3aQ45wGgW44KKQPv5hPxF3Af9i5_kgZuCVOG3kMXSBCPOiIgFpcSo-IW7OMPOgkVJwfsnArh-vdit7EI9zIKypzdFKLI2LpYOASNEEQwlaStc4qrvt1PjXkkj6mwuR2fnHPjlTGa_Wk\/s640\/20190830_medium_1_2.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"2de4\"\u003E\nGreat movies tell stories that have deep emotional resonance\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Ch4 class=\"graf graf--h4\" name=\"be55\"\u003E\n\u003C\/h4\u003E\n\u003Ch2\u003E\n\u003C\/h2\u003E\n\u003Ch2\u003E\n第二個常見現象：同事間的工作互換困難\u003Cbr \/\u003E\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EWhy is collective work difficult?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h2\u003E\n\u003Cbr \/\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5105\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"db42\"\u003E\n我們很常因為負責了某個案子，後續的東西都交給你來處理\u003Cbr \/\u003E\n因為這是短期看來最省時間的做法\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"99e6\"\u003E\n當你在公司一陣子了，你會自然而然地有一個對照表:\u003Cbr \/\u003E\n“X module 的問題要找同事 A\u003Cbr \/\u003E\n\u0026nbsp;Y module 的問題找同事 B”\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"c06a\"\u003E\n你應該也對這種情況不陌生 — \u003Cbr \/\u003E\n同事 B: “A 請假耶，這問題要等他回來才能處理喔! ”\u003Cbr \/\u003E\n很少同事 B 會說: “A 請假，那你先把東西給我，我可以處理”\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"68e6\"\u003E\n但其實，這種工作互換、集體協作的例子，在生活中明明很常見\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"a151\"\u003E\n比如說便利商店的店員，A 忙著做咖啡、B 來幫忙結帳\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"6de7\"\u003E\n從沒見過哪個店員跟你說:\u003Cbr \/\u003E\n“不好意思我不能幫您結帳，負責收銀的今天請假，我只會泡咖啡”\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"e129\"\u003E\n上述這種情況在組織裡卻很常發生，原因是什麼呢?\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"adb8\"\u003E\n可能是訓練文化\u003Cbr \/\u003E\n不知不覺把 ”人” 訓練成一台 “機器” (咖啡機\/收銀機)\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"1868\"\u003E\n因此當我發現這裡的 team member 可以輕鬆的交換手頭上的工作\u003Cbr \/\u003E\n我是很驚訝的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5105\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgS8PCqhsW2rOtiKiK7X7_RnUMid1cYh_6pJ1W9lHTHjuAr6CSeC6v8BSCTMKo2e8vJkY7sRj5At-yDhtjoEOrG7tvLBYe-hS0k8PxqQqqBOtGSbcfQQ6qNMv50Ezo8h52NAm8AyNoQ0b0\/s1600\/20190830_medium_1_3.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"462\" data-original-width=\"693\" height=\"425\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgS8PCqhsW2rOtiKiK7X7_RnUMid1cYh_6pJ1W9lHTHjuAr6CSeC6v8BSCTMKo2e8vJkY7sRj5At-yDhtjoEOrG7tvLBYe-hS0k8PxqQqqBOtGSbcfQQ6qNMv50Ezo8h52NAm8AyNoQ0b0\/s640\/20190830_medium_1_3.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"0480\"\u003E\nMachine learning or human learning?\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cbr \/\u003E\n\u003Ch2\u003E\n\u003C\/h2\u003E\n\u003Ch2\u003E\n第三個常見現象: 加班\u003C\/h2\u003E\n\u003Ch2\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EWhy work overtime?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h2\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"ba4b\"\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003E\u003Cbr \/\u003E\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"ba4b\"\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003E\u003Cbr \/\u003E\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"cde9\"\u003E\n你有玩過比手畫腳這類的傳話遊戲嗎? 通常結果都是各種歪樓\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"8f1e\"\u003E\n你可能會說，如果大家都能看到題目就不會有問題\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2a2b\"\u003E\nNo，還是不行\u003Cbr \/\u003E\n比如先前 U Think I Do 系列\u003Cbr \/\u003E\n就把朋友、家人、社會、學校、自己\u003Cbr \/\u003E\n看到一件事情的不同面向\u003Cbr \/\u003E\n放在一張圖裡，非常有趣\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2a2b\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2a2b\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEilu1dcZw_uA_wQi9e_mJEpZGLP8hLUgv_WObIOEgS3_nkf5j2HXMuTMhdzgDL49JjL__17rsVfoVo0ibL-srPcYWdrCw4q5sJ6IKa-snKCTGstANj8B7Yb80oStZJIquaQRvZAi2GX1dE\/s1600\/20190830_medium_1_4.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"444\" data-original-width=\"633\" height=\"448\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEilu1dcZw_uA_wQi9e_mJEpZGLP8hLUgv_WObIOEgS3_nkf5j2HXMuTMhdzgDL49JjL__17rsVfoVo0ibL-srPcYWdrCw4q5sJ6IKa-snKCTGstANj8B7Yb80oStZJIquaQRvZAi2GX1dE\/s640\/20190830_medium_1_4.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"4939\"\u003E\n不同角度的生命科學系\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5105\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"6773\"\u003E\n撇除那種時程明顯不合理的情況\u003Cbr \/\u003E\n大多數的加班來自於\u003Cbr \/\u003E\n每個人對事物的理解不同:\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"078a\"\u003E\n以為自己了解對方想要的功能\u003Cbr \/\u003E\n↓\u003Cbr \/\u003E\n發現不是對方想要的功能\u003Cbr \/\u003E\n↓\u003Cbr \/\u003E\n\u0026nbsp;“盡量” 修改，改不完就加班\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"7ea1\"\u003E\n這個 “盡量” 可能妥協了很多事情\u003Cbr \/\u003E\n如果前面幾次靠著加班，都很幸運的在 deadline 前完工了\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"205e\"\u003E\n再遇到這種情況的時候，就會習慣性的把加班變成解決方法\u003Cbr \/\u003E\n而忘了去想該修正哪些流程\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"205e\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgQjOOERpgsEy93WonG2HRQOi4WuQ3xNQEUomfyFA1QtcmCR0MRRUqmoL2sukJheseVKhK3sgp9F9bO5FDL0XGCalgvQ06HMTMOw9KdQ_8z0ExnvPSbHydZo7BHrDynYyFVp3hR5k6mZQk\/s1600\/20190830_medium_1_5.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"463\" data-original-width=\"694\" height=\"425\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgQjOOERpgsEy93WonG2HRQOi4WuQ3xNQEUomfyFA1QtcmCR0MRRUqmoL2sukJheseVKhK3sgp9F9bO5FDL0XGCalgvQ06HMTMOw9KdQ_8z0ExnvPSbHydZo7BHrDynYyFVp3hR5k6mZQk\/s640\/20190830_medium_1_5.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"192b\"\u003E\n又下班了?! 我還想工作\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"c9a6\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"c9a6\"\u003E\nPM、RD、UX 都用自己的角度去理解、開發功能，在溝通不足、流程不透明的情況下，這個專案就會越來越像一個黑盒子\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"af8f\"\u003E\n當老闆問這件事情什麼時候可以做完\u003Cbr \/\u003E\n是不會有人知道的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"69b4\"\u003E\n高中物理就告訴我們，根據不確定性原理\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"6ed2\"\u003E\n專案的完成和沒完成，是同時存在的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"b31a\"\u003E\n只有打開黑盒子的一瞬間才會塌縮到一種可能性上\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5fd9\"\u003E\n這種 “既完成又沒完成”\u003Cbr \/\u003E\n把人逼的 “既死又活” 的現象\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"a2a3\"\u003E\n我們稱之為 —\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"06d4\"\u003E\n薛丁格的專案\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"205e\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgpm1mmJehUEnD52sqHVTcmGAWozxda1g9oJNvsjx9u-GgaupA7VXNMv3_-IwQolbLJ907KW7x1jxKznCpJAnxN03Q5ajR0owjqwVb4vRBCIh0duTKfXly1-6WaJq1HwypQlL-uewV5o5k\/s1600\/20190830_medium_1_6.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"465\" data-original-width=\"700\" height=\"424\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgpm1mmJehUEnD52sqHVTcmGAWozxda1g9oJNvsjx9u-GgaupA7VXNMv3_-IwQolbLJ907KW7x1jxKznCpJAnxN03Q5ajR0owjqwVb4vRBCIh0duTKfXly1-6WaJq1HwypQlL-uewV5o5k\/s640\/20190830_medium_1_6.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"30b7\"\u003E\nSchrödinger’s Cat 薛丁格的貓\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"822f\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"822f\"\u003E\n本篇文章未完，你可以現在\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Ca href=\"https:\/\/blog.rd.vivotek.com\/2019\/08\/the-year-of-being-agile-part2.html\"\u003E前往 Part2\u003C\/a\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"aca8\"\u003E\n也可以往下滑留下一些意見\u003C\/div\u003E\n\u003Cbr \/\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"205e\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n"},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/5686579162423854061\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/08\/the-year-of-being-agile-part1.html#comment-form","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/5686579162423854061"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/5686579162423854061"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/08\/the-year-of-being-agile-part1.html","title":"The Year of Being Agile (Part 1)"}],"author":[{"name":{"$t":"Vavrin Chen"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/00542546042460997372"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"16","height":"16","src":"https:\/\/img1.blogblog.com\/img\/b16-rounded.gif"}}],"media$thumbnail":{"xmlns$media":"http://search.yahoo.com/mrss/","url":"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh9YpCSD1g7TmrG5FmuZ8YtPPJWpVIAj9NtanXGXEhBxFvTbUa0jGUYPlvy5MQZTtZffSjcWO8Ml3mrp4ThuxG9hCsSO4gprm3WSJHgeHnCqnsw3Fi_pDkmYYQSoHAYf_iynhh-6yXnh_U\/s72-c\/20190830_medium_1_1.PNG","height":"72","width":"72"},"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-1436205381009210138"},"published":{"$t":"2019-08-30T18:24:00.002+08:00"},"updated":{"$t":"2019-08-30T18:28:10.216+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"Agile"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Culture"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Programming"},{"scheme":"http://www.blogger.com/atom/ns#","term":"scrum"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Testing"}],"title":{"type":"text","$t":"The Year of Being Agile (Part 2)"},"content":{"type":"html","$t":"\u003Cdiv class=\"graf graf--p\" name=\"cde7\"\u003E\n我們再歸納一下，一般的組織常遇到三個現象:\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"40e5\"\u003E\n1. 開冗長的週會\u003Cbr \/\u003E\n2. 同事間工作互換很困難\u003Cbr \/\u003E\n3. 加班\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"f70b\"\u003E\n而我們 team 恰恰相反，有這三個很獨特的地方:\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"af46\"\u003E\n1. 不用開週會\u003Cbr \/\u003E\n2. 協作容易，你的同事就是你的分身\u003Cbr \/\u003E\n3. 不用加班\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"44ed\"\u003E\n這些特徵好像很難同時並存，你想，不開會怎麼知道同事在做什麼?\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"8172\"\u003E\n同事之間不了解，溝通成本就大\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"dcc6\"\u003E\n人越多就越複雜，花的時間也多\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"9026\"\u003E\n怎可能不用加班事情還能準時做完?\u003C\/div\u003E\n\u003Ch2\u003E\n\u003C\/h2\u003E\n\u003Ch2\u003E\n敏捷開發\u003Cbr \/\u003E\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EWhy OverCooked can teach you agile?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h2\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0d1f\"\u003E\n來講講 OverCooked 這個遊戲\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"64c1\"\u003E\n一開始食物的訂單不多，每個人可以各司其職\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"6edd\"\u003E\n專門切肉，專門煮菜，專門洗碗\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d2d1\"\u003E\n而隨著訂單暴增和廚房地形改變\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"aba4\"\u003E\n如果還是一個人只負責做一件事，時間肯定是不夠用的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"aba4\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEisCCBUpO2eVXHzBTkv8ioXYxt_v8AISQ3ODBlPwGulvcekK-20PM6udyrm42ARoVa2S4jlGtGBowN-8_3jePNOgILX4ZDV7mGHdxt9PUNwMS-tMggtkMj7RashATAk2C3ASsaZ1OTOj34\/s1600\/20190830_medium_2_1.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"390\" data-original-width=\"697\" height=\"358\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEisCCBUpO2eVXHzBTkv8ioXYxt_v8AISQ3ODBlPwGulvcekK-20PM6udyrm42ARoVa2S4jlGtGBowN-8_3jePNOgILX4ZDV7mGHdxt9PUNwMS-tMggtkMj7RashATAk2C3ASsaZ1OTOj34\/s640\/20190830_medium_2_1.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"3cf1\"\u003E\n一款具備敏捷精神的遊戲\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"aba4\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EGet back in sync\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"676b\"\u003E\n左上角可以看到現在的訂單有哪些\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3de6\"\u003E\n一回合的時間完成越多訂單得分越高\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"176c\"\u003E\n這是一款用嘴巴打仗的遊戲\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d110\"\u003E\n你準備要拿料還是煮菜\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"250a\"\u003E\n需要什麼幫忙\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d9a1\"\u003E\n哪邊需要修正\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"e026\"\u003E\n都要即時說出來\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"1db5\"\u003E\n每個玩家都可以看到夥伴的狀況\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"b591\"\u003E\n這種快速 team sync 的方式就是 —\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0723\"\u003E\ndaily scrum meeting \/ standup meeting\u003C\/div\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003E\u003Cbr \/\u003E\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003ERealtime review\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"905f\"\u003E\n這款遊戲一次最多四位玩家\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"7bb3\"\u003E\n如果有八個人玩呢?\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"498a\"\u003E\n一般情況就是多出來的四個會在旁邊\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"f144\"\u003E\n觀戰並且嘴砲給建議\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"e269\"\u003E\n等到下一回合再換這一組人拿搖桿\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0934\"\u003E\n這種 driver \u0026amp; navigator 的方式 —\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"178a\"\u003E\npair programming \/ mob programming\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"178a\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh8gKRhXsGJyrybujJZhdjviMTzdO2-A2z_z9OjjU9UV3C26PLcd6ZrUAsFnBYSSUr4L5heA__rYqUxgwd3h1ck8jfxsHtZ5n3WJje-v0P7IYeUxjtJOscYPD51RU4dyECPPsroR8iOS7Q\/s1600\/20190830_medium_2_2.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"461\" data-original-width=\"697\" height=\"422\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh8gKRhXsGJyrybujJZhdjviMTzdO2-A2z_z9OjjU9UV3C26PLcd6ZrUAsFnBYSSUr4L5heA__rYqUxgwd3h1ck8jfxsHtZ5n3WJje-v0P7IYeUxjtJOscYPD51RU4dyECPPsroR8iOS7Q\/s640\/20190830_medium_2_2.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"372f\"\u003E\nThe programmer as navigator\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"178a\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"23d0\"\u003E\n介紹完遊戲，應該就不難回答我們一開始的問題\u003C\/div\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003E\u003Cbr \/\u003E\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EHow to avoid boring meetings?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3a6c\"\u003E\n這個 team 不是不開會\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"b573\"\u003E\n而是不開沒有效率的會\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3bf7\"\u003E\ndaily meeting 有一些限制:\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"1cce\"\u003E\n最多 15 分鐘，站著開\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"73b4\"\u003E\n類似遊戲一回合的計時制\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2a3c\"\u003E\n講求快速同步最新狀況\u003C\/div\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003E\u003Cbr \/\u003E\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EHow to develop a cohesive team?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"ce53\"\u003E\n再來講協作:\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"670f\"\u003E\n關心不等於了解\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5a6a\"\u003E\n想要了解一件事情\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"c68c\"\u003E\n沒有什麼比實際參與還有效的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"7239\"\u003E\n針對複雜的 task 安排 pair \/ mob\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"ec6e\"\u003E\n提倡 collective code ownership\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"cb60\"\u003E\n簡單說就是共榮共享\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"cd4e\"\u003E\n但這樣講可能有點土\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0b9e\"\u003E\n所以來看一下維基百科的定義:\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0b9e\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cblockquote class=\"tr_bq\"\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"9d2c\"\u003E\n合作或協作（英語：Collaboration）\u003C\/blockquote\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"ac44\"\u003E\n是指一種由兩個或兩個以上的個人或團體作為一個共同的目標而交集或在一起共同工作，舉例說明：\u003C\/blockquote\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"96d6\"\u003E\n一個知識分子可以透過合作的關係而去分享知識，再而經過學習和共識達到創作的目標\u003C\/blockquote\u003E\n\u003C\/blockquote\u003E\n\u003Cbr \/\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"9803\"\u003E\n從上面描述看的出來\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"9d60\"\u003E\n合作和凝聚力脫不了關係\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"432b\"\u003E\n那怎樣才能有好的凝聚力呢?\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"c51e\"\u003E\n借用本公司的四大核心價值\u003Cbr \/\u003E\n誠信、 關懷、創新、當責\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2eb9\"\u003E\n肯定每個人的付出\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"618e\"\u003E\n讓每個人都看到自己的貢獻 —\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"618e\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cblockquote class=\"tr_bq\"\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"47a8\"\u003E\n一個人走得快\u003C\/blockquote\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"1bd5\"\u003E\n一群人走得遠\u003C\/blockquote\u003E\n\u003C\/blockquote\u003E\n\u003Cbr \/\u003E\n\u003Ch3\u003E\n\u0026nbsp;\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EWhy collective intelligence matters?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"8123\"\u003E\n電影環太平洋裡面\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"14c0\"\u003E\n龐大的機器人無法由一人駕駛\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"9143\"\u003E\n需要兩位駕駛員連接彼此的腦神經\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"c8a7\"\u003E\n共享對方的情感、記憶、經歷\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0f0b\"\u003E\n並且認同對方的處境之後\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"29d3\"\u003E\n才能同步操控\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"29d3\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjOaNKHpx2DuamsJYgRJg_mT5vIeEwKGtQeMlvkG3NLsoXQZNDs3IQ9xFi5sZfyhcDNoVnh9PmAXZM1QAAL1qijsjV6-m79sfDPt4npdLwcGGly3tN0FIURmJBWuiEFX1I3yFq2cxEkHfg\/s1600\/20190830_medium_2_3.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"399\" data-original-width=\"695\" height=\"366\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjOaNKHpx2DuamsJYgRJg_mT5vIeEwKGtQeMlvkG3NLsoXQZNDs3IQ9xFi5sZfyhcDNoVnh9PmAXZM1QAAL1qijsjV6-m79sfDPt4npdLwcGGly3tN0FIURmJBWuiEFX1I3yFq2cxEkHfg\/s640\/20190830_medium_2_3.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"6d5e\"\u003E\nPacific Rim: Uprising (2018)\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"6d5e\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"868d\"\u003E\n好的溝通和協作\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3d3d\"\u003E\n就是用心和時間\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"50f5\"\u003E\n灌溉的共同記憶\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"da5b\"\u003E\n他會形成一個生命體\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d8b1\"\u003E\n持續成長\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"7fb5\"\u003E\n或者說他就是一個生命\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"42a7\"\u003E\n你們必須承擔起照顧這個生命的責任\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2268\"\u003E\n也是這份承擔\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0059\"\u003E\n讓你們之間的關聯\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n獨一無二\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEig7D3OQf1C4z-y7ILEqiNP7N6p5dnCjfQkzYeyO5R45ycVbOJNX4xpbuGGWOsNtsyciuu-xqCr9QBlKz0vefAkWdm7IwmvtePJX4bC2lsS_Ib7X4BtP58EplhmE9K_ksG0lAG7zkeYTek\/s1600\/20190830_medium_2_4.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"525\" data-original-width=\"696\" height=\"482\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEig7D3OQf1C4z-y7ILEqiNP7N6p5dnCjfQkzYeyO5R45ycVbOJNX4xpbuGGWOsNtsyciuu-xqCr9QBlKz0vefAkWdm7IwmvtePJX4bC2lsS_Ib7X4BtP58EplhmE9K_ksG0lAG7zkeYTek\/s640\/20190830_medium_2_4.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"97d5\"\u003E\nTrue collaboration yields better results\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ch3\u003E\n\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EIteration based method\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h3\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"5eac\"\u003E\nIteration 翻成中文『迭代』\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"2b13\"\u003E\n在敏捷方法中是指\u003Cbr \/\u003E\n把一個大任務切成許多小週期可以完成的的任務\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"8a56\"\u003E\n騰訊創始人馬化騰說:\u003Cbr \/\u003E\n小步快跑、快速迭代\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"b59a\"\u003E\n這是他的產品思路\u003Cbr \/\u003E\n也成為互聯網創業法則\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"10b4\"\u003E\n敏捷開發裡的迭代週期是一個 sprint\u003Cbr \/\u003E\nsprint 這字有短跑衝刺的意思\u003Cbr \/\u003E\n很符合迭代的概念\u003Cbr \/\u003E\n一個 sprint 一般為 2 ~ 4 週\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3ac0\"\u003E\n由團隊討論這個 sprint 能完成的功能\u003Cbr \/\u003E\n並在 sprint 結束時做個『試營運』\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"7992\"\u003E\n拿到客戶的 feedback\u003Cbr \/\u003E\n並且快速的衡量修正\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"ac3e\"\u003E\n為了好懂，借個圖舉例\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"bbf0\"\u003E\n\u003Ca class=\"markup--anchor markup--p-anchor\" data-href=\"https:\/\/www.jpattonassociates.com\/about-jeff-patton\/\" href=\"https:\/\/www.jpattonassociates.com\/about-jeff-patton\/\" rel=\"noopener\" target=\"_blank\"\u003EJeff Patton\u003C\/a\u003E 是名資深產品經理\u003Cbr \/\u003E\n他的著作 \u003Ca class=\"markup--anchor markup--p-anchor\" data-href=\"https:\/\/www.amazon.com\/User-Story-Mapping-Discover-Product\/dp\/1491904909\/\" href=\"https:\/\/www.amazon.com\/User-Story-Mapping-Discover-Product\/dp\/1491904909\/\" rel=\"noopener\" target=\"_blank\"\u003EUser Story Mapping\u003C\/a\u003E 裡\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"babe\"\u003E\n比較了傳統方法與敏捷開發法\u003Cbr \/\u003E\n如何在三個迭代週期完成蒙娜麗莎\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"babe\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgCjevnSH_rT19O6o-Pi5dc7x7pX42bXUEDKd3KF_vktqEDjclJtNnR66ltL_baYxjpwGC67lpUuf71KTGcDPkeVUxCCMm75pFyueEYArAkvI7REmET0fOuHmcVZPVcM18S4X3MPvIKl4Q\/s1600\/20190830_medium_2_5.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"322\" data-original-width=\"683\" height=\"300\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgCjevnSH_rT19O6o-Pi5dc7x7pX42bXUEDKd3KF_vktqEDjclJtNnR66ltL_baYxjpwGC67lpUuf71KTGcDPkeVUxCCMm75pFyueEYArAkvI7REmET0fOuHmcVZPVcM18S4X3MPvIKl4Q\/s640\/20190830_medium_2_5.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"90f2\"\u003E\nJeff Patton did an Iterative Mona Lisa.\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d3e9\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"d3e9\"\u003E\n先來看傳統的開發方法:\u003Cbr \/\u003E\n在第一階段可以看到蒙娜麗莎的頭\u003Cbr \/\u003E\n第二階段能看到蒙娜麗莎的左下半身\u003Cbr \/\u003E\n第三階段是完整的蒙娜麗莎\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3e0a\"\u003E\n換成用敏捷開發會怎樣呢?\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"bedf\"\u003E\n在第一階段是極簡主義派的蒙娜麗莎\u003Cbr \/\u003E\n第二階段是簡單上色派的蒙娜麗莎\u003Cbr \/\u003E\n第三階段是佛羅倫薩畫派的蒙娜麗莎\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"1006\"\u003E\n不論哪個階段都是最小可行產品\u003Cbr \/\u003E\n很傳神地描述了敏捷的精神 —\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"a87d\"\u003E\n接受反饋、迅速擴張\u003Cbr \/\u003E\n盡快給客戶有價值的產品\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"a87d\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ch2\u003E\n\u003C\/h2\u003E\n\u003Ch2\u003E\n敏捷帶來的影響\u003Cbr \/\u003E\u003Cstrong class=\"markup--strong markup--p-strong\"\u003E\u003Cem class=\"markup--em markup--p-em\"\u003EHow does agile affect my work and daily life?\u003C\/em\u003E\u003C\/strong\u003E\u003C\/h2\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"a0b0\"\u003E\n所以回到一開始我賣的關子\u003Cbr \/\u003E\n那個讓我吃驚的行事曆\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"4e44\"\u003E\n我發現從以前到現在\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0a9c\"\u003E\n晚上時間的利用有了很大的改變\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0a9c\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cblockquote class=\"tr_bq\"\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"4442\"\u003E\n從同事電腦辦公桌\u003C\/blockquote\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"6cf3\"\u003E\n變家人散步吹吹風\u003C\/blockquote\u003E\n\u003C\/blockquote\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"f83e\"\u003E\n以前晚下班總要負責關公司的門\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"15d6\"\u003E\n有時候關得太順就會不小心鎖到別人\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"e028\"\u003E\n下圖的例外就是我補充的\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"e028\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto; text-align: center;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiEy4bGNEQkWYngZ-ME__vWSXd8YfgoHWYynkXsXaX-QcBSGLg4C_lGLZD0MnIZLh0w3RKnQuw2kNswiFYKq1ux2ZQYvTXWqbLVurqPecObCsI47xMA-0VtsDKfFe0rPChYNfMmAjXpB3o\/s1600\/20190830_medium_2_6.PNG\" imageanchor=\"1\" style=\"margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" data-original-height=\"483\" data-original-width=\"663\" height=\"466\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiEy4bGNEQkWYngZ-ME__vWSXd8YfgoHWYynkXsXaX-QcBSGLg4C_lGLZD0MnIZLh0w3RKnQuw2kNswiFYKq1ux2ZQYvTXWqbLVurqPecObCsI47xMA-0VtsDKfFe0rPChYNfMmAjXpB3o\/s640\/20190830_medium_2_6.PNG\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E\u003Cdiv class=\"graf graf--p\" name=\"1b30\"\u003E\n關門 SOP\u003C\/div\u003E\n\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"e028\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"341c\"\u003E\n這一年有了固定的下班時間後\u003Cbr \/\u003E\n我開始能每天帶著媽媽去運動\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"0057\"\u003E\n運動的地方是學校的操場\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"f594\"\u003E\n晚上學校警衛要關門的時候\u003Cbr \/\u003E\n看著警衛一邊關燈一邊趕人\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"216e\"\u003E\n這種熟悉又親切的感覺 —\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"3be0\"\u003E\n等我退休了或許可以來當警衛吧 😝\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cblockquote class=\"tr_bq\"\u003E\n\u003Cblockquote class=\"graf graf--blockquote\"\u003E\n前是把家當旅館\u003C\/blockquote\u003E\n\u003Cblockquote class=\"graf graf--blockquote\" name=\"827b\"\u003E\n現在是家事盡量管\u003C\/blockquote\u003E\n\u003C\/blockquote\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n\u003C\/div\u003E\n\u003Ca name='more'\u003E\u003C\/a\u003E\u003Cbr \/\u003E\n\u003Cpre class=\"graf graf--pre\" name=\"0432\"\u003E感謝你看到最後，寫這篇文章的動機是想分享敏捷精神\n也因此，歡迎大家一起 being agile\n留言告訴我你的想法或建議\u003C\/pre\u003E\n\u003Cdiv class=\"graf graf--p\" name=\"733f\"\u003E\n\u003Cbr \/\u003E\u003C\/div\u003E\n"},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/1436205381009210138\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/08\/the-year-of-being-agile-part2.html#comment-form","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/1436205381009210138"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/1436205381009210138"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2019\/08\/the-year-of-being-agile-part2.html","title":"The Year of Being Agile (Part 2)"}],"author":[{"name":{"$t":"Vavrin Chen"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/00542546042460997372"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"16","height":"16","src":"https:\/\/img1.blogblog.com\/img\/b16-rounded.gif"}}],"media$thumbnail":{"xmlns$media":"http://search.yahoo.com/mrss/","url":"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEisCCBUpO2eVXHzBTkv8ioXYxt_v8AISQ3ODBlPwGulvcekK-20PM6udyrm42ARoVa2S4jlGtGBowN-8_3jePNOgILX4ZDV7mGHdxt9PUNwMS-tMggtkMj7RashATAk2C3ASsaZ1OTOj34\/s72-c\/20190830_medium_2_1.PNG","height":"72","width":"72"},"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-4856393057482918466"},"published":{"$t":"2015-03-11T10:25:00.001+08:00"},"updated":{"$t":"2019-04-25T18:01:05.269+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"Programming"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Testing"}],"title":{"type":"text","$t":"How to Integrate Robot Framework with TestRail"},"content":{"type":"html","$t":"\u003Cdiv class=\"separator\" style=\"clear: both; text-align: center;\"\u003E\n\u003Ca href=\"https:\/\/miro.medium.com\/max\/480\/1*9lGOlBAep8JzQLdvG2mVlg.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"\u003E\u003Cimg border=\"0\" data-original-height=\"400\" data-original-width=\"400\" height=\"320\" src=\"https:\/\/miro.medium.com\/max\/480\/1*9lGOlBAep8JzQLdvG2mVlg.png\" width=\"320\" \/\u003E\u003C\/a\u003E\u003C\/div\u003E\n\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n一直都是使用 Robot Framework 來進行自動化的 UAT，但因為完整的 UAT 還包括了手動測試的部份，因此在 UAT 中 Test Case 的管理上就比較麻煩一點，可能完整的 test case 是存在 excel 裡頭，再由開發人員手動填入 Robot Framework 的測試結果。\u003Cbr \/\u003E\n\u003Cem\u003E這樣真的太低級了，這不但浪費時間、易出錯，而且很難管理啊，所以必需有一個更好的管理方式。\u003C\/em\u003E\u003Cbr \/\u003E\n為了解決這個問題，我們導入了 TestRail。TestRail 是一套相當好用的 Test Case \/ Test Plan 管理系統，而且 API 相當完整，因此拿來跟 Robot Framework 整合真是再適合不過了。使用的流程為：\u003Cbr \/\u003E\n\u003Cul\u003E\n\u003Cli\u003E在 TestRail 中建立Test Case\u003C\/li\u003E\n\u003Cli\u003E如果該 Test Case 有對應的 Robot Framework 自動化測試 test case，記得在 test case 中的 Tags 欄位加上 CID:n，這個 n 便是在 TestRail 中的 CID(Case ID)\u003C\/li\u003E\n\u003Cli\u003E當產品要進行完整測試時，便建立一個 Test Run，然後由 CI Server 呼叫 Robot Framework 開始進行自動化測試，接著再自動把測試結果更新到 TestRail 中對應的 Test Run Result 中(passed\/failed)。接著團隊便可以知道還有那些 Test Case 未經測試(untested)，只要針對這些 test case 去補足手動測試即可。\u003C\/li\u003E\n\u003C\/ul\u003E\n其中比較麻煩的便是 Robot Framework 的結果要如何傳入 TestRail，因此我們做了一個小工具來進行分析 Robot Framework 執行結果，並搭配 TestRail API 來進行更新，完整的程式碼已放在 github 上:\u003Ca href=\"https:\/\/github.com\/diro\/robot-testrail\"\u003Ehttps:\/\/github.com\/diro\/robot-testrail\u003C\/a\u003E"},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/4856393057482918466\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/03\/how-to-integrae-robot-framework-with_10.html#comment-form","title":"1 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/4856393057482918466"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/4856393057482918466"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/03\/how-to-integrae-robot-framework-with_10.html","title":"How to Integrate Robot Framework with TestRail"}],"author":[{"name":{"$t":"diro"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/13292247339970268280"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"16","height":"16","src":"https:\/\/img1.blogblog.com\/img\/b16-rounded.gif"}}],"thr$total":{"$t":"1"}},{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-3079718817963420798"},"published":{"$t":"2015-02-09T00:45:00.001+08:00"},"updated":{"$t":"2015-02-24T11:23:55.615+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"Testing"}],"title":{"type":"text","$t":"自動化UAT的一些體悟"},"content":{"type":"html","$t":"\u003Cdiv dir=\"ltr\" style=\"margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Ch2\u003E\n\u003Cspan style=\"font-family: Arial; font-size: x-large;\"\u003E\u003Cspan style=\"line-height: 17.25px; white-space: pre-wrap;\"\u003E自動化UAT的一些體悟\u003C\/span\u003E\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cspan style=\"font-family: Arial;\"\u003E\u003Cspan style=\"font-size: 15px; line-height: 17.25px; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/span\u003E\n\u003Cspan style=\"font-family: Arial; font-size: 15px; font-weight: normal; line-height: 1.15; white-space: pre-wrap;\"\u003E由於自動化UAT對scrum team來說是一個全新的技術, 所以在過程中往往會有很多天馬行空的測試方法, 這篇文章就以我目前運作一段時間以及跟組員們討論如何測試所理出一點心得.\u003C\/span\u003E\u003Cbr \/\u003E\n\u003Cspan style=\"font-family: Arial; font-size: 15px; font-weight: normal; line-height: 1.15; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E所謂UAT(User acceptance testing, \u003C\/span\u003E\u003Ca href=\"http:\/\/en.wikipedia.org\/wiki\/Acceptance_testing#User_acceptance_testing\" style=\"text-decoration: none;\"\u003E\u003Cspan style=\"background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;\"\u003Ehttp:\/\/en.wikipedia.org\/wiki\/Acceptance_testing#User_acceptance_testing\u003C\/span\u003E\u003C\/a\u003E\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E), 就是對一個solution依照user提出的requirement(或是我們的story中的how to test)驗證solution是否正常. \u003C\/span\u003E\u003Cbr \/\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E所以這邊我先點出一個重點, UAT測試的是一個solution, 以我們做監控軟體而言, 測試最大的涵蓋範圍就有, UI, functional plugin, Client\/Server framework, recording server….所以他是一個整合性測試, 千萬不要覺得UAT只是拿來測試UI而已.\u003C\/span\u003E\u003Cbr \/\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E會有這個體悟是因為有天member在跟我討論如何驗證UI上顯示搜尋警報結果的功能. \u003C\/span\u003E\u003Cspan style=\"font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;\"\u003E這功能包括從server搜尋符合條件的警報, 回傳到client處理並建立model, 最後UI透過grouping的規則呈現這個model的內容.\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E問題就出在如何產生驗證資料, member認為應該是另外寫一段code從client的model拿到資料並根據grouping的規則, 再去跟UI呈現的內容作比對. 單就這方法而言如果只是測試UI的功能正不正常或許是ok的. \u0026nbsp;但這有幾個問題:\u003C\/span\u003E\u003C\/div\u003E\n\u003Col style=\"margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cli dir=\"ltr\" style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;\"\u003E\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E那誰要去驗證你寫出來的驗證程式正不正確.\u003C\/span\u003E\u003C\/div\u003E\n\u003C\/li\u003E\n\u003Cli dir=\"ltr\" style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;\"\u003E\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E就是我說的這個測試只能針對UI, 而不能是對整個solution做測試, 因為沒有測到client拿到sever資料以及組完model時的正確性.\u003C\/span\u003E\u003C\/div\u003E\n\u003C\/li\u003E\n\u003Cli dir=\"ltr\" style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;\"\u003E\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E想看看最前線寫test case的人員是DQA(或是PO跟user討論), 我想他們百分之百不會想到要用程式去產生一份驗證資料出來. 對DQA而言, 他們一定會先定義好測試條件跟環境, 然後針對各種條件就先把驗證資料蒐集好了, 這樣測試時才可以拿來跟solution得到的結果比對. \u003C\/span\u003E\u003C\/div\u003E\n\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E到這邊我要提出另一個重點, 就是測試資料跟測試環境的重要性, 這裡我有個慘痛的經驗, 就是我們的第一個自動化UAT的測試資料是用程式碼自動產生的, 也就是在test case要跑之前就先隨機產生測試資料, 我想就是這個錯誤導致member在驗證test case遭遇很多麻煩. 由於測試資料的不確定性, 導致test case每次測試時的驗證資料都不會是相同的.\u003C\/span\u003E\u003Cbr \/\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E測試資料環境的不確定性還會導致一個問題, 當發生test case不過的情況時, 你變成要去查到底是新增的程式碼發生問題, 還是測試資料或環境不合乎這個test case而造成的問題.\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E針對這問題, 後來我們就開始著手測試環境的建置, 針對每一個test case都應該要有他們測試環境跟驗證資料. 我相信要做到自動化UAT這個測試環境一定要花很多心力去建置. 但總比用程式去自動建置來的好太多了, 光想到當初開發跟maintain那些程式碼就讓我一度懷疑自動化UAT的好處到底在哪裡.\u003C\/span\u003E\u003Cbr \/\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E\u003Cbr \/\u003E\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"font-family: Arial;\"\u003E\u003Cspan style=\"font-size: 15px; line-height: 17.25px; white-space: pre-wrap;\"\u003E總結一下, 自動化UAT我認為就是把驗證test case的過程做自動化而已, 所以一個test case必須要先定義好以下幾點:\u003C\/span\u003E\u003C\/span\u003E\u003C\/div\u003E\n\u003Cdiv dir=\"ltr\" style=\"margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003C\/div\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cspan style=\"font-family: Arial;\"\u003E\u003Cspan style=\"font-size: 15px; line-height: 17.25px; white-space: pre-wrap;\"\u003E測試環境跟測試參數\u003C\/span\u003E\u003C\/span\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cspan style=\"font-family: Arial;\"\u003E\u003Cspan style=\"font-size: 15px; line-height: 17.25px; white-space: pre-wrap;\"\u003E測試步驟\u003C\/span\u003E\u003C\/span\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cspan style=\"font-family: Arial;\"\u003E\u003Cspan style=\"font-size: 15px; line-height: 17.25px; white-space: pre-wrap;\"\u003E驗證的資料\u003C\/span\u003E\u003C\/span\u003E\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cdiv dir=\"ltr\" style=\"line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;\"\u003E\n\u003Cspan style=\"background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"\u003E相信只要有以上的資料要做自動化UAT一定不是問題，歡迎大家一起來討論UAT。\u003C\/span\u003E\u003C\/div\u003E\n"},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/3079718817963420798\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/02\/uat.html#comment-form","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/3079718817963420798"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/3079718817963420798"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/02\/uat.html","title":"自動化UAT的一些體悟"}],"author":[{"name":{"$t":"Sam"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/08875986043772937726"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"32","height":"32","src":"\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh6b6igC9c9GOkfMpoXNsMMdlVBd65oi90a2wApPWHh6MuHRhFcaxWl4zV99lcqjw0_ZcPFF1sPcqVuhMeylZOg4cKjjVpMmo4ZXjYzzfMx_TH5yxI5CpMXsi-3vDlXOQ\/s220\/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG"}}],"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-7122050595714881214"},"published":{"$t":"2015-02-03T20:32:00.000+08:00"},"updated":{"$t":"2019-05-15T21:08:29.172+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"Programming"},{"scheme":"http://www.blogger.com/atom/ns#","term":"Testing"}],"title":{"type":"text","$t":"Unit test 的美麗與哀愁"},"content":{"type":"html","$t":"\u003Cdiv class=\"separator\" style=\"clear: both; text-align: center;\"\u003E\n\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjy3pK3oQDlOSMoXci80R7nDlkA2-eqaTX-ma-IwFR2E_zxUfjEM0lyUueNRd7WIiXAaVoJQxlz-HloRnEN2FtD2SDrqeHoNuXcDudAJ6dPFnc-9y_wIIDkKTPvkhkUy0kqRW4zXrmgl3B5\/s1600\/mother-board-581597_1920.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"\u003E\u003Cimg border=\"0\" data-original-height=\"1200\" data-original-width=\"1600\" height=\"480\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjy3pK3oQDlOSMoXci80R7nDlkA2-eqaTX-ma-IwFR2E_zxUfjEM0lyUueNRd7WIiXAaVoJQxlz-HloRnEN2FtD2SDrqeHoNuXcDudAJ6dPFnc-9y_wIIDkKTPvkhkUy0kqRW4zXrmgl3B5\/s640\/mother-board-581597_1920.jpg\" width=\"640\" \/\u003E\u003C\/a\u003E\u003C\/div\u003E\n\u003Cbr \/\u003E\u003Cbr \/\u003E\nUnit test (單元測試) 在我剛開始加入團隊的時候，有寫過一陣子。那時候使用的是內部人員自己開發的 framework。當時寫 unit test 的方法可以說相當原始，我們沒有特別去研究 unit test 可以怎麼作，stub 或 mock 更是沒有研究過的議題。大家就只是很努力地在每個模組完成後，補完大部分可能的 test cases。但是久而久之，隨著專案越來越大，架構越來越複雜後，寫 unit test 變成一個令人沮喪的活動，至少當時對我而言是這樣。原因是甚麼？\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n多年後，我在團隊中又剛好擔任到導入 unit test 的第一線角色。現在因為開發經驗比較豐富，對於測試應該怎麼寫，或是寫 unit test 的人應該專注於哪一部分有了一點點的感覺。在我還是個懵懵懂懂的 RD 時，覺得每次寫一個新模組的 unit test，前置大概要花好幾個小時，在寫一些該模組與其他元件「假」互動的部分，例如與資料庫溝通的模組，透過網路傳送訊息的類別，跟串流伺服器傳輸影音的函式庫。因此，寫久了會問自己，到底是在寫單元測試還是在寫假類別的程式。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u003Ctable cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"float: left; margin-right: 1em; text-align: left;\"\u003E\u003Ctbody\u003E\n\u003Ctr\u003E\u003Ctd style=\"text-align: center;\"\u003E\u003Ca href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgO5wnN1pWTeVvvA8wLw5DBlb6XdABWrXBvjSlJLWORawpyN_tCHes7kwxCA_1GHb3zgBapNdDIYkWwYgewuKRVI0ezJOr14fXv5AGxlbWrvtsw6o5UB_7VWDYCvhYTboj_jsUqEcpeI_S2\/s1600\/Mocking_blow_wow.png\" imageanchor=\"1\" style=\"clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;\"\u003E\u003Cimg border=\"0\" height=\"197\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgO5wnN1pWTeVvvA8wLw5DBlb6XdABWrXBvjSlJLWORawpyN_tCHes7kwxCA_1GHb3zgBapNdDIYkWwYgewuKRVI0ezJOr14fXv5AGxlbWrvtsw6o5UB_7VWDYCvhYTboj_jsUqEcpeI_S2\/s1600\/Mocking_blow_wow.png\" width=\"200\" \/\u003E\u003C\/a\u003E\u003C\/td\u003E\u003C\/tr\u003E\n\u003Ctr\u003E\u003Ctd class=\"tr-caption\" style=\"text-align: center;\"\u003E[圖片來源: \u003Ca href=\"http:\/\/www.wowwiki.com\/\"\u003Ewww.wowwiki.com\u003C\/a\u003E]\u003C\/td\u003E\u003C\/tr\u003E\n\u003C\/tbody\u003E\u003C\/table\u003E\n在這一次的 unit test 導入計畫中，我們選用了 Google C++\u0026nbsp;Testing Framework，這部分其實跟之前試用過的 boost 中的 unit test framework 大同小異。同時我們也使用了 Google C++ Mocking Framework，我花了一天的時間閱讀了相關基礎文件後，頓時有種為什麼以前要花時間寫那些「假」互動。原來以前花很多時間在做的事情，使用 framework 只要幾分鐘的時間就完成了，也因此寫 unit test 的人可以真正的思考測試的流程或是設計測試的不同案例。我為了讓實際開發者能專注於如何寫 test cases，也寫了一些包裝過的 utility，期望讓大家寫 unit test 時不要有沮喪的感覺。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n從目前的狀況看來，我們只是「有」了 unit test，但是我們還沒有思考覆蓋率，或是維護的問題，持續改善這一部分將是我們要繼續努力的地方。好消息是，我們的 CI 已經整合了 unit test 的部分，這多多少少也會鼓勵大家寫 unit test。只有當 RD 覺得 unit test 很好用時，他們才會願意花時間且認真的撰寫 unit test。我本人也不例外 XD\n\n\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u003Cdiv\u003E\n\u003Ciframe frameborder=\"0\" height=\"160\" scrolling=\"no\" src=\"https:\/\/dl.dropboxusercontent.com\/u\/20024300\/signature.html\" width=\"100%\"\u003E\u003C\/iframe\u003E\u003C\/div\u003E\n"},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/7122050595714881214\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/02\/benefitsofmockingframework.html#comment-form","title":"0 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/7122050595714881214"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/7122050595714881214"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/02\/benefitsofmockingframework.html","title":"Unit test 的美麗與哀愁"}],"author":[{"name":{"$t":"Laurence10"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/11918139345035584006"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"32","height":"32","src":"\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiWrwR3xMJyvkwsrgkTTJ9FNRNnQc6FX96fKbjOj4WDKDxp03__v5HQjZ0OEK497cqNmmWo6e_HeZK-Vi-xKUdvctyvKOpcafs_0QCzWLX3ZGWJULXdupafZHTrY3JizA\/s220\/bbb.jpg"}}],"media$thumbnail":{"xmlns$media":"http://search.yahoo.com/mrss/","url":"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjy3pK3oQDlOSMoXci80R7nDlkA2-eqaTX-ma-IwFR2E_zxUfjEM0lyUueNRd7WIiXAaVoJQxlz-HloRnEN2FtD2SDrqeHoNuXcDudAJ6dPFnc-9y_wIIDkKTPvkhkUy0kqRW4zXrmgl3B5\/s72-c\/mother-board-581597_1920.jpg","height":"72","width":"72"},"thr$total":{"$t":"0"}},{"id":{"$t":"tag:blogger.com,1999:blog-7905389674158671872.post-7407634318621169846"},"published":{"$t":"2015-01-28T13:50:00.004+08:00"},"updated":{"$t":"2015-01-28T13:58:04.947+08:00"},"category":[{"scheme":"http://www.blogger.com/atom/ns#","term":"Testing"}],"title":{"type":"text","$t":"哪會哪會同款測試這條路"},"content":{"type":"html","$t":"\u003Cbr \/\u003E\n\u003Cdiv style=\"clear: right; float: right; margin-bottom: 1em; margin-left: 1em;\"\u003E\n\u003Cimg src=\"data:image\/jpeg;base64,\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv\/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv\/wAARCAFXAQQDASIAAhEBAxEB\/8QAHAABAAIDAQEBAAAAAAAAAAAAAAMFAQYHBAII\/8QARRAAAQMCAwMICQMACAUFAAAAAQACAwQRBRIhBhMxFCI0QVFhc7EVU1RxgZGSotEHMqEjJDNCUoLB8BZicuHxF0NjwtL\/xAAbAQEBAAMBAQEAAAAAAAAAAAAAAQIDBAUGB\/\/EACgRAQACAgIBBAICAgMAAAAAAAABAgMREiEEEzFBUQUiMmEUI5HB8P\/aAAwDAQACEQMRAD8A65TU0DqWJzoIySwEksHYpOS0\/s8X0BKXokPht8lMgh5LTezxfQE5LTezxfQFMiCHktN7PF9ATktP7PF9AUyIIeS03s8X0BOS03s8X0BTIgh5LTezxfQE5LT+zxfQFMiCHklP7PF9ATktN7PF9AUyIIeS0\/s8X0BOS03qIvoCmVdVHEGyvNO3OM3NDrZbZfnfN\/F0Hr5LTeoi+gJyWm9RF9AVTDU41K5rTTsbdzC4uaRZptm6+PH5a8VHHPj0jyzdMYWRAOLm2BeSOBPGw100QXXJab1EX0BOS03qIvoCronYwXhs0cQjzjnNIJIzDv8A8N1FfHml+UMdwy58vaSeFuotHwQW3Jab1EX0BOS03qIvoCqmux8Qtbu4S8RauNrl9vfbivZQmvdPK6sDWsLGZGttobuv\/GVB6eS0\/s8X0BOS03s8X0BTIgh5LTezxfQE5LT+zxfQFMiCHktN7PF9ATktN7PF9AUyIIeS03s8X0BOS0\/s8X0BTIgh5LT+zxfQE5LTezxfQFMvkutxQR8lp\/Z4voCclpvZ4voC16p2mkj2kZSNheaQcx78h\/ceu\/Ytka4KRaJbcmG+PU2+e1Ni0bI6pojY1gyA2aLdZRZxnpbfDHmURrWtL0SHw2+SmUNL0SHw2+SmVQREQEREBERAREQEREBYWUQYslllEGLJYLKIMWCLKICIiAiIgIiICIiAqnaDDZsRw57KaV8U7OcwteW3PYbK2WFJjfTOl5paLV94a\/DgM7dnTSPqpeVOGYybw3Duy\/YptmsMqsPof67NJLPJq7O8uy9yurIpFYhtt5F7Vms\/M7UuM9LZ4Y8yizjPS2eGPMoq0LSl6JD4bfJTKGl6JD4bfJTKoIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgpcZ6Wzwx5lExnpbPDHmUUVaUvRIfDb5KZQ0vRIfDb5KZVBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREFLjPS2eGPMomM9LZ4Y8yiirSl6JD4bfJTKGl6JD4bfJTKoIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgpcZ6Wzwx5lExnpbPDHmUUVaUvRIfDb5KZQ0vRIfDb5KZVBERAREQEREBERARYRBlFgFZQEREBERAREQEREBERAREQEREBERAREQUuM9LZ4Y8yiYz0tnhjzKKKtKXokPht8lMoaXokPht8lMqgsEoTZahtdta2ipuS4ZVMFUZSyWQNuImhpc7Ui19Lddr8FYiZnpJtEe7aZKuGJry6VoyAlwvqLdy1f\/wBS8BfGXQNrKixsRHTk2+JsP5XMqyQzVsjJ2PqHy3kdO2Ytv1lx0Fm950t1KOOWczMFLim9s8buN8ZjjcRwDSRYj5XXTTBE97aLZZh0V36q4a2p3Rw6ssOOrM1vdmV3SbcbPVdPvfSUUJ645jke34Fchjpa1mI1EpFRNEXlxZM4BrO0ZzxC+oyd9Ixz44onNIzx1LC5mnVYrfPjY5r76lrjNeLe24dzoMQpcSphUUkoliJLQ4AjUceK9K1rYGaCTZWnZE7M6Elkruovvc2PWNf9m62RefManTriWHHmk9y0jAdpSIMSbieJASNcRBvCAevh8bLdnftPuWg7P7Nx1MGKPxHD3mRriYc7XAnQ8O1b8MU4zy\/phbe40stmdoXM2cqMQxarc8RzFuZ2p4DQKwodsMNr5HxRtnZK1heGSR2LwBfTt0WpQ4HiNRsbJE2llbLFV7zdOaQ5zcttAvdRU9bjO01DWej5qOGkia2R0rctyAdB28VutjxzyljFrdQvv+MsL9HNrry7p0u6tk1zWvwvwXtp8dpKnF5MMiEjpo25nOy80DTr+K0M7PVsmI12HmllFLCZpYnZTlc7LzRf5LYdiKKrDqzEK6B8Usxaxoe0g2A71hfFjrWZiVra0y21Q1VTyWLebqWXUDLE3M75KZV01LilRUP\/AK8ymgvzRFHmefeXaD5LkbWG49RB4bPvaYnhv4nMHzIt\/KsI5WSsD43B7TwINwVXuwqQts\/Fax3bcs\/\/ACtE20mxjZSaCTC68RU1Sc0j8gLw5puBlbYWPAm3XqpvXuxm3GNy3bFNpaHCK2GlqROXSjMXRxFzYxfi4jgND8irZrg9oc0gg6gjrXPMJ24xTHMSgw5tHQwSTtdm3pedLEgEW7AfmFt2HxnZ7ADy6pY5lM1z3OY0hrG6mwuSbAaJExPcJS9bxuq3ReSkxKlrd2IZgXvibMIzo4NPAkL1qsxERAREQEREBERBS4z0tnhjzKJjPS2+GPMooq0peiQ+G3yUyhpeiQ+G3yUqqPPX1tPh1HJV1LyyKIXcQCbfALlOPvpazHzW0GdtIw7yWOWIi73NcHAd1jc6cfeunYzX0OH4e+TEOdC\/+jLMubPf+7brXGcXrGxuLKG8MT6iSRjHuzOy3ygW67kDUHQArq8eO9uXP3MR112+KSjqMblFFTR\/01bnlfmdlytYOBJ\/u3Iv\/wBIV7HgmCRYdJBX1O9rqij3zIWy5ckrAczGgHibfwVqWJVFTh+HQ1tPOWPj3kEjgAbte0XHxsVR4dDUYtU7xriL6vle4k93x0W\/Ljva\/CJ011nHFPUs2+TGdk31kFTO2rxGMVe6dSzuJAhczmuA63Ndp2+\/RXXoTFDTPiwvAaCV0VJGx4IY17ZAc7HEHW9jZwPWFpbcKw+AGYyVFQ2IBxyjK0W7+P8AK6XsftTgtNhjJYjPLV1spEjBEQWkNJdqf3ZdSTxJJ7QFzZ8Xp+8tuDyK5d8Y6bFsLQ4lQbOmLFIWQTuqZZGwx\/tiaXkho7uz3q7q6+lomZ6mdkQtfnOtdV2A7RU2PiaSla7ctN4pDwlZctzDs1af9lUX6j0dc7CXYhSuDm00ZzRnTiQb9hGg49i5p3rp2Y4rNoi06h68N2\/w7F9oW4RQU1TMDfNOGWY23Hvt1X7StqsF+fcCx2XAaF2IUDJ3V8zi2UggMDRbKANdBztbda6Ziu2uI4KMIiGET1zq6Fr3uvZzHE8NBbS\/cmyaTvqG7aKKWpp4SBLNHGXcA5wF1Qx7Ww1glpqaJzK2KTdSxy2LYja5cXA2IAtwPEgaLwsw+kqXubWMjq5JGXdUPHPdrrrrYX7OC87zPyOLxdRbuZZUxTZtkdTBNbdysfe9srgeCmC5tBvcNxAQU5G\/paljonAk7yMtNw7t0BF+5dCo6uKspYqiJ12SMDh8Vv8AH8queOkvjmj0LC17aLbPC9mi1lY6R8r7ZI423LtbWWmT\/qri2cuhw2mYwG4a97ibd5H4XdXHa\/8AGGm16195b7tW9zNlsRLTY7gi46lVYxsPQ4nCyWjnkpHsYcga7NFr\/wAvVw6rLybPbdUm05OEYnQ7iadhaWk5o5BwIH4K2fBsJiwPDGUEE0skUZOTeuuWjsHcFjasx1aE\/W9fuHBq+SppKoSYfK4SQOOSQEtLXA8Qf577ro2zfLNt8Ca+s2gqM8LjHU07ImBjj32F3NI\/7rT9pHQT4xiMtPeCESvEZ4A20+Ivde79O9qKbAnVHpCOaOGeNpzhhPObp5H+Fz0tqdPO8fLGO80+Nun4Xs7T4ZVvrBK+Wd8YizWaxrWA3ADWgAak\/NW68VBitHiWHx19JOJKeRuYP4e+9+Cqp9vNmaepNPJisQeNLtDnNv2ZgLLduIerWs29obEi8dBitBikW9oayGpYOJjeDb39i9apMa6llEREEREBERBS4z0tnhjzKJjPS2eGPMooq0peiQ+G3yUqipeiQ+G3yUyqPLiFNS1VFLFWRNlgLSXtc24IXC8RkjMTJIS4UkL5XRMI1cA92W\/wK76RcLlW3+GCmrKhzaYiJ5Ewc0aEEAOAt1gtv\/mXV4toi+paM1Z47hpUYjxbDp6SYgCUEaOuGO4tN+v\/ALrGyuDV8dPNSR028qyXuMZeBzWjXisU1TE8BjGCOxtl004\/j+V63mKZ8T3zzU00Zs2oiBJAtwIFiRqvSmu49Sk9vOv+3+u0dbW1Zh9HQ0THR1jJWl7bTts8ygta5rcvAW7f4VbKaqd5EWYRulfLmc51g937nZRYC\/BZjjjdu6WjvJG0lz5N3kDnGw0b3AHXvX3iZfFTx3ymmkHNsCDbKSb\/ACWFMVdRz7ls5TE\/pGngpsarMIqqcUNaaPe2i3rGBrY2X1Fuvt1XQKrbLHaahqaDFsNpGyR3jfOXZ2SgtvcM7wes2XNXtbK8Axkuac2WzbDS5AtrwK2XEKh+KYJTyTc5zGhkxudS0Zb\/ABDQfivO8+s0jnHs9r8VSmfLGK7V2VJZLM2lq3Mgtug1rg0FvuA69fmvdR4rXseIJqyqmppWbosfK+w00A17NFXxwCklliiDg1rtLDXgOsr5lNmiQEEscDfMXW1+QXk852+njBSKftWNw6lgHJYsGw+OnjZCwUjXyPOoLy5wJd23cxqhdPPHiMsUNTK6KSMlsl73de7g3r4H+F7MFp5sN2dwWrMRO+a+FzBxIe4vj\/H+ZYqhwnijbO9j\/wBxdlHHnEHsuT8AF4X5HlXPu8dTEaeLirW1piGvhk1VTy1BxGJ9W0tbvW1RDWjnXuL5tGjh16hbdsNVuGE4hUVTsppZDGSQQcrRmBPfZ1r9ypuRuaTVTsZPVzjJDCyP+8SSB2njqeoe5X0OAYxDs66gifBSOMb3SyNcXvlkLTe+gA19\/Bel+NvOSZmI6hz+RTh1M9uV4piRkkkxV4zTTz72MOudM1wNerr+Kq21LqstYx4hfYyEA2zW6+4cVitZJJSwSSixyBo7GgAW0+ar35TLvGPAdfMACbgr6\/XGsR7Q8itYtMzPbfMGpmbNbV4ZNLWCfM9okJJDRm5t7kC9r3XVdpcSOF7PVlXH\/aNZljA4l5Nhb4lcX2fmmfGKndmpqXSiPeTDPGGudkdmb\/mbbvHvW+7d07cM2cwrCIXvc3ei5J5z8rTqfeSF5vkWj3bZn08cy0KtcKaON7nucwtuQ69+HX29Sn2bwur2yqzQUxbBS09nVE7jci50aAOs2KqNonNlqmQxSS5iA3LpzR5q72Uoa6GrpJaJr6mXlAuGxuAaARYk3AI1f8lwY6xrcvK8elLRW1o3K32omiwtv\/C2GiTkdIzPUDPbfSO1DT3DjbhqOxavNN\/Vc0oLCG5clrAk6BWO0krptpMUbNI2Hd1jjcHU6afwFUtxWqw\/GYJ6QRSPjiOUPsQSb6\/x\/u61X3e8xL9O8WI8Xwq2x13M\/wDb2UOO1OEYgMQw2VrpIiRLYXa5v+E9vb3LvUEglgZIOD2g\/Nfm6qdvZJniz56niGElrBr19fV71179LsYkrsClw+dxfLh78mfqLXatHw1HwC6MM6\/V435KtrxGWY1Py3dZWAsroeMIiICIiClxnpbPDHmUTGels8MeZRRVpS9Eh8NvkplDS9Eh8NvkplUYVPtLgvpnDTHGQKiLnwkmwJtbKe4\/g9SuVG9rz+06KxMxO4SY24HWYVJRV8hlDgY3Oux4u5jjb\/QdXHvXjpZZ5JiZGgMtfgRr8R3X49a7jjGzNBjbf67AHSAWbKwlrx8R5Fau\/wDStoc7dYzMBfm54WuI99rXXpYvLpERy6cWTx7TvXbRKfFchlgbTtD2DUuF7jqsvRI+PFp5i45WmOMkFxBD9bacOHFbgz9Kru\/psWcWki5igDXfMkr6j\/S+SMyWxfSQZXf1cXI7+cs7eTit8pGG8Obtpi97Y2ANLdLueA7S3V2mwC2bZKgmxcV2F5g2eJgnja\/RrzYNeL9QPM1HWFs7P0waI2RuxiUNYLNywtBA95urnZzYyg2arJauKqnnmkYWEykWAJBNgAOsBc\/kZ8eTHNW\/x65MWSLx1pxna3BKzDK90ctPNEwszE7sm5Glr8FLsbg0m1ONxYZLLuIowJJg45XOa0i7Wi2p4e667JiuCS43USRV2JOGGuYQ2mgBjcXEWu54OoHZ87rw4NsDg+B4rHX0dXWHduc9sUkmZuZwsTwvw715kY4h7FvOyWie+5bNNQ0s1HyWaCN9OABu3C4sOC1Wk2Xjr531lFW1FLQEAU0TgHgjrcA7UDhYFbcRG8Wzn5r4gooIIWxQtyRtFmtbwA7Fb4qZI1eNuGt7VncS1\/ZrD6KkxSuBqBVVEcmRk0rwX5bAuAA0ABPUFs0mYROyAF1jYE2uVEyhgje57GBrnauLQAT71LlyDmgu95WVaxSNRCTM2ncuM4vslivKaik3AmmGaVscZGbIT\/dvYOA+Y7CtPpsBxGornRxUM790c0tmaMaDYk92hHwK7rthS4rVYcx+FQMdUxOzMd\/fae1puLda1DB4Mfo8PxerxSjdEZKV4LjoHOLyf\/sV2Rnvx1LTGOtZmYeLZmklxOR2FUrGxOkqY5ZZhru4mOzn4l7jYdy2n9R8Jq6nB6etgyy+j2ve8PflLrgDSw1PdpxWu7EUeMUuKxSQzthpqiQGVuhz824Hy8l0yuo2YnQS0dTHmimblcA8g\/Ahc943PbK1YvXjLmDv0rr5MbieJmmndG0yTPdqx1udlA148F1OjooKCjipadgZFE0NaB2BaZV7NbXQVW8o8ZfWMzBzTPMWFtuF2gEFbdTNrTSRCqLTOGDeFp0LrarXGvprxViJmIrpy79RMDfQY6+sey9HXvDxIB+yQDVp9\/EfFarPTwTRbp7SwZ2tDraj3Lvk9BHVwPgqmNlieLOY8XBWtT\/pjgM05lbJVwm4LWsm0aR1i4K574Jm26y+m8P8rTHh9LNXblXJooJZyw3mvvGBotzj2D4BdY\/TzAa7BsKqJsRYIqmsm3johY5AAANR16L3YXsRgmFztqY6YzVTf\/fmdmd+B8AtgDQAs8eLjO5cvnefXPEUx11WGVlEW95QiIgIiIKXGels8MeZRMZ6Wzwx5lFFWlL0SHw2+SmUNL0SHw2+SmVQREQFhZRBhFlEGFBV1dPRQmeqlZFGNC5x0XoXmrqGmxGmdTVcQlidYlpPGysa32kvE3aDBJHhjcQpnOcbAB3EqzDWf4QucbP4fh3pTGJKqmEkdCS+NtzzbOdw+S+mbc4kHsqnT0xidLlNIGHMG9t1028fc6o1xk67dGs3qATM0EC4BPUtJxLabEhtA+ghqqegibbI6eMkPvbr6l5MR9LP29hZBURb8svAXfsDcp6u211hXBPzOutrOSPh0K6LRq7abFBtHJhzaqnoY4yA0zRkiT420ut3absBvfvWu+Oaa38sq2iX0VpO2+Ivqo5cPpiHRU4a+p51jcmzW\/6n4K\/xbH6aionSQSxzzuLmRsa6\/OHG9uAHWtQxmiNBsweXUbZaqpeJTU5QdXC7gTxB0WMe7Jr9NtZu8VFG9rqaGnLQ2ZlnNle0uc3vtziLi\/UuwUtTHV0kVTE4OjlYHtI6wRcLg8dMx0kVQKWQuNnF2g1I0tY5QdeIA966h+nU0smz8sckZiZBUOjjiP8AcFgbX6+K2WpqvJhFtzpsFZjWG0Eoiq62GF5F8rna2XrhmjnibLE8PjeLtc03BC5zilI\/BsfqqzFcMNfR1DyRJc80E6e49SuMR2jkihwugwBjG8sYN26QfsbewFvn8lstg9uPe\/8AhIv77bgXAC5NgFX0OO4biNTJT0dU2aSMXcGg2A961ZuN4xVU2L4TUvhFXSxFwlaLAtH7v4OiqcLgr2bGV1VA+BkRNiQ20lgdRf5WVr4\/U7n6Tn9OntcHC4N\/cs3XPqavxzCtjIq6KeExB4EYyXIaSQb\/ABsvRNtnVR4zNGCw0jacuYcv98R5uKw\/x7bnXa+pHy3m6XWknaDFW7O0lbPiFLTS1D3G74iSW9WVoXxh+1mI1GCYo+R0ZqaNocyQMsHAm2oT0L62vOG83S60el2mxqLBJsYrY4jAWBkDQLZn3tc93FfGDbX18uM0lNVVNPVRVWhETC0xOPAd6f499TP0epDfEWBwWVoZqXGels8MeZRMZ6Wzwx5lFFWlL0SHw2+SmUNL0SHw2+SmVQREQEREBEUckojLRYkuNgAEEiwVHvj6qT5Jvj6qT5IKHCtlzQ1mJSzTtmjr7gtDbZQST\/qq+m2JraGcNp8Ti5MHh2WSnDnWvwuVtu+PqpPkm+PqpPktsZr99+7HhDWcZ2Ur8ZqzvsSYKTNmYzcjNGOwFSYpsnPUYjTV2H1\/JZYI2x3Lbmw08lse+\/8Aik+Sb0+qk+SRmvGk4Q1bFdksQxerJqcUYabPma3cjOwdgK2ljBDA1g4MAGqb0+qk+SwZbixik+Sxte1oiJ+FisQ5Xi1PLhm0s0AcCZHuLg8XZJCSHWN\/lprovnFcfra7CIqCpZnihcyQvicQ\/JcgNJP\/AC6XW67R4FT43C3eNmiqIgdzMzQtv29oWnu2fxoTkDDHOjazJYPZr2WueHvXRi9K382q\/OP4tfqH5WVMr6XKQ\/M6RtmlgtfgP\/C6nsLh9Rh+zEMdTmD5XvlDXG5a1xuO\/hr8Vr+B7CPcBNim+ZGX3NE0NILbWAc74cB1WW+tkytDRC8AdywzZIt1VljrMdy1rEdlsYxCWaN+OO5HM8uMRZewve3FfdfsayWloW0NW6nqKBto5CL31vr8VsZnsLmKTTuXzLUtjibIbZXEC50tdYRmv1pnwhQ4dspJSw18tTW8orK6NzHSllgL93++CkoNmOS7NTYNNUB+9zf0jW2tfuVjFiYc54fC8BoLrgdQF1luJtyukdGQwENHWSetJyXn5IrCpodl6mHAKrCauuE8crcsNm2EXX56qvk2Ae\/Co6UVzRO2Vz3SmPiCLWtfuW0srJDWcnfG0Al1nX42t+V7FfWvE72k0rLWcW2TkrBh76OrFPLQsDGFzMzTa2tvgoYNjaiKnxOOTEGyvr2gZzHaxvcki62xFIzXiNbXhChZsyx2yzcEnmzWGkjW2sb3BsvJg2y1fh1dDJPXwTwQ3swU4DjpYa8VtKKerbUx9nGALKItbJS4z0tnhjzKJjPS2eGPMooq0peiQ+G3yUyhpeiQ+G3yUyqCIiAiIgKGX+2h\/wCo+RUy887g2WEuNgHHX4IPNXYg+lrmxBj3sdA5\/MaSQQR+V43Y451NzGO3oa277XAdYE6dXFWj+Svl3ri0vDSy9+o9SgFJQNBa3RjgAWB5y6WtpfuCDFNifKHhpp3xteHljiQc2U2PDgoWY5mayR9JJHG8MdmLmmwdcDT3gqSjo6OjbpJmfzucSes3Nh1KXk9Bu2x5W5WhoAueDdR5oPP6aL8OqaqKmfeGPeNDjYOFrjX4J6cZeQCB7t3cOLTcAi1\/hrx7l6GU9GynfTh14nixY55It2DXT4LApqNhdlkc3ONbSOHx48dOKCFuJSzU9c9sbWCBl43hwcHczMoRjQhqnsmJc1rHOsG2Iyl2Y\/wvbHT0ETJI48rWSNDXNBNiLW8l8upMOeSSxhvxuT3n\/U\/NBG7ETPROkjj3b942NucXFyRr38VGK5kDzCA6pmYHOdzQzKABfjx4iy9YhoxTmnLs8Z4hzy7+SoTQYcbl1ySTdxkdc34gm97aDRB8HGo7sywvc2YlsLgRzyCBbu1KjONllSQ+JzB+zdmxJfmte46raqeShoH53NDM7r2zEkNJNzYX01HUvinw6ijhLZXh73OLi8OIIJN9De6D3QzCopBLlc3M2+Vw1C+C9zaWEtaXaNzAC+i+97EyEtElwG2FzcqOSOWSijbE\/dvDRY\/BBBHLXZ3Z6cEWJbrbq4fP\/eiyJqwRue6nuSQGtGnvK+OT17TblYGYmxJHZppZSOp67OC2pFs1uFjl+XFZo+XTVxia4whr7kZQO7\/Q+SnpHVBcTM45cosCLa63UcUNeHje1DXCxBsLdX5UMtFiMsdjV2Jv+3TiPd2qdC1uEuq+SmrbsLJmucG2u7Sx11+OnyUb4cTDSWzB3YAR52\/8qaVaXCyqplJiLWloqhYDm2P\/AGVmy+UZuNtUkfSIigpcZ6Wzwx5lExnpbPDHmUUVaUvRIfDb5KZQ0vRIfDb5KZVBERAREQFhZRBhFlEGFlEQFhZRBhFlEGEWUQYRZRBhQ1VNymExF7mA8S3ip1hB4WYXGx7HCR\/MOaxIOtlgYTEDzZJBwvqF70V3KaeakomUmbI5zrgDnHsXpRZUVhLLKIMLKIgIiIKXGels8MeZRMZ6Wzwx5lFFWlL0SHw2+SmUNL0SHw2+SmVQREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERBS4z0tnhjzKJjPS2eGPMooq0peiQ+G3yUyhpeiQ+G3yUyqCIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiIKXGels8MeZRMZ6Wzwx5lFFWlL0SHw2+SmUNL0SHw2+SmVQREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERBS4z0tnhjzKJjPS2eGPMooq0peiQ+G3yUyhpeiQ+G3yUyqCIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiIKXGels8MeZRMZ6Wzwx5lFFWlL0SHw2+SmUNL0SHw2+SmVQREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERBS4z0tnhjzKJjPS2eGPMooq0peiQ+G3yUyhpeiQ+G3yX3JIyJhfI4NaOJcbBVH2ixcEXulwgyixcJcIMooRVQHLaZhzmzecOce7tWG1lO+URNnjMhuQ0OBJtx0V1InRR7+LeGPeNzgZi2+oHbZfWYKD6RRy1EMDQ6aRsbSQLuNhc9S+7hBlFi4S+iDKKMTRukdGHtLm\/uaDqF93CDKLFwlwgyiikqIYnNbJKxjnmzQ5wBce7tWZJo4Y3SSPaxjRdznGwARdJEXxHLHLG2SN4cxwu1wNwQvrMERlFi4WHODRcmwCD6RfDJWSMD2ODmngQbgqGXEKOB7mS1ULHMGZwc8AgdpRJtEdzL0ooTVQNhEzpWCIi4eXCxHbdfUU8UzA+J7XtPAtNwhuPZIixcKOaphp2h00rI2khoLja5PAITMQlRRQ1MNQHGGRsga7K7Kb2PYpLhCJifZTYz0tnhjzKJjPS2eGPMooyWlL0OHw2+SpdrqiP0S6iBcaipIETGtJLrOF1dUvRIfDb5KXKL3ssqzqdsZae\/Fq1u0TKeJ8zY2zbp8b9RbL+4C2gv13XnhqcZmiiecRqGmamlkcAwc0sOgGnWt3yi97JlHYFt9WPpjx\/tpM2MYu+WkBm3BfTxOYXc1sjj+6+hv7tFaYXXVMu0VXSzTPmYMxbk\/ZGAQMpFtD8dVsWUdgTKOxSckTGtEVc\/lhnpamdojkLMInM7LD9we8HT\/LdSNoqmnlojDLLTy+j5Z3vY3XMTmt81vmUdizlHYFlOafo4NFrJ6+uoah7jIHuw2KQljLEuzG4va\/wUwqTT4vykVlXNGcODorD+1IvccOPWtzyjsCZR2Ker1rRxc+lxCvrMPqGOe+oa2WCSLPqbl2ovYX1HYvVNjGKNpYGvmljeZZG1TjzRE8ftaDY83zW75G9gTKOwK+rH0cZ+2tYZPidXi0LKirIjjpGSvEbebI4kjiR8Vfh8olkztAiaOa6+qnsOxVtW7EmzScnjLxfmZi0Ntl99\/wB3Hu4arVadsojTUanFbVeMYnRcoME0lPEyaIZNRcE3IOg69FC7HsWGFUkstZIXMqJGPjYMsszQbNyktsePYLraYp8ZeWNNGxoc9hJLQLM0DuvjqSO4KNsm0D3tZuI25YhmLmixcSAdb9QudPwtPCft3R5NNa4f+0pJcYxf0uWCedtRy1rGUZj5joDa7jp7ze6+8MxHGDilDLNVzSRVFXPA+FzBlDWk5TwuthiOMukbvIYmMzi7hYuLc3v\/AMP837lFfHY95aJslrBl8g1Jdrx6gWj4K8Z+2M+RWY1xhre1ra3EcZqH0dI+UYXC1zZL2yvuHEjt0AClrKyvxZ+KltRM2jjw9krIQzR7nsNwdP4WwF2PGHKIGCTdauu25fb324r2UPLnzzGrhEcWRgY27Trd2bh8E4f2V8nURHH2aPRYpjFPQSx4bPPVNhoGl4fFbcSXAsNBfS5trwUz8XxXktVyKvqJ6ds9OyKpfGM13Gzxw1AXQAwDgAm7aOofJThP2ynyqzO+EKHZ2evIxGmqZn1DqaoLIpJAAXDKDrbvuvZiVcykweSStO7c9hZYC9yQbcFZhoHUELQeIWcRqHFmmcm5jrbnwrMWoKPD6Rkho2ilaWF2gL76g6G\/u0UeI0M8tRicjpZi41ULSA0WcDbu6l0XIOsBMg7Amnmz4O41NumrbQQtirMLdWMfNh0OYTc24zWGUuAXixvGOTtiGCufBGIjIwxtysec2oy5dT8luxaCOCxu29gTTbfxrTvjbW2nT12MuditRBPL\/Vms3UQjBHOaLnvtqvFVVdXWU7oxNLWUjKmnMcz265r84cNbaLf8g7AsBgHAD5KaYz4lpjU3aHBU1dG2Ru9lpaWSum30zG6iw5o4dZW07N1FZU4NDLXA7431cLEi+hI9ysyxtrWC+gLKxDZh8ecc75bhS4z0tnhjzKLOM9LZ4Y8yiOx66fEaVlPEx0tnNYARlPG3uUnpOj9d9p\/CImw9J0frvtP4T0nR+u+0\/hETYek6P132n8J6To\/XfafwiJsPSdH677T+E9J0frvtP4RE2HpOj9d9p\/Cek6P132n8IibD0nR+u+0\/hPSdH677T+ERNh6To\/XfafwnpOj9d9p\/CImw9J0frvtP4T0nR+u+0\/hETYek6P132n8J6To\/XfafwiJsPSdH677T+E9J0frvtP4RE2HpOj9d9p\/Cek6P132n8IibD0nR+u+0\/hPSdH677T+ERNh6To\/XfafwnpOj9d9p\/CImw9J0frvtP4T0nR+u+0\/hETYek6P132n8J6To\/XfafwiJsPSdH677T+E9J0frvtP4RE2KzE54qipa+J2ZoYBexGtyiIg\/\/9k=\" \/\u003E\u003C\/div\u003E\n\u003Cbr \/\u003E\n很久很久以前，當我還是一個小小的組長時，曾經努力地推過 TDD，也努力地要求成員們能夠為寫出來的 code 加上單元測試。那時候還特別開了一次會，找所有的人一起討論各種 domain 的程式應該怎麼進行測試。很遺憾地，那一次的努力以不了了之告終了。現在在我們還在 release 的軟體 source tree 裡頭，還躺了不少的 unit test 程式碼。那一次的推動，讓我有了一個感想，那就是在台灣，要推廣寫程式的人自己寫單元測試，看起來是不可行地。於是我的想法開始往另一個面向偏轉：一個人寫 code，一個人寫測試。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n幾年過去了，我們現在的組織裡也有了專門寫程式進行測試的人，可是開發者與撰寫測試的人數比卻是接近 15:1。可以想見，大部分的程式是無法被包含在內地，只能挑選重要的模組進行單元測試補強。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n而最近剛好有機會買了 Google 軟體測試之道。這一本書的名氣應該不如 Google 模式，但我覺得他對我的啟發要勝過 Google 模式。原因很簡單，要找到好的人才的道理大家都懂，但你得先有好的條件與環境才能夠吸引夠好的人。好的條件與環境除了薪資優渥、公共設施壯觀、擁有自己的餐廳...等管理處可以幫忙的事情外，我覺得更重要的是要讓成員有引以為傲的感覺。這種感覺來自他所從事的事情是不是夠有效率、是不是夠酷。夠酷的事情才是他們願意拋頭顱灑熱血(誤)的動力所在。Google 模式裡頭提到很多夠酷的措施，但我讀了 Google 軟體測試之道後才明白，快速才是 Google 的制勝之道，擁有了讓對手聞風喪膽的速度，就是一種酷。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n而這種快速，所憑藉的是品質保證。每當你做一個修改，能在最短的時間知道對於原有系統有沒有負面的影響，這時候你就敢於修改。傳統上我們在面臨軟體 deadline 時會有兩種態度。一個是初出茅廬的團隊，因為初生之犢，所以無所恐懼，該改就改，但也陣亡很快。所以最終通常以熬夜做收。另一種則是久經沙場的老將，在 deadline 來臨前，會對任何修改有無限的恐懼，因為他的記憶裡浮現了一幕幕過去的慘痛經驗。想想看如果今天當你做完修改後 10 分鐘內就會知道有沒有改出 side effect，你還需要戰戰兢兢嗎?\u003Cbr \/\u003E\n\u003Cbr \/\u003E\nGoogle 軟體測試之道所談的就是這樣的概念，它闡述了 Google 如何由草創期的傳統測試手法，進步到今天的高度自動化測試。高度自動化有多高呢? 在這本書的序裡頭提到，Google 每天都會在幾百萬的原始檔裡頭測試，並釋出幾億行的原始程式碼。每天，數十億次的建置動作推痛在數十萬個瀏覽器實體上所執行的幾百萬次自動測試。以 Google 目前 2 萬人的規模，等於一個人平均每天有 100 次以上的自動測試。你的團隊平均值是多少呢?\u003Cbr \/\u003E\n\u003Cbr \/\u003E\nGoogle 一開始也不是就有今天的樣子，一開始 Google 在工程部只有 1000人，僅有 50 人全職的測試團隊。這個團隊被稱為測試服務，主要的工作是 UI 驗證工作。看起來跟公司的 DQA 部門的專長很類似。後來當 Google 的業務成長到不只是搜尋與廣告，測試工作變得複雜了，於是原來的測試做為不夠用了，他們開始尋求改變。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n第一個改變是，測試的人也必須會寫程式。這個容易些，因為 Google 的招牌是蠻好用的，他們可以順利找到人，不過有一度，好的測試者，不久後就會被拉到開發團隊，因為 \"可以創造的貢獻會更多\"。要解決這個問題，他們的測試頭，開始思考，應該讓整個團隊都為品質負責，才能改變風氣，測試才不會在組織裡只是陪襯的角色。可想而知這樣的改變，在 RD 內部遭遇到強大的抗拒，因為工程師覺得他們受到威脅，一種必須在測試工作裡頭扮演更重大角色的焦慮感。那個頭頭卻有著驚人的執著，因為他覺得 \"Google 是一家專注在創新上的天才們所建造的公司，而這種企業形象就是與漫長的產品推行週期不相容\"。而且 \"隨者使用者人數的快速增加，由臭蟲所造成的技術問題以及結構不佳的程式碼，將會終結這個程式設計師的樂園\"。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n所以他怎麼做? 從一個團隊開始，從工具開始做起，可想而知是前期面臨了重重的困難，尤有甚者，Google在那個時期因為業務的擴張，面臨強烈的測試人手不足，而更糟的是，他們併購的公司有幾家是所謂 rick \u0026amp; dynamic 內容的應用程式公司，例如項 Youtube, Google Docs 等。而危機就是轉機，在當時的氛圍下，要純用手工測試顯得更加力不同心，所以他在推動上反而找到了施力點。慢慢地一些架構建立出來了，有些開發者感受到這接測試架構與測試準則所帶來的好處。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n時至今日，Google 的工作裡頭，測試已經是每個開發者必須執行的工作之一。他們的測試共分為三類：大、中、小。跟 Google 一向的原則類似，定義簡單明瞭。小測試就是單元測試，是由開發者自己行撰寫，採用假資料(mock)，主要驗證程式碼的流程與錯誤處理邏輯。這部分是很關鍵地，因為通常錯誤的路徑在傳統的測試裡頭都是最後被測試到的，但常常在最後關頭卡住出貨，小測試通常在幾秒或更短時間就會測完。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n中測試也是常以自動化進行，主要牽涉到兩個或更多函式間的互動，一般稱為整合測試。在 Google 是由 SET 也就是開發者以外的人\"推動\"，但還是由 SWE 也就是開發者撰寫這樣的測試 (開發者很辛苦地 XD)。這類測試是自動化測試的核心，大部分時間再跑的是這類測試。在後續開發循環當中，這些測試也可能會被手動執行，隨時確保城市的品質。中測試的環境可能是模擬或者真實。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n大測試則會涵蓋三個或更多功能，一般來說都是在真實的環境與資料中驗證。可能需要數小時甚至更久的時間。大型測試要處理的是\"產品有沒有以使用者可以預期的方式產生期想要的結果?\" 通常就是整個產品跑起來運行時的測試。這類測試仍需要 SWE、SET 等幫忙寫自動化組件。所以你可以發現，SWE 基本上需要參與所有測試的過程。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n是不是所有東西都自動化，答案當然是不可能，但是可以利用錄製技術將相當程度的手動轉成自動或半自動。這些努力都有助於後續在軟體進行回歸測試的時間節省。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n這本書的很多篇幅在介紹 Google 內的人員編制與責任工作，跟一些人的訪談，我覺得不容易歸納，不過光上面所提的一些重點，我覺得就受益良多了。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n最後回到開頭的故事，最近我們在導入新的流程，也看了不少書，我慢慢了解之前失敗的原因了，因為單純的單元測試起不了作用，沒有環環相扣的自動化架構配合，不容易看出效果，所以當工程師看不到效果，就不會執行那多出來的工作了。\u003Cbr \/\u003E\n\u003Cbr \/\u003E\n我們的自動化架構已經ready了，把你的架構建出來吧!"},"link":[{"rel":"replies","type":"application/atom+xml","href":"https:\/\/blog.rd.vivotek.com\/feeds\/7407634318621169846\/comments\/default","title":"Post Comments"},{"rel":"replies","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/01\/blog-post_36.html#comment-form","title":"2 Comments"},{"rel":"edit","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/7407634318621169846"},{"rel":"self","type":"application/atom+xml","href":"https:\/\/www.blogger.com\/feeds\/7905389674158671872\/posts\/default\/7407634318621169846"},{"rel":"alternate","type":"text/html","href":"https:\/\/blog.rd.vivotek.com\/2015\/01\/blog-post_36.html","title":"哪會哪會同款測試這條路"}],"author":[{"name":{"$t":"perkins"},"uri":{"$t":"http:\/\/www.blogger.com\/profile\/17509020938165298852"},"email":{"$t":"noreply@blogger.com"},"gd$image":{"rel":"http://schemas.google.com/g/2005#thumbnail","width":"16","height":"16","src":"https:\/\/img1.blogblog.com\/img\/b16-rounded.gif"}}],"thr$total":{"$t":"2"}}]}});