ACM 其实是一个智力游戏,你需要编程能力来实现你的想法,但本质上更接近计算机科学的数学部分,而不是工程部分,所以 ACM 一定不(直接)代表编程能力。
但是,你知道为什么 ACM 取得了一定成绩的人在编程(特指工程领域)方面也会比较顺利么?
因为:ACM 其实是一个智力游戏
如果你去感受过的话,你一定会发现人与人的差距是如此的巨大,可能在实际项目中大家都拼不到什么天赋,但是 ACM 不仅需要努力,还需要天赋。编辑于 2016-05-05赞同 24311 条评论分享收藏喜欢
修宇亮
南加州大学 计算机博士在读
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玩的飞起,不要你要谁?
但不得不承认,现在就业市场也的确出现一些项目丰富的开发人员不如ACMer受欢迎的情况,这是为什么呢?
偶想大概可能有这样几个原因:
很多公司开发需要的技术比较特殊,使用的开发工具也是自家研发的,或者技术栈比较杂,很难招到技术栈完全匹配的工程师,市面上对该公司的开发技术熟悉的也寥寥,但无论什么技术栈,只要是涉及到编程,都会涉及算法,所以干脆招一个搞算法的,这样可以省一些指导算法时花销的人力成本,而指导工具使用和指导项目开发流程的成本无论如何都省不掉。有些初创公司,随着用户规模的扩大和并发数据的增大,技术栈会有更替,一开始用python,后来改ruby,后来改go(偶胡写的,不要纠结顺序),编程语言和框架各种变换,总不能换一次招一个新人吧,所以干脆招一个脑袋清楚的,这样学什么新东西都快一些,而如何在可控的招聘成本内筛选出脑袋清楚的人呢?偶之前帮主管筛过简历,偶发现基本上每个申请研发岗的简历上都写了密密麻麻的项目经验,而这些简历有本科有硕士有专科有培训班的,通过简历,一偶没法了解项目的规模,二无法了解项目的难度,三无法了解你在项目中的贡献,偶总不至于面试的时候让你现场手写一个排课系统吧,招聘也是要考虑人力成本的。但如果你简历上有个ACM亚洲杯银牌,有个ACM地区赛金牌,这个就很容易判断含金量了,哪怕你只有校赛的经历,面试时候当场让你手写个dijkstra或者快排你很快写出来了,也至少可以说明你是个脑袋清楚的人,这种考察放在项目上就不是很容易操作,当然,你如果独立开发过一些不错的移动端App,或者从0到1搭起过一个网站或者社区,而且在面试中对整个开发流程及细节如数家珍,偶上手用了你的独立开发产品觉得非常优秀,那么这当然是顺利入职毫不含糊,但现实情况是,简历项目造假的风气太盛行了,很多培训机构出来的学生简历都是雷同的,hr要在那么多项目开发经历中辨别什么水什么不水,确实有点强人所难,你想想,假如你是hr,你一天审核一百多封简历,其中九十封都是各种名字高大上的项目,各种管理系统,各种安卓小游戏,有几个有ios开发经验的,但是他们开发的app根本没上线,你在appstore都找不到,突然你发现一封简历,上面写自己是ACM银牌,如果是你,你选二轮面试的时候,会不会首先把他排进去?公司技术主管是搞过NOI ACM Top coder的,比如你的上司是 @覃超 大神,那么估计他会对搞过算法竞赛的应聘者,多留意几眼,因为他了解这个嘛,你几斤几两,他三个问题就把你摸得透透的,这招聘效率多高。综上所述,ACM牛逼的人,编程能力高不高?高!可辨识度好不好?好!
项目经验丰富的人,编程能力高不高?也高!但可辨识度好不好?由于鱼龙混杂,可辨识度稍差一点。
以上,勿撕。