软件工程管理

软件工程管理期末复习

课程介绍

一、软件生命周期

软件从构思到停止使用的整个过程,包括需求、设计、构造、测试、维护等阶段。

  1. 软件需求
  2. 软件设计
  3. 软件构造
  4. 软件测试
  5. 软件维护

二、软件工程的起源与发展

  • 起源1968年北约(NATO)软件工程学会议上首次提出“软件工程”概念,旨在以系统性、规范化、可定量的过程化方法开发和维护软件,结合管理技术和最佳技术方法.
  • 发展:几十年来,软件工程的技术、思想、方法和概念不断被提出和发展,逐步成为一门独立的科学,涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面.

三、软件工程的定义

  • IEEE 1993定义:软件工程是一门以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。
  • 其他定义:软件工程是设计、创建和维护软件的学科,应用计算机科学、项目管理、工程等领域的技术和实践。

四、软件工程与计算机科学的关系

  • 软件工程建立在计算机科学基础上,计算机科学关注“做的出”,软件工程关注“做的好”、“做的快”.
  • 软件工程之于计算机科学和信息科学,类似于传统工程学之于物理和化学,是更高层次的学科,关注工程实践和应用.

五、课程内容

  • 软件工程本质难题(软件的复杂性)
  • 开源软件开发方法学:大教堂与市集、Linus定律
  • 人月神话
  • 软件开发成熟度模型
  • Scrum方法:软件项目估算与计划故事点、扑克牌估算法、计划会议、迭代周期(短周期迭代)、每日站立会议、燃尽图
  • 极限编程:简单设计、重构、测试驱动开发、持续集成、DevOps
  • 看板方法
  • 敏捷软件开发宣言和原则
  • 敏捷软件开发与传统开发方法异同
  • 企业软件工程:Google、百度

没有银弹(软件工程本质难题)

没有银弹的核心观点

  • 根本任务与次要任务:
    • 根本任务(essential):打造由抽象软件实体构成的复杂概念结构。是软件开发中固有的、本质的困难部分,如规格化、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证.
    • 次要任务(accidental):使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言,是软件开发中非本质的困难部分,如编码和调试.
    • 除非次要任务占了所有工作的9/10,否则即使全部次要任务的时间缩减到零,也不会给生产率带来数量级上的提高.
  • 软件开发的困难本质:
    • 复杂性:软件实体的复杂度是必要的属性,不是次要因素,包括数据集合、数据条目之间的关系、算法、功能调用等,这种复杂性导致团队成员沟通困难、产品可靠性受影响、程序难以使用和扩充等.
    • 一致性:软件必须和许多不同的系统进行交互,保持与其他接口的一致,每次更新或改动都会引发系统其他部分的变动,导致连锁反应,使得整个系统的复杂度迅速上升.
    • 可变性:软件实体经常会遭受到持续的变更压力,人们要求扩展、更改功能,硬件的变化,以及软件与整个社会联成一体,后者在不断变动,它强迫软件也跟着变动.
    • 不可见性:软件的客观存在不具有空间的形体特征,没有任何一种2维、3维的图形可以描述软件,这限制了个人的设计过程,也严重阻碍了相互之间的交流.

软件开发与硬件发展的比较

  • 硬件发展迅速:摩尔定律在1965年提出,描述了计算机硬件中集成电路的演变,每隔18至24个月,集成电路上的晶体管数量大约会翻倍,同时成本降低,推动了计算机性能的大幅提升和芯片制造成本的下降.
  • 软件发展相对缓慢:不是软件发展慢,而是硬件发展太快,软件开发在根本上就是困难的,无法像硬件那样取得快速的性能提升和成本降低.

过去的“银弹”技术

  • Ada和其他高级编程语言:通过使用更加抽象的语句来开发,降低了机器的次要复杂度.
  • 面向对象编程:消除了开发过程中的非本质困难,允许设计人员表达自己设计的内在特性,而不需要表达大量句法上的内容,使得修改局部化,提高了可维护性.
  • 人工智能与专家系统:专家系统是包含归纳推论引擎和规则基础的程序,它接收输入数据和假设条件,通过从基础规则推导逻辑结果,提出结论和建议,向用户展示前因后果,并解释最终的结果.
  • “自动”编程与图形化编程:自动编程预言从问题的一段陈述说明自动产生解决问题的程序,但大多数情况下所给出的技术说明本质上是问题的解决方案,而不是问题自身;图形化编程如流程图是非常差劲的软件结构表达方法,软件非常难以可视化.
  • 程序验证:通过自动化手段证明程序的正确性,确保程序在运行过程中不会出错,并且其功能能够满足预期要求,但不能保证节约劳动力,也不意味着零缺陷的程序.
  • 环境和工具、工作站:硬件速度的加快,编译速度和开发速度的提升,以及IDE等工具的使用,能带来软件生产率和可靠性上的一些提高,但其回报有限.
  • 购买和自行开发:构建软件最可能的彻底解决方案是不开发任何软件,使用通用软件.
  • 需求精炼和快速原型:快速原型明确实际的概念结构,让用户知道他们需要什么.
  • 增量开发:Grow not building,客户和士气的考虑,迭代式开发.
  • 卓越的设计人员:软件开发是一个创造性的过程,依赖于卓越的设计人员.

