来自:峰瑞资本(微信号:freesvc)
世界著名的编程竞赛组织 HackerRank 刚刚发布报告:根据各国程序员在各项比赛中的表现,排出算法、数据结构、分布式系统、编程语言等几个领域的冠亚季军。在总得分榜上,中国程序员获得了第一名。美国则只排在了 28 位。
这一事实或多或少让人感到惊讶。美国拥有世界上最为知名的黑客文化,几十年间 “江山代有人才出”。而中国互联网行业更引以为豪的是模式创新。如果中国的程序员已经拥有如此强大的技术水平,那么距离 Facebook、谷歌这样的世界一流企业,我们还缺少什么?
为此,我们翻译了这篇来自 Priceonomics 的文章,并采访了一系列创业公司 CEO 如何看待 “中国工程师技术能力世界第一”。他们有的是国内最大开发者社区的 CTO,有的则在谷歌、亚马逊工作十余年,对这一问题都有一定的思考。在他们的回答中,“技术领导力” 一词被反复提及。就像特色场地预订平台百场汇 CTO 朱瑞清所说的,“相比编程能力,给公司的技术方展、框架设计提供经验、商业上的指导更为重要。”
全文约 7500 字,预估阅读时间 10 分钟。
哪个国家能够在编程奥林匹克竞赛中获胜?
文 / Priceonomics Data
Studio
译 / 王挺
来源 / Priceonomics
哪个国家拥有世界上最好的程序员?
许多人会认为是美国。毕竟,美国是比尔•盖茨,肯•汤普森(Ken Thompson),丹尼斯•里奇(Dennis Ritchie, 与 Ken Thompson 联合发明了 C 语言和 Unix 系统) 和唐纳德•克努斯(Donald Knuth,现代计算机科学的先驱人物,创造了算法分析学科)等诸多编程名人的故乡。但话又说回来,印度拥有许多诸如印度理工学院等著名科技院校,而俄罗斯的黑客一向以 “高效率” 而著称。
那么,是否有一种方法可以来衡量哪个国家拥有最好的程序员呢?
通过分析来自 HackerRank(Priceonomics 的客户之一)的数据,我们找到了答案。HackerRank 定期为程序员举办众多的编码挑战,通过参与挑战来提高程序员的编码技能。成千上万来自世界各地的程序员参加了各种编程语言以及知识领域的挑战,诸如 Python 语言、算法、安全领域以及分布式系统等。HackerRank 根据程序员完成挑战的准确性和速度,对他们进行评分和分级。
根据数据显示,中国和俄罗斯拥有最具才华的程序员。中国程序员在数学、函数式编程以及数据结构领域的挑战中击败了其他所有国家,而俄罗斯程序员在最受欢迎以及最具竞争的算法领域具有统治地位。尽管美国和印度有众多程序员参与了 HackerRank 的挑战,但在排名方面,他们仅获得了第 28 和第 31 名。
在开始进一步分析之前,我们先来观察一下参加比赛的程序员最热衷参与的挑战类型。在 HackerRank 比赛中,程序员可以选择参与 15 个不同领域的挑战。有一些领域要比另一些更受欢迎。下表显示了各领域完成挑战的参与度比例。
▲ 这张表格展示了 HackerRank 上最多人完成的项目。前三名分别是算法、Java、数据结构
最受欢迎的是算法领域,有接近 40% 的程序员参与其中。这个领域的挑战包括数据排序、动态规划、关键词检索以及一些其它基于逻辑的任务。而作为算法领域的挑战者,程序员可以使用任何编程语言,这也部分解释了为什么该领域如此受欢迎。(算法也是程序员面试过程中的一个关键内容。)
与算法相比,参与度第二的 Java 领域和第三的数据结构领域就相差很远了,这两个领域分别有接近 10% 的开发人员参与挑战。而分布式系统领域和安全领域是参与度最低的挑战领域。
那么,基于这些挑战,哪一个国家的程序员得分最高呢?
为了找到答案,我们分析了每个国家在各领域中的平均分。在取平均分之前,我们首先对每一个领域的得分进行了标准化处理(将每一个独立得分减去平均值后再除以标准差,即 z-score)。这样处理后,我们就能够在不同领域之间进行平等的分数对比。接下来,为了方便理解,我们将得到的 z-score 换算成 1-100 的分值度量。
我们选取了 50 个国家的数据。来自这些国家的程序员在 HackerRank 比赛中参加了数以千计的比赛(最少的也参加了 2000 多个)。下面是我们的发现:
▲ 参加 HackerRank 比赛的国家得分。前三名分别为中国、俄罗斯、波兰
中国得分最高,因此中国程序员获得了 100 的分值,名列第一。然而和第二名相比,中国只是以十分微小的优势取胜——俄罗斯的得分是 99.9 分。波兰和瑞士则得到了接近 98 分的好成绩,分列第三和第四位。在名单中,巴基斯坦以 57.4 分垫底。
印度和美国虽然贡献了最多数量的程序员,但甚至没有进入到榜单的前半部分。印度得到了 76 分,名列 31 位;美国得到了 78 分,名列 28 位。
虽然中国在平均分上战胜了其他所有国家,但这并不意味着它在每个领域都能排名第一。那么,在某一特定的技能领域方面,哪个国家贡献了最优秀的程序员呢?让我们再看看在每个领域方面名列前茅的国家。
▲ 各领域不同国家的得分情况。中国在数据结构、数学、函数程式语言中拔得头筹
不出所料,中国在很多领域的表现都相当优秀。来自该国的程序员在数据结构,数学和函数式编程领域击败了对手,排名第一。
另一方面,俄罗斯在最受欢迎的算法领域拔得头筹。在该领域波兰和中国分别排名第二和第三。
那么,如何解释不同国家在不同领域中的表现差异呢?一个可能的解释是俄罗斯的程序员更热衷于参与算法领域的挑战,并从中获得了更多的锻炼机会。而中国程序员更热衷于参与数据结构领域的挑战。
我们还比较了各国程序员,在不同挑战类型中所花费的时间,并将其与参加该项挑战的 HackerRank 用户的平均数据进行对比。经过这样的分析后,我们发现了在各个领域中,哪些国家的程序员更愿意接受挑战。
▲ 在同一领域中,最有可能参与和最不可能参与该项竞争的国家。中国程序员较少选择的项目包括 Java、SQL、数据库、Ruby
正如上表所示,中国程序员在数学领域的参与度远高于该领域的统计平均值。这也许可以帮助解释为什么在该领域中国程序员能够占据榜首。同样,捷克程序员在 Shell 领域展现出了很高的参与度,而在该领域捷克排名第一。
但除了这两个例子以外,其他国家的数据并没有显示出这样的相关性。一个国家的程序员更愿意参加某项领域的比赛,并不代表他们在该领域的得分排名就能更高。
我们也想知道不同国家是否对编程语言具有特殊偏好。印度程序员是否更钟情于 C++?墨西哥人会使用 Ruby 编程吗?
下图列出了不同国家程序员参与不同编程语言挑战的比例。
▲ 各国程序员所使用的编程语言情况
总的来说,各国程序员对 Java 挑战的参与度要高于任何其他编程语言挑战(也有少数例外,例如马来西亚和巴基斯坦的程序员更喜欢参与 C++ 挑战,而在台湾,Python 挑战最受欢迎)。斯里兰卡对 Java 挑战的偏爱度排名第一。而为 HackerRank 贡献了大量程序员用户的印度位列第八。
巴基斯坦、斯里兰卡和尼日利亚在榜单中垫底,这些国家的程序员可以向瑞士程序员学习他们的坚韧不拔的精神。当一名程序员在 HackerRank 进行挑战时,如果在挑战开始就放弃,那他/她只能得到零分。而在所有国家中,瑞士程序员的零分比例最低,这也使瑞士程序员成为当之无愧的 “全世界最顽强的程序员”。
▲ 各国程序员参加比赛的放弃率
每一天,世界上的程序员都在相互竞争,希望能够成为下一个比尔•盖茨或唐纳德•克努斯。
如果我们现在举办一场编程奥林匹克竞赛,数据显示中国将获得金牌,俄罗斯将带着银牌回家,而波兰将取得铜牌。尽管美国和印度在科技展示推广方面做出的努力值得称赞,但他们连排名的前25位都进不了。
CTO 们怎么说?
百场汇
CTO,前艺龙副总裁,原亚马逊(美国)技术总监。强迫技术人员从事管理岗,对个人、公司都是一种伤害
我个人感觉,仅仅通过 HackerRank 的数据,就说明中国工程师已经排名世界第一,缺少说服力。中国的程序员由于成长背景,对于考试制度拥有较强的积累。用测试的方法,来判断哪个国家的程序员最优秀,这个方法本身是有片面性的。
抛开本文内容不提,从我个人在中美工作十几年的经验来看,我也确实认为中国工程师的技术总体还不能说到了非常高的水平。
举几个例子。首先,世界上最著名的技术公司,Facebook、Google、微软、亚马逊、LinkedIn,它们会有比较高阶的职位,比如 Research Fellow,Distinguished Engineer,Senior Staff。而中国人取得这些职位的比例,要排在美国人、印度人,以及南亚出生的工程师后面。而各个团队的中流砥柱,常常是中国、美国、印度、欧洲背景的工程师进行 “四国大战” 的局面。
其次,出生在中国的工程师,基本功非常扎实,数学和逻辑的平均水平要高出其他背景的工程师。但对于整个系统的基础理解,以及系统集成、系统应用的经验和理念,往往比不上他的同事。
最后,大型公司对于工程师的考验绝不只有一个人的基础技术那么简单。他的领导、协同、说服他人的能力也很重要。这一点并不是中国工程师的强项。
造成以上情况的原因,主要有两点。一,中国背景的工程师,在数理逻辑的训练和积累上,比其他国家的工程师要好很多。但与此同时带来的负面效果,就是大家花费了过多时间在数理逻辑上,缺乏探索性技能的训练。
除此之外,中国工程师比较注重单兵作战。一个人或者很小的团队,都可以完成很难的任务,而且完成地很好。但如果和一个大型的团队协同,合作顺畅程度并不取决于个人技术能力,还包括如何说服他人接受自己的观点,把大的项目分解成很多子项目,带领几十人或者几百人去完成项目。在这一方面,中国工程师在学生时代、职业早期,就缺乏这样的锻炼的机会。另外对于开源软件项目的贡献上,算法,也比较少见到中国工程师的贡献。
第二个问题,作为 CTO 看中哪些技能。这和公司本身所处的行业、工程团队所面临的挑战是强相关的。
百场汇本质上是电子商务与共享经济交汇的细分市场。所以我在挑选工程师的时候,就会首先看中算法和数据结构,这在根本上决定了工程师发展的潜力。第二是编程语言的熟悉程度,表示他在编程方面的积累是否深厚。
这两点可以在面试中考察出来,比如回答试题、讨论技术细节。让候选人在白板上做一些问答。对于编程能力,可以通过堆栈、语言上算法的细节,比如集成、指针,准确地衡量出他们的能力。
中美技术圈对技术人员的定义、成长模式、看中的技能其实有比较大的不同。第一是对于技术人员的重视。在 Facebook、Amazon、Microsoft,一个非常大的项目可能完全由技术人员主导。这些巨头更加看重技术在公司成功、形成壁垒的作用。
中国的公司,相对来说由于时间、商业环境的原因,很多并没有达到这样的认识。所以在这样的中国公司中,他们对于技术的认知,仅仅是把一个产品、市场、销售的理念实现的工具性人才。对这些工程师的领导能力,就不会那么看重。
除了对技术人员的重视程度之外,中美公司另一个不同之处 “技术领导力”。在美国公司中,你会看到五、六十岁的技术人员,他们本身可能编程能力未必比二、三十岁的程序员更强,但是他们对于行业理解、公司系统架构有更深刻的理解,同时也有数十次产品发布的经验。
这些在 Research Fellow、Distinguished Engineer 岗位上的技术人员,会给公司的技术方展、框架设计提供经验上的指导、商业上的辅助。
据我观察,在中国科技公司中,扮演这样职务的人是非常少的。在中国公司,往往一个技术人员做到三十岁,会因为薪水上的提升、影响力上的提升,而一定要去做管理岗。对于他本人、公司,其实都是一种伤害。对于非常优秀的技术人员,他可能并不适合担任管理岗位。而对于公司来说,让一个技术上非常优秀的人员,脱离第一线编程的工作,可能几年后他对于技术上敏锐的感知度也会下降很多。
中国技术圈的趋势,让我个人比较担心的是技术创新的氛围和文化的建立。中国比较少可以看到真正以技术创新为核心竞争力的公司。大多数公司还是停留在商业逻辑、实现上的创新。真正以科技改变一个行业的公司还是比较少。
我们展望一下未来五到十年,科技上真正有趋势性、paradigm shift(模式转变)的公司在哪里,我个人认为还是在硅谷。因为他们还是在做一些技术上的研究。不管你认为下一次的技术变革,来自 VR、AR、智能学习、机器人,我们看到在硅谷、国外的研究圈,已经很多公司在这里已经深耕了五年到十年。如果这些技术未来真正可以改变人类生活的时候,肯定是这些公司容易抓住机会。
在中国,相对来说大家还是比较重视眼前的利益。等到风口真正刮起来的时候,留给中国技术圈的机会就不会很多了。
行业涌入缺乏钻研热情的新人,让我有些不安
中国程序员排名第一,是因为统计的误差吧。HackerRank 更加注重算法、逻辑性的考察,在这一方面,中国程序员是比较有优势的。但是业界对程序员的要求不仅仅是有算法、数据结构的考察。架构的能力、设计的能力、整体设计的能力,这些都是很重要的。
在 HackerRank 中的比赛中,我会看中算法、数据结构、设计模式这一些考察。具体到设计模式方面。因为算法强弱,并不能很本质地决定当下互联网企业的核心竞争力(大数据类的企业对算法要求很高)。但对于更多的互联网企业来说,设计模式会决定整体结构的设计、和同事的合作情况。
唯一需要担心的是整体的技术水平能力,没有遵循技术发展阶段同步提高。一个值得关注的趋势是:大学毕业生觉得写程序比较吃香,以至于这个行业涌入大量缺乏深入钻研热情的新人。这让我有些不安。
心橙互联 CEO,工程师出身,拥有谷歌 10
年工作经验传统文化让人更愿意跟从而非领导,容易干很多脏活累活
中国程序员在世界上的各种竞赛上取得好成绩已经不是新闻。我之前在谷歌带的实习生就有 IOI、ACM 金牌,还有 Topcoder 有史以来夺得最多次设计冠军的中国人。但是要说目前中国程序员已经是世界第一的话,我认为还差很远。
在谷歌和 Facebook,优秀的程序员还是欧洲、美国以及印度的居多。中国的程序员很勤奋也很聪明,但主要还是在别人的框架下勤勤恳恳的填代码,缺少开创性的框架、系统。在这一点上,国人还需努力。
对于 HackerRank 这些考察的技能中,我个人最看重的是算法,其次是数据结构。实际上,我一直不把算法和数据结构当作一种技能,更多的是一种思想,一种科学的思考方法。
算法和数据结构是一种基础知识,也可以看成是武侠小说里面的内力。而程序设计语言、计算机安全等等更像是不同的招式和招数。内力所到之处,寻常招式也能发挥巨大威力。就像张三丰使出一招武当长拳,那威力就不可跟熟悉各派招式的赵敏所能匹敌的一样。
我们在评估算法和数据结构的时候,除了看基础知识掌握程度以外,也要看是否有创造性的思维和灵活应用的能力。通常而言,我们会把一些实操问题,抽象成为一些算法和数据结构的问题,然后跟他一起去解这个问题。在一起讨论的时候,就能看到对方能不能听懂问题重点,分析问题是否到位,解题思路是否创新,能不能互相激发起灵感等等。有点像武侠里面的高手拆招或者围棋对弈一样:最高的境界尽在不言中。比划武功,豁然开朗。
美国的技术圈更看重的是领导能力(leadership)。孩子从童子军的时代开始,就一直被灌输的是:要在最关键的时候能挺身而出,解救世界。你看《美国队长》、《钢铁侠》这些大片无一不是在传递这样的思想。我认为这就叫领导力。
领导力就是勇于承担责任,在关键的时候往往能发挥意想不到的能力。而中国的程序员们在教育上普遍接受儒家谦逊的思想熏陶,往往喜欢做 Follower(跟随者)而不是 Leader(领导者) 。因此,能力很强的人,往往也都不敢或者不愿想在某个方面挺身而出。久而久之,就被当作干脏活累活的不二人选了。
中国互联网技术圈总体的形势是非常好的。世界越来越平。中国程序员在掌握世界最新技术方面的时间间隔越来越少。现在中国程序员的普遍水平在越来越高。由于语言水平的提高,走出去的中国程序员也得到了越来越多的国际认可。这些都是很好的趋势。
然而国内互联网公司,即使是 BAT 为首的互联网大鳄,都喜欢把技术当作是一个可有可无的东西,并不认为公司的核心价值在于技术。这样使得公司更愿意投资容易获得短期利益的项目,而不愿意去在更深更黑更难的技术上做投资。拿我们在做的视频通信技术举例,就很难在国内看到愿意在这个艰难的技术领域里面深耕的公司,和我们一起默默地啃下这些艰难的技术。
洋葱数学
CTO,希望能用技术改变中国教育一点点。比赛本身不重要,更看重愿意参与的勇气和毅力
排名第一这事最多只能说明中国人拥有扎实的应试能力和多年丰富的临场考试经验。针对性训练的竞赛者和每天对加班习以为常的程序猿来说,无论是人群比例,还是对最后产出的评判标准,都是截然不同的,这跟奥运奖牌连续前三但国民体质持续降低是一个道理。大学里计算机相关学科的教学内容与现实的严重脱节,软件、互联网公司对于程序猿的过度使用以及长期培养计划的缺乏,才是罪魁祸首。
作为 CTO,在 HackerRank 所举办的比赛中,你最看重员工的哪一项技能?其实我最看重的是他参加 HackerRank 这件事情,看重的是他背后可能的潜质:有勇气,有毅力,愿意尝试,期望证明自己的价值。如果硬要挑一个的话肯定是算法。其他的都会因为程序猿角色不同而有不同的侧重,而算法则是对编码实践的经验总结和抽象。Codereview 依旧是最原始但最有效的衡量方式。另外打个软广,算法离不开数学,如果数学基础不好,欢迎从洋葱数学学起:)
从 Hackernews 和 TED 上了解,个人认为相对来说美帝会更看重一个人解决问题的能力和效率,以及一个人对于整个团队的技术贡献。当然,中国在这点上也在改善,但是相差还是很远。
作为一个技术型人才,你需要理解公司商业模式,借助第三方服务和开源代码快速验证产品假设,需要设计稳定的架构保证服务的高可靠性,用数据驱动公司产品服务的改善和升级,学习新技术为公司带来更多有意思的创意,一个只想写好程序的程序猿一定不是一个好程序猿。
工程师文化不是一句口号,而是需要我们更多在价值观上的理解,认同和执行。
一个热爱编程的开发者,开发者社区 SegmentFault 创始人
CTO。
更看重算法和数据结构,基础决定高度
我觉得这个比赛不能完全反应真实水平。HackerRank 也只是众多编程比赛中的一个。中国程序员在世界范围内,从他们创造出来的产品、国际影响力来看,排在第一梯队没有什么问题。但是具体排名不是太重要。
针对员工技能这一块,我觉得最基础的是算法和数据结构。基础决定了他的高度。至于考核的方法,主要在日常工作中看他的编程习惯、思想,都能看出他对基础知识的掌握。
中美技术圈之间,技术本身的差异不是很大,更多是文化上的差异。这和我们从小所受的教育有很大的关系。美国文化提倡自己的东西要 show 出来,让别人知道,主动去沟通。中国人受儒家思想、中庸之道的影响,更喜欢藏拙。很多技术大牛不一定善于演讲,把自己的思想布道给别人。
我虽然没有在美国工作过,但是根据一些朋友的说法,美国程序员更看重和其他同事沟通,中国程序员更看重实干、写代码的能力。但这种情况也在慢慢改善。
本文译者
创业者。先后就职于证监会、OTA、航空公司等各个行业,从事项目管理及 IT 管理工作
●本文编号233,以后想阅读这篇文章直接输入233即可。
●输入m可以获取到文章目录。
推荐《15个技术类公众微信》
涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。