22

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

想一想:自从我们从打孔卡转向文本编辑以来,并没有发生革命性的改进。我看到的最后一个改进是语法高亮和上下文相关帮助(例如 Intellisense 或 ctags)。不是我称之为革命性的东西。

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

我将从我非常想念的东西开始:

  • 我的很多代码都涉及几何。对于描述几何关系的文档,总是以一大堆难以阅读的数学内容告终(由于 ASCII 中缺乏适当的方程式排版设置)。但是,如果我可以在代码中嵌入一点绘图或涂鸦,一切都会变得更容易、更整洁、更易于理解。

你能想到什么让你的编码/文本编辑/文档任务更容易?

4

35 回答 35

30

我很惊讶没有人提到No Silver Bullet。1986 年(!),弗雷德里克·布鲁克斯(Frederick Brooks)预测:

无论是技术还是管理技术,都没有任何单一的发展可以保证在十年内在生产力、可靠性和简单性方面提高一个数量级[十倍]。[...] 我们不能期望每两年看到两倍的收益。”

23 年来,他被证明是正确的。我们提出了许多东西,例如语法高亮和智能感知,它们显着提高了生产力,但肯定不是一个数量级。随着时间的推移,我们将继续进行一些渐进式的改进,但事实是没有灵丹妙药:我们编写代码的方式不会有什么神奇的启示,可以将生产力提高一个数量级。

于 2009-06-12T16:03:06.567 回答
15

令我惊讶的是,似乎没有人提到 Donald Knuth 的开创性文学编程- 编写您的代码,就好像它是一本书或一篇科学论文一样。

于 2009-06-12T15:42:43.493 回答
13

自从我们从打孔卡转向文本编辑以来,并没有发生革命性的改进

从来没有使用过行编辑器,是吗?


但严肃地说,文本(尤其是为现代语言选择的表示形式)是

  1. 容易加工
  2. 相当容易指定
  3. 信息密集
  4. 精确的

任何取代它的东西都必须是所有这四个属性的净赢。不容易。

于 2009-06-12T15:21:48.443 回答
11

我不同意。我们确实有变化,很小,但变化很大。

“for each”结构有多常见?与20年前相比。领域特定语言运动怎么样?我们应该分层编码的想法怎么样?行为驱动开发怎么样?通过遵守规范进行编码......当一切正常时,它会编写一个很好的文档作为输出。正则表达式的标准化如何?聚合酶链反应Alan Kay 小组关于“软件摩尔定律”的 DSL 相关工作怎么样,它探索了更高级的 Cairo 实现并使用来自 RFC 的图表生成 TCP/IP 代码?

文档是一个双向对话。既是代码更易于理解,又是人们学习这种特殊语言。如果你懂德语,你就不会说德语需要文件。我知道自然语言与计算机语言相去甚远,但有一种运动可以使代码更具表现力。这不是关于新工具,而是关于我们如何编码。

于 2009-06-12T15:21:05.450 回答
5

我最近在我的应用程序的一些数学较多的部分中所做的一件事是将特定方程的 LaTeX 标记包含为注释/文档字符串。现在,我只是复制粘贴到一个在线公式编辑器中,但是查看公式本身(带有希腊字母和子/上标之类的东西)而不是一堆 ASCII 代码会很有帮助。

于 2009-06-12T15:55:20.483 回答
4

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

于 2009-06-12T15:25:52.257 回答
4

我很惊讶没有人提到它——javadoc 基本上是 HTML,所以没有什么能阻止你在代码中嵌入图像(或其他任何东西)。简单、有效且无处不在,这是 Java 做对的事情之一。

于 2009-06-12T18:44:12.873 回答
3

我想说版本控制是我们工作方式的一个巨大飞跃。能够完整记录任何人对代码库所做的每一次更改,并在必要时恢复更改,这已经产生了很大的不同。

于 2009-06-13T12:13:33.410 回答
3

I certainly respect Fred Brooks' argument No Silver Bullet, but I think the way we write code is nowhere near optimal, so there is lots more room for improvement. I tried to explain this in my book.

