《构建之法》关键字于解析总结

专业术语整理:

 Program = data structure + algorithm
 Software = Program +Software Engineering
 Software Company =Software + Business Model

第一章

************************************************************************************************************

1.1软件 = 程序+软件工程

从一个简单的程序,扩展到一个满足各种功能的应用软件,再扩展到一个能保证服务质量的软件服务

这里的程序,也指的是源程序,他是建立再数据结构上的一些算法。程序还要对数据进行操作

一个复杂的软件不但要有合理的软件构架软件设计与实现、还要有各种文件和数据来描述各个程序

文件之间的依赖关系编译参数链接参数,这些都是软件构建的过程

有些程序要配置不同的界面,运行在中文、英文或者其他语言的操作系统上;有些程序还有32位版本、64位版本等。

这是源代码管理的问题--也叫配置管理。还有一系列的工具、流程和文档来保证程序的正确性,才能保证开发出来的

软件的质量。这就是质量保障,具体的验证过程叫做软件测试

软件团队的人员也会流动,新的成员要尽快读懂已有程序,了解程序的设计,这叫程序理解

软件在运行过程中还会出现这样与那样的问题,需要时不时给软件大补丁,或维护众多的服务,这叫软件维护、或者

服务运营。这一系列过程就是软件的生命周期,在这一周期中,有人得负责软件项目的管理

一个好的软件,即使功能和同类软件区别不大,但却会让人感觉到非常好用。这就是软件的用户体验,用户体验和数

据结构、算法没有直接的关系,但是很多费城成功的软件就赢在了这方面。软件还要处理不同的语言、不同地区的用

户对界面和功能的不同需求,这叫做软件的国际化和本土化

有些软件企业的商业模式有些是合情合理的;但有些不怎么合法;在相关法律完善之前,软件行业还有一个行规,即应

该有职业道德规范来约束IT人的行为

上面这些和软件开发活动(构建管理、源代码管理、软件设计、软件测试、项目管)相关的内容,是软件工程的核心部分

广义上的软件工程也包括用户体验、用户界面设计等

所以一个推论是:

        软件=程序+软件工程

一个扩展的推论是:

        软件企业=软件+商业模式

软件开发的不同阶段

1、玩具阶段      写程序练习数据结构/算法,用新语言尝试一下“Hello World”

2、业余爱好阶段    用JavaScript、ASPNET、Ruby写写网站

3、探索阶段      钻研新技术,应用新技术在软件行业创新

4、成熟的产业阶段   银行软件系统,互联网搜索行业、电子商务系统、Windows操作系统

************************************************************************************************************

1.2软件工程是什么

         软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。

         软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。

         软件工程和下列的学科相关:计算机科学、计算机工程、管理学、数学、项目管理学、质量管理、

         软件人体工学、系统工程、工设计和用户体验设计。

************************************************************************************************************

1.2.1软件的特殊性

         系统软件:操作系统、设备驱动程序、工具软件等

         应用软件:用户使用他们来完成工作、从管理核电厂到文章,或者是通信、游戏、浏览网页、播放视频等

         恶意软件:软件病毒等

1)复杂性    软件可以说是人类创造的最复杂的系统类型,大型软件有超过百万行的源代码,有上万个不同的文件。而软件工程师

          的肉眼通常一次只能看到30-80行源代码(相当于显示器的一屏)。软件的各个模块之间有各种显性或隐性的依赖关系,

          随着系统的成长和模块的增多,这些关系的数量往往以几何数的速度增长。

2)不可见性   软件工程师能直接看见源代码,但是源代码不是软件本身。软件以机器码的形式高速运行,还可能在几个CPU核上同时

          运行,还可能在几个CPU核上同时运行

3)易变性    软件看上去很容易修改,修改软件比修改硬件容易多了。人们自然的期待软件额能在下面两种情况下“改变”a)让软件做新的

          事情;b)让软件适应新的硬件。但是与此同时,正确的修改软件是一件困难的事请。

4)服从性    软件不能独立的存在。他总是要运行在硬件上面,他要服从系统中其他组成部分的要求,他还要服从用户的要求,行业系统

          的要求(例如银行利率的变化)

