现代软件工程系列 学生读后感 梦断代码 软件难做

http://cid-064ec84e17924332.spaces.live.com/blog/cns!64EC84E17924332!173.entry
December 06

读《梦断代码》

读《梦断代码》的感想

《梦断代码》详细叙述了OSAF的Chandler项目从2001年开创以来直至2005年间的进展状况,真实展示了Chandler项目的艰难的开发过程,通过Chandler项目中遇到的各种问题展现了现代软件开发中的种种困难,最终归结到一句话就是“软件难做”。

在软件项目开发的历史上,失败的例子比比皆是。作者Scott Rosenberg作为媒体工作者,见证了软件世界中无数个悲惨的故事——“无论是跨国公司、政府机构,还是军工大鳄,都曾一头撞上过代码的冰山。”其中比如FBI投资4亿美元,花费10年时间,开展的名为Trilogy的计算机现代化项目,当进行到耗资1亿7千万美元的第三个模块时,撞上了冰山,1亿7千万美元也就此打了水漂。美国国内税务局(IRS)是另一个活生生的例子。IRS在过去40年里,曾3次尝试改造计算机系统,但至今仍一事无成。再如联邦航空管理局(FAA)的先进自动系统(AAS)项目,从1981年启动到1994年宣告终止,花费了几十亿美元,结果颗粒无收。麦当劳的"Innocvate"项目耗资1亿7千万美金,也以失败告终。福特公司耗资数亿美金的"Everest"采购系统,也成了一个历时5年的黑洞。1995年一家名为斯坦迪矢的咨询公司做过一个关于软件项目失败的研究报告,发现只有16%的项目获得成功,其余的项目中,31%被削减或被完全取消,剩下的53%预算超支、延误或者不能交付计划中的全部功能特性。

软件为什么如此难做?如果没有亲身经历过真正的软件项目开发,也许很难回答这个问题。作为Chandler项目的记者,Scott Rosenberg亲历了该项目开发过程中的各个环节,真切地感受到了软件开发的种种困难。

如果以软件开发的流程为线索,第一个要解决的问题是“要做什么”的问题,也就是项目的目标。项目的目标要明确,并且可能实现。如果项目的目标过高,也许根本不可能实现。Mitch Kapor很清楚自己想要的软件是什么样的,他对Chandler项目也有着很高的目标——管理各种个人信息,灵活的输入方式,动态的数据组织方式,P2P网上共享数据模式等等。

在确定了这样一些目标之后,项目的总设计者就需要定下一些基础框架性的实施方案,比如实现的语言,构造GUI的工具集,存储各种数据的数据库等等。对于一个大项目,做出这样一些决定往往是很难的。因为一些决定一旦做出,其影响就会作用到工程的整个开发过程中。比如确定用何种语言来实现,各种语言都有自己不同的优点和局限,如果定下一种语言,其局限性就将作用于整个工程。因此,项目的架构师需要对整个项目有一个全局的把握,并且熟悉已有的各种语言和技术的功能特点,这样才能合理地根据项目的目标做出正确的决定。

Chandler项目的设计者们就面临这样的一些重大的抉择。他们最终确定用Python作为项目的编程语言,因为虽然Python是一种解释执行的语言,但它能极大地节省程序员的编程时间,并且它在跨平台方面具有天生的优越性,还有其他各种优点:比如开源、有大量的工具可以使用等等。另一个重要问题是用何种GUI构造工具集。OSAF的设计者们考虑了各种可能的选择,最后一个叫做wxWidgets的构造器脱颖而出。然而,在确定存储各种数据的数据库的原型时,Chandler项目的设计者们遇到了麻烦。为此,他们开了无数的会议,提出了无数种数据库的实现方案,但总是不能满足所有的需求。Chandler项目就在这个十字路口上徘徊不前,举步维艰。最后,为了能按时发布一个可用的版本,程序员们临时确定了一个数据库的方案,并在此不稳定的基础上开始编程,并发布了Chandler0.1版。直到一个叫做Andi Vajda的“牛仔程序员”加入这个项目后,正式的数据库原型才逐渐确定下来,整个项目的基础才得以夯实。可见,在一个大项目中做出这样一些基础性的重大的决定有多困难。

软件开发中最重要的一个方面是组织和管理。如何让程序员们高效地协作,为最后的项目目标共同努力,是一个值得研究的问题。当以合理的方式组织时,一个团队可能发挥最高的效能,达到的效果是1加1大于等于2。然在相反的情况下,一个团队发挥的效能很低,这时1加1小于2。在极限情况下,整个项目只有一个程序员,该程序员掌握整个工程的所有信息和知识,虽然该程序员免去了与他人交流协调的额外时间,但由于只有一个人,开发时间将会相当长。如果有多个程序员,看似可以并行地开发,但实际上在软件项目中,很多工作并不是可以充分并行化的,这使得一个人的工作必须以另外若干个人的工作为基础,并且由于单个人对整个工程可能不具有完整的信息,工程进行时各个人间还要不断地协调。合理地划分并分配任务,并使每个程序员间可以高效地共享项目信息,是提高团队运行效率的重要途径。

