《构建之法》读书笔记(上)
本周阅读第一章《概论》和第二章《个人技术和流程》;
第一章《概论》旨在说明软件工程的概念。
几个概念:
软件 = 程序 + 软件工程
在这里突然想到数据结构可上老师说程序是: 数据结构+算法
软件工程可以定义为: 把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程;软件工程包括一下领域:源代码管理+需求分析+程序设计+软件构建+软件测试+软件维护+生命周期管理等,广泛意义的软件工程,还包括用户体验、用户界面设计(UID)等; 软件工程决定了软件质量。
文中还提到软件工程和计算机科学的关系,这也是之前让我迷糊的两个概念,我在高考填志愿的时候不知道他们的区别,到学校后发现学的东西差异也不是很大;而实质上这是两个侧重点差异很大的概念;从知识领域上说,计算机科学包含计算机体系结构、操作系统、图形学、人工智能等,而软件工程包含软件需求、软件设计、软件维护、软件测试等;
软件工程的目标:创造足够好的软件。那么什么是足够好,不仅仅是没有bug;评价软件的维度包括:用户满意度、可靠性、软件流程的质量、可维护性等。关于软件流程的质量,指的是软件团队和开发流程的问题太多,导致团队成员无法良好协作,按时交付,也可以说是软件团队的bug; 流程的质量往往是我们的研发过程中最容易忽视的地方,反思目前我们的现状,很对研发团队的研发流程实质是处于真空状态,开发人员甚至不知道怎样才是软件开啊的正确姿势。下半年结合团队运作中SM、BA、QA的角色职责梳理,特别关注下团队的研发流程质量。
所以我觉得,书中说了这么多,其实软件工程归结起来就是下面三点:
1 研发出符合用户需求的软件
2 通过一定的软件流程,在预计的时间内发布“足够好”的软件
3 通过数据和其他方式展现所开发的软件是可以维护的继续发展的
第二章《个人技术和流程》,本章的实质是在说明,一个合格的软件工程师是怎样的,他应该具备哪些技能。
总结下来,一个合格的工程师在开发时需要同时考虑质量和效率,与之同时需要具备的技能包括:单元测试、效能分析、个人研发流程(PSP);
关于单元测试的正确做法:
1 单元测试应该在最低的功能/参数上验证程序的正确性
2 单元测试必须由最熟悉代码的人(作者)来写
3 单元测试过后,机器状态保持不变
4 单元测试要快(一个测试用例的运行时间是几秒钟)
5 独立性—测试的运行/通过/失败不依赖于别的测试
6 覆盖所有代码路径
7 单元测试应该集成到自动化测试的框架中
8 单元测试必须和产品代码一起保存和维护
关于性能分析。
性能分析往往是开发人员容易忽视的步骤,这也是为什么我们一年一年的不停做性能优化的原因,大部分人对嵌入式的实时性和性能要求没有概念。 Visual Studio实际上提供了性能分析工具。其中有两种分析方法:Sampling和Instrumentation,即抽样和代码注入,抽样的原理比较简单,kprofile也类似,就是用比较短的周期去采用PC指针,看看是在哪个函数在执行,并把当前周期的时长累计为该函数的执行时长; 代码注入,相当于打点,是将检测的代码加入到每个函数中。
一般进行性能分析的做法是,先用抽样的方法找到函数热点,然后对特定的模块用代码注入进行详细分析。
这个方法,后面在我们的性能优化工作中可以多尝试下,让业务和支撑领域相关人员看看效果。
关于个人开发流程。
我们熟知CMM和CMMI,软件行业的国际通用标准,这两种能力成熟度模型,他们是用来衡量一个团队能力的模型,由卡内基梅隆大学(CMU)制定推出。其实CMU的专家针对软件工程师也有一套模型,叫Personal Software Process(PSP),即个人开发流程的标准;
这个我在第一次个人作业中已经用到了,但是因为是第一次用,不知道是不是对自己太自信了导致规划和实际的距离很远,所有的选项的实际时间都比计划时间要多出很多,一方面可能是我的经验不足,另一方面可能是我的技术不够成熟。
总的来说就是:个人开发流程要着眼的是整个软件开发的流程,输出高质量的产品,需要从个人开发流程上去找bug,然后不断修正,工程师才会成长,产品质量才会不断提高。
同时最近看到一张好图: