做程序員必須要搞ACM ICPC嗎?

做程序員必須要搞ACM嗎?,大一有些迷茫,C++雖然考了全系第一,但是從沒搞過ACM,有學姐給我說做程序員必須要搞ACM,否則一輩子都是碼農,真的嗎?如果不是,各位大神有什麼好的建議呢?


顯然不是必須的。

在大學階段成為人生贏家的道路有很多,ACM在其中恐怕還算比較曲折的一條。

然而程序員是否必須參加ACM這個問題,和題主是否有必要參加ACM似乎也毫無關聯。

接下來談談實際問題:小馬過河,是該蛙泳還是狗刨。

很多ACM相關的吐槽諸位都應該聽多了:大量重風格糟糕的編碼練習,在某些演算法細節的實現上過於彆扭的糾結,各種在現實應用中並無卵用的神棍演算法大行其道。。。。。

比如這篇演算法競賽總結里的吐槽(Overview of Programming Contests)(各種程序設計比賽總結得很完善,推薦各位看看)

誠然,從成為一名優秀的技術人員的角度來說,在各種古典演算法的骨架上,玩上幾年披著程式設計外衣的思維遊戲,想必不會是捷徑。

然而,我對ACM的理解是,它真正牛逼的地方,不在於從中學了多少演算法,做了多少題。

而是厲害在生態系統的完備上。

這裡的生態系統是指由以ICPC為首的諸多演算法競賽賽事,和校內集訓隊構成的整體環境。

首先,私以為,對個人成長來說,反饋才是核心。

而演算法競賽的一大特點恰恰是高反饋。

從每個提交返回的AC,WA,TLE,到topcoder,codeforces等大型線上賽網站的elo rating系統,各種各樣商業公司組織的演算法比賽,以及ICPC賽事本身積澱至今的儀式感構成了ICPC完整的反饋體系。

高反饋給予了演算法競賽選手高動力。

君不見,諸多競賽選手一年裡的很多個晚上為了能夠做場線上賽,冒著被室友殺身之險,在斷了電的宿舍里,摸黑戰鬥到凌晨兩三點(主要是時差問題), 並且還能樂在其中。

像輪子哥一般自少年時期便執著於代碼的傑出技術青年著實不多,然而能在炎炎夏日連續兩個月,每天堅持訓練十個小時以上,整個演算法競賽生涯傾注數千小時於coding之上的ACMer卻比比皆是。

所以很多退役的ACMer紛紛表示,不管搞這個比賽有沒有卵用,反正勞資就是覺得很有趣,玩得很爽。

這是沒有親身體會過演算法競賽,就很難理解的樂趣。

然後是校內的集訓隊。

經過這幾年的觀察,我發現,國內本科高校的ACM集訓隊,往往匯聚著該校相對靠譜的那一批人。

拿本校舉例,隊內的眾學長學姐畢業之後,有去國內top2的高校繼續讀研讀phd的,有留學cmu的,也有從G社離職自主創業的,剩下的也基本能去BAT等大公司。。。。不管怎麼說,是要比本校的平均畢業生質量好上不少了吧。

我相信對於絕大部分綜合智能和自控力沒有達到爆表程度的人來說,環境才是影響個人階段性成就的主要因素。

換句話說,一般人的個人成就,往往是在身邊的這批人的平均水平附近上下浮動。

而在這個集體中生活,幾年下來所累積的收穫,絕不僅僅是和道友們在演算法訓練上的相互交流、扶持。(更何況大家都是靠自學,一起訓練的意義主要還是為了製造競爭的氛圍)

更多的是在三觀上的互相影響,價值取向上的彼此升華。

和這樣一群有趣的人在一起,也並不會覺得萬般皆下品,唯有ACM最高。相反,作為一群平日里更喜歡安靜地獨立思考,反思總結的人,更不容易局限於眼前的某些小格局。

從他們身上,你看見了一個精彩的新世界。

並且因為這群人的存在,你還會不由自主地想要去見識更廣大的世界。

相處幾年後,也許你會變得志向更加遠大,對自己的人生更有信心和抱負。

再提一下ACM能帶來的實際利益。

圈內人常提到的所謂「提升思維」,感覺比較虛,說不清在離散數學以外的範疇還能起到什麼作用。

不過一個合格的ACMer,本科期間寫到十萬行以上代碼應該不成問題。

