25岁的楼天城有“中国大学生计算机编程第一人”的称号,也被参加竞赛的学子们敬称为“楼教主”。他的传奇经历一直激励着众多年轻学子:从2001年开始参加计算机编程竞赛,并连获全国一等奖;入选国家集训队,同年获得IOI金奖并被保送到清华大学;开始在首位亚裔图灵奖获得者姚期智院士的理论计算机中心攻读博士;和两次带队参加ACM/ICPC全球总决赛并获得第二名。《程序员》近日专访了编程奇才楼天城,让他与我们分享一下他传奇的编程竞赛之路。
记者:请简单谈谈你的童年经历。童年哪些人、哪些事对你的影响最大?
楼天城:小时候,我比较爱玩,并不怎么喜欢学习。后来在8岁那年,我跟随父母一起到清华大学游玩。身处中国的最高学府,我不自觉地受到了感染,当时就给自己定下了童年的第一个目标——要在学习上投入更多的精力,严格要求自己,将来一定要到清华大学读书。这是童年中对我影响最大的一件事儿。经过十年的努力,现在这个愿望已经实现了。
父母是童年时代对我影响最大的人,他们特别注重对我心理、性格等素质的培养,而不是局限于学业。他们认为高素质对人的影响远远超过学习能力的影响。在高中我能如愿参加各项编程竞赛,也离不开父母的支持,但前提是数学等智力科目不会受到影响。这类竞赛并不属于高考科目,而且势必会对学业产生一定影响,如果没有父母的支持,参加竞赛这条路是走不通的。父母的支持支撑着我一直在竞赛这条路上走下去。另外,我比较喜欢各种棋类,还喜欢踢足球。棋类可以锻炼人的思维,而运动也会培养人的思考能力。小时候我就考虑,向对方球门底线带球(如果是向球门带球,一定是越向前越好),球门与球的角度是越变越大还是越变越小;往前带球,这个角度是越大越好,还是越小越好。经过计算后,我发现把球带到某个地方时,角度是最大的,再往前带就会变小,而这个地方就是射门的最佳位置。结论是:这个最大的角度与距球门的距离有关。
记者:你是什么时间开始接触编程的?在学习编程过程中,都开发过哪些应用?
楼天城:我从高一开始学习编程相关知识。编程对于高中生来说,确实是一门特别的科目。我所开发的应用中印象比较深刻的是黑白棋。当时在联众的游戏平台上,它有90%的胜率。最初设计的黑白棋只能搜索到六层,它的“棋艺”并不理想,当时很多此类的黑白旗游戏也能做到这一步。为了突破这一局限,我研究了各种优化技术、博弈算法及搜索技术,对算法进行了优化,使原来的搜索增加了四层,它的计算能力、博弈水平也随之提高了很多,一时很多人都难以胜过它。虽然这个游戏并没有像李开复当年写的黑白棋那么优秀,但对我来说,还是蛮有成就感的。另外,我还做过很多其他的应用,但大多是实现一些涉及核心的关键问题,并没有作为产品公布出来。
记者:你第一次参加编程竞赛是什么时间?在之后的竞赛经历中,遇到了哪些挑战?
楼天城:,我第一次参加编程竞赛,是Google编程挑战赛。由于一个失误,我与冠军擦肩而过。大赛结束后,我非常沮丧。后来在父母和老师的鼓励下,我下定决心要再等机会,赢取冠军。
两年后,直到,我才有机会再次参加Google编程挑战赛,并在最后8分钟赶超了当时领先于我2小时52分的南非选手,获得了冠军。这次大赛对我来说可以算作一次真正的挑战。
记者:举办的topcoder公开赛,你取得了一个不错的成绩,对此有什么感受?
楼天城:topcoder公开赛是世界范围内一年一度的编程大赛,在赌城拉斯维加斯举行。我参加的其中两项不同的比赛都进入了决赛,一项是24小时的类似马拉松的Coding比赛,另一项是算法编程。这次比赛比较可惜的是,在最后决赛阶段犯了一个小小的错误,而滑到了亚军的位置。以后再有同样的机会,争取能够获得更好的成绩。
记者:请谈一下现在读博的感受。
楼天城:我从开始在姚期智院士领导的清华大学理论计算机中心攻读博士学位,现在还处于学习和提高阶段,研究方向主要是以组合算法为主。总之,很幸运能够得到姚院士的指导,这段时光注定将成为我人生中最重要的阶段之一,我会用心努力做好每一天。
记者:除了编程竞赛,你之前还参加过很多数学方面的竞赛。有些人认为编程与数学没有太大的关系,你怎么看?
楼天城:可能是我们所遇到的问题不太一样吧。我遇到的问题多侧重于核心部分,往往比较抽象,对效率要求也很高,要解决它们,必须有深厚的数学基础,从这个方面来说对数学要求还是非常高的。
记者:你怎样看待编程竞赛?对有志于投身编程竞赛的人有何建议?
楼天城:编程竞赛是一个“公平、刺激、酷”的脑力游戏,除了能获得乐趣之外,还能很好地锻炼自己的思维,磨炼坚韧随和的性格。参加了多次竞赛,我真实地体会到它的残酷性。编程竞赛是顶尖高手之间全方位素质的较量,即使一时的状态不佳,也会让你与冠军失之交臂,最终换来的将是几年的漫长等待。但也相当刺激、公平。这也是我喜欢它的主要原因。我感觉自己很幸运,能够接触到这些编程竞赛。这种比赛形式,完全符合我的思维方式。在这十多年来,无论在思维的培养还是对性格的磨炼上,它对我都起了很大的作用。
至于建议,像我们这些靠理性思维来解决问题的人,平时过于依赖自己的计算能力,不相信定式、经验之类的东西。而实际情况却是,有一些凭借经验才能做到的事情,我们做得不够好,只是想当然地以为计算等于一切,结果却与目标相差很远。所以有很多非智力因素也需要去掌握。否则,你可能会因此而落后于他人。这算是我的一个建议。
另一个建议就是不要把参加竞赛当作上大学的一个途径。竞赛可以帮助你提高自学能力和综合素质,锻炼思维能力,也可以帮助你提高其他科目,但平时一定要注意协调好竞赛与其他科目之间的关系,不要把其他科目落下,不要让竞赛成为影响正业的事情。
(本文来自《程序员》杂志04期,更多精彩内容敬请关注04期杂志)