開發詳細資訊

軟體開發包括將軟體架構設計師的願景轉化成可行的應用程式程式碼的重要工作,此程序可產生所需的結果,可在預先定義的情況下運作,穩固而且安全,可在指定的參數內執行,並且以最佳效率及運用可用的資源來達成這些目標。這項工作乍聽之下可能令人望之卻步,不過新式的軟體設計技術、工具、方法以及開發環境,都可以讓小組在建立軟體時,以邏輯和井然有序的方式進行工作,充分提升成功率,減少白費力氣的可能性。

開發的技術

一開始就設計不良,通常很難成就好的軟體,現在有許多工具和技術可供設計人員、架構設計人員和開發人員運用,大幅增加設計成功的機率,進而產生優質的軟體。雖然開發人員必須遵守設計規格,但是這項工作也必須具備將可行的系統和元件的互動方式視覺化、了解要執行應用程式的硬體和基礎結構具有哪些限制,以及針對必要的取捨做出有見識的判斷等技巧。 

換句話說,光知道如何使用 C# 或 Visual Basic 等程式設計語言是不夠的。新式的程式設計架構和語言會提供虛擬化介面,將大部分執行階段硬體底層的複雜部分全部隱藏起來。但是開發人員仍然必須了解程式碼如何執行、不同的程式設計指令如何與底層的基礎結構彼此互動,以及如何在必須彼此合作的元件之間實作通訊 (通常位於遠端,而且透過網際網路等網路加以存取)。

良好的軟體設計會充分發揮安全性、可用性、可測試性、可維護性和效能等重要因素。為了對每一項因素做出適當的取捨,開發人員必須了解他們的設計實作對於這些因素可能會造成哪些影響,並且做好準備與架構設計人員或軟體設計人員共事。

程式語言

撰寫軟體時,有多種語言可以選擇。有的只適合特定類型的應用程式,有的則適用於多數類型的應用程式。單獨工作時,常常傾向採用適合多數類型應用程式的語言。而加入小組工作時,選擇語言通常是由專案主管指定。

但是有些應用程式必須使用一種以上的程式設計語言或技術。Web 開發就是一例,在 Web 伺服器上執行以建立網頁的程式碼,可能會使用 ASP.NET Web Form 或 WebMatrix 網頁,其網頁本身包含了在使用者瀏覽器中執行以提供互動功能的 JavaScript 程式碼;而與資料庫互動的後端程式碼,則可能是以 C# 或 Visual Basic 等 .NET Framework 語言所撰寫。

也就是說,您得精通數種語言才行。不過這也不是什麼大不了的難事,雖然每一種語言都有些微出入需要了解,但是大部分語言定義原始程式碼指令的方法多半大同小異,主要的差別出在語法上。但是一般說來,只要掌握程式設計的基礎,學會一種語言之後,再學習其他語言就容易多了。

現今大部分的應用程式都是以物件導向和事件導向的程式設計語言所撰寫。這些類型的程式設計語言都使用迴圈和決策陳述式等程式碼指令和建構,來執行一系列的工作。其中包含從主程式碼呼叫的程序和功能,這些程序和功能常是從程式碼中的許多地方重複執行。程式碼中會定義物件,讓它們各自代表程式碼必須操作的現實世界項目,例如客戶、訂單和帳戶。

這些物件具備屬性和方法,前者代表它們所含的資料,後者執行之後可以操作資料。當發生某些動作時,物件就會引發事件,而程式碼則在必要時處理這些事件。Microsoft 平台所用的物件導向和事件導向程式設計語言通常是 C#、Visual Basic、C++、F# 和 JavaScript。

架構、程式碼庫和模式

要簡化現今逐漸複雜的應用程式開發工作,必須具備的重要因素之一就是使用架構、程式碼庫以及模式。大部分的人都不喜歡反覆撰寫相同的程式碼 (反覆撰寫重複的程式碼不但浪費時間,也浪費精力),而希望把重點放在與應用程式需求直接相關的開發程序上。其中一個方法就是重複使用現有的程式碼,執行預先定義的工作,這種做法可以把需要投入的時間、成本和精力降到最低。

