Fred Brooks在1987年所发表的一篇关于软件工程的经典论文《No Silver Bullet》中谈到:全部软件活动包括:git
其中软件工程师在次要任务上花费了过多的时间,然而次要任务占软件工做的比例有限,因此一味地从次要任务方面进行优化没法带来软件生产率数量级上的提升,须要开始关注软件的根本任务。程序员
人们在软件开发中试图寻找一种可以使得软件可以像硬件中的电子管、晶体管那样指望每两年有两倍的增加。然而并不存在任何技术或管理上的进展,可以独立地保证软件在生产率、可靠性或简洁性上取得数量级的提升。这是由软件的自身特性决定的,可是却拥有一些使人振奋的革新。这些方法的规范化、持续地开拓、发展和传播确实可使生产率产生数量级的提升。由此,产生了如今的软件工程。github
现代软件系统中有一些没法规避的内在特性:复杂度、一致性、可变性和不可见性。编程
一致性。软件工程师所要面对不少状况,好比:必需要遵循许多人为惯例。这些惯例随接口的不一样而不一样,然而,这些变化并非必需的,仅仅因为它们是不一样的人设计的结果。在这种状况下,软件的复杂性来自:须要保持与其余接口的一致性,对软件自身的任何再设计,都没法简化这一复杂特性。数组
在软件领域中取得的最富有成效的三次进步体如今对于次要困难的解决包括:高级语言,分时,同一编程环境。安全
然而,如以前所述,一味地从次要任务方面进行优化没法带来软件生产率数量级上的提升,须要开始解决软件的根本而非次要问题,能够从如下几个方面来考虑:
架构
在咱们的团队项目中,咱们选择了C#,以及统一了VS开发环境,在次要任务上保证了软件开发效率,此外在主要任务方面咱们采用增量式的开发方式,在初步实践获得效果后,团队成员都特别兴奋,增长了对写一个相对完善软件的信心。编程语言
大泥球是指一个随意化的杂乱的结构化系统,只是代码的堆砌和拼凑,每每会致使不少错误或者缺陷。ide
在我的项目中,曾经出现过部分函数功能类似只有少许功能不一样,而后类似的功能直接采用代码复制,不只致使代码冗余度大,并且产生了许多潜在的bug,好比有少部分数组下标忘记修改致使结果偶发性错误,并且前期设计不够充分,以后使得系统愈来愈复杂,最终代码写了1000+,然而感受若是以前一个好的设计的话,代码最多400行左右。归纳总结避免大泥球的方法以下:在软件设计阶段首先须要关注软件的特性和功能,而后集中在架构和性能,使得软件设计之初就避免产生问题或者方向的误差。其次,在编写软件时要及时解决出现的小问题或者原型概念等等,这样不会使得问题堆积致使后期的没法修改。函数
大教堂模式的软件开发让程式除错的时间大幅增长,由于只有少数的开发者可参与修改工做。市集模式则相反。
咱们的团队项目采用的是大教堂模式,因为咱们选用TFS进行代码管理,在必定程度上决定了代码只能属于大教堂模式,这样也就致使咱们的软件在开发过程当中只能由开发人员来保证软件质量,在必定程度上致使除错时间的增长,在以后的软件开发中能够考虑将代码由github进行管理,即时接受其余开发者的检视以及增量式开发。
做者文中无情的揭示了集市模式致使的一个悲哀的现实:一坨脓包似的权宜代码,被一群盲目的根本不知IT架构为什么物的所谓IT“专业人士”永无休止地复制着,粘贴着。这事儿放在今天你也许很难相信,但就是在这使人无比尴尬的混沌之下,沉睡着美轮美奂的Unix大教堂的遗迹,而Unix偏偏是以设计简约、功能实用、执行优雅而著称于世的。(世间荣耀就此消失……)咱们能够精确地指出Unix开始走向碎片化的时间点:1990年代初,AT&T抛弃Unix,将其商业化,抢走其架构师的那一刻。参考:有人负责,才有质量:写给在集市中迷失的一代。
而做者认为针对这一现象最有效的解决方式是:所谓质量,只有在某人对它负责时才有意义,而这个“某人”只能是一我的,不能是几我的——二重奏除外。个人理解是针对软件的架构师必需要负责整个软件的生命周期,由于,软件的开发人员可能更迭,若是架构师不负责软件的维护,那么后续的开发人员对于软件很难有一个良好的把控,只能不明因此地沿用前人的代码,而没法对于已通过时甚至错误的代码作出适当的删改,致使软件的碎片化,以及文中指出的那样对于早已过期的Fortan编译器兼容性的检测。
咱们的团队项目采用增量式的方式进行开发,因为以前学长没有使用那些晦涩难懂的语法或者语言现象,咱们对于代码都可以清楚地理解和把握,因此咱们在团队开发中没有遇到相似的问题。我认为这是因为软件的规模所决定的,咱们的软件规模跟Unix这样的大型软件规模是无法相提并论的,软件的设计也只存在于开发者的头脑中,不存在架构师,这种问题也就相应地没有出现。
1970年WinSTon Royce提出了著名的"瀑布模型",直到80年代早期,它一直是惟一被普遍采用的软件开发模型。
瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,而且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落,最终获得软件产品。
在咱们的团队项目开发中采用的就是这种“瀑布模型”,因为咱们的用户需求相对固定,此外,瀑布模型给出了阶段的划分彻底可以适应咱们项目开发的模式需求,故而采用这种模式。
敏捷型方法的合理性,着重点并非放在其“轻重”上,而是于它们的适应性(adaptive〕性质和以人优先的理念。
多数软件开发仍然是一个显得混乱的活动,即典型的“边写边改” (code and fix〕。设计过程充斥着短时间的、即时的决定,而无完整的规划。软件行业中最初的一场运动是要改变这种状况,而引入了“正规方法” (methodology〕的概念。敏捷型方法(agile methodologies)的发展是对这些工程方法的反叛。
敏捷型与工程型方法有一些显著的区别。其中一个显而易见的不一样反映在文档上。敏捷型不是很面向文档,对于一项任务,它们一般只要求尽量少的文档。 从许多方面来看,它们更象是“面向源码”(code-oriented〕。事实上,它们认为最根本的文档应该是源码。
文档减小仅仅是个表象,它其实反映的是两个更深层的特色:
不可预见过程的控制 - 迭代
对付一个不可预测的世界呢?最重要,也是最困难的是要随时 知道咱们在开发中的情形处境,这须要一个诚实的反馈机制来不断准确地告诉 咱们。这种机制的关键之点是“迭代式”(iterative〕开发方法。
虽然迭代式开发也可用于可见性环境,但它基本上仍是用做“适应性” (adaptive〕过程,由于适应性过程能及时地对付需求变动。需求变动使得长期计划是不稳定的,一个稳定的计划只能是短时间的,这一般是一个“迭代周期”(iteration〕。迭代式开发能让每一个迭代周期为下面的开发计划提供一个坚实的基础。
一些敏捷开发的方法
XP始于五条基本价值观(values):交流,反馈,简洁,勇气和尊重(Communication, Feedback, Simplicity, courage, and Respect)。在此基础上细化出了十四条原则(principles)和二十四条实践法(practices)。其基本思想是: 实践是项目组的平常的具体活动,而价值观是根本性的知识和理念,其构成了该方法基石。没有实践法的价值观是难于应用的,或失之于过于宽泛而不知从何着手。没有价值观的实践法则是一堆杂乱无章的活动。价值观和实践法都是须要的, 但中间还有一个空档--而原则正是用来链接价值观和实践的。许多XP的实践法都是之前就存在的并通过实践检验的,而经常被许多过程,包括那些计划型过程给忽略了。XP从新创建了这些准则,并把它们编织成了一个和谐的总体, 使得每一项准则都能在其余准则里得以强化。
XP有一个最具冲击力的是它对测试的极端重视。诚然,全部的过程都提到测试,但通常都不怎么强调。但是XP将测试做为开发的基础,要求每一个程序员写一段源码时都得写相应的测试码。这些测试片断不断地积累并被整合到系统中。这样的过程会产生一个高度可靠的 建造平台,为进一步开发提供了良好的基础。这种方法常被描述成 Test Driven Development(TDD)(测试驱动开发),它对许多不是彻底采用XP的方法都有很大的影响。
SCRUM的着重点是在软件开发的管理方面。它把一个项目分红若干个为期三十天的迭代阶段,每一阶段称之为一“冲”(sprint〕。天天有一个短会, 称之为一个scrum,这样管理者能对项目有近距离的观察与控制。SCRUM对工程实践方面强调少一些,许多人在开发中把SCRUM的项目管理和XP的工程实践相结合。
全部水晶方法都有三个需考虑的优先因素(priorities):安全性(safety) (项目的结果),效率(efficiency),和习惯性(habitability)(即开发人员 多大程度上愿意使用水晶方法)。其余共同特征有:频繁发布,反思改进,紧密交流 (Frequent Delivery,Reflective Improvement, and Close Communication)。
敏捷开发运动最初是由软件开发人员来推进的。可是,参与软件开发的其余方面 的一些人士也受到这个运动的影响。一个明显的群体是测试人员,他们一般是生活 在由瀑布式开发所限定的世界里。通常来讲,测试的做用是保证软件与开始的设计 相符合。而在敏捷世界里,测试人员的角色还很不清楚。这致使了一个称之为“相关环境测试”(context driven testing)的群体。
Lean movement(精悍生产运动)是由丰田公司(Toyta)Taiichi Ohno独创,并以 丰田生产系统(Toyota Production System)著称。精悍生产的理念对许多早期的 敏捷论者多有启发。
RUP最主要的特征是用例驱动开发(Use Case Driven)(即,开发是以用户可见 的系统功能特征来驱动的),迭代,和以架构为中心(须要优先考虑的一点是, 尽早设计出一个架构以贯穿项目始终)。
在咱们的团队项目中,对于需求变化以及其余的不可预见性采用了迭代的方式进行予以适应性的变化,采用的敏捷开发方式是scrum,总共进行了两次为期两周的冲刺。团队编程中也使用部分极限编程的思想。其中最重要的就是交流和反馈思想的使用,这使得在团队成员之间规避了许多理解上的分歧,从而少走了许多弯路。