演算法與IT就業的聯繫?
演算法要學到一個什麼地步才算合適?我當然知道是越深入越精通越好,我想知道的是就將來的IT各行各業就業而言,演算法在工作中會起到多大的作用?
---------------------------------------------------------------我是分割線------------------------------------------------------------嗯,可能我表述的不太好。我想說的是對於就業來說,演算法要學到一個什麼程度才比較合適。是要深入去理解他的數學原理,還是只要求能夠熟練的掌握就好?
目前來看呢,您要是不怎麼會演算法,也有的是各種各樣賣力氣搬磚的傻活兒,肚子大概是餓不著的。這樣的碼工還蠻多的,所以可能會給你一種「演算法似乎也沒什麼用」的感覺。
多背熟點演算法呢,能幹點開挖掘機這樣的技術活兒,能多掙點。
最值錢的應該是自己能為新出現的問題設計新演算法,但這個如果不是撞大運,一般需要大量看不到立即實用價值的知識與思辨積累,所以這樣的人好像一般首先需要做到不太關心「演算法要學到一個什麼地步才算合適,在工作中會起到多大作用」這樣的問題。
其實還有很多和演算法一樣重要的技術能力(比如模塊化代碼的能力,理解代碼的能力,調試代碼的能力,重構代碼的能力,設計介面的能力)和知識(比如操作系統的知識,編譯器的知識,語言設計的知識,硬體的知識,並行處理的知識,功耗的知識),只不過演算法是相對來說最容易考核的一個。其實吧,考察應屆生的能力怎麼考察呢?
做過項目嗎?沒有有工作經驗嗎?沒有沒有經驗是不是就不能成為好的程序員呢?當然不是,沒有做過項目是不是就不能成為好的程序員呢?更不是,那什麼樣的應屆生才有潛力成為好的程序員呢?
首先要有嚴密的思維,好的程序員和碼農的根本區別在於了解問題以後能夠用嚴密的思維分析問題並且設計解決方案,這是怎麼培養的?就是用演算法培養的所以說,能夠完整說出一個演算法的思路,首先,說明這名同學思維比較嚴密,表達能力比較強,對問題能有一個清醒的認識和分析,這就已經甩開很多人了緊接著,能夠用一種語言快速的實現某個演算法,這說明對這種語言用的比較熟練,這又甩開了很多人同時,你在工作中,就算是演算法一般都用不上,數據結構是常常需要用的,最簡單的,從某個地方獲取的一批數據,怎麼存儲,用什麼樣的一個結構存儲,這是常用的更是必備的技能,如果基本的數據結構不了解,類、結構體都不會用,工作中確實會遇到很大的困難總的來說,公司並不是需要一個熟知演算法,甚至能夠設計演算法的應屆生,而是通過演算法的考核,可以了解到很多東西,比如對問題的理解,表達能力,思維是否嚴密,對語言的掌握程度,編碼風格等等,這些才是最重要的考核點
當然了,比如演算法時間複雜度的考核也不是沒有用的, 能夠準確分析演算法時間複雜度的同學當然會對程序的執行效率有所認識,就會在工作中儘可能寫一些高效代碼,而那些連時間複雜度
都不知道的同學,一般來說,很難寫出優雅的代碼再說一下,很多東西,你以為沒用,其實潛移默化非常有用,你以為會一個快速排序和只會冒泡排序的同學沒什麼區別,其實恰恰相反,了解更多演算法的同學的眼界也會開闊一些,所了解的解決方案會多一些,他們更加清楚代碼是怎麼執行的,應屆生中甚至有一批人連指針、遞歸這些基本的東西都用不好,就不要說工作了
演算法要學到一個什麼程度才比較合適?
這個問題吧,應屆生來說,把《演算法導論》實現一遍我認為就比較OK了,當然不是僅僅把書上的代碼單純的敲到屏幕上,理解書上的描述,然後實現,然後對照書上的代碼看自己的代碼有什麼不足或是BUG演算法在工作中會起到多大的作用?工作中其實是可以用到一些基本的演算法和基本的數據結構的,比如寫nginx擴展,用到定時器,就要知道紅黑樹的基本原理了,當然了,如果讓你寫一個紅黑樹寫不出來沒關係,nginx源碼里有封裝好的紅黑樹,但是你得知道原理,知道什麼時候用以上描述的都是按照題主的提問進行作答的近來機器學習、自然語言處理、智能神經網路、推薦演算法這些演算法領域越來越火,如果是相關專業畢業的研究生或更高學歷的話,面試演算法顯然就不是上面說的這種情況了,要求也不可能僅限於此,因為你的工作將緊密圍繞演算法展開,所以對演算法的了解和理解相對較高,僅僅知道一些基本概念,或者寫個排序、查找顯然是無法符合要求的那這個要求有多高呢?至少熟練掌握本專業內的演算法,將專業課上的東西熟記於心,知道每種演算法的應用場景和演算法間的差異,能夠對實際問題進行建模,對演算法效果和性能有過比較
編程能力、語言的掌握在這種情況下就顯得並沒有演算法本身重要了y 為你的工資,x為各項能力,演算法只是其中一個比重比較大的,並且相對易於考察的。
IT就業(面試/筆試)和入學考試是一個意思,考不過就進不去,參考:如何看待 Max Howell 被 Google 拒絕? - 互聯網。所以關鍵的演算法全部要背,要會默寫。這是很無奈、很可悲、很可笑的事情。
至於工作中起多大作用,就要看你的工作內容了,大多數情況下根本不需要也不應該手寫那些教科書式的經典演算法。多數情況是直接拿來用,比如各種神奇的hash函數、std::lower_bound、ZFS源碼里那棵Sun的AVL樹;少數情況是對現有的某個演算法的某家的實現進行移植、裁剪、調參、定製;極少數情況才需要研究全新演算法,這樣的話不發篇論文都對不起自己(投出去給專家審稿,也能看看是否真的發明了新東西 and I doubt it)。
關於數學原理,我覺得除了複雜度分析根本沒啥關聯。計算機的演算法講究的是實實在在的數據結構與求解策略,不是什麼抽象的「集合」「矩陣」「泛函」,也不是一個個等式算下去就能得出解,不然直接套公式得了還要演算法幹嘛。從這個角度來看倒是跟數值分析有類似之處。
BTW: 真的真的真的很討厭那些背演算法、寫grep/sed/awk式的面試題。數學系隨便抓個人來,也不見得他們能夠當場給出中值定理、格林公式、橢球表面積公式的證明。這些不會根本不能否定個人能力,這隻能說明「他最近沒在看那些玩意兒」 !不管是演算法還是定理,其本身並不重要,從中學到的思想才是最重要的。
最後推薦一本書:圖靈社區 : 圖書 : 程序員面試金典(第5版)只看了標題,演算法與IT就業的聯繫就像學語文與當老師的聯繫。老師有很多種,有教數學的,有教物理的,但是都得有點語文功底,要不會讓人家笑話。但是如果你是叫語文的,你就不能只有一點功底了,你要有一定的文學造詣。
我以前有個手下,大專畢業,人超級勤奮,也很聰明,各種調試工具優化工具用得啪啪的。從asm到C到java到html自如切換,從bsp到os到application都開發過而且完成質量很好。但是…但是…我們有個產品,鑒於他此前的良好表現,任命他為開發團隊的頭。開發初步完成後,產品各項性能指標都很好。但到考慮應用場合後,問題來了:他不懂怎麼微積分轉換成代碼!他對工程數學公式一無所知!他不能理解控制理論!
抓狂的是,我們溝通,讓他學習理論後(他此前學習能力是非常強的)。來來回回還是用一些土辦法來解決問題。似乎一碰到演算法,他連正常的思維都沒了。
很遺憾,最後是以他離職收場。(當然還有其他原因,不展開了)這是一個雙輸的局面,公司與他自己,對他的能力評估都有問題。演算法的作用有多大?對我來說,產品做出來,if else即可;但產品要做好,必須得靠把演算法吃透。演算法的能力跟你的智商和學習能力有很強的相關性。
看來程序員的十字路口是「泛函、集合、圖論與xxxx。。。」和「電子碰撞與硅的提純」
工作就是把複雜業務轉換為代碼然而演算法中最鍛煉這種思維
不會演算法永遠沒辦法深入,就只能停留在調用別人寫好的API水平。。個人覺得,演算法和數據結構是用來區分工程師和碼農的。。
我想說沒啥關係~
首先it的內容就不只是寫代碼,架構設計測試之類都不常需要高深的數學能力。
其次,就算是碼農一枚,你很多時候考慮的也是業務怎麼實現而不是需要什麼演算法。
最後,真正的演算法問題往往都能找到資料甚至源碼,這種時候你演算法知道再多也沒什麼用武之地,更有甚者,你自己寫的演算法和已有的東西比起來就是渣,這時候知道翻論壇博客比會演算法重要的多~
所以,演算法其實很多時候是那一小撮學者教授做研究時用的~和工作關係不大~
當然,如果你知道有某個演算法可以解決什麼問題時,你找到資料的速度會比別人快很多,別人看起來就是~哇!這個人的演算法好nb啊!
以上搶個首答。本人學生,一點淺見,拋磚引玉。歡迎批評指正。
個人所知,嵌入式對演算法要求不高。有些地方用操作系統,但也不複雜。網頁設計,前端軟體開發(php之類)要求不高。寫腳本一般演算法要求不高。上邊這些可以稱作一般的業務代碼。
操作系統開發要求相對高一點。
遊戲開發要求高一些。數據挖掘,資料庫開發,機器學習,大型系統架構設計對演算法要求最高,機器學習同時一般還要求一些微積分,線性代數,統計,等工程數學知識的熟練應用。如果要追求技術上的頂尖水準,個人認為必須得深入學習演算法不可。但看了知乎上的回答,感覺高薪主要取決於對熱點方向的把握,而不全是技術的高低。演算法一般屬於核心部分,不需要會的人多,所以之所以覺得沒用是因為演算法沒有牛逼到可以勝任這份工作的地步。
不管白貓黑貓 能迅速抓到老鼠的就是好貓
考應屆生演算法不是為了考演算法,而是為了看「有沒有認真學」和「腦子好不好使」。能擼一個快排或者難度相當的經典演算法,知道什麼情況不能用貪心法,面對略刁鑽的智力題有思路,我覺得就可以了。
演算法or數學和就業是間接相關的,和直接相關是不一樣的。
研究生期間可以從推薦演算法哪些方面做準備,為將來就業
反正對我來說沒什麼用。
推薦閱讀:
※CS專業工資那麼高為什麼大家不都去學CS?
※K-means聚類演算法如何應對數據的噪音和離散特徵處理的問題?
※圖的鄰接矩陣/關聯矩陣的秩有什麼直觀的幾何意義嗎?
※Yann LeCun、Geoffrey Hinton或Yoshua Bengio能得圖靈獎嗎?
※數論在計算機科學中有哪些精彩的應用?