为什么软件开发过程难以适用
❶ 为什么说软件开发过程是一个复杂过程
软件开发过程一般分成三类:主要过程类、支持过程类和组织过程类:
1、主要过程类
供各主要当事方(如需方、供方、开发者、运行者和维护者)在参与或完成软件产品开发、运行或维护时使用。
2.支持过程类
支持过程类中的过程对基本过程类中的过程提供支持。被支持的过程根据需要采用一些支持性过程,并与开过程结合,帮助软件项目获得成功记良好的产品指令。
3.组织过程类
此类过程用来建立和实施一种基础结构,并且不断改进该基础结构的过程。基础结构由一些相关的过程和人员组成。
软件开发把软件过程放在中心地位来看待,关注的核心是开发过程,并涉及相关的其他过程。
❷ 什么是软件危机怎么解决这个危机
软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。那么你对软件危机了解多少呢?以下是由我整理关于什么是软件危机的内容,希望大家喜欢!
软件危机的介绍
软件危机(software crisis),20 世纪60年代以前,计算机刚刚投入实际使用,软件设计往往只是为了一个特定的应用而在指定的计算机上设计和编制,采用密切依赖于计算机的机器代码或汇编语言,软件的规模比较小,文档资料通常也不存在,很少使用系统化的开发 方法 ,设计软件往往等同于编制程序,基本上是个人设计、个人使用、个人操作、自给自足的私人化的软件生产方式。
60年代中期,大容量、高速度计算机的出现,使计算机的应用范围迅速扩大,软件开发急剧增长。高级语言开始出现; 操作系统 的发展引起了计算机应用方式的变化;大量数据处理导致第一代数据库管理系统的诞生。软件系统的规模越来越大,复杂程度越来越高,软件可靠性问题也越来越突出。原来的个人设计、个人使用的方式不再能满足要求,迫切需要改变软件生产方式,提高软件生产率,软件危机开始爆发 。
1968年,北大西洋公约组织(NATO)在联邦德国的国际学术会议创造软件危机(Software crisis)一词。而1960年代中期开始爆发众所周知的软件危机,为了解决问题,在1968、1969年连续召开两次着名的NATO会议,并同时提出软件工程的概念。
软件危机的解决途径
软件工程诞生于60年代末期,它作为一个新兴的工程学科,主要研究软件生产的客观规律性,建立与系统化软件生产有关的概念、原则、方法、技术和工具,指导和支持软件系统的生产活动,以期达到降低软件生产成本 、改进软件产品质量、提高软件生产率水平的目标。软件工程学从硬件工程和其他人类工程中吸收了许多成功的 经验 ,明确提出了软件生命周期的模型,发展了许多软件开发与维护阶段适用的技术和方法,并应用于软件工程实践,取得良好的效果。
在软件开发过程中人们开始研制和使用软件工具,用以辅助进行软件项目管理与技术生产,人们还将软件生命周期各阶段使用的软件工具有机地集合成为一个整体,形成能够连续支持软件开发与维护全过程的集成化软件支援环境,以期从管理和技术两方面解决软件危机问题。
此外,人工智能与软件工程的结合成为80年代末期活跃的研究领域。基于程序变换、自动生成和可重用软件等软件新技术研究也已取得一定的进展,把程序设计自动化的进程向前推进一步。在软件工程理论的指导下,发达国家已经建立起较为完备的软件工业化生产体系,形成了强大的软件生产能力 。软件标准化与可重用性得到了工业界的高度重视,在避免重用劳动,缓解软件危机方面起到了重要作用。
软件危机的主要表现
软件开发进度难以预测
拖延工期几个月甚至几年的现象并不罕见,这种现象降低了软件开发组织的信誉。
软件开发成本难以控制
投资一再追加,令人难于置信。往往是实际成本比预算成本高出一个数量级。
而为了赶进度和节约成本所采取的一些权宜之计又往往损害了软件产品的质量,从而不可避免地会引起用户的不满。
用户对产品功能难以满足
开发人员和用户之间很难沟通、矛盾很难统一。往往是软件开发人员不能真正了解用户的需求,而用户又不了解计算机求解问题的模式和能力,双方无法用共同熟悉的语言进行交流和描述。
在双方互不充分了解的情况下,就仓促上阵设计系统、匆忙着手编写程序,这种"闭门造车"的开发方式必然导致最终的产品不符合用户的实际需要。
软件产品质量无法保证
系统中的错误难以消除。软件是逻辑产品,质量问题很难以统一的标准度量,因而造成质量控制困难。
软件产品并不是没有错误,而是盲目检测很难发现错误,而隐藏下来的错误往往是造成重大事故的隐患。
软件产品难以维护
软件产品本质上是开发人员的代码化的 逻辑思维 活动,他人难以替代。除非是开发者本人,否则很难及时检测、排除系统故障。
为使系统适应新的硬件环境,或根据用户的需要在原系统中增加一些新的功能,又有可能增加系统中的错误。
软件缺少适当的文档资料
文档资料是软件必不可少的重要组成部分。实际上,软件的文档资料是开发组织和用户的之间权利和义务的合同书,是系统管理者、总体设计者向开发人员下达的任务书,是系统维护人员的技术指导手册,是用户的操作 说明书 。
缺乏必要的文档资料或者文档资料不合格,将给软件开发和维护带来许多严重的困难和问题。
软件危机的原因分析
用户需求不明确
在软件开发过程中,用户需求不明确问题主要体现在四个方面:
在软件开发出来之前,用户自己也不清楚软件开发的具体需求;
用户对软件开发需求的描述不精确,可能有遗漏、有二义性、甚至有错误;
在软件开发过程中,用户还提出修改软件开发功能、界面、支撑环境等方面的要求;
软件开发人员对用户需求的理解与用户本来愿望有差异。
缺乏正确的理论指导
缺乏有力的方法学和工具方面的支持。由于软件开发不同于大多数其他工业产品,其开发过程是复杂的逻辑思维过程,其产品极大程度地依赖于开发人员高度的智力投入。由于过分地依靠程序设计人员在软件开发过程中的技巧和创造性,加剧软件开发产品的个性化,也是发生软件开发危机的一个重要原因。
软件开发规模越来越大
随着软件开发应用范围的增广,软件开发规模愈来愈大。大型软件开发项目需要组织一定的人力共同完成,而多数管理人员缺乏开发大型软件开发系统的经验,而多数软件开发人员又缺乏管理方面的经验。各类人员的信息交流不及时、不准确、有时还会产生误解。软件开发项目开发人员不能有效地、独立自主地处理大型软件开发的全部关系和各个分支,因此容易产生疏漏和错误。
软件开发复杂度越来越高
❸ 软件开发难不难
软件开发是一个技术型的工作,对于专门从事计算机工作的人来说软件开发工作简单,但是对于业外人事开发软件是一个极难的工作。
软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程。软件开发是一项包括需求捕捉、需求分析、设计、实现和测试的系统工程。软件一般是用某种程序设计语言来实现的。通常采用软件开发工具可以进行开发。软件分为系统软件和应用软件,并不只是包括可以在计算机上运行的程序,与这些程序相关的文件一般也被认为是软件的一部分。 软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试以及编写、提交程序。
❹ 什么是软件危机,为什么产生软件危机
软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。
产生软件危机的原因主要有两个方面:
1、与软件本身的特点有关。
软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件;软件样品即是产品,试制过程也就是生产过程。
软件不会因使用时间过长而“老化”或“用坏”;软件具有可运行的行为特性,在写出程序代码并在计算机上试运行之前,软件开发过程的进展情况较难衡量,软件质量也较难评价,因此管理和控制软件开发过程十分困难。
2、来自于软件开发人员的弱点。
其一,软件产品是人的思维结果,因此软件生产水平最终在相当程度上取决于软件人员的教育、训练和经验的积累。
其二,对于大型软件往往需要许多人合作开发,甚至要求软件开发人员深入应用领域的问题研究,这样就需要在用户与软件人员之间以及软件开发人员之间相互通讯,在此过程中难免发生理解的差异,从而导致后续错误的设计或实现。
(4)为什么软件开发过程难以适用扩展阅读:
解决途径
在软件开发过程中人们开始研制和使用软件工具,用以辅助进行软件项目管理与技术生产,人们还将软件生命周期各阶段使用的软件工具有机地集合成为一个整体,形成能够连续支持软件开发与维护全过程的集成化软件支援环境,以期从管理和技术两方面解决软件危机问题。
此外,人工智能与软件工程的结合成为80年代末期活跃的研究领域。基于程序变换、自动生成和可重用软件等软件新技术研究也已取得一定的进展,把程序设计自动化的进程向前推进一步。
在软件工程理论的指导下,发达国家已经建立起较为完备的软件工业化生产体系,形成了强大的软件生产能力 。软件标准化与可重用性得到了工业界的高度重视,在避免重用劳动,缓解软件危机方面起到了重要作用。
❺ 为什么现在的软件开发效率很难快速提升,甚至到达瓶颈
首先就是资金预算的问题,一款软件从着手开发到交付客户,往往是有许多不可预算的突发情况,因此也给开发预算带来了许多不便,如果我们在开发之前不能准确的预算出软件开发所需要的资金并告知客户,那么如果在开发过程中遇到一些没有预估出来的突发情况使得资金不够,这部分资金客户会不会承认并愿意支付就是一个问题,或者说这部分资金是不是在客户的承受能力之内都不得而知。
大型软件的内存问题,一些大型电脑软件往往占用的内存有好几个G,这对于一些安装了很多软件的电脑来说是灾难性的,内存过大往往会拖慢电脑的运行速度,在有些时候还可能导致电脑死机,造成不可预估的损失。
❻ 软件开发难吗
首先我想强调的是:“学习从来都不是件容易的事,除非你是天才”。
所以,就更不用说软件开发,这个极其需要脑力和精力的学习。
软件开发,本身就是一门大学问,不仅仅需要有扎实的理论知识,还需要不断的实践经验积累。
当然,不同平台的软件开发,上手难易程度是不一样的,而且跟该软件开发所需的编程语言掌握程度关系也非常大。所以,学习软件开发你得先把对应的编程语言先学好学精。
这里简单说下当初我自学Android软件开发的经历:
2011年刚毕业没多久,我在一些论坛上看到很多牛人通过自己写的移动端应用或者游戏赚取了大量的广告费,我在这些数字(金钱)的诱惑下决定自学Android软件开发,希望能从中分一杯羹。
那时候基本上是白天上班,晚上就窝在自己的小屋里,天天学习Java编程语言和Android软件开发到凌晨2、3点。后期基础学的差不多了就开始着手开发自己的App,每天晚上基本都是在完成一段自认为比较满意的代码或者完成自己的App上一个比较重大的功能之后才回床休息。
那段时间很累,但人很兴奋(我这得有多大的兴趣啊)。虽然广告费没赚到多少,但成功的把自己送进了一个比较高大上的外企,薪资也翻了两翻,算是正式踏进了移动互联网行业!
所以,对普通人来说软件开发并不是件容易的事,但天道酬勤,勤学勤练自然就会变得容易!
❼ 为什么软件开发和维护的过程难以度量
这与开发者的管理规范程度和管理水平、技术人员的能力及对规范的遵守情况有关,管理规范、指令已经定量管理的公司软件开发和维护都可以度量。
❽ 为什么软件项目开发中需求难以确定
需求总在变化,有时会导致项目的崩溃,不了了之。参与过实际项目管理的人,往往都有以下类似的感受: 1. 最终用户的理解和开发团队的理解决定了最初的需求模型; 2. 开发团队的理解往往是对用户体验解释的简单机械映射; 3. 概念模型和理想的用...
❾ 企业软件开发为什么困难重重
因为是按照甲方的需求来弄的。不是想怎么样就怎么样
❿ 为什么软件开发方法论让你觉得糟糕
围绕软件开发实践和方法论,总有很多教条式的口水仗。阶段式(phase-gate)方法能够有效管理软件开发过程的风险,还是说只是风险管理中的花哨噱头?TDD真的能够促生出高品质软件?结对编程是代码评审的有效替代抑或只是增加了商议沟通代价?我想说,虽然缺乏证据判断这些论调的谬处,但有两条常用的法则能够帮助我们选择好的实践,同时,提升我们所提供软件的价值:划小开发周期以及提升反馈效率。
Michael Feathers给出了以下观点:
我认为,我们最终还是得倚重开发者的能力,这才是个更重要的考量因素,而非选择哪门语言或纠结于方法论间的细微差别。坦诚地说,我们都清楚这点,但我们看起来好像过度纠结于开发能力是关键因素这事儿上。或许这是个经济学里一个被广泛接受的观点的引申,要是人人都可以替代(随便找个人都能顶上),那该有多好呀?但事实并非如些。
问题是,我们怎样才能找到有(合适)技能的开发者?IT界从未很好地定义个体生产率,从这点来看,那么,要找到合适技能的开发者就是个很难解决的问题。代码行数(Lines of code) – 在现在仍然是一个主流的度量方法 – 深陷“一行代码一个责任”泥潭,这并不是一个好的方法。而度量工作小时数则是鼓励(个人)英雄式举动 – 经验表明,“英雄们”通常就是导致项目延期的人,依赖“英雄”往往是一开始就采取的不该采取的冒险行动,长时间工作导致人变得鲁钝,并导致低质量软件出 现。目前还没有被普遍接受的针对IT专业人才的专业要求系列标准和雇用范式,招聘好的人才,是一门(招聘)艺术,而非(招聘)工程。
心理学家至少对这个问题进行了研究:为什么IT业的技能很难被掌握和度量?Daniel Kahneman说(Thinking Fast and Slow),掌握技能有两个基本条件:一个环境足够规律以便可预测;有机会通过长时间实践来学习掌握这些规律。
但是典型的软件项目往往是没有规律及可预测环境的。项目成功的唯一正确度量就是:最终的结果通过整个生命周期里的实施达到了预期目标吗? 很难知道什么关键活动导致了项目成功和失败,很少有人能够通过旧有或现有的项目获得答案。几乎不可能判定哪些决策导致了成功或失败(在人工智能领域,这叫作信度分配问题)。
这些因素造成了IT专业人员很难掌握引导产品和服务走向成功所需的能力。然而,开发者掌握能帮助他们更高效地达到目标的技巧,将使他们更有动力 – 通常称之为“开发完成”,尽可能快的、不考虑是否功能被集成以及生产就绪。类似的场景也常出现在其他功能性实施领域。
实际的软件项目是复杂的,没有规律可循,这会导致另一个问题 – 为了证明某种技术、实践和方法论是实际有效而收集相关数据是极度困难的,几乎不可能在脱离收集环境的情况下归纳出这些数据。
在Laurent Bossavit的好书《The Leprechauns of Software Engineering》中, 他抨击了软件开发的一些惯式,比如“成本变化”(或“缺陷成本”)“曲线”,这些惯式是许多其它的软件开发方法论知识基础,称开发人员生产率的变化是一个数量级(参照确定性金字塔原理)。Laurent Bossavit说明了相关依据 – 很多人依赖从计算机科学专业学生进行的非正式试验或是从无法被有效控制的项目中收集小量数据。这些研究组织的给出的论调基础往往是不健全的,数据缺乏分析,而且,最过分的是调查结果普遍远远超出了他们的适用领域。
因此,不太可能轻易下论断敏捷开发实践就比瀑布模式之流合适,反之亦然。“方法大师”的见解其实也没太大指导意义,就像Kahneman说的,“人们在想法方面的信心,并非是有效行事可倚重的因素…当评估专家的想法,即使在有规律可循的情况下,你也一定要想清楚是否有合适时机可以引入其想法的可能性”。就像Ben Butler-Cole指出的(why software development methodologies rock),引入一种新方法往往会带来一些影响。
你可能会认为当我们决定怎样运作一个团队时,我们就陷入了被动。但细想一下为什么软件开发无章可循?为什么在这个环境里很难进行一些试验以及获取技能?什么实践和决定会导致成功或失败?其中的根原因就是:环境是无规律的,做出变更与理解变更带来的结果之间的反馈过程太长了。这里的“变更”一词是指广义上的需求变更、方法变更、开发实践变更、商业计划变更、代码或配置变更等等。
还是有一些办法帮助缩短周期的,比如当我们应用精益软件开发思想 – 一个很重要的方法。缩短开发周期在大型产品开发中是很重要的:在Bret Victor的精彩视频Inventing on Principle中提到,“如此多的创新被发现,只要你真正理解了你在做什么,你就能发现任何事物”。
但对我而言就是这样的:我们几乎不可能实践持续改进、学会怎样使团队或个人变得更好、掌握成功创建大型产品与服务所需的技能。除非我们聚焦于尽可能使反馈间隔时间缩短,以便实际洞察其间关联,以及辨别原因和影响。
事实上,从想法到反馈的周期尽可能短的好处是如此明显和重要,应该把其作为商业模式中要遵循的一个重要原则。如果你纠结于要把你的产品创建成一个用户安装式的软件还是SaaS模式(Software-as-a-Service,软件运营服务模式,软件即服务),这时的想法会自然而然地推动你强烈考虑SaaS模式(有感而发)。如果你要重建你的系统(包含硬件),应该考虑怎样尽快实现原型(how you can get prototypes out as quickly as possible),以及模块化硬件和软件,以便你可以快速和独立地整合。3D printing(三维打印成型技术)技术看起来在这方面有着巨大的用武之地,因为它可以满足软件开发应用实践朝硬件系统(原型呈现)的演进。如果你想如愿以偿地缩短周期,或多或少按多功能型团队(cross-functional teams)方式运作是需要的。
软件方法论,即使雇用一群牛人并让他们自我组织,也是糟糕的,因为他们时常搞得“cargo-cult”(货物崇拜,敏捷开发里的知名小故事,形而上):我们在做stand-ups(每日站立会议),我们有优先顺序的backlog(优先待办事务),我们甚至看在老天的份上实践了continuous integration(持续集成)。
我们的到头来的结果为什么还这么差呢?因为你忘了最重要的事情:建立一个学习能力和适应能力都很好的组织。