没有银弹的影响

  • 软件开发本质的认识:认识到软件开发中的根本困难是复杂性、一致性和可变性等本质问题,而非次要任务,从而更加注重对这些本质问题的研究和解决.
  • 软件过程:影响了软件过程的改进和优化,促使人们更加关注软件开发过程中的管理和方法论,如敏捷开发、极限编程等,以更好地应对软件开发中的复杂性和不确定性.

大教堂与市集

《大教堂与市集》概述

  • 作者与背景:由埃里克·斯蒂芬·雷蒙(Eric Steven Raymond)撰写,首次发表于1997年5月27日,后在1999年出版成书.
  • 核心比喻:将软件开发模式分为大教堂模式和市集模式.
    • 大教堂模式:封闭的、垂直的、集中式的开发模式,反映一种由权利关系所预先控制的极权制度,需要一群与世隔绝的奇才的细心工作,在成功之前没有beta版的发布.
    • 市集模式:并行的、点对点的、动态的开发模式,开放源代码软件的开发方式,依靠大量分散的开发者协作,尽早尽多的发布,委托所有可以委托的事,对所有的改动和融合开放.
  • 开源运动:1998年2月3日,“开放源代码(Open Source)”被正式提出,雷蒙德成为开源运动的理论家和开放源代码促进会的主要创办人之一.

开源软件与商业软件

  • 开源软件:如Linux、MySQL、Eclipse、Chrome、Firefox等,源代码开放,允许用户自由使用、修改和分发.
  • 商业软件:如Windows、MacOs、Oracle、DB2、Visual Studio、IE等,源代码封闭,需要购买授权使用.

开源许可证

  • 世界上有上百种开源许可证,最流行的有GPL、BSD、MIT、Mozilla、Apache和LGPL等,选择复杂.

Linux的开发与影响

  • Linux内核:由芬兰人林纳斯·本纳第克特·托瓦兹(Linus Torvalds)最初编写,最初是出于个人爱好,后发起开源项目,担任Linux内核的首要架构师与项目协调者.
  • Linux的影响:推翻了许多传统的软件开发观念,证明了市集模式的可行性,一个世界级的操作系统能够依靠全球的几千个开发人员以业余时间来创造.

市集模式的特点与优势

  • 早发布、常发布:Linux开发模式的重要部分,与大教堂模式相反,推动了许多发布,早期一天一次发布都不罕见.
  • 用户作为协作开发者:把用户当做协作开发者是快速改进代码和高效调试的方式,拥有用户的重要性体现在听取客户的建议.
  • Linus定律:“如果有足够多的眼睛,所有的错误都是浅显的”,排错可以并行,增加调试人员并不会带来增加开发人员那样的二次方复杂性和管理成本.
  • Brooks定律(以及随之而来对开发团队规模的恐惧)建立在这样的假设上:项目的沟通结构是一个完全图,即人人之间都沟通。但在开源项目中,外围开发者实际工作在分散而并行的子任务上,他们之间几乎不交流;代码修改和bug报告都会流向核心团队,只有在那个小的核心团队里才会有Brooks开销。
  • Brooks定律背后的原理没有失效,但如果有一个大规模的开发群体和一个低成本的沟通机制,Brooks定律的效果将会被其他非线性因素带来的效果淹没,而后者是大教堂模式下看不到的。
  • 社会学效应:Delphi效应在调试操作系统时也适用,一群相同专业的观察者的平均观点比随机挑选一个来得更加可靠.
  • 数据结构与代码:聪明的数据结构和笨拙的代码要比相反的搭配工作得更好,数据结构的重要性高于代码.
  • beta测试员:如果你象对待最宝贵的资源一样对待你的beta测试员,他们就会成为你最宝贵的资源.

市集模式的先决条件与组织者

  • 先决条件:不能以市集模式从头开发一个软件,但可以以市集模式测试、调试和改进,需要演示一个诺言,吸引大家卷入一个有趣的项目.
  • 组织者角色:协调人需要把从他人那里得到的好设计重新组织起来,良好的人际和交流能力比技术能力更重要,需要吸引人并保持他们对工作的兴趣和快乐.

开源软件的未来与挑战

  • 自由软件的未来:属于那些知道怎样玩Linus的游戏的人,把大教堂抛之脑后拥抱市集的人,自由软件文化可能最终胜利,因为商业世界在进化的军备竞赛中不能战胜自由软件社团.
  • 挑战与反思:为什么开源软件没有开创出云计算和移动计算?开源软件在某些领域取得了巨大成功,但在其他领域仍面临挑战和局限性.

为什么开源软件没有开创出云计算和移动计算?

