了解Dijkstra的莫扎特编程风格

时间:2008-11-15 15:41:29

标签: coding-style dijkstra

我遇到了关于编程风格的this article,由Edsger Dijsktra看到。快速解释一下,主要的不同之处在于莫扎特,当编程的类比,在写任何东西之前完全理解(辩论)问题,而贝多芬在纸上写下笔记时作出了他的决定,并在此过程中创造了许多修改。使用Mozart编程,1.0版本将是软件的唯一版本,其目标应该是无错误和最高效率。此外,Dijkstra表示不应该向那些精确和稳定的软件发布公众。

基于他的观点,有两个问题。莫扎特的编程是否可行?如果我们采用莫扎特风格,我们今天写的软件真的会受益吗?

我的想法。看来,为了应对日益复杂的软件,我们已经从这种方法转向敏捷开发,公共beta测试和不断修订,定义Web开发的方法,速度最重要。但是,当我想到网络软件可以经历的所有修订时,尤其是在维护期间,当补丁通常应用于补丁时,然后通过繁琐的重构过程进行改进 - 莫扎特方式似乎非常有吸引力。它至少会减少那些烦人的软件更新,例如Digsby,Windows,iTunes等许多不可预见的漏洞导致需要新的即时发布。

编辑:有关Dijsktra观点的更准确说明,请参阅the response below

10 个答案:

答案 0 :(得分:53)

莫扎特的编程风格是一个完整的神话(每个人都必须编辑和修改他们最初的努力),虽然“Mozart”在本例中基本上是一个隐喻,但值得注意的是,莫扎特本身就是一个神话。

莫扎特是一个神奇的神童神童,他在4岁时创作了他的第一首奏鸣曲(他实际上是6岁,而且很糟糕 - 你不会听到它在任何地方演奏过)。当然,很少有人提到他的父亲被认为是欧洲最伟大的音乐老师,而且他一旦拿起乐器或钢笔,他就会强迫他的所有孩子每天练习和合成几个小时。

莫扎特本人小心翼翼地通过摧毁他的大部分草稿来保持他的音乐完全从他的脑海中浮现出来的幻觉,尽管足以证明他是一个像其他人一样的编辑。贝多芬对这个过程更加诚实(也许是因为他是聋子,无论如何都无法判断是否有人偷偷摸摸他)。

我甚至不会提到莫扎特从听歌鸟那里得到他的旋律的理论。或事实他创建了一个使用骰子随机生成音乐的系统(这实际上非常酷,但也可能解释莫扎特音乐中有多少来自无处)。

故事的寓意是:不要相信炒作。编程是有效的,接着是更多的工作来修复你第一次犯的错误,接下来是更多的工作来修复你第二次犯的错误,等等等等,直到你死了。

答案 1 :(得分:15)

无法扩展。

我可以在脑海中找到一行代码,一个例程,甚至一个小程序。但是一个中等程序?可能有一些人可以做到这一点,但有多少,他们花了多少钱?他们真的应该写下一个薪资计划吗?这就像在muzak上浪费莫扎特一样。

现在,试着想象一下莫扎特队。只是几秒钟。


它仍然是一种强大的工具。如果你可以在头脑中弄清楚整条线,那就去做吧。如果你能找到一个包含所有有趣案例的小例程,那就去做吧。

从表面上看,它避免了回到绘图板,因为你没有想到一个边缘情况需要一个完全不同的界面。

更深层的含义(head fake?)可以通过学习另一种人类语言来解释。很长一段时间,你会想到哪些词代表你的想法,以及如何将它们命名为有效的句子 - 这种转录需要花费大量的前景周期。
有一天,你会注意到你刚才说话的解放感觉。它可能感觉像“用外语思考”,或者好像“言语自然而然”。你有时会绊倒,寻找一个特定的词或成语,但大多数时候翻译在“潜意识CPU”的大量资源中运行


“高目标”是开发一个解决方案的心理模型(大部分)独立于实现语言,将问题的解决方案转录分开问题。转录很容易,重复,易于培训,抽象的解决方案可以重复使用。

我不知道如何教这个,但“在你开始编写之前尽可能多地搞清楚”听起来像是朝着这个目标的良好编程实践。

答案 2 :(得分:15)

Edsger Dijkstra在这段名为“Discipline in Thought”的YouTube视频中讨论了他对莫扎特与贝多芬节目的看法。

alt text

这个帖子中的人们已经讨论过Dikstra的观点是如何不切实际的。我打算试着为他辩护一些。

  • Dijkstra反对公司 基本上“测试”他们的软件 对他们的客户。发布 版本1.0,然后立即 补丁1.1。他觉得这个节目 应该抛光到一定程度 “修补程序”补丁是临界的 不道德的。
  • 认为软件应该一蹴而就,或者永远不需要做出改变。他经常讨论他的设计理念,其中一个模块化和易于改变。他经常认为,在完全理解问题之后,应该以这种方式编写单独的算法。这是他纪律的一部分。
  • 他毕竟找到了他对程序员的丰富经验,他们不会高兴,除非他们正在推动他们的知识极限。他说,程序员不想完全编程,100%理解它,因为它没有任何挑战。 程序员总是希望处于他们的知识边缘。虽然他理解为什么程序员是这样的,但他表示它不代表低容错编程。