可重複使用的程式碼,其形式有許多種。開發小組常常會建立函式庫和程序庫,來存放他們運用在多個元件和多個應用程式的函式和程序。實作記錄、快取資料、處理例外狀況以及存取資料庫等功能,就是幾個標準範例。您也可以取得或購買執行這些功能及其他多項工作的架構和程式碼庫。重複使用已經過測試、並證實可靠的程式碼,可以在建置軟體時節省大量精力,而開發人員的技能在於懂得哪些架構適用,以及何時及如何順利套用這些架構。

如果沒有可重複使用及預先建置的架構或程式碼庫,開發小組就必須撰寫所需的程式碼。開發小組還必須撰寫「粘附」碼,將元件連結起來,並且呼叫架構和程式碼庫中的函式。這時候就必須熟悉程式設計語言了。其實就算沒有實體程式碼可用,您還是有另一種方法可以享有他人的工作成果。那就是套用軟體模式。

模式是一種概念,專門把軟體開發過程中藉由解決常見問題而累積得來的知識和經驗加以正規化。需要用到程式碼解決方案的案例,多半經過他人多次努力,早已根據該領域專家的檢閱和經驗,研擬出最好的解決方案了。這些案例被視為軟體設計模式,其中也有並非專屬於任何一種程式碼語言的解決方案的通用定義。即使如此,它們所提供的問題解決技術都是經過證實的,因此開發人員也會特別留意相關模式,他們會根據模式所描述的通用解決方案來撰寫他們應用程式專屬的程式碼。這麼做不但可以把錯誤率降到最低,還能預防每一個案例所遇到的常見錯誤。

程式設計技術與方法

在撰寫程式碼時,就算是經驗老到的人,也有出錯的時候。複雜的應用程式包含了許多變數,而看起來沒什麼問題的程式碼,也有可能在某些情況下以出其不意的方式執行,而那些情況在撰寫程式碼時並不明顯。結果長期下來,就逐漸發展出協助降低錯誤率的技術和方法,並且加以正規化。即使您是單獨工作,而不是進行小組工作,也應該熟悉這些技術和方法。

目前所用的一種主要方法就是測試導向設計 (TDD)。這個方法是讓開發人員思考程式碼的需求,在實際撰寫程式碼之前,先將需要的結果正規化。這個程序會建立一系列的單元測試,每一個單元測試都會針對目前建立的程式碼區段,運用該設計的特定函式。比方說,如果程式碼要讓一筆存款進入客戶的帳戶,測試就會將這筆存款金額和往來帳戶餘額,傳給您要建立的程式碼中的那個函式,然後檢查帳戶餘額,判斷結果正確。

先是撰寫單元測試,接著是建立程式碼,實作應用程式所需的函式。這樣就可以利用測試架構 (或測試控管) 執行所有的單元測試,並且顯示所有確認的結果,來驗證這段程式碼。當您在撰寫程式碼,以及持續修改並改良程式碼時,就可以重新執行這些測試,以確保結果仍然有效。

當然,單元測試不能在實際的資料上操作,也無法存取其他仍在建構中的應用程式組件。而是由開發人員建立代表實物的模擬 (Mock) 元件,但這些元件是在開發機器本機執行。這樣可以確保測試只運用在目前建立的程式碼上,而結果不受其他外在因素的影響。

TDD 常常與其他程式設計方法組合運用。例如,配對程式設計 (Pair Programming) 常用來驗證程式碼和降低錯誤率。兩名開發人員在同一部電腦上並肩工作,輪流撰寫程式碼以及執行單元測試。開發人員一起工作,一起分享並結合經驗與知識,並且一起評論其他開發人員撰寫的程式碼。開發人員之間的投入和競爭,都會讓程式碼更進步。

測試、接移與部署

在開發期間建立的程式碼,常常只是整體應用程式或系統的一個區段,必須定期整合到完整的應用程式或系統,才能確保程式碼的每一個元件或每一個區段之間的互動沒有問題。常見的方法是定期簽入程式碼,簽入時會起始應用程式或系統的完整組建。此舉會揭露編譯和測試過程中所發生的任何衝突,這些衝突必須在下次整合組建之前全部解決。

