如何避免软件工程中最昂贵错误的发生 -买球官网平台

3顶
0踩

如何避免软件工程中最昂贵错误的发生

2015-03-31 10:29 by 副主编 mengyidan1988 评论(2) 有6360人浏览
编者按:影响软件工程进度的原因有很多种,而代码重写无疑是最耗费时间的变更之一。那么重写的时候需要注意哪些细节才能把资源开销控制到最低或可接受的程度呢?本文作者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

发表评论

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

相关推荐

  • 注:瀑布模型适用于软件需求很明确的工程 2.原型、演化模型、增量模型(解决用户需求分析困难) 图注: (1)原型和瀑布模型是互补关系,原型是为了解决用户需求分析难以把控即需求不明确而提出的,该模型即:先...

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

  • 瀑布模型是最早出现的软件开发模型,提供了软件开发的基本框架,为后续出现的开发模型奠定了基础。 ...如果连瀑布模型这种软件工程的理论基础都没能好好得掌握,那么恐怕自己的编码就是边改边写...

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

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

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

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

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

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

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

  • 随着人们对软件质量要求的不断提高,软件开发的每一个环节都应该得到十足的重视 代码评审最主要的目的是确保代码库一直保持「健康」的状 b. 如何选择最合适的编程语言 主要考虑的因素 a) 编程语言本身的效率与...

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

  • 【软件工程】重要知识点 一、软件工程概述 软件工程的诞生 1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题。在这次会议上正式提出并使用了“软件工程”这个名词,一门新兴的工程...

  • 由于各种原因,软件的某些部分需要修改,例如,修复运行中发现的错误、适应新的运行平台、提升性能或其他的非功能性特性。所有这些意味着在系统交付后,软件系统总是在不断演化以满足变更的需...

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

  • 测试的目的是显示一个程序做了希望做的事情以及在程序投入使用之前发现其中的缺陷。当测试软件时,

  • 文章目录第一章 软件工程概述1 软件的特点2 计算机软件与硬件相比有什么特点3 为什么说软件工程的发展在一定程度上解决了软件危机的各种弊端?4 简述软件工程的基本原则5. 软件工程的研究内容6. 软件工程的三要素7. ...

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

  • 软件工程存在于各种应用中,存在于软件开发的各个方面。而程序设计通常包含了程序设计和编码的反复迭代的过程,它是软件开发的一个阶段。 软件工程力图对软件项目的各个方面作出指导,从软件的可行性分析直到软件...

  • 软件工程复习题一、单选题 1、软件开发的结构化设计(sd)方法,全面指导模块划分的最重要原则应该是( c )a模块高内聚 b模块低耦合 c模块独立性 d程序模块化2、软件工程方法的提出起源于软件危机,而其目的应该是最终...

global site tag (gtag.js) - google analytics