C++之父Bjarne Stroustrup:程序员在数学上付出的努力(2)
Evrone:在过去十年中,我们看到许多语法糖(对语言的编译结果和功能没有实际影响、却能更方便程序员使用该语言的语法)被添加到主流语言中。似乎通过“臃肿的语法”为开发人员提供更好的工具已成为一种趋势,您对此如何看待?
Bjarne:只要能减轻程序员的负担,即便是“臃肿的语法”也无伤大雅,我更愿称之为“让简单的任务变得更简单”。我认为,关键思想是让程序员能直接在代码中表达基本思想。例如,用C语言风格的循环来表达容器上的简单循环没有任何优点或好处,最好使用range-for或算法。在大多数情况下,这些方法都能直接表达意图,只有在特殊情况下才需要考虑复杂的循环变量,例如在访问容器的元素时,不是挨个访问,而是隔一个访问一个。想法越直接,编写、阅读和维护代码就越容易,并且通常优化也越简单。
因此,我不认为“应该只有一种表达方式”是一种理想的做法,这种思想会导致有些情况很难表达,而有些情况确实需要大费周折才能表达出来。此外,经过长年累月的优化,语言本身也会发生变化。从这些角度来看,编程语言与自然语言并没有什么不同。
开发人员该如何突破困境?
Evrone:如今人们普遍认为,使用现代框架比应用数学知识更重要,您能在这方面给程序员一些建议吗?
Bjarne:程序员在数学上付出的努力永远也不会白费。数学是训练我们大脑的最佳方法之一,尤其是与计算相结合时,我们很快就会意识到自己的错误;数学也教会了我们一丝不苟,不要轻信过于简单或错误的想法。
在很多领域中,数学知识都是必不可少的,例如科学计算、某些图形形式和许多金融软件。但对大多数人来说,数学的关键领域是概率和统计:你的代码速度够快吗?能扩展吗?某些事件的发生概率是多大?影响是什么?
当然,也有许多应用程序不需要数学,但在构建基础设施或大规模部署应用程序时,容量和能耗的成本不容忽视,此时数学知识的不足就可能会带来危害。
Evrone:有时作为开发人员,面对手头的编程任务,我们总是找不到合适的解决方案。您有没有遇到过类似情况,可否分享一些处理这类困境的建议?
Bjarne:当然遇到过。在面对新奇或重大难题时,每个人都需要付出巨大的努力,可能几小时、几天甚至更长时间,我们可能还会陷入困境,感到无助和沮丧。
这个时候,我们需要从逻辑层面来看问题。仔细想想你的目标是什么,或许是因为你努力的方向不正确,或许是因为你提出的要求不合理。也可以偶尔休息一下,想想别的事情,我一般会去跑步。放松下来以后,脑海中就会浮现一些有用的想法。
Evrone:业务环境时常要求我们在实现新功能时严格遵守最后期限。在您看来,开发人员要如何在代码质量和开发速度之间保持平衡?
Bjarne:这很大程度上依赖于管理结构和技术文化。我的个人意见(主要基于贝尔实验室的工作经历)是,如果你的组织内人才济济,就不必要求所有人都为下一个截止日期而努力。你需要一些关键人物为未来做策划、开展实验、构建下一个重要系统的第一个版本及后续版本。我认为,一个好的组织需要构建稳定的产品线,其中绝大部分都应在已部署并进入维护阶段的产品上进行革命性变更。不过显然,这种做法与常见的削减成本和发布颠覆性系统的思想背道而驰。
Evrone:许多人将您视为自己的导师,那么在您看来,一位优秀的导师应具备哪些品质?
Bjarne:愿意倾听并认真理解问题。在提供建议时要保持一定的谦虚,因为一般情况下,我们的理解都是不完整的。除此之外,优秀的导师必须给出具体建议,而不是一通模棱两可的废话。如果有人认真向你请教问题,你就应该给出严肃的答案助其进步。但老实说,提供建议也是一件很难的事。
不过教学相长,这也是我们进步的主要动力,一位优秀的导师会从学生身上学到很多东西。
预告C++的未来发展
Evrone:您能透漏一下在C++未来的版本中会出现哪些变化吗?
Bjarne:首先,社区必须适应C++20全新、强大并简化的特性,它在C++11的基础之上推出了很多提升。C++ 20有很多语言特性,还有标准库组件之类的,但在这里,我只介绍其中两个语言特性。
模块:我们可以认为,import Mod可以访问由module Mod导出(exported)的接口。这种方式更加整洁,与之相比,#include则会泄漏实现细节和宏。此外,模块的编译速度也得到了大幅提升。例如,简单编译一段import std代码的速度比#import快十倍(注意:std包含所有标准库,而eam>不到其10%)。std模块目前仍处于试验阶段,但经投票已被纳入C++23。
文章来源:《应用数学》 网址: http://www.yysxzzs.cn/zonghexinwen/2022/0422/1564.html
上一篇:青未了/我的数学老师
下一篇:“文科生不配看时间?”中科大时钟布满数学公