当前位置:C++技术网 > 资讯 > 编程最重要的是是什么?图灵奖得主给你解释

编程最重要的是是什么?图灵奖得主给你解释

更新时间:2015-12-03 18:20:28浏览次数:1+次

    “怎样才能保证编码少出错?”“你怎么看待计算机科学和数学之间的关系?”“你提出过很多计算机理论,哪个是最钟爱的‘孩子’?”……近日,北京大学斯坦福中心,在莱斯利·兰伯特(Leslie Lamport)的报告结束后,学生们的问题接踵而至。在近1个小时的时间里,他接受了学生们的“考问”。

    台上的兰伯特身着一件浅蓝色条纹衬衫、一条深蓝色牛仔裤、一双黑色运动鞋。像着装一样,他的话语简洁中透着随性。在回答感兴趣的问题时,他的语速并不快,引经据典,侃侃而谈,让现场充满笑声和掌声。尽管浓密的花白胡须隐藏了他的面部表情,但在思考问题时鼻梁上金边眼镜后的目光却总喜欢凝视着空间中的某一点,让人不免产生一丝神秘感和距离感。当然对于不感兴趣的问题,他也不敷衍,只是简单一句:“不了解。”

    兰伯特现任美国微软研究院首席研究员,也是2013年有着“计算机界诺贝尔奖”之称的图灵奖获得者。此次他经北京大学“大学堂”顶尖学者讲学计划的邀请,与该校师生开展了交流,而此次交流的核心则是:思考,比写代码更加重要。

编码也须锻炼“肌肉”

    如何才能写出更优质的程序呢?这是记者和很多现场学生关心的一个话题。“工程师在砌砖建房之前会画一张建筑蓝图;但程序员和软件工程师往往不会这样做。这是不是房屋很难倒塌而编程经常出问题的原因呢?”报告结束后,在接受《中国科学报》记者采访时,兰伯特对比说,很多程序员在开始编写程序之前,往往不愿意勾勒哪怕是一个最简易的程序轮廓。

    蓝图可以帮助工程师保证计划发挥作用。“‘发挥作用’不只意味着让大楼不倒塌,还意味着为所需要的目的服务,比如让建筑师和客户在施工之前了解他们打算建造什么样的工程。”兰伯特如是说,“蓝图可以帮助我们考虑清楚,我们在编写什么。”

    为编写软件所描绘的蓝图就是规范(spec)。然而,“计划赶不上变化,就像没有哪一场战争真正能够按计划进行一样,你做出的规范也有可能发生程式错误。”兰伯特说。比如,或者是必要条件发生了改变,或者是出现了错误,可能在你写完程序之前,就需要改变原来的规范。

    事实上,在真实世界中,代码可以修补,而规范也可以更新,这些都很普遍。那么,如果修补和更新不可避免,那么为什么要描绘这张蓝图呢?对此,兰伯特表示原因有二:其一,无论是谁在修补代码,都会由衷感谢规范中的每个词、每个公式的作者;其二,代码每修复一次,就会“变丑一点,更难理解一点,也更难维护”。“因此,如果不从思考规范开始,那么程序员所写的代码的每个片段就都是补丁。这样就会让一开始编写的程序变得丑陋、难以理解和维持下去。”兰伯特说。

    “为什么编码难?因为编码需要思考,思考存在难度,而很多人往往低估了思考的难度。”他说,“正如漫画家迪克·金敦(Dick Guindon)所说的那样,‘写作是让你知道你的思想有多么混乱的根本方法。’”

     “思考不能保证你不犯错误,但是不思考通常一定会犯错误。”没有什么简单的方法可以保证一个人能够写出好的spec,兰伯特说。“编码就像跑步,你跑得越少,跑得也就越慢。所以必须经常反复锻炼你的编码‘肌肉’,而不是像很多人那样找借口不锻炼。”

