《构建之法,邹欣》阅读笔记

前言:

从2018年10月30日开始,阅读由微软工程师邹欣老师撰写的《构建之法》一书,全书共435页,每天阅读15页,在一个月(30天)完成。每天阅读完成后,需要思考当日的阅读要点和一些思考。
真正让自己感受到积累的效果和伟大!
以下是该书的封面:

周序号 Mon Tue Web Thu Fri Sat Sun
第1周 10.30(115) 10.31(1631) 11.01(3247) 11.02(4863) 11.03(6479) 11.04(8095)
第2周 11.05(96111) 11.06(112127) 11.07(128153) 11.08(154169) 11.09(170185) 11.10(186201) 11.11(202217)
第3周 11.12(218233) 11.13(234249) 11.14(250269) 11.15(270285) 11.16(286301) 11.17(302317) 11.18(318333)
第4周 11.19(334349) 11.20(350369) 11.21(370385) 11.22(386401) 11.23(402417) 11.24(418435)

每日打卡阅读和写作:

10月30日打卡:

阅读页码: 1~15页

阅读概要:

今天阅读了《构建之法》的前15页。这一节是整个软件工程的概论,邹欣老师从大家众所周知的一个命题:程序= 数据结构+算法,引出了程序的这一个概念。然后又用一个实际的案例,就是一个家长帮自己的孩子写了一个每天出算术题的小程序,到随着学校老师新提的不断需求,而扩展到一个比较大的系统的软件工程的范畴。引出了一个扩展链:
程序->应用软件->软件服务.
然后又扩展出了整个软件工程的技术名词,包括:
源程序
数据
软件架构
软件设计与实现
源代码管理
配置管理
质量保障
软件测试
需求分析
程序理解
软件维护
服务运营
软件生命周期
项目管理
用户体验
国际化和本地化
软件商业模式
职业道德规范

由此从最原始的公式逐渐推演和扩展:

  • 程序= 算法 + 数据结构
  • 软件= 程序 + 软件工程
  • 软件企业= 软件 + 商业模式

由此得出一个结论:程序(算法,数据结构)是基本功,但是在算法和数据结构之上,软件工程决定了软件的质量;商业模式决定了一个软件企业的成败。软件从业人员和软件企业的道德操守会极大地影响软件用户的利益。

然后,通过类比人类对飞机的发展阶段:从叠纸飞机(玩具阶段),到用气球实现飞屋环游(业余爱好阶段),再到莱特兄弟发明飞机(探索阶段),再到现在的商业大飞机(成熟的产业阶段)。作者指出一个软件的开发阶段也是从简单到复杂的阶段,并且进行了对比,指出在每一个阶段如果成功或失败,会引起的不同结果。

在大家对软件工程有了一个模糊的印象后,作者用专业化的定义对软件工程做了定义。同时又指出了软件的特殊性。
然后针对目前全国各大高校,开的与计算机和软件相关的专业,指出了这些专业在培养侧重点方面的区别。

通过这一天的阅读,对软件工程的了解,也从原来的模糊逐渐到清晰。而作为身在其中的工程人员,也清楚了自己在整个软件工程中的定位,其中的很多词汇也都是平时自己工作中耳熟能详的。
期待明天的继续阅读!

10月31日打卡:

阅读页码: 16~31页

阅读概要:

作者之前已经对计算机和软件工程进行了一个大致的描述,相信读者已经跃跃欲试了。然而,作者给大家提了一个醒,就是关于如何去衡量一个软件是否合格的标准或评价。那就是软件测试了!
接下来作者讲解了软件测试的概念和一些分类。
软件测试的概念:

软件测试的分类:
(1)单元测试
(2)回归测试
(3)用户测试
结合一个例子,作者讲解了这三类软件测试的概念和区别。

11月01日打卡:

阅读页码: 32~47页

阅读概要:

作者针对之前提到的软件测试,介绍微软发明的一套用于程序性能的工具:
在微软Visual Studio中选择Tools->Performance Tools->Performance Wizard,可以进行两种方式的效能分析:抽样(Sampling)和代码注入(Instrumentation)。
并且针对一个具体的程序,统计词频的程序,来讲解如何用这两种方法来进行分析和性能改进。而后,作者又强调:虽然优化很重要,但是如果我们不经分析就盲目优化,也许只会事倍功半。

然后作者开始讲述软件的个人开发流程,有CMMI(软件能力成熟度模型)和PSP(Personal Software Process),主要讲解后者对软件开发流程的分配。
并且对大四学生和工作三年的软件开发工程师,针对PSP这套模型,得出了一个时间分配的对比表格。根据对比得出一个结论:
工程师在“需求分析”和“测试”这两方面要花更多的时间(多60%以上);但是在具体编码上,工程师比学生要少花1/3的时间。从学生到程序员,并不是更加没完没了地写程序。

