1. 程式人生 > >ACM很重要嗎?

ACM很重要嗎?

以下資訊並非個人意見,是來自網路上的資訊,僅供參考!
----------------
問:我想做專案,老師卻推薦參加acm,身邊的朋友很多選擇了acm,acm對未來的發展很有用嗎?
答:這個難說呀~~ 自己說點薄見吧:
     ACM ,從某種角度上來說不能說它很重要吧, 因為,你學習了它兩三年之後,不一定是牛人! 牛人出來咱就不說,“銷路”肯定很好了。 如果,混的不是很咋地,那麼你出來 很多中小型公司一般都不需要你這樣的人。 為什麼呢?  因為ACM 重在演算法設計方面的,而一般的中小型公司對這個要求不是很高,他們只要做寫網站呀,辦公軟體什麼的,事務流程處理方面的,即使偶爾碰到一般的不是非常複雜的演算法方面的,請教人就可以了。  
      這個就和做專案不一樣呀, 是不是? 在大學做了一兩年專案,效果明顯呀。 咔,什麼JAVA 呀,JSP,ASP, strut ,spring ,java , ajax 一堆 啥東西都瞭解些,出去可以直接上手不是? 外面中小型公司就喜歡這樣的,出來就能幹活的。 所以學習做專案出去找事做容易。
     但是呢,話說回來了,做專案這個東西嘛,如果你只停留在不停的只是使用別人的框架控制元件,拿來合理的組和起來使用,處理一些流程事務,搞範圍窄,搞多了,總那些東西,只是不斷重複的寫程式碼。結果就像程式碼工人一樣。  

     在說說ACM, ACM 是考演算法。ACM 裡面程式碼長的不一定就很牛逼(有些人老是喜歡把程式碼長度來作為衡量),別人一個不到百來行程式碼就是短小,精悍,就是勝過你那幾百行的程式碼。 別人程式碼跑起來,就是比你快,比你耗空間少。 這是為什麼? 別人的演算法,思路比你更加高明。 別人的程式碼,就是赤裸裸的放在你面前,你就是搞不懂他這是為什麼? 這種搞不懂,和你那種學習新知識不一樣。新知識,要麼是不懂語句意思,或者不清楚其底層結構而搞不明白。 這種搞不懂,是你不知道為什麼這麼解決問題,不明白他用的是什麼思路。 ACM 是智慧的比拼。
     搞過ACM 的人,如果再做專案或程式設計其它的,肯定有個慣性思維就是: 這種方法實現好不好,會考慮效率怎麼樣的問題。如果現在 這種效率低,你總會不自覺的去想如何解決這種低效率問題。   而且,搞ACM 後,寫的程式碼肯定要比以前緊湊些。 因為在ACM 有時方法上一樣,但是你實現起來,別人跑的速度明顯比你快。所以你會慢慢不自覺的養成寫成高效率的程式碼的習慣。
  
    我總是覺得,如果做介面,資料流程控制是外表的話,那麼演算法是核心。而且,如果你對演算法有了很精通,那麼對你以後的計算機進一步發展有很大幫助。 為什麼呢? 因為,計算機程式設計深層的東西,往往牽涉到演算法方面的知識。因為,深一點的總是需要更高的效率和更少的空間需求。 如果你要做出一個高效的東西出來呀。 高效東西做出來,不是人人都能做的,思路肯定要比別人先進呀。比如:你做個路徑地圖查詢位置的軟體,你查詢一個簡單的圖跑個幾分鐘,甚至幾十分鐘,抑或更恐怖就是“Windows office 系統,嘎~~ 死了~”,這樣你的介面做的再漂亮,你的資料傳輸,邏輯控制再好,就是趕不上別人介面簡單(抑或更簡單些,就dos 那種黑屏介面),但能幾秒鐘內搞定的東西。
      當然,這說的有些片面了些。 說點薄見,肯定有不適之處。 我現在上論壇,常常看到有些做專案的人 說: 現在如果專案一牽涉到演算法方面的就頭痛。  CSDN 上一個 專家也提到如果在計算機方面有更深的發展,演算法是很重要的。
-----------------
問:ACM有那麼重要嗎?
我來自杭州電子科技大學軟體工程專業,我們的老師極力鼓吹ACM 的重要性,經常組織比賽,好像不會ACM就不能就業.請大家分析一下.

答:這麼和你說吧,我大學的時候參加過ACM,後來去微軟亞洲研究院實習的時候的面試題都相當EASY,都是平時接觸過的題目。
不是說ACM重要,而是演算法的重要性,啊懂?

