软件设计的哲学:前言

简介: 软件设计的哲学:前言


01 前言


80多年来,人们一直在为计算机编写程序,但令人惊讶的是,关于如何设计这些程序或什么是好程序的讨论却少之又少。关于软件开发过程(如敏捷开发)和开发工具(如调试器、版本控制系统和测试覆盖工具),已经有了相当多的讨论。还广泛分析了编程技术,如面向对象编程和函数式编程,以及设计模式和算法。所有这些讨论都是有价值的,但是软件设计的核心问题在很大程度上仍然没有触及。David Parnas的经典论文“关于将系统分解成模块的标准”发表于1971年,但是在随后的45年里,软件设计的技术水平并没有超过这篇论文。


计算机科学中最基本的问题是问题分解:如何把一个复杂的问题分解成可以独立解决的几个部分。问题分解是程序员每天都要面对的核心设计任务,然而,除了这里描述的工作,我还没有在任何一所大学里找到一个以问题分解为中心主题的类。我们教循环和面向对象编程,但不教软件设计。


此外,程序员之间在质量和生产力方面存在巨大差异,但是我们很少尝试去理解是什么让最好的程序员变得更好,或者在我们的课堂上教授这些技能。我曾与一些我认为是优秀的程序员的人交谈过,但是他们中的大多数人都很难清楚地表达出那些给他们带来优势的特定技术。许多人认为软件设计技能是一种天生的天赋,是不能被教授的。然而,有相当多的科学证据表明,在许多领域的杰出表现更多地与高质量的实践有关,而不是天生的能力(例如,杰夫•科尔文高估了才能)。


多年来,这些问题一直困扰和困扰着我。我想知道是否可以教授软件设计,我假设设计技能是区分优秀程序员和一般程序员的关键。我最终决定,回答这些问题的唯一方法是尝试教授一门软件设计的课程。结果是斯坦福大学的CS 190。在这门课上,我提出了一套软件设计的原则。然后学生通过一系列的项目来吸收和实践这些原则。这门课的教学方式与传统的英语写作课类似。在英语课上,学生们使用一种迭代的过程,他们先写一份草稿,得到反馈,然后重写以做出改进。在CS190中,学生们从零开始开发了大量的软件。然后,我们进行广泛的代码审查,以确定设计问题,学生修改他们的项目来解决问题。这让学生看到如何通过应用设计原则来改进他们的代码。


我现在已经教过三次软件设计课,这本书是基于这门课的设计原则。这些原则是相当高水平的,接近于哲学(“定义错误不存在”),所以学生很难理解抽象的思想。学生通过编写代码、犯错误,然后查看他们的错误和随后的修复如何与原则相关,从而获得最佳的学习效果。


此时您可能会想:是什么让我认为我知道关于软件设计的所有答案?老实说,我不知道。当我开始学习编程的时候,我没有上过软件设计的课程,也没有导师来教我设计原则。在我学习编程的时候,代码评审几乎是不存在的。我对软件设计的想法来自于编写和阅读代码的个人经验。在我的职业生涯中,我用各种语言写了大约250,000行代码。我的团队从零开始创建了三个操作系统、多个文件和存储系统、基础设施工具(如调试器、构建系统和GUI工具包)、脚本语言以及用于文本、绘图、演示和集成电路的交互式编辑器。在此过程中,我亲身体验了大型系统的问题,并尝试了各种设计技术。此外,我还阅读了大量其他人编写的代码,这使我接触到各种方法,有好的也有坏的。


在所有这些经验中,我尝试提取一些常见的线索,包括要避免的错误和要使用的技术。这本书反映了我的经验:这里描述的每一个问题都是我个人经历过的,每一个建议的技术都是我在自己的编码中成功使用过的。


我不希望这本书成为软件设计的最后定论;我确信我错过了一些有价值的技巧,从长远来看,我的一些建议可能会变成糟糕的主意。然而,我希望这本书能够开启一个关于软件设计的对话。将本书中的思想与您自己的经验进行比较,然后自行决定这里描述的方法是否真的降低了软件的复杂性。这本书是一篇观点文章,所以有些读者会不同意我的一些建议。如果你不同意,试着去理解为什么。我感兴趣的是那些对你有用的东西,那些没用的东西,以及你对软件设计的其他想法。我希望接下来的对话将提高我们对软件设计的整体理解。我将把我学到的东西写进这本书的未来版本里。


与我沟通这本书的最好方式是发邮件到以下地址:

software-design-book@googlegroups.com


我对听到关于这本书的具体反馈很感兴趣,比如bug或改进建议,以及与软件设计相关的一般想法和经验。我特别感兴趣的是可以在本书未来版本中使用的引人注目的例子。最好的例子说明了一个重要的设计原则,并且简单到可以用一两段话来解释。如果你想知道其他人在电子邮件地址上说了什么,并参与讨论,你可以加入谷歌组软件设计书籍。


如果因为某种原因,软件设计书籍谷歌组将来应该消失,在网上搜索我的主页;它将包含如何沟通这本书的更新说明。请不要将与书籍相关的邮件发送到我的个人邮箱。


我建议你对这本书中的建议有所保留。总的目标是减少复杂性;这比你在这里读到的任何特定的原则或思想都要重要。如果你从这本书中尝试了一个想法,发现它并没有减少复杂性,那么不要觉得有义务继续使用它(但是,一定要让我知道你的经验;我想要得到关于什么可行什么不可行的反馈)。


