JustinMeiners译者
王艳妮,责编
屠敏以下为译文:程序员喜欢讨论编程语言。除了辩论它们各自的优点外,我们还喜欢将它们整合到我们的身份认知中,甚至通过某人使用的语言来推断这是一个怎样的人。有些人甚至用语言决定论的一种形式争辩,认为思维受限于可被分类的东西的。由于我们花了很多时间来使用语言,因此想要使它们变得更好的想法是合理的。然而,这些辩论的特点表明我们认为它们代表着更多的东西。也许我们忘记了语言本身最主要的作用。编程语言是实现工具,而不是思考工具。它们是严格的正式的语言,以人性化的方式来给机器下指令。相反,思想最好通过一种自由而灵活的媒介来表达。用数学思考数千年来,被高效地用于计算方面思考的自然语言就是数学。大多数人并不认为数学是自由的或灵活的。他们在学校看到可怕的符号和对解题步骤生硬记忆的经历与自由和灵活的数学精神恰恰相反。我希望本文的读者在数学方面有更好的经历,比如在离散数学或线性代数课程中;那种涉及构建清晰的定义和演绎,并用符号写成散文(推理步骤)的经历(大多数符号甚至直到16世纪才被发明)。数学允许你推理逻辑结构,而不受其他约束的影响。这也是编程所需要的:创建逻辑系统来解决问题。我们来看一下编程的基本模式:找出问题所在设计算法和数据结构来解决它实现和测试在实践中,工作往往组织得不是那么好,因为步骤之间存在相互作用。你可以编写代码来通知别人设计方面的问题。可即便如此,上面这个基本模式也一遍又一遍地在实践中重现。请注意,步骤1和2是占用我们大部分时间,能力和精力的步骤。同时,这些步骤并不适合编程语言。这并不能阻止程序员尝试在他们的编辑器中解决它们,但他们最终会得到一些混乱,缓慢或解决了错的问题的代码。并不是编程语言还不够好。没有哪一种正式语言在这方面擅长。我们的大脑就不是那么思考问题的。当问题变得困难时,我们绘制图表并与同事们讨论。理想情况下,首先解决步骤1和2,然后才使用编程语言来解决步骤3。这在转换实现过程中有额外的好处。有了数学解决方案,你就可以专注于选择最佳的表示和实现方式,编写更好的代码,了解最终目标将是什么。实现问题为什么编程语言作为思维工具是繁琐的?一个原因是编写代码与实现密不可分。实现问题对于给计算机下指令是必要的,并且值得做好,但它们也分散了在要解决的问题方面的注意力。想想如果要编写一个简单的函数,所有的注意事项:我应该提供什么输入?它们应该被命名为什么?它们应该是什么类型的?(即使动态类型语言也必须考虑类型,它是隐含的而已。)我应该通过值还是通过引用来传递它们?我应该把这个函数放在什么文件中?结果是否应该重复使用,或者它是否足够快以便每次重新计算?这个列表还可以继续下去。关键是这些考虑因素与函数的作用无关。它们会分散人们对该函数试图解决的问题本身的注意力。许多语言旨在隐藏诸如此类的细节,这对于普通的日常任务尤其有用。但是,它们无法超越其作为实现工具的角色。SQL很容易被认为是这方面最成功的例子之一,但它最终