We're all familiar with "code golf", where you compete relentlessly to minimize something. That is a good way to approach the minimum possible value of that something.

What's great about this is that you are allowed, even encouraged, to break from traditions, prior conceptions, accepted wisdom, in the quest for winning. In short, you learn new things.

If the measure to be minimized is wall-clock execution time, you can do aggressive optimization.

If the measure is source code size (lines or characters) you get "code golf".

The measure I like best is "edit count". That is, given a code base, suppose a new requirement comes along. That requirement is implemented, completely, by editing the code base. Then a "diff" is done from old to new code base. The number of differences found is the edit count. Averaged over the set of likely new functional requirements, that is the measure to minimize.

If this is done aggressively, being free to contradict all conventional wisdom, the code base approaches a state I would call a domain-specific language (DSL). In this language, concepts expressed in code are in nearly 1-1 correspondence with problem-oriented concepts. In this state, it is not easy for the source code to be self-inconsistent (i.e. have bugs) because the fewer edits that have to be made to the source code, the fewer chances there are to make a mistake. It's also the case that such code tends to be short. But unlike "code golf" it tends to be very clear, because it maps the problem concepts so clearly.

So, tools and techniques that help in minimizing edit count can, in my opinion, be considered "silver bullets". DSL is one such. Code generation is another. My favorite optimization technique is another. For coding dynamically changing UIs there is differential execution. There are bound to be more, waiting to be discovered. Of course, everything depends on the training and experience of the "marksman" (the coder).

I think there are lots of new ideas to be discovered. The trick is to tell the difference between the ones that move us forward, versus the ones that hold us back.

于 2009-06-17T18:04:20.700 回答
3

我认为具有语义突出显示和**语义约束建议*(a la IDEA 或 Eclipse)的集成 IDE是一个巨大的进步。

但这发生在 8 到 10 年前。

基于模板的编程感觉很有用,似乎从来没有流行起来。最近,我对元编程系统的演示印象深刻,它利用 IDE 的交互特性来简化编写模板的任务以及什么是(本质上)类型感知的宏。

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

于 2009-06-12T15:35:44.917 回答
3

我认为这就是Doxygen和其他文档系统提供帮助的地方。如果我们可以嵌入小的、离散的评论,这些评论链接到其他信息,例如:

/* help: fooimg.png */

然后让一个外部文档系统来做这件事,那就太好了。

更好的是允许我们的文本编辑器将这些内容视为外部文档的超链接。

于 2009-06-12T15:16:01.373 回答
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 忽略的框。与插入评论框菜单项不同,它是为 ProfJ 语言级别设计的。见J教授。
  • 插入 Java 交互框:插入一个允许在 Scheme 程序中使用 Java 表达式和语句的框。该框的结果是与 Java 表达式的结果相对应的 Scheme 值。此时,Scheme 值无法进入该框。该框将接受每行一个 Java 语句或表达式。
  • 插入 XML 框:插入一个 XML;有关详细信息,请参阅 XML 框和方案框。
  • 插入方案框:插入一个包含方案代码的框,通常在 XML 框内使用;请参阅 XML 框和方案框。
  • Insert Scheme Splice Box:插入一个包含 Scheme 代码的框,通常在 XML 框内使用;另请参阅 XML 框和方案框。
  • 插入图片框:创建一个用于生成幻灯片图片的框。在图片框内,插入并排列产生图片值的方案框。

您还可以使用您正在测试的代码插入单元测试。很整洁的东西。

于 2009-06-12T15:19:09.107 回答
2

我看到的最后一个改进是语法高亮和上下文相关帮助

那你看的不多。现代 IDE 可以做的远不止这些,即向您展示代码的语义结构(例如继承层次结构)甚至操纵它(自动重构)或使用外部数据丰富它(例如谁最后更改了特定的代码行) .

于 2009-06-12T15:42:30.780 回答
2

听起来您可能对Jonathan Edward 的研究感兴趣。参见,例如:

