17
00:00:49,240 --> 00:00:53,980
状态机内容,比UML那个课更详细一点
18
00:00:55,500 --> 00:00:56,862
行为建模
19
00:00:56,862 --> 00:00:58,680
幻灯片里面也有
20
00:00:59,520 --> 00:01:04,320
但是呢,可能只有大概一个多小时的时间
21
00:01:06,610 --> 00:01:09,031
那我们这个课程呢
22
00:01:09,031 --> 00:01:09,940
我们就
23
00:01:11,960 --> 00:01:14,740
讲得要更细,也更深一些
24
00:01:15,020 --> 00:01:15,228
25
00:01:15,228 --> 00:01:18,350
就相当于在之前的内容的基础上
26
00:01:19,150 --> 00:01:21,750
再进一步的细化
27
00:01:22,030 --> 00:01:23,450
和强化
28
00:01:24,940 --> 00:01:25,365
当然
29
00:01:25,365 --> 00:01:27,280
如果没有听过之前的课程
30
00:01:27,610 --> 00:01:29,210
也没关系的
31
00:01:29,550 --> 00:01:29,819
32
00:01:29,819 --> 00:01:32,240
这个课也不影响我们
33
00:01:32,560 --> 00:01:35,050
大家从这个课开始来理解
34
00:01:35,370 --> 00:01:36,480
和学习
35
00:01:41,980 --> 00:01:44,270
那状态机这个的话
36
00:01:45,440 --> 00:01:48,200
平时我们常见的,就是说
37
00:01:48,480 --> 00:01:51,170
以现在的
38
00:01:51,450 --> 00:01:52,427
观察来说
39
00:01:52,427 --> 00:01:57,560
常见的,实际上并不是我们的软件开发这个领域
40
00:01:58,110 --> 00:02:00,220
而是其他的一些领域
41
00:02:00,500 --> 00:02:00,763
42
00:02:00,763 --> 00:02:02,080
比如说
43
00:02:03,070 --> 00:02:06,170
计算机科学
44
00:02:06,450 --> 00:02:08,078
的基础理论
45
00:02:08,078 --> 00:02:10,250
像学校
46
00:02:10,860 --> 00:02:12,790
针对相关专业
47
00:02:12,790 --> 00:02:14,720
都会有一些基础课嘛
48
00:02:14,720 --> 00:02:17,080
那其中有一门形式语言
49
00:02:17,780 --> 00:02:19,270
与自动机
50
00:02:21,180 --> 00:02:22,190
那这个
51
00:02:22,470 --> 00:02:24,100
里面实际上就是
52
00:02:25,080 --> 00:02:26,390
状态的
53
00:02:26,670 --> 00:02:27,550
理论
54
00:02:29,920 --> 00:02:30,980
这个里面
55
00:02:38,040 --> 00:02:43,270
那另外一个经常出现的是电子工程
56
00:02:45,400 --> 00:02:47,860
像数字电路设计等等
57
00:02:49,460 --> 00:02:49,675
58
00:02:49,675 --> 00:02:51,400
基于有限状态机的
59
00:02:52,940 --> 00:02:54,800
包括一些那个
60
00:02:55,830 --> 00:02:58,003
工具的软件等等
61
00:02:58,003 --> 00:03:00,176
电路设计的软件等等
62
00:03:00,176 --> 00:03:04,040
都是上面有大量的状态机的功能
63
00:03:07,260 --> 00:03:10,820
那这些都是跟我们软件开发呀
64
00:03:11,870 --> 00:03:13,110
没有
65
00:03:14,220 --> 00:03:15,750
直接关系的
66
00:03:18,690 --> 00:03:21,420
那在软件上面的话
67
00:03:22,290 --> 00:03:27,400
我们往往能够观察到的,经常出现的就是嵌入式系统
68
00:03:30,740 --> 00:03:31,910
里面会
69
00:03:32,190 --> 00:03:33,870
用到状态机
70
00:03:41,580 --> 00:03:42,910
但是对于
71
00:03:45,220 --> 00:03:46,790
更多人做的系统
72
00:03:47,440 --> 00:03:52,640
像企业应用,互联网应用等等
73
00:03:53,100 --> 00:03:56,500
我们很多人做的,实际上用的并不多
74
00:03:58,270 --> 00:03:58,564
75
00:03:58,564 --> 00:03:59,742
大多数程序员
76
00:03:59,742 --> 00:04:01,510
你问他状态机
77
00:04:01,790 --> 00:04:02,956
什么什么什么
78
00:04:02,956 --> 00:04:03,540
他可能
79
00:04:05,930 --> 00:04:06,900
并不知道
80
00:04:08,020 --> 00:04:08,251
81
00:04:08,251 --> 00:04:10,800
即使他以前是计算机专业
82
00:04:11,760 --> 00:04:12,690
出来的
83
00:04:14,310 --> 00:04:15,543
上学时候学过
84
00:04:15,543 --> 00:04:18,217
但实际上工作几年也忘记了
85
00:04:18,217 --> 00:04:19,451
因为在工作中
86
00:04:19,451 --> 00:04:22,330
如果他是做企业应用之类的
87
00:04:22,330 --> 00:04:23,153
互联网应用
88
00:04:23,153 --> 00:04:23,770
他可能
89
00:04:24,430 --> 00:04:25,650
也接触不到
90
00:04:28,460 --> 00:04:29,096
然后呢
91
00:04:29,096 --> 00:04:30,370
你问他状态机
92
00:04:30,370 --> 00:04:31,220
他可能也
93
00:04:31,630 --> 00:04:35,040
不知道或想不起来是个什么东西了
94
00:04:35,910 --> 00:04:37,050
反倒是
95
00:04:37,330 --> 00:04:38,500
电子工程师
96
00:04:39,030 --> 00:04:39,256
97
00:04:39,256 --> 00:04:41,520
在工作中会大量的使用
98
00:04:45,090 --> 00:04:47,190
所以呢,我们这个课程的话
99
00:04:48,790 --> 00:04:49,990
就是探讨
100
00:04:49,990 --> 00:04:52,870
就是说,怎样在软件开发里面
101
00:04:54,350 --> 00:04:56,630
能够把它用上
102
00:04:57,550 --> 00:04:59,214
在适当的场合
103
00:04:59,214 --> 00:04:59,690
用上
104
00:05:00,190 --> 00:05:03,480
来改善我们软件开发的一些质量
105
00:05:11,090 --> 00:05:15,570
这是我们说的,状态机的现状
106
00:05:17,340 --> 00:05:19,840
实际上在我们大多数
107
00:05:20,370 --> 00:05:22,790
软件开发人员里面用的并不多
108
00:05:23,070 --> 00:05:23,317
109
00:05:23,317 --> 00:05:27,770
除了刚才讲的,就是做一些实时嵌入系统的
110
00:05:29,150 --> 00:05:30,870
实际上也未必
111
00:05:31,490 --> 00:05:32,380
就用
112
00:05:32,380 --> 00:05:33,270
因为
113
00:05:33,550 --> 00:05:35,280
很多嵌入式系统
114
00:05:35,560 --> 00:05:37,580
也没有在用状态机
115
00:05:43,810 --> 00:05:44,800
因为
116
00:05:45,210 --> 00:05:46,488
如果是用的话
117
00:05:46,488 --> 00:05:48,193
他肯定要用工具嘛
118
00:05:48,193 --> 00:05:48,620
对吧
119
00:05:48,930 --> 00:05:50,917
用工具他就得用
120
00:05:50,917 --> 00:05:54,040
比如说,一些状态机工具
121
00:05:54,320 --> 00:05:55,890
不管你是不是在
122
00:05:56,170 --> 00:06:00,227
普遍UML工具还是专门画状态机的
123
00:06:00,227 --> 00:06:05,240
UML工具像EA、Rhapsody、MagicDraw
124
00:06:05,660 --> 00:06:06,910
如果是
125
00:06:07,540 --> 00:06:09,226
专门画状态机的
126
00:06:09,226 --> 00:06:11,333
什么Visual State
127
00:06:11,333 --> 00:06:13,020
只能画状态机
128
00:06:15,730 --> 00:06:16,404
129
00:06:16,404 --> 00:06:18,202
他如果要用状态机
130
00:06:18,202 --> 00:06:21,348
他肯定会用到这样一些工具来画
131
00:06:21,348 --> 00:06:23,820
然后帮助生成代码什么的
132
00:06:23,820 --> 00:06:24,270
但实际上
133
00:06:24,840 --> 00:06:26,520
我们去观察的话
134
00:06:26,520 --> 00:06:26,760
135
00:06:27,330 --> 00:06:29,330
即使他做嵌入式软件
136
00:06:29,330 --> 00:06:30,130
他用的
137
00:06:30,510 --> 00:06:32,320
比例也并不大
138
00:06:35,610 --> 00:06:37,700
那为什么是这样
139
00:06:38,370 --> 00:06:38,636
140
00:06:38,636 --> 00:06:39,700
这个的话
141
00:06:40,980 --> 00:06:41,960
142
00:06:42,450 --> 00:06:44,488
不只是状态机
143
00:06:44,488 --> 00:06:47,800
像别的UML相关的一些
144
00:06:48,410 --> 00:06:50,980
建模的元素,用得实际上
145
00:06:51,260 --> 00:06:53,420
也并不多,也并不是很好
146
00:06:53,420 --> 00:06:54,140
这是一个
147
00:06:54,640 --> 00:06:56,030
普遍的现象
148
00:06:56,310 --> 00:06:58,412
我们之前也说过很多遍了
149
00:06:58,412 --> 00:06:59,560
它是有门槛的
150
00:07:00,020 --> 00:07:01,590
很多人实际上
151
00:07:02,290 --> 00:07:04,315
这个门槛并没有跨过去
152
00:07:04,315 --> 00:07:06,340
并没有咬咬牙去掌握它
153
00:07:08,480 --> 00:07:09,620
第二个
154
00:07:09,900 --> 00:07:10,272
155
00:07:10,272 --> 00:07:11,390
可能
156
00:07:11,930 --> 00:07:13,069
很多情况下
157
00:07:13,069 --> 00:07:15,119
我们并没有这种压力
158
00:07:15,119 --> 00:07:17,170
要把质量做到这么好
159
00:07:17,860 --> 00:07:22,834
并没有把质量作为一个非常非常重要的指标
160
00:07:22,834 --> 00:07:23,700
得过且过
161
00:07:26,590 --> 00:07:27,980
所以我们
162
00:07:28,260 --> 00:07:29,640
不只针对状态机的
163
00:07:29,640 --> 00:07:31,538
所有的建模都是一样的
164
00:07:31,538 --> 00:07:33,954
就是说怎样才能把建模做得好
165
00:07:33,954 --> 00:07:35,334
我们说过很多遍了
166
00:07:35,334 --> 00:07:36,714
要有冠军的心
167
00:07:36,714 --> 00:07:37,060
对吧
168
00:07:40,100 --> 00:07:44,250
冠军的心,没有这个的话,很可能讲完了就
169
00:07:45,850 --> 00:07:47,510
像水洗过一样
170
00:07:48,340 --> 00:07:49,558
什么都没剩下
171
00:07:49,558 --> 00:07:52,603
因为你又没有这个主动性去追求
172
00:07:52,603 --> 00:07:55,649
客观上也没有这个环境压迫你
173
00:07:55,649 --> 00:07:57,680
鼓励你去这样做
174
00:07:58,510 --> 00:07:59,799
那既然没有主动
175
00:07:59,799 --> 00:08:01,088
也没有客观
176
00:08:01,088 --> 00:08:01,825
没有主观
177
00:08:01,825 --> 00:08:02,562
也没有客观
178
00:08:02,562 --> 00:08:04,219
我干嘛要去改进呢
179
00:08:04,219 --> 00:08:06,061
干嘛要去学这个东西呢
180
00:08:06,061 --> 00:08:06,430
对吧
181
00:08:08,950 --> 00:08:09,225
好
182
00:08:09,225 --> 00:08:11,430
这是我们说的现状
183
00:08:12,620 --> 00:08:14,900
我们来先看一下
184
00:08:16,110 --> 00:08:17,350
状态机
185
00:08:17,630 --> 00:08:22,540
以及相关的这些理论或概念的发展的历史
186
00:08:25,300 --> 00:08:26,830
状态机的话
187
00:08:27,320 --> 00:08:30,414
它的起源并不是软件开发
188
00:08:30,414 --> 00:08:30,930
因为
189
00:08:31,210 --> 00:08:32,607
你看这个年代
190
00:08:32,607 --> 00:08:34,237
一九五几年,对吧
191
00:08:34,237 --> 00:08:34,470
192
00:08:34,470 --> 00:08:37,731
软件当时都还没有
193
00:08:37,731 --> 00:08:40,060
概念都还没有出来呢
194
00:08:40,060 --> 00:08:40,526
对吧
195
00:08:40,526 --> 00:08:40,759
196
00:08:40,759 --> 00:08:42,855
当时叫程序而已
197
00:08:42,855 --> 00:08:44,020
计算机程序
198
00:08:44,300 --> 00:08:44,535
199
00:08:44,535 --> 00:08:46,894
要形成软件那个概念
200
00:08:46,894 --> 00:08:48,310
到后面了
201
00:08:48,590 --> 00:08:50,066
更不用说软件工程
202
00:08:50,066 --> 00:08:53,020
1968年才有软件工程
203
00:08:53,360 --> 00:08:54,510
204
00:08:55,070 --> 00:08:56,990
这样一个提法
205
00:08:59,200 --> 00:09:01,340
那一开始解决的是
206
00:09:02,780 --> 00:09:03,864
电路的问题
207
00:09:03,864 --> 00:09:05,310
数字电路的问题
208
00:09:05,590 --> 00:09:07,130
组合逻辑电路
209
00:09:07,860 --> 00:09:08,740
输入
210
00:09:09,020 --> 00:09:09,870
然后呢
211
00:09:10,150 --> 00:09:10,702
进来
212
00:09:10,702 --> 00:09:13,740
然后这边就会有各种输出
213
00:09:14,890 --> 00:09:19,320
输入进来,这边输出,这个逻辑
214
00:09:20,530 --> 00:09:21,860
是怎么决定的
215
00:09:23,840 --> 00:09:24,700
那么
216
00:09:24,980 --> 00:09:29,120
或者说,里面的逻辑怎么把它表达和整理
217
00:09:30,760 --> 00:09:31,550
218
00:09:31,830 --> 00:09:32,560
219
00:09:32,980 --> 00:09:34,755
这些人就写了论文了
220
00:09:34,755 --> 00:09:35,150
对吧
221
00:09:36,060 --> 00:09:38,080
最早的是这个
222
00:09:38,430 --> 00:09:44,950
跟现在的状态机相关的是Huffman,哈夫曼
223
00:09:48,960 --> 00:09:50,438
就是那个哈夫曼算法
224
00:09:50,438 --> 00:09:51,260
那个哈夫曼
225
00:09:51,260 --> 00:09:53,561
但是这个文章不是说那个算法的
226
00:09:53,561 --> 00:09:54,054
说算法
227
00:09:54,054 --> 00:09:55,040
另外的文章
228
00:09:57,260 --> 00:09:59,140
他写了个文章
229
00:09:59,420 --> 00:10:00,870
时序
230
00:10:02,390 --> 00:10:03,420
开关
231
00:10:03,700 --> 00:10:05,750
电路的综合
232
00:10:08,820 --> 00:10:10,040
这样一个文章
233
00:10:10,480 --> 00:10:14,460
那后来其他人又在这个基础上
234
00:10:14,740 --> 00:10:15,024
235
00:10:15,024 --> 00:10:17,299
又发了其他文章
236
00:10:17,299 --> 00:10:19,290
几个典型嘛
237
00:10:19,290 --> 00:10:21,850
一个是Mealy这个
238
00:10:25,510 --> 00:10:28,130
这个文章,还有Moore这个文章
239
00:10:28,660 --> 00:10:28,906
240
00:10:28,906 --> 00:10:29,890
所以后面
241
00:10:30,890 --> 00:10:32,210
就把
242
00:10:32,490 --> 00:10:34,460
这些文章里面提到的
243
00:10:35,660 --> 00:10:39,050
对状态机的看法或者观点
244
00:10:39,740 --> 00:10:42,930
就叫做Mealy机或Moore机
245
00:10:43,290 --> 00:10:44,870
那Mealy机
246
00:10:49,560 --> 00:10:51,270
就是说
247
00:10:51,600 --> 00:10:52,221
输出
248
00:10:52,221 --> 00:10:55,740
也就是我们现在UML说的那个效果
249
00:10:56,430 --> 00:10:56,856
250
00:10:56,856 --> 00:10:57,710
输出
251
00:10:59,450 --> 00:11:02,370
或者现在UML的效果
252
00:11:02,370 --> 00:11:03,830
它是由迁移决定
253
00:11:04,110 --> 00:11:05,510
这个是
254
00:11:06,610 --> 00:11:08,132
比较容易理解的
255
00:11:08,132 --> 00:11:12,320
迁移过程中,相当于一会我们要讲的
256
00:11:12,870 --> 00:11:15,031
这个action
257
00:11:15,031 --> 00:11:16,760
斜杠右边action,就是输出嘛
258
00:11:16,760 --> 00:11:18,057
这边是事件嘛
259
00:11:18,057 --> 00:11:18,490
对吧
260
00:11:18,950 --> 00:11:22,483
由迁移来在这里表达