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

时间:2009-06-12 15:10:40

标签: language-agnostic editing

在考虑软件工程时,我想到了为什么我们没有看到编写/记录代码的方式有任何改进。

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

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

我会从错过的东西开始:

  • 我的很多代码都涉及几何。 对于描述几何关系的文档,总是会出现在一大堆难以阅读的数学内容中(由于缺少适当的ASCII方程式设置)。但是,如果我可以在代码中嵌入一些小图画或涂鸦,一切都会更容易,更整洁,更容易被理解。

您能想到什么会使您的编码/文本编辑/文档编辑任务更容易?

35 个答案:

答案 0 :(得分:30)

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

  

在技术或管理技术方面没有任何单一的发展,它本身承诺在十年内在生产力,可靠性和简单性方面提高一个数量级[十倍]的改进。 [...]我们不能指望每两年看到两倍的收益。“

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

答案 1 :(得分:15)

我很惊讶没有人提到Donald Knuth的开创性Literate Programming - 将你的代码写成书或科学论文。

答案 2 :(得分:13)

  

自从我们从穿孔卡转移到文本编辑

以来,没有一个革命性的改进

从未使用过线编辑器,对吗?


但严肃地说,文本(特别是在为现代语言选择的表示中)是

  1. 易于处理
  2. 相当容易指定
  3. 信息密集
  4. 精确
  5. 任何取代它的东西必须是所有这四个属性的净胜利。不容易。

答案 3 :(得分:11)

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

“for each”构造的常见程度如何?与20年前相比。 Domain Specific Languages运动怎么样?我们应该在图层中编码的想法怎么样?行为驱动的发展怎么样?通过遵守规范进行编码...当所有运行正常时,将一个好的文档写为输出。正则表达式的标准化怎么样? PCRE。那些关于“摩尔软件定律”的Alan Kay's group's DSL相关工作怎么样?它使用来自RFC的图表探索了更高级的开罗实现并生成了TCP / IP代码?

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

答案 4 :(得分:5)

我最近在我的应用程序的一些数学重点部分做的一件事是将特定等式的LaTeX标记包含为注释/文档字符串。现在,我只是复制粘贴到online equation editor,但是看到公式本身(包括希腊字母和子/上标)而不是一堆ASCII代码会非常有用。

答案 5 :(得分:4)

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

答案 6 :(得分:4)

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

答案 7 :(得分:3)

我当然尊重弗雷德布鲁克斯的论点No Silver Bullet,但我认为我们编写代码的方式远非最佳,因此还有更多的改进空间。我试图在my book中解释这一点。

我们都熟悉“代码高尔夫”,在那里你无情地竞争最小化的东西。这是接近该事物最小可能值的好方法。

这是多么伟大的事实是,你被允许,甚至被鼓励,打破传统,先前的观念,接受的智慧,寻求获胜。简而言之,你学习新东西。

如果要最小化的度量是挂钟执行时间,则可以进行积极的优化。

如果度量是源代码大小(行或字符),则会得到“code golf”。

我最喜欢的措施是“编辑计数”。也就是说,给定一个代码库,假设有一个新的需求。完全通过编辑代码库来实现该要求。然后从旧代码库到新代码库完成“差异”。找到的差异数量是编辑计数。平均可能的新功能要求,即最小化的措施。

如果这是积极地完成的,可以自由地与所有传统智慧相悖,那么代码库就会接近我称之为域特定语言(DSL)的状态。在这种语言中,代码中表达的概念与面向问题的概念几乎相对应。在这种状态下,源代码不容易自我不一致(即有错误),因为必须对源代码进行的编辑越少,出错的可能性就越小。情况也是如此,这样的代码往往很短。但与“代码高尔夫”不同,它往往非常清晰,因为它如此清晰地映射问题概念。

因此,在我看来,有助于减少编辑次数的工具和技术可以被视为“银子弹”。 DSL就是这样的。代码生成是另一个。我的favorite optimization technique是另一个。对于动态更改UI的编码,有differential execution。必然会有更多,等待被发现。当然,一切都取决于“神射手”(编码员)的训练和经验。

我认为有很多新想法需要发现。诀窍在于告诉我们前进的那些与阻碍我们前进的那些之间的区别。

答案 8 :(得分:3)

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

/* help: fooimg.png */

然后有一个外部文档系统来做那件事,然后很棒。

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