一旦建置出完整的應用程式,並且通過測試週期之後,就可以移到開發用伺服器或電腦上,準備進行最後的接受度測試。與開發電腦和組建伺服器不同的是,開發用伺服器是最後執行階段環境的複本,因此軟體是在實際執行環境時會遇到的狀況下接受測試。同樣的,開發小組必須先解決接移接受度測試週期時出現的問題。

應用程式通常都需要某種類型的安裝或設定程式,讓它們部署到開發用和最後實際執行的系統上。開發小組必須建立所需的安裝程式,來安裝應用程式的元件、設定這些元件和執行階段環境,以及根據需要來準備系統。這個過程常常變得很複雜,對於可以安裝在各種含有其他應用程式呈現的大量基礎硬體的執行階段平台上的精裝軟體更是如此。

在專案小組工作

在專案小組工作雖然獲益匪淺,但卻需要具備更多技能,才能得到最好的結果。加入小組工作時,開發人員必須能夠與各種人溝通互動。其中包括主管、設計人員與架構設計人員、測試小組及文件小組等。

不同作風的專案主管,會要求開發人員應用不同的能力。有的專案是採用傳統的「瀑布式」方法執行,每一項工作都經過妥善劃分,必須先完成一項之後,才能進行下一項。但是現在有越來越多的專案是採用互動方式執行。從許多應用程式開發的案例來看,這種做法的確有其優點。

舉個例說,如果專案採用 Agile 方法運作,其開發反覆作業都很短,而且每天都會開一次站立會議,每週開一次檢討和反覆規劃會議,以這些方式追蹤專案。Agile 開發強調的是客戶與外部相關人員在開發期間透過定期發表軟體所投入的心血,以及持續提供的意見。通常它會採用儲存工作項目的存放庫來追蹤專案,不過除此之外,就不需要任何重要的預先設計來推動專案了。      

另一種常見的方式是 Extreme Programming (XP),這種方式是在開發期間先實作最重要的需求、持續進行溝通和測試,並且定期交付軟體,藉此推動軟體的開發。Agile 和 XP 都強調在預先設計上建立可行的軟體,並且專注於追求符合預期的結果,而不是開發不必要的功能。也就是說,小組成員必須保持生產力,以有效及妥善管理和控制的方法完成每週工作;並且與所有參與程序的合作夥伴保持良好溝通。

人際關係對於現代軟體開發小組來說是相當重要的一環,當小組在同一棟大樓甚至同一個房間內工作時,工作起來最上手,也最有效率。但是,只要成員之間能夠保持良好溝通,即使小組成員分處各地,也能合作無間。他們以電話和視訊會議軟體開會、透過網際網路使用資訊存放庫,而且小組成員都嚴格遵守每日每週會議的時程表。不過小組成員必須適應時區限制,與不同國籍的小組成員有效互動,而且在使用通訊系統時,必須讓所有小組成員都能得心應手,以充分發揮他們的作用。

學習與經驗

有些產業的技術、實務與工作環境變化之快,與 IT 世界不相上下。規模龐大的建設和機械工程專案常常一做就是好幾年,儘管如此,即使規模龐大的軟體應用程式,整個設計-開發-部署週期其實還不到一年,而且常常更短。與此同時,能夠使用的工具、架構、基礎結構和技術的變化卻非常快速,有時候每年都會變換。

換句話說,為了跟上變化的腳步,開發人員必須做好準備,投入時間學習新的技術、程式設計語言,以及其他進步的技術。也就是說,他們必須了解瞬息萬變的 IT 世界趨勢、考量這些趨勢會對現今開發的軟體造成哪些影響,以及能夠調整自己的程式設計能力,盡量利用這些新功能。

在開發人員所有的技能當中,影響成功失敗的最大因素就是經驗,而這一項只能靠時間累積。身為小組的一員、與其他開發人員互動,以及隨時精進技能,就是最基本的需求。結合邏輯思維、創新能力,以及追求完美的熱情,就是理想的軟體開發人員技能。