oh-my-docs

Summary for developers


Project maintained by italkso Hosted on GitHub Pages — Theme by mattgraham

原则和思想

1. 计算机的三大原则

计算机是执行程序的机器,程序是指令和数据的集合。

指令,就是控制计算机进行输入、运算、输出的命令。把向计算机发出的指令一条条列出来,就得到了程序。函数就是一组指令的名字。语句、方法、子例程、子程序也都可以用来指代一组指令。

程序中的数据分为两类,一类是作为指令执行对象的输入数据,一类是从指令的执行结果得到的输出数据。在编程时程序员会为数据赋予名字,称其为变量

无论使用哪种开发方法,编写出来的程序其内容最终都会表现为数值的罗列,其中的每个数值要么表示“指令”,要么表示作为指令操作对象的“数据”。程序最终就是指令与数据的集合。

在非 OOP 语言中,用函数表示指令,用变量表示数据,程序就是函数和数据的集合。

2. 计算机系统结构中的八大思想

面向摩尔定律的设计

摩尔定律(Moore’s Law)指出,单芯片上的集成度每 18 至 24 个月翻一番。因此,计算机设计者必须预测其设计完成时的工艺水平。

使用抽象简化设计

使用抽象(abstraction)来表示不同的设计层次,是提高硬件和软件生产力的主要技术之一。通过抽象隐藏了复杂性,即在高层次中看不到低层次中的细节,只能看到一个简化的模型。

抽象原理是理解现代计算机系统的基础,硬件和软件的设计都采用分层的的方法构建计算机系统,下层对其上层隐藏本层的实现细节。

指令集体系结构是硬件和软件之间的接口,属于最重要的一个抽象层次。而过程(procedure)或函数是软件中实现抽象的一种方法,参数的角色是作为过程与其他程序、数据之间的接口。

加速大概率事件

加速大概率事件(common case fast)比优化小概率事件更能提高性能。

比如 MIPS 将寄存器$zero恒置为 0 这种根据使用频率来确定要定义的常数的方法。

通过并行提高性能

通过流水线提高性能

通过预测提高性能

存储器层次

通过冗余提高可靠性

硬件设计的三条基本原则

硬件: 计算机的组成

计算机内部主要由被称作IC 的元件组成,核心的只有三种:CPU(处理器)、内存和I/O。只要用电路把CPU、内存以及I/O 上的引脚相互连接起来,为每块IC 提供电源,再为CPU 提供时钟信号,硬件上的计算机就组装起

来了。

CPU (Central Processing Unit,中央处理器)是计算机的大脑,负责解释、执行程序,在其内部可对数据执行运算并控制内存和I/O。通常用Hz 来表示驱动CPU 运转的时钟信号的频率。1秒发出1 次时钟信号就是1Hz,

内存用于存储指令和数据。

I/O (Input/Output,输入/输出)负责把键盘、鼠标、显示器等周边设备和主机连接在一起,实现数据的输入与输出。

2.2 步骤

电阻值计算

将金色或银色的色环放到右手边,然后从左边开始依次读出剩余3 个色环的颜色。从左侧开始数,第3 位的数字表示10 的次方数。

电阻颜色代码 0~9 分别对应 黑棕红橙黄绿蓝紫灰白。误差等级:银色代表±10%,金色±5%

软件:程序设计

3. 汇编

4. 程序流程 - 程序是流动的

Flow Chart

表示程序流程(Flow)的图(Chart)就是流程图(Flow Chart),流程图不依赖于特定编程语言。

可以画流程图来思考算法。思考算法时要分两步:

  1. 整体考虑程序的粗略流程(初始化处理→循环处理→收尾处理)

  2. 考虑程序各个部分细节的流程

基本的程序流程

结构化程序设计

使用程序块表示程序流程:仅使用顺序执行、条件分支和循环表示程序的流程,不再使用跳转指令。

在硬件层面,条件分支和循环都必须使用跳转指令实现。但是,高级语言使用了程序块作为跳转指令的抽象,即使不使用跳转语句,程序的所有流程仍然可以表述出来。而使用跳转指令会使程序流程状态复杂,就像意大利面条一样。

结构化异常处理:用程序块来表示这种错误处理方式的机制,如 try~Catch

特殊的程序流程