答案 9 :(得分: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语言级别设计的。见教授J.
  • 插入Java交互框:插入一个允许在Scheme程序中使用Java表达式和语句的框。该框的结果是与Java表达式的结果相对应的Scheme值。此时,Scheme值无法进入框中。该框将每行接受一个Java语句或表达式。
  • 插入XML Box:插入XML;有关更多信息,请参阅XML Boxes和Scheme Box。
  • 插入方案框:插入一个框以包含通常在XML框内使用的Scheme代码;参见XML Boxes和Scheme Boxes。
  • Insert Scheme Splice Box:插入一个包含Scheme代码的框,通常在XML框中使用;另见XML Boxes和Scheme Boxes。
  • 插入Pict Box:创建一个用于生成幻灯片图片的框。在图标框内,插入并排列生成图片值的Scheme框。

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

答案 10 :(得分:3)

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

答案 11 :(得分:3)

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

但那发生在8到10年前。

基于模板的编程感觉很有用,似乎永远不会流行起来。最近我对 the Meta-programming system 的演示印象深刻,该演示利用了IDE的交互特性来简化编写模板的任务以及(基本上)类型感知宏的任务。

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

答案 12 :(得分:2)

我会在代码文档中引用一个绘图作为参考。我认为你没有理由在代码中没有脚注。

答案 13 :(得分:2)

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

例如,当我的代码散布着+=行时,Python一度添加了x = x + 1。如果我可以写一个搜索和替换在解析树上工作的命令,我可以快速清理大量的源代码。

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

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

答案 14 :(得分:2)

漫画和搜索图片很难。差异和搜索对程序员来说非常重要。在许多情况下使用图片而不是文本只是一个微小的改进,它有一些缺点,它需要普遍接受才真正值得做(因为如果你的读者没有理解你的东西你不会让事情变得更容易理解完成)。

另外,程序员有一百万个小技巧,根据代码的文本表示使他们的生活变得更容易,如果你给他们提供用文本以外的任何东西表达的代码,他们就会失去。当然,他们可能会随着时间的推移取代或重新实施这些技巧,但在短期内它们就会消失。

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

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

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

我认为仍然可以通过文本完成很多工作。例如,调试器技术在某些常见情况下对程序员的工作效率产生很大影响(即:当测试失败或发生其他意外情况时,但是您所看到的代码中的错误假设并不明显)。与编写该计划的实际业务相比,在编程方面可能有更低的成果。

答案 15 :(得分:2)

  

我见过的最后一项改进是   语法高亮和上下文   敏感的帮助

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

答案 16 :(得分:2)

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

答案 17 :(得分:2)

将一段代码设为只读的能力是我想要的

答案 18 :(得分:2)

您是否使用Doxygen或类似内容来记录代码?您可以添加指向图像的链接,以及其他文件类型(通常存储在与源代码相同的目录中),这些文件将被吸收到生成的文档中。我意识到这是从你最喜欢的编辑器中直接看到细节的一步,但它肯定会改进我们记录代码的方式。

答案 19 :(得分:1)

我一直在思考如何在过去几年中更快,更高效地编写代码,始终努力保持现实并进行简约实现。这些并不是革命性的想法,但是由于原始海报谈到了打码转换代码的冲压卡,我想到了谈论与计算机进行通信的其他方式。我们想要编程。

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

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

声乐编程与编码:这种技术的有效性将围绕决定创建代码和移动光标的声音语法的有效性。例如,你可以对麦克风说“变量零到10”,系统会自动生成以下代码,将光标放在里面:

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

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

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

答案 20 :(得分:1)

几周之后,“Intentional Software”就他们的新语言引起了不小的轰动。我还没有看the presentation,但这里引用的是review by Martin Fowler

  

他们开始令人担忧   通常没有提供Powerpoint,但是   然后他们切换到显示   最后工作台和窗帘   打开。为了衡量反应,拿一个   看看Twitter。

     
      
  • @pandemonial相当令人印象深刻!这太好了!多个域,多个   langs,毫无疑问无法回答
  •   
  • @csells好的,看着现场电路渲染和   在C#文件中工作非常该死   凉爽。
  •   
  • @jolson关于Intentional的电子演示的两个词   软件:HOLY CRAPOLA。就是这样,我的   大脑终于爆炸了。
  •   
  • @gblock这不是关于时髦的演示,这完全是关于   改变我们所知道的世界。
  •   
  • @twleung好的,精算公式的intellisense真是太棒了
  •   
  • @lobrien这就像看到一个100英里/加仑的化油器:有人是OMG   打算买这个并把它放进去   拱顶!
  •   

答案 21 :(得分:1)

大脑到计算机的翻译。打字是真实的 瓶颈。它实际上只需要导出算法I. 想一想并将其转换为机器代码。

我想说很多较新的语言都很棒 快速创建算法。改进并非如此 现在是革命性的,因为它们是进化的。

答案 22 :(得分:1)

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

有一些文档方案允许您嵌入除文本之外的其他内容。至少有一个编程方案,Donald Knuth的Web,允许你有一个程序的演示文稿和执行版本(不幸的是,基本的源代码,你真正破解的东西,相当混乱)。

你可以很容易地拥有一个可以将评论视为HTML的文本编辑器,当然它可以在看到它时识别评论。

答案 23 :(得分:1)

立即想到两个引号:

“如果没有破损,请不要修理它。” “使用最好的工具来完成工作。”

当然,尽管核心代码仍然是以文本形式编写的,但自从穿孔卡片时代起,工具和库也发生了巨大的变化。

答案 24 :(得分:1)

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

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

  • 文字框中的评论,背景为浅蓝色,没有///* ... */可见
  • Javadoc评论可能有半富文本编辑支持(对于那些做HTML Javadoc评论的人)(严重的是,如果代码编辑者将Javadoc评论呈现为HTML,我会很感激,因为他们的HTML不是最容易浏览的作为纯文本)
  • 文本框中的功能可以折叠以仅显示签名(折叠可以由当前编辑器完成)并可以作为框拖动
  • 功能框之间的线条,用于指示功能的连接方式
  • 缩小以便不是看到单个源文件(许多语言中的类),而是可以看到多个文件以及相互连接的方式(这实际上就是直接在代码编辑器中构建类似UML的图表)

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

答案 25 :(得分:1)

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

答案 26 :(得分:1)

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

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

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

[Mathematica] [5] !!!,可能不是最好的编程语言,但语法高亮(如果你可以称之为)真棒!例如,您可以通过看到矩阵非常对齐而不是巨大的double [] []来输入矩阵。图形可以插入到代码中,数学表达式的格式就像在纸上书写时一样。没有更多的paranthesis-madness或长Math.PI表达式真正只需要一个字符。最重要的是,文件只是纯文本,即使它在编辑器中很好地呈现!

调试器也是一个需要进行大量改进的领域。带有重放的调试器开始出现,还有可视化调试器,可以实时修改数据。编辑和继续也是一个我不想生活的功能。

WTF “新用户最多只能发布一个超链接”,你必须谷歌我最初添加到这篇文章中的东西&gt; :(

答案 27 :(得分:0)

好吧,看看医学和土木工程。这些很有意思,因为如果做得不好会让人受伤。这些领域有标准和许可程序,每个人都遵循。有一天你无法醒来并开始在这些领域工作而不经历痛苦的​​仪式(学校,执照,学徒和其他任务)。医疗事故不会被轻视。他们不谈论:“为什么我们没有良好的减记做法”;他们拥有他们,每个人都有可能被驱逐的风险。

现在,我们来谈谈软件。你的问题一直是书籍的基础。然而,最好的做法在哪里?罗伯特马丁咳嗽了一下,乔尔斯波尔斯基嘲笑他到了侮辱和侮辱的地步。至少马丁试图提出一些标准。任何Tom,Dick,Harry,Sally和Sue都可以开始练习软件开发。如果你做了擦,只要离开你的公司(或被解雇),并在其他地方擦。没有人会责备你。执照? IEEE尝试过并且关心谁?美国德克萨斯州尝试了它并且关心谁?谈论认证,你的工作将被删除(就像Steve McConnel的书 - 软件专业主义之一。)

这是一个长篇大论;但我经历过它告诉你事情的状况。软件需要时间才能成熟,而且无法让政府参与其中,大型广告强大的人必须前进,因为它像土木工程一样成熟。我怀疑这是否会很快;但它应该在遥远的未来。

答案 28 :(得分:0)

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

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

编译器/链接器应该与IDE集成,以免程序员担心代码在什么模块中运行,以及我需要做些什么才能使代码在那里可见。全局?实习医生? #include files,Library Paths ...把​​它们抛到窗外。

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

设计文档是超链接到代码,代码返回到文档,然后返回到用户指南,因此您可以获得所需的任何级别。所以你有一些功能,你想知道“为什么他们这样做呢?”您可以按照设计规范的链接查看原因。您可以从那里到需求文档。您可以将其作为要求的人的姓名。

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

答案 29 :(得分:0)

Subtext。爱德华兹的想法和论文非常激励人心。你必须亲自看看这是什么:

Explanatory video

答案 30 :(得分:0)

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

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

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

答案 31 :(得分:0)

  

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

正确性突出。

alt text

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

答案 32 :(得分:0)

自动语义源代码转换,其中可以通过使用知道底层语义的抽象接口/前端来可靠地检查和操作程序。

因此可以查询和处理源代码,就像SQL数据库一样。

允许您对源代码进行静态分析,并通过执行以下操作来重构甚至复杂的源代码:

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";

答案 33 :(得分:0)

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

答案 34 :(得分:0)

我敢说它可能实际上是一种新的发展语言(甚至可能是一种新的范例)来带领我们度过这样的革命;