2012年7月14日 星期六

為什麼軟體開發者需要在意軟體品質指標 05

作者: TonyQ (自立而後立人。) 看板: Soft_Job
標題: Re: [心得] 為什麼軟體開發者需要在意軟體品質指標
時間: Sun May 27 16:42:46 2012

※ 引述《semop (semop)》之銘言:
: ※ 引述《guest2008 (guest)》之銘言:
: :  結論:請先斟酌專案狀況,不需特別的去擁護 test case 的建立或提出議聲。
: 其實反過來說,如果要製作高品質的軟體,測試反而不是重點。
: 完善的軟體架構,特別是內建的驗證、確認和錯誤處理程序,才是最基本的工夫。
: 所有支持測試的論點,都可以用在軟體架構的完善之上。
: 比較極端的時候,這部分可以佔到程式碼的三分之一,就是要追求任何問題,
: 都不能延遲到問題發生的地方之外,才發現和處理。
: 所有系統問題都有內建的錯誤處理,所有輸出入都有內建的資料驗證,
: 所有操作流程都有內建的狀態檢查,所有程式碼都要經過人工的 code review...

        前公司是人工 code reivew 跟 CI 並行,

        code review 可以幫忙解決一些問題,但經過人工 code review 的東西,
        再經過實際 test-case 跑來測試,效果會有加成的好。

        code review 可以避免蠢問題,但一樣不是「沒問題」。

: 嚴謹的開發過程,本身就是最佳的軟體品質增進辦法。
: 這時 test case 的必要性就非常低了,例如資料輸入都已經統一經過驗證程序了,

        你的架構仍然需要驗證,所以你需要 test-case 。
        有 code 就需要驗證,test-case就派的上用場。


        你資料通過「驗證程序」,假設你講的是 data validateion,
        data validation 的 code 一樣需要經過驗證。

        你怎麼知道你今天寫得這個 regex 或這個驗證條件是對得呢?
        會不會你根本就寫錯驗證條件,code reivew 也沒發現呢?


        這是有可能會發生的。


: 再餵入擺明通不過驗證的資料,有什麼意義呢?

        validator 自己也需要驗證,

        另外通常會餵通過驗證跟不會通過驗證的資料,
        succee test 跟 fail test 一樣重要,

        因為要確保 fail 是真的 fail , succee 是真的 succee ,
        不是我不小心寫了個 if(true) 所以怎麼樣都對。


        這當然有意義,所有 test-case 的書都會提到這件事情,

        我不太理解對這種基本原則跟基本方針都不知道的人,
        到底是在跟我們談什麼樣的 test-case 。


: 以前的程式設計就是這樣的,完全不做外掛的自動化測試程式,
: 有什麼需要檢查的地方,就通通寫入程式當中,除非是一定要人工判讀的結果,
: 但那就表示軟體的設計本身就有問題,才會輸出這種東西。

: 現在有些人提倡 test case, 是為了要快速開發卻又要減少 debug 的不確定性,
: 所以付出一定的檢測成本來達成這個需求,但並不是所有狀況的最佳做法,

        如果你說得是把所有的 error state 蒐集起來,
        做好完善的 guard statement 確保東西出包了都會運作,

        出包了都會有個「回報給 microsoft」的 ui(笑),
        那你說得也是一種軟體開發的方法,但不是一種作 test-case 的方法。



        那如果你說程式碼裡面塞滿一堆 warn 或 error log ,
        在狀態有問題時叫給系統聽,一樣不是一種作 test-case 的方法。


        test-case 是自己準備好 input - output ,
        去驗證可預期的資料範圍內出什麼事情,

        不是丟著等人家來跑,完全是兩回事。


