ACMer在未來工作中會有哪些優勢?
小的軟工在讀,平時主要搞acm競賽。各科成績不錯,打算讀研。但對目前行業內工作需要和使用的東西不甚了解,缺乏方向,想麻煩問各位前輩:
1.ACMer學的東西在實際工作中是否有用途或是否能轉化成優勢?
2.工作中真的會用到那些演算法嗎,看了網上有人說工作中稍複雜的演算法都是直接用現成的。工作中用到的演算法是什麼樣子的?
3.ACMer學習哪些知識會更有利於找到一個不錯的工作?ps:雖然對行業內具體「工種」了解不深,但不打算搞前端。。
—————————————————————
看到有前輩來回答真的很高興,非常非常感謝。補充一點吧,倒不是只在意acm的錢途,而是看現在有些同學在做老師和學校的項目,比如寫個學校某網站,做個app,還有些看起來更高級的「基於balabala的balabala」等等。我們老師也說要多做項目,所以疑惑在這個階段做項目的重要性,我要不要擠出時間去找個項目做做。。但又感覺自己除了寫演算法做題什麼都不會,知識面太窄了。。只憑藉自己的acm經驗而無項目經驗在找工作時是否是很大劣勢。
@王贇 Maigo 說的很好了,簡直沒什麼可補充的。雖然我們都沒工作,但是我也有和他差不多的體會。
他說的第一個優勢其實是「問題抽象能力」。這一步抽象非常關鍵。比如在知乎上經常看到諸如「我會演算法導論中90%的演算法,什麼水平?」的提問,什麼水平一方面取決於你懂什麼演算法,另一方面取決於你會不會用,兩者缺一不可。而前一種容易提高,後一種不但不好提高,很多人甚至意識不到。比如在高中數學課,圓錐曲線的公式大家都背得牢,但是記住這些公式絲毫不能保證你會做高考中的難題。同樣的道理,在正常大學,關於演算法的抽象練習很少,比如清華計算機系的數據結構課一個學期的編程作業也就20題,這是整個本科的演算法訓練了,顯然數量是不夠的。ICPC則給予了參賽者大量的練習機會,一年怎麼也得做個幾百題吧。在這個過程中肯定問題抽象能力會得到大大的提高,這個是不參加的人很難鍛煉到的。
另外說到複雜度,大家都知道ICPC比賽的關鍵就是寫代碼的速度要快。所以除了時刻注意複雜度不能超標之外,還有一個不可忽視的方面就是,bottleneck的地方重實現重效率,其它部分重速度。這對於以後也有兩大好處:1. 沒有訓練過的人可能沒有類似意識,程序過於重視或過於不重視細節;2. 非bottleneck的部分可以隨便調庫,bottleneck的部分因為懂演算法可以親自手寫高效實現。(畢竟庫要注重兼容性和通用性,會犧牲效率)。作為一個還算打過ACM ICPC的來簡單答一下吧。
工程和ACM ICPC其實本無太大的差別,都是在限定的條件下去解決實際的問題。
拿工程來說,學校實驗室里做的項目,大部分實際上處於『玩具』階段,相較於工作後在商業公司接觸到的項目來說,前者只需要關注功能的實現,後者,則需要考慮實現商業價值。故,大家基本都有「在學校選課的時候,選課系統掛了」這樣的經歷,說到底還是因為根本沒考慮高並發的問題,然而這些問題,在商業項目上是根本不可容忍的。
不同之處在於,ACM ICPC接觸到的各類題,對基礎演算法的訓練會有極大的幫助。
不管是在研究jdk源碼的時候(像hashmap之類的都是秒懂),還是在研究並發庫的時候(AQS、ReentrantLock,以及cache line,false sharing之類的問題),也能很輕鬆的應付。範圍再大一些,像分散式鎖,消息隊列之類的東西,理解起來也輕鬆許多,因為,工程本質上,不就是一道大模擬題么?
記得在校招的時候有次面試,面試官這麼評價的:「ACM其實就是內功,有了這個基礎,學其他的基本都是信手拈來,差的只是招式而已。」
確實如此,作為一個飽受熏陶的ACMer來說,小到一個實現中的複雜度,大到代碼結構,都不會太差,至少不會明明有nlogn的偏偏去寫個n^2的。而且在不斷的訓練中,對思維的提高也是極大的,無論是去做業務還是去做架構,對個人的提高都是非常有幫助的。
當然,對於找工作來說,ACM經歷是加分項,必要的基礎還是免不了的。如果面向找工作,還是需要去準備一些工程方面的東西,畢竟,內力需要使出來才行啊。
毋庸置疑,參與ACM是人生的一筆財富。但是...
需要換個角度來理解這筆財富以及它對你未來事業的影響:這筆財富無關於你學會了什麼牛逼的演算法,不是掌握了什麼複雜的數據結構,不是那些醒目的Accept,不是那些綁在比賽桌上的氣球,不是那張certificate,都不是!這些可以拿出來炫耀、拿來撩妹,但就像你自己疑惑的,這些東西在實際工作中要轉化成直接價值,是很難的。
但是一樣東西,雖然很難炫耀,也很難定價,但是跟你未來的命運息息相關,也是ACM的經歷帶來的真正的財富:thinking with quality(作為中心思想,這裡用英文感覺氣場要強大一點)
點跟線,對應數據結構與演算法,是思考和解決問題的關鍵,是一個通用的思考框架。
它讓你學會正確的思考,跟問題的類別無關:可以用來思考產品和運營的關係,可以用來思考人力資源和工作流程的關係,可以用來思考客戶和市場的關係,當然也可以用來思考碰到的技術問題。
它讓你學會權衡和取捨,跟資源的類別也無關:時間可以換空間,空間也可以換時間(當你遇到效率或內存瓶頸的時候);折損安全性可以換來便利性,折損便利性可以換來安全性(當你思考產品key feature的時候);錢可以置換出速度,放棄速度可以節約錢(當你思考該不該融資的時候)...
它讓你的思考有邊界,有bottom line:就像 @王贇 Maigo提到的複雜度那根弦。
當你用動態規劃解決了原來怎麼優化都會超時的問題時,你學會的不是動態規劃,而是用空間換時間的方法。在做ACM的過程中,一定會遇到很多極具挑戰的難題,解決這些難題的過程,就是積累這些財富的過程。其實說的通用一點,很多真正的財富都不是結果帶來的,而是過程帶來的。
這些能力,才是你跟那些非ACMer的區別(當然這些能力的獲取途徑非常多,不一定必須通過ACMer)。
社會分工協作的趨勢一定是越來越動態,越來越難以預料,五年前產品經理很吃香,現在呢?iOS工程師曾經一度供不應求,現在呢?現在深度學習工程師很緊缺,未來呢?任何一項具體的技能,都是技能樹的葉子節點,只要你有根,就不怕長不出新的葉子,去適應明天的陽光。這個根,就是thinking with quality。
最後,回答你的問題:你的技能樹不能只有樹根,也要長出葉子去光合作用,葉子吸收的養分讓樹根變得粗壯,最後你才能成才。所以你的擔憂是對的,項目應該抽時間參與,只是不要本末倒置就好。
祝你成才!
(答主代表同濟大學參加了2004年ACM分賽區比賽:0氣球,安慰獎)我覺得,最主要的優勢就是,在學習ACM的過程中,你接觸到了大量的問題和演算法,碰到實際問題之後,能夠化歸成演算法問題。如果沒有學過ACM,你可能根本就不知道你面對的問題是什麼。化歸成演算法問題後,你也知道哪些問題能解,怎麼解;哪些問題無法精確求解,只能近似。
第二個優勢就是,學了ACM的人腦子裡會有「複雜度」這根弦,寫出的代碼往往效率比較高,不會犯那種把複雜度提高一個量級的傻錯誤。
當然,還有一些比較次要的優勢,比如寫代碼快之類的。
實際工作中當然有許多基本演算法和數據結構是有工具包可用的,比如快速排序、二叉搜索樹。但畢竟不是所有的問題都能直接套工具包,不那麼通用的演算法,還是要手寫。
1. 有用,有優勢,優勢的程度與你是否對演算法融會貫通有正向關係。但不要覺得優勢很大,一個邏輯思維優秀但沒經過acm訓練的也可以碾壓只會按套路出牌的acmer。
2. 比賽套模板你也得懂原理啊,工作中有現成的庫,但不妨礙你要快速了解掌握內部實現。實際工作中不會像訓練一樣各種類型題目來一遍,你會有選擇的深入研究。另外,對時空的權衡也是工程上經常需要考慮的。
3. 基礎演算法紮實才是硬道理,解決特定問題的數據結構和演算法有很大概率以後你基本碰不到。至於好工作的事,多問問師哥師姐情況吧。
但總覺得題主是在問acm有沒有錢途?那還不如先好好了解什麼職位比較吃香。
…………分割線…………
問題有更新,我也更新幾句
身邊有演算法nb,但工程薄弱的師弟,final有過名次的那種。來網易遊戲面試被刷,後來進了google。
選擇比努力更重要。不同方向和職位所要求的個人技術能力不同,所以不能光靠演算法能力以偏概全。
建議大學期間多接觸業界信息,上手幾個項目試試,開拓眼界也有利於在競賽中帶來一些奇思妙想。沒嘗試過你怎麼知道自己是否感興趣,是否能行,人生各階段的經歷無非是讓你能更加了解自己。
大學期間的ACM和項目對以後的工作來說沒有本質區別。
如果要說有,那可以說ACM證明了你在同學裡算頭腦比較聰明的;項目經歷,如果實打實做下來能談出得失的話,那可以證明你在提升解決問題的能力。至於ACM里具體的演算法、項目里的具體技術,可能有用,但更大的可能是沒用,人家錄用你的時候不是為了你的具體技能,而是這些經歷所證明的內在實力。讀書時能在這兩項技能之一做出點成績的人,至少是會主動學習、挑戰困難的。
說具體的,你做項目時會發現真實的軟體跟純演算法程序比起來要考慮很多很多。玩ACM的是聰明人,分一點精力出來體驗一下,提前給自己培養一點真實軟體的工程意識,有益無害。優勢是有的,但不會特別明顯
作為一個曾經的acmer
我自信純以演算法而論,我可以完爆全公司90%以上的程序員
但是日常工作中需要用到特定演算法的地方很少,所以這其實並沒有什麼卵用
無非可能是哪天
坐隔壁的同事:誒,這個環節排序的速度太慢了,我都用快排了...
我:換基排試試
對工作有沒有幫助仁者見仁智者見智,但能拿到區域賽金牌銀牌的話,apply for 國內大部分計算機實習基本沒啥問題(尤其對於在校生第一次找實習來說)
有,非常有!
我參加工作超過四年,身邊ACMer還非ACMer差別非常明顯
講道理還是有用的,昨天剛用scala寫了樹的遍歷。。。。
不過通常也就這個難度了,再難的還沒用到過
先不說這個問題的答案,題主只要是這樣問的話得出的答案肯定是有用(都不用想),而且高票點贊的肯定都是acmer不acm的肯定不關心這個問題或不回答這個問題,所以你得到的答案肯定是有用(就算真有用也不代表對每個人有用)
第一眼以為說的是ASUS Campus Master(???)
文科生匿了
假裝是個ACMer的路過(因為木有牌子)
怎麼說呢,可能工作方面真的用的不會特別多,特別是java大行其道,github與各種開源框架可以解決絕大多數(目前是99%)coding問題的時候,ACMer的各種演算法都是被需求趕到了一邊,你只需要完成基礎業務邏輯的搭建與實現就差不多了,某些模塊的小數據量下(一般情況下不會超過1000)你寫個O(n^3)也不會有太多問題.而且資料庫充當了絕大部分數據處理的工作,你只需要寫出一個足!夠!用!的SQL語句即可,剩下的就是美工的和設計做數據填充展示的事情了~
但是,你說完全沒用也不是沒用,比如位運算做做標誌位,一些功能裡面偶爾秀一下空間換時間,還是很有必要的,畢竟編程素養不僅僅需要CTRL+C,CTRL+V.
做一個獨立自主思考的程序員,而不是一個只會依賴別人的碼農,畢竟職位上寫的是軟體工程師,不是么?
智商優勢
ACM的有些題目你可以很輕鬆的想到通過遞歸,循環等方法解決,但是提交的時候就會發現超時了。使你不得不產生這樣的疑問:這樣的演算法真的是最優的嗎?
與其說ACM考驗編寫能力,不如說更加考驗的是比賽者對於問題的數學模型建立和分析的能力,所以說一個高手ACMer的數學水平是很強的。目前的許多遊戲公司都會面臨優化的問題,這就是尋找最優演算法的過程,A公司需要12ms完成渲染,B公司卻需要100ms,用戶體驗相差是很大的。
第一:某些公司招人的時候可能會加一點分,可以避免只讀書,在面試的時候沒有可以談的內容。
第二:可以幫你在工作中抗住壓力,當你收到測試部提出的N+1個bug的時候,不會方。
第三:可以作為茶餘飯後吹牛的內容。
第四:如果工作內容是相關的,入門會快一些。
剛想說沒有,然後發現問的不是ACer……
想去做計算機理論或演算法研究,可以研究。未來想干程序猿的,當成個人愛好就行。ACM可以說就是個編程界的奧數,需要智商才能玩的溜。參見杭州的樓教主。大一,大二還去做做題。有些題用的其實是一些編程套路。我還記得我提交那個A+B=C(http://acm.zju.edu.cn/),在線編譯給我返回ERROR。我甚至懷疑編譯器有問題。有的高端的,鍛煉你模型分析,演算法設計。更實際的影響的話,有個競賽獲獎證書,將來給面試官,相信我,技術部的人一定對你點頭的。
沒優勢,只是你比一般人可能多了寫了不少代碼。
推薦閱讀:
※請問高並發是誰?
※產品經理究竟是做什麼的?
※怎樣讓別人秒懂什麼是O2O ?給一般人帶來什麼好處?
※頂級的 Linux 運維人員應達到什麼樣的要求?
※以後做技術這行喝酒真的是必須的嗎?求解,謝答?