大學不主攻ACM,進工作室自學android做小項目,會有前途嗎?

本人為某一一本非985和211大學學生,現在大一,計算機專業,各科學習相對努力與良好,專業課知識與身邊其他人相比相對前列,稍得老師讚賞。進校考試考進了「卓越班」,班級的課程比較快,現在大一下學期我們已經學完了許多普通班大二的課程,之後多出的時間都會用於實習。目前自認為自己的方向比較明確,將來打算做安卓或者遊戲開發。

大一上學期,我在我們學校的OJ上面刷了估計300多道題,對自己對語言的理解有挺大的幫助的。但是,感覺還是對演算法沒太大興趣,還是沒去參加ACM,主要我覺得大學搞演算法的主要出路就是到處比賽拿獎,太單調而且太被動(就是跟著老師訓練,自己除了搞演算法不去規劃自己將來的發展),我想讓自己大學能多了解一些做項目之類的東西,自認為項目經驗無論是對對將來出去找工作還是對自我發展都是有很大幫助的。上半學期閑暇的時候,也是看了《浪潮之巔》、《程序員修鍊之道》、《演算法競賽入門經典》、《程序員在囧途》等書,由於大一時間比較多也是看了哲學書、文學書、心理書等20本左右。也是養成了逛知乎和在博客園等網站上看文章的習慣。

現在是大一下半學期,我加入了我們學院的一個學習開發的工作室,主要有java網頁,前端html、css、js,PHP框架、安卓等。我加入的安卓組,在幾輪選拔下留了下來(有30多個人志願加入,最終留下4人),現在主要就是學習android,先前是學長教我們,現在會了一些基礎之後就是自己利用空閑時間自學,每周會有2.5小時的培訓,大家就在一起交流自學所學習的東西,我挺享受這些,也覺得挺有意義。(對安卓的自學也是很大的提高了我的自學能力)在之後如果有能力,工作室是接一些項目給我們做的。由於老師的推薦,我也是買了《C++ Primer》來深化自己C++的學習(暫時的認識上是覺得C++是做遊戲的基礎)。

然而,現在之前去參加ACM的一些同學現在周末都是到處打比賽,然後有的也已經拿了獎,自己還是在堅持這些自認為有用的東西卻暫時毫無成就。自己在知乎博客園等上面看文章,也是發現大家對ACM都很看重,將來出去能有這方面的成就是對自己很有幫助的,像自己這樣的情況也暫時沒有在哪看到有相似的案例。而我現在是對自己有點懷疑了,我不知道自己這樣的堅持到底有多少意義,希望各位前輩可以給點意見。(另外也是說一下,我不太打算考研,不想搞學術,暫時認為幾年的工作經驗比搞學術更有意義些。)


講一下我的個人理解。本人擔任某二本院校acm指導教師近10年。
排名第一的答案是朝著牛人的路子去的,但絕大多數人都不會成為牛人。如果不準備考研、搞學術,普通工程師應該有更合適的路子。

首先說一下acm。
搞演算法可能涉及大致三類
1 基本數據結構,枚舉,遞歸,回溯,搜索演算法,動態規劃,圖論(基礎)
2 圖論(高級),博弈,數論,幾何,組合數學.......
3 神經網路、遺傳演算法等等等等(這些對acm也沒有大用,有興趣可以玩)
能搞定第1類,基本可以拿到省級比賽的三等獎,衝擊二等獎。
搞定第2類,可以衝擊省級比賽一等獎,參加亞洲賽甚至總決賽。但對非985、211學生來說,一是要付出大量時間精力,二是還要看天賦。
做acm的好處是
a 快速提高編程基礎能力
b 培養邏輯思維能力
c 培養自主學習能力
所以,在做項目的時候,搞過acm的學生優勢在於:學習比較快,邏輯更清晰,不容易出低級bug。但這些能力在你能較好的掌握第1類演算法後,就已經具備了;再去研究第2類演算法,增加的主要是對具體演算法的理解,對邏輯思維和學習能力的提高已沒有之前明顯了。
因此,對於想玩一下acm的同學,好好學習一下第1類問題就可以了。
花大量時間精力去研究第2類問題,意義並不大
1) 工程中用到的概率很小
2) 如果工程中要用,到時候再學也不遲
除非對acm非常有興趣和信心,想拿更好的獎,準備考研,你可以繼續下去。
否則,絕大多數同學,我建議在學完第一類問題就不要在acm花太多時間了。
一般985、211的學生acm可以一直玩到大4甚至研1,因為acm成績好的估計都保研了。但如果本科畢業要工作的同學,在大3參加完一些比賽後,就應該離開acm了,否則你沒時間去積累項目經驗。當然,你可以和acm的同學繼續玩在一起,但不應該是主力。

積累項目經驗的意義
1 有個說法是,」學《編譯原理》,就自己實現一個編譯器,學《操作系統》,就自己寫一個操作系統,學《資料庫原理》,就自己寫一個小型的資料庫管理系統,學《數據結構》,就把書上的代碼習題全都做一遍,並且熟練掌握「,這個方法在國內可能並不可行
a 國外每門課的大作業基本都是項目級的。但國內由於師生比和教學方法的問題,老師如果出大作業,最多最後簡單給你評個分,過程中能給的指導有限,全靠你自己去摸索。
b 靠你自己摸索做的結果多半是,做的不會很深入並且很難真正理解,因為你不知道這些東西到底有什麼卵用
當你做過幾個Java項目,能熟練使用List、Map、Set這些工具類的時候,你對《數據結構》的理解更直觀了。
當你做過幾個手機端項目,其中要用到資料庫並且數據量還比較大,你會發現原來看起來沒有卵用的索引、聯合查詢、事務是多麼有用。
當你做過有一定複雜度的Android項目後,對進程與線程、Activity堆棧、Android消息機制這些操作系統的基本知識也掌握的差不多了,如果還想深入,可以去看Android源碼,甚至底層Linux內核源碼。
做項目的意義在於,把書本知識變成屬於你的活的知識。
2 計算機專業的幾門課程主課,」數據結構與演算法「、」計算機組成和計算機系統架構「、」編譯原理「、」資料庫「、」操作系統「、」計算機網路「、」軟體工程「,往深里學,每一門可以學的沒完。
另外,其他專業的課程間的關聯性和延續性要更強。相對來說,計算機專業的這幾門主課,都基本獨立並自成一個體系。
所以,對於本科生來說,想在4年時間把這些課程都學得很精深,是不可能的,也沒有必要。靠譜的做法是,多數課程能做到基本掌握即可,抓住一兩個方向去深入學習。
當然,一開始你也不知道哪些方向適合你,並且更有興趣。那麼,多做幾個不同類型的項目,應該能找到興趣點。
3 當你在做第一個項目的時候,你考慮可能只是實現功能和消除bug。當你在做第二個項目的時候,你會發現之前的程序運行效率很差,很會考慮優化問題,使用合適的數據結構和演算法,簡化程序流程,合理的使用線程。當你做第三個項目的時候,你會發現之前的代碼架構都多麼噁心,擴展性和可維護性很差,你會考慮程序架構的問題,考慮復用性、擴展性等等問題。你每做一個項目,你關注的點應該隨之拓展,能力可以不斷提高。
所以,沿著Android、iOS、前端或後端,任何一個方向深入下去,你學到的不僅是這個方向的招式,也會獲得一種叫項目經驗或工程素養的東西,這就是內功

最後總結一下。
在我看來,在這個信息爆炸的時代,知識的稀缺性變的沒那麼重要了。知識總是在哪裡,不是在這本書上就說在哪個書上,不是在這個網頁上就說在哪個網頁上。你要學,隨時都可以。
相對的,人的時間和精力變成更稀缺的東西,在有限的時間裡,學什麼和怎麼去學,變得更重要。所以,充分利用大學4年時間,形成一個能提升個人核心競爭力的能力架構,比囤積大量分散的知識,要有價值的多。

另外,絕大多數人的歸宿都不是牛人,在計算機的任何一個領域,做一個靠譜的工程師,就已經很了不起了。


第一次一本正經的寫回復, 有些激動, 話有點多, 以下僅個人觀點, 希望沒有跑題。

