培养杰出程序员的捷径

培养杰出程序员的捷径

学习和参加算法竞赛是成为杰出程序员的捷径。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(nlog2n),10万×log2100万≈2000万),计算机在1秒内可以完成。二者的计算时间相差5万倍,算法的威力可见一斑。

算法竞赛涉及绝大部分常见的确定性算法,掌握这些知识,不仅能应用在软件开发中,也是进一步探索未知算法的基础。例如现在非常火爆的、代表了人类未来技术的人工智能研究,涉及许多精深的算法理论,没经过基础算法训练的人根本无法参与。

三、计算思维与逻辑思维

一些竞赛队员经常说:我们要尽量掌握所有算法知识。但是,程序设计不仅要有算法思想,还需要能正确地写出程序,这不是仅仅有算法知识就能完成的。一道难题,往往需要综合多种能力,例如数据结构、算法知识、数学方法、流程和逻辑等,这就是计算思维和逻辑思维能力的体现。通常,能解出这样的题目是高级程序员的特征。

ACM-ICPC亚洲区域赛和CCPC赛事上获得金牌、银牌的队员,能够凭借奖牌证实自己有这样的能力。这也是算法竞赛被看重的主要原因。

四、团队合作精神

在软件行业,团队合作非常重要,这一点不需要更多说明。ACM-ICPCCCPC竞赛把对团队合作的要求放在了重要位置。竞赛的赛制是3人一队,一台计算机,十几道竞赛题,限定5个小时。参加过现场比赛的队伍都能立刻体会到:一个队伍的3个人,在同等水平下,如果配合默契,则可以多做一两道题,把获奖等级提高一个档次。在竞赛 过程中,有人负责精读英语题,有人负责构造测试数据,有人负责编写代码,大家互相讨论思路,队长判断现场形势,确定做题顺序。每支队伍的3个人只有在日常训练中长期到合理分工、优势互补,从而发挥出最优的团队力量。

有人认为:毕业后参加工作,其实用不着算法竞赛这么多的复杂逻辑和算法知识,即使用到了,在工程中一般有现成的模块,拿来用就行了,只要了解这个模块用到的算法的作用和复杂度即可。这种认识是肤浅的,对于立志成为高级程序员的学生而言,进行大量的计算思维训练和经典算法训练是必需的,理由如下:

(1)算法是对学习和理解能力的一块试金石,难的都能掌握,容易的当然不在话下。在算法竞赛上获奖的人证明了自己有解决复杂编程问题的能力。
(2)即使有现成的模块,但是对于特定的需求,往往需要进行修改才能真正使用,没有真正理解的人无法修改。
(3)实际的程序往往有复杂的逻辑关系,但又不属于经典的算法,没有现成模块,需自己思考才能写出代码,这个能力是通过训练得到的。

——摘自罗勇军、郭卫斌著《算法竞赛从入门到进阶》

发布了421 篇原创文章 · 获赞 411 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/103509677