本文原作者miguelcarrasco,来源于
http://www.realsoftwaredevelopment.com/what-makes-version-10-software-hard/。
我经常为开发软件的1.0版有多困难感到困扰。开发软件本身就是一件困难的事情,其原因不是在一篇博客里所能详尽的,但是为什么写V1.0如此之困难呢?我可以为你提供一个线索:这和开发商无关,而在于这是一个创新的过程。
事实上很多时候已经推出的V1.0都会有问题,这时你会觉得非常痛苦。相似的例子是新型号汽车推出后,经常会有大量召回的现象。有创新的地方,就有bug。你和你优秀的团队会花几个月、几年甚至更长的时间来测试软件包,但还是不能代替实际应用中对软件的测试。
有些时候,你也可以推出非常好的V1.0,但这是准时推出的吗?
V1.0意味着创新
开发V1.0是在创造从未有过的东西,是创新!这也是我认为软件行业是最好的行业的原因。如果它是已经被推出过的软件,别再读本文了,快去买它,使用它,定制它,你应该为其他人已经历过编写V1.0的痛苦而感到欣慰。如果你认为还有些东西没有包含在那软件里面,那么你仍处于创新的阶段,你仍然在攀登珠穆朗玛峰,因为你想到了别人没有想到应该编入软件的东西,这是很了不起的。你将一直创新!
V1.0意味着反复尝试
不管是什么软件开发商或公司到你的办公室说,“如果我们用AGILE/CMMI,我们就可以准时推出你需要的软件”,不要相信他们!虽然这些话在某种意义上是有道理的,但这与你在签那些从来没有人从头读到尾的琐碎文件前同意以某一价格买车是类似的。
问题是虽然所有的理论是伟大的,但无法确定软件准备完毕的日期。爱迪生能确定发明灯泡的日期吗?怀特兄弟能确定制造第一架飞机的日期吗?我可能有一点夸张,但我希望你能理解我的要点。我的要点是什么?
不可能确定V1.0的推出日期。
我不在乎你做了多少前期分析,如特征驱动开发等,你就是无法确定V1.0的推出日期。为什么?因为在最后一天,谁也不知道V1.0是什么,应该是什么。
V1.0是能如用户的期望那样运行的软件。
以你遵循AGILE为例,你每周都向用户推出新版本,没有出什么差错,少有反复,并且一直在构建最后的版本。你已经找到了每个特征,每个使用案例,每个参与者等等。你是正确的吗?错了。为什么?想想你的信息是从哪来的。是从用户那收集到的。你的用户界面团队和商业分析员通过用户的反馈总结信息,并决定如何把这些信息提供给软件编写者和开发商。
当软件开始开发以及新版本推出时,用户开始意识到其存在的问题。项目的股东会觉得,“这很可怕,并不是我们想要的”,于是开始去做一些改变,给你制定了项目的时间表。你肯定可以告诉用户,你会把他们需要的特征放在V1.1或V1.5或其他版本里,但事实是,如果用户所需的特征被遗漏,如果软件并不如你想的那样运行,你真的推出了能如用户所期望的那样运行的V1吗?用户会感到激动吗?应该不会。
总之,编写V1就像是在做梦,是创造前所未有的东西,是乐趣、创新与过程,是为自我设定目标,然后努力超越目标。不幸的是,在现实生活中,有时你可以在预定日期达到目标,有时却晚了,有时你也可以提前。即使你制定了最好的规划,你也不能控制那些独立变量,这是为什么生活如此令人激动的原因,也是为什么编写软件令人兴奋的原因。
----------以下是译者的话-----------
英文不行,译得不太好,只有大概的意思。
除了原作者所说了,还有一个重要的影响V1.0发布的原因就是软件的周边工作,一个团队为第一次为一个软件产品准备各种文字说明、各种用户手册、印刷品、在线演示、制作安装包等周边工作时会因为没有经验和样本而花费很长的时间。
我们的产品ZCMS在2007年的时候就已经具备了大部分功能了,界面也和现在没有太大的差别,但反反复复地修改,易用性、稳定性、性能上不段地改进,但直到09年才提供网上下载,建立演示站,过程坎坷远超出我们的预计。欢迎大家访问http://demo.zving.com。
分享到:
- 2009-06-01 15:34
- 浏览 1627
- 评论(2)
- 论坛回复 / 浏览 (2 / 1677)
- 查看更多
相关推荐
.NET Framework是微软开发的一个软件框架,它为开发者提供了一个用于构建、部署和运行应用程序的统一平台。自2002年发布.NET Framework 1.0以来,它已经经历了多个版本的迭代,包括1.1、2.0、3.0、3.5、4.0、4.5、...
- **代码分发困难**:项目间的代码复用需要手动拷贝和更新,效率低且易出错。 - **构建耗时**:大型项目构建时间长,严重影响开发效率。 #### 三、Maven的核心概念 ##### 1. 项目对象模型(Project Object Model, ...
version requirements listed above. In particular, note that some Linux distributions may include JDK 1.4 or Gnu Compiler for Java, both of which are not supported for Android development--------------...
版本号如Version 1.0和Version 1.1表明文档经历了更新和改进。 2. **提交与评审日期**:2017/3/28是两个项目需求规格说明书的提交日期,而评审日期分别为2017/3/29,这显示了一个有序的开发流程,其中包含了文档的...
2、 开发困难,各个团队开发最后都要整合一起 3、 系统的扩展性差 4、不能灵活的进行分布式部署。 2.3.2. 分布式系统架构 分布式架构: 把系统按照模块拆分成多个子系统。 优点: 1、把模块拆分,使用...
3. **eNavguide Programmer's Guide 1.0.pdf**:eNavguide可能是一个特定的应用程序或框架的指南,用于导航或相关电子设备的开发。 4. **Personal JWorks Programmer's Guide 3.0.pdf**:JWorks可能是一个在VxWorks...
xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> ``` - **log4...
在现代软件开发中,自动化测试已经成为确保代码质量与效率的关键环节。其中,Robot Framework作为一个强大而灵活的通用自动化测试框架,被广泛应用。而在处理Excel数据时,Robot Framework提供了专门的ExcelLibrary...
<version>1.0-SNAPSHOT</version> <!-- 导入依赖 --> <groupId>mysql <artifactId>mysql-connector-java <version>5.1.49</version> <groupId>org.mybatis <artifactId>mybatis <version>3.5.7</...
在ActionScript 3.0(AS3)中,与老版本的SWF文件(如SWF版本1.0或2.0)进行交互时,可能会遇到兼容性问题。由于每个SWF版本都引入了新的特性和功能,低版本的SWF在高版本的Flash Player环境中可能无法正常工作或...
<version>1.0-SNAPSHOT</version> <groupId>junit <artifactId>junit <version>4.12</version> ``` 2. **约定的目录结构**: Maven规定了一套标准的项目目录结构,便于自动化构建。例如,源代码通常...
<tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>myTags <uri>http://example.com/myTags</uri> <name>greet <tag-class>com.example.GreetingTag</tag-class> ...
传统的做法是手动将其他项目的jar包导入当前项目的库中,这种方法虽然简单直接,但在实际开发过程中会遇到一系列问题,如依赖更新困难、协同开发不便等。Maven作为一种自动化的构建工具,极大地简化了这一过程,它...
如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资,是开发人员经常需要面对的问题。 于是就出现了Java混淆编译器,它的作用是打乱class文件中的符号信息,从而使反向工程变得...
在Java Web开发中,Struts2和Spring框架的整合提供了强大的功能,使应用程序的控制层和业务层可以无缝协作。然而,随着项目的发展,配置文件的管理变得日益复杂,特别是当所有的配置都集中在一个文件中时,如`...
xml version="1.0" encoding="UTF-8"?> ``` 2. **重启Eclipse**: - 关闭并重新启动Eclipse IDE,这有助于清除任何可能的缓存或临时状态问题,从而确保IDE能正确读取和处理更新后的项目配置。 3. **...
- 由于混淆可能会导致调试困难,所以在开发阶段通常不启用混淆。 通过以上步骤,你就可以在IDEA中使用Maven成功地进行混淆打包了。这个过程不仅可以保护代码,还可以减小jar文件的体积,提高运行效率。记住,混淆...
xml version="1.0"?> <!-- ... --> <!-- ... --> <comment>Hurry, my lawn is going wild! <!-- ... --> ``` 在这个实例中,`purchaseOrder` 元素是一个复合类型,包含了多个子元素如 `shipTo`、...
如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资,是开发人员经常需要面对的问题。 于是就出现了Java混淆编译器,它的作用是打乱class文件中的符号信息,从而使反向工程变得...