如何避免软件工程中最昂贵错误的发生 -欧洲杯足彩官网

3顶
0踩

编者按:影响软件工程进度的原因有很多种,而代码重写无疑是最耗费时间的变更之一。那么重写的时候需要注意哪些细节才能把资源开销控制到最低或可接受的程度呢?本文作者edmond lau在其中进行了阐述。以下为译文。



前几周,一位年轻的初创企业工程师过来寻求我有关代码重写的建议。其管理层希望她的团队在4周内完成web产品的代码重写工作。这已进行了3个多月,但估计还要多花2个月才能完成。她们每周的工作时间将近80多个小时,伴随的还有一堆堆的错误需要更改。时间对于初创公司来说无疑是重中之重,她们该如何处理目前这个困境呢?

在我职业生涯早期,也曾碰到过类似的困境——原本估计4个月完成的项目,在通过重写后,最终用了9个月才完成。在这个痛苦的过程里,最令人抓狂的事情之一是如果市场出现新的机遇,由这引起的改动是最优先的。换言之,我们只能不断的缝缝补补。打这以后对于项目重写,我变得慎之又慎。

google docs的故事

在今年初,我与sam schillace会面时也讨论过有关重写的问题,它是box的技术副总裁,前google apps负责人。我向他提了一个问题,“你们工程团队曾遇到过的最昂贵的错误是什么?”

他的回答是,“尝试从零开始开展代码重写。”
schillace的创业公司在2006年被google收购了,他们当时的团队有4人,产品名字是writely即google docs的前身。在他们发布了一个试验性的c#原型作品后,用户数很快就突破了50万。加入google后,他们收到的第一个商业任务是进行项目迁移,从而充分利用google的架构体系以实现高容量和高扩展性。每天用户数仍在快速增长,而他们也开始意识到之前所写代码的扩展瓶颈。

我还在google工作时,我知道google的软件堆栈是不支持c#的。所以当schillace说到这里时,我很自然地问到,“当你们进行writely到google docs的转换时,你们是不是只能从零开始?”。

schillace的回答是,“是的。”当他们开展重写工作时,有个合伙人提出边转换边重写,因为如果进行彻底推翻,将极大增加工作量。schillace并不认同。最终,他说服团队只设置一个非常有限的重写目标,延后其它更多的目标工作。他们定下一个清晰的目标先把系统在google数据中心运转起来,然后再整合12种不同的google技术。他们花费了一个星期来调试并最终编译成功。调试过程中,很多错误是由于java和c#不同的语义表达引起的,例如==双等号的不同含义。

“这真的真的非常痛苦。”schillace说道。继续奋战12个星期后,他们最终完成了一个“令人惊讶的,奇怪的,晦涩难懂的”代码库。但它也最终在google数据中心里成功运转了,这也创造了一项纪录—被收购后最快适应google架构的转换项目。如果他们不是摒弃了过多的目标,也许还不能这么快就完成。同时如果他们把更多精力放在代码质量上,时间也会用得更多,因为需要修正一堆堆的正则表达式。相反地,他们的目标是使writely先尽快运转起来。

经验教训

以上所说并不代表重写或推倒重写就是绝对的对或错。mongodb的创始人eliot horowitz曾说过,“我们应该把代码看成有3-5年的半生命周期,因此应该定期进行更新。”mapreduce,bigtable等技术的google架构师jeff dean也曾说过,“我们不妨以放大10倍的规模来设计软件,这样一来我们会发现它的与众不同。”

如果我们一口气就把整个代码进行重写,问题便会出现。我们会倾向于低估了开销而高估了益处。

当我们缺乏经验时,这是很正常的。我们没有足够的底气和知识来阻止过激的进度计划,同时也没有划分好先后优先级的技能。我们可能会想,一个好的工程团队会有人能完成这一切。因此可能会认为只要按部就班、兢兢业业地去做事就万事大吉了。

经过一段时间历练,也不一定就能避免所有错误,因为评估工作仍然复杂而我们也会因为有了经验而高估了自己。这是一个有关虚幻优越感的事例。如果你去调查100位驾驶员的驾驶水平,80%的人会认为自己的水平是中上的。如果调查100位教练,68%的人会认为自己处于前列。类似的情况在iq测试,自我评价等测评中屡见不鲜。所以,对于软件工程师来说,很自然会认为不能按时完成任务只会在较低水平团队中出现,所以当真的出现超期情况时,会使得重写工作一再拖长。

一旦重写出现超期,我们往往会自欺欺人地认为只要多加几天班,多开几次会就能把进度赶上。我们也不会再去想别的途径。一两次或许可以侥幸通过,但长期来看这是不能持续的,“罗马非一天建成”。

最佳的策略是全方位评估推倒重写的价值。如果需要这样做,例如schillace所做的,不妨为项目设置一个有限的目标集合然后使之尽快实现并不断完善。如果你所在的团队陷入了一个一再延迟的项目,你需要站出来,指出商业目标和实际工作的差距—看是否需要减少过多功能,是否需要设置更切实可行的目标,是否把项目看成是沉没成本而彻底终止。对于采取何种策略,需要实事求是,而不能生搬硬套。(编译:伍昆 责编:张红月)