然后作者又指出了目前在高校中,软件设计作业的局限性。就是无法体现出真正的软件工程。
师生们身处轰轰烈烈的软件产业大环境,但是在软件工程课上做的题目却是非常简陋,没有起到应有的作用,这的确是一件很有讽刺意义的事情。
作者指出目前软件工程课一个基本的作业“图书馆信息系统”存在着很多问题,并由此对需求进行扩展,指出:
(1)从数据方面扩展
(2)从需求方面扩展
(3)从用户方面扩展
(4)从软件构建方面扩展
等等,指出在开发软件时需要考虑的各种扩展因素。

最后,在本章最后,作者布置了一个作业,实现一个类似wc.exe(代码行统计)的软件作业。并且在布置作业时,非常具体的指出了这个作业的:
基本功能,扩展功能,高级功能。然后,希望学生们按照之前讲的PSP,来记录在完成这个作业的过程中,是如何体会软件工程的各个组成部分的。最后,又指出如何来测试自己所完成作业
的质量。

11月02日打卡:

阅读页码: 48~63页

阅读概要:

今天作者主要讲述的是关于“软件工程师的成长”的话题。相信这个话题也是所有身处这个行业的工程师们最关注的。
要衡量一个软件工程师的能力,那么必须设计一定的衡量指标。就像衡量一个NBA的职业运动员,或者是一个俱乐部的足球运动员,有很多的衡量指标一样,软件工程师也是有很多的衡量指标的。
作者指出,软件项目的确需要创造性,需要一些意外,一些惊喜。但是,更多的是常规的、可重复的任务。一个成熟的软件工程师应该能够降低任务交付时间的标准方差。如果你能长时间稳定而按时地交付工作的结果,内部和外部的顾客就会对你的工作有信心,更喜欢与你合作。
作者讲述了团队对个人的一些期望点。与PSP想对应的一个概念是TSP(Team Software Process),TSP对团队成员的要求如下:
(1)有效的交流;
(2)说到做到,按时交付;
(3)接受团队赋予的角色并按角色要求工作;
(4)全力投入团队的活动;
(5)按照团队流程的要求工作;
(6)时刻做好准备;
(7)理性的工作。
著名的艺术家Chuck Close说:我总觉得灵感是属于业余爱好者的。我们职业人士只是每天持续工作。今天你继续昨天的工作,明天你继续今天的工作,最终你会有所成就。

接下来作者提出了软件工程师的一些思维误区:
(1)分析麻痹;
(2)不分主次,想解决所有依赖问题;
(3)过早优化;
(4)过早扩大化/泛化(Premature Generalization)——画扇画,调侃目标和远景。

接下来作者提出了软件工程师的职业发展,指出了专和精的关系,职业成长,自我评估。

接下来作者根据自己对魔方的真实案例,指出了如何准确地评价自己的能力。并且用一个实际的案例,一个简历上写着是“精通”Visual Studio C#编程的大学生,在进行面试时解决的问题,都是一些最最基本的问题。结果,你发现他把时间都花在“解决(低层次)问题”上了,面试官想考察的“算法技能”、“C#程序设计技能”都无暇顾及。

那怎么提高技能呢?
答案很简单,通过不断的练习,把那些低层次的问题都解决了,变成不用经过大脑的自动操作,然后才有时间和脑力来解决较高层次的问题。
作者指出,这正好对应教育理论中的三个区域的理论(舒适区,学习区,恐慌区)。
我们不应该一开始就让自己处于恐慌区,这样会极大的打消自己的学习积极性。而应该选择合适的“学习区”来学习,不断构建自己的舒适区,从而扩展学习区,最后在某些领域达到技能的精通,是一个循序渐进的好办法。

本章的最后,作者还是对大家比较熟悉的魔方,来描述不同的精通程度,相对应的魔方的技能。那么作者如何考察一个“精通”魔方的面试者呢:
(1)给面试者一个打乱颜色的魔方;
(2)要求他把六面还原;
(3)如果还原了,要求他把魔方恢复成面试官最初给他的那个混乱的局面,必须一模一样。

11月03日打卡:

阅读页码: 64~79页

阅读概要:

这部分主要分为两个部分的内容。
前半部分63~67页,是作者针对前面的章节提出的一些课后思考题,诸如:
(1)选哪一种医生;
(2)软件开发到底是工程,还是艺术;
(3)绞刑架和职业发展的故事;
(4)针对案例,在博客中撰写观点;
(5)成长和代码量的关系;
(6)学什么,怎么学,核心竞争力是什么?
(7)各式各样的工程师;
(8)对职业**的思考;
等等。