( 比如我的某位隊友,比賽里被我坑得最嚴重的一次是被騙去一個小時寫了400+行。。。這樣算起來一天只要寫5h,一年就60萬行了23333 )

另外現在的業界大公司的面試模式也是以演算法題為主。

如果你胸無大志,有點小聰明,那麼來混個區域賽銀獎,本科畢業後去個國內的大公司應該問題不大。

不過當然啦,這裡更多的是有更高追求的理想主義者。

最後結合個人的經歷,談一談對人生的看法。

我讀中學時,一度生活得很狹隘而不自知,最大的理想就是能打一輩子遊戲(囧。。。)甚至幻想著讀了大學以後就以職業電競為目標,放手去拼。。。。那個時候我還相當地懶散,高一結束的時候除了數學以外全是倒數,班主任曾氣憤的教我滾出他們班。。。高二結束的時候,他說我將來根本考不上一本。。。。。

後來經歷了不少痛苦,才勉強考上大學。

幸而從大一就開始接觸ACM。

入坑以來,一直感覺打比賽很有趣,周圍的人很有愛,漸漸對打遊戲失去了興趣,能夠把重心集中到現實生活中來。

如今大三,目前還沒有拿過區域賽au。最好成績是今年上半年的上海邀請賽的第四名。暑假即將去MS實習。今年也會繼續參賽。

雖然沒有什麼耀眼的成就,但試想我當初若是沒有參加ACM,現在恐怕還在宿舍里拉著小夥伴開黑,歇斯底里地殺人拿塔,形容枯槁地接連通宵。

( 當然也有可能已經帶著B神,魔法少女430備戰TI6,即將怒奪千萬美刀了2333333)

記得小時候讀HP,覺得只有拉文克勞所代表的智慧是人生最重要的品質。斯萊特林的野心和格蘭芬多的勇氣簡直是羅琳桑莫名其妙的設定。

在往後的人生里,親眼見識了許多揮霍人生,浪費天賦的事例,才漸漸意識到野心的重要性。

現在更欣賞執著而勇敢的人。

有智慧的人往往敏感而多思,也常常因此畏懼失敗,怕自己在現實生活中的舉手投足不夠優雅而變得懦弱。

正如我先前所表達的觀點,一個人的成長的核心,並不在於在某個階段做成某件事,而在於反饋。

並不是說,你數學題解得很快,coding能力很強,在知乎上刷到的乾貨很多,你就贏了。

你需要的,是給世界一個有些笨拙的擁抱,去親身經歷成功與挫折,總結出正面與反面兩種反饋。

這就好比練習投籃,那些投丟的球與投進籃筐的球對於手感的建立同等地重要。

這樣你才能越來越明白自己當前的上限與下限究竟在哪裡,從而培養出對自己的自信和對現實世界的靈敏嗅覺。

然而野心,勇氣和智慧,也並不是一蹴而就的東西。

這裡想起一句《了不起的蓋茨比》里開頭的話:「每逢你想要批評任何人的時候,你就記住,這個世界上所有的人,並不是個個都有過你擁有的那些優越條件」。

遠非所有的家庭從一開始就有充裕的資源,氛圍自由而寬鬆,讓孩子從小就可以對知識、技術產生好奇心,對自己的人生持有信心和自主決斷的勇氣。

但是既然已經上了大學,往後的人生便要對自己負責。

為了洗清自己的原罪,不妨放開手腳,多嘗試,多親身經歷,而不要隨便聽信一家之言。

哪怕所作所為只是驗證了他人的論斷,對自己而言,又何嘗不是一種收穫呢?

某種程度上講,道聽途說來的他人經驗,遠不如親自去摸爬滾、反覆歷練得到的直覺來得有效。

這也正是這種小馬過河問題的無稽之處。

不管是否題主最終是否會參加ICPC。

祝你在往後的日子裡,越來越有野心,勇氣和智慧,去開拓人生的新領域。

利益相關:前網癮少年,某校現任ACM集訓隊隊長


不是必須,我沒有搞過ACM,現在也是程序員了。

建議的話,就是學好計算機基礎,然後做做自己感興趣那方面的項目,比如重複造輪子系列,小的操作系統內核(可以放在Bochs或者QEMU模擬運行),小的語言編譯器/解析器,實現庫函數等等很多很多可以做的。當然,你也可以去OJ刷刷題,當作鞏固自己所學的數據結構與演算法吧,也是挺好的。


