Files
A-Philosophy-of-Software-De…/前言/index.md
2019-03-03 22:29:32 +08:00

6.0 KiB
Raw Blame History

80多年来人们一直在为电子计算机编写程序但关于如何设计这些程序或者应该是什么样的好程序的讨论却令人惊讶。关于软件开发过程如敏捷开发和开发工具如调试器版本控制系统和测试覆盖率工具的讨论已经有了很多。还对编程技术进行了广泛的分析例如面向对象编程和函数编程以及设计模式和算法。所有这些讨论都很有价值但软件设计的核心问题仍然基本上没有受到影响。 David Parnas的经典论文“关于将系统分解为模块的标准”出现于1971年但在随后的45年中软件设计的最新进展并未超过该论文。

计算机科学中最基本的问题是问题分解:如何解决复杂问题并将其分解为可以独立解决的问题。问题分解是程序员每天面临的中心设计任务,然而,除了这里描述的工作之外,我还没有能够在任何大学中识别出问题分解是一个中心主题的单一课程。我们教授循环和面向对象的编程,但不教授软件设计。

此外,程序员在质量和生产力方面存在巨大差异,但我们很少尝试理解是什么让最好的程序员变得更好或者在我们的课程中教授这些技能。我和几个我认为很棒的人交谈过 程序员但他们中的大多数都难以阐明能够为他们提供优势的特定技术。许多人认为软件设计技能是一种无法教授的天赋。然而有相当多的科学证据表明许多领域的杰出表现更多地与高质量的实践相关而不是天生的能力例如参见Geoff被Geoff Colvin高估

多年来这些问题让我感到困惑和沮丧。我想知道是否可以教授软件设计我假设设计技巧是伟大的程序员与普通程序员的区别。我终于决定回答这些问题的唯一方法是尝试教授软件设计课程。结果是斯坦福大学的CS 190。在本课程中我提出了一套软件设计原则。然后学生通过一系列项目来吸收和实践这些原则。课程的教学方式类似于传统的英语写作课程。在英语课上学生使用迭代过程他们写一个草稿获得反馈然后重写以进行改进。在CS 190中学生从头开始开发大量软件。然后我们通过广泛的代码审查来识别设计问题学生修改他们的项目来解决问题。这样学生可以通过应用设计原则来了解如何改进代码。

我现在已经三次教授软件设计课程,本书基于课堂上出现的设计原则。这些原则在哲学上是相当高的水平和边界(“定义错误不存在”),因此学生很难理解抽象中的思想。学生通过编写代码,犯错误,然后了解他们的错误以及随后的修复如何与原则相关来学习。

在这一点上你可能会想知道是什么让我觉得我知道关于软件设计的所有答案说实话我没有。当我学习编程时没有关于软件设计的课程我从来没有一个导师教我设计原则。在我学习编程的时候代码评审实际上是不存在的。我对软件设计的看法来自于编写和阅读代码的个人经验。在我的职业生涯中我用各种语言编写了大约250,000行代码。我从事过从头开始创建三个操作系统多个文件和存储系统基础设施工具如调试器构建系统和GUI工具包脚本语言以及用于文本绘图演示和集成电路的交互式编辑器的团队。在此过程中我亲身体验了大型系统的问题并尝试了各种设计技术。另外我读过很多其他人编写的代码这让我接触到各种各样的方法包括好的和坏的。 在所有这些经验中,我试图提取共同的线程,包括要避免的错误和使用的技术。这本书反映了我的经历:这里描述的每一个问题都是我个人经历的问题,每一个建议的技术都是我在自己的编码中成功使用的技术。

我不希望这本书成为软件设计的最后一句话;我确信我错过了一些有价值的技术,从长远来看,我的一些建议可能会成为糟糕的想法。但是,我希望本书能够开始讨论软件设计。将本书中的想法与您自己的经验进行比较,并自己决定这里描述的方法是否确实降低了软件的复杂性。这本书是一篇评论文章,所以有些读者会不同意我的一些建议。如果你不同意,试着理解为什么。我很想知道对你有用的东西,不起作用的东西,以及你对软件设计可能有的任何其他想法。我希望随后的对话能够提高我们对软件设计的集体理解。我将在本书的未来版本中加入我学到的内容。

与我沟通有关本书的最佳方式是发送电子邮件至以下地址: software-design-book@googlegroups.com

我很想听听有关本书的具体反馈例如错误或改进建议以及与软件设计相关的一般想法和经验。我特别感兴趣的是我可以在本书的未来版本中使用的引人注目的例子。最好的例子说明了一个重要的设计原则并且很简单可以用一两段来解释。如果您想查看其他人在电子邮件地址上发表的言论并参与讨论您可以加入Google Group软件设计手册。

如果出于某种原因软件设计书Google Group将来会消失请在Web上搜索我的主页; 它将包含有关如何沟通书籍的更新说明。 请勿将与图书相关的电子邮件发送到我的个人电子邮件地址。 我建议你尽量采用本书中的建议。 总体目标是降低复杂性; 这比你在这里阅读的任何特定原则或想法更重要。 如果您尝试从本书中获得一个想法并发现它实际上并没有降低复杂性,那么就不要觉得有必要继续使用它(但是,请让我知道您的体验;我想获得有关哪些有效的反馈 什么不是。 许多人提出批评或提出改善书籍质量的建议。 以下人员对各种草稿提出了有益的评论...