接下来是新的一章:第4章 两人合作
这章主要讲述了代码规范,极限编程,结对编程等概念,以及代码复审的重要概念。
并且详尽地列出了代码规范的一些要求,以及为什么要进行代码审查,如何进行代码审查。
这些都和自己平时的工作有密切的联系,受益匪浅。

11月04日打卡:

阅读页码: 80~95页

阅读概要:

本段依然承接上述,关于代码复审进行描述,包括代码复审的步骤和核查表。
代码复审的核查表包括:
(1)概要部分
(2)设计规范部分
(3)代码规范部分
(4)具体代码部分
(5)效能
(6)可读性
(7)可测试性

接下来讲述了结对编程,描述了结对编码产生的原因,方式。
在关于两人结对编程时,两个人之间如何正确地进行反馈时,作者指出当一个人对另一个人的行为进行反馈时,有三个层次:
(1)最外层:行为和后果;
(2)中间层:习惯和动机;
(3)最内层:本质和固有属性。

在接下来的练习与讨论中,有关于代码审查的讨论,值得深思。

11月05日打卡:

阅读页码: 96~111页

阅读概要:

本章的标题为《团队和流程》。
主要讲解了团队,软件团队模式,开发流程。
开发流程是每一个成熟的软件团队,都必须要制定和遵守的。其中比较著名的开发流程有:
(1)瀑布模型(Waterfall Model)
(2)瀑布模型的各种变形
(3)统一流程(Rational Unified Process, RUP)
(4)渐进交付流程(Evolutionary Delivery),包括MVP和MBP
MVP (Minimum Viable Product, 最小可行产品), 如互联网公司快速迭代的产品。
MBP(Maximal Beautiful Product, 最强最美产品),如iPhone, iPad等。

最后介绍TSP(Team Software Process)的一些原则。

11月06日打卡:

阅读页码: 112~127页

阅读概要:

本部分是第6章《敏捷流程》,主要讲解敏捷的流程简介,问题和解法,敏捷的团队和敏捷总结。

  1. 敏捷的流程简介:
    主要讲解了敏捷的12条原则:主要包括
    (1)尽早并持续地交付有价值的软件以满足顾客需求
    (2)敏捷流程欢迎需求的变化,并利用这种变化来提高用户的竞争优势
    (3)经常发布可用的软件,发布间隔可以从几周到几个月,能短则短
    (4)业务人员和开发人员在项目开发过程中应该每天共同工作
    (5)以有进取心的人为项目核心,充分支持并信任他们
    (6)面对面的交流始终是最有效的沟通方式
    (7)可用的软件是衡量项目进展的主要指标
    ......

敏捷的步骤:
(1)找出完成产品需要做的事情——Product Backlog
(2)决定当前的冲刺(Sprint)需要解决的事情——Sprint Backlog
(3)冲刺
冲刺期间,团队通过每日例会(Scrum meeting)进行面对面的交流。每日立会强迫每个人向同伴报告进度,迫使大家把问题摆在明面上。同时团队要启动每日构建(Continous Integration, CI),让大家每天都能看到一个逐渐完善的版本。
Scrum master根据项目的情况,可以用燃尽图,任务看板等,显示任务完成进度。
冲刺阶段,是以时间驱动的(Time-boxed)。时间一到就结束。
(4)得到软件的一个增量版本,发布给用户。

  1. 敏捷流程的问题和解法
    针对上面提到的敏捷流程的四个步骤,每个步骤中都会有一些可能出现的问题。作者结合案例都给予了总结和分析。

  2. 敏捷团队
    敏捷能成功实施的关键在于Scrum master.
    敏捷对团队的要求:
    (1)自主管理(Self-managing)
    (2)自我组织(Self-organization)
    (3)多功能型(Cross-functional)

  3. 敏捷总结
    作者提出一些思考:
    敏捷是很特别的吗?敏捷流程的经验和教训,以及关于敏捷的问答。

11月07日打卡:

阅读页码: 128~153页

阅读概要:

本部分为第7章《实战中的软件工程》。
作者指出,前面的章节介绍了软件开发的各种方法论以及一些原则和宣言。宣言令人激动,但不能代替软件,用户不会看了宣言就掏钱买软件。
因此,作者介绍世界上最大的软件公司——微软公司的方法论——微软解决方案框架(Microsoft Solution Framework, MSF)。

MSF有9条基本原则:
(1)推动信息共享与沟通
(2)为共同的远景而工作
(3)充分授权和信任
(4)各司其职,对项目共同负责
(5)交付增量的价值
(6)保持敏捷,预期和适应变化
(7)投资质量
(8)学习所有的经验
(9)与顾客合作

