注:ACM 竞赛全称为 ACM 国际大学生程序设计竞赛,英文全称:ACM International Collegiate Programming Contest,简称 ACM-ICPC 或 ICPC )。因为大家习惯简称为 ACM,文章中出现的 ACM 若无额外备注,皆指 ACM-ICPC。
这是方清经历过的最难受的面试,临近毕业的他没有任何实习经验,和面试官的前期交手让他有些慌张,面对一些从来没有接触过的项目问题,方清都老老实实地以「不知道」终结了他和面试官的对话。
正当方清以为自己这次面试将以大失败告终时,面试官给方清出了两道算法题。作为某理工科学校 ACM-ICPC World Finals 的选手,方清展现出了应有的基本水平。交完两道算法题的答卷,方清斩获了他心心念念的网易游戏的 offer。
是时候展现真正的技术,大概就是方清遇到这个场面时应该配上的画外音了。
在 ACMer 这个群体中,方清还是一个刚毕业不久的小兵,ACM-ICPC 竞赛历史上那些获取好名次的选手在「三十而立」之后,取得了让人十分艳羡的成绩:唐文斌是旷视科技的创始人之一,戴文渊创办了 GEEK 范儿十足的第四范式,楼天城则是 pony.ai 的创始人,林晨曦创办依图科技…
这些顶着 ACM 光环的人即使在精英频出的互联网也有着实打实的先发优势。在 100offer 平台上,超过一半的拥有 ACM 竞赛背景的候选人,第一份工作加入了 BAT 级别及以上的国内互联网公司。
如果说有什么标签能在你求职研发工作时实打实地加分,ACM 无疑是其中最有含金量的几个标签之一。 ACM 究竟有什么魔力,能够成为大家求职的 Pass 卡呢?这事儿得从 ACM 比赛到底比什么说起。
ACM:世界顶尖程序设计大赛
ACM 作为计算领域的顶尖程序设计大赛,每年上半年举行。不同于其他竞赛的个人战,ACM 为「小组战」,由 3 名在校大学生组成小分队参加比赛。在比赛过程中,3 人组成的小组共用一台电脑,编写程序解决 8-10 个问题。因为是时间紧、任务重的团队赛,ACM 比赛更加紧张激烈。
和世界杯的选拔方式类似,ACM 的选拔方式也是首先通过区域赛进行队伍的选拔,每所学校在区域赛时可以派出多支队伍参赛。拿到区域赛冠军的队伍所属学校即可选派团队参加 World Finals,届时一个学校有且只能选派一支团队参赛。
国内大学第一次在这场国际顶尖赛事中捧冠而归,是在 2002 年夏威夷的 ACM-ICPC World Finals,由林晨曦、陆靖和周健组成的上海交大队摘得第一名。随着 ACM 竞赛在国内的发展,部分学校为了更好地培养校内的 ACM 竞赛团队,专门成立了相关的班级,希望能够通过定制化的方式来培养顶尖的 ACM 选手,其中最为有名的就是上海交大的 ACM 班和清华大学的姚班。
但无论是通过学校的*训练出来的 ACM 队员还是自主走上竞赛之路的「野战军」,在备战 ACM 上都吸取了丰富的知识和技能,最后帮他们在职场上飞速成长打下基石。
赛场:为了打好一场比赛,他们付出了哪些?
ACM 官宣的比赛宗旨道出了想要拔得头筹的参赛者的必备品质:「展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力」。
在养成、打磨这些品质的过程中,ACMer 们都经历了什么?
1、远超于常人的时间付出
「从高考之后,我就没有过过暑假。」正在交大 ACM 班读大二的花袭用一句话为我们揭开了 ACM 参赛选手训练备赛的冰山一隅。
花袭从高中开始参加计算机竞赛,在高二 NOI(全国青少年信息奥林匹克竞赛) 中摘银的她很快就被交大 ACM 班的教练「盯」上了。高考一结束,交大就向花袭伸出了橄榄枝,问她是否愿意在大学延续计算机竞赛,成为校队的一员,在大学里参加 ACM 竞赛。曾在高中取得不错成绩的花袭接受了这一邀请,加入了交大校队。 当她的小伙伴们还在享受高考后解放的暑假时,花袭已经抵达位于上海远郊的交大闵行校区,开启日复一日的训练生涯。
曾经的 World Finals 选手方清并没有像花袭这样的高中先发优势,大一才开始接触 ACM 的他为了备赛,大学一年级每周需要花约 80+ 小时进行刷题。
ACM 比赛现场有个保留环节:每当有队伍答对一道题,会场内就会升起一只气球。大部分人只看到了气球五彩斑斓的热闹场面,却不曾设想,这些 ACM 竞赛选手在场外默默付出的时间和努力。
2、时间积累出的代码能力
对于参加 ACM 的选手而言,代码能力成为他们是否能够生存在团队中的基础关卡。如前文提到,ACM 比赛中答题时间非常宝贵,并且如果你提交的答案中出现错误,会有扣时的惩罚。因此虽然 ACM 竞赛中每一道题目的代码量并不大,但却对准确性提出了十分高的要求。
准确性要求的直观感受就是切题的手速要快、准、毒。为了能够达成这个目标,花袭从高中开始就接触了相对系统的数据结构、算法的训练,进入大学之后又接受了学校更为变态的计算机体系架构等方向的训练。
「有一次我遇到一道题目,想法思路都没问题,但就是显示错误。研究了好久,最后发现问题出在我定义的变量名称和 C 语言中的一个库函数重名导致的。」花袭就是在这样不断反复的练习中点满了自己工程代码上的知识点。
见多了这些经常出现的 bug,大部分 ACMer 在思考一个问题、码代码的时候都会想的十分周全,注重代码的边界条件。
除了代码写的十分优秀之外,ACMer 们定位问题的能力也是通过备赛训练反复打磨出来的。ACM 选手在训练刷题时通常会碰到一个程序跑在自己的小数据集上没有问题,但是在 OJ(ACM 在线答题平台)上答题时,系统就会告诉你错了,但它不会告诉你到底是哪里有问题,这就需要答题者去想办法定位问题了。
就是这样一次次「耐操」的训练,慢慢锻炼出了每个 ACMer 对于写简洁代码的习惯和追求。这个习惯最后也成为他们后续在工作中要求自己项目的标准。
3、时间沉淀出的思维蜕变
除了代码工程能力之外,更大的改变体现在对选手结局问题思维的影响上。
「我觉得 ACM 更是一个锻炼大家解决问题的思路的比赛,这就像官方宣传中说的一样」。这是我们采访的绝大多数 ACMer 得出的反馈。
更加注重方案的质量
这些通过最开始训练不断积累起来的代码感觉延续到实践中就体现在了面对问题时的思考角度的变化上。「我认为 ACM 对我的显著提升是在 sense 上,比如对时间复杂度和空间复杂度的考虑。」前 ACM 选手 SimonS 总结了打比赛对自己工作习惯的影响。
不断寻求最优解决方案
其次,ACMer 们都养成了不断追寻最优解决方案的习惯。当你面对一个问题,脑子里同时会出现好几种解决方案,这个时候这些 ACMer 就会不自觉地开始对比每个方案的优缺点,最后选出最适合当下场景的解决方案。
深度思考问题的能力
除了这些基本的解题思路的习惯养成外,大部分的 ACMer 还养成了自己动手丰衣足食的「好习惯」。「没有什么问题是解决不了的,如果现在解决不了就多想几天」前 ACM 选手 Echo 在回顾自己备战 ACM 比赛中遇到的问题时总结出了这样的「江湖经验」。
这背后其实就是对一个问题深度思考的能力,当大部分人在面对一个难题时选择「5 分钟从看题到放弃」,多数 ACMer 愿意花上几天甚至几周的时间来思考。
不积跬步无以至千里,这样的积累最后也成为 ACMer 在职场发展上快人一步的关键因素。
职场:ACMer如何把竞赛力转化为工作力?
在 100offer 平台和 offer 君接触的 ACMer 中,他们的职业发展可谓是「一帆风顺」。
在 ACM 语境下,这些竞赛选手似乎总推翻伤仲永式的天才走向平庸的「悲剧模式」,就像善于通过反复的训练来获取竞赛中的好名次一样,他们也善于用竞赛中养成的好习惯来提高在职场中的竞争力。
1、找工作硬实力:行走的做题器和聪明的气质
简历上要是出现了 ACM-ICPC 省级以上名次的关键词,这份简历就很难被遗漏,拿到面试基本上是板上钉钉的事情。
用人单位喜欢 ACM 背景出身的候选人也不无道理。面试官也会担心被候选人的「牛皮」欺骗,当他无法全面了解你过去所做的事情时,一个客观公正的比赛结果,往往比讲不清楚说不明白的项目经历来的可靠。
对于 ACMer 而言,无论是笔试还是面试中出现的题目都不会「超纲」。前 World Finals 选手 Echo 回溯他职业发展中接触的几家公司时,题目出的最难的就属 Google 上海。「Google 上海的题目基本和 ICPC 的水平看齐」,当他面试 Google 上海时,给了我们这样的反馈。「这个时候真的会觉得大学时候多少个刷题的日日夜夜都还挺值得的。」Echo 最终凭借着自己出色的面试表现社招加入了 Google 上海。
「可能是因为我在面试时展现出了聪明的气质」方清回顾他在刚毕业没有任何实习经历还能净收大厂 offer 时给了我们一个「自恋」的回答。其实所谓的聪明气质,无非就是备赛训练出来的思维敏捷、思路清晰、底层知识扎实、善于寻找最优解决方案等。
这样的候选人,没有哪个面试官能够拒绝。
2、职场软实力:把备赛的标准迁移到工作中
如果说通过面试都是吃的备赛的「老本」,那么进入工作场景,他们又做到了转化自己从 ACM 竞赛中积累的的优势、克服自己的劣势。
现在方清和 SimonS 都是团队中为数不多的 90 后 P7。然而,在这之前,初入职场的他们却也经历过一段代码习惯修正的阵痛期。
「我们工作后,也并不是一直那么顺利的」,方清发现自己和工作脱节的第一个表现就是他们的代码写得太「毒」了,没有封装、函数的概念。他们习惯于 ACM 竞赛中写出的一个又一个小程序,而没有大型规范的代码训练。
过了这个阵痛期之后,在工作中的不同表现随着大家对于任务要求的不同逐渐显露出来。
对于大部分研发而言,他们的工作中其实大部分都在复现最新的 paper 或者别人的一些项目,把他们进行二次开发,最后应用在自己的项目上。「这个时候,你就会发现其实大家对工作的要求逐渐发生了区别」。当你去复现别人的东西的时候,方清这样的前 ACM 选手对于效率、性能都有着更高的要求。比如说别的团队觉得一秒训练一个 benchmark 就够了,但是方清能够做到一秒训练 100 个 benchmark。
「所有需要对外发布,给别人用的东西,我们都不能接受它效率太低」SimonS 也认同了方清的观点。「特别是你进入互联网大厂,里面涉及的数据量那么大,你要是不考虑中间的时间空间复杂度,那真的要完。」
这时,参加 ACM 比赛中训练出来的寻找最优解,永远不拿临时解决问题的方法来搪塞问题的原则和思路,成为这些在大厂中不断晋升的 ACM 拿项目的优势。
致更多的普通人:错过 ACM,来者尚可追
写到这里,可能会有很多读者说,这些 ACMer 的经历根本没有可复制性,他们从本科就开始为之奋斗,我们现在仅处理业务紧急问题都已经焦头烂额了,哪能像他们这样再花大量的时间来进行训练。
我们无意去宣扬大家应该花大量的时间来进行刷题上,这个并不适用于大部分处在工作状态中的人。而是希望大家能够在疲惫的开发过程中,建立一个「不断追求更高、更快、更强」的习惯,形成不断寻找最优解决方案的解题方式。
纵观 ACM 选手的职业发展,他们幸运地在于仅在大学阶段就积累了足够多的「见识」,通过一个比赛,他们锻炼出了丰富的技能维度,最后帮助他们一步一步走的越来越稳,越来越快。当你了解了这部分人如何慢慢把自己锻炼成「让人羡慕」的样子时,其实你应该思考的是如何把他们成熟的、总结好的经验迁移到自己的职业生涯中。
即使你比 ACMer 可能晚起跑了一个本科,但这不过是你未来生命中很小的一部分而已。
100offer说
「人在做自己喜欢的事情的时候,眼神里有光」,大概说的就是这些被 ACM 虐了千百遍却依然热爱,并且付出的选手。
当我们问及他们和那些在 World Finals 上拿勇夺金牌的大神差距在哪时,「比我聪明」成为频率出现最高的回答。虽然「比我聪明的人比我还努力」是一句很丧的话,但是他们却从来没有用丧来结束自己所热爱的竞赛、工作、项目。
Echo 在 Google 上海和 ACM 冠军大神讨论问题时,经常感受到自己的智商被碾压,「感觉我和他的差别就是人和狗的差别」。但这些智商上的差距从来没有成为他们在现有的功勋章上打瞌睡的理由。
自驱力、行动力和高标准贯穿他们整个学生到职场的生涯,他们只是得到了他们应有的回报。