编程镓教・入门篇| 001 什么是程序?
学习目标
- 理解程序的相关概念
- 了解程序的相关角色及其职责
学习用时:20分钟
在开始学习之前,让我们先来听个故事:
一道菜的故事
一道菜的故事有一家饭店的大厨,做得一手祖传名菜,品尝过的客人都赞不绝口。于是消息一传十,十传百,食客从五湖四海闻名而来。然而这对饭店的老板来说,并不单纯是一个好消息。因为客人不是奔着饭店,而是奔着大厨的手艺来的。老板必须想办法留住这位大厨,否则他一旦被别人挖走,饭店的生意就会一落千丈了。然而即便老板不惜血本保证了大厨的忠诚度,风险也依然存在:
- 大厨休息或请假的时候,菜品的口味就无法让顾客满意;
- 大厨只有一个,如果想在多个地方开分店,那口味也就不能保证了;
- 大厨再厉害,同时也只能炒一个菜,而顾客越来越多,输出总是供不应求;
- 大厨年纪大了总是要退休的,如果收徒的话,怎么继续保证徒弟的忠诚度呢?
有一天,老板突然悟到,决定菜品口味的是大厨烧菜的过程,而不是大厨本人。如果大厨愿意把自己每个菜的菜谱都写出来,那不就可以请别的厨师来操作了吗?虽然别人按照菜谱烧出来可能达不到原味的100分,但90分总是能达到的,而这样的差距是一般的食客无法分辨的。这样只要菜谱在,饭店菜品的质量就能得到保证,扩张店面、开分店什么的就都不成问题了。
于是老板和大厨谈了一个晚上,说服了他把菜谱写出来,然后用菜谱技术入股分成。于是大厨一边炒菜一边讲解,让助手把菜谱记下来,交给了老板。老板于是请别的厨师拿着菜谱如发炮制,大厨验收并指导修改菜谱,如此这般数次之后,菜谱就定稿了。
几年后,饭店生意越来越好,开了无数家分店,老板赚了很多钱,大厨也得到丰厚的分成,不用再天天靠手艺吃饭了。后来有一位厨师把菜谱偷传了出去,于是这道菜就红遍了大江南北……
什么是程序?
什么是程序?炒菜的过程是一个流程(Process)。而记载了炒菜过程的菜谱,就是一个程序(Program)。至于将炒菜的过程写成菜谱,即编写程序,就是我们要学习的编程(Coding)。
流程(Process):为了实现一个需求而设计的形式逻辑
程序(Program):记录并承载流程的媒介
编程(Coding):把流程编写成程序的过程
我们可以再举几个例子:
- 打太极拳的套路是流程,而记录这些套路的拳谱是程序;
- 用钢琴弹奏曲子的指法是流程,而记录这些指法的钢琴谱是程序;
- 老师备课时设计的教学过程是流程,而记录这些过程的教案是程序;
- ……
如果你曾经记录过类似流程的东西,没准可能是作息时间表(记录了每天必做事件的顺序列表)或者交通路线图(记录了去某地的行程),那么其实你已经在编程了。
所以,编程真的没有那么神秘,对吧?
程序是用来干什么的?
程序是用来干什么的?按照菜谱进行操作的目的是炒出一盘菜,这叫做程序的需求(Requirements)。我们可以对需求附加标准和要求来让它更加具体和完整,比如炒出一盘可口的西红柿炒鸡蛋。
需求(Requirements):期待通过执行程序(所记载流程)而产生的变化
- 按套路打太极拳的需求是强身健体;
- 按钢琴谱弹钢琴的需求是演奏一首音乐;
- 按教案进行授课的需求是传授给学生知识;
- ……
请注意,需求描述的是变化,而不是产物本身:
- 原来没有,而现在有了 —— 菜、音乐
- 质量发生了变化 —— 健康
- 数量发生了变化 —— 知识
- ……
执行一个程序所带来的变化可能有很多,而需求应该描述执行程序(所记载流程)的核心目的。在炒完一个菜之后,我们除了得到了一盘菜之外,同时还产生了油烟和潲水。显然,产生菜是我们的需求,而产生油烟和潲水就不是了。
需要特别注意的是,需求是执行程序的目的,而不是编写程序的目的。编写程序——“把菜谱写出来”也是一个流程,它自然也有属于自己的需求。编写程序的动机和初衷(为了大规模复制和扩张而记录炒菜的秘诀),以及编写程序的标准和要求(准确、详尽、可操作)都是不是“菜谱”的需求,而是编写程序——“写菜谱”的需求。
程序是用什么写的?
程序是用什么写的?菜谱是用某种自然语言(比如汉语)写成的,这叫作编程语言(Language)。
语言(Language):将流程写成程序时所使用的指令系统
- 拳谱的语言是图形和箭头;
- 钢琴谱的语言则是音符和各种记号;
- 教案的语言也是自然语言;
- ……
一个程序里未必只使用一种语言,比如菜谱里可能有配图,拳谱和五线谱里可能有讲解文字,教案里可能有PPT……
如果我们愿意,也可以换用其他语言来重新编写程序,比如用手语来展示菜谱,用英语来讲解太极拳套路,用现场弹奏的视频来演示钢琴指法……但是,不同语言的表现力是不同的,所以最终呈现的效果会有所变化。
程序是谁写的?
程序是谁写的?炒菜的流程是大厨开发研究出来的,因此大厨毫无争议地是它的作者(Writer)。
作者(Writer):设计流程并将其写成程序的人
- 拳谱的作者是拳法创始人;
- 钢琴谱的作者是作曲家;
- 教案的作者是备课教师;
- ……
严格来说,作者还可以进一步拆分为设计流程的人——设计者(Designer),以及把流程写成程序的人——实现者(Implementer)。
比如在菜谱的例子里,实现者是大厨的助手——是他把菜谱写下来的。不过在大多数情况下,实现者没有设计者重要,或者设计者和实现者干脆就是同一个人,所以我们一般将设计者视为程序的作者。
一个复杂的程序(如Windows操作系统)可能是由一个甚至几个开发团队共同开发的。团队里的产品经理负责设计流程,工程师负责写程序。这种情况下,作者就是整个开发团队。
程序出了问题谁负责?
程序出了问题谁负责?菜谱编写出来后,需要有人对其负责进行不断地优化和改良,我们称这样的人为拥有者(Owner)。一开始,程序的拥有者和编写者往往是同一个人,也就是大厨本人。在大厨金盆洗手之后,拥有者可能就会由饭店的厨师长来接任。
拥有者(Owner):负责改进程序的人
- 拳谱的拥有者是拳派掌门人;
- 钢琴谱的拥有者是编曲家;
- 教案的拥有者是教研组长;
- ……
需要注意的是,这里的拥有者是指当程序出问题时需要对其负责的人(大厨及其接任者),而不是指在法律意义上可以享受程序产生的权益的的拥有者(饭店老板)。
程序在运行中可能会出现各种奇怪的问题,也需要不断地修改来适应外部环境的变化。因此只要程序还在运行,就始终需要拥有者来进行维护。没有人维护的程序可能还能保持运行一段时间,但最终的下场只有一个:就是停止运行,最终被人删掉。
程序由谁来执行?
程序由谁来执行?菜谱里记载的流程,将由饭店的厨师实际执行操作,他们是程序的执行者(Runner)。
执行者(Runner):负责执行程序的人
- 拳谱的执行者是练拳者;
- 钢琴谱的执行者是钢琴师;
- 教案的执行者是授课教师;
- ……
执行者并不需要深刻理解程序的意义,只要能读懂程序,按照流程进行规范化的操作就可以了。
执行者有可能是多个独立的个体,或者是一个群体。比如菜谱里的流程可能需要多名厨师一起协作。而教案除了记录教师的活动外,也可能记录了学生的活动,这种情况下教师和学生就都是执行者。
谁来要求执行程序?
谁来要求执行程序?只有在光临饭店的顾客点菜之后,厨师才会调用菜谱来炒菜,所以顾客是调用者(Caller)。
调用者(Caller):要求执行程序的人
- 拳谱的调用者是武馆教练;
- 钢琴谱的调用者是音乐会观众;
- 教案的调用者是学生;
- ……
一个程序可以有多个调用者,然而一般来说会有一个典型的调用者,大部分调用都由他们来发起。比如菜谱的调用者通常是点菜的顾客,但如果老板在饭店打烊后让厨师弄点菜犒劳一下伙计们,那调用者就不是顾客而是老板了。
内容回顾
内容回顾先让我们把今天所学的概念串一遍:
为了实现一个需求,设计者设计了一个流程;实现者将这个流程用特定的语言编写成程序,并交由拥有者维护;在调用者发起调用后,执行者执行程序,最终需求得以实现。
与程序相关的概念:
流程(Process):为了实现一个需求而设计的形式逻辑 —— 炒菜的过程
程序(Program):记录并承载流程的媒介 —— 菜谱
编程(Coding):把流程编写成程序的过程 —— 写菜谱
需求(Requirements):执行程序(所记载流程)的核心目的 —— 炒出一盘菜
语言(Language):记录流程所使用的指令系统 —— 汉语
与程序相关的角色:
作者(Writer):设计流程并将其写成程序的人—— 大厨
设计者(Designer):设计流程的人—— 大厨
实现者(Implementer):把流程写成程序的人—— 大厨的助手
拥有者(Owner):负责改进程序的人 —— 饭店的厨师长
执行者(Runner):负责执行程序的人 —— 饭店的厨师
调用者(Caller):要求执行程序的人 —— 光临饭店的顾客
课后作业
课后作业1、找出生活中的一个流程,以及与之对应的程序,并明确其需求、语言、作者(可细分设计者和实现者,两者相同时可以不分)、拥有者、执行者、调用者。
2、在电脑上安装谷歌Chrome浏览器,有条件的同学请配置科学上网。
不知道咋交作业?去看看课程说明吧!