








0
 00:00:00,280 --> 00:00:04,550
 今天呢,我们来看一个糊涂用语,文档
1
 00:00:07,810 --> 00:00:10,106
 我们经常听到这样的话
2
 00:00:10,106 --> 00:00:10,566
 3
 00:00:10,566 --> 00:00:13,322
 你们怎么一上手就写代码
4
 00:00:13,322 --> 00:00:14,930
 连个文档都没有
5
 00:00:16,130 --> 00:00:17,460
 或者问一个人
6
 00:00:17,770 --> 00:00:19,530
 你现在在做什么呀
7
 00:00:20,060 --> 00:00:21,970
 他说,我在写文档
8
 00:00:23,150 --> 00:00:23,466
 9
 00:00:23,466 --> 00:00:26,310
 或者有的人说,代码就是文档
10
 00:00:27,690 --> 00:00:31,400
 你看,这个文档就出现在类似这样的场合
11
 00:00:35,840 --> 00:00:36,690
 那么
12
 00:00:37,250 --> 00:00:40,110
 当前面这些,他说到文档的时候
13
 00:00:40,510 --> 00:00:42,070
 这个文档是什么呢
14
 00:00:42,620 --> 00:00:43,440
 15
 00:00:43,970 --> 00:00:45,430
 可能是这样的
16
 00:00:46,590 --> 00:00:51,590
 他把所做的工作分成两块
17
 00:00:52,180 --> 00:00:54,300
 一块是代码
18
 00:00:55,920 --> 00:00:57,470
 也就是最终
19
 00:00:57,790 --> 00:01:01,700
 交给计算机来编译运行的那个介质
20
 00:01:01,980 --> 00:01:03,820
 也就是人跟计算机接口的
21
 00:01:04,920 --> 00:01:10,230
 最终的介质,给计算机发命令那个介质
22
 00:01:12,200 --> 00:01:13,270
 这是代码
23
 00:01:16,330 --> 00:01:17,610
 而剩下的
24
 00:01:18,630 --> 00:01:20,340
 他通通叫文档
25
 00:01:20,730 --> 00:01:22,600
 所以文档的意思是
26
 00:01:22,880 --> 00:01:25,530
 代码之外的所有东西
27
 00:01:27,170 --> 00:01:28,830
 或者说,他把那个
28
 00:01:30,350 --> 00:01:32,760
 他用编码工具写的东西
29
 00:01:33,210 --> 00:01:35,220
 就是代码
30
 00:01:36,120 --> 00:01:37,791
 用编码工具之外的
31
 00:01:37,791 --> 00:01:38,000
 32
 00:01:38,000 --> 00:01:39,671
 比如说他用Word写的
33
 00:01:39,671 --> 00:01:41,970
 或者用别的什么工具写的
34
 00:01:42,490 --> 00:01:42,694
 35
 00:01:42,694 --> 00:01:45,550
 比如说用EA画图什么之类的
36
 00:01:46,640 --> 00:01:48,000
 那这叫文档
37
 00:01:49,600 --> 00:01:51,600
 编码之外的所有工作
38
 00:01:51,600 --> 00:01:54,200
 或者非编码工具产出的东西
39
 00:01:55,660 --> 00:01:58,210
 但是这个是不对的
40
 00:02:02,860 --> 00:02:04,250
 那另外一种
41
 00:02:04,870 --> 00:02:06,830
 或者刚才这一种
42
 00:02:07,860 --> 00:02:09,620
 这样的一种想法
43
 00:02:10,340 --> 00:02:11,720
 它本质上
44
 00:02:12,500 --> 00:02:13,930
 是把代码
45
 00:02:14,430 --> 00:02:16,710
 放在了最核心的位置
46
 00:02:20,080 --> 00:02:21,365
 然后呢
47
 00:02:21,365 --> 00:02:22,650
 把文档
48
 00:02:23,310 --> 00:02:25,020
 看作是代码的
49
 00:02:25,310 --> 00:02:27,430
 某些概要视图