数学让编程事半功倍

    “能和这样的‘大牛’交流非常激动。”北京大学信息科学技术学院智能科学系大四学生金晓晗在接受《中国科学报》记者采访时说,“兰伯特教授说,数学可以帮助我们分析,简化我们的思维,给我留下了深刻的印象。”

    在兰伯特看来,编写spec并不能保证人们编写的代码永远不会坍塌,所以仍然需要利用一些方法和手段消除编程过程中的错误。在他看来,理解编码复杂性的最好方法就是抽象化,而最简练、精确的抽象化语言就是数学,即那些在基础数学课堂上所学到的数学课程,如集合、函数和简单的逻辑。“它可以帮助我们提高编写能力,理解正在做的事情,消灭错误。”兰伯特补充说。

    “在数学和计算机的关系上,兰伯特认为数学无疑是计算机科学的基础。”兰伯特的回答给北京大学信息科学技术学院的刘垚留下了深刻印象,“思考比写代码更加重要。而数学对于我们严谨、有效地思考问题非常有帮助。”尽管如此,兰伯特也表示,数学很难直接成为人们解决问题的方法。它更多地是帮助分析问题,或是评估提出的解决方案。

    “在你提出检验编码的模型之后,数学能够帮助你检查模型是否正确,这正是为什么我提出了TLA+(一种可以帮助程序员进行模型检测的新的计算机编程语言)。”兰伯特举例说。亚马逊公司和英特尔公司的很多程序员发现,TLA+检测模型可以提高他们的排错效率。“处理硬件错误时,成本往往很昂贵,因为如果出现问题就要重新生产所有的芯片,而检测模型可以帮助他们发现错误,大幅降低成本。”

   “借助数学的思考方式来关注问题的核心,从而看到问题背后的深层原因,再去寻找解决方案。作为数学专业的‘码农’,我对此体会尤为深刻。”北京大学数学院学生李屹对此次交流深有所感,“数学之于计算机,不仅是一种工具或者方法,而是一种哲学。以数学的思想作为指导,有时即便不掌握具体的数学工具,都可以使得编程工作事半功倍。”

大学教育要立足长远

    “兰伯特讲到的‘多思考,少编程’对我启发莫大。”“他讲的要学会抽象对我们掌握正确的科研态度非常重要。”“通过兰伯特的介绍,我认识到如果把TLA+语言投入到本科或更早的教学中,将会使更多人受益于数学精练、严谨的逻辑锻炼,节约很多时间,因为未来普通的编程工作注定要被机器代替。”……和金晓晗一样,在此次采访中,很多学生都表示与这位计算机学界“大牛”进行的交流让他们受益匪浅。

    在计算机领域,兰伯特确实是位名副其实的传奇人物。他的分布式计算理论奠定了这门学科的基础,并被称为“分布式计算原理之父”;他在1978年发表的论文《分布式系统内的时间、时钟事件顺序》成为计算机科学史上被引用最多的文献;他为“并发系统的规范与验证”研究贡献了核心原理……

    为此,美国计算机协会将2013年度图灵奖颁发给了他。“如果你喜欢使用互联网,那么就该感谢莱斯利。”施乐帕洛阿尔托研究中心创始人兼经理、数字设备公司系统研究中心创始人兼经理鲍勃·泰勒(Bob Taylor)曾如是评价,“因为互联网建立在分布式系统技术的基础知识之上,而后者又建立在莱斯利所发明的理论基础之上。”

    对于自己的研究成果,兰伯特表示,我希望它们都能发挥作用,“因为个人对美有着不同的理解,所以人们究竟会更喜欢哪个理论也是‘仁者见仁、智者见智’”。在提及成功的秘诀时,他认为,每个人的研究道路都会因人而异,由于现在的计算机科学环境已经和他开始起步的时代发生了天翻地覆的变化,他的经验可能并不适用于每一个人。

   如果一个人“最终想要成为自己想成为的人,就要做自己最严格的裁判”。他指出:“同时,不要忽视你的批评者,不要因为观点相左就认为批评者‘太愚蠢’,他们会推动你不断进步。”

   在他看来,现在很多教师和学校希望按照他们所想象的那样教导学生,然而这些想法可能对学生不一定适用。“比如,现在经常通过就业率判定学校是否成功,而大学不应该把让学生就业作为办学目的。”他说,以编程为例,编写“种子”编码很重要,尽管它可能不会马上产生作用,但可能在10年、15年之后产生更重要的应用。“教育目标也应该思考得更长久、更远大一点。”


转载于《中国科学报》 (2015-12-03 第3版 国际)