有一些行业或编程应用我相信Dijkstra的“纪律”也是有保证的。 NASA流浪者,健康产业嵌入式设备(即配药等),某些转移我们资金的财务软件。这些领域在发布后没有任何增量变化的奢侈品,并且需要更多的“莫扎特方法”。

答案 3 :(得分:14)

答案 4 :(得分:6)

我认为莫扎特的故事会混淆发送的内容与发展方式。贝多芬没有对他的交响曲进行beta测试。 (看到他在第一次公开表演后改变了多少分数会很有趣。)

我也不认为Dijkstra坚持认为这一切都在你脑海里完成。毕竟,他写了关于纪律编程的书籍,其中包括在纸上进行编程,并且在相同的程度上他想要看到数学质量的纪律,你是否注意到在处理问题时纸张和粉笔板数学家可能会消耗多少?

我赞成Simucal's response,但我认为应该抛弃莫扎特 - 贝多芬的比喻。那个鞋子Dijkstra坚持纪律和理解到一个它真正不属于的角落。

补充说明:

电视普及并不是那么热门,它混淆了一些关于音乐作品和作曲家正在做什么以及程序员正在做什么的事情。用Dijkstra自己的话来说,从他1972年的图灵奖演讲开始:“我们不能忘记制作节目不是不是我们的业务;我们的业务是设计能够显示所需行为的计算类别。 “作曲家可能会出去发现所需的行为。

此外,在Dijkstra的观点中,版本1.0应该是最终版本,我们也很容易混淆期望的行为和功能随时间的演变。我认为他认为所有未来的版本都是因为第一个版本没有经过深思熟虑和可靠的思考而过于简单化。

即使没有上市时间紧迫性,我认为我们现在更了解重要类型的软件随着用户体验以及它们的实用目的而发展。明显的反例是游戏(也考虑如何开发戏剧性电影)。你是否认为贝多芬可以在没有他之前的经验和探索的情况下写出第九交响曲?你认为观众可以听到它的内容吗?他应该等到他拥有完美的奏鸣曲吗?我敢肯定迪克斯特拉不会提出这个问题,但我确实认为他与莫扎特 - 贝多芬的关系太过分了。

此外,还要考虑国际象棋游戏软件。新版本不是因为之前的版本没有正确播放。它是关于利用国际象棋游戏启发式和可用计算机能力的进步。对于这个和许多其他情况,版本1.0作为最终版本的想法是基础的。我理解他理所当然地反对发布已知的不可靠且可能受损的软件,这些软件在维护和未来版本中都有不足之处。但莫扎特的反驳论据并没有阻止我。

那么,Dijkstra是否继续驾驶他购买的第一辆汽车,或者那辆汽车的克隆?也许有计划的过时,但其中很多都与改进和可靠性有关,这些改进和可靠性在前几代汽车技术中是不可能的,甚至可以考虑。

我是Dijkstra的忠实粉丝,但我觉得莫扎特 - 贝多芬的事情过于简单化,也不恰当。我也是贝多芬的大粉丝。

答案 5 :(得分:5)

我认为使用莫扎特编程出现是可能的。我知道有一家公司,暴雪,它没有发布软件产品,直到他们做好准备。这并不意味着暗黑破坏神3将在一次令人眼花缭乱的精彩编码中完整地从一个人的脑海中完成。 意味着它将如何呈现给我们其他人。暴雪将在内部测试他们的游戏,直到他们解决了所有的问题之后才向世界其他地方展示。大多数公司都没有采用这种方法,而是更倾向于在软件解决问题时发布软件,然后在出现问题时修复错误并添加功能。这种方法适用于大多数公司(不同程度)。

答案 6 :(得分:4)

嗯,我们不能都像莫扎特一样好,可以吗?也许贝多芬的编程更容易。

答案 7 :(得分:1)

如果Apple采用“莫扎特”编程,那么今天就不会有Mac OS X或iTunes。

如果Google采用“莫扎特”节目,则不会有Gmail或Google阅读器。

如果SO开发人员采用“莫扎特”编程,那么今天就没有了。

如果微软采用“莫扎特”编程,那么今天就没有Windows(好吧,我觉得这样会很好)。

所以答案就是NO。没有什么是完美的,没有什么是完美的,包括软件。

答案 8 :(得分:1)

我认为这个想法是提前计划。你需要至少对你想要做的事情以及你打算如何实现目标有一些概述。如果你只是坐在键盘上,希望“缪斯”能引导你到你的程序需要去的地方,结果可能会相当不均匀,而且你需要更长的时间才能到达那里。

任何类型的写作都是如此。很少有作者只是坐在没有想法的打字机上,并开始敲打,直到制作畅销小说。哎呀,我的岳父(高中英语老师)实际上为他的字母写了大纲。

答案 9 :(得分:0)

计算的进步在这里和那里都值得牺牲荣耀或天才。