acm只是一個比賽,但是這個比賽卻能帶動學習的積極性,如果是全省性或者全國性的,乃至國際性的acm那就有一定的證明力,比什麼什麼證書那可強多了
-----------------
問:學習ACM演算法在公司工作時應用大嗎?演算法人員地位很好嘛?
答:這要看你在什麼型別的公司了。像搜尋引擎型別的公司,比如谷歌和百度,很喜歡ACM得獎的人,因為他們有著非常龐大的資料庫要管理,每天要不斷的更新,新增,刪除,修改之類的,需要非常好的演算法和資料結構才能有效的進行這類工作,所以他們很喜歡理論派的人,尤其是ACM好的。如果是一般的軟體公司就不是那麼的看重。有些由於軟體規模較小,不需要過渡優化,有些可能是軟體本身的特點,用不著那些演算法,比如遊戲。而如果是涉及到底層的東西,比如作業系統,這些ACM的東西幾乎用不上,因為硬體完全限制了演算法的使用範圍,比如很多地方只能進行位運算或者一個位元組一個位元組的來。總之演算法人員只有在正確的地方才能發揮自己的價值,不像程式設計人員在哪裡都可以。如果你能進入谷歌這類的公司那你可能蠻吃香的,否則其他的方的話很難有用武之地
-----------------
有同學提問:
===============================================================
楊中科老師你好,我想向你諮詢下工作的事情。
先介紹我的情況普通本科大二學生,,之前一直在練acm的題,也獲得了一些大賽的獎項,有一天有個人問我,叫我做一個小軟體,我發現我不會。。更慘的就是我好像什麼軟體都不會做(這裡指的是基於c/c++的開發),,除了console的一些演算法題,,然後我和自己說練acm夠了,應該開始學開發工具的運用和一些庫類(函式)的使用了,,這樣2個星期下來,我翻了很多關於商業程式開發資料,我發現商業程式程式碼真的很少涉及到高效演算法和一些特殊的資料結構,而且我也問了幾個現在在公司上班的師兄,他們也說工作中真正用到acm的知識是很少很少的。現在一系列的ACM比賽又差不多開始了,我現在一直沒準備。。
    老師我想問的就是以你多年的工作經驗來看,具有ACM背景的人的優勢在哪,,還有優勢大嗎?還有假如我如果現在(大二)拿ACM的獲獎證書和帶上之前開發一些小軟體的例項去找工作的話,,人家會很輕易的接受我嗎?其實我大一的時候就獲得了金山軟體公司的實習邀請,,不過他說等到我大三暑假的時候才讓我去,但是我家的經濟深受這次金融風暴的打擊,,所以我想大二讀完的時候就出去找工作幫輕下家裡負擔,,我很期望您的回答。。
               還有我補充下我的個人簡歷,,我跟過一老師做基於.net的關於某公安局的專案,,英語四級,,是學生幹部,,學習成績80分以上,但是我看了看就業形勢真的太差了,,我一直在擔心公司為什麼要我個大學都沒畢業的。。
              最後我還想問下我除了專業領域獲過一些獎項,我在其他的專業課程上也獲過獎的,例如 一個全國性的營銷比賽,這對我找技術方面的工作有優勢嗎。。。還有我之前我看到您大學的時候投過稿,不知道這對你找工作的時候會有優勢嗎,因為我一直也想投稿到一些雜誌和報紙。但因時間太緊。。一直未能如願。
====================================================================
我的回覆:
你說的“商業程式程式碼真的很少涉及到高效演算法和一些特殊的資料結構”這是實際情況,因為並不是所有的公司的產品都是理論性很強的產品,就像造山寨手機的人不需要懂太多晶片設計等方面的知識,只要會把大公司製造的手機晶片拼裝起來,然後裝一個外殼就可以了。“高效演算法和一些特殊的資料結構”已經由IBM、微軟等大公司解決了,製造成了一些類庫、應用伺服器、資料庫伺服器之類的“零件”,商業程式開發者只要把這些零件按照需要拼裝起來就可以了。在大公司工作的人是少數的,所以你問的師兄估計也都不是在這些大公司工作的,所以他們說“工作中真正用到acm的知識是很少很少的”也是可以理解的。

ACM被譽為計算機界奧林匹克,每年的獲獎者都幾乎被google、微軟、IBM、百度等大公司哄搶一空,很多大公司贊助ACM賽事的目的就是“近水樓臺”,能夠比其他競爭對手籠絡更多的人才。