5. 算法 - 处理问题的步骤

算法(Algorithm)是被明确定义的有限个规则的集合,用于根据有限的步骤解决问题。例如在既定的精度下,把求解sin x 的计算步骤无一遗漏地记录下来的文字。— JIS(日本工业标准)关于算法的定义

把解决问题的步骤无一遗漏地用文字或图表示出来就形成了算法。使用编程语言表达,算法就变成了程序。

了解算法的目的是能够借助算法将自己的想法完整地传达给计算机。只要理清在现实世界解决问题的步骤,再结合计算机的特性,就一定能想出算法。

算法要点

算法举例

辗转相除法

辗转相除法(欧几里得算法)是一个机械地求解最大公约数问题的算法(使用除法 / 减法运算)。

使用减法求最大公约数时,用两个数中较大的数减去较小的数(步骤),反复进行上述步骤,直到两个数的值相等(步骤的终止)。如果最终这两个数相同,那么这个数就是最大公约数。

根据这个简单的算法,我们可以回顾以下算法的几个要点:

将算法转化为 C 语言程序

/// gcd.c
#include <stdio.h>

int euclid(int a, int b);

int main(){
    
    int a = 0;
    int b = 0;
    int gcd = 0;

    printf("Enter two integer numbers:\n");
    scanf("%d %d", &a,&b);

    gcd = euclid(a,b);

    printf("Greatest common divisor of %d and %d is : %d\n", a,b,gcd);

    return 0;
}

int euclid(int a, int b){
    while(a != b){
        if (a > b) {
            a = a - b;
        } else {
            b = b - a;
        }
    } 
    return a;
}

在终端(命令行界面)中输入以下命令,根据提示输入两个整数,比如,输入88 和 24,即可求得他们的最大公约数 8。

$ gcc -c gcd.c -o gcd.o
$ gcc gcd.o -o gcd.exe
$ ./gcd.exe

6. 数据结构 - 数据的排列方式

Algorithms + Data Structures = Programs - Niklaus Wirth

程序员应该把算法(处理问题的步骤)和数据结构(作为处理对象的数据的排列方式)一起考虑。选用的算法和数据结构要相互匹配。

前面我们学习了算法。我们知道,程序是用来在计算机上实现现实世界中的业务和娱乐活动的,为了达到这个目的,程序员们需要结合计算机的特性,用程序来表示现实世界中对问题的处理步骤,即处理流程。

那么如何结合计算机的特性,用程序来表示现实世界中的数据结构呢?首先我们需要了解数据结构的基础,典型的数据结构以及如何用程序实现典型的数据结构。

使用变量在内存中存取数据

内存和变量的关系是,使用变量在内存中存取数据。

计算机所处理的数据都存储在内存,内存是一种 IC 芯片,使用集成电路 Integrated Circuit 技术制造。

内存内部被分割成了若干个数据存储单元,每个单元可以存储 8 比特的数据。为区分各个单元,每个单元都被分配了一个编号——内存地址。依靠指定地址的方式编写程序很麻烦,使用变量是为了方便编程。

程序使用变量把数据存储进内存或从内存中把数据读出来的。变量的实质是按照变量所存储数据的大小被分配到的一块内存空间。变量是程序中数据存储的最小单位,每个变量都对应着一块物理上的内存空间。变量作为数据的容器,可以改变其中所存储的数据。

int myVar = 256; /* 定义变量myVar,并将数据 256 存入变量 */

数组是数据结构的基础

结构体

7. 面向对象编程 - 间接技术

在C 语言中,结构体是数据的集合,它将数据捆绑在一起,使得我们可以将这些数据看作是一个整体。而对结构体中的数据进行操作的函数却写在了结构体的外部。然而在面向对象编程中,将表示事物行为的函数也放入了这个整体,这就形成了对象的概念,使得这个整体既能描述属性,又能描述行为。

面向对象编程(OOP,Object Oriented Programming)是一种编写程序的方法,旨在提升开发大型程序的效率,便于修改和扩展程序功能。

OOP 以对象(Object)为中心,对象的构成要素包含对象的行为及操作。OOP 涉及的主要编程技巧是继承、封装、多态。

理解 OOP

