本文中几次提到了 Donald Knuth——高德纳(Donald Ervin Knuth,1938年 1 月 10 日-),出生于密尔沃基,美国著名计算机科学家,斯坦福大学计算机系荣誉退休教授。高德纳教授被誉为现代计算机科学的鼻祖,在计算机科学及数学领域发表了多部具广泛影响的论文和著作。
高德纳最为人知的事迹是,他是《计算机程序设计艺术》(The Art of Computer Programming)的作者。此书是计算机科学界最受高度敬重的参考书籍之一。他创造了算法分析的领域,在数个理论计算机科学的分支做出初步贡献,此外还是排版软件 TeX 和字型设计系统 Metafont 的发明人。
高德纳 Donald Ervin Knuth
“注意上面这段代码;我只是感觉它没问题,但没有试过。” – Donald Knuth
今天早上,在 Google 上搜索的时候,我偶然看到了一个帖子,作者声称:所有人都不该使用 C++ 标准库里的 make_heap 函数,因为,几乎没有人是在正确的使用它。我立即在心里大骂这是多么荒谬的断言,因为任何人只要上过基本的算法课程,都会知道如何正确的使用make_heap。然而,这让我开始思考,如何看待那些不知道堆(heap)为何物的程序员,更甚者,那些并不需要知道它为何物的程序员。
最终,我认定,这两种人,我们仍然应把他们称作程序员。
当我还是个毛头小伙的时候,很多我听到的关于如何正确的编程的建议其实都是非常错误的。经过这些年,我发现,大多数这样的这建议,其本身并没有问题,只是缺少相应的上下文环境。当今的这波创业浪潮给人们造成了一个有趣的印象,导致很多的程序员都开始相信“性能不是问题”,这个就是一种充满风险和牵涉微妙的上下文环境的建议,尤其是当面对会出现意想不到的相互影响的复杂架构时更是要警惕。这种缺乏上下文的耳耳相传的只言片语的流行是一个很普遍的问题,而事实上,它是一个更深层问题的简单表象。
程序员这个词涵盖了一个异常宽泛的技术谱系和层次。从纵坐标上讲,一个程序员,从能仅仅会用 vbscript,到能为因特尔 CPU 写编译器、为航空公司开发系统运算软件。从横坐标上讲,他可能是专长于数据库,或能从 CPU 指令级别调整性能,或能开发并行处理库,或制造物理过程引擎,或做图片处理,或创作 3D 模型,或写打印机驱动,或使用 coffeescript,HTML5,和 AJAX 来开发网站应用,或使用 nginx 和 PHP 开发 LAMP 架构 web 应用,或他能编写网络应用库或能做人工智能科研。他们都是程序员。
这太荒唐了。
我们的世界正在被软件吞噬。在将来,编程将会和数学和语文一样成为基础课程。我们将会有四个R——Reading (阅读), ‘Riting, ‘Rithematic (数学), 和 Recursion (递归算法)。到时,如果再说某某人是一个程序员将会是一句废话,因为超过 10% 的人口将会具有一定水平的编程能力。“程序员”这个词涵盖了如此多的内容,如果你称自己为程序员,就好象称自己为“科学家”而不是“物理科学家”。我们能有其他称呼吗?有人试图做了这方面的尝试,指出一个程序员和一个计算机科学家直接的不同之处,但说的毫无价值,根本无法区分我和一个从大学毕业的人工智能博士生之间的区别。他懂得多维数学分析,用函数式语言计算,这些是我不通过数年的研究是无法理解的。而我能够写出速度超快的,灵巧的 C++ 或 HLSL 汇编程序,能变戏法似的处理和变换矩阵,在屏幕上绘出漂亮的图像。我说的这两种情况都是出于完全不同的原因下的极其复杂的工作,他不能完成我的,我不能完成他的。一种操作对一个人很熟练,对另外一个人却是困难的。但我们都是程序员。只是在我们各自的领域里的程序员,我们是图像计算程序员或人工智能程序员或[xxx]程序员。
你知道我们为什么会有这样毫无目标的语言论战和毫无意义的关于哪一种语言更好用的争论吗?你知道为什么人们——除非在自己的小圈子里当“XX 方法”对所有人表示同一个意思的时候——永远不能在这些问题是达成共识的原因吗?因为我们赋予了自己过多的内容。我们把自己看成了由数个程序员组成——每个都专长于某项东西,我们错误的认为我们的观点能够适用于我们的专长之外的领域。我们是工业工程师却试图想告诉化学家如何进行他们的试验。我们是建筑师却试图想告诉英语专业的学生如何创作一篇论文——只是因为我们都用了大量的纸张。
这种态度深深的根植于计算机科技界的核心深处。计算机科学的主要目的是用一些基本数据结构来帮人们完成以前需要人做的所有事情。如果你认为这完全是编程的事,那你就错了,这是不可能的。我们忘了,这些数据结构只是我们在神奇的数据计算领域需要的,我们忽略了,对于不同的实现,需要对完全不同领域的编程,针对的是完全不同的用户。Donald Knuth 深知理论和实现之间的不同之处——我们需要认真的理解这些关于理论和特定实现的忠告之间的区别。
如今,你已经不能因为一个人是程序员,你就可以随意让他开发任何东西。说一个程序员在开发软件,就好像是说一个科学家在做科学研究。不同之处是,植物学科学家是不会去设计核反应堆的。
原文:http://www.aqee.net/programmer-is-an-overgeneralization/
【编辑推荐】