本人搞過ACM, 拿過一些銀獎(希望今年能金吧:)。 也做過幾個工程, 也在阿里和百度都實習過, 算是演算法和工程方面都有一些接觸。

擅自把樓主的題意理解為 「大學把重心放在做工程而不是做ACM以後前途好么?」

先回答樓主的問題:
感覺樓主對演算法和工程的認識太淺薄了, 要說的是搞ACM和做工程各有各的優點, 也各有各的局限, 下面我盡量以我的經驗讓樓主對ACM和工程有更深入一點的認識吧。

先說ACM的局限。
正如樓上某匿名同學所說「ACM僅僅是入門級遊戲」。 確實就是這樣, 雖然我是靠演算法知識面試進去的, 但是真正的實習期間, 我所能用到的ACM知識的機會幾乎沒有。 工作中大部分複雜的演算法都有現成的庫了, 不需要自己實現。會用到的基本都只是一些很低級別的演算法, 比如二分, 簡單hash, 或者用map建立一個索引。(不過還是用到過ACM知識, 下面會說)

然後說一下工程的優點。
先引用 @李象茂的話:切勿淺嘗截止
感覺很多同學說到工程, 就覺得是查文檔, 調介面, 說到底就是體力活。
寫工程代碼確實不少時候就是查文檔, 調介面, 但是其精髓應該是隱藏在這些介面後的設計哲學, 這種東西光看文檔和介面是看不出來的, 得真正自己去挖掘, 去動手寫自己的代碼, 去認真讀別人的源碼。

樓主給我的感覺就是做的太少, 太淺嘗截止了。
不知道你現在有沒有自己寫過一個完整的工程, 有沒有自己嘗試設計過一系列完整的模塊。
你說你學Android框架, 不知道你有沒有真正嘗試去理解過「為什麼這個框架要這樣設計?」。

如果以上兩個問題你的回答都是沒有的話, 我建議樓主自己開一個項目, 獨立完成一下。
比如做一個動態網站, 從前段網頁到邏輯處理到資料庫拉通走一邊。你會在做這個項目的過程中發現很多糾結, 最後糾結到想重寫整個項目, 那麼你就能對工程設計有更多的感覺了。
另外在做的時候, 請嘗試努力去構想和領悟一些設計模式。

前段時間自己寫一個LALR(1)文法解釋器重寫了四次, 每次倒不是說寫不下去了, 只是因為感覺整個項目的組織不夠優美了, 所以就果斷一股腦的重寫了, 不斷的提煉項目結構, 這是工程的樂趣之一。

接下來再來說說ACM(做演算法), ACM對工程就沒有一點幫助了么?不是!

學演算法, 特別是ACM中的一些基礎演算法技巧(比如二分, 單調棧, 單調隊列, 線段樹, 強連通等), 能讓你更加抽象和理解你做的東西的本質。

什麼意思呢?下面說一個我在實習中遇到的例子。
之前在百度實習, 某個任務大概是這樣,有一堆地圖數據, 由點和邊表示, 邊是有向的, 需求方認為這張地圖上的點是應該是相互能夠走通的, 但是數據出了問題, 需要把不能走到的點給報錯出來。(出於簡單考慮,對問題作了一定的化簡)
說了一大堆, 其實學過圖論的同學稍微提煉一下, 問題就是「一個有向圖, 求連通性及報出孤島和斷邊」。提煉過後我就直接用了一個tarjan演算法給搞定了。

再來一個 @李象茂給我說的例子:
在一個大型程序中, 有一些小模塊, 模塊間有一些相互依賴的關係, 現在這些模塊出現了死鎖, 需要你安全的解除這個死鎖, 這裡安全的定義是如果模塊A依賴模塊B的資源, 那麼一定要先關閉A再關閉B。(同樣作了一定化簡)
也是看似複雜的任務, 其實稍微提煉一下就會發現模型是一個拓撲排序。

總而言之, ACM雖然對你項目的整體架構水平上沒太大幫助, 但是在一些小問題上, ACM能讓你把問題考慮的更加抽象, 你能學到更多, 而不是單純的停留在需求本身。

一個提煉細節問題, 一個提煉整體結構, 個人覺得這也是演算法和工程相輔相成且美妙的地方。