5)非连续性   人们比较容易理解连续的系统;增加输入,就能看到相应输出的增加。但是许多软件系统却没有这样的特性,有时输入上很小

          的变化,会引起输出上极大的变化

这些特性的前四个事佛瑞德.布鲁克斯(Fred Brooks Jr.)在No Silver Bullet 一文中提到的

第五个特性是瓦茨拉夫.拉力齐(Vaclav Rajlich)提到的

这些特性是由软件的本质决定的,软件还有其他特征:

1、有许多不同的程序设计语言、软件工具和软件开发平台

2、存在许多不同的软件开发流程

3、软件团队中存在许多不同的角色

4、软件既可以存储在磁带上,也可以存储在CD/DVD上

************************************************************************************************************

1.2.2 软件工程与计算机科学的关系

中国高校中的三种计算机软件的机构

    1、计算机科学与技术系或学院

    2、软件学院

    3、软件工程、软件工程学院

计算机科学这以学术邻域可以分为这些下面这些偏理论的领域:

    计算理论、信息和编码理论、算法和数据结构、形式化方法、程序设计语言

以及下面这些偏实践的领域:

    计算机体系结构、并行计算和分布式系统、实时系统和嵌入式系统、操作系统、计算机网络、科学计算、安全和密码学、

    人工智能这个邻域覆盖了许多相关的邻域,如模式识别、机械学习、数据挖掘、信息提取、等

    计算机图形学、计算机视觉、多媒体

    数据库和大规模数据处理

    万维网

    自然语言处理和语音

    人机交互

    软件工程

计算机科学和软件工程的不同侧重点

    计算机科学                软件工程

    发现和研究长期的、客观的真理       短期的实际结果(具体的软件会过时)

    理想化的                 对各种因素的折衷

    确定性,完美,通用性           对不确定性和风险的管理,足够好,具体的应用

    各个学科独立深入研究,做出成果      关注和应用各个相关的学科的知识,解决问题

    理论的统一                百花齐放的实践方法

    强调原创性                最好的、成熟的实践方法

    形式化,追求简明的公式          在实践中建立起来的灵感和直觉

    正确性                  可塑性

各个项目中的各个特点:

    Build To Learn:开发软件,构建系统的目的式做进一步的试验,试图发现客观规律或探求某方法的优劣。这些项目经常是科研论文的基础工作。

    Build To Show:为了突出地展现某个技术的作用,开发一些以演示为目的的软件,这些项目很吸引眼球,经常获得新闻报道,但是功能未必全面或实用。

    Build To Serve:为了服务一定范围的目标用户而构建的工具等,有时以公开SDK的形式发布,让别的研发人员使用

    Build To Win:以在市场上赢得用户为目标而构建的软件。这也是种种科学发现、技术突破最好的试金石。

************************************************************************************************************

1.2.3 软件工程的知识领域

    生命周期    软件需求、软件设计、软件构件、软件测试、软件维护

    专门领域    软件配置管理、软件工程管理、软件工程过程、软件工程模型和方法、软件质量

    理论基础    计算基础、数学基础、工程基础


************************************************************************************************************

1.2.4软件工程的目标——创造“足够好”的软件

1)用户满意度    用户在使用时发现了软件的很多问题,影响了用户使用软件的效率。

2)可靠性      某个软件经常会崩溃,某个操作系统会时不时死机,某个网站往往在最需要的时候登不上去。

3)软件流程的质量  软件团队和开发流程的问题太多,导致团队成员无法互相协作,按时交付软件。这也可以说式软件团队的bug

4)可维护性     某个软件太难维护了,按下葫芦起了瓢,修复了一个问题,另一个问题又出来了。也没有足够的文档,维护人员需要更多的资金和时间来维护这个

           软件,甚至建议推倒重写。

************************************************************************************************************