原文来自:
  • 大小: 64.7 kb
3
0
评论 共 2 条 请登录后发表评论
2 楼 2015-04-09 11:08
“这真的真的非常痛苦。”schillace说道。
1 楼 2015-03-31 15:33

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 如何避免软件工程中最昂贵错误的发生 url: http://www.iteye.com/news/30395 编者按:影响软件工程进度的原因有很多种,而代码重写无疑是最耗费时间的变更之一。那么重写的时候需要注意哪些细节才能把资源开销...

  • 1.下面哪项不属于软件工程方法学的要素(b) a、方法 b、模型 c、工具 d、过程 (知识点)软件工程三要素:方法、工具、过程 2.面向对象方法学具有(d)个要点。 a、1 b、2 c、3 d、4 (知识点)面向对象要点:对象...

  • 【软件工程题库】第一章 软件工程概述

  • 山东大学软件学院软件工程作业参考答案

  • 文章目录1. 软件与软件危机1.1.... 软件工程学2.1. 软件工程学的概念2.2. 软件工程项目的基本目标2.3. 软件工程的八项原则2.4. 软件工程的本质特征2.5. 软件工程的七条基本原理3. 软件工程方法学3.1. 软件工程方法...

  • 1 软件与软件危机 1.1 软件的特性 软件是一种逻辑实体,而非具体的物理...  软件产品一般分为两类:通用软件产品(如数据库软件、文字处理软件、绘图软件、工程管理工具…)和定制软件产品(如电子设备的控制软...

  • 初识软件工程 软件工程方法是( )。 为了获得高质量软件而实施的一系列活动 为开发软件提供技术上的解决方法 为支持软件开发、维护、管理而研制的计算机程序系统 为了理解问题和确定需求而采取的一些技术和...

  • 软件=程序 数据 文档1、软件危机的主要表现软件不能满足用户需求软件开发成本严重超标,开发周期大大超过规定日期软件质量难以保证,可靠性差软件难以维护软件开发速度跟不上计算机发展速度2、软件危机产生的原因一...

  • 一、软件工程概述 1 软件和硬件的不同 硬件 人工制造 易磨损(硬件磨损后可以使用备件替换) 使用标准化组件制造 相对简单 制造出来后一般不改变 软件 开发出来的 易退化(需求的不断变更是软件退化的根本原因...

  • 瀑布模型的特点和适用场景 (是结构化方法中最常用的开发模型,是由文档驱动的,适合开发需求明确的软件,不适合大型软件系统) 21.螺旋模型的特点和适用场景 (引入了其他模型不具备的风险分析,适合需求不明确的...

  • 1. 2-1 软件过程模型 a. 软件过程(software ...软件过程不仅涉及工程开发,而且还涉 及工程支持和工程管理。 软件过程定义以下内容 2. 软件过程的目的 3. 黑盒过程与白盒过程 a) 黑盒存在的问题 b) 白盒优点

  • 因为软件工程我们是网考的,前面写的比较认真,后面比较水,反正重要的就是敏捷开发(各种步骤),风险管理,质量,设计模式,设计准则这几大块

  • 面向对象软件工程笔记 第一章 面向对象软件工程概述及范畴 0.软件:软件是计算机系统中与硬件相互依存的控一部分,它是包括程序,数据及其相关文档的完整集合。 1.软件危机:是指软件开发和维护过程中存在的周期长、...

  • 这是我在准备软件工程基础考试时根据考点整理的一份知识点汇总。

  • gb/t11457-2006《信息技术 软件工程术语》中对软件的定义是:软件是与计算机系统的操作有关的计算机程序、规范及可能的相关文档的完整集合。软件在开发、生产、维护和使用等方面与计算机硬件相比存在明显的差异。...

  • 软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。

  • 软件需求是对系统或系统组件的功能和性能的描述,用户希望系统实现的期望结果。软件需求就像是用户对软件提出的要求清单,包括软件应该实现的功能和达到的性能水平。业务需求(business requirements):反映了组织...

  • 文章目录第一章:初识软件工程第四章:软件开发过程 第一章:初识软件工程 软件工程方法是(b )。 a 为了获得高质量软件而实施的一系列活动 b为开发软件提供技术上的解决方法 c为支持软件开发、维护、管理而...

  • 软件过程是软件开发活动的集合 包含风险分析的软件工程模型是螺旋模型 软件工程中描述生命周期的瀑布模型一般包括计划、需求分析、设计、编码、测试 和维护等几个阶段。 软件开发的瀑布模型一般都将开发过程划分为...

  • 文章目录一、软件工程的定义1、fritz bauer在nato上给出的定义2、barry boehm3、ieee在软件工程术语汇编中的定义二、软件工程的层次1、软件工程三个要素2、软件工程的层次——图解3、软件工程的层次——逐一分析三、...

global site tag (gtag.js) - google analytics
网站地图