《构建之法》第一章总结
1.程序=数据结构+算法、 软件=程序+软件工程
客户们对程序员的需求从一个简单的程序,扩展到一个满足各种功能的应用软件,再扩展到一个能保证维修的软件服务程序,在这里指的是源程序,就是一行行的代码。仔细看过去,它们的确是建立在数据结构上的一些算法程序还要对数据进行操作,这些数据有些是静态的(例如软件的图标、提示信息),有些是动态的(例如程序生成的随机数字、程序通过网络下载的数据、用户的文字或语音输入等)但是光有代码和静态数据还是不行,工程师要把它们构建为机器能懂的可执行代码。构建不仅仅是cc和link命令一个复杂的软件不但要有合理的软件架构(Software Architecture)、软件设计与实现(Software Design, Implementation and Debug),还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数、链接参数,等等。这些都是软件构建的过程。
源代码管理(Source Code Control)的问题—有时候也叫配置管理(Software Configuration Management)有一系列的工具和程序来保证程序的正确性,这些工具流程和程序本身应该更正确,才能保证别的软件的质量。这就是质量保障(Quality Assurance),具体的验证过程叫做软件测试(Testing)软件团队要从需求分析(Re-quirement Analysis)开始,把合适的需求梳理出来,然后逐步展开后续工作,如设计(软件架构)、实现(写数据结构和算法)、测试,到最后发布软件软件团队的人员也会流动,新的成员要尽快读懂已有的程序,了解程序的设计,这叫程序理解(Pro-gramComprehension)软件在运行过程中还会出这样那样的问题,也许我们要时不时给软件打一个补丁,或者维护众多的服务器,团队的新老成员要一起工作,修复各种各样的问题,这叫软件维护(Software Maintenance),或者服务运营(Service Operation)。
这一系列过程就是软件的生命周期(Software Life Cycle,SLC),有人得负责软件项目的管理(Project Management)一个好的软件,即使功能和同类软件区别不大,但是会让人感觉到非常好用。这就是软件的用户体验(User Experience)。用户体验和数据结构、算法没有直接的关系,但是很多非常成功的软件就赢在这个方面上面这些和软件开发活动(构建管理、源代码管理、软件设计、软件测试、项目管理)相关的内容,是软件工程的核心部分。广义上的软件工程也包括用户体验、用户界面设计(User Interface Design)等。所以,一个推论是:软件 = 程序 + 软件工程。一个扩展的推论是:软件企业 = 软件 + 商业模式。程序(算法、数据结构)是基本功,但是在算法和数据结构之上,软件工程决定了软件的质量;商业模式决定了一个软件企业的成败。软件从业人员和软件企业的道德操守会极大地影响软件用户的利益。
2.软件开发、软件工程
2.1软件开发的不同阶段
2.2软件工程
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。
人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。
软件是可以运行在计算机及电子设备中的指令和数据的有序集合,软件有各种形式:
- 系统软件:操作系统、设备驱动程序、工具软件等
- 应用软件:用户使用它们来完成工作,从管理核电厂到写文章,或者是通信、游戏、浏览网页、播放视频等
- 恶意软件:软件病毒等软件
1. 复杂性(Complexity)
软件可以说是人类创造的最复杂的系统类型,软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长
2. 不可见性(Invisibility)
工程师是“看”不到自己的源代码如何具体地在用户的机器上被执行的
3. 易变性(Changeability)
人们自然地期待软件能在下面两种情况下“改变”: a) 让软件做新的事情;b) 让软件适应新的硬件
软件不能独立存在,它总是要运行在硬件上面,它要服从系统中其他组成部分的要求,它还要服从用户的要求、行业系统的要求
5. 非连续性(Discontinuity)
输入上很小的变化,会引起输出上极大的变化
3.简单的四则运算
根据指定随机出题,小学的四则运算。使用rand()函数及srand()函数,查了下相关使用方法:rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。 rand()返回一随机数值的范围在0至RAND_ MAX 间。RAND_ MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。用户未设定随机数种子时,系统默认的随机数种子为1。rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它(下面这段代码测试了下两者的不同):
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
int i;
//srand((unsigned)time(NULL)); //初始化随机数种子
for (i=0; i<10; i++) //产生10个随机数
{
cout<<rand()<<" ";
}
cout<<endl;
return 0;
}
四则运算代码:
include <stdio.h>
include <stdlib.h>
include <time.h>
include <math.h>
int main()
{
int i=0;
int n=0;
int x=0;
int type;
char flag;
int left, right;
float result;
printf("请输入要出的题目数量\n");
scanf("%d",&n);
srand(unsigned(time(NULL)));
while(x<n)
{
type = rand() % 4;
left = rand() % 100;
right = rand() % 100;
switch(type)
{
case 0:
printf("%d + %d = ?\n", left, right);
break;
case 1:
printf("%d - %d = ?\n", left, right);
break;
case 2:
printf("%d * %d = ?\n", left, right);
break;
case 3:
printf("%d / %d = ?\n", left, right);
break;
}
i++;
while(i>=n)
{
printf("一共 %d 题\n",i);
printf("继续?[Y/N]\n");
fflush(stdin);
scanf("%c",&flag);
if(flag=='Y'||flag=='y')
{
printf("请输入要出的题目数量\n");
scanf("%d",&n);
i=0;
break;
}
printf("谢谢使用!\n");
fflush(stdin);
getchar();
return 0;
}
}
}
结果如图: