?很多網友問我學習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的功能。