第一章 程序设计
“要想成为真正的程序员,我们需要进行一场洗礼。”
“程序 = 数据结构 + 算法。”这样的公式很精辟,它越过了表层直接描述了程序的本质。不仅如此,这样几个简单的单词也让我们明白“我们应该学习什么内容?”。人们做任何事都有一定的程序,只是没有意识到。有些人将日常行动列成表格,这就是“编写程序”。
本章的学习重点:
◆ 什么是程序
◆ 什么是程序设计
◆ 程序设计语言
◆ 数据结构
◆ 算法
◆ 面向过程VS面向对象
1.1程序概念
程序并不是计算机专用品,也不是科学技术的特有产物。日常生活中,我们可以将程序看成一系列动作的执行过程的描述。
1、买1斤胡萝卜
2、买1斤白菜
3、买2斤猪肉
……
这,就是程序,来自生活。
程序一词来自生活,通常指完成某些事务的一种既定方式和过程。
许多情况下,程序可形成文件,而被称为“书面程序”或“文件化程序”。程序通常包括:活动的目的和范围,做什么和谁来做,何时、何地和如何做,应使用什么设备、材料和文件,如何对活动进行控制和记录等。
1.1.1什么是程序
在这里我们所说的程序,指的是计算机程序,而不再指其他广义的程序概念。那么,什么是计算机程序呢?计算机可以执行一序列的指令,我们把这一序列的指令称为计算机程序。这些指令可以只是几条执行某个简单任务的指令,也可以操作庞大数据的复杂指令。成千上万的复杂指令是由简单的指令组合而成,根据一定的条件反复执行的结果。
对于计算机来说,并没有复杂指令之说,都是为数众多的短指令。它们按照程序员的排列来运行,所以,这样我们控制的粒度更小,更容易理解程序的指令。但是,一般情况下,程序员是不会直接用机器语言来为计算机写入指令的。那么做的结果只能是费时费力、效率低下而且漏洞百出。
那么,怎样学习程序呢?我们首先需要弄清楚这三个问题:做什么、怎么做和如何做。
对于“做什么”的问题,可能很多人觉得会比较简单,不就是弄懂要做什么吗?其实这部分是最复杂的,也是最重要的。比如,我们需要给一家企业开发一套ERP,很多时候企业是不知道他自己要的是什么东西,他只知道好与不好。企业不能很详细的说明需要实现具体的功能,这就需要有专门的人员去发掘具体的功能,这个用程序的术语叫做需求分析。在现实生活中,这个做需求分析的人有点类似媒婆。比如,媒婆问你想找一个什么样的女朋友,可能你只知道漂亮的就行,至于相貌啊,其实你自己都不知道怎么形容,这就需要专门的人员从事该工作,所以说,搞清楚“做什么”也不是简单的事情,否则,后面的工作就没有意义。
对于“怎么做”的问题,就像建筑师的设计图纸,当我们了解清楚客户需要建造一座什么样的大厦后,我们就要根据客户的规格需求,设计出具体的实现思路。计算机程序中一个具体的功能模块可能包含相当多复杂的逻辑,我们需要事先规划好一个蓝图,供“建筑工人”施工,还有一个好处就是这个蓝图,是相对比较标准,基本上所有的设计师都看得懂,这样,就有了大家沟通的实物,不会大家都是凭空想象,难以统一和提出修改意见。
对于“如何做”的问题,可以说最简单,也可以说是最难。说它简单是因为学习一门语言,其实就像学英语一样,学好26个字母,学好语法结构等就可以了。说它难是因为如果你是一个初学者,很多概念你都要从零开始,没有一个感性的认识,相当的枯燥,只有深刻领悟了语法的格式才能够熟练使用该语言。如果你学习过其他语言,这个步骤会稍微轻松些,很多东西都可以一理通,百理明。
1.1.2什么是程序设计
打个比方,程序设计就像盖房子一样,数据结构就像砖、瓦,而算法就是设计图纸。你若想盖房子首先必须有建筑材料(数据结构),但是这些材料不能自动地盖起了你想要的房子;你必须按照图纸(算法)上的设计一砖一瓦地去砌。这样你才能拥有你想要的房子。程序设计也是同样的道理,代码不是随便堆积就可以的,你得按照程序设计的图纸来编写。
数据结构是我们设计程序的物质基础,就像盖房子如果没有建筑材料,无论设计有多么漂亮,这座房子也不可能建造起来。算法则是程序设计的思想,它的灵魂!没有思想的程序不能叫程序,只是一堆杂乱无章的符号而已。在程序设计中,数据结构就像物质,算法就是意识。这就像哲学上说的:意识是依赖与物质而存在的,物质是由于意识而发展。双方是相互依存、缺一不可的。
程序设计通常分为需求分析,算法设计,编写代码和编译调试四个阶段。由于程序是软件的本体,软件的质量主要通过程序的质量来体现,在软件研究中,程序设计的工作非常重要,内容涉及到有关的编程语言、编程工具、以及编程方法等。
1.1.3程序设计语言
用来编写计算机程序的语言就是程序设计语言。由一组助记符号和语法规则组成,我们编写的代码就是根据一定的语法规则用语言来描述的,也就是我们所说的程序。程序设计语言包含二个方面,即语法、语义。语法表示程序的组成结构,也就是构成程序的各个助记符号之间的组合规则。语义表示程序的含义,也就是各个助记符号按一定的规则组合后的含义。
程序设计语言按照语言级别可以分为低级语言和高级语言。低级语言有机器语言和汇编语言。低级语言与特定的机器有关、功效高,但使用复杂、繁琐且易出错。机器语言是用0和1来表示的机器指令集。汇编语言是操作码经过符号化的指令集,或进一步包括宏构造。高级语言的表示方法要比低级语言更接近于待解问题的表示方法,其特点是在一定程度上与具体机器无关,易学、易用、易维护。
我们这里所讲的C#语言属于高级语言中的一种,高级语言一是比机器代码或汇编语言更接近于自然语言或数学语言的一种语言。因此,它很少依赖于机器,以致于程序员无需知道关于微机系统的详细知识。一般地说,它更简炼。在高级语言里,单条语句(通常占有源文本的一行)通常相当于汇编语言中的多条语句(或多条机器指令)。
对一个产品来说,在市场上推出一种产品的时间是至关重要的,利用高级语言可以减少软件开发时问。因为程序员不必将程序的高级形式翻译成非常低级的形式。变换的最后阶段是由编译程序执行的。如果高级语言可以容易地从某种高级表达式来映射的话,那么还可以获得进一步的节约。
1.1.4数据结构
数据是信息的载体。它能够被计算机识别、存储和加工处理,是计算机程序加工的“原料”。随着计算机应用领域的扩大,数据的范畴包括:整数、实数、字符串、图像和声音等。
数据元素是数据的基本单位。一个数据元素可以由若干个数据项组成。数据项是具有独立含义的最小标识单位。
数据结构指的是数据之间的相互关系,即数据的组织形式。一个数据由哪些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。
通常情况下,使用符合需求的数据结构可以带来更高的运行效率或存储效率。数据结构往往同高效的检索算法和索引技术有关。在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
1.1.5算法
人们的生产活动和日常生活离不开算法,都在自觉不自觉地使用算法,例如人们到商店购买物品,会首先确定购买哪些物品,准备好所需的钱,然后确定到哪些商场选购、怎样去商场、行走的路线,若物品的质量好如何处理,对物品不满意又怎样处理,购买物品后做什么等。以上购物的算法是用自然语言描述的,也可以用其他描述方法描述该算法。
算法是解题的步骤,可以把算法定义为解决问题的任意一种特殊的方法。在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。算法+数据结构=程序,求解一个给定的可计算或可解的问题,不同的人可以编写出不同的程序,来解决同一个问题,这里存在两个问题:一是与计算方法密切相关的算法问题;二是程序设计的技术问题。算法和程序之间存在密切的关系。
1.1.6面向过程VS面向对象
面向过程,可以这么说,是日常生活中最常用到的问题解决思路:要完成一件事,先把它分解成多件小事,也就是:把一个相对大的“过程”,拆分出存在时序关系的多个小“过程”。
举个实例。现在一位家族主妇想做一道菜,那可能就要分成:备菜、炒菜、上桌等等过程。而其中“备菜”过程,可又以细分为买菜、切菜等等。对应到编程语言,通常用函数/function代表过程(也有的语言就直接叫成“过程/procedure”)。
面向过程的思路很直观,但当问题的复杂度太高时,我们就不太可能很有条理地将理出到底需要多少个子过程——比如让你担当一届奥运会的开幕式导演,这时我们就不应该试图直接把事情从大到小分到很细。
面向对象是在面对复杂问题时,我们首先关注问题将涉及到哪些事物,然后为以各个不同类型的事物为基本单位,定义它们各自的数据与行为能力,以及不同事物之间的相互关系。
“过程”在“面向对象”的解决思路中依然存在,也依然重要。类似导演在拍电影,剧情就是一部电影的主过程,但是电影的拍摄过程并不按照剧情的发展去拍摄,复杂的现实情况会左右拍摄次序。比如有时会在一个景区拍完所有和这个景区有关的剧情——此时,“景区”就是一个重要的对象,我们必须围绕这个对象安排事情发展。