Chandler项目有着比较明确的分工,比如约翰·安德森是架构师,麦卡斯科等人负责数据库等。在共享信息和记录项目的状态方面,他们最初采用了邮件列表、blog,和wiki等多种方式。wiki在格式上的随意性给信息的查找带来了相当大的不便。另一方面,由于有些开发者在wiki页上贴便签,有些向邮件列表发信息,另一些在blog上贴进度。不同的信息共享方式导致整个项目的状态无处可寻。后来,他们又用Bugzilla来统一管理工作,但支持者很少。最后,摩根·萨奇为团队开发了一套状态管理器,才使得项目可以统一正式地管理。

Chandler项目聚集了顶尖的程序员,但耗时多年,最后不了了之,Kapor也在他的blog上承认了失败。原因是多方面的。我想第一个原因可能是Chandler的目标太高了。他们想做一个几乎是万能的信息管理器,前无古人后无来者,这个目标实在太难达到了。另外一方面,在某些基础性的重大决策方面,他们也许做出了错误的决定。比如用wxWidget作为构造GUI的工具集,这导致了他们在GUI上很多bug,比如窗体闪烁问题。在组织和管理方式方面,他们采用的方式是大教堂模式与集市模式的混合模式,一方面想利用开源软件开发中的依靠程序员的热情进行自发的开发,另一方面又制定了详细的工作进度,并有明确的分工,但也许这并没有真正集成两者的优点,并没有真正地提高效率。

总之,我们可以从Chandler项目学习到诸多经验,总结许多教训。虽然“软件难做”,但通过科学的开发方法,应该可以有效地降低软件开发的复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代软件工程系列 结对编程 (II) 电梯调度程序

[很多同学完成了上一个结对编程项目后, 很想知道下一个项目是什么, 我们这次要练习如何设计 接口, 测试框架, 和算法] 现代软件工程系列 结对编程 (II) 电梯调度程序 ------- Pair Project II Elevator Scheduler Design and implement an Elevator Scheduler to aim for …

java 中violate_Java中的Volatile关键字

Java的volatile关键字用于标记一个Java变量为“在主存中存储”。更确切的说,对volatile变量的读取会从计算机的主存中读取,而不是从CPU缓存中读取,对volatile变量的写入会写入到主存中,而不只是写入到CPU缓存。实际上,…

现代软件工程系列 创新靠学分

如何在学校里讲创新, 这是一个老问题。 但是天朝的教育体制总有办法,请看: http://news.163.com/10/1125/03/6MABIS4H00014AED.html 武汉一高校设"创新学分" 不搞创新不能毕业 去年秋季,武汉科技大学中南分校出台《学籍管理规定》,…

java 如何发提示_消息提醒-如何实现收到待办给QQ发送提醒?

一、前期准备一台windows服务器(用于运行QQ机器人)下载QQ机器人框架二、QQ机器人配置1、解压前面下载的机器人框架和httpapi2、打开解压后的 小栗子框架.exe3、在用户列表右击选择添加单个4、添加后右击点添加后的账号选择登录选中QQ5、点击应用中心>点击导入插件>选中前…

顶级程序员的心得 - Coders at Work

这篇博客经历了 CSDN 的历次改版后,格式已经坏了, 我重新写了一篇,重排了格式: 顶级程序员的心得 –– Coders at Work_SoftwareTeacher的专栏-CSDN博客顶级程序员的心得 –– Coders at Work我2009年读了 “Coders at Work”, …

jdbc mysql myeclipse_关于JDBC连接MySQL的问题,我一直解决不了(Myeclipse 环境下)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package org.mlj.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;import java.net.UnknownHostException;import java.net.InetAddress.*; public class…

现代软件工程课件 需求分析 如何提出靠谱的项目建议 NABCD

《构建之法 - 现代软件工程》课件 互联网时代对于创新者来说, 既是一个伟大的时代, 又是一个糟糕的时代。 你有很多机会做出影响世界的产品, 但是, 似乎任何想法都被别人想到过了, 做出来了, 上市了, 移植到各种平台上去了… 那么我们后来人除了羡慕别人生得早, 还有什么机…

java禁止数据库写入事务_Java -- JDBC 事务处理, 事务的隔离级别 脏读 不可重复读 等......

