20170914-构建之法:现代软件工程-阅读笔记

第一章-概论:

  软件 = 程序+软件工程;

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

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

  软件工程和以下学科相关:计算机科学、计算机工程、管理学、数学、项目管理学、质量管理、软件人体工学、系统工程、工业设计和用户体验;

  软件的特殊性:复杂性、不可见性、易变性、服从性、非连续性;

  软件工程的目标:创造“足够好”的软件,所谓软件工程,就是把软件中的Bug都消灭掉的过程;

  Bug:直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性;简单地说,软件的行为和用户的期望值不一样,就叫Bug;

  我们将在本书学习的目标是:1.研发出复合用户需求的软件 ;

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

               3.能证明所开发的软件是可以维护和继续发展的;

第二章-个人技术和流程:

  单元测试:模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证;

  好的单元测试标准:应该能够准确、快速地保证程序基本模块的正确性;

          1.单元测试应该在最基本的功能/参数上验证程序的正确性;

          2.单元测试必须由最熟悉代码的人(程序的作者)来写;

          3.单元测试过后,机器状态保持不变;

          4.单元测试要快(一个测试的运行时间是几秒钟,而不是几分钟);

          5.单元测试应该产生可重复、一致的结果;

          6.独立性----单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性;

          7.单元测试应该覆盖所有代码路径;

          8.单元测试应该集成到自动测试的框架中;

          9.单元测试必须和产品代码一起保存和维护;

  效能分析工具:两种分析方法--抽样【Sampling】(优点:不需要改动程序,运行较快,可以很快找到瓶颈,但是不能得出精确的数据,也不能准确表示代码中的调用关系树【Call Tree】);--代码注入【Instrumentation】(缺点:程序运行的时间会大大加长,还会产生很大的数据文件,也相应增加了数据分析的时间;同时,注入的代码也影响了程序真实的运行情况);一般情况下,先采用抽样的方法找到效能瓶颈所在,然后对特定的模块用代码注入的方法进行详细分析;

  效能分析的名词:调用者【Caller】,被调用函数【Callee】,调用关系树【Call Tree】,消逝时间【Elapsed Time】,应用程序时间【Application Time】,本函数时间【Exclusive Time】,所有时间【Inclusive Time】;

第三章-软件工程师的成长:

  软件工程包括了:开发、运营、维护软件的过程中的很多技术、做法、习惯和思想;

  软件开发流程:软件工程把这些相关的技术和过程统一到一个体系中;

  软件开发流程的目的:为了提高软件开发、运营、维护的效率,以及提升用户满意度、软件的可靠性和可维护性;

  团队对个人的期望:1.交流;2.说到做到(按时交付);3.接受团队赋予的角色并按角色要求工作;4.全力投入团队的活动;5.按照团队流程的要求工作;6.准备(准备工作);7.理性地工作;

