演算法工程師和軟體工程師的區別在哪裡,他們工作是如何合作的?

本題已加入知乎圓桌 ?「機器學習 · 學以致用」,更多「機器學習」相關話題討論歡迎關注。

許多公司有單獨的演算法部門,比如說豆瓣,請問各位前輩演算法工程師和軟體工程師的區別在哪裡,他們對演算法能力的需求有什麼差別,以及他們的是如何合作開發產品的,兩者的職業發展有什麼不同


演算法工程師,前端工程師,大家都是軟體工程師。只是細分領域不一樣,沒有本質區別。

在矽谷,我沒聽說過演算法工程師這個title。Facebook在面試名校PhD的時候也會重點申明來的都得干臟活,不會區別對待。

說說具體的例子。我所在的Facebook Newsfeed Ranking在我13年加入的時候只有不到10個人,大家在做所謂「演算法工作」的同時也要負擔日常的「非演算法工作」,甚至包括代碼部署和伺服器監控這類偏運維的工作。至於需要自己動手去做數據收集就更不用提了,Facebook第一版記錄用戶在每個新鮮事上停留多少時間的代碼就是我寫的,網頁端的javascript和後來的Android,算是半個前端了。

說這些不是為了炫耀什麼,只是想說明,好的演算法工程師必須先是一個好的軟體工程師,因為沒有什麼好的演算法是可以脫離工程實踐而成立的

優秀的演算法工程師不應自絕於非演算法工作,就如同好的軟體工程師不應自絕於產品測試。

最後推薦我的另一個回答,宋一松:你實踐中學到的最重要的機器學習經驗是什麼? 說的和這個有些關係。


軟體工程師工作內容可以很泛, 從編程到演算法, 從架構設計到編碼實現. 演算法工程師的工作內容偏向數據挖掘(或其他特定領域), 面向的多是開放性問題, 編碼實現佔得比重不太高, 學習研究不同方法的效果的時候多.

軟體工程師經常調BUG, 而其中的一類, 演算法工程師經常調參數.

對演算法的需求差別在於, 一般軟體工程師可能對各種數據結構的操作, 對常見問題的程序化複雜度的把握, 對設計, 編碼實現能力, 要求比較高. 演算法工程師對特定數據挖掘領域的知識有要求.

通常, 演算法工程師負責數據質量部分, 軟體工程師負責展現. 展現方式其實也挺開放地, 但大家研究地不多, 據我據知, 還沒有多少演算法工程師參與.


這裡可能要稍微clarify一下,這裡所說的「演算法工程師」特指機器學習、數據挖掘領域所用到的非確定性演算法。廣義來說,所有的計算機開發工作其實都會用到演算法,比如遊戲開發、系統開發里用到的經典確定性演算法。為了簡化起見,後面不會特別區分,所以當後面提到「演算法工程師」時,特指的是數據挖掘,機器學習領域的演算法工程師。

如果從工程師的角度來看,本質上我覺得並沒有太大區別,優秀的演算法工程師和其他方向的優秀工程師(比如系統領域或遊戲開發領域)都需要去跟蹤行業的技術進展,也要求紮實的工程實現能力和數理邏輯基礎。比如我很欣賞的一位遊戲開發領域的騰訊資深工程師,寫得一手好code,也能緊密follow圖形學領域的最新技術及學術進展,數學背景也非常紮實。一個好的演算法工程師也基本是類似的背景,只不過把關注的技術子領域從圖形學/分散式系統改成機器學習和數據挖掘演算法相關罷了。所以,沒有必要因為這幾年AI很火,就專門把演算法工程師這個崗位跟其他工程師崗位區分對待。

在國內,因為演算法工程師對應的業務形態剛剛起步,相對來說,處於一個供小於求的狀態

,所以其實有一些演算法工程師的工程能力和經典演算法能力會略薄弱一些,所以「演算法」的比重可能大於「工程」的比重,這在當前的行業背景下倒也不影響短期的職業發展,但是當行業進入到比較健康的狀態以後,我會認為演算法工程師的「工程」這兩個字的比重也要相應提高。


剛好我自己是演算法工程師,很多同事是軟體工程師,說說我了解到的情況吧。

工作產品:軟體工程師輸出代碼和文檔,其中代碼是主要產品;演算法工程師輸出演算法模型和描述,雖然通常也是代碼和文檔,但是目的是為了表達演算法。

手段和工具:軟體工程師用的是各種編程語言和軟體架構。演算法工程師也使用編程語言,但更多依賴各種專業上的工具軟體,例如MATLAB、各種統計分析軟體等等。

關注點:軟體工程師關注使用現成演算法提供應用軟體和解決方案,多數情況下核心演算法是演算法工程師提供的。演算法工程師關注如何解決某一類特定問題,實現某一類功能。

