《程序员修炼之道》读书笔记

2017-08-10  本文已影响65人  白桦叶

前言

  1. 编程不存在某种最佳解决方案,我们应该注重失效,在拥有足够广博的背景和经验基础上,以保证能在特定情况下选择好的解决方案。
  2. 背景源自对计算机科学的基本原理理解,经验来自广泛的实际项目。

第1章 注重实效的哲学 1

1 我的源码让猫给吃了 2
2 软件的熵 3
3 石头汤与煮青蛙 5
4 足够好的软件 8
5 你的知识资产 10
6 交流 14

第2章 注重实效的途径 19

7 重复的危害 20

DRY:don't repeat yourself

强加的重复:

无意的重复:原因来自信息结构的不规范,一旦发现多个相互依赖的数据元素时,就需要考虑去重复的问题

无耐性的重复:

开发者之间的重复:通过高层设计避免

8 正交性 25

正交性:两条直线相交成直角,两条直线互不依赖, 沿着某条直线移动,投影到另外一条直线上的 位置不变
正交的好处:

9 可撤消性 33

不存在最终决策
为了达到可撤销性:需要灵活的架构,使用项CORBA技术能够将项目某些部分与语言分割开来。

10 曳光弹 36

先动手,然后观察各种反馈,立即改进
曳光开发与项目永不会结束的理念是一致的:总有改动需要完成,总有功能需要增加。这是一个渐进的过程。
曳光开发其实大家或多或少都在参与。新项目创建时搭建框架代码,逐渐为框架添加功能正是这样一个过程。我们会在框架中让关键流程能够运行,以检验新技术

曳光开发和原型模式有明显区别。原型中的代码是用过就扔的,寻求以最快的速度展示产品,甚至会采用更高级的语言。曳光代码虽然简约,但却是完成的,它拥有完整的错误检查与异常处理,只不过是功能不全而已。

优点:

曳光代码vs 原型制作

11 原型与便笺 40

原型制作与完全的制作对比成本低很多,举例轿车制作商可以为某种新车设计不同的原型,目的是测试轿车的具体方面-空气动力学,结构特征等。同样道理,软件产品也可以使用原型制作,利用不同材料制作原型,可以是白板上的图形、绘图工具绘制的产品图等等。但是,如果发现自己处于不能放弃细节的环境中,需要问自己是否采用该方法而转而使用曳光弹方法。

应制作原型的事物:

制作架构原型:

12 领域语言 43

靠近问题领域编程:旨在脱离具体的编程语言和平台,在需解决的实际问题领域中去尝试给出解决方案(伪代码)。
实现小型语言,并通过解析生成器生成不同编程语言的代码。如使用BNF(Backus-Naur Form 可用于递归地规定上下文无关的语法)

13 估算 48

学习估算,并将此技能发展到你对事物的 数量级有直觉的程度,你就能展现出一种魔法般的能力。

估算单位

估算来自问题提供的信息

第3章 基本工具 55

14 纯文本的威力 56

持久存储知识的最佳格式是纯文本

纯文本:由可打印字符组成,人可以直接阅读和理解其形式。纯文本也可以有结构,可以是xml,sgml,HTML和json。借助纯文本可以获得自描述(self-describing)

纯文本的缺点:

纯文本的优点:

15 shell游戏 60

虽然很多操作用GUI界面操作更直观方便,但是不能依赖它,因为GUI环境受限于设计者想要提供的能力。

需要投入精力熟悉shell命令,利用shell命令灵活地组织命令序列,高效地完成要做的事情。

16 强力编辑 63

最好精通一种编辑器,并将其用于所有编辑任务:代码、文档、备忘录、系统管理等等。
坚持使用一款编辑器,避免在不同编辑环境中切换,重新熟悉相应的编辑约定和命令带来的成本。
确保编辑器能在不同平台下使用:Emacs,vi、Crisp等

编辑器特性:

17 源码控制 67

无须多言

18 调试 69
19 文本操纵 77

这里的文本操纵语言是轻量级的,类似脚本语言,像perl、python等脚本语言能够进行网络访问,测试数据的生成、文本的解析操纵,生成web文档。

建议:学习一门文本操纵语言

20 代码生成器 80

如果有写代码重复了,那么就需要 编写能编写代码的代码

代码生成器的类型:

代码生成器并不是要很复杂,勇于尝试。

代码生成器不一定要生成代码

第4章 注重实效的偏执 85

21 按合约设计 86

DBC:契约式设计

断言:断言不可能发生的事情

程序不一定非得一个出口

22 死程序不说谎 95

早崩溃。不要破坏(trash),写入错误的数据

23 断言式编程 97

如果它不可能发生,用断言确保它不会发生。

断言时不要有副作用

24 何时使用异常 100

理解需求,异常是留给意外事件的

25 怎样配平资源 103

要有始有终:分配资源,使用它,释放它

嵌套的分配(一次性不只一个资源)

第5章 弯曲,或折断 111

26 解耦与得墨忒耳法则 112

