淺談軟體工法 - 做軟體一定要爆肝嗎?

文 - 朱峰詰

我們都知道一個軟體開發的最終目的就是要得到一個高品質的軟體產出,而一個完整的軟體開發會碰觸到的兩大議題:專案管理與軟體開發流程,這兩者是密不可分的。專案管理重視的是領導與統御、軟體開發流程重視的是產出的一致性。我們這次討論的重點是軟體開發流程。

軟體系統的開發最難掌握的就是需求,因為需求往往不明確且經常變動,導致無法界定專案的範圍與時程,而錯估了人力與成本。因為人力與時程的壓力而讓團隊爆肝,卻不一定會有高品質產出。

軟體人員之所以還會存在,都是拜有新鮮的肝需求「經常性變動」所賜,軟體開發界唯一不變的真理就是需求一直在變,所以軟體開發不應該視善變為畏途,這就是軟體從業人員真正的價值。

而我們要如何做呢?首先要了解軟體開發流程所扮演的角色,軟體流程是軟體開發的方法與步驟,幾乎所有軟體工程的活動都與流程有關,但這也是最麻煩的部分。所以選用適當的軟體流程可帶來許多優點,例如:提高軟體開發速度、改善軟體品質、改善專案的追蹤與控管、降低風險、減少爆肝的機率,及改善與顧客之間的關係等。若選用錯誤的流程會減緩開發速度、產生不必要的問題並遭遇挫折。

如何來選擇一個正確軟體開發流程呢?軟體開發流程比較常見的可分為:線性流程(Waterfall)、多循環流程(Agile、RUP...)、編碼與除錯(Code & Debug)。線性流程的主要特性是在確認完前一階段的工作完成後,再進行下一階段。一旦進入下一階段之後,就很難回頭。線性流程的每一個工作階段定義明確而且嚴謹,必須遵守流程的規範進行,不允許跳躍或更改其中的步驟。各個開發階段如需求分析、系統設計等都須按部就班地執行。多循環流程主要特性是不要求完成一個階段之後,才能進入下一個階段;主要的核心思想是「及早發現問題及早治療」,但缺點就是會讓人感覺沒有目標、程式碼一直在修改,進而造成專案不易控管。編碼與除錯的主要特性是沒有明確的軟體流程,主要是用在小型的軟體開發、團隊人數較少或是示範性的程式。

以上講的都是在描述整個軟體開發流程的方法,在實務方面,筆者常會在軟體的開發階段遇到以下幾個問題。在需求分析與確認階段,常會遇到與客戶需求產生認知上的差異,雖然有做出類似雛形文件供確認,但到驗收時還是會進行相當幅度的修改,這對整個專案成本是很大的損傷。第二點就是當需求確認後要進行專案的預估。客戶會對所提出的時程有相當大的疑慮,客戶常常認為只需要花很少的時間就可以把這個功能做出來,為什麼要花這麼多的工時?再來就是系統分析設計與程式撰寫的階段,會發現明明有規範 coding standards,但是為什麼產出的程式碼品質非常的不一致,導致後續維護上的困難?

以測試階段來說,通常程式設計師寫完後會進行黑箱測試(測試人員並不需要對軟體的結構性有足夠深層的瞭解,進行的測試是著重於軟體的功能面,所以也有人稱之為功能測試。)但測試總是會有盲點,客戶並無法在第一時間就掌握住您撰寫出來的到底是不是他們真正想要的,等到該功能開發完成,可能已經過了一周,此時再交給客戶進行白箱測試(資料流程面以及控制流程面),這時可能也會造成專案時程的問題。在整個軟體的開發流程上,最大的問題是,我們跟客戶間並沒有一個很通透並且統一的溝通平台,而衍生出一堆問題。

筆者的解決方法是,在需求分析與確認階段,系統分析師與客戶在做需求確認時必須提供動態的雛型文件供客戶確認,以降低需求認知差異,並節省未來大幅修改的時間。在時程預估方面,我們會導入功能點的預估方式,以使用者的觀點預估,排除該領域的深度與技術的難度,以協助專案經理判斷各階段所需時間。

在系統分析設計與程式開發階段,資通委外服務團隊會建議整個開發流程是圍繞在軟體架構為中心來進行軟體的開發工作。首先會由架構師與相關專家溝通並萃取智慧將其抽象化,並將系統功能分為同質性與重複性高且不容易變動與經常性變動的部分。我們會將前者當成系統主框架,將後者從系統主框架中抽離出來並且降低與主框架的耦合度(Loosely Coupled),以利日後維護與抽換。當框架設計完成後,團隊須遵照架構師定義的框架進行開發。但專案的時間與成本都非常寶貴,若需要很長的時間教育團隊了解框架的運作,會非常耗費時間。所以我們會輔以自動化工具協助程式開發人員產生軟體的框架與重複性高的程式碼,這樣可以很容易規範團隊的開發風格,並有一致性的產出。

在系統交付與測試方面,資通委外服務團隊會以使用案例或是功能點做為階段的交付基準,並撰寫 Test Case 與 Unit Test 程式碼。每天晚上都會進行 Daily Build(將程式碼進行編譯與自動進行案例的測試)。Daily Build 能具體展現專案的進展。對於軟體開發而言,如果可以將進度的差異控制在一天內,將會是相當理想的。當編譯完成,系統就會自動佈署到測試機,供客戶隨時隨地連進該專案網站(Project Portal)查看與測試目前程式的開發狀態,隨時可以取得相關資訊,讓客戶安心與有信心。

各種軟體開發流程都各有優缺點,在執行的時期會遇到很多的問題,也必須持續思考與創新,不要用舊思維來解決新問題,並繼續找出對每一個團隊最有利的開發方式。

>> 回電子報首頁

推Plurk