小李程式

加入Java阵营
posts - 1, comments - 0, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java入门指南[好文转载]

Posted on 2006-06-12 09:51 小李程式 阅读(629) 评论(0)  编辑  收藏 所属分类: 好文转载

 很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔”。但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!

要想学好Java,首先要知道Java的大致分类。我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。J2SE开发桌面应用软件比起VC,VB,DELPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。所以现在应用最广泛又最好学的就是J2EE了。J2EE又包括许多组件,如JSP,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。

那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。然后你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?还好,SUN提供了Javabean可以把你的JSP中的Java代码封装起来,便于调用也便于重用。接着就是EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看JavaMail了。

好了,对Java和J2EE有了一些基本概念之后,你就应该编一些程序了,千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看,这样看到好的程序就可以直接Ctrl+C再Ctrl+V,也不用劳您老大架再亲自把它 再输一遍吧,再说直接复制还不用怕出错,何乐而不为呢!还有就是要经常上一些好的Java编程文章,有好的文章要Cut下来,有问题尽管问,只要问题不是太傻,一般高手都会回答你的。下面介绍几个好的Java方面的编程网站:
CSDN论坛 http://www.csdn.net/ 中国最有名的技术论坛,《程序员》杂志就是他们出版的,你可以在上面提出问题,马上就有人回答你,如果你觉得好,你可以给那人加分;
Java研究组织 http://www.javaresearch.org/ 上面有很多原创文章,高手还是挺多的;
Java开发者 http://www.chinajavaworld.com/ 那里Java资料比较全;
java.com.cn http://www.java.com.cn/ 看这域名就知道有多牛,注册用户快接近一万了,同时在线人数也在一千左右,人气很旺的;
IBM的开发者网络 http://www-900.ibm.com/developerWorks/cn/java/index.shtml IBM永远的蓝色巨人;

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。所以你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他还愿意不厌其烦地教你,这样好象有点难哦!

还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。学Java必读的两个开源程序就是Jive和Pet Store。

Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 http://www.jdon.com/ 去下载,或到同济技术论坛的服务器上 ftp://nro.shtdu.edu.cn 去下,安装上有什么问题,可以到论坛上去提问。

Pet Store(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要错过了。

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/ ,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)吧,现在很流行的Struts就是它的一种实现方式,不过Struts用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重整)和极限XP编程,相信你又会上一个台阶。

做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧,你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的来了。。。。。。

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
下面介绍两个好的开源项目网站:
湖北省软件公共开发平台 http://gro.clinux.org/
共创联盟 http://cosoft.org.cn/

哇,好高兴哦,我终于成为高手了!非也,非也。古人云:“识时务者为俊杰”。你知道计算机界现在的发展形势吗?你知道微软的.NET蓝图和SUN ONE计划之间的明争暗斗吗?你知道计算机技术将向何处发展吗?其实从各大计算机厂商最近的动作,都可以看出来“Web服务将是下一代互联网应用的制高点”,而微软的.NET蓝图和SUN ONE计划的斗争焦点,也就是Web服务。Web服务就是一个崭新的分布式计算模型,它是一系列标准的综合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同语言编写的软件能够轻易的集成起来,使网络资源和Web站点变成一种服务而不是混乱的垃圾场。不远的将来,我们就可以在家里点击一下鼠标,就可以完成出门旅游的全部准备工作,包括定飞机票,定旅游线路,定好房间等。请注意,这所有的一切都是Web站点间自动完成的,再也不用象现在一样,表面上是电子商务,实际上很多环节都是人工操作。也许你会觉得这是天方夜谈,不过就近的说,你也很有可能承接一个项目,要集成两个企业的ERP系统。很有可能上游企业的系统是用Delphi编的,而下游企业的系统是用Java编的。你说你是Java高手,大家都看者你怎么做呢。所以啊,你还得学习新技术,如Web服务,而且你Delphi也要懂一点吧(Delphi6现在已经提供Web服务的控件了)。 你编的Java系统,可能要和.NET集成,所以你.NET要懂一点吧?到最后,你可能发现你已经成为Java高手了,但很多时间却在搞别的技术。太极张三丰里说,最厉害的招式就是没有招式,可能就是这个道理吧!

因为刚刚兴起,所以网上Web服务的资料不是很多,我还是给大家推荐几个网站吧:
中国UDDI技术联盟 http://www.uddi-china.org/
CSDN的柴晓路专栏 http://www.csdn.net/develop/author/ColumnAuthor/fennivel/ (注:柴晓路也是互联网上一个有名的人物,他发表过很多关于Web服务的文章,还出了一书,应该称的上是中国Web服务技术的先行者)
IBM的开发者网络的XML&Web Service专栏: http://www-900.ibm.com/developerWorks/cn/xml/index.shtml?csdn IBM可是Web服务的力推者

呜…你费劲千心万苦,总算成为Java高手了,怎叫人不由喜极而泣呢!是啊,真不容易,真不简单,真叫人感动啊!那么打个电话告诉我吧,什么?我的电话号码是多少?昏到,你打电话问不就知道了吗,真是的……
why edited on 2004-11-13 19:52


初学Java的朋友,建议您看一看
--------------------------------------------------------------------------------

初学Java的朋友,建议您看一看
Java总有它的千般好处使你选择它,但这些随便翻翻书或在网上逛一圈就能找到答案。在本文中,笔者把自己学习Java的一些切身体会和过程写出来,供初学者做个参考。

我在学习Java的过程中主要围绕以下几个方面来学习:

1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java。

2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。

3.在学习的过程中一定要动手做、写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己,最好能参与一些实际的项目。

4.在学到一定阶段后,你开始希望用学过的东西做些什么。这时的你应该开始学习一些更多、更复杂的知识,比如J2EE平台的构建、EJB的开发等。对于这一部分,我建议最好找一本较薄的书先了解一个大概,心里有个总体的认识,对更多的技术术语做个初步掌握。我认为这个阶段看看《J2EE技术实践》很不错,它可以让你了解J2EE包含的各种技术和框架,同时提供很多实际的例子来加深对J2EE的整体了解。

