(发布晚原因:发到团队博客了

一、关于银弹

在佛瑞德·布鲁克斯于1986年发布的《没有银弹:软件工程的本质性与附属性工作》这篇软件工程的经典论文中,作者向我们讲述了软件工程没有银弹这样的理论。银弹,指的是强有力的武器。用作者的观点来说,就是:

“软件工程中不存在银弹——没有任何一项技术或方法可使软件工程的生产力在十年内提高十倍”

软件创作包括本质性工作和附属性工作。本质工作指的是软件构建、软件从抽象性问题发展出解决方案。附属工作指将解决方案实现到电脑上所遇到的困难。

文章中说,附属性工作将会随着工具的改善而逐渐淡化,并举例说明从汇编到高级语言,附属性工作难度的降低使软件开发效率大大提高。我认为这一点很正确,附属性工作会随着软件行业整体的进步逐渐降低。近年来开源流行,许多先进技术的开源,框架的开源,都给我们软件开发提供了非常现成的工具。通过工具的帮助,我们对于软件的想法可以很快实现。就像这一次开发中,后端使用了rails,前端使用了semanticUI,这些框架的使用,使我们专注于核心代码的实现。软件设计中重复的工作(如HTTP请求、web server服务器的开发等)则交给“工具”来完成

而本质性工作的复杂性则难以消减、淡化,并始终制约软件开发效率,使得软件开发没有“银弹”。这些本质性的工作包含复杂性、一致性、可变性和不可见性。通俗地讲,这些复杂性的难度表现在如下几点:

1.软件功能的增加,会导致软件在复杂性处理上付出的设计成本几何级增长。

2.软件工程从来不是一个人的工程,有时也不是一个开发团队的工程,这里面接口、文档、以及设计的一致性直接影响开发效率、沟通成本的高低、大小。所以一致性必不可少,而软件各模块一致性的设计是相当复杂困难的。

3.软件的首要功能是服务用户,因此经常会需要持续变更,保证软件的可扩展性也是软件设计中的本质工作之一。

软件工程没有银弹,但却有各种增加软件开发效率的方法。这一点我在开发团队中深有体会。

首先,我们在前后端开发前,先制定了API文档。API文档规定了后端提供的数据接口,调用方法以及返回值说明。使用JSON作为API传输数据的主要格式。这样做的好处有两个:其一,将前后端开发的耦合性降到最低,前后端只需要对照API文档开发即可,目标明确,而又互无干扰。其二,使用API作为后端接口,为将来的软件扩展性腾出很大空间,因为后端提供API后,开发手机APP将可以直接使用,无需调整后端架构。

其次,我们使用了非常正确的技术栈,后端使用nginx+rails+mysql/sqlite,前端使用JS+SemanticUI,这直接是我们的前后端开发效率直线提升。rails的使用,让后端开发过程中几乎没有遇到太大困难,而且rails本身的MVC框架再次将责任细化到模型、控制、视图。前端JS+SemanticUI的架构,将前端工作拆分为JS和web界面两部分。这样的技术栈选取,最大限度地将前端、后端的任务细化、消除耦合与相互干扰,使得在团队协作的前提下,个人开发效率得到有效提高。

最后,在开发之外,留有一手PM负责整体架构,考虑项目各模块开发设计,技术选取以及可能遇到的技术难题并提前寻找解决方案,保证项目开发不因为技术问题停滞。此外,PM为项目进展提供催动与监督,从技术上又提供指导,技巧上提供好的高效率的开发工具(如Fiddler),最终实现项目的平稳推进并完成发布。这也是我们对付“软件工程”的一枚“小银弹” O(∩_∩)O

二、大泥球

大泥球指的是由混乱的代码、一次性的代码、修修补补的代码盲目组合在一起而形成的随意化的杂乱的结构化系统,往往会导致很多错误和缺陷。

我认为产生“大泥球”的主要原因是代码管控不严以及团队规范未树立。项目规划不正确,导致遇到麻烦后乱了锅,又对代码管控不严,最终导致项目中代码混乱而臃肿。若要预防大泥球,需要提前就对项目代码结构有比较明确的规划和预期,并提前指定应对大部分问题的规则,遇到意料之外的问题时应慎重对待、遵守团队代码规则,不要允许混乱的代码进入代码体系中。

面对大泥球,我们时常会有“推翻重写”的冲动,大泥球会带给后来人太多痛苦,我们写软件一定要避免“大泥球”!

我们的项目因为是刚刚经过一轮迭代,一切从零做起,所以暂时没有遇到“大泥球”的困扰。但是我觉得我们的前端代码可能会成为“大泥球”,因为前端工作太细碎,又没有规范,各个人都在向前端提供代码而没有统一的代码规范以及应对前端各种开发问题的解决方案。现在看前端代码,可谓是“补丁套补丁”,我觉得这只能归因于队员们没有开发经验不足,实际上如果我们对前端足够了解,我们会制定好一套前端代码的规程。我们会在二轮迭代中做好这一点,也有可能对之前的前端代码进行重构整顿。

三、大教堂&集市

大教堂,是软件开发的一种模式,指的是源代码在软件发行后公开,但由一个团队管控。

集市,是另一种软件开发模式,指源代码公开后,可以供任何人开发提交代码。

大教堂模式的优点在于,代码由固定的若干人负责,代码质量比较有保证。缺点在于,软件总无法得到充分的测试,可能会有bug,除错时间大大增加。

集市模式的优点在于,所有人都可以参与到软件开发中,软件中的bug可以得到更多人的检视而被查出更正。

A Generation Lost in the Bazaar告诉我们,集市开发模式的弊端是被一群人更改后的代码很难看,不简约。

我们的项目目前属于大教堂模式,代码仅由我们的开发团队控制。开发团队内部也一样,后端代码由后端开发成员控制,前端代码由前端开发同学控制。

四、瀑布模型

瀑布模型是软甲开发的一种模型,指的是将软件开发分为若干个流程,例如将软件生命周期分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并规定它们自顶向下,互相衔接,固定次序。如同瀑布流水,逐级向下,最终活的产品。

这样的模型要求每个阶段都达到“无后效性”,即保证每个阶段开发的完备性。

在我看来,瀑布模型过于“笨重”,不适合于软件的短期开发。不过从长期来看,瀑布模型开发很平稳,有利于打持久战。

五、敏捷开发

敏捷开发是一种面临迅速变化的需求快速开发的能力。敏捷不单单是快,更是短周期改进、调整的意思。敏捷开发在形式上有product backlog、sprint backlog、sprint、scrum meeting、burning down等开发技巧。

我们小组的软件工程是敏捷开发的模式,将经历集中在可执行的程序上,随时考虑模拟用户行为、用户体验,对项目提出新的需求与改动,每天进行scrum meeting,汇报总结,发表报告。此外,敏捷开发最重要的是“沟通”,这一点我们做的最到位,小组成员经常会坐在一起交流,前后端交流、前端后端内部交流,实现了很多的“约定”,大大解决了互相之间的依赖与影响。

六、软件工程的方法到底有多少用处

软件工程的方法,在我理解来,就是一套方法、规则以及经验。我们阅读的两篇文章,告诉我们软件开发方法对软件开发产生的影响、典型软件项目往往没有规律以及可预测环境。项目成功的唯一目标是:通过软工开发达到项目开发的预期目标了吗?很难知道是什么因素导致了项目的成功或失败。

我觉得软件工程的方法,一方面,可以给我们提供很多经验指导,使我们少走弯路,开发效率得到提高,另一方面,告诉我们应对各种开发问题的方法与心态,解决问题的方法论,开发团队组织的方式等。这些在我看来是非常重要的,没有软工的方法,软件开发过程可能会很痛苦,而且很有可能因为采取不恰当的软工方法导致软工项目失败。

【个人博客作业Week7】软件工程团队项目一轮迭代感想与反思的更多相关文章

  1. [个人博客作业Week7]软件工程团队项目感想与反思

    在阅读了推荐阅读的材料之后,我想了很多东西.最终还是决定,以团队项目的经历为主线,叙述我关于软件工程的一些思考与体会. 凤凰涅槃,浴火重生 如果要我来概况这几周团队项目的经历的话,那么句话是我所能想到 ...

  2. 个人博客作业Week7(阅读文章,心得体会)

    Alpha阶段结束了,内心可以说是五味杂陈.不是说我们的产品拿不上台面那般差劲,复杂的心绪主要来源于和别的队的比较,别的队才刚刚发布没多久访问量和注册量就破百了,并且还发起了找bug送红包的活动.可能 ...

  3. 个人博客作业week7

    个人阅读作业week7 一.瀑布 软件工程的瀑布模型是1970年由Winston Royce提出来的,即软件的开发按照一个严格的.顺序的.单次的瀑布流开发周期.例如需求分析阶段.概要设计阶段.详细设计 ...

  4. 个人博客作业-Week7

    团队任务中个人感想 我们团队选的题目是爬虫, 采用用AVA平台开发了, 我原来JAVA语言不熟悉了, PM考虑这部分之后分配任务这部分感觉很多谢 团队当中的PM很清楚每个组员的力量, 所以PM跟每个组 ...

  5. BUA软件工程个人博客作业

    写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 个人博客作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 阅读教材,了解软件工程,并比较各 ...

  6. 【2020BUAA软件工程】个人博客作业

    个人作业博客 项目 内容 北航2020软工 班级博客 作业要求 具体要求 我的课程目标 学习软件工程,掌握团队合作,锻炼自我 作业在哪个方面帮助我实现目标 通读<构建之法>,尝试理解软件工 ...

  7. 初窥软件工程 2020BUAA软件工程$\cdot$个人博客作业

    初窥软件工程 2020BUAA软件工程\(\cdot\)个人博客作业 目录 初窥软件工程 2020BUAA软件工程$\cdot$个人博客作业 一.作业要求简介 二.正文 (一) 快速看完整部教材,列出 ...

  8. BUAA软件工程个人博客作业

    软件工程个人博客作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标 团队完成好的软件,并对自己作出规划 这个作 ...

  9. BUAA_2020_软件工程_个人博客作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪个具体方 ...

随机推荐

  1. 浅copy与深copy举例

     例1: #!/usr/bin/env python import copy d1 = {'x':1,'y':2,'z':[3,4.5]} d2 = d1 d3 = d1.copy() d4 = co ...

  2. 创建随机的9x9数独游戏终盘并打印

    创建随机的9x9数独游戏终盘并打印 项目github地址 1. 项目相关要求 1.1 要求 利用程序随机构造出N个已解答的9x9数独棋盘 . 输入 数独棋盘题目个数N(0<N<=10000 ...

  3. 线程间的通信_多生产者多消费者问题_JDK1.5新特性_Lock

    对于同步代码块,对于锁的操作是隐式的但是在JDK1.5之前的这种方法效率有点低,判断会很多,后面升级之后有新的解决方案 jdk1.5以后将同步和锁封装成了对象,并将操作锁的隐式方式定义到了该对象中,将 ...

  4. c++のurlmon实现下载文件并进度回调

    主文件: #include "stdafx.h" #include <UrlMon.h> #pragma comment(lib, "urlmon.lib&q ...

  5. Destroying Array CF 722C

    题目大意就是给长度为 n 一个数列,有 n 每次删除,每一次删除第 i 个位置上的数,求每一次删除后剩余不连续数列的最大区间和. 输入样例 4 1 3 2 5 3 4 1 2 输出样例 5 4 3 0 ...

  6. JDK文档中关于Semaphore的正确使用以及使用场景

    import java.util.concurrent.Semaphore; /** * * JDK文档使用备注:<br> * Semaphores are often used to r ...

  7. fibonacci数列的性质和实现方法

    fibonacci数列的性质和实现方法 1.gcd(fib(n),fib(m))=fib(gcd(n,m)) 证明:可以通过反证法先证fibonacci数列的任意相邻两项一定互素,然后可证n>m ...

  8. Perfect Pth Powers pku-1730(筛+合数分解)

    题意:x可以表示为bp, 求这个p的最大值,比如 25=52, 64=26,  然后输入x 输出 p 就是一个质因子分解.算法.(表示数据上卡了2个小时.) 合数质因子分解模板. ]; ]; ; ;n ...

  9. javascript高级选择器querySelector和querySelectorAll

    querySelector 和 querySelectorAll 方法是 W3C Selectors API规范中定义的.他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流浏 ...

  10. Zookeeper安装及运行

    zookeeper的安装分为三种模式:单机模式.集群模式和伪集群模式. 单机模式 首先,从Apache官网下载一个Zookeeper稳定版本,本次教程采用的是zookeeper-3.4.9版本. ht ...