zoukankan      html  css  js  c++  java
  • 构建之法读书笔记

         软件=程序+软件工程

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

             软件是由多人合作完成的,其发展有4个阶段:

      1、玩具阶段 2、业余爱好阶段3、探索阶段4、成熟的产业阶段。它分为3种:1、系统软件(操作系统、设备驱动程序、工具软件等) 2、应用软件(用户使用它们来完成工作) 3、恶意软件(软件病毒等)

            软件开发过程中有以下5个难题:

      1、复杂性 2、不可见性 3、易变性 4、服从性 5、非连续性。

            软件工程的目标——创造“足够好”的软件,所谓好软件,就是软件没有缺陷(bug),所谓的软件工程就是把软件中的bug都消灭掉的过程。而一个软件bug的多少可直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性。

            而对软件进行单元测试可以有效的解决自己负责的模块功能定义明确,模块内部的改变不会影响其他模块,还可以有效的保证模块的质量。而一个好的单元测试应该准确、快速的保证程序基本模块的正确性。它的标准如下:1、单元测试应该在最基本的功能/参数上验证程序的正确性。2、单元测试必须由最熟悉代码的人(程序的作者)来写。3、单元测试过后,机器状态保持不变。4、单元测试要快(一个测试的运行时间是几秒钟,而不是几分钟)。5、单元测试应该产生重复、一致的结果。6、独立性——单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性7、单元测试应该覆盖所有的代码路径。8、单元测试应该集成到自动测试的框架中。9、单元测试必须和产品代码一起保存和维护。

           在单元测试的基础上,然后再建立关于这一模块的回归测试。然后便是对程序进行效能分析。效能分析包括两种方法:1、抽样(Sampling)2、代码注入(Instrumentation)   

           对于软件开发过程中,有能力成熟度模型用来衡量团队能力的能力成熟度模型,还有衡量个人能力的PSP。

           在写代码之前要做好需求分析,写出明确的设计思路,写代码的过程中则要时刻提醒自己规范代码,然后就是做测试时要从用户角度来考虑,然后做测试,并且将测试的结果与题目要求结合来看,看结果是否与题目要求相符。

    软件开发流程包括团队的流程和个人开发流程。个人在团队中有独立的流程,而把每个人的工作有序的组织起来,就是团队的流程。

    所以,每个人的工作质量直接影响最终软件的质量。PSP中衡量软件开发的工作量和质量有以下4个因素,1、项目/任务有多大?(一般用代码行数来表示,也可用功能点来表示);2、花了多少时间?(可以用小时、天、月、年来表示;一组人所花费的时间可以用(人数*时间)来表示);3、质量如何?(交付的代码有多少缺陷?);4、是否按时交付?

    对于一个软件工程师的成长:

       (1)Steve McConnell版本:首先需要具备一定的知识和能力,一个工程师对这些知识的掌握分为四个阶段:1、入门;2、熟练;3、带头人;4、大师。其次,工程师有职业成长级别。

       (2)大公司版本:初级软件开发工程师、中级软件开发工程师、高级软件开发工程师、首席软件开发工程师等。

    第4章:两人合作(前3节)

    代码规范分为两个部分:

       (1)代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。其原则是:简明、易读、无二义性。缩进为4个空格;行宽限制为100个字符;在复杂的条件表达式中,用括号清楚的表示逻辑优先级;断行以及空白的{}行;分行:即不把多条语句放在一行中;命名:要让人看到;注释:注释用来解释程序做什么,为什么这样做,以及要特别注意的地方。      

       (2)代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面的通用原则。程序设计语言的大多数功能,都在函数中实现,所以对函数来说,最重要的原则是:只做一件事,并且要做好;goto:函数最好有唯一的出口,可以使用goto来实现这一目的;对错误的处理:

        1、参数处理:在Debug版本中,所有参数都要验证其正确性,在正式版本中,对从外部传递过来的参数要验证其正确性;

        2、断言:是验证错误的一种方式;

         处理c++中的类:1、类:使用类来封装面向对象的概念和多态,对于简单的数据类型没必要用类来实现,对于有显式的构造和析构函数的类不要建立全局的实体,仅在必要时,才使用“类”;2、如果只是数据的封装,用struct即可;3、按以下次序来说明类中的成员:public、protected、private;4、数据成员:数据类型成员用m_name说明,不能使用公共的数据成员,要用inline访问函数,这样可兼顾封装和效率;5、虚函数:使用虚函数来实现多态,仅在必要时使用多态,如果一个类型要实现多态基类中的析构函数应该是虚函数;6、构造函数:在构造函数中只需简单初始化所有的数据成员,构造函数不应该返回错误;7、析构函数:把所有的清理工作都放在析构函数中,析构函数不应该出错;8、new和delete:实现自己的new/delete,这样可以方便的加上自己的跟踪和管理机制,检查new的返回值,释放指针时不用检查NULL;9、运算符:一般情况下,自己定义的类不需要自定义操作符,运算符不要做标准语义之外的动作,运算符实现必须非常有效率,如果有复杂的操作应定义一个单独的函数,当不知道怎么办时,用成员函数而不是运算符;10异常:不能用异常作为逻辑控制来处理程序的主要流程,需要了解异常及处理异常的花销,当使用异常时要注意在什么地方清理数据,异常不能跨过DLL或进程的边界来传递信息;11、类型继承:仅在必要时,才可用类型继承,用const标注只读的参数,用const标注不改变数据的函数

  • 相关阅读:
    cJson
    STemWin
    TEA通讯加密
    stm32串口收发导致的死机
    C语言版数据结构算法
    FIFO
    IAP远程在线升级
    LWIP
    电能计量芯片
    单片机里的堆栈
  • 原文地址:https://www.cnblogs.com/wwd1505-1/p/6380906.html
Copyright © 2011-2022 走看看