舉個例子說明大家是怎麼合作的。公司要開發一款多媒體播放器,就是通常說的MP4。演算法工程師研究各種視頻和音頻解碼演算法,研究各種多媒體文件格式,研究如何用最少的資源實現最快的解碼速度。在不是很大的公司裡面,演算法工程師通常會負責把上面的演算法實現成一個軟體庫,只提供幾個很簡單的API給軟體工程師(通常就是應用軟體工程師)。應用軟體工程師使用軟體庫,實現UI等外圍功能,形成最終的產品。


一個是里子,一個是面子

如何合作?我感覺就像包子,

一個包子好不好,關鍵是其中的餡兒(演算法)好不好

但是只有餡兒不行啊,還得靠外面的皮兒(軟體),讓這個包子看起來又大又好吃


在我們這樣的機器視覺公司,演算法工程師就是指機器視覺演算法工程師,和軟體工程師的分工很簡單。

軟體工程師設計好演算法模塊可以被調用的介面,演算法工程師去實現這個介面。

演算法模塊負責根據輸入的圖片,輸出檢測結果,比如輸出目標的位置、寬度、是否有缺陷等等。

演算法工程師更多的日常是,等工廠現場的系統工程師給公司的伺服器上傳圖像數據,然後根據這些現場的圖片調整演算法,然後把新版演算法發回到工廠測試。

那軟體工程師做啥?除了以上工作之外的所有和軟體有關的工作(捂臉)。

但實際上呢,演算法工程師的工作遠不止如此。雖然以上內容仍然是現實,但其實演算法工程師的工作不只是做演算法(想啥呢!像我們這樣的小公司怎麼可能分工那麼細)。

一個項目是否能成功,演算法效果好壞是最終的決定因素。通常演算法工程師也更加具備全局意識,因為所有的影響因素,最終都會反映到演算法收到的圖像上。所以,演算法工程師通常都是兼任產品經理的,有時還是項目經理(我們知道這不是最好的做法,但卻是目前最好的做法)。


目前互聯網IT企業招的演算法工程師大多數是搞數據挖掘和機器學習的。

研發工程師就是做應用層的開發,後端研發的要和和演算法工程師提供的演算法介面對接,前端研發的要和後端的數據介面對接。

這麼講起來有點抽象,我來舉個自己的例子。

我現在在一家互聯網移動廣告創業公司做演算法,工程師不多,老大是百度和阿里出來創業的,主要就分為前端、後端、演算法。

演算法的職責就是對用戶數據進行建模分析,比如知道你看過了哪些商品,哪些網站,通過一些數據挖掘的手段來把這些信息轉換為特徵值,從而實現對用戶群體的分類和聚類,這樣才能有針對性地進行廣告投放,以提高廣告的點擊率和轉化率,這一塊演算法的效能基本決定了這家公司的技術硬實力,因為你演算法做得爛,就賺不了錢,融不了資,所有人等著吃翔。

後端開發主要是精通一些web架構,怎麼做多線程,怎麼搞分散式,怎麼解決多並發的問題等等等,如果公司規模不大的話後端研發可能還要兼職系統工程師和運維。系統工程師就是做伺服器配置,做負載均衡,做資料庫的分散式搭建,做伺服器實時的監控報警等等,運維就是維護伺服器日常工作,順帶修電腦做幾根網線什麼的......

前端研發主要還是js和node之流,順帶css編寫。不過現在的大學生多多少少有點誤解前端開發的意思,覺得前端開發和美工是一個幹活,導致了我在最近兩次校招中基本面不到前端的人才(或者實在太水了無法直視)。其實前端還是挺有技術含量的,如果你要是知道幾個不同瀏覽器內核是怎麼工作就已經很厲害了,頁面交互也是個技術活,搞太丑了或者逼格不夠高,也是一個不夠格的前端工程師。

工作兩年來除了前端研發別的活我都干過,如果論待遇而言,相同level下基本是演算法 &> 後端 &> 前端,想進BAT做演算法的話,大學期間沒有ACM regional及以上經歷的話估計不行的。


演算法工程師以(計算/數學/效率/最優)的角度看待軟體,而軟體工程師以(工程/功能/實現/架構)的角度看待軟體。


蟹妖

軟體工程師的概念比較大,不管是做演算法還是工程都可以叫軟體工程師。

像演算法工程師一般主要負責演算法的研究,這種專職演算法工程師通常解決的不是提高確定問題性能的演算法,而是不確定問題的演算法。比如解決預測、排序、推薦等問題,這類問題很容易給出一個解,但演算法的效果卻要經過日積月累的實驗才能逐漸提升效果。

有些公司因為人比較多,資源也豐富,所以人員分工就很詳細了,一個人會專職做一件事做好多年的都有,在創業期的公司或大公司的新項目就不會有這麼細的分工,一般都是統一叫工程師了。


軟體工程師在國內泛指碼農,因為大多數碼農都有個title:軟體工程師

軟體工程師在美國很吃香,因為軟體工程師是一個技術團隊的核心,以工程的思維去做軟體,去思考軟體,包括設計,開發,調試各個方面,懂得設計模式,懂得架構設計,不是我們國內傳統意義的coder