学习Java的兴趣和决心起了很关键的作用。在有了上述基础后,我便开始一步一步地学习Java。

Java环境的搭建

要运行Java程序,必须安装JDK。JDK是整个Java的核心,其中包括了Java编译器、JVM、大量的Java工具以及Java基础API。

可以从http://Java.sun.com下载JDK,有1.4版本和1.31版本。我的学习环境中首先,采用的是1.31版本。

解压安装。然后,进行环境设置。

1.对于Windows平台要进行以下设置:

set PATH=YOUR_INSTALL_ DIR\bin; C:\Windows;C:\Windows\Command
set classpath=. YOUR_INSTALL_DIR\lib\tools.jar

2.对于Linux平台要编辑/etc/profile文件:

JAVA_HOME=your_install_dir/JDK/j2sdk
CLASSPATH=$JAVA_HOME/lib/tools.jar JAVA_HOME/lib/td.jar JAVA_HOME/jr
-e/lib/rt.jar:.
PATH=$PATH JAVA_HOME/bin
export PATH PS1 USER LOGNAME MAIL HOSTNAME HISTSIZE HISTFILESIZE
INPUTRC JAVA_HOME CLASSPATH RESIN_HOME

最后,在终端上输入Java看能不能找到这个命令,如果能找到安装就成功了。

下面介绍一下JDK的几个重要的命令:

◆Java执行工具,是启动JVM(虚拟机)并执行class(BYTE CODE)文件的命令;

◆javac 编译器,由.java文件生成.class文件;

◆jar Java压缩打包工具;

◆Javadoc 文档生成器。

最后就是JDK document.tion,这是JDK的联机帮助文档,是最有用和最重要的学习参考文档,应该多看。

开始写自己的代码

现在环境有了,应该写个简单的代码进行测试了。还是从经典的“hello word”开始。

1. 先用编辑器写一代码(我用的是Linux的vi):

[stone@coremsg work]$ vi Hello.Java
public class Hello{
public static void main(String []argc){
System.out.println("Hello Word!");
}
}

2. 编译:

[stone@coremsg work]$ Javac Hello.Java

3. 执行:

[stone@coremsg work]$ Java Hello
Hello Word!

成功了!这就是我的第一个Java程序。从那时起我知道已开始走进Java的世界,接下来就靠自己的努力了。在这个过程中,笔者认为有几点需要注意。

学习一门新的语言,参考书是离不开的。我的建议是开始最好找一本篇幅较短的入门书来学习那些最简单、最基本的东西,包括学习Java语法等。同时,对一个最简单的程序也应该多去调试,多想想如果改动一下会出现什么结果?为什么必须那样写?多去想想这些问题然后去操作,会让你有更多的收获。这样反复地思考是很有用的。此外,在这一阶段还应该多看JDK的联机帮助,尽量多地掌握JDK提供的Java基本类库API。

在有一定基础、能够写一些简单的程序后,可以开始看《Thinking in Java》这本书。它比较完整地介绍了Java的语法、面向对象的特性、核心类库等。通过这一层次的学习能够加深对Java的理解和底层原理的运用,同时又可以完整地了解Java的整个体系。在这一阶段,应该重点学习Java的面向对象编程语言的特性,比如继承、构造器、抽象类、接口、方法的多态、重载、覆盖、Java的异常处理机制等,要对上述概念有非常清楚的了解。这样做的目的,是要让自己把这些技术应用到实践中进行合理的程序设计(比如,你会考虑一个类是用抽象还是接口来设计等)。这就要求必须在大量的实践中去应用和学习。这也是当初很多朋友给我的建议。

学习更多

如果要用Java来完成各种功能更强大的任务,那么就要学习语言以外的更多的东西。

1.Java Web编程

对于Java Web 编程来说,应该而且必须熟悉和掌握HTTP协议,可以参考 Stevens的《TCP/IP 详解》第三卷。Java Servlet技术提供了生成动态Web页面内容的能力,这在你的Java项目中是最基本的功能之一,所以必须学习。通过这一阶段的学习应该掌握Servlet/JSP的Web编程。

2. J2EE的学习

J2EE包含的技术太多了。如果你想坐在桌子旁边抱着一大堆书来学习的话,效果不大的。我建议在开始这一阶段的学习的时候,可以按以下步骤来做,总的思想是“总体把握,各个击破”。

◆ 了解J2EE中的技术术语的含义。

我的感觉是J2EE标准中涉及到的各种技术很多,如果一开始就一个一个去学习的话是不现实的,也是没效果的。我的建议是,先对其中的技术有个大概的了解,比如EJB、JavaIDL、JTA等。可能你不知道怎么去写一个EJB,但是要知道什么是EJB、它能做什么,当有了这样的概念后,再去有目的地学习它就会快很多。我还要再重复一句??必须要在实践中动手去做才行。

◆ 了解J2EE中的设计模式,这样能帮助你对J2EE做个整体把握。

MVC开发模式被证明是有效的处理方法之一。它可以分离数据访问和数据表现。你可以开发一个有伸缩性的、便于扩展的控制器,来维护整个流程。通过这一层次的学习,当你面对一个项目的时候,应该首先把握它的总体架构的设计,以及决定采用J2EE标准中的哪些技术。

◆ 了解一些J2EE平台的典型案列,加深对这一技术的概念和理解。

平时可以多留意这方面,熟悉一些典型案例,分析它为什么要采用那个时间?那样做能达到什么样的目的?然后联系到自己身边的项目是否可以作为参考。

◆ 学习J2EE下的各种技术。

在有了前几阶段的学习后,可以自己搭建一个J2EE平台开始具体学习每一种技术。你可以参与公司相关项目进行学习,也可以自己搭建一个平台进行学习。这时候应该找点相关的书来一步一步学习,没有捷径可走。如果你不满足于这些,那么还应该更深入地学习UML、设计模式等方面的东西