针对每一个原则,作者都采用问答的方式,来介绍这个原则的具体含义,以及在现实中会遇到的实际问题。

接下来作者介绍了:
MSF团队模型
MSF过程模型

最后作者用微软创业时的实例,讲述了微软的这套框架是如何根据公司的实际情况,从无到有的(MS的软件开发流程的演进)。

11月08日打卡:

阅读页码: 154~169页

阅读概要:

本部分是系列的第8章《需求分析》。
作者在这章主要讲解了:

  1. 软件需求
  2. 软件产品的利益相关者
  3. 获取用户需求——用户调研
  4. 竞争性需求分析的框架
  5. 功能的定位和优先级
  6. 计划和估计
  7. 分而治之(Work Breakdown Structure)

今天读的是关于需求分析的前4部分。
8.1 软件需求
软件团队如何才能准确而全面地找到用户的需求呢?
(1)获取和引导需求
(2)分析和定义需求
(3)验证需求
(4)在软件产品的生命周期中管理需求

软件的需求,也可以从其他角度来划分,如:
(1)对产品功能性的需求
(2)对产品开发过程的需求
(3)非功能性需求
(4)综合需求

8.2 软件产品的利益相关者
软件团队在分析软件需求时,需要考虑如下这些利益相关者:
用户(User, End-user)
顾客(Customer, Client),这些人不一定是软件的直接用户
市场分析者
监管机构
系统/应用集成商
软件团队
软件工程师

8.3 获取用户需求——用户调研
本节作者介绍了几种,用于用户调研的方法。

8.4 竞争性需求分析的框架
NABCD是一个有效的方法。
N(Need, 需求)
A, Approach, 方法
B,Benefit, 好处
C,Competitors,竞争
D,Delivery,推广

11月09日打卡:

阅读页码: 170~185页

阅读概要:

本部分是接上一天的内容,继续介绍需求分析的四个点。
8.5 功能的定位和优先级
(1)杀手功能/外围功能
(2)必要需求/辅助需求
作者用四个象限的方法,指出每一组组合,软件团队应该采取的措施和态度去应对这些需求。

8.6 计划和估计
(1)目标、估计和决心
(2)找出估计后面的假设
(3)提高估计能力的招数

8.7 分而治之
WBS,通常从最终的产品开始,一层一层往下,把大型交付件分割为小型、具体的交付件。
WBS的基本原则如下:
(1)保证所有的子节点覆盖了全部父节点包含的内容
(2)保证各个子节点不要相互覆盖
(3)叶子节点要保证足够小,能在一个里程碑中完成
(4)从结果出发构建WBS,而不是从团队的活动出发

11月10日打卡:

阅读页码: 186~201页

阅读概要:

本部分开始第9章《项目经理》。
PM有几种分类。
Product Manager
Project Manager
Program Manager

PM的核心要求是:根据市场和用户需求,协调各部门资源,正确地把握产品定位和方向,解决用户的痛点,持续优化产品。

作者接下来介绍了微软PM 的来历。
主要是解决:
交流成本问题
开发和测试搞不定的事情

PM做开发和测试之外的所有事情

成为合格的PM,需要具备的能力:
(1)观察、理解和快速学习的能力
(2)分析管理能力
(3)一定的专业能力
(4)自省的能力

PM的领导力——高效的团队讨论

11月11日打卡:

阅读页码: 202~217页

阅读概要:

本节阅读主要分为两个部分。
第一部分是接着昨天的阅读,关于PM的领导力——高效的团队讨论的介绍。

组织会议的人应该做到:
(1)明确会议目的,要解决的问题是什么;
(2)推动会议进程,促使与会者在每一个阶段做合适的事情;
(3)总结会议,记录要点。

会议的思维活动包括:
(1)理清事实
(2)表达直觉和感情
(3)从乐观的角度分析问题
(4)从悲观的角度分析问题
(5)从创意角度去分析问题

总结:
改进会议的方法:大家同时从一个角度出发分享,进行类似的思维活动,然后转到另一个角度。
(备注:这个和之前我在得到上订阅的刘润的《5分钟商学院》中的开会议的六顶帽子有异曲同工之妙~)

9.5 PM和风险管理
PM要在整个项目的生命周期管理风险。对于软件项目来说,风险是在正常软件生命周期事件之外的,可能发生的影响项目的成功的事件。

风险管理的几个层次:
第一层次:啊呀!大问题(Crisis!)
第二层次:缓和并防止问题
第三层次:预计(Anticipation)
第四层次:把问题变为机会(Opportunity)

接下来是第10章 典型用户和场景