: 主要是應用在商業系統開發和維護上。
: 而在目前輕量級的軟體形成潮流,且相當重視創新價值的時候,
: 由於軟體價值的不確定性高,軟體可能非常有價值,也可能一文不值,
: 就又出現完全不搞測試的做法,先儘可能用最低成本快速開發,
: 確定軟體具有商業價值,再投入較高成本重寫有較高品質的新版本,
: 就是另一套很多人提倡的新做法了。
: 總之,歷史上從來沒有任何一個軟體方法,適用於所有的可能狀況,
: 這就是所謂的 "No Silver Bullet" 的原則了,要提倡什麼方法都好,
: 但請先確定適用的領域和前提,不要太過度相信特定的軟體工程方法了。


        其實這個問題是不需要談 startup 或產品開發的,
        純粹就是「寫code」這個開發階段,可以解決的問題。


        如果一樣的需求、一樣(可能會變動)的目標,
        有作 test-case 可以讓你縮短專案的開發時間 1/5 ,

        並且讓你開發起來更心安,
        你需要考慮他是 startup 或產品開發的專案嗎?


        不需要,對吧?


        你們談 startup 跟產品開發有差異的前提,
        都是 test-case 賺的是後期跟不改動下才賺得到的成本,

        但不是的,他在你一定的開發週期(三週以上),就有機會賺回來了。


        這麼說好了,把用人工測試的東西,盡可能的改用機器測試,
        只要人工測試的時間會大於寫 test-case 的時間,就是有賺。

        這樣能節省下來的時間,遠比你們想像的多很多,這純粹是經驗談。



        當然,我同意「沒有銀彈」的說法,

        碰上一個認為「寫 test-case 只是浪費時間」的人,
        或者是寫 test-case 就是要寫到「程式沒有 bug 」的人,
        碰到一個「test-case 好神好厲害所以非得要寫 test-case 」的人,

        這都是會賠時間的。


        所以開頭的那篇文章,我只想說如果你用這種心態作 unit-test,
        即使給你 50倍的錢跟五倍的時間,你也作不懂 unit-test 的好處在哪。


        因為你一開始觀念就不是在賺時間,要窮舉的狀況下,
        人工跟 unit-test 都一樣是做不完的。



        但是碰上會用的人,知道哪些容易會一直進行手工測試的人,

        比方你剛剛說得 form validation  如果沒包元件的話,
        通常是最容易會有 bug 跟需要被測試到的東西之一。

        這賺起來的時間是你不能想像的多。


        我只能說, unit-test 現在的地位大概就跟當年的版本控制一樣,
        當年一堆人亂用版本控制,拿它當 ftp 用,還怪版本控制太慢太麻煩。XD

        現在 unit-test 的狀況,確實也很有這個味道。


        ---------------------------------

        Anyway ,我無意說服你們用它,
        開發工具這種東西你不喜歡就是不喜歡,

        但是這跟他適合 startup 或者適合大型商業專案沒有關係;

        我用它只是因為他可以省我時間,
        如果你覺得他不會省到你時間,那你可以不要用那是你的自由。


        但我要說的是一樣在 startup 或專案公司,
        這東西我都引入使用過,都有得到效果。

        你們說得理由不是真正的理由,那只是一些常見的迷思。


        你們並沒有論述到 unit-test 真正的問題核心,
        unit-test 真正的問題核心,我認為是「人」。


        想要窮舉所有測試案例的「人」是不現實的,

        想要用 test-case 測所有東西,完全倚賴 test-case 的人是不現實的,
        寫了 test-case 之後就不去檢視 use-case,
        就不會從使用情境中找到新的 use-case (這是我們在手動測時常做的),

        這樣的人都會害專案花時間。


        能夠用 test-case 來節省自己手動測試的時間,
        並且不在那些自己不太會手動測試的地方寫 test-case 的人,

        會幫專案賺很多時間。


        但這些東西都是「現實的」,就是有人可以這麼用,
        而你們只是沒辦法想像跟拒絕去使用而已。:P


--
對我來講,寫 test-case 就像是:
「雜事交給不重要得工讀生去作,我可以專心而安心的去面對重要的事情。」

btw 軟體開發我覺得最大的問題也是「人」,有神一般的架構也擋不了笨隊友。
--

        Life's a struggle but beautiful.


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.78.26
※ 編輯: TonyQ           來自: 114.25.78.26         (05/27 16:46)
※ 編輯: TonyQ           來自: 114.25.78.26         (05/27 16:53)
※ 編輯: TonyQ           來自: 114.25.78.26         (05/27 16:54)
→ Ting1024:精彩                                                   05/27 18:02
推 art1:推!!                                                     05/27 18:15
→ andymai:test case另一個問題是:原來的程式改了,所以test case也   05/27 21:10
→ andymai:要跟著改,有多少個 test case 就得改多少個~除非...test   05/27 21:11
→ andymai:case 能自動跟著修改的程式動~這樣頂多改改輸入和輸出...   05/27 21:13
→ andymai:但是怎麼樣都不能否認它可能會造成另一個維護的工~另一個   05/27 21:13
→ andymai:寫錯的程式~這樣花費的時間對那些頻頻更動需求,吃到飽的   05/27 21:15
→ andymai:工程師來說~是好是壞...可能到最後還是得看客戶來決定      05/27 21:16
→ TonyQ:你可以換個角度想,你改了 code 你一樣要手工重測一次,      05/27 21:41
→ TonyQ:與其說是維護那個東西,倒不如說是把舊的test-case砍掉重寫   05/27 21:41
→ TonyQ:如果你寫 test-case 跟手工重測差不多了多少,重寫一個也一   05/27 21:41
→ TonyQ:樣賺得到時間。不要只看他增加的時間,要看他類比的對象。    05/27 21:41
→ TonyQ:再者如果介面切的乾淨,基本上舊的東西不太有機會動。        05/27 21:42
→ TonyQ:真的動了,就表示也真的你就是改變行為,本來就該review (   05/27 21:42
→ TonyQ:類比手工重測)。                                          05/27 21:42
→ TonyQ:所以這不能算是 test-case 的問題。                         05/27 21:43
→ TonyQ:這也是常見對 test-case 的迷思之一。                       05/27 21:43
→ TonyQ:既然提到了,所以就要也提一下, test-case能寫多快就是重點  05/27 21:48
→ TonyQ:基本上都有些方便的工具可以幫你作這些事情,只是需要練習    05/27 21:49
→ landlord:同意TonyQ說的,透過自動取代人工,且可重複使用          05/27 21:59
→ landlord:人工時間成本與誤差成本*n 跟 撰寫自動測試成本*1 來比    05/27 21:59
→ landlord:n夠大,就划算。這個夠大,基本上>=2就夠大了。           05/27 22:00
→ landlord:也的確不是所有場景都適用自動測試。                     05/27 22:00
→ landlord:所以懂得選擇場景, 在對的時候事半功倍,這就是價值       05/27 22:01
→ landlord:如何降低自動測試的開發成本與維護成本,也是一門功課     05/27 22:01
→ landlord:而且是一門很值得投資的學習課程                         05/27 22:01
→ andymai:但是這建立在"寫 test case 跟手工重測"差不了多少的情形   05/28 00:55
→ andymai:下~而且...這個 test case 不能太複雜~不然...到時候可是   05/28 00:57
→ andymai:兩邊都要debug...                                        05/28 00:57
→ TonyQ:本來寫 test-case 就不應該跟手工重測差很多或很複雜。:P     05/28 01:22

沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.