遵循得墨忒耳法则虽然可以减少模块之间的依赖,但是会带来很多委托方法出现,不仅增加无关的代码,还影响代码的执行速度,所以需要根据不同的场景折衷,违反规范来赢取性能的改进。

27 元程序设计 117

???
元数据

28 时间耦合 121

一开始编程都是按照时间的顺序去进行。但是一旦需要并发时,就出现了麻烦。

利用UML的活动图,分析工作流。

29 它只是视图 127

我们基于分而治之的理念将程序分成若干个模块,但是怎么管理组织不同模块(类)之间依赖确实一个难题。

我们从事件(event)这个概念出发,将新变化发送给感兴趣的对象。、

假如通过一个 例程(例程是某个系统对外提供的功能接口或服务的集合。比如操作系统的API、服务等就是例程)来自百度百科。那么例程就需要知道各个对象之间的交互有密切的了解。显然,我们可以采用订阅/发布的模式让某个订阅者只接受它感兴趣的事件。

CORBA Event Service 允许参与对象通过事件信道(公共总线)发送和接受通知。

MVC(模型-视图=控制器)模式有效地让模型与GUI分离,又与管理视图的控件分离。

模型:表示图标对象的抽象数据模型。模型对任何视图或控制器都没有直接的了解
视图:解释模型的方式。它定业模型中的变化和来自控制器的逻辑事件
控制器:控制视图。并向模型提供新数据的途径。它既向模型也向视图发布事件。

仍然有耦合,情看下一节 黑板

30 黑板 134

将警探办案将线索信息张贴在黑板的例子指出黑板方法的特性:

对于复杂多变的工作流,我们可以黑板来协调。

在分布式类黑板系统JavaSpaces中的接口设计如下:

名称 功能
read 在空间中查找并获取数据
write 把数据项放入空间
take 与read类似,但同时从空间中移除该数据项
notify 设定每当写入与模版匹配的对象时就发出通知

第6章 当你编码时 139

31 靠巧合编程 140

为什么不能靠巧合编程(看起能工作):

深思熟虑地编程

32 算法速率 144

对于算法使用的资源。处理、内存进行估算。

O()表示法对我们度量的事物值设置了上限。

|一些常见的O()表示法 |
|---------------- |--- ---- |
|O(1)|常量型:数组访问|
|O(lg(n))|对数型:二分查找|
|O(n)|线性型 顺序查找|
|O(nlg(n))| 比线性差,对于 分而治之的算法(划分其输入,并独立在两个部分进行处理) 但不会差很多(快速排序、堆排序的平均运行时间)|
|O(n^2)|平方律型(选择和插入排序)|
|O(n^3)|立方型2nxn矩阵相乘|
|O(C^n)|指数型 旅行商问题|

虽然我们不用去设计编写排序等算法,但是 估算算法的阶 有利我们对自己编写的程序的运行情况有一定了解

33 重构 149

重构=重写+重做+重新架构

何时进行重构:

早重构,常重构

怎样重构:

34 易于测试的代码 153

单元测试:针对合约进行测试。

为测试而设计:

在设计模块甚至是单个例程时既设计其合约也设计测试该合约的代码。

35 邪恶的向导 160

不要使用你不理解的向导代码

#### 第7章 在项目开始之前 163

36 需求之坑 163

不要搜集需求,挖掘它们。

应该用明了的陈述句表达需求。有时候在陈述需求中会夹带着商业政策,而 商业政策是经常改变的。所以我们需要将商业政策与需求做区分。

在讨论用户界面时,需求、政策和实现之间区别可能会变的模糊不清。

重点
找出用户 为何做特定事情的原因,而不是他们目前做这件事情的方式。

建立需求文档:用use case(用例)来描述系统的特定用法。

相应的用例模板

抽象比细节活得更长久

维护项目的词汇表,利于沟通。

37 解开不可能解开的谜题 172

当遇到一个迷途难以解开的时候,解决的方法可能不在你现在思考的范围内。所以需要重新确定方法的约束,有些约束是绝对约束,而有些约束是先入为主。

不要在盒子外面思考-要找到盒子:我们需要确定问题的自由度,也就是约束
想想特洛伊木马

一定有更容易的方法

38 等你准备好 174

倾听反复出现的疑虑-等你准备好再开始

是良好的判断还是拖延

39 规范陷阱 176

对于有些事情,“做”胜于“描述”

40 圆圈与箭头 178

不做形式方法的奴隶

工具只是工具,要为我所用。

第8章 注重实效的项目 181

41 注重实效的团队 181
42 无处不在的自动化 186

不要手工

自动化:

43 无情的测试 191

早测试、常测试、自动测试

要到通过全部测试,编码才算结束。

测试什么

怎样测试:

44 全都是写 200

把闻到那股建里卖年,不要拴在外面

45 极大的期望 205

温和超出用户的需求

46 傲慢与偏见 208

在你的作品签名:为自己负责

上一篇 下一篇

猜你喜欢

热点阅读