50
 00:02:28,920 --> 00:02:30,985
 所以呢,在他的大脑里面
51
 00:02:30,985 --> 00:02:34,910
 这个文档那个文档无非是什么
52
 00:02:35,820 --> 00:02:39,040
 不同级别的代码的视图而已
53
 00:02:40,220 --> 00:02:41,580
 不同角度
54
 00:02:41,860 --> 00:02:43,820
 不同级别的代码视图
55
 00:02:44,760 --> 00:02:45,920
 那很多人
56
 00:02:46,740 --> 00:02:51,095
 在他大脑里面,文档扮演的是这样一个角色
57
 00:02:51,095 --> 00:02:52,930
 但是这个是错的
58
 00:02:54,370 --> 00:02:56,250
 那像这样的误解
59
 00:02:56,250 --> 00:02:59,305
 不只是一般的开发人员会有
60
 00:02:59,305 --> 00:03:01,655
 包括一些有名的名人
61
 00:03:01,655 --> 00:03:02,830
 比如Martin Fowler
62
 00:03:04,520 --> 00:03:06,830
 他也会有这样误解
63
 00:03:06,830 --> 00:03:10,681
 你看他在《UML精粹》这个书里面
64
 00:03:10,681 --> 00:03:11,708
 他说了
65
 00:03:11,708 --> 00:03:14,789
 UML有三种使用的方式
66
 00:03:14,789 --> 00:03:16,072
 有草稿的
67
 00:03:16,072 --> 00:03:18,640
 蓝图的、编程语言的
68
 00:03:21,600 --> 00:03:23,590
 实际上是把它看作是什么
69
 00:03:23,920 --> 00:03:25,279
 把UML也好
70
 00:03:25,279 --> 00:03:26,185
 什么也好
71
 00:03:26,185 --> 00:03:28,451
 看作是代码的一个视图而已
72
 00:03:28,451 --> 00:03:30,264
 代码是核心
73
 00:03:30,264 --> 00:03:30,490
 74
 00:03:30,490 --> 00:03:32,530
 其他的就是它的视图
75
 00:03:32,810 --> 00:03:34,552
 无非是粗糙一点的
76
 00:03:34,552 --> 00:03:36,076
 精细一点的视图
77
 00:03:36,076 --> 00:03:36,730
 对不对
78
 00:03:38,200 --> 00:03:38,417
 79
 00:03:38,417 --> 00:03:39,720
 但这个是错的
80
 00:03:40,000 --> 00:03:42,425
 Fowler他擅长的是什么
81
 00:03:42,425 --> 00:03:46,064
 C和D,我们说ABCD嘛
82
 00:03:46,064 --> 00:03:47,520
 业务建模、需求、分析、设计
83
 00:03:47,890 --> 00:03:49,760
 他擅长分析和设计
84
 00:03:51,210 --> 00:03:52,330
 A和B
85
 00:03:52,680 --> 00:03:53,801
 擅长不擅长
86
 00:03:53,801 --> 00:03:54,473
 不知道
87
 00:03:54,473 --> 00:03:56,940
 但我没有见过他写的那些
88
 00:03:57,350 --> 00:03:59,124
 怎么做业务建模
89
 00:03:59,124 --> 00:04:01,119
 做需求的文章没有
90
 00:04:01,119 --> 00:04:02,893
 书也没有
91
 00:04:02,893 --> 00:04:04,002
 都是说什么
92
 00:04:04,002 --> 00:04:05,998
 我要做一个什么系统
93
 00:04:05,998 --> 00:04:09,990
 然后就开始,里面有哪些类什么之类的
94
 00:04:11,540 --> 00:04:13,453
 这系统怎么样好卖
95
 00:04:13,453 --> 00:04:15,791
 怎么样去描述这个需求
96
 00:04:15,791 --> 00:04:17,280
 怎么样怎么样
97
 00:04:18,190 --> 00:04:24,300
 Fowler应该是很少看到他有这方面的阐述
98
 00:04:26,720 --> 00:04:26,977
 99
 00:04:26,977 --> 00:04:28,525
 不只是Fowler了