更多资源:
参与论坛讨论: http://www.java-cn.com/forum/index.jsp
更多技术文章: http://www.java-cn.com/technology/index.jsp



JUnit介绍

一、JUnit简介
JUnit是基于面向对象构建的java单元测试框架。
JUnit是开放源代码项目,可按需要进行扩展。

二、安装JUnit
首先获取JUnit的软件包,从http://www.junit.org下载最新的软件包。
将软件包在适当的目录下解包。
这样在安装目录下找到一个名为junit.jar的文件,将这个jar文件加入

CLASSPATH系统变量。

三、JUnit框架介绍:
一)TestCase--测试用例,对每个测试类,都要定义一个测试用例。
JUnit支持两种运行单个测试的方法:静态的和动态的方法。
1、静态的方法就是覆盖TestCase类的runTest()方法,一般是采用内部类的方式

创建一个测试实例:
TestCase test01 = new testCar("test getWheels") {
public void runTest() {
testGetWheels();
}
}
采用静态的方法要注意要给每个测试一个名字,这样你就可以区分哪个测试失败

了。

2、动态的方法是用内省来实现runTest()以创建一个测试实例。这要求测试的名

字就是需要调用的测试方法的名字:
TestCase test01 = new testCar("testGetWheels");
JUnit会动态查找并调用指定的测试方法。动态的方法很简洁,但如果你键入了错

误的名字就会得到一个令人奇怪的NoSuchMethodException异常。动态的方法和静

态的方法都很好,你可以按照自己的喜好来选择。

二)TestSuite
一旦你创建了一些测试实例,下一步就是要让他们能一起运行。我们必须定义一

个TestSuite。在JUnit中,这就要求你在TestCase类中定义一个静态的suite()方

法。suite()方法就像main()方法一样,JUnit用它来执行测试。在suite()方法中

,你将测试实例加到一个TestSuite对象中,并返回这个TestSuite对象。一个

TestSuite对象可以运行一组测试。
TestSuite和TestCase都实现了Test接口,而Test接口定义了运行测试所需的方法

。这就允许你用TestCase和TestSuite的组合创建一个TestSuite。
public static Test suite() {
TestSuite suite= new TestSuite();
suite.addTest(new testCar("testGetWheels"));
suite.addTest(new testCar("testGetSeats"));
return suite;
}
public static Test suite() {
return new TestSuite(testCar.class);
}

三)TestRunner
有了TestSuite我们就可以运行这些测试了,JUnit提供了三种界面来运行测试
[Text UI] junit.textui.TestRunner
[AWT UI] junit.awtui.TestRunner
[Swing UI] junit.swingui.TestRunner
java junit.textui.TestRunner yourTestclass

Fixture
如果需要在一个或若干个的类执行多个测试,这些类就成为了测试的context。在

JUnit中被称为Fixture。当你编写测试代码时,你会发现你花费了很多时间配置/

初始化相关测试的Fixture。将配置Fixture的代码放入测试类的构造方法中并不

可取,因为我们要求执行多个测试,我并不希望某个测试的结果意外地(如果这

是你要求的,那就另当别论了)影响其他测试的结果。通常若干个测试会使用相

同的Fixture,而每个测试又各有自己需要改变的地方。
为此,JUnit提供了两个方法,定义在TestCase类中。

protected void setUp() throws java.lang.Exception
protected void tearDown() throws java.lang.Exception

覆盖setUp()方法,初始化所有测试的Fixture,如建立数据库连接,将每个测试

略有不同的地方在testXXX()方法中进行配置。
覆盖tearDown(),释放你在setUp()中分配的永久性资源,如数据库连接。
当JUnit执行测试时,它在执行每个testXXXXX()方法前都调用setUp(),而在执行

每个testXXXXX()方法后都调用tearDown()方法,由此保证了测试不会相互影响。

四)Assert
Assert类中定义了相当多的assert方法,主要有assert(),assertEquals(),

assertNull(), assertSame(), assertTrue(), fail()等方法。

Faile失败是一个期望的被assert方法检查到的结果。
Error错误则是意外的问题引起的,如ArrayIndexOutOfBoundsException。

四、测试流程:
1. 扩展TestCase类;
2. 覆盖runTest()方法(可选);
3. 对应测试目标类书写testXXXXX()方法;
4、扩展TestSuite类,重载suite()方法,实现自定义的测试过程;
5. 运行TestRunner进行测试;
zua edited on 2004-12-09 11:56

密码学领域重大发现:山东大学王小云教授成功破解MD5

2004-09-04 09:39

[本站讯]2004年8月17日的美国加州圣巴巴拉,正在召开的国际密码学会议(Crypto’2 004)安排了三场关于hash函数的特别报告。在国际著名密码学家Eli Biham和Antoine Joux相继做了对SHA-1的分析与给出SHA-0的一个碰撞之后,来自山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。在会场上,当她公布了MD系列算法的 破解结果之后,报告被激动的掌声打断。王小云教授的报告轰动了全场,得到了与会专家 的赞叹。报告结束时,与会者长时间热烈鼓掌,部分学者起立鼓掌致敬,这在密码学会议上是少见的盛况。王小云教授的报告缘何引起如此大的反响?因为她的研究成果作为密码学领域的重大发现宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码 学界的轩然大波。会议总结报告这样写道:“我们该怎么办?MD5被重创了;它即将从应用中淘汰。SHA-1仍然活着,但也见到了它的末日。现在就得开始更换SHA-1了。”

关键词:碰撞=漏洞=别人可以伪造和冒用数字签名。

Hash函数与数字签名(数字手印)

HASH函数,又称杂凑函数,是在信息安全领域有广泛和重要应用的密码算法,它有一种类似于指纹的应用。在网络安全协议中,杂凑函数用来处理电子签名,将冗长的签名文件压缩为一段独特的数字信息,像指纹鉴别身份一样保证原来数字签名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的杂凑函数。经过这些算法的处理,原始信息即使只更动一个字母,对应的压缩信息也会变为截然不同的“指纹”,这就保证了经过处理信息的唯一性。为电子商务等提供了数字认证的可能性。