名称 主要用途
用例图(Use Case Diagram) 表示用户使用程序的方式
类图(Class Diagram) 表示类以及多个类之间的关系
对象图(Object Diagram) 表示对象
时序图(Sequence Diagram) 从时间上关注并表示多个对象间的交互
协作图(Collaboration Diagram) 从合作关系上关注并表示多个对象间的交互
状态图(Statechart Diagram) 表示对象状态的变化
活动图(Activity Diagram) 表示处理的流程等
组件图(Component Diagram) 表示文件以及多个文件之间的关系
配置图(Deployment Diagram) 表示计算机或程序的部署配置方法

UML 被广泛地应用于绘制面向对象编程的设计图,只要了解了UML 中仅有的这九种图的作用,就可以从宏观的角度把握并理解面向对象编程思想了。在进行面向对象编程的设计时,要去关注对象。也就是要在一开始就把所需要的类确定下来,然后再在每个类中列举出该类应该具有的函数和变量。要一边观察作为程序参照物的现实世界,一边思考待解决的问题是由哪些事物(类)构成的。

类和对象的区别

类是做饼干的模具,用模具做出来的饼干是对象。

类是对象的定义,而对象是类的实例(Instance)。现实世界中,也有类(定义)和对象(实体)的区别。

当我们定义了一个类MyClass时,我们还无法直接使用类MyClass 所持有的成员,要想使用就必须在

内存上生成该类的副本,这个副本就是对象。先要创建一个个类的对象然后才能使用类中定义的成员

类的定义和使用

数据:存储、交换和加密

8. 数据库

基本概念

设计数据库

通过拆表和整理数据实现规范化

用主键和外键在表间建立关系

在字段上设置索引以提升数据检索速度

设计用户界面

只要通过拆表实现了规范化、设置了主键和外键、确保没有多对多关系、根据需要设置了参照完整性和索引,那么数据库的设计就告一段落了。接下来就该进入为了利用数据库中的数据而编写数据库应用程序的阶段了。

在设计系统时,请记住:优先设计数据库,然后再设计用户界面

数据库应用程序的基础功能是能够对记录进行CRUD 的操作, 即记录的插入(CREATE)、获取(REFER)、更新(UPDATE)、删除(DELETE)。统计、打印等更加丰富功能也可以在后期加上。

DBMS 具有自动生成主键和外键上的值的功能,所以在设计用户界面时,需要显示其余的字段,并要使CRUD 操作能够通过按钮和菜单来完成。

向DBMS 发送CRUD 操作的SQL 语句

DBMS基本都支持**SQL **(Structured Query Language,结构化查询语言)。

一旦向DBMS 发送了一条命令(SQL 语句),与此相应的操作就会立刻被执行。使用SQL 语言通常不需要定义变量或者考虑程序的执行流程。

CRUD SQL
C INSERT
R SELECT
U UPDATE
D DELETE

使用数据对象向DBMS 发送SQL 语句

数据对象(Data Object)

DBMS 的一个高级功能——事务控制

事务(Transaction)

数据加密

https:// 开头的 URL,表示数据正在使用加密的方式进行传输。文本、图像等各种形式的信息,都可以作为加密对象的数据中。但是计算机会把所有的数据都用数字表示,即便数据有各种展现形式,加密技术基本相同。假设加密的对象仅限于文本数据。

网络:计算机通信

9. TCP/IP 网络

基本概念

了解网络

构成网络的硬件 举例
网卡(NIC,NetworkInterface Card) 以太网(Ethernet)网卡
网线  
集线器  
路由器  

这些硬件的规格只有相互匹配了才能连接在一起。网卡的种类一旦确定,网线、集线器和路由器的规格也就确定了。既然硬件的规格一致了,就意味着其中传输的电信号的形式也是一致的。

CSMA/CD 机制

命令 作用
ifconfig 显示网络接口(interface)信息(接口名称,类型,IP地址,MAC地址等)
ping 测试网络连通性
arp -a 显示本地存储的IP-MAC对应关系
netstat -nr 显示路由表(可以找到网关Gateway)
traceroute 追踪到达IP目的地的全程路由
tcpdump 网络抓包,监听网络接口不同层的通信,并过滤出特定的内容(特定协议、特定端口等)
host DNS域名解析,返回域名对应的IP地址

通用数据交换格式

