跳轉到內容

軟體工程/實現簡介

來自華夏公益教科書

計算機程式設計(通常縮寫為程式設計編碼)是設計、編寫、測試、除錯/故障排除以及維護計算機程式原始碼的過程。該原始碼是用程式語言編寫的。程式設計的目的是建立表現出某些期望行為的程式。編寫原始碼的過程通常需要許多不同領域的專業知識,包括應用程式領域知識、專門演算法和形式邏輯。

Hoc 和 Nguyen-Xuan 將計算機程式設計定義為“將用熟悉術語表達的思維計劃轉換為與計算機相容的計劃的過程”。[1] 換句話說,程式設計就是將需求轉化為計算機可以執行的程式的技巧。

在軟體工程中,程式設計(實現)被視為軟體開發過程中的一個階段。

關於程式編寫在多大程度上是一門藝術、一門手藝還是一門工程學科,一直存在著爭論。[2] 一般來說,良好的程式設計被認為是這三者的衡量應用,其目標是產生高效且可演進的軟體解決方案(“高效”和“可演進”的標準差異很大)。該學科與許多其他技術職業不同,因為程式設計師通常不需要獲得許可證或透過任何標準化(或政府監管)的認證考試才能稱自己為“程式設計師”甚至“軟體工程師”。但是,在世界許多地方,自稱為“專業軟體工程師”而沒有來自認證機構的許可證是非法的。然而,由於該學科涵蓋了許多領域,這些領域可能包含也可能不包含關鍵應用程式,因此關於該學科整體是否需要許可證存在爭議。在大多數情況下,該學科由需要程式設計的實體自行管理,有時會定義非常嚴格的環境(例如美國空軍使用 AdaCore 和安全許可)。

另一個持續的爭論是,編寫計算機程式所使用的程式語言在多大程度上影響著最終程式的形式。這場爭論類似於圍繞語言學中的薩皮爾-沃爾夫假設[3]的爭論,該假設認為,一種特定的口頭語言的性質會影響其使用者的習慣性思維。不同的語言模式會產生不同的思維模式。這個想法挑戰了用語言完美地表達世界的可能性,因為它承認任何語言的機制都會影響其使用者社群的思維。

IBM 402 賬務機的有線插板。

來自古希臘的安提基特拉機械是一個利用各種尺寸和配置的齒輪進行計算的計算器,[4]它跟蹤了月球-太陽曆中仍然使用的默冬週期,並且與計算奧林匹克運動會日期相一致。[5] 阿爾-賈扎裡在 1206 年建造了可程式設計的自動機。這些裝置中使用的一種系統是在木製鼓上的特定位置放置釘子和凸輪。這些釘子和凸輪會依次觸發槓桿,進而操作打擊樂器。該裝置的輸出是一個演奏各種節奏和鼓模式的小鼓手。[6][7] 約瑟夫·瑪麗·雅卡爾在 1801 年研發的雅卡爾提花機使用了一系列帶有穿孔的紙板。孔的圖案代表提花機在編織布料時必須遵循的圖案。提花機可以使用不同的卡片組來生產完全不同的編織物。查爾斯·巴貝奇在 1830 年左右採用了穿孔卡來控制他的分析機。數字計算、預先確定的操作和輸出的綜合,以及以一種相對容易讓人類理解和生成的方式組織和輸入指令的方法,導致了現代計算機程式設計的發展。計算機程式設計的發展在工業革命期間加速。

在 19 世紀 80 年代後期,赫爾曼·何樂禮發明了將資料記錄在機器可以讀取的介質上的方法。以前對機器可讀介質的使用,如上所述,是為了控制而不是資料。“經過對紙帶的一些初步嘗試,他最終選擇了穿孔卡……”[8]為了處理這些穿孔卡,最初被稱為“何樂禮卡”,他發明了製表機和打孔機。這三項發明是現代資訊處理行業的基石。1896 年,他創立了製表機公司(後來成為 IBM 的核心)。在他的 1906 年 I 型製表機上新增一個控制面板(插板)使其能夠執行不同的工作,而無需進行物理改造。到 1940 年代後期,已經出現了各種各樣的插板可程式設計機器,稱為單元記錄裝置,用於執行資料處理任務(讀卡)。早期的計算機程式設計師使用插板來執行為新發明的機器請求的各種複雜的計算。