许多人提出了批评或建议,以提高这本书的质量。以下这些人对这本书的不同版本提供了有益的意见:杰夫·迪恩、桑杰·格玛沃特、约翰·哈特曼、布莱恩·克尼汉、詹姆斯·科佩尔、艾米·奥斯特豪特、凯·奥斯特豪特、罗伯·派克、帕莎·兰加纳坦、基思·施瓦茨和亚历克斯·斯纳普斯。Christos Kozyrakis建议用“深”和“浅”来表示类和接口,而不是以前的“厚”和“薄”,这两个词有些模棱两可。我很感激CS 190的学生们;阅读他们的代码并与他们讨论代码的过程有助于明确我对设计的想法。

相关文章
|
2月前
|
开发者
从代码到哲学:编程中的思考与启示
【10月更文挑战第34天】在数字世界的编织中,每一行代码都蕴含着深邃的逻辑与创造的火花。本文通过探索编程的本质、代码与生活的关联、以及技术发展带来的社会影响,揭示编程不仅仅是技术的堆砌,更是人类智慧与哲学思考的体现。我们将一起走进代码的世界,发现那些隐藏在逻辑背后的哲理与人生启示。
|
3月前
|
算法
从代码到哲学:编程中的人生启示
【9月更文挑战第35天】在代码的世界中,我们不仅是在编写程序,更是在书写生活。每一行代码都蕴含着逻辑与美,每一个算法都承载着智慧与挑战。本文将通过编程的视角,探讨人生的意义、选择的重要性以及面对困难的态度,带你领略技术背后的深刻哲理。
|
2月前
|
机器学习/深度学习 人工智能 算法
编程之路:从代码到哲学的感悟
【10月更文挑战第42天】在编程的世界里,每一行代码都是思想的体现。本文将通过个人的技术成长经历,探讨如何从简单的代码编写进阶到对技术哲学的理解。我们将一起走进编程的内在世界,发现那些隐藏在键盘敲击背后的深刻意义。
|
1月前
|
算法
编程之旅:从代码到哲学
在这篇文章中,我们将踏上一段独特的旅程,探索编程不仅仅是一门技术,更是一种思考世界的方式。通过个人的技术感悟和代码示例,我们将一同发现如何将编程的原则应用于日常生活,以及这些原则如何帮助我们更好地理解周围的世界。这不仅是一个关于代码的学习过程,更是一次心灵的成长之旅。
|
2月前
|
开发者
从代码到哲学:我的编程之旅
在这段旅程中,我从一个对代码一无所知的新手成长为一个能够用代码解决问题的开发者。这不仅仅是技术的成长,更是我对生活、对世界理解的深化。编程,对我来说,已经超越了技术层面,成为了一种思考问题、解决问题的方法,甚至是一种生活方式。
|
2月前
|
存储 算法 数据库
从代码到哲学:探索编程中的思考与实践
【10月更文挑战第37天】在编程的世界里,我们不仅是在编写代码,更是在编织思维。每一行代码都是对问题解决方案的深思熟虑,每一个算法都是对逻辑思维的锻炼。编程不仅是一种技术活动,它同样是一种哲学的实践——通过代码来体现我们对世界的理解与改造。本文将带你走进编程的世界,探索那些隐藏在代码背后的深刻哲理。
|
2月前
|
算法 搜索推荐
探索编程之旅:从代码到哲学的思考
【10月更文挑战第38天】在数字世界的编织中,代码是构成万物的基石。本文将带领读者穿梭于编程实践与人生哲学之间,探讨如何通过技术实现自我提升,并反思在技术追求中我们究竟寻求的是什么。从一个简单的代码示例出发,我们将逐步展开对编程艺术、生活选择和宇宙意义的思考,最终回到甘地的名言,“你必须成为你希望在世界上看到的改变”,以此来启发读者找到自己技术之路上的初心与方向。
39 3
|
2月前
|
算法 JavaScript 前端开发
编程之旅:从代码到哲学的探索
【10月更文挑战第31天】在数字世界的编织中,每一行代码都是我们与机器对话的语言。本文将带领读者踏上一段从编写第一行代码到深入理解编程哲学的旅程。我们将探索编程如何不仅仅是技术的实践,更是对问题解决、逻辑思维乃至生活哲学的一种体现。通过深入浅出的例子和反思,本文旨在启发读者思考编程背后的更深层次意义,以及它如何塑造我们对世界的认识。
|
3月前
|
算法 程序员
从代码到哲学:编程中的启示与人生思考
在编写代码的过程中,我们不仅构建程序,也在无形中编织着生活的哲理。每一行代码都像是生命中的一步,它们共同构成了复杂而精彩的生命之旅。本文将从编程的角度出发,探讨技术实践中的深刻启示,以及这些启示如何影响我们对生活、工作和自我成长的理解。
|
3月前
从代码到人生:技术感悟与生活哲学
【10月更文挑战第3天】在编程的世界里,每一行代码都承载着逻辑与创造力的火花。正如印度圣雄甘地所言,我们必须成为我们期望在世界上看到的改变。本文将通过技术感悟探讨如何在生活中实现自我提升和目标达成,同时提供实用的代码示例来说明理论与实践的结合之道。

相关实验场景

更多