安全的杂凑函数在设计时必须满足两个要求:其一是寻找两个输入得到相同的输出值在计算上是不可行的,这就是我们通常所说的抗碰撞的;其二是找一个输入,能得到给定的输出在计算上是不可行的,即不可从结果推导出它的初始状态。现在使用的重要计算机安全协议,如SSL,PGP都用杂凑函数来进行签名,一旦找到两个文件可以产生相同的压缩值,就可以伪造签名,给网络安全领域带来巨大隐患。

MD5就是这样一个在国内外有着广泛的应用的杂凑函数算法,它曾一度被认为是非常安全的。然而,王小云教授发现,可以很快的找到MD5的“碰撞”,就是两个文件可以产生相同的“指纹”。这意味着,当你在网络上使用电子签名签署一份合同后,还可能找到另外一份具有相同签名但内容迥异的合同,这样两份合同的真伪性便无从辨别。王小云教授的研究成果证实了利用MD5算法的碰撞可以严重威胁信息系统安全,这一发现使目前电子签名的法律效力和技术体系受到挑战。因此,业界专家普林斯顿计算机教授Edward Felten等强烈呼吁信息系统的设计者尽快更换签名算法,而且他们强调这是一个需要立即解决的
问题。

石破惊天 MD5堡垒轰然倒塌

一石击起千层浪,MD5的破译引起了密码学界的激烈反响。专家称这是密码学界近年来“ 最具实质性的研究进展”,各个密码学相关网站竞相报导这一惊人突破。

MD5破解专项网站关闭

MD5破解工程权威网站http://www.md5crk.com/ 是为了公开征集专门针对MD5的攻击而设立的,网站于2004年8月17日宣布:“中国研究人员发现了完整MD5算法的碰撞;Wang, Feng, Lai与Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128几个 Hash函数的碰撞。这是近 年来密码学领域最具实质性的研究进展。使用他们的技术,在数个小时内就可以找到MD5 碰撞。……由于这个里程碑式的发现,MD5CRK项目将在随后48小时内结束”。

对此,http://www.readyresponse.org主页专门转载了该报道http://www.aspenleaf.com
/distributed/distrib-recent.html和几个其它网站也进行了报道。

权威网站相继发表评论或者报告这一重大研究成果

经过统计,在论文发布两周之内,已经有近400个网站发布、引用和评论了这一成果。国内的许多新闻网站也以“演算法安全加密功能露出破绽 密码学界一片哗然”为题报道了 这一密码学界的重大事件。(报导见http://www.technewsworld.com/perl/board/mboard .pl?board=lnitalkback&thread=895&id=896&display=1&tview=expanded&mview=flat,该
消息在各新闻网站上多次转载。)

数字认证 你的未来不是梦