不是必須。

我大學本科四年都在做ACM,原因是喜歡參加演算法競賽。現在本科畢業了,覺得自己對資料庫、操作系統、編譯原理、設計模式等方面的了解太少了,有些後悔自己做ACM的時間太多了。

建議在學好計算機基礎內容的基礎上,做喜歡做的事情(ACM或是其它)。


大學4年。

有的人玩ACM,如火如荼,然而卻是不斷地做題,乃至背誦各種演算法,從來不思考背後機制和原理(別笑,高中的時候數理化不是也有很多這種人么)

有的人玩開源軟體,下了一堆又一堆開源軟體編譯來編譯去,編譯還是看的別人的教程(www.linuxfromscratch.org),the ultimate editor - cat的配置文件也是直接拿來主義,從來不思考開源軟體中既有結構精美的神來之筆,也有糞坑一樣的地雷陣。

有的人玩駭客,黑了一堆一堆同學的電腦,卻終究只是腳本小子,從來不思考漏洞背後的故事。

對比

有的人玩ACM,題也有做,但更多的是學習計算機原理,連O(f(n))中被省略的常數k也不放過 做軟體的需要上Computer Architecture這門課嗎? - Milo Yip 的回答

有的人玩開源軟體,不是拿著別人寫好的教程上面那麼多軟體一個個都編譯下來,而是針對自己感興趣的方向,同時下載好多個同類型的開源庫,研究比較他們的差異,包括運行性能以及工程架構

有的人玩駭客,這個(B)我不提(裝)了,我沒經驗233333

再對比

有的人玩個遊戲,都在官方沒有公開的情況下摸索總結出各種數據公式,又或者培養出驚人的大菊觀

-------------------------------------------------------

如果你要招人,你選哪類人?

我想選第二類人,但這類人畢竟鳳毛麟角。

而如果有人能證明他是第三類人,只要他年齡不大並且願意認真工作,我也會要。

第一類人,只是lower bound

-------------------------------------------------------

正面回答這個問題就是:

你搞什麼不要緊,關鍵是你能搞出什麼


ICPC不是必要的,但如果環境好,搞一搞好處也很多。

基礎演算法和數據結構是非常非常重要的,解決問題構建方法是非常非常重要的。可以不搞ACM/ICPC,但是這些內容該深入學習經常鍛煉這一點是缺不了的。

人家競賽只是正好跟這個方向有所契合。


搞ACM的意義是什麼,不是競賽拿個獎給公司看,而是對演算法數據結構等的學習理解和應用。個人感覺題主學姐說的「不搞ACM只能是碼農」就是這個意義的偏激化理解。

c++考了多少,那只是一門語言。語言對於程序員只是最基礎的字母表一般的知識,還要有演算法,要有數據結構,要有底層功底,要有各種東西。搞ACM能促使你去學這些東西,但不管怎麼選擇最終學不學還是看你自己。

另外就是實踐。大學的碼農自己找不到實踐的機會和方式,ACM刷題就變成了很好的平台。然而oj什麼的都在那裡,想要實踐想要鍛煉是否一定要靠參加這個競賽還未可知。

嘛,閑扯了這麼多,總之一句話,靠自己。競賽只是個給你壓力讓你去學習去成長的手段,絕不是目的。


去深入研究下離散數學,從數論到圖論還有謂詞邏輯都學學,有好處。演算法,不過是離散數學的一個解法。


編程能力只要是寫代碼,都可以刻意去訓練,不一定是acm。acm只是能夠逼著你去做大量的練習,如果你有興趣、有自制力,一樣可以。acm的編程要求多多少少和實際開發還是有區別的,比如不重視架構,不重視命名風格,只圖快不追求可維護性等等。acm的題對於工程來說也是偏難的,無論是實際開發,還是面試中需要演算法的地方也並不需要那麼難。

做好程序員要學演算法這個毫無疑問,但是學演算法找本書看看,刷刷leetcode就得了,不一定非得參加比賽。再者說,計算機的世界有很多有趣的東西,比如底層,比如編譯,比如圖形,比如數據挖掘,何必非得跟acm較勁。

往深了說,比賽這東西,玩到一定程度,就是應試技巧佔上風了。有多少acmer,熟記各種模型,刷題的時候就是拿已知往未知上面套。四年之後除了這些以外一無所知。演算法背後是什麼,以及更高階的東西沒有想過,比賽比什麼就刷什麼。