该章主要分为:

  1. 典型用户和典型场景
    (1)Visual Studio的典型用户
    (2)典型用户的价值
    (3)怎么定义典型用户
    (4)从典型用户到场景
    (5)从场景到任务
    (6)场景/故事/Story的模板

11月12日打卡:

阅读页码: 218~233页

阅读概要:

本节续前一天的章节,主要讲述了典型用户到场景的部分。
(4)从典型用户到场景
典型用户和他要达到的目标要相互对应。对于每一个目标,列出达到目标所必须经历的过程,这就是场景。用户和系统有成百上千种可能的交互情况,写场景时要有针对性。
银行从业者的一次经历,体会本行“ATM无卡取现”功能的强大:
特意带上手机和令牌,不带银行卡,感受一下我行ATM的无卡取现,结果连自助银行的门儿都没进去,不刷卡怎么开门啊......

(5)
明确了场景的概念后,接下来由架构设计师和各个模块的负责人一起,沿着子系统/模块的所属关系把场景划分开。
不同的任务将会把一个场景编织起来,虽然有多个开发者参与这项工作,但是应该有一个开发者对整个场景负责。得到开发任务后,就可以创建和分配测试任务。

10.2 用例(Use Case)
用例也是很常用的需求分析工具。用例的基本构成元素:
(1)标题
(2)角色
(3)主要成功场景
(4)扩展场景

使用Use Case的原则如下:
(1)通过讲简单的故事来传递信息
(2)保持对全系统的理解
(3)关注用户的价值
(4)逐步构建整个系统,一次完成一个用例
(5)增量开发,逐步构建整个系统
(6)适应团队不断变化的需求

10.3 规格说明书(Specification, Spec)
10.3.1 功能说明书
功能说明书从用户的角度描述软件产品的功能、输入、输出、界面、功能的边界问题、功能的效率、国际化、本地化、异常情况等,不涉及软件内部的实现细节。
写Spec的一个基本步骤:
(1)定义好相关的概念
(2)规范好一些假设
(3)避免一些误解,界定一些边界条件
(4)描述主流的用户/软件交互步骤
(5)一些好的功能还可能有副作用
(6)服务质量的说明

10.3.2 功能说明书的模板

10.3.3 技术说明书
技术说明书又叫设计文档,它用于描述开发者如何去实现某一功能,或相互联系的一组功能。
设计文档应该说明工程师的设计是如何体现下列原则的:
(1)抽象
(2)内聚/耦合/模块化
(3)信息隐藏和封装
(4)界面和实现的分离
(5)如何处理错误情况
(6)程序模块对于运行环境、相关模块、输入输出参数有什么假设?这些假设和相关的人员验证过么?
(7)应对变化的灵活性

10.4 功能驱动的设计
如何才能把用户的需求变成团队成员可以直接操作的开发工作,然后源源不断地实现这些需求?
功能驱动的设计(Feature Driven Design, FDD)是一种方法。
该方法论的原则如下:
第一步,构造总体模型
第二步,构造功能列表
第三步,制定开发计划
第四步,功能设计阶段
第五步,实现具体功能

11月13日打卡:

阅读页码: 234~249页

阅读概要:

本次阅读开始新的章节,第11章,软件设计与实现
11.1 分析和设计方法
11.2 图形建模和分析方法
11.3 其他设计方法
11.4 从Spec到实现
11.5 开发阶段的日常管理
11.6 实战中的源代码管理
11.7 代码完成

以下依次进行介绍:
11.1 分析和设计方法
写软件是为了解决用户的需求,整个软件开发周期我们需要表达、传递和处理下面的这些信息:
(1)需求分析阶段:
在问题领域的现实世界里,都有哪些实体,如何抽象出我们真正关心的属性,实体之间的关系是什么,在这个基础上,用户的需求是什么,软件如何解决用户的需求。
(2)设计与实现阶段:
软件是怎么解决需求的?现实世界的实体和属性在软件系统中是怎么表现和交换信息的?
(3)测试和发布阶段:
软件真的解决了用户需求了吗?软件解决需求时候的效率如何?用户还有什么新需求?

11.2 图形建模和分析方法
我们要给事物建造出一个“模型”,描述事物、事物的属性、事物之间的关系(静态的)以及各个事物之间的信息传递(动态的)。
11.2.1 表达实体和实体之间的关系
11.2.2 表达数据的流动
11.2.3 表达控制流
11.2.4 统一的表达方式

11.5 开发阶段的日常管理
11.5.1 闭门造车
11.5.2 每日构建(Daily Build)
11.5.3 构建大师
11.5.4 宽严皆误
11.5.5 小强地狱
小强地狱——让Bug多的队员专心修复Bug,不要开发新功能。

11月14日打卡:

阅读页码: 250~269页

