- 同一个系统可以采用许多不同的方式来构建,这些方式不一定要有优劣之分。
- 优秀的程序员知道他们是如何编程的——构成他们工作的方法和实践。
- 编码的风格描述了软件问题是如何安排解决的,以及它的解决方案是如何分解并使用目标语言来构建模型的,编码风格确定了我们如何将一个项目分割成许多可管理的小块,它适用于表达代码意图的设计泛型。
- 编码风格主要分为两类:命令式和声明声明式。
- 命令式语言允许你明确指定为生成程序输出而执行一系列步骤的顺序。
- 声明式语言使用推理规则来描述变量之间的关系,语言执行器对这些规则应用某种固定的算法来得到结果。
- 你所选择的编程语言将在一定程度上决定你的设计风格,但是编程语言并不是最终的决定因素。
- 结构化编程是一种常见的命令式语言,它是一种以控制为中心的模型,运用自顶向下的设计技术。
- 层次结构系统似乎具有一个特性,即在一个层次上被当做不可分割的实体,在下一个更细致的层次上将被当做一个可拆分的符合对象。
- 结构化设计的特征:1. 每一步分解都应该在程序员的智力理解的范围内进行;2. 应该对控制流进行很好的管理;3. 通过功能块内使用循环结构和条件语句,来提供代码结构。
- 面向对象的程序设计是一个以数据为中心的模型,我们考虑数据的生命以及它们移动的方式,而不是完成任务所需的那些步骤的顺序。
- 面向对象编程的特点:1. 抽象;2. 封装;3. 继承;4. 多态。
- 函数式编程是一种声明式的编程风格,它一般都很紧致和优雅,但是很好是编译型的,所以它们依赖于语言的执行器。
- 逻辑编程是另外一种声明式的风格,在这种编码风格中,你向执行器提供一组公理和一个目标陈述,一组内建的推理规则将用来确定公理是否足以确保目标陈述的真实性。一般是在人工智能领域使用。
- 我们的软件开发工作是由我们使用的风格和过程塑造的,它们对我们代码的外形和质量有着不可避免的影响。
我们通常使用的软件开发过程包括: - 混乱。没有任何过程或者正式文件,每个人都按照他自己的日程安排行事。如果没有开发过程,你的团队就处在一种无政府状态中,你的软件将由运气而不是目的来决定。
- 瀑布模型。这是一种典型的软件开发生命周期模型,实际上所有其他开发过程都以某种方式基于这种模型。瀑布模型一般不用于大型项目的开发,它最适合两个星期的项目。
- SSADM和PRINCE(Structured Systems Analysis and Design Methodology),包括分析和设计,而不包括实现和测试,是一种定义良好的开放式标准。(Projects In a Controlled Environment)定义一个重量级的、以文档为中心的模型。
- V模型。与瀑布模型相比,优势在于测试可以和开发并行展开。
- 原型设计。原型设计过程的本质是创建许多用后可扔掉的软件系统原型。原型是概念证明的、非常高效和稳定,或者完整功能集并不是主要的焦点。它有助于管理我们的风险。
- 迭代和增量开发。这种过程适合于在开始时需求不容易理解的项目。
- 螺旋模型。开发过程将建模成一个像螺旋的形状,它从中心开始,向外展开,进行过程后面的阶段。通过这种过程,功能将按照优先级逐渐降低的顺序进行定义和实现,最重要的功能要尽可能早的创建,这是一种管理风险的方式,它是一种非常注重实效的方法,程序员们将不会花费80%的时间用于不重要的20%的功能上。
- 敏捷。它致力于敏捷和减少风险,而不是长期的计划或强制的可预测。它最适合较小的项目,适合需求常常变更的领域。
- 软件过程确保了测试不会被遗忘,而是在开发过程中持续的进行,并受到监视。
- 你采用的过程并不需要是高度仪式化的或者难以遵循的,实际上,相反的特征恰恰是好的过程的特质,但是你必须有一个定义良好的过程。
- 良好的过程选择基于项目的类型和规模,一个优秀的过程选择适合现有团队成员的经验,开发人员愿意使用,并且是项目经理真正理解的。
- 一个不适当的过程真的会毁掉你的代码的质量,过程至关重要,大多数项目都因为非技术原因失败,糟糕的过程总是在失败原因列表的前几位。
- 构建软件就像犯罪一样:当有组织时,就会做得更好。
- 优秀的程序员:1. 理解他们要使用的编码风格和开发过程;2. 利用他们的开发过程来与其他软件工厂的居民进行交互,当过程成为一种约束时,他们会避开;3. 了解不同的开发方法的优点和缺点,并且对于任何给定的情况都能选择恰当的方法。
- 糟糕的程序员:1. 忽略开发过程问题,试图按照自己的方法来做;2. 并不知道形成他们与其他开发人员的交互方式和过程;3. 避免思考这些东西——这是经理们应该考虑的。