回覆列表
-
1 # 燈泡電工
-
2 # 科技南木林
ACM的題注重邏輯和演算法,能比較輕鬆地解決ACM的題說明你的邏輯能力很強,同時也意味著你的程式設計能力達到了一定的水平,現在很多高校、企業也比較認可ACM競賽的獎項。但我認為,解ACM題的能力並不可以完全代表程式設計能力,因為程式設計涉及的範圍比較廣,而邏輯和演算法只是其中的一個重要部分,只能說你有較好的邏輯能力更有利於你程式設計能力的提高。
ACM 其實是一個智力遊戲,你需要程式設計能力來實現你的想法,但本質上更接近計算機科學的數學部分,而不是工程部分,所以 ACM 一定不(直接)代表程式設計能力。
但是,你知道為什麼 ACM 取得了一定成績的人在程式設計(特指工程領域)方面也會比較順利麼?
因為:ACM 其實是一個智力遊戲
修宇亮
南加州大學 計算機博士在讀
980 人贊同了該回答
“演算法與專案”之爭在程式設計屆的地位,就好像“存在與意識”之辯在哲學界的地位。這方面的問題出現在知乎時間線的頻率太高了,總也避不開,所以乾脆說一點我的看法(好牽強的理由...)
我想從一個比較奇怪的角度來切入,這裡不得不提到一個人,新東方的創始人之一——王強。
我之前聽過王強的一場演講,他在演講中講到自己在美國的求學之路,裡面有一段講他是如何成功說服計算機系主任同意讓他這樣一個英語專業的人進入計算機系攻讀碩士的,這段非常有料。他之前在北大英語系呆了十年,四年本科,然後又教了六年書,簡單講就是一個純正的文科生,而計算機是工科範疇,一個沒有數理基礎的文科學生要求到需要整天和數理打交道的工科念碩士,這聽起來是稍微有點天方夜譚,但王強愣是靠自己三寸不爛之舌說服了計算機系主任,成功進入紐約州立大學計算機系攻讀碩士。
他就講了三個點:(手裡沒有逐字稿,我就用自己的話概括一下)
人透過軟體來與計算機互動,而軟體說穿了就是人向機器傳送的一系列邏輯指令,這些邏輯指令是在程式語言(programming language)這種媒介的承載之下發送出去的,而我在北大十年,掌握了四門language,programming language本質上就是一種language,我對language太熟悉不過了,所以沒理由學不好程式設計。計算機指令和硬體進行互動,靠的是運算邏輯。我在本科期間修過邏輯課,而在北大六年的教書生涯中,為了把課講好講的有邏輯,我又在講臺上歷練了六年自己的邏輯思維,我敢保證,我的邏輯思維能力可以碾壓任何一個美國計算機四年級本科生。任何科研工作者,都需要極強的抽象能力,即從紛繁複雜的現象中抽絲剝繭提煉抽象的能力,計算機的問題也需要把實際問題抽象成數學模型,我搞了十年英語,文學著作基本看了個遍,我有很高的文學修養,而文學修養是美學修養的一種,美學修養說白了,就是一種高度的抽象能力,比如一個美女走過,你可以把他身上成億的資訊點抽象成一個詞——“美”,這就是抽象能力。最後王強用兩年半的時間完成學業,GPA接近4.0,最後去了貝爾實驗室擔任軟體工程師。
( 插句題外話:評論中有不少人懷疑王強這段經歷的真實性,我不是王強,沒法斬釘截鐵地回覆評論中的質疑,但我個人認為這個履歷作假的可能性並不大,新東方的巡迴演講搞了那麼多年,王強這套詞不知道在高校講過多少次,如果其中有事實性出入,恐怕早就被人揭出來了。當然,王強為了演講效果,肯定會對一些事件細節進行一定程度的戲劇化處理,不過只要沒有事實性出入(他的確在北大英文系呆了10年,然後申請到了計算機碩士,最後也的確進了貝爾實驗室擔任工程師),我們就應該持一個信任的態度,更何況,這本來就是個很牛很牛的人,他之後做成的事情,要比申請個master難度大多了,大風大浪都扛過來了,這小風浪,還不是手到擒來的事情嗎?)
當然,王強除了說出這三點,還用了一些談判學的心理戰術,這些就不一一展開了,想了解詳情的,我把影片放在最後。
我們就分析這三點,這三點讓他拿到了cs碩士錄取offer,獲得了貝爾實驗室的職位。
邏輯能力+語言能力+抽象思維能力+數理知識&計算機知識==合格的programmer
而ACM考察的是什麼?
把文字敘述的problem抽象成數學問題,然後利用邏輯思維,組織程式語言。
Debug考察你對程式語言的熟悉,速度空間最佳化考察你對計算機運算邏輯的瞭解。
一一匹配。
所以,你說IT公司招人喜歡招ACMer,到底有沒有道理?
我知道看到這裡,有很多人會反問我,難道專案開發經驗就不能培養這些能力嗎?
我覺得也能。
我不是打太極,我本來也不是隻站在ACMer這一邊,我只是在嘗試論證IT公司招ACMer的合理性,而沒想證明其唯一性。
另外,我真不覺得專案經驗牛逼的人難找工作,一個公司需要ios開發者,你恰巧做過ios開發而且有上架的產品,問問你foundation框架的細節,你都瞭解,不要你要誰?一個公司需要做前端的,你html css javascript jquery玩的飛起,不要你要誰?
我想大概可能有這樣幾個原因:
很多公司開發需要的技術比較特殊,使用的開發工具也是自家研發的,或者技術棧比較雜,很難招到技術棧完全匹配的工程師,市面上對該公司的開發技術熟悉的也寥寥,但無論什麼技術棧,只要是涉及到程式設計,都會涉及演算法,所以乾脆招一個搞演算法的,這樣可以省一些指導演算法時花銷的人力成本,而指導工具使用和指導專案開發流程的成本無論如何都省不掉。有些初創公司,隨著使用者規模的擴大和併發資料的增大,技術棧會有更替,一開始用python,後來改ruby,後來改go(我胡寫的,不要糾結順序),程式語言和框架各種變換,總不能換一次招一個新人吧,所以乾脆招一個腦袋清楚的,這樣學什麼新東西都快一些,而如何在可控的招聘成本內篩選出腦袋清楚的人呢?我之前幫主管篩過簡歷,我發現基本上每個申請研發崗的簡歷上都寫了密密麻麻的專案經驗,而這些簡歷有本科有碩士有專科有培訓班的,透過簡歷,一我沒法瞭解專案的規模,二無法瞭解專案的難度,三無法瞭解你在專案中的貢獻,我總不至於面試的時候讓你現場手寫一個排課系統吧,招聘也是要考慮人力成本的。但如果你簡歷上有個ACM亞洲盃銀牌,有個ACM地區賽金牌,這個就很容易判斷含金量了,哪怕你只有校賽的經歷,面試時候當場讓你手寫個dijkstra或者快排你很快寫出來了,也至少可以說明你是個腦袋清楚的人,這種考察放在專案上就不是很容易操作,當然,你如果獨立開發過一些不錯的移動端App,或者從0到1搭起過一個網站或者社群,而且在面試中對整個開發流程及細節如數家珍,我上手用了你的獨立開發產品覺得非常優秀,那麼這當然是順利入職毫不含糊,但現實情況是,簡歷專案造假的風氣太盛行了,很多培訓機構出來的學生簡歷都是雷同的,hr要在那麼多專案開發經歷中辨別什麼水什麼不水,確實有點強人所難,你想想,假如你是hr,你一天稽核一百多封簡歷,其中九十封都是各種名字高大上的專案,各種管理系統,各種安卓小遊戲,有幾個有ios開發經驗的,但是他們開發的app根本沒上線,你在appstore都找不到,突然你發現一封簡歷,上面寫自己是ACM銀牌,如果是你,你選二輪面試的時候,會不會首先把他排進去?公司技術主管是搞過NOI ACM Top coder的,比如你的上司是 @覃超 大神,那麼估計他會對搞過演算法競賽的應聘者,多留意幾眼,因為他了解這個嘛,你幾斤幾兩,他三個問題就把你摸得透透的,這招聘效率多高。綜上所述,ACM牛逼的人,程式設計能力高不高?高!可辨識度好不好?好!
專案經驗豐富的人,程式設計能力高不高?也高!但可辨識度好不好?由於魚龍混雜,可辨識度稍差一點。
以上,勿撕。