軟體工程研究的一些問題
背景
好久沒有更新過部落格了。
這次是又一次找了一位同學,聊了聊有關軟體工程方面的內容。雖然我和那位同學都學的是軟體工程,但是實際對軟體工程的理解還是有很大差異的,主要是因為,學術經歷上有所差異。我所做的工作一般來說是軟體工程實踐,所讀的書也都是軟體工程實踐或過程管理相關。我去請教的那位同學,則是在有著軟體工程實踐的同時,對於軟體工程有著一定的研究。可能用詞稍微有點不準確,不過從直觀角度看,我之前只是應用,而那位同學則是做研究。
這次我個人認為,在聊天的過程中,解決了我的諸多問題,我最大的收穫是,知道了軟體工程研究的內容比我原來的理解要更廣一些。我在徵得同意的前提下,將聊天內容稍作整理,略有加工刪減
正文
軟體挖掘
X:現在就是軟體資料探勘(實際想說的是軟體挖掘),這個主要是偏重軟體,還是偏重資料探勘啊
Y:一般會算到軟工的community,而不是AI的 ,取決於工作最後的創新點,或者說重點,有一個純做軟體挖掘 software mining 的 community,會議是MSR 。
研究軟體工程的應用場景
X:現在研究軟體有什麼比較常見的應用嘛?我感覺我對軟體的認識可能還停留在比較久遠的年代。還是說,對軟體的研究,主要影響並不在應用層,而在於對於開發人員的影響?
Y:比如說time-tracing的debug技術。所有靜態分析工具,新一點的有人在分析web service應用如何做靜態檢查,面向end user的程式合成(比如自動生成excel指令碼),這是程式生成的領域 測試裡的各種概念和技術,如mutation testing, record-replay 都是來自學術界的。有做工具的,有做模型的,有做純empirical study的 。software engineering是一個很大的社群 。
軟體工程經驗對研究的影響
X:我感覺對於開發的經驗要求比較高啊,我是以前讀過一些軟體工程的書,感覺好像都是寫過十幾年二十幾年(程式碼),然後搞出一些東西。
Y:你也可以只對一個具體技術瞭解夠深,比如懂JVM和併發,你就可以去搞各種安卓測試工具。你說的那個問題,我覺得應該是一個普遍現象–。 好工作往往是要有經驗積累的。學術界的話,新手一般都是跟在別人定義好的scope裡面做一些增量性的小工作(容易上手和發表),影響力自然不會太大。
X:感覺現在來說,想幹個十幾年,似乎沒有那麼簡單啊。就是我個人從以前閱讀軟體工程的書中,得出一個結論,想在軟體工程方法上有所突破,需要在企業環境下能夠有較長的工作時間,然而當今形勢下,能夠長期從事直接程式設計的人員並不多,並不能給軟體工程研究有一個較好的環境。
Y:你說的方法感覺是指process, practice等,這方面的研究的確是和與工業界結合較多的學術社群關係比較大,像華盛頓大學他們的教授往往和微軟有很密切的聯絡,都是比較瞭解的。而且這類工作有很多是來自於工業界自己的lab。
我感覺你做了一個假設,認為在學校環境裡沒有長期直接接觸程式設計的人會沒有那樣的創新能力。但工業界的人有三個大的劣勢,一來他們的知識體系是零碎的、脆弱的,比如測試人員可能並不真正清楚當前的state of art是什麼,使得他們經常只能想到別人已經有的idea,二來他們缺乏充足的時間和動力做真正需要精力的deep work,三來他們可能由於學術背景原因(或者說閱讀量)而很難在跨學界的點上做出大的貢獻。而那些工業界的人幹5年的經驗,可能通過一篇empirical study的文章就精煉地傳達給了researcher。
學術界的優勢
X: 是這樣的,我確實比較認同,所以我想知道,在學校環境下,到底有什麼優勢 。
Y:Philip Guo 對 PhD的實用意義做過一個概括:這是世界上唯一的,能讓你在領薪水的情況下,長期做一個(些)不會被短視的工業界贊助的專案。
學術界的程式設計能力
X:嗯那這個我也能理解了,但是接觸程式設計的事情怎麼說?
Y:做軟工research的人,我瞭解的都是有很強的程式設計實力的,一是因為PhD本身對這方面的門檻就不低,二是比如你想做一個根據安卓應用的 execution trace 的 pattern 來預測 bug 型別的工作,你得對JVM Android 原始碼,以及深入到系統呼叫 都十分了解(瞭解到能夠hack的地步)。
所以說,從篩選條件,和本身接受的訓練,程式設計能力都是不會差的;如果你研究的又是與時俱進的工業應用,比如研究Javascript bug,那可能web基礎、web框架你都也瞭解了,因為你需要起碼瞭解現在Javascript程式設計師都是怎麼寫程式碼的,論文才能發
X:哦你說的挺有道理的,我能不能問一下你目前是主要偏重js呀。
Y:我現在在做的東西還不夠明確,js和web是我讀過比較多的一個方面。
學術界與工業界是否脫節
X:前面說到了解到現在程式設計師到底是怎麼幹活的,我感覺好像有點難度。我來講一個跟微軟合作的例子。之前微軟azure的pm找我和別的同學做一個關於Java的實驗,就是在kubernetes上部署Spring專案。本來我以為這是一個很簡單的東西,後來發現其實並不簡單,因為安裝各種依賴會出現奇怪的問題。然後就去詢問,當時告訴我們說不要用maven,也不是用gradle,是用一個完全沒有聽說過的依賴管理工具。我知道這一方面可能跟我院教的東西有點老有關係,但是現在我們從市面上所見到的(比較多的)教授的依賴管理工具也確實就是maven,但是與企業實際應用中還是有很多差異的。
Y:哦,但那個工具本身的理念可能早被學術界研究過了,他只是工程上實現得比maven好了一些。
X:哦這個意思,也就是說,實際上目前使用的東西背後都是有一套理論支援的 。
Y:嗯,然後你會發現它可能就那麼回事~或者說,它相比maven的改進點對學術界都不是interesting的 。
X:我大概懂了,可能是我之前對軟體工程的理解有一點狹隘,我之前的認識應該是,軟體工程主要研究的是軟體工程實踐方法/過程。然而實際上研究的不僅僅是人的要素。