于 2009-06-12T15:38:14.503 回答
2

比较和搜索图片很困难。差异和搜索对程序员来说非常重要。在许多情况下,使用图片代替文字只是微小的改进,它有一些缺点,并且在它真正值得做之前需要普遍接受(因为如果你的读者不理解你所拥有的东西,你就不会让事情变得更容易理解完毕)。

此外,基于代码的文本表示,程序员有一百万个让他们的生活更轻松的小技巧,如果你给他们阅读以文本以外的任何形式表达的代码,他们就会失去这些小技巧。当然,他们可能会随着时间的推移替换或重新实施这些技巧,但在短期内它们已经消失了。

您也不会看到律师在合同中从英文切换到小餐巾纸图(知识共享许可尝试,但不能使图片成为合同的正式表示)。可能出于类似的原因。

如果有人提出了一种编程语言和 IDE,总的来说,它胜过基于文本的语言;并成功推向市场;然后您将看到从文本到新格式的革命性转变的开始。如果没有人想出任何这样的事情,那么我们就不会错过。如果有人提出了一些更有生产力的东西,但由于其他技术的独立优势而没有获得牵引力,那么这种损失就是我们为自由市场资本主义付出的代价。也许这些想法最终会被回收......

也就是说,代码和文档之间的集成显然可以得到改进,并且正在进行许多努力,使用各种技术并取得不同程度的成功。同样,问题是任何特定的狡猾计划实际上一次只能在一种或几种语言和开发环境中真正实现,因此很难证明它确实更好。将文档嵌入代码可能是自 API 发明以来唯一的普遍进步......

不过,我认为仍然可以用文本完成很多工作。例如,调试器技术在某些常见情况下对程序员的生产力有很大影响(即:当测试失败或发生其他意外情况时,但您正在查看的代码中的错误假设是什么并不明显)。与表达程序的实际业务相比,在使编程更好方面,可能会有更容易实现的目标。

于 2009-06-12T17:08:14.350 回答
2

我会在代码文档中引用一张图纸作为参考。我看不出为什么代码中不能有脚注。

于 2009-06-12T15:15:06.167 回答
2

您是否使用过Doxygen或类似工具来记录您的代码?您可以添加指向图像和其他文件类型的链接(通常与源代码存储在同一目录中),这些文件类型将被吸收到生成的文档中。我意识到这与直接在您最喜欢的编辑器中查看细节相去甚远,但它确实改善了我们记录代码的方式。

于 2009-06-12T15:15:41.437 回答
2

使一段代码只读的能力是我想要的

于 2009-06-12T15:24:44.130 回答
2

我用过emacs,我喜欢文本宏。但是,我真正想要的是解析宏。我希望我的编辑器以这样一种方式公开重构背后的机制,以便我可以在语言本身的解析树上编写我的转换。

例如,+=当我的代码中到处都是行时,Python 就添加了x = x + 1。如果我可以编写一个适用于解析树的搜索和替换命令,我可以快速清理大量源代码。

所以,我想要标准的搜索和替换,但我想要它在我的代码结构有意义的层次上,在抽象语法树上。

如果您曾经使用过 ReSharper,它的每个重构和建议都是按照我描述的方式编写的,它们会在解析树中找到一个模式并建议替换,或者对于重构,应用已知的替换。我想为自己的任务访问该机器!

于 2009-06-18T14:47:41.000 回答
1

脑海里立刻浮现出两句名言:

“如果它没有坏,就不要修理它。” “使用最好的工具来完成这项工作。”

当然,尽管核心代码仍以文本形式编写,但自打孔卡时代以来,所有工具和库都发生了巨大变化。

于 2009-06-13T12:32:41.697 回答
1

这已被其他人触及,它不会彻底改变编程,但无论如何......