阅读概要:

本次阅读紧接着昨天的阅读。
11.6 源代码管理
软件工程的质量要靠软件工具和软件流程来保证。
软件的源代码管理工具,加上构建系统,能保证一个复杂软件在多个角色、多个团队的合作下,按时以合适的质量发布。如果你写一个Hello World程序,当然不需要这些工具,就像你用儿童积木搭房子过家家那样,但这不是建筑工程。

11.7 代码完成
如果项目管理有两个主要的工作项类型:Task, Bug。那这个阶段就是所有的代码任务都完成了。
也许我们现在还有许多缺陷(Bug),还有一些与测试相关的任务。这些要留到以后稳定阶段才能全部解决。

接下来开始全新的一章, 第12章,用户体验

12.1 用户体验的要素
12.1.1 用户的第一印象
用5W1H来衡量用户体验:
Who
When
Where
What
Why
How

12.1.2 从用户的角度考虑问题
12.1.3 软件服务始终都要记住用户的选择
长期使用之后,软件会更好用么?

  1. 软件用得越多,一样难用
  2. 软件用得越多,越发难用
  3. 软件用得越多,越来越好用

12.1.4 短期刺激和长期影响
12.1.5 不要让用户犯简单的错误
12.1.6 用户体验和质量
12.1.7 情感设计

11月15日打卡:

阅读页码: 270~285页

阅读概要:

本节继续昨天的讲解,用户体验

12.2 用户体验设计的步骤和目标
用户体验设计的一个重要目的就是要降低用户的认知阻力,即用户对于软件界面的认知和实际结果的差异。
用户体验设计的步骤:
(1)概要设计
(2)行为(交互)设计
(3)界面设计

12.3 评价标准
(1)尽快提供可感触的反馈
(2)系统界面符合用户的现实惯例
(3)用户有控制权
(4)一致性和标准化
(5)适合各类型的用户
(6)帮助用户识别、诊断并修复错误
(7)有必要的提示和帮助文档

12.4 贯穿多种设备的用户体验

接下来进入全新的一章,第13章 软件测试
13.1 基本名词解释及分类
Bug
Test Case
Test Suite

Bug可以分解为:
症状
程序错误
根本原因

13.1.1 按测试设计的方法分类
黑箱和白箱测试

13.1.2 按测试的目的分类

  1. 功能测试
  2. 非功能测试

13.1.3 按测试的时机和作用分类

13.2 各种测试方法
13.2.1 单元测试和代码覆盖率测试
13.2.2 构建验证测试
13.2.3 验收测试
13.2.4 探索式的测试
13.2.5 回归测试
13.2.6 场景/集成/系统测试
13.2.7 伙伴测试
13.2.8 效能测试
13.2.9 压力测试
13.2.10 内部/外部公开测试(Alpha/Beta Test)
13.2.11 易用性测试
13.2.12 小强大扫荡

11月16日打卡:

阅读页码: 286~301页

阅读概要:

现在是11月27日了。虽然上周末已经终于把这本书看完了,但还是无法保证及时地把内容摘要记录下来。看来一件事,要坚持一个月不动摇,还真的是很难的呀。

这节还是接上一次内容,主要讲解了测试的知识。
包括:上一节提到的13.2.5~13.2.12的全部内容。

关于13.2.6的场景/集成/系统测试:
在软件开发的一定阶段,我们要对一个软件进行全面和系统的测试,以保证软件的各个模块都能共同工作,各方面均能满足用户的需求。这类测试叫系统/集成测试。
(我之前在公司的时候,还给新同事进行过类似的培训,关于单元测试,集成测试,验收测试的区别)

但是作者在这里提到一个疑问——那到底应该什么时候做集成测试呢?是不是越早越好?
答:原则上是当一个模块稳定的时候,就可以把它集成到系统中,和整个系统一起进行测试。在模块本身稳定之前就提早做集成测试,可能会报出很多bug。但是这些由于提早测试而发现的Bug,有点像汽车司机在等待绿灯时不耐烦而拼命地按喇叭——也就是说,有点像噪音。所以,测试也需要把握时机。

关于13.2.8 效能测试
用户使用软件,不光是希望软件能够提供一定的服务,而且还要求服务的质量要达到一定的水平。软件的效能是这些“非功能需求”或者“服务质量需求”的一部分。
以下的概念包括:
设计负载:首先要定义什么是正常的设计负载。从需求说明出发,可得出系统正常的设计负载。
令用户满意的服务质量

设计负载的细化
服务质量的细化(现实的静态数据,现实的动态数据)

关于13.2.9 压力测试
压力测试严格地说不属于效能测试。压力测试要验证的问题是:软件在超过设计负载的情况下,是否仍能返回正常结果,没有产生严重的副作用或奔溃。