通过本书学习,作者希望读者达到的目标:

  1、研发符合用户需求的软件

      通过实际的工作手机、推导、提练需求,并在软件发布后通过实际数据验证需求的确被满足了。需求来自于实际,而不是自己想象出来的“需求”或者人云亦云

      的需求(例如:虚拟的、没人用的、也没有数据的“图书馆管理系统”)

  2、通过一定的软件流程,在预计的时间发布“足够好”的软件

      这个软件并不是期末前两天由两三个同学熬通宵赶出来的急就章,而是经历了一定的软件流程,通过全体团队成员的努力,在一个长期阶段(一个学期)内逐步完成的。

      对于现实生活中的软件团队来说,好产品不是某个英雄长期加班突袭出来的

  3、能证明所开发的软件式可以维护和继续发展的

      例如,对用户需求的分析有详细的文档说明,包括对将来发展的分析和计划。主要功能的设计文档说明和软件的实际行为一致,源代码完整并能构建出符合之来给你要求的版本。

      能用软件管理软件看到源代码的每次修改记录,Bug的修改过程。关键模块有可以正常执行的单元测试、压力测试脚本,等等-

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

p18-2
1)在问题后面说明哪一章节的什么内容引起了你的提问,提供一些上下文。
2)列出一些事例或资料,支持你的提供。
3)说说你提问题的原因,你是因为自己的假设和书中的不同而提问,还有不懂书中的术语,
还是对推理过程有疑问,还是对推理过程有疑问,还有书中的描述和经验(直接或间接经验)相矛盾

************************************************************************************************************
question、1:
1、单元测试—— ——第二掌 单元测试;第13章 软件测试
2、在任何语言与环境下编写的软件都需要编写大量单元测试,甚至在一些大型公司发布的软件大部分时间都是用来编写单元测试的
3、
 1)在实习期间测试的工作大多数是测试电话卡与三大运营商的互联互通以及公司网站的稳定性。
 2)在简单了解第二章知识后大致知道了单元测试的基本含义,这是一个类似于程序注释的存在。
以下为我在本章最为疑惑的
 1)就是如何编写一个“好”的单元测试以及单元测试在软件中是一个怎样的定义。
 2)为何一个软件之中需要大量的单元测试
 3)单元测试覆盖了所测试单元的所有的代码路径有何意义
 4)单元测试产生了一致或重复的(包括对的以及错的)结果,这代表着什么
 5)如何创建一个单独的并且不影响原本软件的运行效果的同时又达到了测试的目的单元测试
************************************************************************************************************
question、2:
1、结对编程 —— ——第4章 两人合作
2、在程序员自我审核代码时,常常会因为思维的固定,很难发现自己程序所存在的bug。
以下为我在本章最为疑惑的
 1)如果这个需求是由部分人讨论而完成的,那么该如何正确的进行结对编码,从而对编码进行修正。
 2)在结对编码时有一些较为细小的代码,常常会因为可能存在的疏忽中漏掉,在两个人以上的结对编码
    时,也会有概率出现此类问题。如何精确的避免此类问题
 3)在编程时无论何种语言和编译器的编码规范是一样的吗?
************************************************************************************************************
question、3:
1、敏捷流程 —— ——第6章 敏捷流程
2、在企业中经常会连续1-2个星期的连续加班来冲刺完成。
以下为我在本章最为疑惑的
 1)敏捷的做法大多是依靠个人和交流完成拿起手中可用的程序就开始编程软件,那在这同时有些平台
 之间的操作同步问题出现是否会导致整个程序的推到重写,从而成倍的增加了工作量
 2)在前期为了满足客户需求是的敏捷流程是否会在后期维护时出现大量的漏洞与bug,甚至出现推到重现的出现
 3)在敏捷流程完成代码后是否会出现注释不详细测试单元不完整等问题时但这个模块有不是同一个人完成,而出现思维的不同步
************************************************************************************************************
question、4:
1、实战 —— ——第7章 实战中的软件工程
2、在目前的学习中很少接触于实战中的一些编程经验,故此对于实战的海洋,一片茫然
以下为我在本章最为疑惑的
 1)如何在实战中高效的完成代码的同时还能别标识别人可理解的详细注释
 2)如何在飞速发展的互联网之中体现自己的价值
 3)如何在一次工程实践中总结自己学到了什么和有什么地方得到了改进
 4)在有限的时间内如何计划与规划自己的编程时间和构思设计时间
 5)身为大学生的我们在缺法实战演练时该如何提升自己的能力