100
 00:04:28,525 --> 00:04:28,782
 101
 00:04:28,782 --> 00:04:30,330
 其他的像那个
102
 00:04:30,660 --> 00:04:32,873
 一些著名的敏捷的书也是
103
 00:04:32,873 --> 00:04:35,938
 一开始就说我要做一个什么系统
104
 00:04:35,938 --> 00:04:36,790
 功能是这个
105
 00:04:37,070 --> 00:04:39,040
 也就是说,需求都已经确定了
106
 00:04:39,040 --> 00:04:40,830
 然后再说我打算怎么做
107
 00:04:40,830 --> 00:04:41,010
 108
 00:04:42,820 --> 00:04:44,970
 那就已经到C和D了
109
 00:04:45,570 --> 00:04:47,270
 AB不擅长
110
 00:04:49,060 --> 00:04:52,070
 那像这样的误解有什么危害呢
111
 00:04:53,300 --> 00:04:54,460
 危害就是
112
 00:04:54,790 --> 00:04:56,170
 思维颠倒
113
 00:04:58,760 --> 00:05:01,290
 会让开发人员,他会怎么做
114
 00:05:01,290 --> 00:05:02,440
 他先拍脑袋
115
 00:05:02,440 --> 00:05:03,360
 先写代码
116
 00:05:04,660 --> 00:05:05,446
 然后呢
117
 00:05:05,446 --> 00:05:09,380
 再从实现去反推其他工作流的内容
118
 00:05:11,130 --> 00:05:13,890
 那这种我经常碰到的
119
 00:05:14,170 --> 00:05:15,880
 像右边这个场景
120
 00:05:15,880 --> 00:05:18,445
 就是我经常碰到的一种情况
121
 00:05:18,445 --> 00:05:21,010
 比如说,我跟那个开发人员说
122
 00:05:21,750 --> 00:05:23,026
 根据愿景什么的
123
 00:05:23,026 --> 00:05:25,260
 你这个系统不需要有这个用例的
124
 00:05:25,650 --> 00:05:27,500
 或者说不需要有这个功能的
125
 00:05:27,790 --> 00:05:28,014
 开发人员说
126
 00:05:28,014 --> 00:05:28,462
 127
 00:05:28,462 --> 00:05:28,910
 128
 00:05:29,190 --> 00:05:30,627
 有的,我都写好了
129
 00:05:30,627 --> 00:05:34,118
 你看,我运行给你看,系统就有这个功能
130
 00:05:34,118 --> 00:05:35,350
 就有这个用例
131
 00:05:37,440 --> 00:05:40,034
 系统应不应该有这个用例
132
 00:05:40,034 --> 00:05:42,157
 应该从什么来看
133
 00:05:42,157 --> 00:05:43,808
 从卖的角度来看
134
 00:05:43,808 --> 00:05:44,280
 你从
135
 00:05:44,790 --> 00:05:46,892
 业务流程的角度看
136
 00:05:46,892 --> 00:05:48,995
 系统提供这个功能
137
 00:05:48,995 --> 00:05:50,310
 提供这个用例
138
 00:05:50,640 --> 00:05:53,660
 到底有没有给我们的组织带来好处
139
 00:05:54,480 --> 00:05:58,210
 涉众的利益有没有得到改善
140
 00:05:58,950 --> 00:06:01,510
 从这个角度,该有就有,没有就没有
141
 00:06:01,510 --> 00:06:02,059
 对不对
142
 00:06:02,059 --> 00:06:04,436
 不是说你写好了代码,能运行了
143
 00:06:04,436 --> 00:06:06,082
 所以它就有这个功能
144
 00:06:06,082 --> 00:06:07,180
 不是这样的
145
 00:06:10,660 --> 00:06:13,244
 那另外一种就是这个
146
 00:06:13,244 --> 00:06:15,570
 比如说,我评审那个
147
 00:06:15,850 --> 00:06:17,610
 开发人员的
148
 00:06:18,430 --> 00:06:21,271
 类的设计
149
 00:06:21,271 --> 00:06:22,850
 然后呢
150
 00:06:23,130 --> 00:06:25,910
 我就说,这两个类关系不应该是泛化
151
 00:06:25,910 --> 00:06:27,300
 应该是关联才对的
152
 00:06:29,090 --> 00:06:31,015
 然后开发人员就说,是泛化的
153
 00:06:31,015 --> 00:06:32,940
 你不信,我打开代码给你看
154
 00:06:32,940 --> 00:06:34,690
 代码,你看我都写了
155
 00:06:35,140 --> 00:06:37,198
 A扩展B
156
 00:06:37,198 --> 00:06:38,570
 A继承B
157
 00:06:39,110 --> 00:06:40,750
 你看,不是泛化吗
158
 00:06:41,900 --> 00:06:42,573
 你再不信
159
 00:06:42,573 --> 00:06:44,930
 我把它逆转成UML类图给你看
160
 00:06:45,400 --> 00:06:47,846
 你都先写好代码了
161
 00:06:47,846 --> 00:06:49,750
 说人是猪的一种
162
 00:06:50,990 --> 00:06:51,715
 写好了
163
 00:06:51,715 --> 00:06:53,650
 而且编译运行了
164
 00:06:54,060 --> 00:06:54,612
 然后呢
165
 00:06:54,612 --> 00:06:55,716
 再从这个反推
166
 00:06:55,716 --> 00:06:57,189
 你看,我代码都写了
167
 00:06:57,189 --> 00:06:58,478
 人是猪的一种嘛
168
 00:06:58,478 --> 00:07:01,240
 所以呢,我图里面画,人是猪的一种
169
 00:07:02,540 --> 00:07:03,760
 那是没错的
170
 00:07:06,560 --> 00:07:06,770
 171
 00:07:06,770 --> 00:07:08,450
 很多人会这样想
172
 00:07:08,450 --> 00:07:09,290
 包括你看
173
 00:07:09,920 --> 00:07:13,970
 我们现在经常看到一些领域系统设计的文章
174
 00:07:14,690 --> 00:07:16,583
 整篇文章就是泛泛而谈
175
 00:07:16,583 --> 00:07:17,530
 胡说八道的
176
 00:07:17,820 --> 00:07:19,050
 什么也没说
177
 00:07:20,130 --> 00:07:21,684
 但你不服不行哦
178
 00:07:21,684 --> 00:07:22,794
 人家有代码
179
 00:07:22,794 --> 00:07:25,680
 一开始就给你一个代码的链接
180
 00:07:26,040 --> 00:07:26,790
 181
 00:07:27,070 --> 00:07:29,220
 他有代码哦
182
 00:07:30,450 --> 00:07:32,290
 你看,我代码都写好了
183
 00:07:32,650 --> 00:07:34,275
 你代码写好能运行了
184
 00:07:34,275 --> 00:07:35,720
 能说明什么问题
185
 00:07:36,060 --> 00:07:39,670
 能说明你这里面逻辑的组织是合理的吗
186
 00:07:40,220 --> 00:07:42,040
 能说明你这个需求
187
 00:07:42,750 --> 00:07:44,366
 的推导是正确的吗
188
 00:07:44,366 --> 00:07:45,174
 不能的
189
 00:07:45,174 --> 00:07:45,780
 对不对
190
 00:07:45,780 --> 00:07:46,992
 那我们很多人
191
 00:07:46,992 --> 00:07:48,810
 因为他只会写代码
192
 00:07:50,420 --> 00:07:51,053
 然后呢
193
 00:07:51,053 --> 00:07:52,531
 随便拍脑袋
194
 00:07:52,531 --> 00:07:54,220
 写一段代码,能运行了
195
 00:07:54,220 --> 00:07:55,910
 他就以这个来证明
196
 00:07:56,540 --> 00:07:59,084
 他前面的工作都是对的
197
 00:07:59,084 --> 00:08:00,010
 不行的
198
 00:08:03,390 --> 00:08:06,306
 所以呢,这里面的区别在于什么
