1.软件版本命名
软件版本号由四部分组成:
第一部分 软件架构或软件界面变化
第二部分 软件功能新增
第三部分 软件bug修复
第四部分 1.编译版本号加日期版本号 它是编译时的版本标记,一般序号都是递增的。(如windows系统版本号)
2.日期版本号加希腊字母版本号 用于记录修改项目的当前日期,每天对项目的修改都需要更改日期版本号。
希腊字母版本号常见有3种,分别为:alpha(内测版)、beta(公测版)、release(正式版)。
例如:1.1.1.20160101_beta
2.软件开发模型
边做边改型
瀑布模型---->敏捷开发(演变)
快速原型模型
增量模型
迭代(演化)模型
螺旋模型
极限编程模式
3.web软件结构模式
B/S模式
C/S模式
4.软件编程设计模式
mvc模式
mvp模式
mvvm(mvvc)模式
5.单例与原型(属于软件设计模式)
单例只有一个实例。(世界上只有独一无二的我)
原型根据一个原型创建N个对象。(根据“人”,创造“男人”与“女人”)
6.软件编程范式(思想)
面向过程编程 / 过程式编程(POP)
面向过程编程按照函数步骤一步步往下执行。
以功能函数(funtion)为中心编程。
面向对象编程(OOP)
面向对象编程把事物拆分成各种对象,在各种对象里面封装了一些方法,对象之间相互调用并执行。
以对象数据(data)为中心编程。
面向切面编程(面向侧面)
函数式编程
函数响应式编程
逻辑编程
7.软件架构风格
rest风格:通过url来定义资源位置与操作。
如:http://example.com/resources/ 或者 http://example.com/order
8.软件设计架构
面向服务架构
微服务架构
9.软件设计范式
约定优于配置 (惯例重于配置),目的按照约定的规范编程(约定软件目录结构,代码命名),减少软件开发人员需做决定的数量(大幅度减少配置的工作量),提高开发效率。
PS:并非一切都是积极的。任何结构化软件项目都存在两个基本问题。
会增加学习成本,学习软件编程规则,强迫软件开发人员必须遵守此规则。(代码文件一定要这样子命名,代码文件一定要放在这里)
会让软件开发人员忽略一些软件实现的基本原理。(不知道为什么要这样做,是怎么实现的)
10.UML基本模型图
结构UML图
类图 面向对象编程中类与类之间关系、属性。例如:User class 与 vendor Class关系
组件图 描述系统软件之间交互关系,接口。例如:Apache+Tomcat+webApp1+webApp2+dataBase结构
复合结构图 面向对象编程中类与结构化分类器、部件、端口、连接器和协作。例如,user类通过login接口登陆user界面
部署图 描述系统软件部署的节点。例如:数据库服务器集群。
对象图 面向对象编程中类具体某个实例。例如:user类中如果common user角色就进入common user界面。如果admin user角色就进入admin user界面。
包装图 面向对象包名(命名空间)的关系。例如:Dao包里面包含UserDao类。
行为UML图(交互UML图)
活动图 描述系统软件的业务功能,流程图。例如:用户第一步做什么,第二步做什么。
通讯图 描述用户对象之间的协作,而不是时间序列,类似于序列图,只是新增人物角色在序列图里面。
交互概览图 序列图与活动图的混合图。
状态图 系统软件的不同情况下,执行什么样的动作。例如:用户登陆失败状态,用户登陆成功状态,用户登陆过期状态会出现什么的操作。
序列图 面向开发人员介绍用户在一个时间轴(生命线)上操作行为。例如:用户进入登陆页面,未注册用户点击“注册”按钮注册页面,填写信息后提交表单,再进入登陆页面进行登陆。
定时图 描述多条生命线上的操作行为。类似于序列图。
用例图 面向普通人员介绍用户与系统软件的交互。例如:登陆用户拥有什么操作权限,未登陆用户拥有什么权限。
PS:这是UML 2.x的13种图表。
在实际建模中,结构图是必需,但行为图(交互图)只需序列图,用例图,活动图。
11.字节流与字符流
以InputStream(输入)/OutputStream(输出)为后缀的是字节流。
以Reader(输入)/Writer(输出)为后缀的是字符流。
字节流:程序-直接操作文件-文件
字符流:程序-放入缓存-写入文件-文件
PS:优先使用字节流。
12.heap(堆)和stack(栈)
堆是操作系统动态分配内存空间的。访问速度慢,全局访问变量,先进先出。
栈是编程语言固定分配内存空间的。访问速度快,局部访问变量,先进后出。
13.接口与抽象类
接口就是指一些行为或动作。(有没有这种行为或动作)
抽象类就是指一些事物的本质。(是不是这种东西)
14.阻塞与非阻塞
阻塞就是一直等待消息,不等到消息不离开,一直挡道。
非阻塞就是每隔一段时间去看看消息到了没,没到就回去,不挡道。
15.异步与同步
异步就是做完一件事后,不需要等待结果,接着干另一件事。
同步就是做完一件事后,等待结果,拿到结果才能干另一件的事。
16.线程与进程
关系:线程是进程的一部分,线程作为进程的子集存在。
区别:线程类似于一棵树的所有枝干。
线程共享同一个进程地址空间。(包括内存和其他资源)
线程之间数据交互快,线程之间切换快。
进程类似于独立的一棵树。
进程具有单独的地址空间。
进程之间数据交互慢,只能通过操作系统提供的机制交互。
17.多线程与单线程
多线程优点:应用程序保持对输入的响应,充分发挥硬件的优势(CPU、内存、硬盘),充分利用空闲资源,并行处理任务。(同步处理任务)
缺点: 同步处理任务偶尔会发生冲突。(同一个时间线程之间操作相同的数据)
线程之间会相互占硬件资源,线程过多,会导致软件性能会下降。
线程中某一个线程崩溃就会导致当前整个进程崩溃。
应用例子:Tomcat、Apache。
单线程优点: 应用程序不损耗硬件资源,相对线程安全。
缺点: 容易发生程序阻塞,如果其中一个任务操作时间过长,就会冻结整个程序。
应用例子:Nodejs、Nginx、Redis 。
PS:Nodejs是多线程,Nodejs应用程序是单线程。
补充:软件应用进程类型
CPU Bound (国内翻译为CPU密集型): 软件依赖 CPU计算速度。
I/O Bound (国内翻译为I /O密集型) :软件依赖 I /O 计算速度。
以上两种应用进程类型都受 Memory Bound (内存限制)。
18.并行和并发
并行指应用程序同一时间把多个任务拆分成子任务并且同时执行任务。(多核CPU执行任务)
并发指应用程序同一时间出现多个任务并且执行任务。(单核CPU执行任务)
并行是并发的一个子集,一个应用程序可以是并发的,也可以是并行的。
19.错误与异常
错误表示软件正常情况下,出现不可控制的问题。 比如说内存泄露。
PS: 内存泄漏是一种特殊的编程错误。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了
内存的浪费。有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,即使严格意义上来说这是不准确的。
20. 垃圾收集(垃圾回收)
垃圾收集机制分为两种,一种是硬盘垃圾收集机制,另一种是内存垃圾收集机制。
硬盘垃圾收集机制,存在于一些高端固态硬盘(ssd),针对一些有效数据进行读取与重写操作。(类似与硬盘碎片整理机制)
内存垃圾收集机制,存在于一些编程语言的编译器,几乎所有的编译器都具备这样的机制(c语言编译器除外),这种机制有效的保证程序运行中,能够一定程度避免出现内存泄漏,达到内
存空间循环利用的目的。
21.脚本语言与编程语言
脚本语言/直译语言(解释语言驱动)
运行原理: 解释---运行(每次都要(解释---运行)这两步)
通俗易懂的例子:说一句,翻译一句。
编译语言(机器语言驱动)
运行原理: 编译---二进制文件---运行(第一次运行需要编译,之后每次运行只走(二进制文件---运行)这两步)
通俗易懂的例子:整理所有的翻译内容,然后再把所有内容翻译出来。
编译语言性能与能力都优于脚本语言。
补充: Java,c#等兼具编译型语言与解释型语言的特点的。
PS:解释器与编译器区别
高级编程语言与低级编程语言
高级编程语言就是接近自然语言(人类语言),见其名知其义。
比如:java,c#,Python。
低级编程语言就是接近汇编语言或者机器语言,语言精练,不易阅读与理解。
比如:汇编语言。
22.软件位数(32位与64位)
位数越高意味着数据可以在更大的块进行处理,这也意味着更准确。
位数越高意味着系统可以指向或地址的物理内存位置的更大的数字。
以windows系统为例:
PS:MAC OS X/MACOS 是64位操作系统。
电脑主机内存超过4G以上的建议安装64位操作系统,更能发挥内存的作用。(现在大多数的cpu都是64位的)
23.bit(位)、(byte)字节、字符区别
bit是计算机存储设备的最小单位。
byte是计算机处理数据的基本单位。
字符是人使用的符号,抽象的,如,a,b,1,2。
PS:1byte=8bit,一个汉字两个字节,一个英文一个字节。
24.gb(Gigabyte)与gib (Gibibyte) 区别
gb是一种十进制的信息计量单位。
1GB = 1,000(103)MB
gib是一种二进制的信息计量单位。
1GiB = 1,024(210)MiB
PS:因为windows系统把这两个单位搞混,导致外存储设备显示的容量与标示的容量不符。windows操作系统显示的gib,不是gb。
外存储设备的实际容量与标示容量相符,是正确的,并没有小。
硬件厂商采取十进制的换算方法计算。原因是1k=1000,1k!=1024。
25.编码
ASCII(美国信息交换标准代码)是美国制定的,基于26个基本拉丁字母的一种语言编码。(英文语言编码)
Unicode(中文:万国码、国际码、统一码、单一码)是Unicode联盟制定的,拥有全世界的语言的一种语言编码(世界标准编码)
如:UTF-8,UTF-16
GB 2312 或 GB 2312–80 是中华人民共和国国家标准简体中文字符集(中国标准编码)。
如:GBK 是中文字符扩展集(已过时),GB 18030是国内目前最新的中文字符集。
Big5是针对中国使用繁体中文(正体中文)地区的中文字符集(中国港澳、台湾地区标准编码)。
26.硬编码与软编码。
硬编码就是使用固定值。
如:
var a, b = 2; if (a == 2) { alert('正确') }
软编码就是使用变量去代替固定值。
如:
var a, b = 2; if (a == b) { alert('正确') }
27.软件开源协议
GPL协议:GNU General Public License是指GNU通用公共许可协议。开发者必须保证源码的作者或团队能收到或得到源码,并且将这些条款给他们看,使他们知道他们有这样的权利。强制公开所有的代码。
LGPL协议: GNU Lesser General Public License 是指GNU 宽通用公共许可协议。开发者在不修改源码的前提,只引用源码的功能,无需强制开源自己的代码。
BSD协议: Berkly Software Distribution 是指BSD许可证。开发者不可以用原作者或 机构名字和原来产品的名字做市场推广,而且还要开发者的软件带上BSD协议,并在软件文档中声明BSD协议。此协议可以控制。第三方的代码并可以加以修改。
Apache License协议:非盈利开源组织Apache 采用的协议,与BSD类似。
MPL协议:The Mozilla Public License是指非盈利开源组织Mozilla采用的协议,开发者不受专利限制。
EPL协议:Eclipse Public License是指非盈利开源组织Eclipse采用的协议,商业软件可以使用,也可以修改EPL协议的代码,但要承担代码产生的侵权责任,与BSD类似。
MIT协议:源自美国麻省理工学院命名,开发者有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软件,并可以修改协议条款。但必须声明其原作者版权与许可声明。
CDDL协议:Common Development and Distribution License是指通用开发与销售许可协议,实为MPL的拓展协议,允许公共版权使用,无专利费,并提供专利保护,可集成于商业软件中,允许自行发布许可。