由字符构成的纯文本文件,用来存储结构化的数据、配置应用程序等。

123, "apple", 200
456,"computer",300

标记语言

标记:通过添加标签为数据赋予意义的行为。标记语言:可以用标签为数据赋予意义的语言。

  给人看的 HTML 给计算机看的 XML
用途 编写网页 使用标签为信息赋予意义
通用数据交换格式
扩展性 固定的标记语言(使用由HTML 定义的若干种标签) 可扩展的标记语言

HTML 是用于编写网页的标记语言,用途仅限于信息的可视化——展现网页。

HTML 决定了可用于编写网页的标签。可使用的标签的种类决定了标记语言的规范。Web浏览器会对HTML 的标签进行解析,把由它们标记的信息渲染成在视觉上可以阅读的网页。

XML - 可扩展,元语言,纯文本

XML - 定义任意标记语言的元语言,可以为信息赋予意义

XML 主要约束

用 XML 定义的标记语言示例(W3C)

标记语言 名称 用途
XSL   为XML 中的信息提供显示格式
MathML   描述数学算式
SMIL   把多媒体数据嵌入到网页中
SVG   用向量表示图形数据
XHTML   用XML 定义HTML4.0
SOAP Simple Object Access Protocol,简单对象访问协议 实现分布式计

为了实现各自的目的,每一种标记语言中都定义了各种各样的标签。

分布式计算

把程序分散部署在用网络连接起来的多台计算机上,使这些计算机相互协作,充分发挥计算机整体的计算能力。简单地说,SOAP 就是使运行在A 公司计算机中的A 程序,可以调用运行在B 公司计算机中的B 程序。

JSON

YAML

YAML 语言(发音 /ˈjæməl/ )专门用来写配置文件,实质通用的数据串行化格式。

语法规则

使用# 注释,大小写敏感,使用缩进表示层级关系,允许使用空格缩进(保证相同层级的元素左侧对齐)。

数据结构

YAML 支持的三种数据结构:对象,数组和纯量。使用对象和数组,可以形成复合结构。

由各种技术组合而成的计算机系统

系统

由多个要素相互发生关联,结合而成的带有一定功能的整体。将各种各样的硬件和软件组合起来构建而成的系统就是计算机系统。

成功的计算机系统是什么样的呢?那就是能完全满足客户需求的计算机系统。客户期待的是由计算机带来的IT 解决方案,而并非计算机技术。能满足需求且稳定地工作,这样的计算机系统正是被客户所需要的。

设备利用率 = 正常运转的时间 / (正常运转的时间+出现故障处于维修状态的时间)

瀑布模型

软件开发过程的模型有瀑布模型、原型模型、螺旋模型等。使用模型是为了将复杂的事物简单化。

庞大复杂的事物往往无法直接做出来,人们往往要把庞大复杂的事物先分解成细小简单的要素来进行设计。有了各个要素的设计图,整体的设计图也就出来了。先根据每个要素的设计图制成小零件(程序中的模块),待每个小零件的测试(单元测试)都通过了,剩下的就只是一边看着整体的设计图,一边把这些零件组装起来了。然后再来一轮测试(集成测试),测试组装起来的零件是否能正确地协作运转。

瀑布模型阶段 瀑布模型文档
需求分析 系统策划文档、系统功能需求规格文档
外部设计 外部设计文档
内部设计 内部设计文档
程序设计 程序设计文档
编码实现 模块设计文档、测试计划文档
测试 测试报告
部署、维护 部署手册、维护手册
程序设计方法 拆解时所关注的事物 亮点
面向对象 构成计算机系统的事物(对象) 简化了系统维护
通用功能分割 在整个计算机系统中通用的功能  
STS(Source,Transform,Sink) 数据流(输入、变换、输出)  
TR(Transaction) 事务(数据的处理单位)  
Jackson 输入数据和输出数据  
Warnier 输入数据  

回顾:计算机的三大原则

各种设计方法,其关注点要么在输入、运算、输出、指令、数据这几个要素的某一个上,要么在某几个的组合上。引进计算机系统的目的是通过用计算机替代靠手工作业进行的业务,来提升工作效率。因此在设计时,要使手工作业的业务顺应计算机的处理方式来进行替换。

参考资料