個人覺得acm真的是投入產出比很低很低的一個東西,而且大學開始搞的話,搞不過那些中學開始玩oj的人。我的建議是除非特別有興趣,否則不建議參加。

拿acm沽名釣譽的,我也不敢說一定會怎麼怎麼樣。就像干it的,有人是為了興趣,有人是為了錢,大家都是混口飯吃,對吧?


當然不是必須,沒沾過這個的大牛多了。但如果lz自認天賦不錯的話,為何不試試?這東西既好玩又能成為敲門磚。甚至有可能成為你的一個愛好。我知道有很多年薪60w+的仍然在玩這個。另有很多大學時沒有接觸過acm,工作後從中找到了樂趣並成為大牛的人。我想這東西已經快成為一種文化了,能夠輸出價值觀的那種。


不是必須的,如果喜歡就就玩玩吧。

個人覺得如果想在業界混就好好搞工程,多做些項目;如果想在學術界混就多跟實驗室老師搞搞科研,讀讀論文什麼的。

ACM很有趣,不過如果你是帶著功利的想法的話,上面的兩個選擇更好。


搞ACM對面試很有幫助


你看我就沒搞。


學校有組織學生參加ACM的比賽,我每年都有參加,主要也是學校這方面不是很強,商業學校,所以計算機方面沒有那麼牛逼,找不到多少人參加各種比賽,所以一些比賽基本上都是我們幾個人參加,演算法和數據結構方面的知識,在普通的開發中用到不多,除非你就是做這個方向的工作,比如我做移動開發,用到演算法和數據結構就非常少了,反正我是不同意你學姐的說法,不會演算法和數據結構就不是程序員了嗎?


不是必須,而是why not。

你不是Linus,找實習,畢業找工作你能有幾個東西拿出來脫穎而出。

而且你去公司後就會發現,特別是內部工具,很多東西都是沒想到好辦法,直接brute force就上了。以後有時間再重新解決,或者就忘了。其實這也就是解決問題能力不夠純熟的結果。

這也是面試出演算法題最早的初衷之一,開發工具流程都能速成,內功需要積累。那些說「你看我也沒搞不也挺好」的人,你看他幾歲編程,看過多少書?沒什麼可比性。

ACM給你的是見識。沒人指望你發明演算法,但你一遍又一遍的經歷了高人的演算法。近朱者赤。那些推薦你重新造輪子的人,和ACM其實沒什麼區別。ACM其實就是花式極限造輪子競賽。

ACM是讓你成長的一條路,除非你能找到更好更適合自己的路,否則還是值得一試的。

曾經有個Google家的人聊面試,說Google面人時,五分鐘沒思路就要開始引導,十五分鐘沒思路就趕緊換下一題,最後他說了一句,當然還有一些五分鐘code都寫完了的,明顯是有過競賽背景的。所以ACM這玩意其實不需要多吹,一出手就和別人不一樣的。

公司要的,再聰明,編程熟練度也是第一位的。


唉 作為一個退役狗 我來說說自己的看法

我覺得如果有其他有意義的事情並且你覺得很有意思 並且你可以平時每天花四個小時(不說暑假集訓是一天10+ 每天一次團隊合作的機會 賽後反思的機會)放在這件事情上 做什麼都是可以的。

其實搞了那麼多年最大的收穫是堅持了那麼久,最後悔的是還不夠努力 還不夠強


其實與大部分Acmer 認為的相反,當你不準備去從事演算法方面的工作,你若大學大部分時間獻給Acm 可以說是在浪費時間。

Acmer 認為 Acm可以幫助我學習編程思維。

其實,這個觀點是一半正確的,正確在於,他真的可以幫助你學習編程思維。錯誤的地方在於,他的天花板對於一個職業程序員來說連地板都算不上。

反駁者會認為我真的能體會到我在進步啊。

對呀,你真的是在進步啊,這就相當於一個廚子即使在砍柴的時候也能訓練掂勺的力氣一樣,我們應該去比較,若普普通通的不走這條路,你又會怎麼樣。就像我走直路或者走一邊再走回來到底哪個好。

答案是各有各的好,一個走快,一個走的有風景,看你的心選擇吧。

倘若,你對演算法有興趣,那就另當別論了。