技术创新与研发资源

  • 研发资源投入差异:云计算和移动计算是新兴的技术领域,需要大量的研发资源投入,包括资金、人才和时间等。商业公司如亚马逊、谷歌、苹果等,拥有雄厚的资金实力和顶尖的研发团队,能够集中资源进行长期的研发和创新,从而在云计算和移动计算领域取得突破性进展.而开源社区虽然有众多开发者参与,但资源相对分散,缺乏统一的规划和协调,难以在短时间内集中大量资源进行深入的技术研发和创新.
  • 技术复杂性与门槛:云计算和移动计算涉及的技术复杂性较高,包括虚拟化技术、分布式存储、容器技术、移动操作系统、移动应用开发等众多方面,需要深厚的技术积累和专业知识。商业公司在这些领域的研究和开发上具有先发优势,能够掌握核心技术并不断优化和创新,而开源社区在这些领域的技术积累和专业人才相对较少,难以突破技术门槛,实现从跟随到引领的跨越.

商业模式与盈利驱动

  • 商业模式创新:商业公司能够通过创新的商业模式实现盈利,从而为技术研发提供持续的资金支持。例如,亚马逊通过AWS提供云计算服务,采用按需付费的模式,吸引了大量企业用户,形成了庞大的市场规模和收入来源;苹果通过App Store建立移动应用生态系统,从应用销售中分成,推动了移动应用的繁荣发展.这些商业模式的成功,使得商业公司能够持续投入研发,推动云计算和移动计算的发展.而开源软件通常采用免费或开源授权的方式,缺乏直接的盈利模式,难以形成稳定的资金来源,影响了其在云计算和移动计算领域的持续投入和创新.
  • 市场导向与用户需求:商业公司更加注重市场导向和用户需求,能够快速响应市场变化,开发出符合用户需求的产品和服务。云计算和移动计算的快速发展,很大程度上是由于用户对计算资源的弹性需求、移动办公和娱乐的需求日益增长,商业公司能够敏锐地捕捉到这些需求,并投入资源进行技术研发和产品创新,满足市场需求.而开源社区虽然能够开发出一些优秀的技术,但在市场导向和用户需求的把握上相对滞后,难以及时推出满足市场需求的产品和服务,导致在云计算和移动计算领域的影响力有限.

生态系统与产业链协同

  • 生态系统构建:云计算和移动计算的发展需要构建完善的生态系统,包括硬件设备、操作系统、应用软件、服务提供商等各个环节的协同合作.商业公司能够凭借自身的品牌、渠道和资源,吸引合作伙伴加入,共同构建生态系统,推动产业链的协同发展.例如,谷歌通过Android操作系统,与众多手机制造商、应用开发者、服务提供商等建立了紧密的合作关系,形成了庞大的移动生态系统;苹果则通过iOS和App Store,打造了封闭而高效的生态系统,为移动计算的发展提供了有力支撑.而开源社区在生态系统构建方面相对薄弱,缺乏统一的协调和管理,难以形成有效的产业链协同,影响了云计算和移动计算的整体发展.
  • 标准化与兼容性:云计算和移动计算的广泛应用需要良好的标准化和兼容性,以实现不同设备、系统和服务之间的无缝连接和协同工作.商业公司能够主导或参与相关标准的制定,推动技术的标准化和兼容性,促进产业链的协同发展.而开源社区在标准化和兼容性方面存在一定的局限性,不同开源项目之间的标准不统一,兼容性问题较多,难以形成统一的技术标准和生态系统,限制了其在云计算和移动计算领域的应用和发展.

市场竞争与品牌影响力

  • 市场竞争激烈:云计算和移动计算市场竞争非常激烈,商业公司凭借其强大的品牌影响力、市场推广能力和客户基础,能够占据较大的市场份额,形成竞争优势.例如,亚马逊、谷歌、微软等在云计算市场占据主导地位,苹果、谷歌、三星等在移动计算市场占据重要地位.开源软件在品牌知名度和市场推广方面相对不足,难以与这些商业巨头竞争,难以在市场中脱颖而出,成为主流选择.
  • 品牌信任与可靠性:商业公司提供的云计算和移动计算产品和服务,经过严格的质量控制和测试,具有较高的可靠性和稳定性,能够获得用户的信任.而开源软件虽然在技术上具有一定的优势,但在品牌信任和可靠性方面存在一定的不足,用户在选择云计算和移动计算服务时,更倾向于选择知名品牌和经过验证的产品,这也限制了开源软件在这些领域的应用和发展.

综上所述,开源软件在云计算和移动计算领域没有开创出领先,主要是由于研发资源投入、技术创新能力、商业模式创新、市场导向、生态系统构建、标准化与兼容性、市场竞争和品牌影响力等多方面的因素共同作用的结果.开源社区需要在这些方面加强努力,提升自身的技术创新能力、市场竞争力和品牌影响力,才能在云计算和移动计算领域取得更大的突破和发展.

开源软件经济学


软件工程管理
http://example.com/2025/01/04/软件工程管理/
作者
Shuo Wang
发布于
2025年1月4日
许可协议