199
 00:08:06,306 --> 00:08:08,550
 我们要学会从ABCD
200
 00:08:09,460 --> 00:08:10,613
 这样来判断
201
 00:08:10,613 --> 00:08:12,460
 我们思考的内容
202
 00:08:12,740 --> 00:08:13,522
 业务建模
203
 00:08:13,522 --> 00:08:14,696
 需求、分析、设计
204
 00:08:14,696 --> 00:08:17,630
 这样来思考我们的内容,不要看形式
205
 00:08:18,800 --> 00:08:20,619
 不能说,我正在编码
206
 00:08:20,619 --> 00:08:21,983
 我正在敲代码
207
 00:08:21,983 --> 00:08:24,030
 所以呢,我做的就是D
208
 00:08:24,500 --> 00:08:24,715
 209
 00:08:24,715 --> 00:08:26,006
 设计,不一定的
210
 00:08:26,006 --> 00:08:28,589
 很可能你这时候想的是需求
211
 00:08:28,589 --> 00:08:29,020
 对吧
212
 00:08:29,340 --> 00:08:30,626
 可能想的是分析
213
 00:08:30,626 --> 00:08:32,280
 可能甚至是业务建模
214
 00:08:35,840 --> 00:08:37,130
 而且怎么样
215
 00:08:37,410 --> 00:08:39,390
 即使你唯一的工具
216
 00:08:40,410 --> 00:08:42,010
 是编码的工具
217
 00:08:42,490 --> 00:08:45,932
 并不代表说你不能用编码工具来写需求
218
 00:08:45,932 --> 00:08:46,540
 对不对
219
 00:08:46,540 --> 00:08:48,970
 你把整个系统作为研究对象
220
 00:08:49,470 --> 00:08:50,070
 221
 00:08:50,490 --> 00:08:51,613
 那什么是需求
222
 00:08:51,613 --> 00:08:53,299
 需求就是系统的功能嘛
223
 00:08:53,299 --> 00:08:57,420
 系统的责任,你把整个系统作为研究对象来写代码
224
 00:08:57,700 --> 00:08:59,620
 那它暴露的那个
225
 00:09:00,340 --> 00:09:00,911
 服务
226
 00:09:00,911 --> 00:09:03,198
 暴露的接口不就是系统的需求吗
227
 00:09:03,198 --> 00:09:03,770
 对不对
228
 00:09:05,910 --> 00:09:08,487
 如果你只有代码工具
229
 00:09:08,487 --> 00:09:10,550
 你也可以在代码里面表达需求
230
 00:09:11,660 --> 00:09:14,460
 只要你研究或者思考的问题
231
 00:09:14,760 --> 00:09:16,830
 是需求的问题就可以
232
 00:09:17,570 --> 00:09:18,430
 同样
233
 00:09:19,270 --> 00:09:21,500
 你看到有人在画UML图
234
 00:09:21,780 --> 00:09:22,430
 235
 00:09:23,090 --> 00:09:24,630
 那他一定就是做分析
236
 00:09:25,490 --> 00:09:27,241
 做需求,做什么吗
237
 00:09:27,241 --> 00:09:28,020
 不一定的
238
 00:09:28,300 --> 00:09:32,500
 很可能这个UML图就是它的代码
239
 00:09:32,780 --> 00:09:32,974
 240
 00:09:32,974 --> 00:09:34,530
 比如说,他用Rhapsody
241
 00:09:34,810 --> 00:09:36,470
 来画状态机图
242
 00:09:36,470 --> 00:09:37,300
 画完了
243
 00:09:38,040 --> 00:09:40,320
 然后仿真
244
 00:09:40,600 --> 00:09:41,550
 没问题了
245
 00:09:41,830 --> 00:09:44,083
 他就直接运行了
246
 00:09:44,083 --> 00:09:44,760
 对不对
247
 00:09:45,330 --> 00:09:47,480
 他不用去写那个文本的代码
248
 00:09:47,480 --> 00:09:49,810
 文本代码都已经隐藏在后面了
