培养杰出程序员的捷径
学习和参加算法竞赛是成为杰出程序员的捷径。ACM-ICPC
的冠军被称为“世界上最聪明的人”,竞赛的获奖者基本上都成长为杰出的软件工程师,并且有很多人是IT
公司的创业者。
一、编写大量代码
比尔·盖茨曾说过:“如果你想雇用一个工程师,看看他写的代码就够了。如果他没有写过大量代码,就不要雇用他。”通过编写大量代码,能做到算法精妙合理、逻辑清晰透彻、代码喷涌而出、格式赏心悦目、挑bug
手到擒来,这是杰出程序员的基本功。ACM-ICPC
竞赛队员想达到在区域赛中获奖的水平,需要写5
~10
万行的代码。
Gates: “If you want to hire an engineer, look at the guy’s code. That’s all. If he hasn’t written a lot of code, don’t hire him.”
二、丰富的算法知识
算法是程序的核心,决定了程序的优劣。特别是在数据规模大的情况下,算法直接决定了程序的生死。例如,用计算机处理排序问题:假设有100
万个数,用最简单的冒泡排序算法,计算量可能多达1
万亿次(冒泡排序的计算复杂度是O(n)
, 100
万×100
万=1
万亿),在计算机上,计算时间长达几个小时,实际上根本不能用;如果改用快速排序算法,计算量只有2000
万次(快速排序的计算复杂度是O(nlog
2n)
,10
万×log
2100
万≈2000
万),计算机在1
秒内可以完成。二者的计算时间相差5
万倍,算法的威力可见一斑。
算法竞赛涉及绝大部分常见的确定性算法,掌握这些知识,不仅能应用在软件开发中,也是进一步探索未知算法的基础。例如现在非常火爆的、代表了人类未来技术的人工智能研究,涉及许多精深的算法理论,没经过基础算法训练的人根本无法参与。
三、计算思维与逻辑思维
一些竞赛队员经常说:我们要尽量掌握所有算法知识。但是,程序设计不仅要有算法思想,还需要能正确地写出程序,这不是仅仅有算法知识就能完成的。一道难题,往往需要综合多种能力,例如数据结构、算法知识、数学方法、流程和逻辑等,这就是计算思维和逻辑思维能力的体现。通常,能解出这样的题目是高级程序员的特征。
在ACM-ICPC
亚洲区域赛和CCPC
赛事上获得金牌、银牌的队员,能够凭借奖牌证实自己有这样的能力。这也是算法竞赛被看重的主要原因。
四、团队合作精神
在软件行业,团队合作非常重要,这一点不需要更多说明。ACM-ICPC
、CCPC
竞赛把对团队合作的要求放在了重要位置。竞赛的赛制是3
人一队,一台计算机,十几道竞赛题,限定5
个小时。参加过现场比赛的队伍都能立刻体会到:一个队伍的3
个人,在同等水平下,如果配合默契,则可以多做一两道题,把获奖等级提高一个档次。在竞赛 过程中,有人负责精读英语题,有人负责构造测试数据,有人负责编写代码,大家互相讨论思路,队长判断现场形势,确定做题顺序。每支队伍的3
个人只有在日常训练中长期到合理分工、优势互补,从而发挥出最优的团队力量。
有人认为:毕业后参加工作,其实用不着算法竞赛这么多的复杂逻辑和算法知识,即使用到了,在工程中一般有现成的模块,拿来用就行了,只要了解这个模块用到的算法的作用和复杂度即可。这种认识是肤浅的,对于立志成为高级程序员的学生而言,进行大量的计算思维训练和经典算法训练是必需的,理由如下:
(1)算法是对学习和理解能力的一块试金石,难的都能掌握,容易的当然不在话下。在算法竞赛上获奖的人证明了自己有解决复杂编程问题的能力。
(2)即使有现成的模块,但是对于特定的需求,往往需要进行修改才能真正使用,没有真正理解的人无法修改。
(3)实际的程序往往有复杂的逻辑关系,但又不属于经典的算法,没有现成模块,需自己思考才能写出代码,这个能力是通过训练得到的。
——摘自罗勇军、郭卫斌著《算法竞赛从入门到进阶》