我认为如果代码编辑器稍微超越纯文本编辑器会很好。即使有语法高亮和代码完成(我认为这是非常好的东西),今天的编辑器(至少是我使用的那些)仍然显示与源文件中完全相同的 ASCII 文本(或使用的任何编码) . 例如,如果编辑器显示出来,我很想看看它的效果如何(有些例子比其他例子更具冒险精神):

  • 带有浅蓝色背景且不可见//或不/* ... */可见的文本框中的注释
  • Javadoc 注释可以具有半富文本编辑支持(对于那些编写 HTML Javadoc 注释的人)(说真的,如果代码编辑器将 Javadoc 注释呈现为 HTML,我将不胜感激,因为当它们的 HTML 为纯文本时,它们不是最容易浏览的)
  • 文本框中的功能,可以折叠以仅显示签名(折叠可以由当前编辑器完成)并且可以作为框拖动
  • 功能框之间的线条指示功能的连接方式
  • 缩小,这样您就可以看到多个文件以及相互连接的方式,而不是看到单个源文件(多种语言的类)(这实际上是直接在代码编辑器中构建类似 UML 的图表)

我认为这(至少在我看来)不需要在源文件中添加额外的标记就可以工作,因此纯文本编辑器的用户不会因为所有这些额外的标记弄乱文件而处于不利地位。

于 2009-06-13T14:04:32.163 回答
1

在过去的几年里,我一直在思考如何让编码更快、更高效,一直在努力保持它的现实性并进行简约的实现。那些不是革命性的想法,但由于最初的发帖人谈到了打孔卡到代码输入的过渡,我想到了谈论其他与计算机交流我们想要编程的方式。

我的想法是视觉或声音编程。背后的动机是,只有多种方法可以有效地编程循环,并且有意识的 IDE 可以根据输入而不是键入的代码行做出一些智能代码替换决策。

可视化编程与编码:将(字面意思)代码封装到具有输入和输出的“盒子”中,并在水平时间线上将它们连接在一起。这是一个高级概念,对于多线程开发本质上是有趣的,因为您可以同时发生多行或多线程。无论你怎么看,每个过程都可以分成一个“盒子”。以最基本的形式发送电子邮件是一个将电子邮件作为输入并输出成功/失败信号的框。由于框和线分布在时间线上,因此不会丢失时间和事件年表的概念,并且可以使用反馈线。

声乐编程与编码:这种技术的有效性将围绕决定创建代码和移动光标的声乐语法的有效性。例如,您可以对麦克风说“for variable zero to 10”,系统将自动生成以下代码,将光标置于其中:

for (x=0;x<10;x++){
  // Cursor would be there after after the call
}

在可用性方面,您需要在一个相对安静的房间中,以尽量减少可能损害语音识别的其他声音,以便该技术主要用于专业环境。

这是我使用各种硬件和编程语言的丰富编程经验的结果。让我知道你们的想法,我很乐意就此进行建设性的讨论。

于 2009-06-12T15:46:03.707 回答
1

您可能对这些替代编程“语言”感兴趣。