ACM可以看做是“聰明者的遊戲”,在ACM題目研究深入的人通常有非常高的數學素養、計算機演算法素養以及非常強的分析問題、解決問題以及動手的能力,能夠處理各種高精尖的難題,這是各大公司哄搶ACM人才的主要原因。

ACM的程式開發和開發商業軟體的不同點就在於寫ACM程式是研究(Research),而寫商業程式是開發(Development),這就是研發(Research&Development)兩個字的含義,“研發”就是“研究開發”,像微軟、IBM等這樣的公司都將研發人才分為兩種:研究性人才和開發性人才。以微軟為例,在中國,微軟設立了微軟亞洲研究院,同時微軟亞洲研究院下設微軟亞洲工程院,微軟亞洲研究院中的人主要的工作就是出paper(論文),根據微軟總部下達的研究方向進行核心技術的研究,然後將研究成果轉換為可以實施的方案,由微軟亞洲工程院的工程師進行實際的開發,簡單的講就是微軟亞洲研究院的人負責研究課題,然後由微軟亞洲工程院的工程師根據研究結果開發出實際可用的商業化產品。因此微軟亞洲研究院的人都是擁有很強科研實力的人,而微軟亞洲工程院的人則是有很強開發能力的人。像google、IBM等大公司也有類似的部門職位劃分。對於一些次一級的大公司來說,比如百度、網易等,也在職位上進行著類似的劃分。
他們的區別就像研究動力學的人和設計汽車的人的差別一樣,研究動力學的人只負責從研究一些理論,不負責實際的汽車設計,而是由專門的汽車設計工程師來負責根據研究成果進行實際的產品設計。比如對於做搜尋引擎來說,研究性人才負責研究檢索方面的理論,得出一些公式、演算法、理論,然後由開發性人才負責根據這些研究成果寫程式,然後變成可以實際使用的搜尋引擎。

研究性人才對智商要求比較高,處於人才金字塔的頂端,因此收入、待遇各方面都更高一些,職業發展就是“科學家”;而開發性人才的優勢則在於理論轉化為產品的能力,因此開發性人才中獨立創業的比例更高。

看了公司的職位劃分你就能明白白商業化軟體開發和寫ACM題的區別在哪裡了,你就知道做ACM題背景的人和掌握商業程式開發技能的人的不同定位了。如果ACM成績非常好,那麼進入這些國際性大公司的概率會非常高,哪怕去不了大公司,中小型公司也非常歡迎這種基礎理論紮實的人才,因為他們可以解決別人解決不了的難題,但是這類人才通常要價比較高,很多中小型公司難以承受,同時中小型公司並沒有獨立的研究部門,所以這類人才進入公司以後通常都是兼有研究和開發兩重責任,當然也是處於公司人才金字塔的頂端,享受特殊待遇;開發性人才則是各個型別的公司都需要的,相對來說選擇面廣一些,但是初始階段的收入會比研究性人才低一些。你需要根據你的情況來給自己定位,如果是做研究性人才,那麼就繼續把ACM弄好,多參加ACM大賽,特別是正式的國際性ACM大賽,爭取拿獎,同時做好進行研究生學習的的準備(ACM成績好的話一般都會被科研院所免試錄取),在研究生階段進行進一步的理論研究和培養自己的科研能力,這種方向的話不需要管什麼java web開發、Windows程式開發這類的實現性技術,只需要把演算法、模式識別等理論課程學好即可;如果你的定位是開發性人才則把主要精力放到java web開發、Windows程式開發等上邊來,如果從事這個方向,因為你已經有一定的ACM的基礎了,所以應付面試筆試中的那些演算法難題不在話下,那麼就在把一部分精力繼續投入在ACM的學習上的同時,把更多的精力投入到這些商業程式開發的技術上去。
至於你提到的“公司為什麼要我個大學都沒畢業的”,你可以看這幾篇文章:
http://www.rupeng.com/index.php/viewthread-514

http://www.rupeng.com/index.php/viewthread-431
http://www.rupeng.com/forum/thread-1211-1-1.html
“一個全國性的營銷比賽,這對我找技術方面的工作有優勢嗎”,你可以參加這方面的比賽,但是不要牽扯太多的精力,這方面的比賽可以提升的軟實力,但是同樣削弱了你在主業方面的投入;“投過稿,不知道這對你找工作的時候會有優勢嗎”,這些優勢都不是量化的,而是一種軟實力,投過稿、寫過書,那麼你分析問題、表述問題的時候會更加條理化,對工作、個人發展都有好處,這都是軟實力的提升,企業需要軟實力非常強的人才。