演算法工程師其實比較代表一些科研能力較強的工程師,這些人不太出現在民用軟體實現的過程中,也就是不太參與寫代碼實現功能,一般是在一個產品的初期,去解決技術上的難題,提供一些技術方案,也包括方案的初步演算法實現,比如在X為,一個研究視頻處理的團隊,這幫人會對核心技術的演算法進行實現,弄出一堆庫,一堆包,開發團隊拿到這些核心技術後,就進行實用性產品的開發鳥。


作為前需求分析人員,前設計人員,前開發人員,現人工智慧開發人員,項目經理,來回答一下。一圖以蔽之~

紅色加粗部分就是軟體工程師和演算法工程師工作銜接的部分~

(請注意,具體項目分工比這圖上劃分更細,有更多角色參與。此圖為便於理解,做了簡化。)


真的需要分這麼細么?

其實首先應該有一個好的Arichtect,把東西都大體設計好

然後再跟Engineer合作分析一下怎麼細化。然後pair review,一切都ok了

如果專門分成兩個不同的職能部門,該不該讓他們發生職位衝突和重疊?

我一直覺得從實際中軟體工程師應該包含演算法工程師。

當然,我說的是真的軟體工程師,不是為了僅僅實現一個功能的工程師。


力工和瓦匠的區別


我覺的這是完全倆路子的人,演算法工程師解決的是那麼一類問題,恩,現在我們的系統要加點牛的特性,現在我想知道有多少喜歡看《帝國政界往事》的人也喜歡看《搭訕的藝術》,這事,你讓座程序的打破腦袋也不知道該怎麼折騰,又或者,我們做網路遊戲平台,發現當這貨說完,干以後,跟你娘的概率比較高啊,我們要針對這個詞屏蔽啊。這事,沒有演算法工程師是不成的。

除了以上這些類型的事,剩下的事情就是軟體工程師的活。

兩者互為補充,有時候角色也能互換,不過一般認為演算法工程師這活不太好找到合適的人。


一個合格的演算法工程師首先是一個優秀的軟體工程師。演算法工程師與前後端研發一樣,只是軟體工程師的一個細分工種,不過在解決問題的類型方面有所側重。我想演算法工程師與普通的後端區別在於解決更加偏向研究性和業務性,很多問題帶有很大的不確定性,很多思路和方案都需要驗證和調參才能確切的知道方案的可行性。而傳統的前後端工程師的工作更偏工程性,對於一個問題,有經驗的老手,能否解決,工作量有多少,一看便知。而演算法工程師面對的問題則需要更多的調研和研究。

從工作流上看,演算法工程師更多的是確保業務數據的正確性,提高業務數據的精確度和速度。前後端的同學則是接收業務數據並保證業務的穩定運行以及確保產品的可視化效果。


在我理解的 IT 領域,如果 title 帶有「工程師」,必然是這個職位有一些工程上的要求,除了計算機科學幾門課程的知識基礎,還要有一些基本的系統設計能力,軟體工程在實際工作中的一些實踐經驗等等。

所以我理解的演算法工程師是軟體工程師的一個超集,類似於廣告系統工程師、交易系統工程師、反作弊工程師、賬號工程師等。但是演算法工程師相對於其他職位,對於軟體工程師能力要求的延伸,可能更多要求在對演算法(機器學習)理論的理解和落地實施,更少強調對具體業務場景的理解。


2種都做過。

兩者有相同之處也有不同之處。

相同之處在於:

  • 都需要大量查閱資料;
  • 都需要編寫代碼;
  • 都需要理解業務。

不同之處在於:

  • 軟體工程師更多的面對的是確定性問題,能就是能,不能就是不能。
  • 演算法工程師更多的面對的是不確定性問題,會告訴你能解決80%的問題,需要平衡演算法的準確率和召回率。
  • 軟體工程師加班基本都是產品經理筆的,演算法工程師加班基本都是老闆筆的(搞個大新聞)。


用戶是領導。

領導和前端工程師說我要看到XXX。至於怎麼看到,他不關心。

前端找到後端說,我要XXX數據XXX格式的可用性XXX。至於後端怎麼保證,他不關心。

後端找到演算法說,我要這塊多長時間內得出結果。至於你怎麼做到,我不關心。

演算法工程師對機器說,我要XXXXXXXX但是我還是得關心你怎麼做到的。。。。。

當然這只是個大概的流程,前端自己找演算法研究,後端關注計算機原理而不是工程方面問題的也有,但是少。


推薦閱讀:

程序員找不到老婆嗎?
windows 的系統是在什麼平台上開發的呢?還有他們的伺服器是什麼系統呢?
如何培養編程所需要的邏輯思維?
你有哪些解決bug的技巧?
一個獨立遊戲製作人需要哪些知識?需要應用哪些工具?

TAG:軟體開發 | 軟體工程師 | 豆瓣 |