資料和指令可以儲存在外部穿孔卡上,這些穿孔卡按順序排列並排列在程式卡組中。

馮·諾依曼體系結構的發明允許計算機程式儲存在計算機記憶體中。早期的程式必須使用特定機器的指令(基本操作)精心製作,通常使用二進位制表示法。每種型號的計算機都可能使用不同的指令(機器語言)來完成相同的任務。後來,組合語言應運而生,它允許程式設計師以文字格式指定每個指令,輸入每個操作碼的縮寫而不是數字,並以符號形式指定地址(例如,ADD X, TOTAL)。使用匯編語言輸入程式通常比使用機器語言更方便、更快且更不容易出現人為錯誤,但由於組合語言只是機器語言的不同表示法,因此任何兩個具有不同指令集的機器也具有不同的組合語言。

1954 年,FORTRAN 誕生了;它是第一個具有功能實現的高階程式語言,而不是僅僅停留在紙面上的設計。[9][10](廣義上講,高階語言是任何允許程式設計師用比組合語言指令更抽象的術語編寫程式的程式語言,即比組合語言的抽象級別“更高”。)它允許程式設計師透過直接輸入公式來指定計算(例如 Y = X*2 + 5*X + 9)。程式文字或稱為原始碼,透過一個稱為編譯器的專用程式轉換為機器指令,該編譯器將 FORTRAN 程式翻譯成機器語言。事實上,FORTRAN 這個名字代表“公式翻譯”。許多其他語言也應運而生,包括一些用於商業程式設計的語言,例如 COBOL。程式主要仍然透過打孔卡或紙帶輸入。(參見打孔卡時代的計算機程式設計)。到 1960 年代後期,資料儲存裝置和計算機終端變得足夠便宜,以至於程式可以透過直接在計算機上輸入來建立。文字編輯器的開發使得對程式進行修改和更正比使用打孔卡更加容易。(通常,在打孔卡中出錯意味著必須丟棄這張卡,並打一張新的卡來替換它。)

隨著時間的推移,計算機在處理能力方面取得了巨大的進步。這催生了更抽象的程式語言,它們與底層硬體更加獨立。雖然這些高階語言通常會產生更高的開銷,但現代計算機速度的提高使得這些語言的使用比過去更加實用。這些日益抽象的語言通常更容易學習,並且允許程式設計師更有效率地、用更少的原始碼開發應用程式。然而,對於一些程式而言,高階語言仍然不切實際,例如那些需要低階硬體控制或需要最大處理速度的程式。

在整個二十世紀下半葉,程式設計在大多數發達國家都是一個有吸引力的職業。一些形式的程式設計越來越多地受到離岸外包的影響(從其他國家進口軟體和服務,通常以更低的工資),這使得在發達國家進行程式設計職業決策變得更加複雜,同時又增加了欠發達地區經濟機會。目前尚不清楚這種趨勢將持續多久,以及它將對程式設計師的工資和機會產生多大的影響。[需要引用]

現代程式設計

[編輯 | 編輯原始碼]

質量要求

[編輯 | 編輯原始碼]

