你好,我是寶玉,我今天分享的主題是:什么是軟件工程?
當有人問你什么是軟件工程,你會想到什么?
也許你會想到軟件,會想到建筑工程,也許對此還沒有什么概念。不要緊,在回答這個問題前,我們先來看看軟件工程和我們的日常生活有哪些關系。
作為一個程序員,你的日常大致是這樣的:早上被手機的鬧鐘叫醒,然后坐地鐵去上班。在路上你會打開微信和朋友閑聊幾句,刷刷微博,還會用看看視頻充充電;上班的時候,你打開Mac電腦,用VS Code寫程序,用看網頁,下班后再玩幾局守望先鋒游戲。
你發現了沒?在這一天的日常生活里面,軟件無處不在。手機操作系統軟件、鬧鐘App、微信、微博、、Mac OS、VS Code、、守望先鋒,這些都是軟件,你的日常生活已經和這些軟件密不可分。
軟件是怎么被創造出來的?
那么你有沒有想過,這些軟件是怎么來的呢?
首先,它們的誕生都是有人想要造一個東西。這其中的很多故事你都耳熟能詳:張小龍創造微信、喬布斯創造iOS、暴雪想做一款不一樣的射擊游戲……他們首先有著這樣的意圖,然后,他們立項做這樣的產品。
每一款軟件項目背后,都有很多人在參與。你無法想象微信這樣復雜的App靠張小龍自己可以開發出來;你也不會相信iOS是喬布斯一個人設計出來的;像守望先鋒這種游戲的背后,有成百上千的游戲策劃、美術設計、程序開發人員。
從立項到第一個版本的發布,每個成功的軟件都需要有計劃、有步驟地進行,什么時候發布第一個版本、第一個版本有什么樣的功能、什么時候發布第二個版本、第二個版本有哪些地方要改進,這些都是研發過程中需要考慮的問題。
比如,守望先鋒是在2013年立項,他們計劃做一個基于職業的 MMO 游戲,他們先花了幾個月的時間做了第一個Demo演示,只有四個英雄和一個張地圖。
圖片來源:The of the panel at "
然后,他們要在 2014 年的“暴雪嘉年華”發布這個游戲的試玩版,包含12個英雄和4張地圖。
"圖片來源:The of the panel at
最終這個游戲在2016年5月正式發布了。這樣從立項一步步到最終發布,歷時三年,中間經過了諸多環節。
類似的例子還有微信,2010年11月20日立項,2011年1月21日第一版上線,當時的功能還非常簡陋,只能發送文本消息和照片。之后才是一個個版本的迭代,直到你現在看到的微信。
像這種有人參與、有計劃、有步驟地造一件產品,我們通常稱為“工程”。
所有工程的本質,就是要做出有用的產品,比如造房子的建筑工程、造火箭的航天工程。像網紅“手工耿”一樣專搞無用發明的情況,我們是不能稱為“工程”的。
在軟件領域,對應的就是“軟件工程”,這些我們日常使用的軟件背后,都是基于軟件工程的方法在開發、運行和維護的。
如何擺脫“軟件危機”?
也許有人會認為,不用軟件工程,我一樣可以開發軟件出來。這確實沒有錯,因為如果一個人沒有學過建筑工程,他也是可以造一個房子出來,只是造出來大概會是這個樣子:
我們知道,不按照建筑工程造房子,是會出事故甚至死人的。而在軟件工程的歷史上,也是真的有造成過很大損失、甚至還有人為之喪命的事件存在。
OS/360操作系統是上世紀60年代最復雜的軟件系統之一軟件工程有用嗎,也是第一個超大型的軟件項目,一共有1000名左右的程序員參與了項目的研發,花費了5000個人年,最終無法運行。項目負責人佛瑞德·布魯克斯后來寫了一本軟件工程的經典書籍《人月神話》,承認在他管理這個項目的時候,犯了很多錯誤,造成了價值數百萬美元的損失。
如果是說OS/360還只是造成了經濟損失的話,-25事件就是真的導致了人員死亡。-25是加拿大原子能有限公司(AECL)所生產的放射線療法機器,在1985年到1987年之間,在美國及加拿大,至少有六起和-25相關的醫療事故是因為程序bug,導致部分病患受到比正常劑量高一百倍的輻射,因而造成患者重傷甚至死亡。
發生這些慘痛的事,原因卻并不難理解。
在計算機剛發明出來的時候,計算機的能力非常有限,只能接收簡單的指令和運算,不需要軟件工程也可以開發出簡單的軟件。
但是,當軟件的規模越來越大,復雜度不斷增加,軟件項目開發維護過程中的問題就逐步暴露出來:軟件產品質量低劣、軟件維護工作量大、成本不斷上升、進度不可控、程序人員無限度地增加。所以在60年代,“軟件危機”的概念被提出來。
為了擺脫軟件危機,1968年秋季,北大西洋公約組織的科技委員會召集了近50名一流的編程人員、計算機科學家和工業界巨頭,討論和制定對策。在那次會議上第一次提出了“軟件工程”( )這個概念。
從此誕生了一門新興的工程學科:軟件工程,它是為研究和克服軟件危機而生。
在這次會議上,同時也提出了“軟件工程”的定義:
>為了經濟地獲得在真實機器上可靠工作的軟件而制定和使用的合理工程原則。
( is the and use of sound in order to that is and works on real .)
1993年,電氣電子工程師學會(IEEE)給出了一個更加綜合的定義:
>將系統化的、規范的、可度量的方法用于軟件的開發、運行和維護的過程,即將工程化應用于軟件開發中。
( : (1) The of a , , to the , , and of ; that is, the of to . (2) The study of as in (1).)
如果你去搜索一下“軟件工程定義”,你還能找到很多其他定義,這里就不一一列舉。我們沒必要花太多時間在這些字面解釋上,關鍵是要抓住這些定義的本質:就是要用工程化方法去規范軟件開發,讓項目可以按時完成、成本可控、質量有保證。
軟件工程的演化史
對比傳統的工程學科,和軟件工程最接近的就是建筑工程了。設想一下建一座房子:首先要先立項、設定預算,然后畫設計圖,再是施工,施工完成后,由專業人士進行質量檢查,質檢合格后入住。
開發軟件本質上也是像蓋房子一樣,是從無到有創造的過程。工程化的方式,就是你分步驟(過程),采用科學的方法軟件工程有用嗎,借助工具來做產品。
于是參考建筑工程,整個軟件開發過程也被分成了幾個階段:需求定義與分析、設計、實現、測試、交付和維護,這也就是我們常說的軟件項目生命周期。
當然,各個階段都會有人的參與,于是產生了軟件項目里的各種角色:項目經理、產品經理、架構師、程序員、測試工程師、運維工程師。而對這整個過程的管理,我們通常稱之為“項目管理”。
同時,也很自然就衍生出一套最基礎的過程模型:瀑布模型。
瀑布模型的誕生,在當時是有非常重大的意義的,讓軟件開發從無序到有序,讓大家更好的分工協作,同時每個階段又衍生出各自的方法學和工具,例如需求分析、軟件測試等等。
然而瀑布的特性決定了它只能從上往下流,而且從上到下走完整個周期很長,所以一旦出現了需求的變更,將會非常痛苦,很多事情需要重頭再來。
于是基于瀑布模型,又衍生出V模型、原型設計、增量模型、螺旋模型等模型,試圖改善瀑布模型存在的一些缺陷。這些改進模型的發展趨勢上就是縮短項目周期,快速迭代。
這樣到了90年代,各種輕量級開發方法例如Scrum、極限編程等也不斷被提出。到了2001年,這些輕量級開發方法一起組成了敏捷聯盟,其后敏捷開發如同星星之火,逐漸形成燎原之勢。
近些年,云計算、微服務這些新技術的產生,也對軟件工程產生了影響。云服務讓分工更細,很多企業可以將運維、服務器維護、DBA、甚至某些獨立服務交給云服務商;微服務讓大團隊變成小團隊,每個小團隊可以更專注于細分領域,減少相互之間的依賴。 ?
一個公式
當你大致了解整個軟件工程的演變發展史,你會發現,軟件工程的知識,都是建立在軟件項目的過程,或者說軟件項目生命周期之上的。
基于軟件過程,我們有了角色分工,有了對過程的管理和工具,對過程中每個階段細分的方法學和工具。
現在,如果再回頭看看我們的問題“什么是軟件工程?”其實可以總結為:軟件工程就是用工程化的方法來開發維護軟件。也可以說軟件工程就是用一定的過程,采用科學的方法,借助工具來開發軟件。
如果用一個簡單的公式表達,那就是:軟件工程 = 過程 + 方法 + 工具。
總結
今天,我和你一起追溯了一下軟件工程的起源,你知道了軟件工程學科的產生,就是為了解決軟件危機。也見證了整個軟件工程的演變歷史,從瀑布模型到敏捷開發。
從1968年提出軟件工程到現在,正好是50年。在2002年,我最開始學軟件工程專業的時候,還只有瀑布模型、需求分析、系統設計等這些傳統軟件工程內容,但是經過十幾年的發展,在軟件項目中,敏捷開發、持續集成、微服務等這些新興內容已經開始在軟件項目中占據越來越重要的位置。
可以預見,未來軟件工程領域還會有新的概念、新的知識誕生。但是萬變不離其宗,只要你抓住軟件工程的本質,無論將來如何變化,你總能很快掌握新的知識內容。
而軟件工程的核心,就是圍繞軟件項目開發,對開發過程的組織,對方法的運用,對工具的使用。
課后思考
當然,每個人對于軟件工程的理解也是不同的,你理解的軟件工程是什么樣子的呢?歡迎在留言區留言討論。
感謝閱讀,如果你覺得這篇文章對你有一些啟發,也歡迎把它分享給你的朋友。