1.1 軟件=程序+軟件工程算法
衆所周知,「程序=數據結構+算法」, 然而在實際應用中,這一說法又顯得有些空泛。程序,在這裏指的是源程序,就是一行行的代碼。它們是創建在數據結構上的一些算法。程序還要對數據進行操做,這些數據有些是靜態的(例如軟件的圖標、提示信息),有些是動態的(例如程序生成的隨機數字、程序經過網絡下載的數據、用戶的文字或語音輸入等)。可是光有代碼和靜態數據仍是不行,工程師要把它們構建成爲機器能懂的可執行代碼。構建不只僅是cc和link命令,一個複雜的軟件不但要有合理的軟件構架、軟件設計與實現,還要有各類文件和數據來描述各個程序文件之間的依賴關係、編譯參數、連接參數,等等。這些都是軟件構建的過程。
安全
怎麼保證軟件在修改過程當中質量不斷提升,至少要維持之前的質量?這是源代碼管理的問題——也叫配置管理。咱們還有一系列的工具、流程和文檔來保證程序的正確性,這些工具(也是軟件)、流程應該達到很高的質量,才能保證開發出來的軟件的質量。這就是質量保障,具體驗證過程叫作軟件測試。網絡
軟件團隊要從需求分析開始,把合適的需求梳理出來,而後逐步展開後續工做。軟件團隊的人員也會流動,新的成員要儘快讀懂已有的程序,瞭解程序的設計,這叫程序理解。軟件在運行過程當中還會出現這樣那樣的問題,也許咱們要時不時給軟件打一個補丁,或者維護衆多的服務,團隊的新老成員要一塊兒修復各類各樣的問題,這叫軟件維護,或者服務運營。這一系列過程就是軟件的生命週期,有人得負責軟件項目的管理。數據結構
一個好的軟件,即便功能和同類軟件區別不大,但卻會讓人感到很是好用。這就是軟件的用戶體驗。用戶體驗和數據結構、算法沒有直接關係,可是不少很是成功的軟件就贏在這個方面。工具
軟件工程的核心部分爲:構建管理、源代碼管理、軟件設計、軟件測試、項目管理。廣義上的軟件工程也包括用戶體驗、用戶界面設計等。因此一個推論是:軟件=程序+軟件工程。一個擴展的推論是:軟件企業=軟件+商業模式。測試
將軟件開發類比於航空產業,軟件開發能夠分爲四個不一樣的階段,分別是:練習、嘗試、探索、成熟的產業模式。然而不管是軟件開發仍是航空航天產業,做爲一個合格的業內人員,都必需要作到在安全平穩的基礎上提升技術水平,不能捨本逐末。網站
1.2 軟件工程是什麼ui
軟件工程是把系統的、有序的、可量化的方法應用到軟件的開發、運營和維護上的過程。軟件工程包括下列領域:軟件需求分析、軟件設計、軟件構建、軟件測試和軟件維護。搜索引擎
人們在開發、運營、維護軟件的過程當中有不少技術、作法、習慣和思想體系。軟件工程把這些相關的技術和過程統一到一個體系中,叫「軟件開發流程」。軟件開發流程的目的是爲了提升軟件開發、運營、維護的效率,並提升軟件的質量、用戶滿意度、可靠性和軟件的可維護性。光有各類流程的思想是不夠的,咱們還要有一系列的工具來保證這些思想可以在實踐中有效率地運做。軟件工具備不少:有工程師自行開發的工具,有軟件團隊獨有的工具,也有許多公開的軟件工具,例如編譯工具、源代碼管理工具、源代碼編輯工具;也有一些軟件工具系統,例如Microsoft Visual Studio、GitHub、Eclipse、ClearCase和ClearQuest,等等。
spa
1.2.1 軟件的特殊性
軟件是能夠運行在計算機及電子設備中的指令和數據的有序集合。軟件有各類分類方法,其中一種是:
軟件和人類製造出來的其餘產品相比,有許多共性,也有一些特殊性。它們都是解決某種需求。咱們知道許多計算機硬件的能力大體以每兩年提升一倍的速度發展,而軟件開發的流程卻沒有這樣的提速過程,開發成本也沒有降低,爲何?軟件開發過程有什麼特別的難題?學者們總結了如下五點:
軟件能夠說是人類創造的最複雜的系統類型。大型軟件(操做系統、辦公軟件、搜索引擎)有超過百萬行的源代碼,上萬個不一樣的文件。而軟件工程師的肉眼一般一次只能看到30-80行源代碼(至關於顯示器的一屏),他們的智力、記憶力和常人差很少,在過去的幾十年中並無大的提升。軟件的各個模塊之間有各類顯性或隱性的依賴關係,隨着系統的成長和模塊的增多,這些關係的數量每每以幾何級數的速度增加。而理解運用這些複雜性的人並無太大的變化。
2.不可見性
軟件工程師能直接看見源代碼,可是源代碼不是軟件自己。軟件以機器碼的形式高速運行,還可能在幾個CPU核上同時運行,工程師是「看」不到本身的源代碼如何具體地在用戶的機器上被執行的。商用軟件出現了錯誤,工程師能夠看到程序在出錯的一瞬間留下的一些痕跡(錯誤代號、大體的目標代碼位置、錯誤信息),可是幾乎沒法完整重現到底程序出現了什麼問題。當工程師回過頭來看源代碼時,它們仍是安靜地排列在屏幕上。
3.易變性
軟件看上去很容易修改,修改軟件比修改硬件容易多了。人們天然地期待軟件能在下面兩種狀況下「改變」:a、讓軟件作新的事情;b、讓軟件適應新的硬件。可是與此同時,正確地修改軟件是一件很困難的事情
4.服從性
軟件不能獨立存在,它老是要運行在硬件上面,它要服從系統中其餘組成部分的要求,它還要服從用戶的要求、行業系統的要求(例如銀行利率的變化)。
5.非連續性
人們比較容易理解連續的系統:增長輸入,就能看到相應輸出的增長。可是許多軟件系統卻沒有這樣的特性,有時輸入上很小的變化,會引發輸出上極大的變化。
這些特性的前四個是佛瑞德·布魯克斯在No Silver Bullet一文中提到的,第五個特性是瓦茨拉夫·拉里奇提到的。這些特性是由軟件的本質所決定的,軟件還有其餘特性:
可是這些非本質、臨時的特性並不能決定軟件工程的本質問題。
1.2.2 軟件工程與計算機科學的關係
軟件工程中的「工程」二字也大有來歷,人們把下面的活動稱之爲工程:
創造性地運用科學原理,設計和實現建築、機器、裝置或生產過程;或者是在實踐中使用一個或多個上述實體;或者是實現這些實體的過程。
根據咱們對軟件特性及工程這一律唸的瞭解,能夠看到,計算機科學中的理論研究部分,大多能夠從形式上證實,與數學、離散數學、數理邏輯密切相關;計算機科學中與實踐相關的部分,都和數據以及其餘學科發生關係;軟件工程則和人的行爲、現實社會的需求息息相關。軟件工程的研究目標(軟件的開發、運營和維護)中都有「人」出現,這些「人」能夠是項目需求的提供者,能夠是軟件的開發人員,還能夠是軟件的用戶。這一特徵與其餘計算機科學的子領域明顯不一樣。其實,在任何科學領域中,都是偏理論的子領域和偏應用的子領域(例如數學與應用數學),當偏應用的領域獲得長足發展以後,就會更多地被你們所熟知,甚至成爲一門獨立的學科,這並不說明相對應的兩方面有高低或優劣之分。
計算機科學和軟件工程的不一樣側重點
計算機科學 | 軟件工程 |
發現和研究長期的、客觀的真理 |
短裙的實際結果(具體的軟件會過期) |
理想化的 | 對各類因素的折中 |
肯定性、完美、通用性 | 對不肯定性和風險的管理,足夠好,具體的應用 |
各個學科獨立深刻研究,作出成果 | 關注和應用各個相關學科的知識、解決問題 |
理論的統一 | 百花齊放的實踐方法 |
強調原創性 | 最好的、成熟的實踐方法 |
形式化,追求簡明的公式 | 在實踐中創建起來的靈感和直覺 |
正確性 | 可靠性 |
計算機理論的進展會幫助軟件工程(例如對程序正確性的分析);軟件工程的進展(更好的工具,更多的應用領域)會幫助計算機科學家更有效地進行實驗和探索。
1.2.3 軟件工程的知識領域
軟件工程共有15個知識領域(Knowledge Area,KA):
須要指出的是,在上面的15個KA中,KA1-12描述了軟件工程學科自己的知識領域;KA13-15描述了軟件工程三大類基礎知識領域:計算基礎、數學基礎和工程基礎。
1.2.4 軟件工程的目標——創造「足夠好」的軟件
什麼是好的軟件?一些同窗認爲,所謂好軟件,就是軟件沒有缺陷(Bug),所謂軟件工程,就是把軟件中的Bug都消滅掉的過程。這的確是抓住了軟件工程的一個要素。和軟件打交道的專業人士都知道軟件有「Bug」,軟件團隊的不少人都成天和Bug打交道,Bug的多少能夠直接衡量一個軟件的開發效率、用戶滿意度、可靠性和可維護性。例如:、
用戶滿意度:用戶在使用時發現了軟件的不少問題,影響了用戶使用軟件的效率。
可靠性:某個軟件常常會崩潰,某個操做系統會時不時死機,某個網站每每在最須要的時候登不上去。
軟件流程的質量:軟件團隊和開發流程的問題太多,致使團隊成員沒法互相協做,按時交付軟件。這也能夠說是軟件團隊的Bug。
可維護性:某個軟件太難維護了,修復了一個問題,另外一個問題又出來了。也沒有足夠的文檔,維護人員表示須要更多的資金和時間來維護這個軟件,甚至建議推到重寫。
什麼是Bug呢?簡單地說,軟件的行爲和用戶的指望值不同,就叫Bug。是不是Bug,取決於用戶和開發者的不一樣角度。軟件工程的一個重要任務,就是要決定一個軟件在何時能「足夠好」,能夠發佈。