在测试的时候,如何增加负载呢?可以从以下两个方面来考虑:

  1. 沿着用户轴延长
    比如,以购物网站为例,正常的负载是20个请求/秒钟。如果有更多的用户登录,怎么办?那么负载就会变成30、40、100个请求/秒钟,或更高。

  2. 沿着时间轴延长
    网络的负载有时间性,负载压力的波峰和波谷相差很大,那么如果每时每刻负载都处于波峰,程序会不会垮掉?这就是沿着时间轴延长。一般要模拟48小时的高负载才能认为系统通过测试。

13.3 实战中的测试
13.3.1 似是而非的测试观念
13.3.2 测试工作中的文档
(1)测试设计说明书(TDS)
(2)测试用例(Test Case)

  1. 等价类划分
  2. 边界值分析
  3. 决策表、因果图和功能图方法
  4. pair-wise和正交实验设计方法
    (3)错误报告
    (4)测试修复,关闭缺陷报告
    (5)测试报告

11月17日打卡:

阅读页码: 302~317页

阅读概要:

本节接上一天的讲解,主要讲解:运用测试工具进行测试。
13.4 运用测试工具
13.4.1 运用工具记录手工测试
13.4.2 运用工具记录自动测试
13.4.3 如何测试效能
除了测试功能方面,还需要测试服务质量,如效能测试, 负载测试,压力测试.
体会一下这三种测试的区别:
(1)效能测试:在100个用户的情况下,产品搜索必须在3秒钟内返回结果.
(2)负载测试:在2000个用户的情况下,产品搜索必须在5秒钟内返回结果.
(3)压力测试:在高峰压力(4000个用户)持续48小时的情况下,产品搜索的返回时间必须保持稳定.系统不至于崩溃.

备注:不同的角色在开发过程中有相互合作,相互制约的作用,不能替代.测试人员在做验证测试时,需要做多方面,多平台的测试,这些工作量,也许远远超过了开发人员的能力范围.因此,必须要由测试人员来验证并处理已经修理好的bug.

接下来开始新的一章: 第14章 质量保障
记住如下的公式:
软件(质量) = 程序(质量) + 软件工程(质量)
程序的质量体现在软件外在功能的质量.
软件工程的质量,则体现在如下方面:
(1)软件开发过程的可见性
(2)软件开发过程的风险控制
(3)软件内部模块,项目中间阶段的交付质量,项目管理工具的因素
(4)软件开发成本的控制
(5)内部质量指标的完成情况

14.1.3 软件工程的质量如何衡量
一个比较成熟的理论是CMMI:Capacity Maturity Model Integrated, 能力成熟度模型集成.
CMMI总共分为五级.
初始级,管理级,明确(定义)级,量化管理级,优化级.
CMMI有两种不同的实施方法,其级别表示不同的内容:
(1)连续式:主要是衡量一个企业在某一项目中的管理能力
(2)阶段式:主要是衡量一个企业的成熟度.

14.1.4 质量的成本
预防
评审
内部故障
外部故障
流程分析改进
提高职业技能
技术投资

14.2 软件的质量保障工作
要注意软件测试和软件质量保障的区别.
软件测试:运用一定的流程和工具,验证软件能实现预先设计的功能和特性,工作流程和结果通常是可量化的.正因为流程和结果是明确定义的,可量化的,所以很多测试工作可以自动化.
软件质量保障:软件团队为了让软件达到事先定义的质量标准而进行的所有活动,包括测试活动.

14.2.1 测试的角色(Test)要独立出来么
独立的测试角色从用户的角度出发验证产品质量.独立专业的测试等同于代表客户对产品进行认证.
任何产品成熟到一定阶段,独立的质量保障角色都是不可避免的.团队内部有QA角色,团队外部也有独立的QA角色.
以药品和食品为例,除了生产厂家自己的检测之外,这些产品还要接受行业主管部门相关机构的检测和认可(药品检验,食品检验),才能上市.出现争议时,还要由第三方机构来进行测试或认证.

14.2.2 和测试角色相关的问题
问题1 既然有专人负责,那我就不用负责了!
尽管有专人负责测试工作,但是保证质量仍然是所有成员的职责.

问题2 盲目信任“专业人士”扮演的角色
每个角色的水平不一样,水平最差的角色往往对软件质量的影响最大。

问题3 为了自己的角色而做绩效优化
分工之后,每个角色为了自己的绩效而优化,会出现局部最优而全局未必最优的情况。

问题4 画地为牢的分工
有时分工链条过长,信息丢失。一个开发者对自己写的程序有什么潜在问题还是很有感觉的,有些问题可以用文字表述出来(如果开发人员有耐心的话),有些问题是一些预感......现在都交给测试人员了,那么,让他们测吧,我也懒得说了。

