改善我们编写代码的方式?

22

在思考软件工程时,我遇到了一个问题:为什么我们在编写/记录代码的方式方面没有看到任何改进。

想一想:自从我们从穿孔卡片转向文本编辑以来,就没有出现过革命性的改进。我所看到的最后一个改进是语法高亮和上下文敏感帮助(例如Intellisense或ctags)。这并不是我会称之为革命性的东西。

这让我想知道:为什么会这样呢?

我将以我急需的一些内容开始:

  • 我的很多代码都涉及几何。对于描述几何关系的文档,由于ASCII中缺乏适当的方程排版,最终总是变成一堆难以阅读的数学内容。然而,如果我能够将一张小草图或涂鸦嵌入到代码中,一切都会更容易、更整洁、更易于理解。

你能想出什么能让你的编码/文本编辑/文档编写任务更轻松的方法吗?


1
我记得好像在其他地方讨论过代码中的图像。我记得发过一个帖子,关于一个允许使用图像的HC11汇编器。 - Michael Myers
2
啊,实际上是在第55期播客中提到的:http://blog.stackoverflow.com/2009/05/podcast-55/。 - Michael Myers
这正是我所需要的...现在我可以画简笔画来记录我的应用程序。 :) - Robert Harvey
我认为这可能算得上是一个开放式讨论问题。 - Mark Rogers
我曾看到BizTalk开发人员画图而不是编写代码行,还有其他的工作流编辑器。这不是一样的吗? - Chris Simpson
显示剩余4条评论
35个回答

30
我很惊讶,竟然没有人提到没有银弹。在1986年,Frederick Brooks预测道:
“没有任何单一的技术或管理技巧能够在十年内保证生产力、可靠性和简单性方面有一个数量级(十倍)的提升。……我们不能指望每两年就能获得两倍的增长。”
23年过去了,他的预言被证明是正确的。我们已经发明了许多东西,比如语法高亮和Intellisense,这些东西显著提高了生产力,但肯定不是一个数量级的提升。随着时间的推移,我们将继续进行一些渐进式的改进,但事实是:没有银弹,我们不会有某种神奇的启示来改善我们编写代码的生产力。

很好的评论,Adam。感谢您发布这篇文章。 - Nils Pipenbrinck
如果人们真正学习他们使用的编程语言,并学会如何编写代码,而不是依赖于Intellisense等工具,那么生产力将会大幅提高。 - Peter Boughton
哦,你说得对,我把8看成了6!现在已经修复了。在我之前的评论中,将s/43/23/。 - Adam Rosenfield
3
观看Subtext IDE视频,告诉我你是否仍然喜欢if、elseif、else语句-- http://www.subtextual.org/subtext2.html - Robin Rodricks
Jeremy,我希望每个IDE都能够使用这种表格的确切形式来可视化我的代码...当我点击“可视化逻辑”菜单项时!但是我不理解他:他给出的例子很基础,而且在他第一个例子中,他所做的更改我一开始就有正确的代码。他是对的,符号很重要,但我不认为这是巨大的进步。 - Robert K
显示剩余6条评论

15

我很惊讶没有人提到唐纳德·克努斯(Donald Knuth)的开创性文学编程 - 将您的代码写成一本书或科学论文。


13

自从我们从穿孔卡片转移到文本编辑以来,就没有革命性的改进了。

你从未使用过行编辑器吗?


但是,认真地说,文本(特别是现代语言选择的表示形式)具有以下特点:

  1. 易于处理
  2. 相当容易指定
  3. 信息密集
  4. 精确

任何要取代它的东西都必须在这四个属性上实现净胜利。不容易。


