# 为什么软件重要

  • 发达国家经济发展需要软件
  • 系统需要软件来控制
  • 软件开发能给国家带来经济效益

# 软件类型

  • 通用软件产品Generic Products

  • 定制化软件产品Customized Products

    [^客户做主]: 客户说需求, 软件回应需求

# 软件开发流程

  • 规格说明

    [^software specification]: 客户, 工程师, 对软件进行约束

  • 软件开发

  • 软件确认

  • 软件演化

# 好软件的特征

  • 易于接受

  • 可信赖和信息安全

    [^Dependability and security]: 用起来不会有隐私泄露的风险, 不会给用户带来物理上的财产损失, 比如硬件损坏, 银行账户被刷

  • 高效

    [^Efficiency]: 不浪费系统资源, 性能好

  • 可维护

# 影响多数软件的一般问题

  • 企业和社会的快速变革

    [^Business and social change]: 社会发展很快, 企业需要快速修改现有软件, 同时开发新的软件

  • 安全与信任

    [^Security and trust]: 软件需要足够优秀, 被用户认可

  • 规模

    [^Scale]: 支持的平台要足够多: 移动可穿戴设备, 嵌入式系统, 云系统, 分布式系统, etc.

# 什么是软件工程

  1. 本质: 工程学科

    [^engineering discipline]: 在允许的范围内, 用合适的理论和方法解决问题

  2. 涉及面: 各个方面

    [^all aspects of software production]: 方法和理论的开发 => 项目管理 => IDE => 敲代码, etc. 这些都叫各个方面

# 软件工程存在意义

  • 软件变得大型和复杂

  • 开发进度总是延迟

  • 软件费用高于预期

    ^: 比无脑开发更加便宜, 大部分钱是在软件投入使用后才开始消耗的

  • 项目不可靠, 难以维护

# 软件工程常见问题

Question Answer
What is software? Computer programs and associated documentation. Software products may be developed for a particular customer or may be developed for a general market.
What are the attributes of good software? Good software should deliver the required functionality and performance to the user and should be maintainable, dependable and usable.
What is software engineering? Software engineering is an engineering discipline that is concerned with all aspects of software production.
What are the fundamental software engineering activities? Software specification, software development, software validation and software evolution.
What is the difference between software engineering and computer science? Computer science focuses on theory and fundamentals; software engineering is concerned with the practicalities of developing and delivering useful software.
What is the difference between software engineering and system engineering? System engineering is concerned with all aspects of computer-based systems development including hardware, software and process engineering. Software engineering is part of this more general process.
What are the key challenges facing software engineering? Coping with increasing diversity, demands for reduced delivery times and developing trustworthy software.
What are the costs of software engineering? Roughly 60% of software costs are development costs, 40% are testing costs. For custom software, evolution costs often exceed development costs.
What are the best software engineering techniques and methods? While all software projects have to be professionally managed and developed, different techniques are appropriate for different types of system. For example, games should always be developed using a series of prototypes whereas safety critical control systems require a complete and analyzable specification to be developed. You can’t, therefore, say that one method is better than another.
What differences has the web made to software engineering? The web has led to the availability of software services and the possibility of developing highly distributed service-based systems. Web-based systems development has led to important advances in programming languages and software reuse.

# 软件工程多样性

  • 目前没有全平台解决方案

  • 开发要实事求是

# 常见平台类型(应用类型)

  • 独立的应用
    • 运行在个人计算机上或者移动设备上
    • 包含所有必要的功能, 可以不联网
  • 基于事务的交互式应用
    • 在远程计算机上执行, 例如Web应用, 电子商务应用
    • 通过自己的终端区访问远程应用
  • 嵌入式控制系统
    • 用软件控制系统控制硬件
  • 批处理系统
    • 是一类业务系统, 用来处理大批量的数据
    • 处理大量的单个输入以创建相应的输出
  • 娱乐系统
    • 自娱自乐创建的系统
  • 建模和仿真系统
    • 模拟物理过程和环境的系统
    • 包括很多独立且相互交互的对象
  • 数据收集系统
    • 数据收集系统从环境中收集数据,并将数据发送到其他系统进行处理
  • 集成系统
    • 集成很多软件的系统

# 软件工程基础准则

  1. 软件开发过程必须受管理, 且易于开发者理解
  2. 可靠性和性能至关重要
  3. 理解和管理好软件规格和需求
  4. 尽可能高效的使用已有资源, 复用已开发的软件, 而不是造新轮子

# 互联网软件工程

  • web现在已经成为越来越多组织使用的, 运行应用程序的平台, 而不是本地系统
  • web服务允许通过web访问应用程序的功能
  • 云计算是一种把应用程序运行在云上的服务, 用户无需购买软件本身, 可以按照软件使用量进行付费

# web系统对软件工程的影响

  • 软件复用已经成为构建web系统的主流方法
  • 基于web系统的开发总是增量开发(渐进式)
  • 软件可以使用面向服务的软件工程来实现, 这些软件的内部组件是用web独立实现的
  • ajax和HTML5等技术支持丰富了浏览器端界面绘制
  • web开发和软件工程基本思想是完全一致的

# 软件工程职业道德理论

  • 软件工程人员要肩负比"应用软件技术"更多的责任
  • 软件工程人员想要受人尊敬, 其行为必须合乎职业道德, 并有责任感
  • 道德不仅仅是遵纪守法, 还要在伦理上正确

# 软件工程职业道德准则

使用ACM/IEEE道德规范:

Software Engineering Code of Ethics and Professional Practice

ACM/IEEE-CS Joint Task Force on Software Engineering Ethics and Professional Practices
 
PREAMBLE
The short version of the code summarizes aspirations at a high level of the abstraction; the clauses that are included in the full version give examples and details of how these aspirations change the way we act as software engineering professionals. Without the aspirations, the details can become legalistic and tedious; without the details, the aspirations can become high sounding but empty; together, the aspirations and the details form a cohesive code.
Software engineers shall commit themselves to making the analysis, specification, design, development, testing and maintenance of software a beneficial and respected profession. In accordance with their commitment to the health, safety and welfare of the public, software engineers shall adhere to the following Eight Principles:
1. PUBLIC - Software engineers shall act consistently with the public interest.
2. CLIENT AND EMPLOYER - Software engineers shall act in a manner that is in the best interests of their client and employer consistent with the public interest.
3. PRODUCT - Software engineers shall ensure that their products and related modifications meet the highest professional standards possible.
4. JUDGMENT - Software engineers shall maintain integrity and independence in their professional judgment.
5. MANAGEMENT - Software engineering managers and leaders shall subscribe to and promote an ethical approach to the management of software development and maintenance.
6. PROFESSION - Software engineers shall advance the integrity and reputation of the profession consistent with the public interest.
7. COLLEAGUES - Software engineers shall be fair to and supportive of their colleagues.
8. SELF - Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.

# 软件工程道德困境

  • 在原则上就不能赞成高级管理层的决策
  • 雇主以一种不道德的方式行事, 在没有完成系统测试的情况下发布了一个安全性要求极高的系统
  • 参与军事和核项目的发展