研究軟體工程需要哪些數學方面的知識?

我是一個軟體開發工程師,希望在軟體方面選擇某一個方向去做深入研究,但很多研究方向都和數學有關,對數學要求太高的,怕難有成就。我大學是計算機系,數學涉及到:微積分,線性代數,概率論,離散數學,學的都一般。現在想集中精力去研究軟體工程,希望在這個領域去有所突破和成績。


我是研究軟工(SE)和程序設計語言(PL)的phd。首先強烈反對排名第一的答案。軟工並不是管理,講管理的只有軟體質量管理,過程管理,需求設計等部分內容。這些只是軟工的一部分。
軟工究竟是什麼?這是一門研究如何幫助程序員書寫和管理軟體的工程科學。按照此定義,IDE的設計和實現算不算?算!debugger的設計與實現算不算?算!靜態檢測工具如coverity算不算?算!git等軟體管理工具算不算?當然算!因為他們都是幫助程序員寫程序和管理程序的。
從上面的例子可以看出,要研究這些工具需要從程序中提取信息。比如拿call graph,拿def/use chains, 拿type hierarchy等。怎麼拿這些信息呢?這就是PL需要研究的問題了。SE和PL這兩個領域基本上是共生的,你需要了解兩者。而他們共同需要的數學知識主要是離散數學的東西,圖論用處最大,其次是抽象代數,最後是形式語言和自動機。有時候做數據挖掘時需要點基本的統計學知識,但不會太高深。

--------------------------
9.10更新:
---------------------------
回答題主在提問區的問題。我不建議給你推薦一堆教科書然後你去慢慢啃。一是學習周期太長,你拿到書單多半就沒有下文了,這浪費你和我的時間。二是教科書的東西很難聯繫實際,你看了段時間不知道如何應用。
比如說必看的如龍書。你現在去啃,什麼時候能弄懂?
我推薦的方法是從熟悉工具入手。之前說了,軟工的工具很多都要從source code裡面拿信息。當然你不需要從頭做起,因為大多數編譯器工具集已經有相關功能了。你要做的就是學會使用這些編譯器。當然,你也少不了加入自己的代碼到這些工具中。於是,你在了解這些工具時會遇到很多不懂的東西,這個時候再有的放矢的去學習。
比如說你現在學習LLVM,在讀這篇介紹文檔:http://llvm.org/pubs/2004-01-30-CGO-LLVM.pdf。你會在abstract中看到一個詞叫Static Single Assignment (SSA) form。假如你不知道這個東西是什麼,你自然去google。然後你有可能讀到這個wiki頁面:Static single assignment form。於是你又發現幾個陌生的詞,reaching definition,control flow graph。然後你繼續搜索學習。就這樣一環接一環,你很快就能把編譯領域中常見的詞都遇到一遍。通過google,你把這些詞所表示的概念弄懂,差不多基礎就有了。學這些概念肯定也會學一些演算法,比如SSA的生成演算法。這些演算法需要一些圖論知識,你就可以看相應的書了解。這種學習方法比直接推薦給你一堆書好。

我就推薦三個工具你可以任選深入學習:
C/C++: llvm, The LLVM Compiler Infrastructure Project
Java: Soot, Soot: a Java Optimization Framework
JavaScript: V8, v8 -

V8 JavaScript Engine

從功能強大上來說,llvm和v8更甚。但我更推薦的是做Java分析的Soot,更容易學習和使用。
掌握了一個工具,你就可以做你的軟工研究了。


謝謝邀請。

第一,軟體工程嚴格意義上來說是一門管理學科。管理學科不需要特別高深的數學基礎。第二,學校里的軟體工程是屠龍之技,跟現實中的軟體開發沒什麼關係。最後。軟體工程不需要研究,重點是要做出項目來。


如果真是所謂科研,我知道有幾個喜聞樂見的方向,軟體工程,工作流,中間件什麼的,只能就我的理解說……

圖論和網路理論,運籌學,最優化,統計,這些都會有幫助。將工程或具體問題普遍抽象為理論問題代入這些數學模型就差不多是研究了……


確實和數學關係不是很大,如果真的想在軟體工程領域做一些研究並有所突破的話,我推薦兩本書吧:
1. 人件 (豆瓣)
2. 人月神話 (豆瓣)


推薦閱讀:

沭陽怎麼樣 哪好玩?
為什麼RayFile最近不能下載了?
面試泰國的漢語志願者怎樣提高入圍可能?
零零發同學啥時候才能被放出來?
如何evaluate 一個公司的strategy?

TAG:「未歸類」話題 |