249
 00:09:49,810 --> 00:09:49,989
 250
 00:09:49,989 --> 00:09:53,752
 背后的C/C++代码都隐藏在状态机后面了
251
 00:09:53,752 --> 00:09:56,978
 他所有的逻辑都在状态机上表达的嘛
252
 00:09:56,978 --> 00:09:58,950
 这个时候,所谓的状态机图
253
 00:09:59,330 --> 00:10:00,900
 就已经是代码了
254
 00:10:00,900 --> 00:10:02,470
 因为它是这个人
255
 00:10:02,750 --> 00:10:03,650
 和
256
 00:10:04,030 --> 00:10:05,150
 计算机
257
 00:10:05,500 --> 00:10:06,630
 交接的
258
 00:10:07,060 --> 00:10:08,131
 那个介质了
259
 00:10:08,131 --> 00:10:14,560
 最终的介质,因为人并不需要再去编辑C/C++文本
260
 00:10:15,460 --> 00:10:16,570
 261
 00:10:19,790 --> 00:10:22,331
 所以呢,我们了解了这个之后
262
 00:10:22,331 --> 00:10:25,460
 就不要再说我在写文档这种废话了
263
 00:10:26,020 --> 00:10:26,900
 264
 00:10:27,180 --> 00:10:28,433
 这种意思是
265
 00:10:28,433 --> 00:10:30,939
 我正在用Word来工作而已
266
 00:10:30,939 --> 00:10:31,190
 267
 00:10:31,470 --> 00:10:33,188
 你要说内容
268
 00:10:33,188 --> 00:10:34,692
 我在做业务建模
269
 00:10:34,692 --> 00:10:38,130
 我在思考需求问题,要这样说
270
 00:10:38,410 --> 00:10:38,944
 然后呢
271
 00:10:38,944 --> 00:10:41,258
 你在上面加一些废话也可以的
272
 00:10:41,258 --> 00:10:42,860
 我在写业务建模文档
273
 00:10:43,140 --> 00:10:43,487
 274
 00:10:43,487 --> 00:10:45,570
 这也可以对吧
275
 00:10:45,850 --> 00:10:47,565
 或者你加多点废话
276
 00:10:47,565 --> 00:10:51,211
 我在写需求文档规约说明书,都可以
277
 00:10:51,211 --> 00:10:53,355
 至少内容这个要有
278
 00:10:53,355 --> 00:10:54,427
 这个下划线
279
 00:10:54,427 --> 00:10:55,500
 这个要有,你在干嘛
280
 00:10:55,780 --> 00:10:56,044
 281
 00:10:56,044 --> 00:10:58,690
 要有内容在里面
282
 00:10:59,010 --> 00:10:59,197
 283
 00:10:59,197 --> 00:11:00,880
 你这个形式什么
284
 00:11:02,090 --> 00:11:02,891
 都好说
285
 00:11:02,891 --> 00:11:03,493
 内容
286
 00:11:03,493 --> 00:11:05,498
 你难道你不写文档不行吗
287
 00:11:05,498 --> 00:11:06,901
 我嘴巴说不行吗
288
 00:11:06,901 --> 00:11:09,708
 我嘴巴描述一下我们组织的流程
289
 00:11:09,708 --> 00:11:10,910
 那也是建模
290
 00:11:10,910 --> 00:11:11,512
 对不对
291
 00:11:11,512 --> 00:11:13,316
 那也是在做业务建模
292
 00:11:13,316 --> 00:11:15,922
 我嘴巴说一下系统有什么功能
293
 00:11:15,922 --> 00:11:17,727
 那也是在做需求的
294
 00:11:17,727 --> 00:11:20,734
 不一定要写一个文档或者画一个图
295
 00:11:20,734 --> 00:11:20,934
 296
 00:11:20,934 --> 00:11:23,140
 关键你讲的内容是什么
297
 00:11:23,560 --> 00:11:24,968
 把内容加上
298
 00:11:24,968 --> 00:11:26,780
 不要说那个形式