一、什么叫软件开发模型!
软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。
典型的开发模型如下:
1. 瀑布模型
1.1 瀑布模型介绍
1970年温斯顿·罗伊斯(Winston Royce)提出了著名的“瀑布模型”,直到80年代早期,它一直是唯一被广泛采用的软件开发模型。
1.2 瀑布模型核心思想
瀑布模型核心思想是按工序将问题化简,将功能的实现与设计分开,便于分工协作,即采用结构化的分析与设计方法将逻辑实现与物理实现分开。将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。
1.3 瀑布模型有以下优点
(1)为项目提供了按阶段划分的检查点。
(2)当前一阶段完成后,您只需要去关注后续阶段。
(3)可在迭代模型中应用瀑布模型。
增量迭代应用于瀑布模型。迭代1解决最大的问题。每次迭代产生一个可运行的版本,同时增加更多的功能。每次迭代必须经过质量和集成测试。
1.4 瀑布模型有以下缺点
(1)在项目各个阶段之间极少有反馈。
(2)只有在项目生命周期的后期才能看到结果。
(3)通过过多的强制完成日期和里程碑来跟踪各个项目阶段。
(4)瀑布模型的突出缺点是不适应用户需求的变化。
2.迭代模型
2.1 什么是迭代模型
在某种程度上,开发迭代是一次完整地经过所有工作流程的过程:需求、分析设计、实施和测试工作流程。实质上,它类似小型的瀑布式项目。RUP认为,所有的阶段都可以细分为迭代。每一次的迭代都会产生一个可以发布的产品,这个产品是最终产品的一个子集。
2.2 迭代模型的使用条件
(1)在项目开发早期需求可能有所变化。
(2)分析设计人员对应用领域很熟悉。
(3)高风险项目。
(4)用户可不同程度地参与整个项目的开发过程。
(5)使用面向对象的语言或统一建模语言(Unified Modeling Language,UML)。
(6)使用CASE(Computer Aided Software Engineering,计算机辅助软件工程)工具,如Rose(Rose是非常受欢迎的物件软体开发工具。)。
(7)具有高素质的项目管理者和软件研发团队。
2.3 迭代模型的优点
与传统的瀑布模型相比较,迭代过程具有以下优点:
(1)降低了在一个增量上的开支风险。如果开发人员重复某个迭代,那么损失只是这一个开发有误的迭代的花费。
(2)降低了产品无法按照既定进度进入市场的风险。通过在开发早期就确定风险,可以尽早来解决而不至于在开发后期匆匆忙忙。
(3)加快了整个开发工作的进度。因为开发人员清楚问题的焦点所在,他们的工作会更有效率。
(4)由于用户的需求并不能在一开始就作出完全的界定,它们通常是在后续阶段中不断细化的。因此,迭代过程这种模式使适应需求的变化会更容易些。
3.敏捷开发模型
3.1 什么是敏捷开发
是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本。能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中人的作用。敏捷建模(Agile Modeling,AM)的价值观包括了XP的四个价值观:沟通、简单、反馈、勇气,此外,还扩展了第五个价值观:谦逊。
3.2 敏捷开发特点
(1)人和交互 重于过程和工具。
(2)可以工作的软件 重于求全而完备的文档。
(3)客户协作重于合同谈判。
(4)随时应对变化重于循规蹈矩。
项目的敏捷开发,敏捷开发小组主要的工作方式可以归纳为:作为一个整体工作; 按短迭代周期工作; 每次迭代交付一些成果:关注业务优先级; 检查与调整。
最重要的因素恐怕是项目的规模。规模增长,面对面的沟通就愈加困难,
因此敏捷方法更适用于较小的队伍,40、30、20、10人或者更少。
4. 快速原型模型
模型简述
原型是指模拟某种产品的原始模型,在其他产业中经常使用。软件开发中的原型是软件的一个早期可运行的版本,它反映了最终系统的重要特性。
快速原型模型又称原型模型,它是增量模型的另一种形式;它是在开发真实系统之前,构造一个原型,在该原型的基础上,逐渐完成整个系统的开发工作。快速原型模型的第一步是建造一个快速原型,实现客户或未来的用户与系统的交互,用户或客户对原型进行评价,进一步细化待开发软件的需求。通过逐步调整原型使其满足客户的要求,开发人员可以确定客户的真正需求是什么;第二步则在第一步的基础上开发客户满意的软件产品。
优缺点
优点:克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险。
这种模型适合预先不能确切定义需求的软件系统的开发。
缺点:所选用的开发技术和工具不一定符合主流的发展;快速建立起来的系统结构加上连续的修改可能会导致产品质量低下。
使用这个模型的前提是要有一个展示性的产品原型,因此在一定程度上可能会限制开发人员的创新。
5.螺旋模型
简介
螺旋模型(Spiral Model)采用一种周期性的方法来进行系统开发。这会导致开发出众多的中间版本。使用它,项目经理在早期就能够为客户实证某些概念。该模型是快速原型法,以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。这种模型的每一个周期都包括需求定义、风险分析、工程实现和评审4个阶段,由这4个阶段进行迭代。软件开发过程每迭代一次,软件开发又前进一个层次。采用螺旋模型的软件过程如下图所示::
螺旋模型基本做法是在“瀑布模型”的每一个开发阶段前引入一个非常严格的风险识别、风险分析和风险控制,它把软件项目分解成一个个小项目。每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定。
螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,继而做出应有的反应,因此特别适用于庞大、复杂并具有高风险的系统。对于这些系统,风险是软件开发不可忽视且潜在的不利因素,它可能在不同程度上损害软件开发过程,影响软件产品的质量。减小软件风险的目标是在造成危害之前,及时对风险进行识别及分析,决定采取何种对策,进而消除或减少风险的损害。
优缺点
优点
1)设计上的灵活性,可以在项目的各个阶段进行变更。
2)以小的分段来构建大型系统,使成本计算变得简单容易。
3)客户始终参与每个阶段的开发,保证了项目不偏离正确方向以及项目的可控性。
4)随着项目推进,客户始终掌握项目的最新信息 , 从而他或她能够和管理层有效地交互。
5)客户认可这种公司内部的开发方式带来的良好的沟通和高质量的产品。
缺点
很难让用户确信这种演化方法的结果是可以控制的。建设周期长,而软件技术发展比较快,所以经常出现软件开发完毕后,和当前的技术水平有了较大的差距,无法满足当前用户需求。
螺旋模型的项目适用:
对于新近开发,需求不明确的情况下,适合用螺旋模型进行开发,便于风险控制和需求变更。
二、软件开发包括哪些内容!
软件开发包括需求、设计、编码和测试等阶段,有时也包括维护阶段。
具体划分为6个阶段:1.计划(项目经理):
了解用户的要求及现实环境,从技术、经济和社会因素等3个方面研究并论证本软件项目的可行性,编写可行性研究报告,探讨解决问题的方案,并对可供使用的资源(如计算机硬件、系统软件、人力等)成本,可取得的效益和开发进度作出估计,制订完成开发任务的实施计划
2.分析(产品经理)
本阶段的基本任务是和用户一起确定要解决的问题,建立软件的逻辑模型,编写需求规格说明书文档并最终得到用户的认可
3.设计(设计经理)
概要设计就是结构设计,其主要目标就是给出软件的模块结构,用软件结构图表示。详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库,常用方法还是结构化程序设计方法。
4.编码(开发经理)
按照软件设计,进行搬砖一点点实现。跟盖楼一样,设计师吧大楼图纸设计好了,搬砖的开始一点点搬砖盖大楼就OK了。
按照老外和国人的眼里,中国程序猿是搬砖工。
5.测试 (测试经理)
做的就是尽可能发现软件中出现的错误。
首先 设计一套出色的测试用例(测试数据与功能和预期的输出结果组成了测试用例)
6.维护(实施经理)
做的就是软件已经交付给客户了,跟踪软件的运行情况,对软件进行适当的修改,以适应新的要求和纠正运行中的错误。
主要做的: 编写软件问题报告、软件修改报告。
流程图:
三、如何给项目选择最合适的编程语言?
每次开始一个新项目,无论是一个独立的程序还是现有计划的一个组件,都会面临着一个应该选择什么样的编程语言的问题。
只考虑之前用过的编程语言或者现在最流行的语言的话,你很可能会得到一个糟糕的结果。所以你应该实时评估自己的选择,并不断寻找更好的替代方法。
评估如下:
1、需要考虑项目的整体架构,并不是项目的所有部分都适合用同一种语言来写。
2、你的团队有过什么样的经验?
研究型项目:OK,可以搞创新,但是你必须要预测出项目的时间表,避免大规模的未知变数。
非研究性项目:用你最熟悉的语言就可以了,怎么稳定,怎么快怎么么来!酱紫风险少,投入少。
为了增加开发效率: 你甚至可以让团队的一小部分不熟悉这门语言的人加入,保证主程(主干程序猿)能有较高的效率。
“ 仅仅因为不熟悉项目所需要的语言就把有经验或者有才华的程序员排除在开发团队之外实在是非常愚蠢的行为!因为啥愚蠢么?
答: 好的程序员都有不错的适应能力。项目中总有要用到不熟悉语言编程的时候。
3、有没有计算开销大的操作?
比如视频处理,图形渲染,密码学,统计分析,信号处理这些对原始处理能力有巨大需求的功能。他们要执行多长时间直接影响到计算机芯片的使用效率。
例如一个网站中,需要大量的统计分析的实时结果展现在web前台页面上,考虑到python语言有强大分析的函数,和快速数据分析统计能力。然后我们就会考虑在项目中结合这种语言。
4、会涉及到许多子流程和文件管理吗?
很多软件都是为了自动处理重复的手工劳动而存在的。过程中每一步都已经有了个非常适合的程序,你需要做的就是把他们组合在一起,这就是软件开发系统管理员的主要关注点所在。
在这里,你需要执行其他程序并且进行文件管理,而脚本语言灵活又简单,并且与生俱来地实现了这些功能,毫无疑问是你的最佳选择!
5、有紧张的资源限制吗?
虽然在一定程度上,现在硬件已经够用了,但是在某些情况下或者对于某些应用来说,硬件还是十分受限的!这一点在嵌入式设备中尤其明显。然而不是所有的编程语言都适合受限的硬件环境下开发,你需要一种编出来的程序能够在那样的环境下运行的语言。
有时候运行时的内存限制是主要问题,有时候可能加载过程的问题更大!也许你会遇到这样的问题:你的应用需要从EEPROM或者网络中初始化,那么你可能需要静态链表或者未修剪的库。这并不是排除了使用基于VM的语言的可能,相反,有时你甚至需要一个小型的VM。
6、是否有明确的需求?
不管是什么语言所写,好的程序总是能够快速地重构和调整。一些语言本身就可以建立快速原型。而且很多商务项目完全没有规范,或者极其粗糙,这种情况下,客户在看到最初产品前完全不知道它应该是什么样子。你会需要不断地修改,直到每个人都满意。
如果你需要在会议中频繁修改程序来演示或者是为了作一份它的详细报告,你会发现快速原型非常重要。动态语言在这里很有优势,它可以很容易地结合多个不相关的库。当然,隐藏“细节编程",比如内存管理,也非常有助于建立快速原型。
7、产品的生命周期有多长?
不是所有语言都是足够稳定的,许多年轻的动态语言在升级中会变得不向后兼容或者大量修改它的核心代码。瞬息万变的项目,决不会真的有这些变化的一个问题,事实上,许多项目甚至还会从这些变化中受益。因为时间向后兼容性成为一个问题,寿命短的项目也会因此变成没有人关心的项目。
如果你的产品寿命长达五年,十年,甚至二十或更多年,无法向后兼容的问题可能会成为你的噩梦。我不认为你会想继续使用过久的编译器和和其它古老的工具,特别当它们还跟老的硬件挂钩时。项目支持新的版本或者新产品肯定会让你受益。这个时候你最需要的肯定是一个有标准委员会管理,并以长期支持和向后兼容为目标定制的稳定的语言。
8、需要支持什么平台?
不是所有的语言都适用于所有平台。如果目标设备不支持你喜欢的语言,那么你肯定是没法使用它的!当然你也不能信任实验性的支持。你喜欢使用C语言,而目标OS上也有C编译器也并不一定意味着它会很合适。定制化的芯片或者甚至是GPU之类有时只支持部分语言产生出来的二进制文件。
芯片组兼容性问题并不唯一,对于需要同时工作的其它软件也一样。比如你需要在用户的浏览器中运行代码,那就没有多少语言可供选择了。某些消费设备供应商也只允许部分语言在自己的平台上使用。 服务供应商往往只专注于某些语言和框架,而并不在意别人的因此带来生的牺牲。如果你打算为Linux编写设备驱动程序,你会发现它的内核小组只支持一种语言。你可以宣传你的想法会带来怎样的好处,但如果你想支持某些特定平台,别无选择,只能遵守该平台的意愿。
是否会有大量的位操作?
文件格式和协议相关的工作往往会需要对字节和位操作。您将需要转换格式到更高级的格式,然后再序列化成一个紧凑的格式。一些算法也会需要对数据进行位操作。最低级的线路协议也会根据你的行为对比特流进行操作。
做这样的工作,你需要一个能够很容易地进行位操作并且能够提供合适数据类型(比如无符号整数类型)的语言。但也并非所有的二进制操作都这么麻烦,某些二进制结构就很简单,甚至经过高级包装的函数都可以对它们进行操作。你需要仔细审查自己的工作对二进制操作的需求,然后选择一个不太麻烦的编程语言。
9、是否涉及到某些特定领域?
不是所有问题的最佳语言都是一样,有很多非常具体的领域存在的专业语言。比如:人工智能、文本解析、数据转换、专家系统、数学、财务分析等等。领域特定语言往往以节省大量的编码工作,而不会产生大的缺陷,所以你应该尽可能使用它们。在这里,你不妨选择专业语言来代替你熟悉的编程语言。
领域特定语言的使用在一定程度上也限制了你可以在项目中使用的其他语言。一些被翻译成另一种语言,而另一些则可以作为可调用模块。无论哪种方式,你还需要某种方法来整合。
如果存在一个优秀的库也适用这一原则。无论它依赖哪种语言,我都建议你去使用它!
结论
要作出一个明智的选择,你会需要了解足够多的语言。如果你仅仅关注某一门编程语言,你会被这门语言以及它的思想牢牢拴住。但相比于语言来说,它们的风格可能更重要。良好地组合静态和动态语言/函数式和命令式/高级和低级语言,再考虑具体领域环境的特点,你才能评估出最适合答案。在选择语言之外,你还需要足够的经验来最佳地利用你最后确定的语言。
当然上面也只是给你一个粗略的参考。很不幸的是第一条规则,也就是团队熟悉什么语言,通常才是实际上左右语言选择中的最终结果的因素。尽可能地把项目分解开来,然后给每一个组件寻找一个最合适的语言,至少以我多年经验来看,组合使用多种语言从没有带来过什么坏处。
你可能会认为,只考虑上述因素也并不一定能确定下语言。事实上,这样通常注意是排除不合适的语言而不是增加新的选择。项目按组件拆分,给每个组件选择最合适的语言,最终你选择语言的标准会越来越严格,直至剩下一两个最佳答案。但如果你不分解项目,你能得到只是一两个相当糟糕的选择,通常按模块分解项目会是更好的选择。
三、编程语言介绍:
TIOBE 2016年10月编程语言排行榜
(说明:TIOBE (http://www.tiobe.com/tiobe-index/)编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量)
十大熱門開發語言解释如下:
1.Java
首先我要推荐的就是Java语言,相信只要略微了解编程的人就会听过Java,其如今依然展现出强势的增长势头,说其是目前最流行的编程语言也不为过。并且随着移动和大数据的发展,以基于Java的Hadoop如今发展迅速,这也是Java编程人员更加千金难寻。其可以用于各种各样的领域,包括企业应用及基础设施,以及Web应用和移动开发。
2.JavaScript
JavaScript在Web应用上有着非常大的需求,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。JavaScript主要用于实现为Web浏览器,以提供增强的用户界面和动态网站。
3.C/C++
C和C++都是基于C的语言,是目前最流行的编程语言, C常被用作系统以及应用程序的编程语言,如嵌入式系统的应用程序。C++语言为C的增强,其在出现后迅速成为开发人员之间最流行的语言之一。它是用于开发系统软件,应用软件,设备驱动程序,嵌入式软件,高性能服务器和客户端应用及娱乐软件,如视频游戏。
4.C#
C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#是微软公司用来替代Java而开发的一种语言,并借鉴了Java,C,C++和Delphi的一些特点,如今C#已经成为微软应用商店和开发成员非常欢迎的开发语言。
5.PHP
PHP是一种通用开源脚本语言,特别适合于Web开发,可嵌入到HTML中,它最初是用来设计动态网页产生的。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛。
6.Python
Python是应用于设计各种各样的应用程序的动态语言, 往往比Tcl,Perl,Ruby,Scheme和Java更容易编写。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。
7.Ruby
Ruby是一种动态的,侧重于简单个高效的开源语言,他是一个优雅的语法,能够很自然的阅读和编写,适合于快速开发,一般开发效率是JAVA的5倍。
8.Objective-C
对于钟情于Apple设备的网友来说,Objective-C的流行就得益于苹果的成功,其是增加了Smalltalk风格的消息在C编程语言中的反射,面向对象的语言。主要使用于苹果系统和GNUstep这两个使用OpenStep的标准的系统。随着苹果平台的巨大人气,如今Objective-C语言被人们逐渐知道。
9.HTML5
HTML5是用于构建因特网的核心技术的标准语言,用于Web呈现内容,它是HTML标准的第五次修订,如今,HTML5继续在移动开发领域发挥着重要的作用,为互联网的发展提供了多样化的发展道路,37%的开发者依赖HTML5开发移动网站和Web应用程序 。
10.CSS
CSS是一种用来表现HTML)或XML等文件样式的计算机语言。最常用于Web样式和HTML和Xhtml接口,该语言可以应用与任何类型的XML文档, CSS的设计主要是为了使文档内容从文档表示的分离,包括元素,如布局,颜色和字体。
总结:这是目前最流行的十种编程语言,这些语言针对不同的领域,对于初学者来说,如果你想学编程开发,那么你需要了解这些语言的不同用户,选择自己喜欢的领域去研究,术业有专攻,这样才能够在未来职场有更好的发展。
总结: 现在大多数企业管理系统后台都是基于java 和php 做的,Java适合大型企业,高性能, 复用性较好的项目。PHP 适合于快速开发,中小型应用系统,开发成本低。
(备注:php也有人用它来构建大型项目:那得是非常了不起的大牛,单纯会使用的php的开发,还是构建不出跟java抗衡的性能级别的系统。)
C最主要的使用领域应该是Unix系系统的开发以及某些Unix系统的软件的相关开发。C++恐怕还是游戏开发。(备注:性能要求和稳定性要求极高的软件开发和底层系统开发可以用C,但是随之开发成本很大。)
C# :微软公司发明的语言,所以开发基于Windows系统的软件还是用c# 比较好, C#适合结合Unity3D框架可以非常快的做出非常出色的3D游戏。所以做3D游戏开发的C#语言是一把利剑。
Python:有强大的科学计算特点,相比昂贵的 商业软件MATLAB,Python完全免费,现在越来越多的公司在招聘数据统计分析软件,要求会用Python+R并且是硕士统计学专业。因为这群人算法功底强悍,Python运用熟练可以在复杂的数据场景构建出数据模型以及决策图表,所有一些金融公司,不惜重金养着这批人。
它在IT自动化运维,预计自动化测试领域大展神威,因为Python是C语言实现的,且跟Linux系统天然集成,因为Python语言语法特别简单对于运维人员和测试人员相对开发基础薄弱的是一大福音 。
Objective-C :专门用来开发苹果公司的硬件设备的,也没啥好说的,现在只能开发在苹果设备上。好不好大家有目共睹。
三、大型互联网公司软件设计进化论分析对比:
最近因为参与项目的关系,对淘宝,京东,苏宁易购三家网站系统构架做了肤浅的研究,做了几张图,放在下面,给需要的同学。
因为资料的不完整,有些可能不准确或是错误的,肯请各位指正。
这三家代表了三种流派,淘宝走的是开源路线,个人也比较推崇这种方式,但对技术人员的要求较高,比较少有公司勇于走这种路线,可能只有马云这种对技术不懂的,才能放手让技术人员自由发展。
京东的刘强东自己懂开发,从一开始就构架在.Net上面,现在已经是尾大不掉,随着发展已经开展痛苦的转型中。
苏宁易购因为内部ERP,CRM已有大量的应用,所以选用了底层、业务层比较成熟的商用套件IBM WCS,在业务构架方面还是有可取之处,但苦于技术、开发层面熟悉电商的高水平顾问缺乏,苏宁目前通过招聘Java开发人员,准备加强自身的开发能力。
下面是几张不涉及到项目机密可以拿出来讨论的图,欢迎大家讨论指正,邮件可发至我的邮箱:fengqiang # gmail.com