無論採用何種軟體開發方法,最終程式都必須滿足一些基本屬性。以下屬性是最相關的屬性之一。

  • 效率/效能:程式消耗的系統資源量(處理器時間、記憶體空間、慢速裝置,如磁碟、網路頻寬,在一定程度上甚至包括使用者互動):消耗越少越好。這也包括正確處理一些資源,例如清理臨時檔案和防止記憶體洩漏。
  • 可靠性:程式結果正確的頻率。這取決於演算法的概念正確性,以及將程式設計錯誤降到最低,例如資源管理錯誤(例如,緩衝區溢位和競爭條件)和邏輯錯誤(例如,除以零或越界錯誤)。
  • 健壯性:程式在非程式設計師錯誤的情況下預料問題的程度。這包括一些情況,例如資料錯誤、不適當或損壞,所需資源不可用,例如記憶體、作業系統服務和網路連線,以及使用者錯誤。
  • 可用性:程式的人機工程學:一個人使用程式執行其預期目的的難易程度,或者在某些情況下甚至包括未預期的目的。這些問題甚至可以決定程式的成功與否,而與其他問題無關。這涉及廣泛的文字、圖形,有時還包括硬體元素,這些元素可以提高程式使用者介面的清晰度、直觀性、一致性和完整性。
  • 可移植性:程式原始碼可以在其上編譯/解釋和執行的計算機硬體和作業系統平臺範圍。這取決於不同平臺提供的程式設計功能的差異,包括硬體和作業系統資源、硬體和作業系統的預期行為,以及平臺特定編譯器(有時還有庫)對原始碼語言的可用性。
  • 可維護性:程式由其當前或未來的開發人員修改以進行改進或定製、修復錯誤和安全漏洞或使其適應新環境的難易程度。在初始開發期間的良好實踐在這方面起著至關重要的作用。這種質量可能不會對終端使用者直接顯現,但它會從長遠角度對程式的命運產生重大影響。

演算法複雜度

[編輯 | 編輯原始碼]

計算機程式設計的學術領域和工程實踐都很大程度上關注於發現和實現針對特定問題類別最有效的演算法。為此,演算法使用所謂的 Big O 符號(O(n))進行分類,該符號用輸入的大小來表示資源使用情況,例如執行時間或記憶體消耗。經驗豐富的程式設計師熟悉各種成熟的演算法及其各自的複雜度,並利用這些知識來選擇最適合特定情況的演算法。

方法論

[編輯 | 編輯原始碼]

大多數正式軟體開發專案的第一步是需求分析,然後是測試以確定價值建模、實現和錯誤消除(除錯)。每個任務都存在許多不同的方法。用例分析是一種流行的需求分析方法。如今,許多程式設計師使用敏捷軟體開發的形式,其中正式軟體開發的各個階段更加緊密地整合在一起,形成持續幾周而不是幾年的短週期。軟體開發過程有很多方法。

流行的建模技術包括面向物件分析與設計(OOAD)和模型驅動架構(MDA)。統一建模語言(UML)是一種用於 OOAD 和 MDA 的表示法。

資料庫設計中使用的一種類似技術是實體關係建模(ER 建模)。

實現技術包括命令式語言(面向物件或過程式)、函式式語言和邏輯語言。

衡量語言使用情況

[編輯 | 編輯原始碼]

很難確定哪些是現代最流行的程式語言。一些語言對於特定型別的應用程式非常流行(例如,COBOL 在企業資料中心中仍然很強大,通常是在大型大型機上,FORTRAN 在工程應用中,指令碼語言在 Web 開發中,C 在嵌入式應用程式中),而另一些語言則被定期用於編寫許多不同型別的應用程式。

衡量程式語言流行度的幾種方法包括:統計提及該語言的招聘廣告數量、[11] 教授該語言的書籍的銷售數量(這高估了新語言的重要性),以及對用該語言編寫的現有程式碼行數量的估計(這低估了 COBOL 等商業語言的使用者數量)。

1947 年除錯的 bug。

除錯是軟體開發過程中一項非常重要的任務,因為錯誤的程式會對使用者產生重大影響。一些語言更容易出現某些型別的故障,因為它們的規範不要求編譯器執行與其他語言一樣多的檢查。使用靜態分析工具可以幫助檢測一些潛在的問題。

除錯通常使用 Eclipse、Kdevelop、NetBeans 和 Visual Studio 等 IDE 進行。gdb 等獨立偵錯程式也被使用,它們通常提供較少的視覺化環境,通常使用命令列。

程式語言

[編輯 | 編輯原始碼]