************************************************************************************************************
question、5: 
1、需求分析 —— ——第8章 需求分析
2、在一个软件中用户的额外需求就是自己需要改进的地方
以下为我在本章最为疑惑的
 1)在初期计划软件时如何为后期维护做铺垫
 2)如何在客户给与的需求中提炼出一些额外的需求
 3)如何提高自己的估计能力
************************************************************************************************************
question、6:
1、用户 —— —— 第10章 典型用户和场景;第12章 用户体验
2、一个软件中用户的使用量对于一个程序来说起着决定这个软件是否优秀的作用
以下为我在本章最为疑惑的
 1)一个软件改用何种手段来吸引用户
 2)怎样满足客户的需求,才能留住用户
 3)一个软件可同时完成不同的用户的不同的需求算是一个好软件吗
 4)如何从用户转到经典用户再到场景最后到任务
 5)为何在正式写一个软件时,自认为写的够完整的说明书,但当有用户使用软件时还是会出现不明所以的状况
 6)在满足客户的需求的同时如何提升用户的用户体验
************************************************************************************************************
question、7:
1、软件的实现 —— ——第11章 软件的设计与实现 第14章 质量保证
2、在将来步入公司之后都会一步步开始写软件从而实现软件
以下为我在本章最为疑惑的
 1)在今天未完成程序但是有思路时,该如何保存这个思路防止第二天思路的遗漏
 2)在写每日日志时,该如何整理,才能防止日后观看时不明所以
 3)在一个大型程序完成时,但出现的结果不尽如人意,该如何快速的查找软件中的逻辑错误
 4)什么样的软件才是有质量的软件
 5)在大型编程中如何保证效率的同时保证质量
************************************************************************************************************
question、8:
1、职业道德—— ——第17章人,绩效和职业道德
2、身边有许许多多的案例因为抵不住金钱的诱惑走上了违法的道路
以下为我在本章最为疑惑的
 1)IT行也的职业道德是什么
 2)法律是如何it人的
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
p18-3
软件有很多种分类,下面是另一种:ShrinkWrap(包装盒子里面的软件)、Web APP(基于网页的软件)
Internal Software(企业或学校或某组织内部的软件)、Games(游戏)、Mobile APPs(手机应用)
Operating Systems(操作系统)、Tools(工具软件),选取三种软件,请分析他们各自的特点
1)这些软件的开发者是怎么说服你(陌生人)成为他们的用户的?他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的
2)这些软件是如何到你手里的(邮购、下载、互相拷贝)?你当时上几年级?你对这个软件的感觉如何?
************************************************************************************************************
软件1:Games:steam
1、通过大量的免费游戏以及打折游戏吸引我(陌生人),盈利方式为:从开发商那以低价买入游戏,再高一点卖游戏来赚取差价,
 而且作者在steam平台挂售游戏时也要教取一定的费用
2、通过steam官网下载,当时在上高一,大量优秀的游戏都会有机会在此平台展示给各地的游戏玩家,平台里的试玩功能同时
 也不会让任何一个好的伪劣游戏浑水摸鱼
************************************************************************************************************
软件2:Tools:Notepad++
1、在初学程序之时大量的”过来人”给我推荐此应用,此应用可免费下载,盈利方式未知
2、Google上download、当时下载大二、一个适合于编程的记事本应用,支持大量的编程语言,可以自动识别程序的语言,唯一缺点是不能运行
************************************************************************************************************
软件3:Operating Systems(操作系统):windows
1、世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,从我最开始接触电脑时使用的就是windows xp
直至现在的windows 10系统,盈利方式:使用windows的用户支付一定费用购买系统的Key来使用完整版的操作系统
2、电脑中自带windows系统,小学,一个最为普遍的教为大众接受的操作系统

 

posted @ 2019-09-07 18:06  kingvist  阅读(302)  评论(4编辑  收藏  举报