我的建議是,計算機世界這麼大,別看上一個愛上一個,先看看這廣闊的世界,再做決定也不錯。

還有就是,我以前也是acmer,不知道原來計算機界,還有輪子哥這麼好玩的事情。


從功利的角度來說,如果只是想應付技術面試,其實是不需要去搞 ACM-ICPC 的,去看 CC150 、刷刷 leetcode 或許更加靠譜,而且也不會像刷 ACM-ICPC 那麼累;如果只是為了「不做碼農」,那幹嘛要去刷 ACM-ICPC ,正常不應該是去實驗室混科研經歷然後申國外 PhD 么,當然直接轉專業也是一條明路。

對於大一、大二的學生而言,是否應該刷 ACM-ICPC ,我的建議如下:

  • 高中弄過信息學競賽,建議繼續刷。
  • 有精力、有時間,建議嘗試。
  • 抱著「想通過刷 ACM-ICPC 學習演算法「想法的,不建議刷。
  • 抱著「為了應付技術面試刷 ACM-ICPC 」想法的,不建議刷。

ACM-ICPC 本質上是體育競技項目,It"s a game for talented ,能不能玩得轉得看命怎麼樣。


沒有邏輯 沒聽說多少高管是搞acm的


第一個問題

顯然不是必須的。身邊還是有很多沒搞過ACM但是依然很厲害的大牛

第二個問題

顯然是假的。那樣的話程序員就要少好多了,噗哈哈哈,好冷

第三個問題

做ACM的好處不言而喻。

1. 理解計算機

你會比其他人提前掌握一些知識,比如演算法,數論,離散數學,組合數學,數據結構,編譯原理,編程技巧(術)。。。就算這些會在課上會接觸學習到,你的理解也會更深刻一些。這些知識或者思想會滲透在計算機的各個領域,融會貫通不敢說,醍醐灌頂油然稱讚的感覺還是經常有的。

2. 意志磨練

"真正的強者不是在順境中勢如破竹,而是在逆境中堅韌不拔。"

做ACM勢必會碰到很多困難,比如題太難,演算法不難,寫代碼姿勢不對。經常是看題寫題交題-&>絞盡腦汁百思不解-&>莫名其妙的就A了-&>回去研究哪裡出問題-&>哦原來是這樣。做困難的事情總會讓人產生要退縮的想法,這時候就到了鍛煉意志的時候了。

當然如果你已經很大神,那這條可以忽略。C++全系第一確實讓人高興,不過我相信系裡有很多隱藏著的大神。

3.滿足感成就感

滿足感大概是因為被題虐的,看到Accepted的喜悅不亞於完成一次五殺。喜悅程度與困難程度成正比。還有現場賽的緊張刺激感也是一種很棒的體驗。

4.圈子交友

所謂「往來無白丁,談笑有鴻儒。」 --《陋室銘》

所謂「常跟好生談理想,不與差生閑扯淡」 --《必勝決》(這條開玩笑,別認真。。)

ACM是一個含金量很高的比賽,想要獲得一個好成績可能光靠努力還不夠,所以能拿金牌的人絕對都不簡單。這個圈子裡很容易有牛人,我覺的真的是一個很贊的事情。

硬要說ACM不好的地方的話,也能說出來一點

ACM的比賽周期有點長,就是說不容易看到效果,你得投入很多很多時間精力在裡頭。

如果要做,還是想清楚,考慮一下機會成本。如果不做ACM這段時間可以用來做其他的事情,ACM看起來牛B閃閃,但是實際中好像只有很核心的地方才用的上,或者說好多演算法的東西已經被寫成庫讓你來用了,從這個角度看,學學其他的技術追追潮流也挺好的。


學校搞技術的大體分為演算法流和工程流。走工程路線適度的做些題鞏固下基礎就ok了

網上找到個有趣的新聞,一個google的總監說

Being good at programming competitions correlates negatively with being good on the job


推薦閱讀:

零基礎去北京千峰培訓ios和安卓怎麼樣?有哪些機遇和困難?
團隊裡面有一個美女程序員是怎樣的體驗?
程序員對智商要求高么?
作為一個帝都碼農,現在的處境很迷茫,不知道未來在哪裡,我該怎麼辦?
在2016年,Android 程序員應該如何選擇?

TAG:程序員 | 編程 | ACM競賽 |