@Nils:现在我感觉自己像个真正的笨蛋。谢谢。我只写过几千行代码,而且已经多年没有用过行编辑器了,但我猜对于那些经历过这个转变的人来说,从行到屏幕编辑器的转变是很大的。 - dmckee --- ex-moderator kitten
我认为精度更多是一种编程语言特性。话虽如此,需要考虑在编译时会发生什么。许多不同的文本表示将由相同的机器代码序列表示。 - wkf
像Google Sketchup这样的绘图软件可以产生易于处理、精确、易于指定且信息密集的信息;突破在于建立了一个能够达到#2(并在某种程度上达到#1)的系统。我很希望能够对某些编程任务“外壳化”使用Sketchup。 - Alex Feinman
+1:兄弟说得对。在我的职业生涯中,视频编辑是生产力最大的飞跃。那些从未没有使用过它的人无法理解巨大的差异。40年来,“图形/GUI”开发工具和环境一直很糟糕,正如你所列举的原因,它们可能永远都会是这样。但它们看起来很好,市场营销也很棒,所以我们总是被迫接受它们。... :-( - RBarryYoung
我曾经使用过穿孔卡片、行编辑器、同步终端上的行编辑器、可视化编辑器和集成开发环境。我发现当我使用IDE时,当我做一些复杂的事情时,我总是想要vim和makefiles。 - David Thornley
显示剩余3条评论

11

我不同意。我们有改变,虽然很小。

"for each"语法结构有多常见?与20年前相比呢?领域特定语言运动怎么样?我们应该按层编码的想法如何?行为驱动开发呢?通过遵守规范编程...当所有事情正常运行时输出一份漂亮的文档。正则表达式的标准化PCRE如何?Alan Kay's group's关于"Moore's Law for Software"的DSL相关工作如何,他们探索了更高级的Cairo实现,并使用RFC中的图表生成TCP/IP代码?

文档是一种双向对话。既让代码更易懂,也让人们学习这种特殊的语言。如果你懂得德语,就不会说德语需要文档。我知道自然语言和计算机语言之间的距离很远,但是有一股力量在推动使代码更具表达力。这不是关于新工具,而是关于我们如何编码。


在我还没完全摆脱穿孔卡之前,人们就已经开始分层编码了。这些年来有一些好东西被添加进来,但没有什么特别出众的。至于按照规范进行编码,要么规范本身就是一种编程语言,要么将其转化为可执行代码是一种创造性的行为。更具表达力的编程语言有限的用途,否则我们仍然会使用Hypertalk进行黑客攻击。如果你想学好编程,学习一门人工和高度精确的语言只是你问题中最小的一部分。 - David Thornley

5

最近在我的应用程序的一些数学密集部分中,我做的一件事是将特定方程的LaTeX标记作为注释/文档字符串包含在内。目前,我只是复制粘贴到在线公式编辑器中,但看到公式本身(例如希腊字母和上下标等)而不是一堆ASCII码将非常有帮助。


4

在数据库中存储源代码。简而言之,源代码被解析并存储到数据库中。然后您需要一个集成的IDE来查看和编辑代码,但此时语法已与格式分离。您的IDE可以以完全不同于他人的方式显示程序,针对您正在处理的任务进行调整。我可以列举一些具体的例子,但是那篇文章几乎涵盖了所有内容。


1
我认为,只要编辑器够智能,基本的文本表示方式就可以被赋予灵活的呈现风格。这更需要编辑器和编译器共享解析器。不过,这样做会很好。 - dmckee --- ex-moderator kitten
我认为这可能归结于有多个文本字符串来表示底层的语法结构。文章提到了类似于“展示给我这段代码,就好像它是用嵌套的IF/ELSE而不是SWITCH/CASE编写的”。一个“足够聪明的文本编辑器”将会进行解析并在本地存储。将其存储在数据库中可以最大程度地减少工作量。 - wkf
3
一个好的点子,但也是一个非常不好的点子。现代集成开发环境(IDE)已经能够提供相同的功能,而且不会失去使用任意文本处理工具的灵活性和可访问性。 - Michael Borgwardt
我不明白为什么你不能将它作为文本存储在本地,进行处理并上传。你不会失去任何功能,只是能够在本地做更多的事情。最重要的是,你将获得能够搜索/操作数据库的所有好处。想象一下,能够以了解底层语法的方式挖掘巨大的代码库。看起来像是双赢。 - wkf
我很喜欢这个想法。实际上我一直在考虑一个像这样的系统,将测试编写规范和代码集成到一个数据库中。测试、规范和实现只是代码库的不同“视图”,许多样板代码可以从规范文档自动生成,测试用例也可以自动生成等等……你懂的。 - Anders Hansson
@MB - 小心,你的论点也可以用来反对版本控制!!“为什么我需要一个Subversion客户端,当我可以把我的文件放在按日期标记的目录中呢?” ;) - CurtainDog