不同的程式語言支援不同的程式設計風格(稱為程式設計正規化)。語言選擇的考慮因素很多,例如公司政策、任務的適用性、第三方軟體包的可用性或個人偏好。理想情況下,將選擇最適合當前任務的程式語言。與這種理想情況的權衡包括找到足夠多的瞭解該語言的程式設計師來組建團隊、該語言的編譯器的可用性以及用該語言編寫的程式執行的效率。語言形成了從“低階”到“高階”的近似譜系;“低階”語言通常更面向機器,執行速度更快,而“高階”語言更抽象,更易於使用,但執行速度較慢。

艾倫·唐尼在他的著作《像計算機科學家一樣思考》中寫道

儘管在不同的語言中,細節看起來有所不同,但一些基本指令幾乎出現在所有語言中。
  • 輸入: 從鍵盤、檔案或其他裝置獲取資料。
  • 輸出: 在螢幕上顯示資料或將資料傳送到檔案或其他裝置。
  • 算術運算: 執行基本的算術運算,如加法和乘法。
  • 條件執行: 檢查某些條件,並執行相應的語句序列。
  • 重複: 重複執行某些操作,通常伴隨著一些變化。

許多計算機語言提供了一種機制來呼叫庫提供的函式。只要庫中的函式遵循相應的執行時約定(例如,引數傳遞方式),那麼這些函式就可以用任何其他語言編寫。

程式設計師

[編輯 | 編輯原始碼]

計算機程式設計師是編寫計算機軟體的人。他們的工作通常包括

  • 編碼
  • 編譯
  • 除錯
  • 文件化
  • 整合
  • 維護
  • 需求分析
  • 軟體架構
  • 軟體測試
  • 規格說明

參考文獻

[編輯 | 編輯原始碼]
  1. Hoc, J.-M. 和 Nguyen-Xuan, A. 語言語義、心理模型和類比。J.-M. Hoc 等人,編。程式設計心理學。學術出版社。倫敦,1990 年,139–156,引用自 Brad A. Myers, John F. Pane, Andy Ko, 自然程式語言和環境,ACM 通訊,第 47 卷第 9 期,2004 年 9 月
  2. Paul Graham (2003)。"駭客與畫家". 檢索時間 2006-08-22. {{cite journal}}: Cite journal 需要 |journal= (幫助)
  3. APL 程式語言的創始人 Kenneth E. Iverson 認為,薩丕爾-沃爾夫假說適用於計算機語言(但沒有實際提到假說名稱)。他獲得圖靈獎的演講“符號作為思考工具”就是圍繞這個主題展開的,他認為更強大的符號有助於思考計算機演算法。Iverson K.E.,"符號作為思考工具",ACM 通訊,23: 444-465 (1980 年 8 月)。
  4. "古代希臘計算機的內部運作被破譯"。國家地理新聞。2006 年 11 月 29 日。
  5. Freeth, Tony (2008 年 7 月 31 日)。"安提基特拉機械中的日曆,顯示奧運會日期並預測日食". 自然. 454 (7204): 614–617. doi:10.1038/nature07130. PMID 18668103. {{cite journal}}: 未知引數 |coauthors= 被忽略 (|author= 建議) (幫助)
  6. 13 世紀的可程式設計機器人,謝菲爾德大學
  7. Fowler, Charles B. (1967 年 10 月)。"音樂博物館:機械樂器的歷史". 音樂教育者雜誌. 音樂教育者雜誌,第 54 卷第 2 期. 54 (2): 45–49. doi:10.2307/3391092.
  8. "哥倫比亞大學計算歷史 - 赫爾曼·何樂禮". Columbia.edu. 檢索時間 2010-04-25.
  9. 12:10 p.m. ET (2007 年 3 月 20 日)。"Fortran 建立者約翰·巴克斯去世 - 科技與小工具 - msnbc.com". MSNBC. 檢索時間 2010-04-25.
  10. "CSC-302 99S : 課堂 02: 程式語言簡史". Math.grin.edu. 檢索時間 2010-04-25.
  11. 提及特定語言的招聘廣告調查>

進一步閱讀

[編輯 | 編輯原始碼]
  • Weinberg, Gerald M.,計算機程式設計心理學,紐約:範·諾斯特蘭德·萊因霍爾德,1971 年
[編輯 | 編輯原始碼]
華夏公益教科書