第四章-两人合作:

  代码规范:代码风格规范----1.缩进;2.行宽;3.括号;4.断行与空白的{ }行;5.分行;6.命名;7.下划线;8.大小写;9.注释;

       代码设计规范----1.函数;2.goto;3.错误处理(参数处理、断言);4.如何处理类;

  代码复审:自我复审,同伴复审,团队复审;

  代码复审的目的:1.找出代码的错误(编码错误,不符合团队代码规范的地方);

          2.发现逻辑错误;

          3.发现算法错误;

          4.发现潜在的错误和回归性错误;

          5.发现可能需要改进的地方;

          6.教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识;

  结对编程:起源于1987年Intuit公司的两个技术人员;因任务具有高速中完成、较高的技术要求和任务失败的高代价,所以采取结对编程模式;角色分工:驾驶员【Driver】:控制键盘输入,领航员【Navigator】:起到领航、提醒的作用;角色可以互换,建议定时更换驾驶员;

  开发中的复审主要包括:设计复审、代码复审、测试计划复审和文档复审;

  结对编程和传统开发过程的复审区别:传统意义上的伙伴复审,即程序员之间的互相复审,存在以下问题:

                     1.复审人缺乏对程序的深入了解,减弱了复审的效果;

                     2.不能持久、定时地进行复审;

                     3.对需求和设计的不了解导致无法实现全面有效的复审;

                   团队复审是指多于两人的团队就某一程序实体进行的复审,团队复审的缺点在于:

                     1.不可能一个团队天天开会;

                     2.牵涉的人员众多,理解程度不一,复审的速度和效果不能得到有效的平衡;

                     3.正是由于成本问题,无法对所有的设计和代码进行深入的复审;

                     4.由于人员众多,有面子问题;

  两人合作的不同阶段:

    1.萌芽阶段【Forming】,2.磨合阶段【Storming】,3.规范阶段【Norming】,4.创造阶段【Performing】,5.解体阶段【Deforming】;

  影响他人的方式:

    1.断言(感情,推----主动推动同伴做某事);

    2.桥梁(逻辑,拉----吸引对方,建立共识);

    3.说服(逻辑,推----让对方思考);

    4.吸引(感情,拉----描述理想状态,吸引对方加入);

  评论他人的三种层次:

    1.最外层:行为和后果;

    2.中间层:习惯和动机;

    3.最内层:本质和固有属性;

第五章-团队和流程:

  团队的共同特点:1.团队有一致的集体的目标,要一起完成这个目标;2.团队成员有各自的分工,互相依赖合作,共同完成任务;

 

  软件团队的模式:一窝蜂模式【Chaos Team】,主治医师模式【Chief Programmer Team,Surgical Team】,明星模式【Super-star Model】,社区模式【Community Model】,业余剧团模式【Amateur Theater Team】,秘密团队【Skunk Work Team】,特工团队【SWAT】,交响乐团模式【Orchestra】,爵士乐模式【Jazz Band】,功能团队模式【Feature Team】,官僚模式【Bureaucratic Model】

 

  开发流程:写了再改模式【Code-and-Fix】,瀑布模型【Waterfall Model】,瀑布模型的各种变型----生鱼片模型、大瀑布带着小瀑布,统一流程【RUP(Rational Unified Process)】,老版驱动的流程【Boss-Driven Process】,渐进交付的流程【Evolutionary Delivery】、MVP和MBP,TSP的原则【Team Software Process】;

第六章-敏捷流程:

  敏捷流程:一系列的价值观和方法论的集合;

  敏捷开发的原则:

    1.尽早并持续地交付有价值的软件以满足顾客需求;

    2.敏捷流程欢迎需求的变化,并利用这种变化来提高用户的竞争优势; 

    3.经常发布可用的软件,发布间隔可以从几周到几个月,能短则短;

    4.业务人员和开发人员在项目开发过程中应该每天共同工作;

    5.以有进取心的人为项目核心,充分支持信任他们;

    6.无论团队内外,面对面的交流始终是最有效的沟通方式;

    7.可用的软件是衡量项目进展的主要指标;

    8.敏捷流程应能保持可持续的发展。领导、团队和用户应该能按照目前的步调持续合作下去;

    9.只有不断关注技术和设计,才能越来越敏捷;

    10.保持简明----尽可能简化工作量的记忆----极为重要;

    11.只有能自我管理的团队才能创造优秀的架构、需求和设计;

    12.时时总结如何提高团队效率,并付诸行动;

  敏捷的步骤:

    第一步,找出完成产品需要做的事情----Product Backlog;

    第二步,决定当前的冲刺【Sprint】需要解决的事情----Sprint Backlog;

    第三步,每日立会,外部人士不能直接打扰团队成员,一切交流只能通过Scrum大师【Scrum Master】----冲刺阶段【Sprint】;

posted @ 2017-09-14 22:22  L龙先生  阅读(169)  评论(0编辑  收藏  举报