前言:
从2018年10月30日开始,阅读由微软工程师邹欣老师撰写的《构建之法》一书,全书共435页,每天阅读15页,在一个月(30天)完成。每天阅读完成后,需要思考当日的阅读要点和一些思考。
真正让自己感受到积累的效果和伟大! 以下是该书的封面:周序号 | Mon | Tue | Web | Thu | Fri | Sat | Sun |
---|---|---|---|---|---|---|---|
第1周 | 10.30(1~15) | 10.31(16~31) | 11.01(32~47) | 11.02(48~63) | 11.03(64~79) | 11.04(80~95) | |
第2周 | 11.05(96~111) | 11.06(112~127) | 11.07(128~153) | 11.08(154~169) | 11.09(170~185) | 11.10(186~201) | 11.11(202~217) |
第3周 | 11.12(218~233) | 11.13(234~249) | 11.14(250~269) | 11.15(270~285) | 11.16(286~301) | 11.17(302~317) | 11.18(318~333) |
第4周 | 11.19(334~349) | 11.20(350~369) | 11.21(370~385) | 11.22(386~401) | 11.23(402~417) | 11.24(418~435) |
每日打卡阅读和写作:
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章《敏捷流程》,主要讲解敏捷的流程简介,问题和解法,敏捷的团队和敏捷总结。
- 敏捷的流程简介: 主要讲解了敏捷的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)得到软件的一个增量版本,发布给用户。敏捷流程的问题和解法
针对上面提到的敏捷流程的四个步骤,每个步骤中都会有一些可能出现的问题。作者结合案例都给予了总结和分析。敏捷团队
敏捷能成功实施的关键在于Scrum master. 敏捷对团队的要求: (1)自主管理(Self-managing) (2)自我组织(Self-organization) (3)多功能型(Cross-functional)敏捷总结
作者提出一些思考: 敏捷是很特别的吗?敏捷流程的经验和教训,以及关于敏捷的问答。
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章《需求分析》。
作者在这章主要讲解了:- 软件需求
- 软件产品的利益相关者
- 获取用户需求——用户调研
- 竞争性需求分析的框架
- 功能的定位和优先级
- 计划和估计
- 分而治之(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 ManagerPM的核心要求是:根据市场和用户需求,协调各部门资源,正确地把握产品定位和方向,解决用户的痛点,持续优化产品。
作者接下来介绍了微软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)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 How12.1.2 从用户的角度考虑问题
12.1.3 软件服务始终都要记住用户的选择 长期使用之后,软件会更好用么?a. 软件用得越多,一样难用
b. 软件用得越多,越发难用
c. 软件用得越多,越来越好用
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 SuiteBug可以分解为:
症状 程序错误 根本原因13.1.1 按测试设计的方法分类
黑箱和白箱测试13.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 压力测试
压力测试严格地说不属于效能测试。压力测试要验证的问题是:软件在超过设计负载的情况下,是否仍能返回正常结果,没有产生严重的副作用或奔溃。在测试的时候,如何增加负载呢?可以从以下两个方面来考虑:
沿着用户轴延长
比如,以购物网站为例,正常的负载是20个请求/秒钟。如果有更多的用户登录,怎么办?那么负载就会变成30、40、100个请求/秒钟,或更高。沿着时间轴延长
网络的负载有时间性,负载压力的波峰和波谷相差很大,那么如果每时每刻负载都处于波峰,程序会不会垮掉?这就是沿着时间轴延长。一般要模拟48小时的高负载才能认为系统通过测试。
13.3 实战中的测试
13.3.1 似是而非的测试观念 13.3.2 测试工作中的文档 (1)测试设计说明书(TDS) (2)测试用例(Test Case)a. 等价类划分
b. 边界值分析
c. 决策表、因果图和功能图方法
d. 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 不同频率和不同覆盖范围的渐进发布