4

我很惊讶没有人提到这一点——javadoc基本上就是HTML,所以你可以在代码中嵌入图像(或任何其他内容)。简单、有效和普及,这是Java做得对的事情之一。


3
我认为这就是 Doxygen 和其他文档系统发挥作用的地方。如果我们能够嵌入小的、离散的注释,这些注释可以链接到其他信息,例如:
/* help: fooimg.png */

如果有一个外部文档系统可以做到这一点,那就太好了。

更好的方法是让我们的文本编辑器将这些内容视为指向外部文档的超链接。


听起来不错-不确定Doxygen是否支持嵌入式图像,但如果不支持,您可能需要发布一个功能请求:http://www.stack.nl/~dimitri/doxygen/todo.html - none
我会看一下是否已经存在。如果不存在,可能会实现它,这将非常有用。 - Aiden Bell

3
DrScheme可以让你完成以下操作。以下是你可以从PLT网站插入的内容: http://docs.plt-scheme.org/drscheme/Menus.html#(part._.Insert) 3.1.6 插入
- 插入注释框:插入一个被DrScheme忽略的框,用于为阅读你的程序的人编写注释。 - 插入图片...:打开查找文件对话框,以选择GIF、BMP、XBM、XPM、PNG或JPG格式的图像文件。该图像将被视为一个值。 - 插入分数...:打开一个混合符号分数的对话框,并将给定的分数插入到当前编辑器中。 - 插入大字母...:打开一个文本行的对话框,并插入文本的大号版本(使用分号和空格)。 - 插入λ:将符号λ(作为Unicode字符)插入程序中。λ符号通常与lambda绑定相同。 - 插入Java注释框:插入一个被DrScheme忽略的框。与“插入注释框”菜单项不同,这个菜单项是为ProfessorJ语言级别设计的。请参见ProfessorJ。 - 插入Java交互框:插入一个框,允许在Scheme程序中使用Java表达式和语句。该框的结果是一个对应于Java表达式结果的Scheme值。此时,Scheme值无法进入该框。该框将接受每行一个Java语句或表达式。 - 插入XML框:插入一个XML;有关更多信息,请参见XML框和Scheme框。 - 插入Scheme框:插入一个包含Scheme代码的框,通常在XML框内使用;请参见XML框和Scheme框。 - 插入Scheme Splice框:插入一个包含Scheme代码的框,通常在XML框内使用;还请参见XML框和Scheme框。 - 插入Pict框:创建一个用于生成幻灯片图片的框。在pict框内,插入并排列产生图片值的Scheme框。
你还可以在测试代码中插入单元测试。非常棒的东西。

3

我认为具有语义高亮和受语义约束的建议(类似于IDEA或Eclipse)的集成IDE是一个巨大的进步。

但那是8-10年前的事了。

基于模板的编程感觉很有用,但似乎从未流行起来。最近我被元编程系统的演示所震撼,它利用IDE的交互性简化了编写模板和本质上是类型感知的宏的任务。

元编程可能会帮助您定义基于几何的宏,这些宏将替换多行代码。我可以想象一些东西,让您在Java中嵌入更易读的“数学语言”,然后将其解析为机器可读的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接