下面來一個例子簡單說明(賣弄)一下是怎麼相輔相成的, 一個C11的快排:
template&
void _qsort(RandomIterator l, RandomIterator r){
if(r-l &<= 1) return;
auto t = *(r-1);
auto mid = partition(l, r-1, [t](decltype(t) x){return x& swap(t, *mid);
_qsort(l, mid); _qsort(mid+1, r);
}
你要明白這個程序, 你得首先明白快排的本質:
每次選一個數, 小的放左邊, 大的放右邊, 兩邊再遞歸。
以上就是演算法部分的描述, 簡潔卻優美, 卻能讓排序的平均複雜度從n^2降低到nlogn。

但是為什麼這個程序看起來比上面描述的複雜呢?
這是因為你排序不能只給數組排序啊, 你有時候還得給容器排序(比如vector)。
那為什麼給vector排序傳入的不是vector, 而是兩個迭代器(iterator)呢?
這是因為如果你直接傳入vector, 那你想給數組排序排序不是還得新寫一個專門給數組排序的函數?
那迭代器是怎麼包裹容器和數組呢?
RandomIterator前面的random有什麼含義么, 難道迭代器還分種類?
那個partition函數又是什麼意思, 還能用在其他地方么?
......

可以看出演算法和工程各有各的考慮方面, 各有各可以挖掘的地方。
感覺樓主的糾結點在於:
很想做工程, 但是擔心工程沒什麼可學的。
覺得ACM很NB但是又不想做。

其實沒必要這麼擔心, 感覺樓主把工程這個坑看的淺了點。
精髓是其背後的設計哲學, 說到「設計」和「哲學」二字了, 那這個坑就。。。

其實前面說了那麼多都是白說, 只是為了想讓樓主加深一點一下對工程和ACM的認識。
下面是個人對樓主的建議:
1.樓主現在擔心做工程不如做ACM, 主要還是積累不夠多, 了解不夠深入, 動手不夠多(個人揣測)。
2.不要再去學這學那了, 踏踏實實的, 自己動起手來做一個東西。
3.關於ACM, 還是建議樓主搞來玩玩, 可以去做做codeforces或者topcoder, 花不了多少時間, 主要還是在積累, 不要畏難, 不要覺得它沒用。

============================================================


下面是一些題外話和建議:

其實編程世界可以挖掘的東西很多, 關鍵還是看你深度夠不夠, 比如你說你在看C++ PRIMER, 看似就一本語法書, 其實裡面就包含了不少工程和演算法上的東西。
比如裡面的泛型編程, STL容器, 智能指針等,看這些東西, 不要單純學個語法和用法, 更主要還是得想下它為什麼會出現。
再拿STL深挖一下, 你就會發現裡面的map是用平衡樹實現的, 這不就是演算法么。還有個在algorithm中的小函數rotate, 你可以看看它是什麼功能, 再自己嘗試實現一下, 再對比一下源碼, 很有樂趣。
再拿泛型編程挖掘一下, 你就會光用C++的模板都可以搞出一套編程的東西:Template metaprogramming
下面是另外一篇模板編程的有趣實驗:ACCU :: Functional Programming Using C++ Templates (Part 1)
你完這篇文章後, 又會知道函數式編程, 於是你又想去看去做去理解新的東西。
......

總之編程世界的東西太多, 你現在擔心做工程的東西沒啥作用, 還是因為學得太淺, 太少。

另外我這裡擅自臆測你提出這個問題的深層次原因還有一個, 就是感覺東西太多, 不知道學什麼對自己幫助最大,比如ACM和工程你不知道如何取捨。(如果沒這個考慮請原諒我擅自YY = =)

只想說不要想的那麼功利, 也不要自我糾結浪費時間, 做自己最感興趣的東西就好, 很多東西都是相通的, 學的好自然就觸類旁通了; 就算學不到, 底子好, 花不了多少時間看一下相關的東西也很容易就入門了。
引用sb@莫宇誠的一句話:當你覺得你花很少時間就能明白某個東西的時候, 你就能說你會這個東西了。

另外也不要不要懷疑自己做的東西是不是別人造過的輪子, 造的輪子一樣, 但是你有自己的理解。
用 @沈津生一句話:造的輪子多了你就有自己的世界了。

最後不要拘泥於什麼標準答案, 不要糾結於什麼幫助大, 不要糾結於做這個東西有沒有意義, 計算機這一套東西本來就是在試驗中建立起來的, 享受實驗和創造的樂趣, 技術和理解總是在你無意間的時候提升最快。


第一次回復(裝B)有點激動, 以上胡說八道僅代表個人觀點。


============================================================

下面是題外話的題外話:

1.樓上那個匿名的同學看到了能不能請加一下= =。

2.不想考研可以嘗試下保研

3.搞學術 != 讀研

4.看得出來樓主是個比較上進的同學, 不過技術這種事情不能急, 還是先活開心吧, 比如沒有妹子的話,找個妹子啥的 (。?`ω′?)


最後重點來了, 妹子請戳我知乎 (&>y&<;)


我不清楚你們的Android項目組到底如何,但是以我自己的實際經歷,ACM-ICPC是對自己幫助最大的經驗;也因為此了解到 TopCoder,以及演算法上的優勢通過面試進入 Facebook,裡面也有無數華人是ACM-ICPC這個圈子的。

而實話實說,以我的經驗,很多大學裡面的所謂項目組和實驗室,都是搞搞玩的,甚至是通過壓榨大學生的廉價勞動力去接外面的外包項目撈外塊。題主應該警惕這些項目。

你還是大一,擁有很長的時間去發展。個人推薦你去專心修鍊ACM-ICPC,而後可以考慮做TopCoder來掙一點外塊。我之前寫過一個大學掙外快的回憶:你在大學裡是怎樣賺到錢的? - 覃超的回答 希望對你有幫助。

我後續有時間的時候會再寫一個參加TopCoder比賽的教程。


作為一隻3年OI狗+4年ACM競賽渣的過來人說幾句。

不少人後悔或者抱怨自己當年沒參加OI or 沒參加ACM,看著身邊搞競賽的同學紛紛無壓力進了BAT級別的大公司。

說得你好像當年搞競賽就一定能拿獎似的。

如果題主不想有這樣的後悔或者抱怨,那麼請證明自己。

再嘮叨幾句,搞ACM和搞工程並不矛盾,它們之間存在相互增益的關係。比如你ACM搞多了,當你在搞工程的時候,就會更注意內存性能,時間複雜度等等;當你在搞ACM的時候,你就可以熟練地寫出模板類,封裝你的演算法邏輯,讓debug的時候更清晰,而不是一團糟的代碼。

Keep balance.


以下皆為個人淺見。


回頭來看當初的回答,還是有許多更細節的地方沒有說到。

1,事實一定是,少部分人當了老闆,大部分人給他打工。
事實也一定是,對於技術含量不高的職位,老闆喜歡招聘新畢業的便宜員工,替代高薪酬的老員工。
而一個職位的技術含量和做了多久不總是存在正比例關係。
當然,人們通常都從市場供需角度解釋這件事,但是其中滋味只有當事人體會了。

2,我寫這個回答是希望有機會當老闆的人能夠抓住機會。明白需要準備什麼,需要在什麼時候果斷的邁出這一步。
有些人可能由於各種條件的限制,只能做一個員工。
那麼,就努力的提高自身的技能好了,因為你個技術紮實和全面的人,總是有更大的就業優勢。

3,大學裡就有項目經驗對於未來的就業一定是有幫助的。但是要弄清楚這個經驗會帶你走多遠。
可以獨立開發一個項目的經驗自然是寶貴的,這意味著你有可能一舉成名或者容易獲得投資。
但是,如果你耗費了大量時間也因此耽誤了學習,而得到的經驗並不足以彌補你的損失,這就非常令人惋惜。

4,一定不要忽略你的財務計劃,你的房貸,家庭的支出和孩子的費用。
所以,要設想一個最壞的情況,就是失業了怎麼辦。

5,如果有創業的打算,那麼工作中需要注意幾條曲線的變化:
收入和財富積累
可利用的個人時間
專業技能(包括完成一個獨立產品的能力)
管理技能(包括控制進度,管理人員,資金控制)
健康

它們的發展應當趨向於一個點:你做好了準備。
前三點尤為關鍵。至於缺乏管理和市場營銷,都是可以靠資金予以幫助解決。

如果想要具備創業能力,那麼就需要準備出資金,管理和開發能力,還需要有一定的時間進行創業前的研究,健康自必不說。
如果只是專業技能不斷提高,但是沒有可支配的資金,沒有管理能力,沒有健康的身體,沒有為自己前途思考的時間,那麼將永遠無法創業。前途也有一定的風險,畢竟今天和未來你掌握的所有技能,能否幫助你穩穩佔據職位,是很難說的。而你為了滿足職業需求,不斷花時間學習,缺少生活,恐怕損失也是巨大的。

*****************************************

我覺得樓上趙天琪講的很有道理。

我認為樓主的問題就是:怎麼做才是對將來賺錢最有利的?

我最初的回答有點寬度有餘深度不足,還有點啰嗦。對於一個缺少對IT現實認知的學生來說難以理解,找不到重點,一頭霧水。

讓我再換個說法。

如果你鎖定的目標是通過寫軟體賺錢,那麼你為了這個目標需要做進一步的思考。
因為你現在的所有付出都是為了產生收益,那麼確定一個正確的方向就尤為重要。

這個時候道聽途說,蜻蜓點水,隔霧觀山,將可能帶來你錯誤的決定,進而產生深遠的影響。——你大學只有一次,你一生中的選擇機會是有限的。如果你今天錯了,你可能未來再也沒有機會糾正。

1,一家軟體企業里,實際上分好多角色,通常按照業務層次和技術層次劃分,從下往上,每個角色對於的重要性逐漸增強,因為每個人的薪水也就拾級而上。
以一個我認為典型的小型軟體公司而言,我認為大致是這樣的。


老闆 《————————供應商(開發工具,庫,可深加工軟體)
部門經理(software architect)
項目小組(system analyst, team leader, project manager)
coder/tester


2, 基本上你的大學學習決定了你在上面這個公司結構中的位置。
我們僅就大部分人的就業特點而談。也就是,大部分人都是軟體產業的普通從業人員,而非創業者。


3,通常,你在大學做了一堆項目,積累了大量經驗的結果就是瞄準了最底層coder這個目標。
你和那些更普通的只是學習課程的畢業生唯一的不同大概就是:他們只能做coder,而你因為有經驗,可能工資多謝,可能更有機會得到提拔,或者有更多可以選擇的公司。
但是,這種提拔就現實而言,可能機會並不多。
畢竟一家公司發展速度有限,老的team leader因為經驗通常會長久佔有其職位,而一般也不會有新的同等職位產生。
所以,你需要等待——哪天他跳槽了,哪天公司增加了項目。。。

注意,說這麼多的目的只有一個:作為一個coder,你的收入是相對固定的。也就是,你現在就能知道未來掙多少錢。招聘廣告都寫著呢。


4,從全國範圍而言,大體的畢業生就業特點是:
好的大學進入好的公司
普通的大學進入普通的公司
無論什麼大學,其優秀畢業生都是進入相對應公司的高級崗位。

結論就是,你未來在什麼公司得到什麼收入的確定性進一步增強。幾乎可以由此來制定你的理財計劃。


5,當我們再次放眼整個軟體產業,它有分成幾種類型。

如果是一家純開發公司,那麼上面的結構中顯示了: 它還需要其他公司支持,就是它的供應商。
這些供應商之所以是供應商,除了因為他們的產品使然,還因為它們的產品的技術含量更高。以至於它們不需要關注他們的產品的應用,而專註在高利潤的產品。

很多人都說演算法都已經被寫成了包,直接拿來用就行了,因而不需要下功夫在這些方面。
那麼,我們是否應該思考這些包是誰寫的?

答案可能很簡單,就是那些精通這些搞技術水平的人,簡單地說就是那些ACMer

所以,一個精通演算法的畢業生實際上在軟體產業的上層,比你的收入高。可能穩定性,福利。。。都好很多。
最終,你和他的生活方式會有很大的不同。

有可能你需要不斷換工作,如果你不甘心低收入的話。
有可能你沒有機會換,只能長期在低收入的背景下做生活預算。
而他們沒有這樣的問題。
這樣的說法有可能是令人感到悲哀的。

不過可能是現實。
因為所有高技術的東西價格都更高。他們的公司能夠支付高工資。他們的公司所面臨的競爭壓力也小很多,所以職位更穩定。


也許有人說,很多包都是免費的。
但是,真的是這樣嗎?
這些包對於公司商用也免費嗎?
你需要的包一定能找到免費的嗎?
如果找不到,公司會自行開發,還是購買呢?他們會不考慮自行開發的費用和質量嗎?

6,當我們從全球範圍來看軟體產業,會進一步發現:
出國留學的人進入跨國公司
好的大學進入全球領先的公司。

他們的收入更高。
因為這些公司之所以能夠到中國來,就因為他們財大氣粗,因為他們的產品更厲害——因為他們的coder水平更高。

這樣的結果是,你和這種人的收入差距更大了。你可能平時都不再去關心這些人了,因為只有傷心。

7,當我們再次觀察全球的計算機畢業生,他們的走向除了去軟體公司打工,還會創業,留教。這兩者都得到更高收入。

但是,創業也是需要技術的。一個普通的coder,連一個完整的產品都做不出來,就別提創業了。
而產品沒有高科技,那公司幾乎難以生存,或者勉強分一碗粥。畢竟是進行同質競爭,對方有先發優勢。

另外,創業還需要資金,這個時候,名校,ACM Champion...都是有價值的。
也許你的產品不錯,可惜你會發現投資人很勢利。

也許,你認為自己有機會開發一個app, 從而獲得財富,畢竟市場上顯示有成千上萬的這種產品。
但是,這些app開發人員和整體從業人員的比例是多大呢?
你會是這1%嗎?
你開發的會是一個新穎的東西,還是眾多同類型中的一個,半死不活的掛在那裡無人問津?
你會是那擁有成功故事的1/10嗎?

留教的人,因為自身技術好,同時有時間有機會鑽研一個領域,所以就有機會在這個領域得到更高的收入。無論是搞國家或者企業項目,還是自己搞個產品出來開公司。

這樣的情況下,你都不再去考慮這些人了,他們對你更加遙遠了,遙不可及。

8,對你所從事的Android開發,你有沒有想過,依靠別人的平台,是不是也是給別人打工呢?
他們僅僅需要開發android,就可以享受高收益。
而你要在他們設計的破破爛爛的介面上費時費力的開發低端產品,是否是一種無奈呢?

為什麼你要為了滿足不同的手機,而花費更多時間去修改你的app?
為什麼他們就不能統一系統,從而減少你的時間消耗呢?
為什麼他們就不能弄一個像iOS那麼漂亮的東西,讓你開發也流暢,也沒有那麼多用戶的抱怨?

因為你在食物鏈的低端。——因為你技術有限。

9,當我們觀察全球軟體產業,會發現我們國家在這個領域是如此的弱小,作為其中的從業人員之一,你也因此拿著低工資。
為什麼?

我們都知道德國是一個先進的製造業大國。
但是他們的製造業僅佔GDP的30%, 農業2%, 剩下的都是服務業——這裡面相當大的一部分是軟體收入。

我並沒有仔細分析他們服務業的組成。
我估計,他們的軟體產品和機器是配套銷售的。但是在計算GDP的時候是歸於服務業。從他們工業4.0的規劃中對軟體的重視可以側面證明我的推測大概有些道理。
至少,你能夠想到西門子賣了軟體和機器後,會持續收取服務費,軟體更新費。。。

說這些,僅僅是為了說明,在全球的軟體相關財富分配中,我們中國分的太少,我們的錢讓別人賺去了。
這種結果間接也作用在了你的身上。你公司的產品低級,你也別想分到更多錢。


但是,如果你的老闆有心開始這方面的項目,他手裡有可用的員工嗎?

如果他堅持這麼做,而去招聘更高水平的員工,那你未來的位置呢?


10,上面很多人也流露出大環境如此,個人力量弱小,只能隨波逐流的看法。
基本上,大致的意思就是,全中國的軟體就這麼落後,學那麼多也用不上,還是省省吧。

可是,我們在一個變化的世界裡。我們必須為此做準備,而不是陷入未來的被動。

如果全中國的計算機畢業生的水平得到提高,那麼意味著我們已經為開發高水平軟體做好了準備。
那麼還有什麼問題嗎?我們中國缺少資金嗎?缺少市場嗎?
也許僅僅缺少幾個企業創建者。這也不是什麼困難。

所以,對自己應當有高要求,而不是去削足適履,而是厚積薄發。

11, 還有人在回答中提到了牛人總是少數的觀點。我認為其中漏掉了一些重要的東西。

牛人少不錯,問題是這些牛人是因為智商高過你嗎?

從你的問題看,你明顯是放棄了學習ACM的機會。
而別人選擇了之後,就會走向通往牛人的大路上。

牛人是怎麼煉成的呢?
有些人確實天賦異稟,這不在我們討論範圍你。

那麼Linus Torvalds該算是牛人了吧?
他是因為牛之後去開發linux的嗎?還是因為自己去做了這件事成為了linux的權威?

還有你用的android的開發者Andy Rubin
基本上就是因為有類似的經驗,然後想弄一個相機操作系統,結果一來二去搞成了Android.他也因此功成名就。
也因此android不太適合手機。


我發現ITer更加熱衷於崇拜,而不是冷靜分析。
他們看到偶像首先想到的就是膜拜,而不是仔細了解一下。
他們有種宗教般的狂熱。

如果你想,你也有很大的機會成為一個牛人。
不過牛人恐怕沒有那麼多項目經驗。他們不是通過打一堆怪而升級,而是一個大怪。


12,綜上所述,你讀大學就為了得到這樣的生活嗎?
別人因為學習好技術好而出入高級場所,你只能苦苦掙扎在行業底層,為還房貸而惴惴不安嗎?
你的老婆孩子也因為你而過著普通生活,這也能讓你寬慰嗎?

當然,也許我的預測可能對你是錯誤的。
但在整體環境確定的情況下,這種錯誤是多大的偏差呢?

所以,我強烈建議你努力學習,學習,再學習。
忙於做項目是一種短視的做法。
不要過早把自己鎖定在一個通向低級勞動者的路線上。
為了你未來老婆孩子的生活水平,現在就要奮鬥。

下面的回答是我最初的版本,僅供參考。


******************************************************************

換個角度講。

1,樓主偏重項目經驗的觀點,實際上可能是目前計算機專業的普遍觀點。
這種觀點的直接後果就是造就了一批又一批普通的碼農。

了解這種觀點的危害,必須要分析一下國內IT環境。

實際上許多因素在人們的思考中都被漏掉了,而恰恰是非常重要的。

2,我們國家的IT企業實際上是非常低水平的。包括BATM: baidu, alibaba, tencent, microsoft
在這樣的環境中,一個人的發展是非常有限的,它們的高度決定了你可能達到的高度。

看看它們的產品就知道是多麼的糟糕。

即使在這些中國頂級的公司里,如果你是其中的普通一員,一般每天要做的將不過是一些非常無聊的項目,和一堆人每天扯皮。
大公司都會有這種通病。市場的壟斷性地位直接造就了它們的惰性。因為後續做的差也能靠吃老本賺得盆滿缽滿。

你的人生的黃金階段將在這個過程中被消耗。

當然,不能說你的工作毫無價值。但是這種工作帶給你的經驗和經歷,可能無法滿足你未來20年後的需要。
而20年後是否保留一個45歲的高齡碼工,是每一個HR都要思考的問題。

當然,也有可能在這個過程中,你賺夠了房貸和養老金。從而可以從容退休。
如果你有一個非常好的人生財務規劃,這樣的生活也是不錯的。

3,不過也許事情不總是那麼悲觀。因為每家公司都在新領域進行投入,如果你幸運的進入到這樣的項目組,那麼你就會獲得寶貴的經驗。
比如現在非常流行的可穿戴計算概念,似乎每家公司都或多或少證明自己沒有缺席。

那麼,以這樣的經驗你就可以跳槽到新興公司,你的大公司工作經歷也可能是他們的融資招牌,通過他們充足的資金和專註的開發,成為這個公司重要的一員。你的財富也就隨之而來。

4,假如不幸你進入的是一家中小型軟體企業:

如果他們研發的是創新性產品,那麼你也有可能從產品未來的成功中分享財富。

如果他們從事的是一般性產品,這種產品的市場也就決定了公司的收入。
這種穩定的收入決定了你的工資將是普通的,因為你的崗位是普通的。你大概會成為中產階級的一員。
如果你堅持增加項目經驗,大概你就能如願進入此類公司。

5,基本上上述情況都是非常普遍的,和艱難的。因為你要保持長期的朝九晚五,加班強度不得而知。
不過基本上你的加班意義不大,都是耗時耗力解決各種因為基礎不紮實而帶來的查書,debug...

這恐怕是許多計算機專業畢業生的生活。在賺錢,但卻是一條漫長無味的道路。
很多人已經無力改變此現狀,因為他們缺少實力。
而跳槽也不是一件容易的事情,除非技術有過人之處,否則新的公司不會有很大的不同。

如果打算咬咬牙,再次充實和提高自己,補學當初大學沒有認真學習的課程,將意味著在繁忙的工作之後苦苦讀書用心鑽研。
下班之後是否還有足夠的精力?
這樣的過程需要多久?1年,2年,3年。。。?
你目標的公司會青睞哪一個,你和新畢業學生之間?
你的項目經驗對他們來說有多大價值?你在這些項目里是什麼樣的角色?
你的公司會給你面試的方便嗎?如果應聘公司需要兩輪或三輪面試呢?如果你一年之中需要去多家公司應聘呢?

6,如果你選擇一條不同的道路會怎樣呢?

大學裡你沒有忙於增加經驗值,而是專註於提高全面的技能,各門課程都學的很透,也通過自己決定的項目而得到了知識的實際應用和體會;
如果還有時間,就進一步,你能夠了解一個項目的整個設計和開發過程,知道如何完成一個項目,而不是被動的做別人安排的工作,得到的僅僅是碼農的經驗;
你的這些訓練讓你能夠從一個更高的角度去觀察項目,從而拿到一個項目後就知道如何入手,剩下的就是查查資料;
這樣的你在畢業的時候會有怎樣的選擇面?

各種不同的軟體公司和產品,對你有什麼根本不同嗎?
如果有機會領導一個team,你能抓住嗎?


說到這裡,我想說的就是,利用你的時間增加你的實力,而不是簡單的經驗值。
坦白講,我不認為開發100個Android項目和認真完整開發1個有什麼本質不同。


我認為,一家軟體企業需要的不是做過類似項目的人,而是能夠做這種項目的人。
前者為了進入這樣的公司,付出了巨大的努力,能夠快速找到自己需要的庫和函數,但是也把自己鎖定在一個小的工作範圍;如果跳槽恐怕也只能選擇類似的公司。
而後者可以通過短暫學習輕鬆做任何項目,沒有把自己局限在某個項目類別。如果這家公司不合心意,可以很容易進入其他公司。把握新的技術帶來的機會。


我並非輕視工程經驗。
但是我感覺許多人的工程經驗是非常淺薄的,和他們付出的大量時間完全不成比例。做100個類似的項目,不會像做過兩個不同項目的人那樣有競爭力。
同時,他們因為過於看重coding過程,而忽略了基本功的重要性。似乎大學課程中所有和他所做的項目不相關的都毫無價值。但是,當他打算到另一家公司求職時,他所被問到的往往是演算法,數據結構,編譯。。。
我們必須面對一個變化的世界和變化的公司需求。

同時,IT需求也不斷促生新的公司。
這些公司面向新的產品,所以不太關注你的與此無關的項目經驗。他們需要的是你的整體實力,而你紮實的基礎將幫助你獲得這樣的職位。而你一旦進入,就會很容易上手。

7,當然,我可能比較激進,因為國內IT企業表現的普遍缺乏創新性,總是重複別人的東西,或者在低級技術的產品領域打轉。
這樣的企業似乎也表現的比較看重經驗值,很喜歡5-10年的開發經驗。

但是,我不認為大學生應當為這樣的公司做準備。因為這無疑等同於把自己捆綁在他們毫無希望的前途中。
因為未來中國在攀登科技樹的過程中,會產生廣泛的對高技術軟體的需求。這意味著巨大的商業利潤。
一定會有企業抓住這樣的機會,但是你能否進入這樣的企業獲得你需要的高收入嗎?

8,再換一條道路,你強化了學術能力,這意味著你能在高端軟體開發領域施展,而這也意味著巨大的財富。
你是願意多學幾年,從而一年就掙到普通本科畢業生5年掙的錢,還是5年中馬不停蹄的加班?

Google創始人享受巨額財富就是因為他們的科研成果。
也許他們讓你覺得高不可攀,但是哪個更高學歷的人在工資方面沒有大大多於你呢?

你也可能說,即使你讀master, doctor也不過是給教授們打工。
但是,專註於某個領域帶來的職位收入不是遠高於下面普通的碼農嗎?因為他們的工作是你不可替代的。你寫的只是界面,他們寫核心演算法。

9,或者你看好Facebook成功的故事,認為自己可以嘗試這樣的道路。
但是除卻扎克伯格的家庭背景不談,你至少需要資金支持你的研發工作,哪怕你有了不錯的產品也需要東奔西跑找人融資,這都是需要錢的。況且國內投資人的水平可能還不太令人樂觀。

當然,對於一般城市家庭而言,這可能不是太大的問題。只要住在父母家裡,就可以專心開發。

那麼你所需要的就是商業頭腦。也許你沒有,可以通過多次失敗來不斷總結。
總的來說這是一條非常積極的道路。即使最終未能成功,你也獲得了寶貴的商業知識。這不是碼農具備的。這筆財富可能在隨後的某個時間點發揮強大的作用。因為你看軟體的眼光不是盯在代碼和實現,而是商業價值和應用範圍。後者是決定一個產品成敗的關鍵,不是技術。就像最近很火的暴風科技。

10,毋容諱言,其實大學的現狀培養的就是未來的碼農。畢竟精英崗位有限。
但是,你可以通過優異的成績讓自己進入programmer上層,讓你的人生之路更加順暢,通過盡量少的體力勞動賺到需要的錢。
所以,多學些高級技能,比如參加一下ACM,軟體的根本不是寫代碼,而是代碼背後的思想。

然而從深遠意義上講,這種現狀從根本上也是錯誤的。因為這不符合國家需求。
當我們規劃『中國製造2025』的時候,我們要的是信息化和工業化的融合。我們並沒有信息化產業去實現這一目標。有的都是低級產品。

無論從國家長遠需求還是安全考慮,我們必須實現所有軟體的中國製造,尤其是那些核心軟體,比如CAD/CAE/CAM
但是,大學沒有配合這樣的目標去教育學生。
如果大學能夠成立一個CAD開發實驗室,專註培養這樣的學生,那麼總會有人才脫穎而出成為該領域的領軍人物。即使我們有1萬種Android APP,不會對IT有多少貢獻,更別提技術積累。

這些產品的缺乏和研發人員的低技術水平,讓整個國家都要付出沉痛代價。


反對一下妹紙 @趙天琪答案。。。順便測試一下知乎的回答功能。。。
演算法不會過時。。然而並沒有什麼卵用。。ACM搞了將近三年的cs狗表示。。沒有金的話基本上用人單位不會太重視。。
然而android開發的話。。如果入水不深。。最後也不會成為主業。。進工作室不如找個正兒八經的實習。。讓專業的同事調教的話。。應該更有成效。。
ACM其實也是一個很好的東西。。前提是你不想出去實習。。而且又想鍛煉思維和代碼。。
建議繼續鍛煉水平。。然後努力進入事業單位參加一下實習。。然後你就會發現。。其實也挺沒勁的。。不過來錢快就是王道哈哈哈哈。。
如果ACM的話,評估一下自己的預期。。如果學校屌炸能拿金也可以是正面肛的節奏,不行的話當做刷演算法題應付面試也可以。。不過就不用太進坑了。。面試演算法都很水的。。
個人見解就是,這兩個走法都行。。但是得想清楚。。畢竟自己的情況自己最清楚。。
媽蛋畢竟只要自己別稀里糊塗的過日子就行了。。無非就是人民幣和美刀的區別。。都可以過得挺爽的。。。
我去跪一會主板。。(逃。。。。


補充一下。現在新手做android、ios真有點49年加入國民黨的感覺。

這個問題,是一個很大的問題。
先下結論:(1)演算法並不是脫離實際的;(2)演算法與工程項目是相輔相成的;(3)演算法不容易,工程項目也不容易。
(1)演算法,任何一本演算法書都會講到一個正確的、好的演算法及其實現應該滿足那些要求,比如要能夠檢查輸入的錯誤。也就是說,這些要求實際上是來源於工程實踐中的。演算法,就是尋找一個問題的解的過程。現在,計算機科學的問題越來越多地、直接地從工程實踐中抽象出來,比如天貓的推薦演算法競賽,等等。
這就是涉及到這樣一個問題,既然工程實踐這麼好,為什麼不直接參加工程實踐呢?從上個世紀初開始,就不斷有某些流派的教育心理學專家就這麼說,工程實踐好、工程實踐高,今天國內的教育專家更是拚命地、不顧任何條件地吹捧。
但是,請記住一個事實:成本。這種實踐成本極其高昂,無論是人力成本,還是物力成本,抑或時間成本。大家可以看看,職業化的體育項目,就可以知道這個成本是多麼的高。實際上,絕大部分的體育選手都只能在整個過程中墊在金字塔的下層。
但是,似乎沒有任何一個教育流派在提出、鼓吹他們的教育理念、教育思想的時候可以特別地指出,他們的教育理念、教育思想的成本和代價。於是,家長和學生絲毫沒有意識到,優質的教育的成本是極高的。
實際上,一個老師能夠同時教好任意的2到3個學生,已經是非常的不容易了。可以觀察一下,有2到3個孩子的家庭,能夠都成才的有多少?
那麼,怎麼辦呢?
演算法課程,和任何一門其它課程沒有任何的區別,都是從實踐中抽象出來的,都有深刻的工程實踐背景。因此,演算法的學習過程也不會有什麼特別的地方,與其它同樣有深刻實踐背景的物理學、電學、力學等學科一樣。其實,我特別地不建議以Donald Ervin Knuth作為演算法學習的開始。初學者應該更多地將注意力放在一個有典型的實踐背景下的演算法問題開始,完成一個整個的問題抽象,演算法求解的過程。
但是,實際情況不是這個樣子的。絕大多數學生都不注重這個過程,認為是浪費時間。而老師,不斷地遷就這些學生,最好的情況也不過是使得這個過程變成娛樂新聞的題材,比如,前兩年重慶大學的那個掌劈磚頭的老師,本意是想讓學生知道科學研究的本質。結果,那些學生似乎都沒有意識到老師為什麼做,似乎都只覺得這個很好玩,老師很親和,very funny。呵呵!
(2)演算法和工程項目是相輔相成的。這個前面有人說過了。再增加一個例子,親身的,前幾年,在一個qq群中,有人問,他們公司讓他做一個android的在線音樂播放app,老是卡頓,看到這個,就很無語了,生產者-消費者的緩衝區,這是老師必講的內容啊。
很顯然,現在的教學,似乎很多教材根本就不講實踐背景,而學生呢,也似乎不能將理論應用到實踐中。
(3)演算法難學,抽象程度高。其實,演算法的數學還不是很難,只是難在演算法的抽象過程上。看了一下現在的高中的教材,越來越不象話了,數學書居然是彩頁的,而且把知識點都割裂開了,一頁紙上面,大概只有200多個字,這是作死的節奏。這樣出來的高中生,到大學後能夠適應大學學習,那才是奇怪了。大一,先老老實實地把老版的高數,或者老版的理論力學抄五遍吧。
工程實踐就容易了?不要告訴我,什麼java1000例,c#1000例就是工程實踐,或者找本java web案例,android案例就是工程實踐了。工程,是要一個完整的系統出來。當這個系統的組成,或者功能需求超過一定規模時,其複雜程度急劇上升。理論稍差一些,連從哪裡下叉子都不知道。更不用說現在系統都是分散式系統,連分散式系統存在哪些經典問題都搞不清楚,還能指望做出什麼東西來?我見過有人號稱做測量儀器,連標準電壓都不知道,穩定電源都不知道。還見到過有老師一下子搞3D列印、一下子搞無人機,呵呵!
(4)一點廢話
顯然,專業課程最重要。再加一句,在工程背景下的專業課程學習,效果最好。
不要把專業課程學習和工程實踐對立起來,搞清楚某個工程實踐,需要什麼樣的專業知識,專業知識如何運用到工程實踐中。
當然,這個只有問老師了。但是,現在老師的工作都很忙(越是好的老師,越是從早忙到晚),給你解答,是情份,不給你解答,是本份。


好吧,說一下自己的情況,請在閱讀下面的建議時參考——22年前接觸編程,然後就一直本科碩士博士的折騰代碼,畢業後留學校也是搞計算機。
感覺樓主的糾結其實很沒有必要,不管是做項目,還是做ACM,都是比較錯誤的方向。真想成為一個大牛,就先把本科生的專業課學好!把本科生的專業課學好!把本科生的專業課學好!按慣例重要的事情說三遍。
大家可以對照一下國外牛B名校的計算機專業課程體系和本學校的專業課程體系,會發現基本上差不多,所以至少這些專業課的設置是沒有問題的。但是!但是!我們學習的深度根本就跟國外不能比啊!我們要學英語啊!我們要學政治啊!我們一個學期七八門課啊,國外是一個學期頂多選三門課啊!
吐槽完了,給一個建議,就是學好專業課——學《計算機組成原理》,就自己設計一個CPU,至少做一個單周期的,有餘力就做多周期和流水線的,學《編譯原理》,就自己實現一個編譯器,學《操作系統》,就自己寫一個操作系統,學《資料庫原理》,就自己寫一個小型的資料庫管理系統,學《數據結構》,就把書上的代碼習題全都做一遍,並且熟練掌握,……,也就說,每門專業課都學懂學透,到了大學本科畢業的時候,能夠融會貫通,那就是一個非常非常優秀的計算機專業畢業生了,到了那個時候,有無限的可能性。
這裡說一下這種方式的可行性問題:因為計算機本身就是人造的東西,裡面的原理都是公開,本科期間涉及到的知識都是很清晰的,網上也非常多的源代碼,所做的實驗有台電腦,裝個虛擬機也就可以了,而且還有不少名校的公開視頻課,所以只要你真想學,是沒有什麼太多難度的。但是!你除了有興趣外,還需要投入大量的時間和精力,在美國的計算機專業本科生,一個學期只選三門課就已經是極限了,每天晚上基本都要到凌晨一點才睡!
所以總結一下,如果想成為牛人,還是要自己付出時間和精力。「Android專精」和"ACM專精"其實都只是技能樹上的一個分支,都只適用於某些場合。


無論哪一方面研究的很深,對你的就業都會很有幫助,但是只有跟著自己的興趣走,才能走得更遠。

我今年參加了BATM的春招,也是Android方向,最後只過了百度的,本人沒有搞過ACM, 只有一年半安卓開發經驗,也沒有參加任何實驗室。我知道的周圍的兩位拿到BAT三家Offer的也都不是搞ACM的,一個是做Android輸入法內核,另一個是野生的Python, C++大神。所以我覺得,你可以不用在意別人的ACM,自己專心在Android的路上走遠。

下面是我在面試過程中的一些體會。

面試的時候一定不要慫,一定要滔滔不絕的給面試官講,直到他打斷你,只有你掌握主動才能巧妙略過不擅長的地方,不然等到面試官問到的時候是會扣分的。

面試的內容都少不了數據結構,演算法,操作系統,和計算機網路,這些知識在有基礎的情況下突擊一個月應該沒有問題( 如果你面的是Java研發或者演算法的話就需要日積月累了 ),如果沒有基礎的話,就必須得花時間好好研究。Android方面會問很多基礎知識,Activity生命周期啦,Handler啦,多線程通信啦等;也會問開發中遇到的一些問題,如你碰到過的OOM啦,如何處理ANR。你做的項目說實話面試官是看不上的( 除非你的下載量很多,技術含量很高,比如你要是自己能夠做出一個四次元 qii/weiciyuan · GitHub ),不是說做項目沒用,你在做項目過程中會積累很多解決問題的經驗( 例如真正使用過AlertDialog的人才知道在build的時候必須使用Activity獲得Context而不能用getApplicationContext() ),這個是不能短時間突擊的。

在項目中用到的開源項目一定要讀讀它的源碼和實現機理,面試官一定會問的。Android的源碼最好也要知道一些,比如說下拉是怎麼樣實,ListView內部是怎麼實現的等,如果你前面回答的不好,讀過源碼是可以拯救你的。

有自己的博客,github, stackoverflow有不少建樹可以讓你脫穎而出。

多關注互聯網方面的發展,視野真的很重要,你可以關注一些大神 skyline75489 (Liu Jialiang) · GitHub 還有介個 阮一峰的網路日誌 。

如果有可能加入一個實驗室並且實驗室有大神的話最好不過,可以少走一些彎路,如果感覺沒學到東西就退了吧。

--------------------------------------------------------------------------------------------------------------------------------------------
6月5日更新

最後來點乾貨
這個是我們學院的大神總結的面試知識點
Home · HIT-Alibaba/interview Wiki · GitHub
一個Android大神的Android學習之路
Android學習之路


--------------------------------------------------------------------------------------------------------------------------------------------
6月13日更新

這個是Android官方培訓課程的中文版
序言 | Android官方培訓課程中文版(v0.9.4)


讓我想起我的母校山東理工大學來,我也是作為山裡人格外的想念母校,在這裡先感謝一下母校教會我的好多道理。
首先我先說一下,演算法是很重要的,但是演算法並不等於acm。真正的演算法是指你在面對現實問題時怎樣去抽象去理清思路,用數學的思想建立模型,並且用我們的編程能力去解決問題,可以說演算法與其說是acm更不如說是數學建模,而且數據結構也是相當重要的,然而這些也不能完全等同與acm;我個人對數據很有興趣,在機器學習上的演算法更不等同與acm,有更多的樂趣和實際的用途;本人不懂遊戲,但是我很多同學是學遊戲開發的,在他們看來關於圖形圖像演算法、底層的原理也很重要,但估計這個也與acm關係不大。所以說,這裡面並不是沒有演算法,但演算法不等於acm。
如果把acm與找工作掛鉤的話,我們還不如說是那些獎和他們的編程能力和好的工作掛鉤,或者說名牌高校、培養基礎跟工作掛鉤來得更實際一些,而且不管是阿里巴巴還是百度,應屆生面試的演算法也都可以從劍指offer、進軍矽谷(被批很厲害)一些書上可以惡補,到也沒有acm中那些高逼格演算法那麼難。
下面說說我自己。
你的情況讓我想起我的大學生活來。我的母校也是格外重視acm的,因為是二本的原因所以通過acm作為提高個人能力培養比較高素質的程序員的一個重要路徑,很多能夠進入所謂知名企業的基本都是從acm作為跳板,至於其他的方面投入和發展都相對薄弱,當然也僅僅是我那時候。這是我的母校的情況。再說說我自己的情況,我進校和你一樣也是卓越班,我當時在大一也加入了acm的預選,當時在也是在自己學校的OJ上刷題,跟你一樣也是刷了很多很多題,而且剛剛進卓越班也持著考研沒有工作經驗更重要(雖然後來改變了這樣的看法),當到了大二發現acm的難度加大了,並且要選拔選手進入,由於不喜歡那種競爭的壓力和感覺,我自己放棄了acm,後來也因為種種原因,也放棄了演算法。並且通過各種的了解,覺得演算法在進入公司或者工程中並不是真的那麼重要,所以自己就開始討厭有關演算法的東西包括我們的演算法課(這都是個人原因,當然很多同學通過這個跳板有很好工作)。當然,在走自己的選擇的路的時候,我也迷茫過,很多人也說acm的重要性,所以自己也質疑過自己的路,所以我看到你的問題,又想起了當時的自己,因此很樂意從一個學生的角度去回答你這個問題。
當然,經過了漫長的迷茫期,在大一下學期自己決心去考研,學好四大門專業課,繼續進修。這時候我自己也離acm和演算法越來越遠。雖然如此,但是並不是代表我放棄了計算機,我依然埋頭於各種的專業課已經基礎學科比如高數、現代、概率等的學習中。等到大三,我也接觸了android開發、網頁開發,並且出去和班級一起實訓,更加的發現我們在開發中並不是那麼常用那些演算法的,而且這種模式就像高中在培養競賽尖子生一樣,使我堅定決心不通過演算法也要找到很好的工作,決定親身去驗證其實不用懂演算法也可以找到很好的工作。因此我的本科幾乎都是在工程和演算法的矛盾以及對演算法的厭惡中度過的。直到我研究生實習拿到演算法工程師的職位(雖然跟演算法並無太大關係),回想當時的自己,才發出呵呵的笑聲。
其實在研究生階段,雖然只是專碩,而且在實驗室也只有不到一年的學習時光,但我覺得自己學到的很多很多的東西,接觸到好多不同學校的同學,見識也慢慢的增長,觀念也在改變。我開始慢慢的接觸和重新審視計算機科學。我這裡只能說是接觸,是因為太多太多不懂的東西。在這個過程里,可以發現所有的工程學科背後都是數學在支撐的,如果看還沒有看到計算機背後的數學,那就還沒有真正學好計算機科學與技術這個學科。我們在本科真正要學習的就是在那些代碼後面所蘊含的知識和原理,正是因為我們可能在工作之後再也不會這樣系統深入的學習,所以才要好好的珍惜在本科以及研究生的學習,並且打好的基礎。
所以,請跳出什麼android 什麼acm 什麼網頁,從其他的角度來看一看。並由此發現計算機專業課是多麼多麼的重要。
以我自己淺顯的觀點,我們可以從計算機理論和工程兩個方面看待我們學習的這個學科。從理論方面,編譯原理,有限狀態機到圖靈機,遞歸函數和圖靈機等價lambda演算等價都是什麼,數學是不是打牢基礎了,線代懂一點嗎,mapreduce的模型是怎樣能更好的實現矩陣計算,概率論還記得嗎,貝葉斯與馬爾可夫鏈能實現嗎,離散數學和數據結構非常重要,當我們遇到一些問題的時候,我們能不能抽象、建模用合適的數據結構去實現,從梯度下降求參數到機器學習演算法,數值計算是不是都能了解了,圖形圖像等等,還有諸如此類的很多,這些其實都是本科應該學習的基礎,而我到研究生才去惡補。其實比起那些很難的演算法,這些支撐起演算法背後的基礎知識我們真的學好了嗎。我不懂動態規劃、什麼背包問題,但是不影響我明白邏輯回歸GDBT是怎樣實現的。相反我要是不懂數學,可能還不太明白推薦演算法咋實現。從工程的角度看,也要打牢基礎,操作系統有沒有學好,知道各種調度演算法文件管理數據結構組織等等吧,那是不是能夠觸類旁通的理解其他的系統原理,比如分散式系統原理,像Tair Kafka Hadoop,就會發現原來他們在很多地方很相似,jvm的機制有沒有了解,設計模式看過了嗎,他們在各種中間件是怎樣用的,容器是怎麼實現的,什麼是面向切面。。。所以,我們跳出來就會發現,計算機的世界還是很寬闊,我們要學的東西還是很多很多的,打牢我們的基礎這個才是在本科學習階段最重要的,我們應該把眼光放在更多的不會的東西。當我們真正去工作了就會發現其實代碼很容易寫,但是遇到問題怎樣去理解解決,用什麼樣的技術,怎麼去設計,我們用什麼樣的工程方法解決,這才是應該學到的,並且這都是和我們的這些基礎完完全全密不可分的。
作為一個二本生,已經在起點落後別人太多了,所以我們就需要通過這四年的時間盡量的去縮小差距。可以很負責任的說,究竟是java開發還是ios、android、前端、後台開發,還是演算法,數據分析挖掘,雲計算,不管選擇什麼作為一個程序員最終都要有一個方向和具體的工作的,所以我們大可不必太用這四年的時間把心都鋪在象android、ios開發這些技術上面,這些東西也許在找工作一年就可以學的很好,我們應該把眼光放在基礎上,這個才真正決定了你能在你所選擇的方向和工作上能夠走多遠。所以針對你的問題,我可以說堅持你想堅持的,堅持讓你有動力的事情,做出一個項目的成就感並不少於a出多少演算法題來,acm很重要,但也沒有你想像那麼重要,還有就是打牢基礎,擴展自己的視野,當你走出去就會發現,除了編程以外這個世界還文學哲學各種學,足夠讓你生活豐富。最後祝你的本科生活更加的精彩。


即將大四狗,學校的專業還是電子類,但還是進入了學校的一個實驗室,一頭扎進了程序員的學習行列。因為專業問題,沒法系統地學習程序開發相關的一些很重要的基礎知識,比如演算法、計算機操作系統、數據結構,這些能夠真正支撐起程序員未來幸福生活的建築基石。只學習了一些能夠快速開發地應用知識,還被一些坑項目坑了一年多。現在快要實習工作,一直在找機會補補這些基礎,不然出去工作學習基礎的機會時間更少了!


基礎更重要。建議大一不要就開始搞安卓,不要去搞開發,而是學號課本基礎知識,了解演算法和數據結構,學好數學和英語。等你學好了,學開發,就相對簡單的事情了。


工作室是很不錯的鍛煉,我以前在大學裡也有自己的工作室,感覺給後來就業帶來很大優勢。要注意的是工作室不要只往錢看,要保持對技術的熱忱而不是對錢,以後有的是賺錢的機會。另外也別就盯著一項技術鑽研,大學期間最好還是涉獵廣點,培養你對計算機技術的整體認知。


ACM相對來說太費時間了,可以淺嘗即止。演算法誠然對面試有幫助,但進入企業後的發展多數就和演算法關係不大了。當然ACM可以開發腦力,但能開發腦力的東西多了,比如麻將三國殺。。。


自我介紹一下。會計專業轉IT,從業三年,業已從良,偶爾接私活。
進入假正經模式。
首先,首先我對你們問這些個問題感到很不開心。作為一個有知識有文化有品味的青年學生可以問是什麼,為什麼。但是請別問我要做什麼。拜託,有點態度行不行?!當然你這個問題還是很有現實意義的,畢竟大學裡面學的東西會直接影響你以後工作的方向以及成就,這確實是我們應該慎重考慮的問題,但你問的也太早了吧。這麼天真爛漫的年紀就想這些問題,浪費了青春年華。青春年華應該幹嘛?做自己喜歡做的事情啊!比如學個吉他泡個妞,寫段代碼把學校網站黑了。自己喜歡什麼就幹什麼。做為行業從業者,我不知道其他行業的競爭力來自於哪裡,但是IT的競爭力在於你對這個行業的熱情,堅持以及自我學習的能力。所以請培養自己對這個世界的態度以及保持自己的興趣。
第二,就事論事的講,演算法跟項目經驗哪個更重要。這個在各大IT群裡面是月經話題。演算法、數據結構、編譯原理以及操作系統等等暫且稱為【內功】。php、html、android、ios等等我們暫且稱為【招式】。一句話總結,招式耍的好往往工作很好找,而內功有多深決定你能走多遠。我理解你們的心理狀態,大家都在說要學好內功,但是感覺沒什麼用,要是能找個人跟他打一架應該是很爽的。其實你真的需要去跟人打一架,但請別丟了內功的學習。說說我現在的感受,我會寫html,js,css、會asp.net,php,python、會android,IOS。我不願意出去工作,我想安心的修鍊一下內功。因為你會發現到最後會什麼會什麼變得毫無意義。內功到家了,學什麼語言都是水到渠成的事。


大四狗 即將工作給點建議,個人看法哈
1.你得根據自己興趣,個人覺得編程如果沒興趣以後走不久,都沒興趣了還怎麼堅持?
2.現在大一就能聯想到工作,題主能好好堅持以後絕對是個人才,ACM對於面試還是挺重要的,因為搞ACM的人不多,你搞了說明你是special,BAT喜歡這樣的人,BAT很多都是搞過ACM的,他們面試也是喜歡根據自己的口味來著。不過CSDN有一個叫演算法100道的 刷刷其實差不多了,至於計算機組成原理 計算機網路 資料庫都差不多,差距主要是ACM,網路跟資料庫可以結合到項目之中。
3.建議兩個一起搞,並不矛盾,只不過如果你喜歡項目,ACM時間花少點,項目花多時間,建議Android 後台這些都學下,然後主攻一兩個技術。
4.好好珍惜大學生活,太奢侈了,該玩就玩,該寫代碼就擼。


本人在高中搞過OI,和ACM差不多,只是賽制不一樣。剛剛進大學的時候我也準備搞ACM,可是沒過多久就放棄了。根據我高中的基礎(NOI前100),認真搞搞幾乎可以說有很大可能拿到好成績,可是還是放棄了(為了防止別人說我裝逼所以匿名)。原因很簡單,就是不喜歡這個。ACM看中的東西不是不僅僅是演算法,還考驗著你對這些代碼的熟悉程度。根據規則選手能帶一定數量的紙質資料入場,所以有許多人為了比賽場上代碼敲得快,把自己的代碼用各種奇葩的宏來壓縮代碼長度,使得代碼不堪入目(當然可能是我代碼風格和他們不一樣)。然後前面有答主說演算法能夠優化你的程序,可是我想說你在ACM學的所謂的演算法基本都被別人認為不夠先進,或者已經以庫的形式實現出來了,在中小工程下你基本用不到演算法或者可以用庫來代替。大型工程下公司一般都會自己組織一批專家研究自己的演算法庫,那時候考慮到的不光是演算法的複雜度低,而且從語言層面也會做特定的優化。我感覺答主不是要做這方面的工程師,如果你想做,ACM那麼僅僅是入門級的遊戲而已。但是也並不能說ACM毫無用處,畢竟大公司招聘的時候要面試演算法,但是除了google,都不會有很難的。
——————————————————————————
PS:
其實關鍵的還是要看你自己喜歡什麼,如果喜歡ACM,就全力以赴的去搞,如果喜歡其它技術,就全身心投入進去學,在哪方面變得NB都是能夠成為很厲害的程序員的。


可以專註android開發,但是演算法和數據結構也要有好的基礎。


大學不只有ACM,也不只有工程項目。
ACM!=演算法
演算法!=ACM
ACM!=高大上
工程項目!=low

透過現象看本質。
淺一點說,ACM是學習演算法的一個好途徑,訓練思維能力。項目更注重動手能力和各方面的小的綜合能力。
兩方面結合起來更好。
不要人云亦云。
博學之,審問之,慎思之,明辨之,篤行之
建立起自己的思維方式和價值觀,才是大學最基礎的功能。


喜歡什麼就幹什麼唄


把自己剛寫的答案再貼一遍(羞)
http://www.zhihu.com/question/31887920/answer/53952912


推薦閱讀:

如何看待CSDN強制要求用戶以主動發簡訊的方式來驗證手機號?
當碼農究竟有多累?
互聯網+被炒的那麼熱,到底有何意義?
怎麼理解Booth演算法?
如何從ACM轉向開發?

TAG:程序員 | 大學 | 計算機專業 | Android | 計算機科學與技術專業學生 |