1. 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。数据库开启事务命令•start transaction开启事务•Rollback回滚事务•Commit提交事务JDBC控制事务语句•Connection.setAutoCommit(false); //start transa…

现代软件工程 教学计划 适应两种难度和重点

现代软件工程 教学计划 经过 2007 - 2018 年,30个不同学校的实践后, 《构建之法》在大学的两种教法已经出现了, 这两种教学计划适应于两种难度和重点。 下面我们具体介绍这两种计划。 1. 软件工程导论(适合大一下的学生,在学过…

java中setDocument_Java ActionItem.setDocumentId方法代码示例

import org.kuali.rice.kew.actionitem.ActionItem; //导入方法依赖的package包/类Test public void testConvertActionItem() throws Exception {// get test dataString testWorkgroupName "TestWorkgroup";Group testWorkgroup KimApiServiceLocator.getGroupSe…

敏捷软件开发宣言–Manifesto for Agile Software Development

敏捷开发, 谁不会呀, 不就是 没文档, 出活快, 用户说啥都能改? 下面是一个笑话, 王屋村的大牛说 - 我最近转手接了一个活, 完事能挣四五万, 我拿过图纸一看, 不就是盖一烟囱吗? 我们是敏捷 (Agile) 的团队,要文档作甚? 马上开始干活! 都快盖好了&am…

敏捷软件开发 12 原则

作为 <现代软件工程> 的一个作业, 我要求同学们把 英文的敏捷开发原则 翻译成中文并解释。 大部分同学都提供了持续重构, 不断提高的版本。 技术翻译专家余晟老师也对其中较难翻译的三条原则提了很好的建议。 下面是我的尝试, 翻译要做到 信, 达, 雅, 很难, 而且中国的…

教师管理系统设计报告java_教师办公管理系统的设计与实现

随着计算机及网络技术的飞速发展&#xff0c;Internet/Intranet应用在全球范围内日益普及&#xff0c;当今社会正快速向信息化社会前进&#xff0c;信息自动化的作用也越来越大。从而使我们从繁杂的事务中解放出来&#xff0c;提高了我们的工作效率。教师办公管理系统是一个教育…

同学, 你的板砖呢?

这次 <现代软件工程> 的4 个团队要做下面的项目, 唯一的要求是 - 做真实的项目: 第一组: 一个BBS 的通用客户端 第二组: 挖掘学术圈内的师承关系 第三组: 真人拳皇 - 把你老板的照片变成对手, 然后给他一顿痛打 第四组: 一个叫呆呆的东东。 他们缺什么呢? 缺一些…

设置java环境变量生效 centos_解决CentOS java环境不生效的问题

查看当前java版本[rootlocalhost jdk1.6.0_45]# java -versionopenjdk version "1.8.0_65"OpenJDK Runtime Environment (build 1.8.0_65-b17)OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)发现默认的还是系统自带的1.8&#xff0c;不是配置的1.6。[rootl…

顶级程序员的心得–Coders at Work

最新版本在这里&#xff1a; (2584条消息) 顶级程序员的心得 –– Coders at Work_SoftwareTeacher的专栏-CSDN博客https://blog.csdn.net/SoftwareTeacher/article/details/113489014

JAVA中vector是否存在数据_如何找出std :: vector中是否存在项目?

我要做的就是检查向量中是否存在某个元素&#xff0c;因此我可以处理每种情况。if ( item_present )do_this();elsedo_that();#1楼您可以尝试以下代码&#xff1a;#include #include // You can use class, struct or primitive data type for Itemstruct Item {//Some fields}…

scrum–yesterday once more

在敏捷开发的 SCRUM 流程中, 一个基本要求就是团队中的成员在每日例会中介绍自己昨天的进度, 今天的计划, 和遇到的困难。 下面是《现代软件工程》课程上一个学生团队在2/18 和 2/19 这两天的报告。 粗粗看去, 不禁有 “昨日重来” 的感觉。 一些同学的任务在2/18 报告的 yest…

软件工程 之 画扇面

软件工程的历史虽然说只有短短的四十多年时间 &#xff08;1968 年提出&#xff09;&#xff0c; 但是软件工程的主体 – 人类 – 已经出现在世界上好些年了。 人还是那些人&#xff0c;事儿还是那些事儿, 好的&#xff0c;坏的&#xff0c;可笑的模式同样会出现。 我看到同学们…

java 类加载生命周期_Java类的加载与生命周期

一、概要&#xff1a;类的生命周期从类的 加载、连接、初始化 开始&#xff0c;到类的 卸载结束&#xff1b;二、几个阶段&#xff1a;加载&#xff1a;查找并加载类的二进制数据。(把类的.class文件的二进制数据读入内存&#xff0c;存放在运行时数据区的方法区&#xff1b;类…