由于MD5的破译,引发了关于MD5产品是否还能够使用的大辩论。在麻省理工大学Jeffrey I. Schiller教授主持的个人论坛上,许多密码学家在标题为“Bad day at the hash function factory”的辩论中发表了具有价值的意见(http://jis.mit.edu/pipermail/saag/2004q3/000913.html)。这次国际密码学会议的总主席Jimes Hughes发表评论说“我相信这(破解MD5)是真的,并且如果碰撞存在,HMAC也就不再是安全的了,…… 我认为我们应该抛开MD5了。” Hughes建议,程序设计人员最好开始舍弃MD5。他说:“既然现在这种算法的弱点已暴露出来,在有效的攻击发动之前,现在是撤离的时机。”

同样,在普林斯顿大学教授EdwardsFelton的个人网站(http://www.freedom-to-tinker.com/archives/000664.html)上,也有类似的评论。他说:“留给我们的是什么呢?MD5已经受了重伤;它的应用就要淘汰。SHA-1仍然活着,但也不会很长,必须立即更换SHA-1,但是选用什么样的算法,这需要
在密码研究人员达到共识。”

密码学家Markku-Juhani称“这是HASH函数分析领域激动人心的时刻。(http://www.tcs.hut.fi/~mjos/md5/)”

而著名计算机公司SUN的LINUIX专家Val Henson则说:“以前我们说"SHA-1可以放心用,其他的不是不安全就是未知", 现在我们只能这么总结了:"SHA-1不安全,其他的都完了"。

针对王小云教授等破译的以MD5为代表的Hash函数算法的报告,美国国家技术与标准局(NIST)于2004年8月24日发表专门评论,评论的主要内容为:“在最近的国际密码学会议(Crypto 2004)上,研究人员宣布他们发现了破解数种HASH算法的方法,其中包括MD4,MD5,HAVA L-128,RIPEMD还有
SHA-0。分析表明,于1994年替代SHA-0成为联邦信息处理标准的SHA-1的减弱条件的变种 算法能够被破解;但完整的SHA-1并没有被破解,也没有找到SHA-1的碰撞。研究结果说明SHA-1的安全性暂时没有问题,但随着技术的发展,技术与标准局计划在2010年之前逐步淘汰SHA-1,换用其他更长更安全的算法(如SHA-224、SHA-256、SHA-384和SHA-512)来替代。”

详细评论见:http://csrc.nist.gov/hash_standards_comments.pdf

2004年8月28日,十届全国人大常委会第十一次会议表决通过了电子签名法。这部法律规定,可靠的电子签名与手写签名或者盖章具有同等的法律效力。电子签名法的通过,标志 着我国首部“真正意义上的信息化法律”已正式诞生,将于2005年4月1日起施行。专家认为,这部法律将对我国电子商务、电子政务的发展起到极其重要的促进作用。王小云教授的发现无异于发现了信息化天空的一个惊人黑洞。我们期待着王小云教授和她的团队能够成就“女娲补天”的壮举,为人类的信息化之路保驾护航。

近几天看到了关于开源的热烈讨论,笔者认为这样的话题可以再深入讨论,故在此不揣冒昧再撰一文。

一、重要性:

1、讨论之火爆,说明现下国内业界人士已对开源有了颇多的接触和认识。这是很好的事情,如果关于开源的概念和讨论有朝一日能够在业外流行开来(如同手机、汽车和D版),那相信国内的软件业将会呈现一次爆炸性的增长,这无疑是业界同道们的福祉。

2、这其实是关系到整个产业链的根本性关键问题,如果认为不值一提的话,就只能说是闭目塞听了。简单举例说明吧:作为国家信息产业的决策者,是重点自主发展开源体系的软件,还是与主流产商(主要是MS)合作?作为各软件公司的经营者,是采用开源体系软件进行开发,还是采用商用软件?作为每一位程序员,在这混乱无比的时代,是主要学习研究开源体系(现在主要是Linux和Java),还是学习研究商用软件(以Windows和.NET为代表)?作为最终用户,是继续沿用D版等待罚单,还是费力学习使用免费产品……。这些,全是都是有关切身利益与方向的大问题。

二、利弊

这样的题目未免太大,笔者只能尽量以所学所用所见的经验再加上部分臆测而论,自然不免以偏概全,姑且作为抛砖引玉之用吧,望各位同道能补充指正。

1、利

(1)基本上是免费的:以国内的GNI Per Capita(人均国民生产总值)而论,商用软件还是很昂贵的。其实就算对于外国人来说,商用软件也很贵,所以Gates等人才能创造商业奇迹,而现下国外开源的风才会刮得那么猛。特别对于程序员来说,如果采用商用体系学习开发的话,机器上的软件价值少说也是以万元计吧。“天下没有免费的午餐”,当国人(包括程序员)多年来已经吃惯了“免费午餐”的时候,突然说“午餐不再免费”了,这样的打击真是够呛!所以,如果你没有足够的资金享用商用软件的话,早一天考虑开源体系或许不至于在突然的打击面前束手无策。(笔者以前一直是用JB的,半年前考虑到版权问题用了eclipse,现在发现免费的eclipse竟然更加强大。)

(2)开放源代码的对于学习研究的意义:对于国内大多数的用户(包括程序员),使用开源主要是可以节省资金,而对于程序员中的高手来说,开放的代码才是至宝,原因在于,开源代码是迅速提高程序员水平的捷径。这世上本无天才,所谓的天才正如牛顿所说是“站在巨人的肩膀上”。这就是大家所熟悉的武侠小说中,为何以年青侠客奇遇资深侠客获取盖世武功作为主线的原因。学习前人的好东西,并在其之上发展,这对于学习研究者来说无疑是一件事半功倍的事情。特别对于系统软件(linux)而言,通过修改源代码,实现安全定制与特殊用途,这真是件很好的事情。

(3)开源对于商业价值:客观地说,开源现在基本上是老外的事情,国内的大多数所谓开源,无非是点很简单的代码,找本书看看就有了,没什么值得保密的。这一方面是技术问题,更重要的是市场问题,国外现在已经形成了一个具有现实意义的开源市场,所以开源已经不是什么无利可图的事情了。a、原作者的高声望与高就业机会:如论坛上《开源还是不开,难道是个问题》一文中BT作者的事例,还有就是Linux之父Linus Torvalds、struts的主设计师Craig McClanahan等等。老外的开源软件,很多是由本身在软件公司、教育科研机构工作的程序员业余合作的成果,人家有兴趣、有精力去与人合作,展示他们的天份与想象,目的,就是其作品能够得到广大同道的认可,能够在与同道的不断交流中获得程序水平的提高与设计艺术的享受。同时,也就获取了更好的工作机会。试想,这帮老大如果只是满足于像我等使用商用IDE做点所谓Application的话,即使是到了MS,相信也不会有什么好前途。b、开源软件公司运用服务盈利:如MySQL、JBoss这样红透半边天的免费软件,给人做做所谓“咨询”,也就是说以低层软件公司为服务对象,或出点什么书籍、资料等等,其收益能低得了吗?c、免费试用的模式:先免费试用,获取认可与市场之后,再转为商用。这方面J2EE界中的Jive和笔者最近用的MyEclipse、JSF Studio等等都是其中的好例子。免费试用,说白了是一种成本低廉的优秀广告,相当于聪明的水果摊贩试尝西瓜之类的手法。所以说,开源最终也是一种商业模式(为避免本文太长,详见本人的《浅析集中与分散软件商业模式》,稍后完成)。

(4)开源是发展中国家的机会与福祉:这大概就不用说了吧。(举个简单的例子:前几天我已经把JB给卸了)。

其它的优点就由各位道友一一说来吧……

2、弊

(1)难于使用:这是客观事实,但诸位道友如果在享受免费的产品时还在以攻击为要务的话,就未免有些不近人情了。这世上本来就很难有比MS的产品更容易使用的东西,更何况还是免费的。笔者以为,国内大凡从事软件业的同道,考虑任何问题都不要忘了D版。可以说,D版是一个摇篮,我们在其中不断成长;而现在,当D版已经开始限制我们成长的时候,是扔掉它还是睡在其中不再长大,这一个问题。可惜,这其实根本就没有选择,正如摇篮一样,D版是不可能长久的。所以,是准备必要的资金以享受“好用”的商业软件,还是费力去学习、使用、发展“难用”的开源软件,这也许才是一个问题。从实际的角度出发,尽力让产品变得easy也正是开源体系应该努力的方向。

(2)学习开源体系的难度高,时间长

Linux与Windows、J2EE与.NET,玩过的人都知道,谁费劲?表面上看来这个问题很容易定论,其实不然。简单地来说,低层的应用,商用软件的效率较高;高层的应用,开源的价值较大。现在论坛上经常有人咒骂开发难度的降低导致收入下降,甚而将矛头对准Open source,这实在是冤枉好人。“水涨船高”本就是自古以来所有行当的必然规律,而现今IT业偏偏又是那种涨得最快的行当。这一点上不得不提一下MS和Internet,可以说,正是MS与Internet的伟大,将PC与软件传遍了全世界,缘于其方便和易于传播;可也正因为如此,PC与软件又如此轻易地淘汰与贬值。再次提醒诸位,现今的IT是个极其危险的行当。因为其中容易的东西(如操作、简单维护开发)渐渐趋于饱和。所以,如果你试图象“泡沫年代”那样轻易地获取高额利润而到这个行业淘金的话,或许应该冷静地思考一下了。现今,发达国家的IT业,基本上是属于高技术选手,国内开始有这个趋势,如果市场体制比较合理之后,相信10年后大体上也就如此。当整个行业成熟之后,仍然会有较高的薪水,也有很多机会,只是难度越来越大。所以,与其抱怨像电子论坛那样半小时搞定的东西下载满天飞,不如去考虑一下那些即使下载来,也需要很长时间才能领会的事物(如spring、ofbiz或.NET的Duwamish)。毕竟,ASP.NET越好用,MS的收益越高,您的¥就越少。当全业界都会做WEB的时候,您是否该考虑点其它的东西,或是把它做得更优秀。不过,请自信一点,如果你考虑收益的话,“社会必要劳动时间”在正常的市场体系下仍是一个公理。

(3)开源的商业价值低?

考虑到money因素,也许有人会说Linux即使再优秀,甚至全面超越了Windows,全面占据了市场,也不可能像Windows赚钱。这您可就太对了。以现阶段的商业应用为而论,MS已经如此优秀,能挤出的油水大体上已经进了MS的腰包。就像过去的十年,OS、办公软件领域,是Windows、Office的胜利,DB是Oracle的胜利,今后也许还是如此。然后,社会经济是不断发展的,新的应用需求是无止境的。现今,软件业正向高度、深度、定制化的方向发展。不过,以笔者估计,今后要想在诞生MS、Oracle这样的通用软件巨无霸只怕是不可能了(Gates迷们可能要失望了)。 数以万计的小型化、专业化、本地化的软件开发服务公司也许是更为现实的景象。所以,是选择商业软件体系还是开源体系进行开发则是一重要的问题。商业体系意味着较高的成本,较低的层次与通常认为较高的效率与暂时较高的市场认可度;开源体系则是较低的成本,较高的层次与通常认为较低的效率(主要是学习、探索、集成的时间长)与潜在的市场空间。何去何从,恐怕还得根据自身实力与周围的市场环境而定。

(4)国内开源的不利形势

众所周知,国内的技术环境是比较差的。由于体制与文化的原因,科技人员在国内的前途向来就是比较惨淡的。以吹嘘和欺诈为主要能力的权钱阶层掌控着国内的市场,这从根本上导致了技术的低水平化。低层次的经济体系也就意味着技术与管理的低水平化,这同样包括软件业的。在这样的条件下,所谓信息系统建设,往往也就是在硬件与商用软件上的大把挥霍。故而以收入和地位而论,营销人才远高于技术人才是不争的事实。所以在这片土地上,想要经过多年积累成为像James Gosling或Anders Heilsberg那样的大师,恐怕是极为艰难的。走入开源体系无疑在技术研究积累上是极好的,最终的收益是高的,但也意味着更多的心血与风险。

其余的弊病望各位道友尽述……

三、总结

“存在即是合理”,商业与开源软件现在与未来都将长期存在发展。软件业是有前途的,一如它的艰辛。不管是商业或开源体系,要想获得成功,都要走很长的路。应该说,软件业经过了其喧嚣的火爆之后,渐渐回归理性。“路漫漫其修远兮”,愿与诸位同道共勉。

(欢迎参加http://blog.csdn.net/lgx522/archive/2004/07/24/50665.aspx上的讨论)

需求分析方法探讨
[摘要]本文论述了需求分析的一般方法。介绍了目前通用的需求分析产品特点。结合系统模型,阐述了需求分析与系统建模的关系。
[Abstract] This article describe general method of Requirement Analysis. Introduce the characters of pop Requirement Analysis product. With System Model, expatiate the relationship between requirement analysis and system modeling.
一、 概述
据权威部门统计,目前软件的成功率约为25%,75%的软件是失败的。在这75%的失败中,约有50%以上的软件是由于需求的原因造成的。作为软件的设计和开发人员常抱怨用户需求不明确,需求常处于变更状态。新的需求往往在开发阶段才被用户提出。造成软件的完成日期不断的迟后。
一般的软件企业,往往只口头上注重用户需求。但由于没有科学的管理方法,实际上他们描述的用户需求是杂乱无章的,只言片语的。不能有效地和系统设计、开发保持同步最后开发出来的软件产品和实际有很大的差异。导致软件的失败。有证据表明,在需求阶段修正错误的工作量,是在系统设计阶段修正错误的1/10;是在开发阶段修正错误的1/100,是在发布产品阶段修正错误的1/1000。当然这是对大型系统而言,对于不同的系统,随系统的复杂程度这个比率会有所不同。
用户的需求的增加具有渐进的、增量的特点。随着需求分析人员和用户逐渐深入的交流,用户在不断地整理、规范自己的需求。需求分析人员须牢记的是用户不可能一下子给出一个完整、清晰、规范的用户需求。需求分析人员需从与用户的交流中,不断地挖掘,并加以整理,才能得到想要的需求。
需求分析一般来说需要有一个需求分析的团队,如用户代表、系统分析人员、开发人员、需求管理人员等,他们的分工不同各有侧重点。对于小型或中型项目人员可以兼任。
基于上述原因,需要从理论上规范用户需求的收集和整理。本文结合系统建模,给出了需求分析的一般性方法。它如下的包含了两个方面:
1、 技术层面
给出需求分析的系统框架,它包含了需求的项目、参与需求分析的用户、用户对于需求的可操作权限(安全性)等。
2、 操作层面
给出了需求收集、整理、分析的一般性方法。
其中介绍了系统建模和需求分析间的相互关系,最后介绍了目前几种流行的需求分析产品及它们的特点。

二、 需求分析的基本概念
需求分析的目的是完整、准确地描述用户的需求,跟踪用户需求的变化,将用户的需求准确地反映到系统的分析和设计中,并使系统的分析、设计和用户的需求保持一致。
需求分析的特点是需求的完整性、一致性和可追溯性。
完整性:是准确、全面的描述用户的需求。
一致性:是通过分析整理,剔除用户需求矛盾的方面,规范用户需求。
可追溯性:有两个方面的含义,整理和规范的需求,其一,需要不断的和用户进一步交流,保持和用户最新的需求一致;其二,和系统分析(设计)保持一致。
因此在需求分析之前我们必须建立需求分析技术层面的基本框架,从技术上保证需求分析的要求,在此基础上我们进行的需求分析才能满足项目对需求分析的要求。

三、 需求分析的系统架构
本节描述的是进行需求分析之前,如何在技术层面上建立需求分析的系统架构。

需求分析需要采用需求分析的软件。上图简要描述了需求分析软件的架构。需求分析软件一般采用C/S的结构,需求分析人员作为客户对服务器进行操作,操作主要由四个方面:系统管理(含用户的创建和授权,定义项目的术语表等)、项目视图(涉及项目的相关操作)、需求类型视图(涉及需求类型的相关操作)、需求视图(涉及需求的相关操作)。
项目包含一个或多个需求类型,需求类型包含一个或多个需求。里程碑是特定版本的需求的集合(需求分析软件含有简单的配置管理的功能),它作为软件产品的功能依据。自动文档生成是通过文档模版将里程碑的需求,自动生成相关文档。
3.1 项目
 项目在总体上定义了一个应用和系统所涉及到的需求及需求涉及的范围。它包含了在需求分析过程中参与需求分析的人员、需求类型、包含于需求类型中的需求。此外它还包含了如下信息:
 项目的相关信息(如创建人员)
 项目的里程碑
 外部的可追溯性
 安全性框架等。
3.2 用户/用户组
用户是指参与需求分析的人员,一般由软件产品的最终用户、软件开发人员、系统设计员、测试人员等组成。在需求分析产品中用户包含用户的基本描述和联系方式(如电子邮件)等,目前大多数需求分析产品还含有消息通讯的机制(类似于QQ),及时地将需求的变化告知相关的需求分析人员。
用户组是指具有相同操作权限的一个或多个用户。用户组可以被指定到特定的项目或需求(用户组中的用户对此具有相应得操作权限)。
3.3 安全性
安全性是指在需求分析过程中,用户对需求的操作权限。安全性防止未授权的用户对关键性需求的操作。安全性是用户/用户组与需求之间的一种关系。
一般来说安全性有三个方面的含义:
 系统管理
系统维护(系统数据备份等)、用户管理、用户组管理等。
 安全性框架
定义用户的基本操作权限。这种操作权限和具体的项目、项目需求无关。如一个用户添加的需求只能由这个用户自己删除等。安全性框架又可以分为两类:
 存取级别(Access Level)创建、查看、维护需求。
 删除级别(Delete Level)删除需求。
 特定需求的安全性
建立用户/用户组与特定需求的关联,以确定此用户/用户组对需求的操作权限。
3.4 需求类型/需求
需求类型通常是以功能划分的较高层次的需求,如用户界面。需求是所要构建的系统或应用所要满足要求的说明,需求可以由业务规则、处理流程、人员的组织结构获得。需求包含于需求类型之中。需求类型/需求一般是用文字描述的,此外还可以通过需求的属性、外部文件来描述需求。
3.5 属性
属性用来描述需求相关特性,属性一般可分为两类。
系统属性:描述需求的系统特点,如需求是否被确认等。
自定义属性:由用户自定义用来描述需求的属性。如描述人员的电话号码等。
3.6需求网格
需求网格是一组相关的需求用网格的形式表示,主要用于需求的分析。一般来说可以定义显示的方式,如针对某个用户显示他所创建的需求、针对某类功能显示相关的需求等等。
3.7 需求映射
考虑这样的背景,在一个实时系统中,数字信号的采集与传输在不同的控制系统中均使用相同的实现方式,它们的需求也相同。在这种情况下我们可以采用需求映射的技术,需求映射是在不同的项目中使用相同的需求。

在图中有三个项目,项目A中的需求R3被共享出来,项目B中的R3的需求映射到项目A中的需求R3。
3.8 可追溯性(Traceability)
可追溯性是需求的一致性表现形式。它主要包含以下几个方面的含义:
 保持和用户要求的同步
必须牢记的是用户需求是不断变化的。需求分析需要适应需求的不断变化。
 保持需求之间的完整和一致
用户从各个层面提出的需求,往往含有相当多的矛盾,需求分析的一个重要的方面是要消除这些矛盾,规范用户的需求。此外需求之间的依赖性也可以通过可追溯性来表示。
 保持需求和系统设计间的同步
在大多数项目中,需求分析和系统设计没有的必然联系,这种情况造成的后果是软件产品和实际的需求相差甚远。例如采用手工的方法,可以使需求与系统设计保持一致。但这种方法是不安全的,因为没有相应的机制来强制相关人员遵守规则。所以必须从技术层面来保证需求和设计的一致,目前大多数的需求分析工具均有和系统设计工具保持同步的插件,如Borland的CaliberRM、IBM的ROSE、Telelogic的DOORS等。
3.9 报告(Report)
报告可以理解是需求的视图,从不同的层次来描述需求,报告可根据需要进行过滤,如针对某一需求类型的报告、针对不明确需求的报告等。报告一般可以分为:
 细节报告
描述需求的细节。
 状态报告
描述需求的状态,需求的状态可分为接受、不明确、拒绝等。
 责任报告
参加需求分析的人员对其负责的需求产生的报告。
3.10 讨论
讨论是在需求分析过程中,需求分析团队成员之间的一种协作机制。这种机制可使相关人员就需求的定义、描述、状态、优先级、一致性、完整性等进行讨论,得出正确的结论。
讨论一般来说分两个级别,项目级别、需求级别。
3.11 文档引用
一个需求的描述可能需要外部的文档,文档引用是用外部文件来描述相关需求的附加信息。目前需求分析产品支持最多的文档类型是MS WORD,此外根据产品的不同,还支持Excel、图像文件、HTML、及OLE等。
3.12 里程碑(BaseLine)
需求是不断变化的,软件产品根据不断变化的需求有不同的版本,每一个版本的软件除了软件自身的BUG外,就是满足新增加的需求,而软件产品需要其实现的功能具有稳定性。里程碑就是需求分析过程的一个阶段结果,这个阶段结果是固定不变的。
3.13 文档的自动生成
参与软件开发的人都有这样的体会,在软件产品完成之前很难给出软件的各种文档,就是给出了相应的文档,文档之间也有各种各样的矛盾。这是需求、设计、开发缺乏同步的表现。
如果我们在软件的开发过程中,严格遵循软件的开发规范,采用相应得软件工程工具,上述情况就可以避免。
在需求分析中,需求分析产品均可以自动根据分析的结果生成相应得文档,文档的格式可以有MS Word、PowerPoint、HTML等。这里我们主要介绍一下Office Word文档的生成方式。
在自动生成文档之前,我们需要定义文档模版。根据所要生成文档的格式和需求分析软件的相关命令,在Office Word创建文档模版。文档模版创建好之后,在需求分析软件中选择里程碑,自动生成出Office Word文档。
四、 需求的收集和整理
需求分析是从用户的角度描述用户的数据、活动、地点(位置)、人员组织、计划、业务逻辑(业务目标)等相关信息的一个过程,它涉及到如何收集用户的需求,以及如何将这些需求规范化等方面。需求分析的第一步工作是界定需求的边界,主要描述项目的、项目的业务要求、项目所要满足的基本特性等。
在第三节中我们简要描述了如何从技术层面上使需求分析的过程规范化,本节主要阐述如何进行需求的收集和整理。
4.1 数据
数据是指需求涉及的相关静态信息。在需求分析过程中,数据是从用户的角度来描述的;在系统设计过程中,数据用面向对象的方法进行整理和规范,最终形成Class Diagram。
4.2 活动
活动是项目要满足的业务逻辑和规则。它至少有二个层次:
 基本目标
简要描述业务逻辑和规则。
 功能描述
描述活动执行的过程,以及在执行过程中涉及到的相关资源、活动之间的关联、依赖性、约束性等。
考虑到需求分析和系统设计的一致性。活动在系统设计阶段,可采用用例来表示,通过序列图、活动图、以及状态图来进行细化。
4.3 人员组织
描述用户人员组织结构。如企业领导、部门、部门人员、相关客户信息等。
4.4 地点(位置)
描述需求和地点、位置相关的系统设计中网络、分布式计算的前置条件。
五、 需求分析软件
目前流行的需求分析软件有IBM公司的RequisitePro、Telelogic公司的DOORS、Borland公司的CaliberRM。这些软件均能满足本文中描述的对需求分析功能上的要求,但各有特点,RequisitePro和大多数系统设计软件有较好的结合,目前的版本对Office 2003的支持不够。DOORS在实时系统的需求分析中有良好的表现。CaliberRM对Office有很好的支持,中文的问题也解决得很好,支持Office 2003的版本。
六、 结论
需求具有渐进的,不断变化的特点。需求分析是一个需求分析团队的工作,在需求分析理论的指导下需要采用需求分析的商业化产品,这样才能保持需求和设计的同步,没有这种同步,需求分析不会有太大的实际意义。
大多数系统设计产品如Rose、Together、Tau、Rhapsody(实时系统的系统设计工具)等,具有部分的需求分析功能,严格意义上它们不是需求分析的产品。但他们均有和需求分析产品的接口。
一般说来软件项目涉及到的很多方面,如需求分析、配置/变更管理、系统设计/建模、测试等。本文只是简要描述了作者对需求分析的一些体会。
参考文献:
1、 David C. Hay 《Requirements Analysis :From Business Views to Architecture》2002 Hall PTR
2、 Borland 《CaliberRm User Guide》
3、 邱仲潘等译 《UML与Rational Rose2002 从入门到精通》电子工业出版社 2002年7月
4、 周靖等译《XML应用的UML建模技术》清华大学出版社 2003年1月
5、 郭旭译 《JAVA 与UML协同应用开发》清华大学出版社 2003年4月
palatum edited on 2004-06-14 18:40

Java数据库连接(JDBC)API是一系列能够让Java编程人员访问数据库的接口,各个开发商的接口并不完全相同。在使用多年的Oracle公司的JDBC后,我积累了许多技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。

  1、在客户端软件开发中使用Thin驱动程序

  在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序的性能都超过了OCI驱动程序。

  2、关闭自动提交功能,提高系统性能

  在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:

  conn.setAutoCommit(false);

  值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。

  3、在动态SQL或有时间限制的命令中使用Statement对象

  在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。

  此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。

  4、利用helper函数对动态SQL命令进行格式化

  在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O"Reilly插入表中的SQL命令,则必须使用二个相连的“""”号替换O"Reilly中的“"”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。

  5、利用PreparedStatement对象提高数据库的总体效率

  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。

  6、在成批处理重复的插入或更新操作中使用PreparedStatement对象

  如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():

PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}

  调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。

  7、使用Oracle locator方法插入、更新大对象(LOB)

  Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。

  8、使用SQL92语法调用存储过程

  在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。

  9、使用Object SQL将对象模式转移到数据库中

  既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。

  10、利用SQL完成数据库内的操作

  我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。

  如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。


只有注册用户登录后才能发表评论。


网站导航: