南京大學軟件工程導學課:《軟件工程導學》程序員
咱們或多或少都聽過軟件工程師這個稱謂,可是軟件工程是具體是幹嗎的呢?根據坊間或者網絡灌水論壇,能夠獲得一些信息,軟件工程師具備如下特徵:web
等等,以至於矛盾的特徵,都是坊間對軟件工程師的評價。算法
這裏拋出一個結論,上面說的都是事實,但又不是所有的事實。編程
看完下面的東西。每一個職業扮演的角色,也就明白了。安全
瞭解軟件工程師,首先來搞懂軟件工程。網絡
軟件工程,重點在工程二字上。按照科學的定義,工程:應用科學的方法,在成本效益比 有效的方式下,創建一個機器,解決針對性的現實世界的問題。架構
有了工程的定義,咱們看軟件工程,就能夠理解了,軟件工程是開發軟件來解決實現世界的問題的。框架
好比已經有的軟件,word
解決文書工做問題,導航
解決平常出行問題。svg
可是咱們這是過後的眼光看待問題的,由於,不管是 word
仍是 導航
都已經被髮明出來了。工具
若是在事前,那麼問題是很差被發現以及處理的。就比如 導航
出來以前,人們都是買地圖使用,可是鮮有人能發現須要 導航
這個東西出來解決出行問題,等到 導航
被髮明出來之後,人們發現,哦,原來我就須要這個東西,比地圖方便易用。
從事前的眼光看待問題,就是軟件工程須要處理的問題。
所以軟件工程處理的問題,也就是目標,通常有以下特性:
基於這兩種緣由,軟件工程中專門分出一類人,來處理這個問題,他們是需求工程師,或者需求分析師,或者你熟悉的產品經理,這幾種稱呼,描述的一類人。
劃分出產品經理(需求分析/工程師)的願景是,幫助軟件工程解決上述的2個問題。
所以,產品經理的職責是:專門負責與現實問題打交道,專門負責發現問題、處理問題、肯定問題的業務解決方案。
簡答說,你要發現用戶的問題(痛點)、幫助他們解決這個問題,給出一個業務解決方案。好比,你要發現用戶每天使用地圖,何不開發一個機器來專門作這件事,而非每次帶上紙質地圖。
這裏的業務解決方案,須要注意下,與工程解決方案不同,它不關心軟件的內部細節,如何實現,它只關注現實問題,如,關注用戶的成本等。
再回到工程的定義 (應用科學的方法,在成本效益比 有效的方式下,創建一個機器,解決針對性的現實世界的問題) 上,其中問題被丟給了產品經理。至關於起點被解決了。那麼問題的終點,建立一個機器,這個機器呢。
按照其餘行業,針對某個問題,出作出個具體的機器來針對性的解決,那麼這個機器就是計算機,可是這個計算機只是通用的計算機,由於軟工面臨的問題很廣,爲每一個問題建立一個針對性的計算機是不現實 的。
軟件工程中有一種 軟件抽象解決方案 ,用於解決這個問題。通用的計算機+軟件抽象解決方案,以此來解決特定問題。
說的大白話一點,就是計算機上裝個特定軟件,而後解決特定問題。
分爲 本質性工做 和 附屬性工做 。
其中本質性工做,也就是 開發,附屬性工做也就是 安裝。這裏的開發與安裝,與咱們一般理解的不是一回事,開發指的是拿出一套軟件抽象解決方案,須要先分析,再設計。安裝指的是,將沒法落地的軟件抽象解決方案落地,也就是進行編碼、測試工做。
而且開發工做是永遠沒法避免的,是困難的,注意這裏的措辭永遠。由於新問題層出不窮,須要新的解決方案,就須要新的分析、設計。因此說開發是永遠沒法避免的,並且還難。而安裝,則能夠經過各類工具、方法使得其變得簡單。好比你二十年前寫代碼和如今寫代碼,必定是如今寫代碼更簡單些,各類框架層出不窮,解放生產力。可是面對新問題的分析,不管二十年前仍是二十年後的今天,都是同樣的,須要獨立的分析、設計,沒有工具和方法避免。
上文已經提到,開發主要是指:分析、設計。其中具體含義以下:
分析,是產品經理通過對問題的分析,拿出業務解決方案。
設計,則是將業務解決方案迴歸到工程解決方案。
這裏的設計,有好幾類工做的劃分。
設計師,一個團隊的標配是:人機交互設計師、體系架構設計師、詳細設計師。
其中詳細設計師必定是程序員,也就是須要紮實的編程經驗,可是不是全部的程序員都是詳細設計師。
上面提到的是標配,可是在某些複雜問題下,還有許多其餘設計師出現,如網絡環境比較複雜,則須要有網絡設計師;若是安全很值得關注,則還須要安全設計師,等等。
附屬性工做的編碼,就是程序員作的。按照設計師的設計,完善細節。
附屬性工做的測試,就是測試人員作的。
主要是按照,產品經理當初給出的業務解決方案,測試程序員編寫的程序,是否知足需求,若是不知足,則說明這中間有問題,或者理解出現問題、或者出現bug了。
再回到工程的定義,其中有個 成本效益比,整個開發+安裝過程,咱們須要注意生產的控制:對時間、成本、質量的把控,這關乎軟件開發的成敗。
對時間、成本、質量進行把控,通常都是由項目經理作的。
若是項目很龐大,一個項目經理是不夠的,就須要其餘人員來幫助管理,如配置管理人員、生產管理人員,他們雖然掛着管理的名頭,可是不是管理層,和開發、測試等屬於一個級別。相輔相成。
最後再次回到這個問題,咱們發現,咱們大概能夠回答了。
咱們發現。軟件工程師根本不是具體的,至少能夠細分爲,產品經理、設計師、程序員、測試、項目經理。
而以前的那些平價,對應於其中,因此那些都是事實,但又不是全部的事實;好比高薪,那麼產品經理、架構師、項目經理的,說到加班、996,青春飯,那多是普通的程序員。
它們是軟件工程中最重要的三個角色。
是產品的靈魂、把控整個產品的方向、定義產品實現的細節、構建業務解決方案。
把握方向
之因此,說它們是產品的靈魂,把控產品的方向,是由於他們掌握着產品的最終目標,最終產品是這個什麼樣,全是產品經理把控的。
比如淘寶和京東,兩者的產品經理的目標就不同,一個是作自營、一個是作電商的平臺。
產品經理爲了把握好目標、方向,會進行一些假設、而後拿出原型,根據反饋,再評估下方向是否合理。這裏面有許多方法,好比目標、利害關係人、場景等分析,這裏僅是導學課,老師沒展開講。
定義細節
總之產品經理很重要!!!一個好的產品經理更是少見。他們的工資是高的,他們也不用寫代碼,碼農跟他們不搭嘎,可是他們須要寫 文檔。
若是須要一個好的產品經理,可是又找不到這樣的,可使用 team
來彌補下,就是創建一個產品團隊,用一個團隊來彌補我的的欠缺。
決定產品的質量,是整個團隊的技術權威
凡是技術問題不會的,均可以去找架構師,這個技術問題,包括程序員以及測試人員的技術問題。
架構師須要 經驗、知識、天賦,其中經驗佔比重最大。一個好的架構師也是很可貴的。
一樣的高工資,與產品經理有的一拼。
寫關鍵代碼、困難代碼、文檔。
若是找不到一個好的架構師,一樣可使用 team
彌補下。
協調整個團隊,具備領導力、領導、團結、激勵你們
是一個決策者,須要決策團隊的選擇。
是問題的解決者,當出現問題的時候,而非去尋找產生問題的人,而後去處罰。
講究激勵團隊,而非處罰。在軟件工程中,命令與懲罰無效。由於程序員能夠作在電腦面前一成天,可是一行代碼不寫。
由於須要決策,特別是在一些出現重大問題的狀況下,作出決策,須要承受必定的 壓力。
也比較 忙,由於須要計劃、跟蹤、監控整個團隊的進度。
主要是交互。使得軟件具備如下特性:
須要必定的美學,還要了解行爲,基本不須要會寫代碼。
軟件開發中的中流砥柱。
通常具備以下特性:
不一樣的程序員的生產效率比能有 20:1
這麼大,可是兩者之間的薪水差距要小的多。
有的代碼須要創造性,須要高級程序員(算法),可是85%
的代碼是重複出現的,所以在軟件開發中,接觸高端技術、須要創造性是少數。
普通程序員,是比較吃青春飯的,對軟件工程師的吃青春飯的印象,通常是這類程序員留下的。同時,他們的工資也通常,以代碼爲生,討厭寫文檔。
發現了嗎。寫文檔的工資比寫代碼的高。寫文檔的更賺錢。
首先,測試不是像用戶使用軟件那樣,用鼠標點幾下就行了,測試也是須要寫代碼的,測試代碼。
測試,之前是完備性測試,測試有效性,可是好多狀況下,完備性是測不完的,太多種可能了,後來改成缺陷性測試,只要測出來的 bug
越多,則表明隱藏的 bug
越少。
地位、工資與程序員差很少。可是一直在測試,沒有程序員寫代碼創造有成就感,有點枯燥。
同時地位比較尷尬,測出來的 bug
多,程序員頭疼,測出的 bug
少,本身頭疼。
這裏的維護,不是其餘行業的維護、保養的意思。而是增值、附加值、修改等意思,爲軟件添加新功能、修復 bug
。
地位比較尷尬,不受重視,成就感低,好比,程序員去找工做的時候,本能的找開發崗,而不去找維護崗。高級的程序員會被調去開發,而非維護。
工資與程序員差很少,有時候還低。
可是乾的活,還比較難,由於須要理解、甚至修改別人的代碼。寫代碼的都知道,看別人的代碼是怎麼樣的體驗。
可是行業調查發現,維護工程師確是軟件工程從業者最多的行業,說明維護軟件的成本很高。