竞争编程与实际编程的不同

jopen 10年前

        英文原文:Competitive Programming: How is competitive programming different from real-life programming?

        你在丛林里,有一把小刀,有人要求你去杀掉一只美洲狮。任何人都会问“美洲狮在丛林里到底在做什么?!”,除了程序员。不过,这不是你被训练为程序员要去做的事情。你在这里要解决问题,而不是对问题提出质疑。

        数年的训练已经教会你了很多,你用小刀削尖木棍,砍断藤条来甩动一端的尖锐石头。或许你来自于一流大学,你已经学会了从周围植物和昆虫体内榨取必要成分,以增加武器的毒性。

        你坚信,你有一种杀掉狮子的、有效的、有能力的方法,你开始为了完成任务而努力。或许你的木棍太短,或者你的毒液不起作用。没关系,你能够活着改善方法,并在明天再次试验。

        随后有人找到了一种方法,收集丛林里的化学东西制作了轻度爆炸物。你的精加工梭镖的方法对于完成任务,远远不是最好的方法了。然而,它仍然是简单的方法,并继续在学校里教。每个猎狮人都要被教会如何从头建造他的工具。

        这是“现实中”的编程。

        在竞争编程中,你从同样的资源(小刀)开始,期望你用两分钟杀死狮子。

        作为初学者,你会盯着狮子,什么也没做。

        很快,你就明白,如果你杀了一只松鼠,说不定裁判认为它是狮子,就这么干吧。

        一名更有经验的程序员,只是坚持刺狮子,希望狮子及时死掉。很快,你知道狮子身上有一些破坏免疫的固定部位,你知道甚至刺这些部位根本不用费力。有时候,狮子没有暴露这些部位,因此你真正擅长的是杀死松鼠。

        那么,为了成为伟大的、有竞争力的程序员,你需要能够做两件事。

        首先,你必须学会如何找到狮子的致命弱点并一击毙命。

        其次,你必须学会如何让你的小刀更方便,你要在一分钟内做一个尖木棍,用剩下的一分钟把狮子刺死。

        但是,你从来没有足够时间去制作炸药来对付狮子。

        ————

        Balajiganapathi Senthilnathan 的观点

        它们就像和 Python 和 Brainfuck 语言【注1】的不同。

        在竞争编程中,你不得不选择首先想到的、你认为可行的算法进行编码。编程的目标只是搞定它,并最少出错。你不必担心维护文档等等。没必要考虑如何命名变量、切割代码为函数等等。还有,竞争编程是短暂的,你将不必在一个问题上花上几天时间。你大部分时间是在编码。

        虽然,竞争编程让你对算法以及如何实现有了重要的理解,你在大部分工作中将发现,程序员只是在使用算法方面的类库。因此,竞争编程最有用的地方 就是,对于手头的问题,使用哪种算法。在工作场所,你花在写代码的时间只有很少一块,大部分时间花在了决定去编码、测试、文档和……

竞争编程与实际编程的不同

        注1:Brainfuck,是一种极小化的计算机语言,它是由 Urban Müller 在 1993 年创建的。由于 fuck 在英语中是脏话,这种语言有时被称为 brainf*ck 或 brainf***,甚至被简称为 BF。http://zh.wikipedia.org/wiki/Brainfuck