[Ladder][1],旨在模仿继电器逻辑方案的工作方式。可怕的海事组织,但对于用棍子和石头做逻辑的老家伙来说很容易理解。[ http://www.amci.com/tutorials/images/ladder-diagram.gif][2]

[SFC,顺序功能图][3],旨在简化并行编程。代码被写入盒子中,这些盒子可以相互平行放置,从而同时执行。通过连接几个盒子的末端,您可以同步事件。对于自动化应用程序非常常见。

[Mathematica][5]!!!,可能不是最好的编程语言,但语法高亮(如果你可以这么说的话)很棒!例如,您可以通过查看矩阵精确对齐而不是巨大的 double[][] 来输入矩阵。可以在代码中插入图形,数学表达式的格式看起来就像你在纸上写的一样。不再需要花括号或冗长的 Math.PI 表达式,实际上只需要一个字符。最重要的是,即使在编辑器中渲染得很好,文件也只是纯文本!

调试器也是一个进行了大量改进的领域。带有回放功能的调试器以及可以实时修改数据的可视化调试器开始出现。编辑和继续也是我不想拥有的功能。

WTF “新用户最多只能发布一个超链接”,您必须谷歌我最初添加到此帖子中的内容>:(

于 2009-06-17T20:50:07.163 回答
1

几周前,“ Intentional Software ”就他们的新语言引起了轰动。我还没有观看演示文稿,但这里引用了Martin Fowler 的评论

他们开始担心地使用通常不公开的 Powerpoints,但随后他们转而展示工作台,最终拉开了帷幕。为了衡量反应,看看推特。

  • @pandemonial 印象深刻!这很甜!多个域,多个语言,没有问题没有得到解答
  • @csells 好的,观看渲染的实时电路并在 C# 文件中工作非常酷。
  • @jolson 关于 Intentional Software 的电子演示要说两句话:HOLY CRAPOLA。就是这样,我的大脑终于爆炸了。
  • @gblock 这不是关于时髦的演示,而是关于彻底改变我们所知道的世界。
  • @twleung 好的,精算公式的智能感知真是太棒了
  • @lobrien 这就像看到一个 100 英里/加仑的化油器:天哪,有人要买这个并把它放在保险库里!
于 2009-06-12T16:17:53.393 回答
1

部分问题可能源于这样一个事实,即当您不编码时,我们不称其为编程:例如,使用 GUI 组装模块化组件。

于 2009-06-14T20:01:09.003 回答
1

脑到计算机的翻译器。打字是真正的瓶颈。它真的只需要导出我想出的算法并将其转换为机器代码。

我想说很多较新的语言在快速创建算法方面非常出色。这些改进现在与其说是革命性的不如说是进化的。

于 2009-06-12T15:14:46.900 回答
1

编程语言是一种特殊形式的数学符号,因为您可以用数学方式表达编程语言。符号变化缓慢,因此我们的语言没有快速进步。大多数情况下,当我们想出一个新的东西来适应符号时,我们就会进步,比如用 i 来指代负数的平方根。

有一些文档方案允许您嵌入文本以外的内容。至少有一个编程方案,Donald Knuth's Web,它允许您拥有程序的演示和执行版本(不幸的是,基本源代码,即您实际破解的东西,相当混乱)。

您可以轻松拥有一个可以将评论视为 HTML 的文本编辑器,当然前提是它可以识别看到的评论。

于 2009-06-12T15:26:36.873 回答
0

你能想到什么让你的编码/文本编辑/文档任务更容易?

正确性突出显示。

替代文字

更新:我认为这是不言自明的,但显然不是。这是图像的注释版本。基本上,这是一种玩具语言,但概念可以扩展到真实语言和 IDE;该语言具有内联测试,并且在每次击键时都会执行测试。通过测试和具有 100% 覆盖率并通过所有测试的函数将显示为蓝色;失败的测试和失败的功能是粉红色的;未覆盖的代码为黄色。因此,正如我上面所说,“正确性突出显示” - 您可以查看颜色并立即知道哪些功能是正确的(由测试定义)。

于 2009-06-17T19:38:15.637 回答
0

Automated semantic source code transformations, where a program can be reliably examined and manipulated by using an abstract interface/frontend to it that is aware of the underlying semantics.

So that source code can be queried and dealt with pretty much like a SQL database.

Allowing you to do static analysis of source code and refactor even complex source code by doing something along the lines of:

FIND CALLERS OF FUNCTION "foo" WHERE SIGNATURE("int","int","char*") AND RETURN_TYPE("bool");
...
RENAME MACRO "max" TO "maximum" IN FILE "macros.hxx";
RENAME NAMESPACE "prj" TO "project";
RENAME SYMBOL "OLDFOO" IN NAMESPACE "project";
RENAME FUNCTION "log" TO "show_log";
RENAME CLASS "FOO" TO "OLDFOO";
RENAME METHOD "FOO::inc" TO "FOO::increment"; 
...
CHANGE SIGNATURE IN FUNCTION "foo" WHERE SIGNATURE("int","int") TO SIGNATURE("double","double");
CHANGE SIGNATURE IN METHOD "myClass::handle" WHERE SIGNATURE("char") TO SIGNATURE("unsigned char")
MOVE FUNCTION "foo" in FILE "stuff.cc" TO "foo_funcs.cc";
于 2009-06-12T18:21:54.750 回答
0

整个过程的基本缺陷是将源代码放入文本文件以便能够编译它的概念。

它被放入一个文本文件中,因为这是编译器需要的那种输入。这是一个有 50 年历史的想法,应该重新考虑。

编译器/链接器应该与 IDE 集成,这样程序员就不必担心什么代码放在哪个模块中,以及我必须做什么才能使这些代码在那里可见。全球人?外部人员?#include 文件,库路径...将它们扔出窗口。

应该能够打开 IDE,并查看项目列表。你打开其中一个。如果您是设计师,您会看到设计文档。如果您是开发人员,您会看到代码。如果您是用户,您会看到 wiki。

设计文档超链接到代码,代码返回文档,返回用户指南,因此您可以达到所需的任何级别。所以你在某个职能部门,你想知道“他们到底为什么要那样做?” 您可以点击设计规范的链接来了解原因。您从那里跟随需求文档。您可以按照要求将其作为建议的人的姓名。

所有的文件管理去。它留给 IDE 的内部。

于 2009-06-12T15:48:00.517 回答
0

我敢说它实际上可能是一种新的开发语言(甚至可能是一种新的范式)来带领我们经历这样的革命;

于 2009-06-12T15:48:05.993 回答
0

潜台词。Edwards 的想法和论文非常鼓舞人心。你必须自己看看这是怎么回事:

解说视频

于 2009-06-18T07:10:08.723 回答
0

我想你可能想看看Leo。这是一个试图回答你所问问题的人。我仍然无法亲自将我的 VIM 头包起来,但其他人很快就会接受它。它不仅仅是一个编程 IDE,更是一个信息组织者。它是用 Python 编写的,但我不明白为什么你不能用它用其他语言编写代码。Leo 的力量不在于语言,而在于表达和组织思想的能力,无论是在代码、图表、图像还是图表中。查看教程和示例以了解它。你可能会喜欢。

于 2009-06-12T17:27:18.797 回答
0

好吧,看看医学和土木工程。这些很有趣,因为如果做得不好,人们会受伤。这些领域有每个人都遵循的标准和许可程序。如果不经历痛苦的​​仪式(学校、执照、学徒期和其他任务),你不可能有一天醒来并开始在这些领域工作。渎职行为不会被轻视。他们没有谈论:“为什么我们没有好的书面实践”;他们有他们,每个人都跟随他们,有被放逐的危险。

现在,让我们谈谈软件。你的问题一直是书籍的基础。然而,最佳实践在哪里?罗伯特·马丁吐了一个,乔尔·斯波尔斯基嘲笑他到侮辱和攻击的地步。至少马丁试图提出一些标准。任何 Tom、Dick、Harry、Sally 和 Sue 都可以开始练习软件开发。如果你胡说八道,那就离开你的公司(或被解雇)并在其他地方胡说八道。没有人会责备你。执照?IEEE 试过了,谁在乎呢?美国德克萨斯州试过了,谁在乎呢?谈论认证,你的工作就会被毁掉(就像史蒂夫·麦康奈尔(Steve McConnel)的一本书——软件专业精神。)

这是长篇大论;但我通过它告诉你事情的状态。软件只是需要时间来成熟,但要让政府参与和大型广告巨头的努力失败,因为它像土木工程一样成熟。我怀疑这是否会很快到来;但它应该是在遥远的未来。

于 2009-09-24T16:35:00.573 回答
0

如果有什么东西出来了,无论如何也没有人会使用它。我可以通过使用 GUI 查询构建来节省大量输入,但和其他人一样,我想要控制,因为我知道查询可能比典型的 GUI 工具可以处理的更复杂。

有人在您的表单/网页上放置数据控件吗?对于高端用户来说,你是对的,但是在过去的 20 年中,有数百万非程序员的软件开发能力呈指数级增长。

这一切都以 1 和 0 结束,所以你期望什么。

于 2009-06-17T21:02:32.550 回答