分工还可能会导致一个软件的灵魂被切碎分割各个角色,每个功能都做得很卖力,但是整体就是不行,明显看出来是费了老大的劲给强行“集成”起来的。

问题5 无明确责任的分工

11月18日打卡:

阅读页码: 318~333页

阅读概要:

这一节继续上面的关于软件质量保障的章节。

“快速重现用户报过的bug”,这是专业测试人员的价值所在。没有测试人员之后,开发人员并没有负责这个新的任务,他们的主要目标还是“快速开发功能”。
针对bug的修复,也要一级一级地发出去,增加很多成本。
还是那句话,没有责任,就没有质量。

第15章 稳定和发布阶段

15.1 从代码完成到发布
软件生命周期的最后阶段往往是最考验团队的 ,不但考验团队项目管理水平、应变能力,也考验团队的“血型”。
A型:他们知道优秀的软件公司会发布有已知缺陷的软件
B型:他们不相信这一点
O型:他们不知道这一点,因此嘴巴惊讶成O型
AB型:他们对于自己开发的软件是A型,对于别人开发的软件是B型

做商用软件的人都在为此苦恼,只有优秀的软件公司能找到一个平衡点,及时发布能够解决用户问题的软件,并且能及时修改软件中的问题。

看一下关于软件发布的常用名词:
Alpha:指集成了主要功能的第一个试用版本
Beta: 功能基本完备,稳定性较Alpha版本高,用户可以在实际工作中小范围使用。可以有beta1, beta2, beta3, ......
ZBB(Zero Bug Build)
RC(Release Candidate): 发布候选版本, RC1, RC2, ......, 直至RTM为止,版本间隔时间较短
RTM(Release to Manufacturer): 最终发布版本
RTW(Release to Web)

15.1.1 会诊小组
软件团队的各个角色代表(PM/Dev/Test/UX 等)组成了会诊小组,处理每一个影响产品发布的问题。
对于每一个bug, 会诊小组要决定采取下面哪一种行动:
(1)修复
(2)设计本来如此
(3)不修复
(4)推迟

15.1.2 复杂项目的会诊
在项目稳定阶段的初期,团队只要决定需要修复哪些缺陷,然后团队成员就会进行必要的设计、实现、测试工作,并签入代码修改。
但是,随着项目进展和发布日期的临近,团队还要保证修改方案不会给产品带来负面的影响。这时,会诊会议也会有更高的要求,包括以下三个方面:
第一步,开发者提交参加会诊的bug和修改方案;
第二步,会议决定是否同意修改方案;
第三步,执行。

项目接近尾声时,要确保门槛越来越高。
提升门槛是放走一些无伤大雅的bug,换取项目能如期完成。其指导思想是抓大放小,既然没法全解决,就集中精力解决最重要的bug。避免频繁地到处改动代码而引入新的bug,是以谓之”稳定“。

15.1.3 招数:设计变更(Design Change Request)
要分清楚重构和重写的区别:
重构——在尽量保持原有界面的基础上优化部门代码;
重写——重新实现原有功能,同时,要分清是全部重写原有功能,还是偷偷加上许多新的功能。

要记住,项目的当前阶段是一个阻尼振荡的过程,要收敛和稳定。等到下一个版本开始的时候再进行发散的思考吧。

11月19日打卡:

阅读页码: 334~349页

阅读概要:

本节继续前面的介绍。

15.1.4 招数:ZBB
团队要有把Bug都搞定的执行力。ZBB = Zero Bug Build, 即这一版本的构建把所有已知的Bug都解决掉了。

15.1.5 招数:最后回归测试
项目临近结束时,所有人员(开发、管理、测试)都要回归测试所有的bug。每个人都要帮助团队确保这些Bug的确是被修复了,而且别的更改没有导致功能的”回归“。

15.1.6 招数:砍掉功能
软件的三个目标:快、便宜、好。一般团队只能达到三个目标中的两个。

15.1.7 招数:修复Bug的门槛逐渐提高

15.1.8 招数:逐步冻结

15.2 不同频率和不同覆盖范围的渐进发布

11月20日打卡:

阅读页码: 350~369页

阅读概要:

11月21日打卡:

阅读页码: 370~385页

阅读概要:

11月22日打卡:

阅读页码: 386~401页

阅读概要:

11月23日打卡:

阅读页码: 402~417页

阅读概要:

11月24日打卡:

阅读页码: 418~435页

阅读概要:

posted @ 2018-10-30 09:58  蓬stephen蓬  阅读(610)  评论(0)    收藏  举报