⑴ 為什麼 MySQL 使用多線程,而 Oracle 和 PostgreSQL 使用多進程
.NET平台很棒。真的很棒。直到它不再那麼棒。我為什麼不再用.NET?簡單來說,它限制了我們選擇的能力(對我來說很重要),轉移了我們的注意力,使得我們向內認知它的安全性,替代了幫助我們認知外面廣闊世界的所有可能性。[系好安全帶:這個文章的長度幾乎成了一本書…]優點首先讓我開始說說.NET做得對的許多事吧,盡管這其中的大多數並不來自.NET本身,但卻是由.NET社區而來。C#C#令人驚嘆。我認為它是一個令人驚嘆的編程語言。從強大的C語言背景而來,我徹底地喜歡其語法,流和這門語言的所帶來的感覺。當然有我可能改變的事,但總體來說它是一門扎實的語言。並且基於開發人員使用的編程語言如此巨額的百分比和Windows操作系統的優越性,它是一門眾所周知的語言。ReSharper我也很喜歡Resharper。在JetBrains工作的開發者們都是奇跡般的人。如果沒有ReSharper和一些相關的工具,我可能並不會如此喜歡C#。BDDandMSpec我也很喜歡簡稱為機器規格(mspec)的BDD風格的框架。它是一個令人驚嘆的測試框架,真正支持在測試中使用正確的語言測試本身。在使用mspec之前,我的測試真是一團糟並且很礙我的事。另外,當我們創建GoConvey—基於Golang的BDD測試框架的時候,Mspec對於我的組織來說是一個巨大的靈感和激勵。多語言運行時我認為多語言的CLR(公共語言運行時)的觀念真得使得JVM的世界思考著。我不知道任何非java的JVM語言在CLR之前,但隨著「公共語言運行時」的到來,我的理解是這使得使用JVM的人們向前進並且最終創造了如Scala和Clojure這樣偉大的JVM編程語言。如果我錯了請糾正我。再者,CLR使得Sun公司的人們坐下來並關注它,因為Java有一點陳舊並且隨著Java8的到來,僅僅現在才在多個方面追趕著。競爭是一件非常好的事。NuGet另一個顯著的例子是NuGet。這個包在Windows中作為一個整體特別是在Windows的開發中,它的管理軼事是糟透的。NuGet解決了很多問題,他們也通過從Python和Ruby借用了很多東西去做了很多正確的事。有改進的餘地嗎?當然。但比起其他一些選擇在這兒或那兒的包升級來說,我還沒有感到使用NuGet有這許多痛楚。Mono對於Mono的開發者們,我不能不說太棒了。他們所創造的太驚奇了。沒有任何官方支持和不顧潛在的懸在他們頭上的法律問題,他們向前推進並創造了一個居然能替代官方運行時的實現。我已經有一些運行在產品中應用程序,在Mono下運行了幾乎一年而沒有任何問題。它的產品准備好了嗎?這可能取決於你的應用程序(見下文「Mono」)。CQRS和事件溯源可以認為,關於.NET最好事之一是,它是CQRS的誕生地並有相關的技術:事件溯源。就算這樣,CQRS+ES本身並沒有什麼很新的東西。正如GregYoung將會告訴你的,這是由一堆40年歷史原料為我們重新打包並更名的。對於大型代碼庫我有些非常嚴重的問題,當我5年前使用CQRS+ES的時候,它完全釋放了我的域。CQRS+ES現在是命名模式的並且其成長是顯而易見的。這可能是因為.NET已經能夠和其他的開發平台交互共享的原因。除了這個之外,大多數的創新是從外部來的。缺點優點先放在一邊,讓我們看看什麼出錯了和我為什麼不再用.NET框架。關於我最近開發平台的遷移,最能激勵我的事是我可以利用許多最好的部分而丟下不好的部分(如下文所說)。Windows正如前文所述,當面對基於網路的伺服器軟體時,Windows並不是一個好的選手。在我看來,Windows的另一個真正的大問題是傳統的Windows開發者是通常僅僅擅長於Windows,當他們離開安樂窩之後就會很快迷失,這對於Linux開發者來說卻不是問題。計算遠不止是Windows。開發者僅僅能操作單一的操作系統的一個問題是它不可避免得導致Windows的激增。換句話說,Windows生了Windows。沒法打破這個循環。另一方面,*NIX的開發者通常熟悉多操作系統(Linux,Unix,OSX,Windows等等),一個操作系統的內部工作原理,不同的分布(基於Debian和基於Fedora),窗口管理器,桌面管理器,文件系統,包管理,編譯,重新編譯,重新打包,命令行「fu」等等。我的一個心病是文件系統。NTFS並不是系統唯一的文件系統,對於任何給予的任務它幾乎都不是最好的選擇。ZFS,BTRFS,ReiserFs,ext*等等,有一些很酷的特性。我也很喜歡為了各種高速/透明的磁碟操作,能從BASH創建迴路設備或者創建RAM設備。這在Windows中不會發生—如果沒有第三方軟體的話。在AWS雲服務中,啟動一個Windows機器要花掉足足10多分鍾。我大約15-20秒就能啟動一個簡單的Linux機器。當涉及到雲計算規模,它能夠迅速擴展是很重要的,因為當擴展很重要時,10-15分鍾就像是永恆的。VisualStudio在我這另一根刺,當屬VisualStudio。我需要一個大大超出預期的IDE去做任何開發,這個想法困擾著我。它只是如Windows一樣龐大的資源豬。我有一個內核i73770K3.5GHZ的台式機,以16GB的內存和最大4512GB的固態硬碟去編譯。它差不多刷爆了Windows體驗指數,但Windows+VS仍然很慢。(是的,ReSharper使得它更慢了,但是ReSharper對這來說是值得的。)現在我在MacBookPro上開發,它比起我的強大的台式機來說只有更少的CPU馬力,但運行明顯更快,在一個短小的學習曲線之後,UX(用戶體驗)變得無限美好了。事實上,我甚至不再用滑鼠了—我的雙手一直在鍵盤或觸控板上,我可以用手勢操作我的電腦並讓它回應—不像在Windows。關於VS很酷的一個事是調試器。它的查看和使用,令人難以置信得方便。每隔一段時間會在監視窗口報告錯誤的值,導致花費時間去調試。同時,這也是很大的負面,因為CLR默認的,多線程的世界使得我一開始就需要一個調試器。沒有調試器是一個解脫的體驗,因為它迫使你以另一種方式編程。VS同樣也有創建「csproj」和「sln」文件的壞毛病。我恨這些。當然,C#必須知道編譯什麼和何時編譯。我理解這點。在Golang中,引用在代碼中使用了很重要的語句。如果它不是.NET中用到的工程文件,我可能使用簡單的文本編輯器編碼C#,並且對這門語言更流暢。使用gitrebase操作時,這些文件也有導致合並沖突。別讓我開始說換行符的差異。我不能相信直到今天我們還在處理這樣的事。如果VS解決方案文件以Linux行結束符結束,通過雙擊它並不能載入該解決方案,因為VS解決方案文件分析器讀不出它來。源代碼管理幸運的是,我早就跳出了微軟陣營的源代碼管理(版本控制系統VSS)。我早在2000年初,在VSS無數次丟失了我的提交之後,就使用了Subversion(譯者註:Subversion是開源的版本控制系統)。之後git(譯者註:git是開源的版本控制系統,內容管理系統等)出現了,我又迷上了它。不幸的是,沒有Windows的介面—對我來說是典型的遭遇。最終有人創建了一個介面,我就用了那個並且沒有回頭。Git是一把非常鋒利的刀,但當你正確運用它的時候,它是一個強大而高效的工具。我曾經在一個小工程中用過TFS(譯者註:TeamFoundationServer,工作流協作引擎),它是一個怪物—和所有來自Redmond(譯者註:美國微軟總部)的產品一樣。它感染了我的項目文件並且污染了我的源代碼目錄。真可惡。不,還是謝謝你。給了我任意一天用命令行git…或者可能是SourceTree,如果你需要從GUI得到一點關愛。Mono是的,這是第二次提及Mono。正如Mono本身如此驚艷一樣。在.NET的世界,它仍然二等公民。無論什麼時候我嘗試在Mono上運行任何重要的東西,我通常都在和漏洞作斗爭。幸運的是,對下載代碼,查找問題,發送請求和在Linux上編譯代碼我沒有感到不舒服。但是這件事我都記不清做了多少遍了。是的,CLR是個巨大的怪物,並且對一個非官方的應用在不同的操作系統都有相同的行為,簡直是個類似於分開紅海的奇跡。但事實是,我不得不花費如此多的時間來填補漏洞以使我的代碼能夠正確運行,實在是很難為其辯護。Mono的特定區域也慢。也許它不是在慢在過載,但對我來說Web伺服器是關鍵所在。並且它非常慢,最後,慢到了最底下—即使是微不足道的東西。我想好消息是它只能從這兒得到更好的。我也應該提及Mono的開發者可能忘了Linux,比起我可能知道的還多,所以我不能太挑剔。IIS也許IIS在嘗試著為太多的應用程序做太多的事情。它從作為一個web伺服器變為像J2EE應用程序容器一樣的應用程序宿主。它也站在慢速這一邊。我猜如果我需要更高的性能,我應該編寫我自己的web伺服器,但我真的很想只關注我應用程序的代碼。可能利用Windows事件伺服器將是好的,但nginx(譯者註:一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP代理伺服器)和其他伺服器只是不喜歡在Windows中生產。虛擬的以JVM為基礎的實現,例如Netty(譯者註:JBOSS提供的一個java開源框架),很容易處理每秒650K+/的請求量。IIS在運行一個簡單的CLR應用程序「Hello,World!」,處理大約每秒50K的請求量時就會壅塞。(有趣的題外話,參考基準開發者通過TCP套接字創建了一個簡單的C#的web伺服器,它能處理大約每秒120K的請求量。)狹隘的心理前些年有個運動叫做ALT.NET。該運動是全部是關於尋找我們自身之外的更廣闊的開發社區以作為一個整體,並匯聚不同的部分。有趣的是,那是StructureMap、Autofac、NuGet、ASP.NETMVC和許多其它工具的靈感來源。在傳統的.NET的圈子裡,這個運動受到了很多的不屑和鄙視。我把這看作是,作為一個整體的社區普遍的狹隘心理和怠惰的一個極大的例證。(的確,它們中的一些可能會消失,進而以包括Redis,MongoBD還有其它的不同的技術而出現。)有這么多很棒的方案在那裡。假定微軟已註定是唯一正確之路的想法是荒謬的。如果是這樣的話,我們就都還在使用VisualStudio的設計工具去拖放按鈕和鏈接元素到一個WebForm的界面上,我們會設定了該按鈕並且依賴ViewState以幫助我們與可怕的HTTP所帶來的恐懼隔開。我從我的一個部署的代碼庫中最後一個WebForm中擺脫的那一天,是個光榮的值得慶賀的日子。誰又曾想過「網路控制」是個好主意?很顯然我考慮過因為我喝了Kool-Aid(譯者註:卡夫公司出品的飲料,這里意指明知是註定的或有危險的仍然去做,有負面涵義)並且完全接受它。它狠咬了我。見過2MB的ViewState嗎?[註:當我寫這篇文章的時候,原來的標題,「為什麼我不再用.NET」,意味著整個.NET生態系統。標題感覺有點短於是我更新為「為什麼我不再用.NET框架」。我想.NET作為一個生態系統,包括了所有的工具,工程,平台,組織還有很多開發者。這就是為什麼有些更廣泛的.NET社區的元素在我的這篇文章中受到抨擊原因。]性能殺手C,Java和C#中典型的多線程範例都強烈推薦使用鎖和互斥。對於鎖來說有個隱藏的開銷:它們慢得難以忍受。使用Disruptor(JVM中的無鎖的環形緩存[譯者註:實際上就是擁有一個序號指向下一個可用元素的數組]),你可以很容易得每秒處理20M以上的事件。在.NET中使用規定的「最佳實踐」等任何超過每秒十幾次的傳輸,都被認為是體面又好的性能表現,在這一點上來說你僅僅需要更大/更好/的硬體設備。事實上,我見過第三方客戶端庫(Rabbit,Couch,Mongo等等)中鎖語句遍布整個代碼。即使在我的代碼中沒有任何的並發,默認的和首選的方法都用了鎖。無鎖的、事件驅動的方法允許你大幅降低硬體和資金支出。大部分應用程序可以輕易地運行在兩台機器上,第二台機器僅僅在冗餘和失效備援時是必須的,以防因為硬體相關的問題導致第一台機器不可用的時候起作用。這個問題的另一個方面是調用網路和磁碟子系統的傳統方式:同步,阻塞代碼。如果你需要多個並發的HTTP請求,你需要的線程。大多數人不知道的是,為維持線程多出的1-2MB和上下文切換線程的需求,使得CPU內核消耗所有的時間顛簸在上下文切換上而不是做真正的工作。所以現在我們得到了在一個應用程序中數百或數千的線程,佔用了RAM,並造成CPU停滯不前。還有個更好的方式。Netty/NIO(JVM),Erlang,Node,Gevent(Python)和Go都支持使用事件驅動的子系統操作(選擇/epoll[譯者註:Linux內核中的一種可擴展IO事件處理機制]/kqueue[譯者註:FreeBSD的可擴展的事件通知介面])。這就意味著當等待數據包被tx/rx跨網路的時候,CPU可以自由地去做其它,重要的工作。因為JVM的成熟,Netty可以認為是做這項工作最快的,但我喜歡Go用Goroutines操作這個的方式—它簡單,優雅,很容易推理,沒有像義大利面條一樣的回調。SQLServer作為一名.NET開發者,當你開始一個新的工程時,有一些事是你通常會去做的:創建一個新的solution將其部署到TeamFoundationServer(譯者註:Microsoft應用程序生命周期管理(ALM)解決方案的核心協作平台)IIS中建立相應的網站入口創建一個新的SQLServer資料庫在solution中關聯EntityFramework(通常是2010年之後創建的工程)開始設計你的資料庫和ActiveRecord實體在大多數情況下這不是編寫代碼的正確方式。當然它可能在某些情況下有效,但是作為一個「默認的架構」它並不是你想要的。為什麼在我們甚至還沒理解問題領域之前已經做了任何技術上的選擇?這簡直是本末倒置了。微軟的生態系統鼓勵每個人使用SQLServer。在VisualStudio中和SQLService進行交互或者使用SQLManagementStudio(和它的前身,SQL查詢分析器)是如此令人難以置信的容易。這種以資料庫為中心的重點,是欽定的或唯一正確的方式的一部分。它使你更加迷戀微軟。廠商鎖定始終對廠商來說是好的。為什麼我們要如此開發?為什麼我們不地考慮應用程序的行為而不是它如何存儲的?現在我所有的項目都使用基於JSON的鍵/值存儲。有了這種功能,我可以選擇任何我想要的存儲引擎,包括SQLServer,Oracle,PostgreSQL,MySQL,Cassandra,CouchDB,CouchBase,Dynamo,SimpleDB,S3,Riak,BerkeleyDB,Firebird,Hypertable,RavenDB,Redis,TokyoCabinet/Tyrant,AzureBlobs,文件系統中的明文JSON文件等等等等。突然之間,我們能夠開始根據其優點而不是僅僅對其熟悉來選擇存儲引擎了。題外話:在AWSRDS的雲上運行過SQLServer嗎?別這么做。當然它會工作,但是一些例如復制這樣最簡單的事是不存在的。文章充斥著對SQLServer不能在AWSRDS上工作的引用。結論也許我在軟體開發中學到的兩件最重要的教訓是:邊界和封裝的重要性(以多種形式)付出代價以得到正確的模型和抽象許多年前我恨「模型」這個詞。每個人都會把它到處扔,它是一個如此過載的術語,很難理解它的含義和它為什麼這么重要。就這點來說,我僅僅會說模型是對你想要封裝的現實的一個有限的表示。也許最簡單的例子就是地球儀的墨卡托投影了。這很確切得說明了一件事:導航。如果你在其他的事情上使用它,它並不毫無價值。如果你不專注於付出代價去使模型正確,去封裝商業現實,那麼沒有任何技術能夠拯救你。我對.NET最大的抱怨是,「唯一正確的方式」引導你遠離理想的模型並把你推向關注實現細節和技術缺陷的方向。這樣的關注導致技術實施滲血並且感染模型,最終導致它腐爛變質,因為它不能適應不斷變化的商業需求。當這發生的時候,開發者掙扎著並蹬踢著,如同吸毒者一樣,他們從一個新技術轉向另一個,以期望下一個強大的技術能夠治癒他們的病痛。技術本身並不是靈丹妙葯,相反地,它是關於取捨和選擇。只有正確地理解了商業行為並把它們封裝進結構良好的,易於理解的模型中,以幫助保持技術堆棧在屬於它的地方—作為一個實現細節。這就是我為什麼不再用.NET框架,因為它不斷地重申自己(的主張),不斷地想要比它的本身的:一個實現細節。
⑵ Java軟體工程師的發展路徑
Java軟體工程師的未來發展方向大致分為兩類:
一是成為管理人員,例如產品研發經理,技術經理,項目經理等;
二是繼續他的技術工作之路,成為高級軟體工程師、需求工程師等。 Java語言是一個面向對象的。Java語言提供類、介面和繼承等原語,為了簡單起見,只支持類之間的單繼承,但支持介面之間的多繼承,並支持類與介面之間的實現機制(關鍵字為implements)。Java語言全面支持動態綁定,而C++ 語言只對虛函數使用動態綁定。總之,Java語言是一個純的面向對象程序設計語言。
Java語言是分布式的。Java語言支持Internet應用的開發,在基本的Java應用編程介面中有一個網路應用編程介面(java net),它提供了用於網路應用編程的類庫,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(遠程方法激活)機制也是開發分布式應用的重要手段。
Java語言是健壯的。Java的強類型機制、異常處理、廢料的自動收集等是Java程序健壯性的重要保證。對指針的丟棄是Java的明智選擇。Java的安全檢查機制使得Java更具健壯性。
Java語言是安全的。Java通常被用在網路環境中,為此,Java提供了一個安全機制以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網路下載的類具有一個安全防範機制(類ClassLoader),如分配不同的名字空間以防替代本地的同名類、位元組代碼檢查,並提供安全管理機制(類SecurityManager)讓Java應用設置安全哨兵。
Java語言是體系結構中立的。Java程序(後綴為java的文件)在Java平台上被編譯為體系結構中立的位元組碼格式(後綴為class的文件),然後可以在實現這個Java平台的任何系統中運行。這種途徑適合於異構的網路環境和軟體的分發。
Java語言是可移植的。這種可移植性來源於體系結構中立性,另外,Java還嚴格規定了各個基本數據類型的長度。Java系統本身也具有很強的可移植性,Java編譯器是用Java實現的,Java的運行環境是用ANSI C實現的。
Java語言是編譯解釋型的。如前所述,Java程序在Java平台上被編譯為位元組碼格式,然後可以在實現這個Java平台的任何系統中運行。在運行時,Java平台中的Java解釋器對這些位元組碼進行解釋執行,執行過程中需要的類在聯接階段被載入到運行環境中。
Java是高性能的。與那些解釋型的高級腳本語言相比,Java的確是高性能的。事實上,隨著JIT(Just-In-Time)編譯器技術的發展,Java的運行速度可以和優化過的本地代碼相媲美。
Java語言是多線程的。在Java語言中,線程是一種特殊的對象,它必須由Thread類或其子(孫)類來創建。通常有兩種方法來創建線程:其一,使用型構為Thread(Runnable) 的構造子將一個實現了Runnable介面的對象包裝成一個線程,其二,從Thread類派生出子類並重寫run方法,使用該子類創建的對象即為線程。值得注意的是Thread類已經實現了Runnable介面,因此,任何一個線程均有它的run方法,而run方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。Java語言支持多個線程的同時執行,並提供多線程之間的同步機制(關鍵字為synchronized)。
Java語言是動態的。Java語言的設計目標之一是適應於動態變化的環境。Java程序需要的類能夠動態地被載入到運行環境,也可以通過網路來載入所需要的類。這也有利於軟體的升級。另外,Java中的類有一個運行時刻的表示,能進行運行時刻的類型檢查。Java語言的優良特性使得Java應用具有無比的健壯性和可靠性,這也減少了應用系統的維護費用。Java對對象技術的全面支持和Java平台內嵌的API能縮短應用系統的開發時間並降低成本。Java的編譯一次,到處可運行的特性使得它能夠提供一個隨處可用的開放結構和在多平台之間傳遞信息的低成本方式。特別是Java企業應用編程介面(Java Enterprise APIs)為企業計算及電子商務應用系統提供了有關技術和豐富的類庫。
和C/C++的差異熟悉C語言和C++語言的讀者一定想搞清楚這個問題,實際上,Java確實是從C語言和C++語言繼承了許多成份,甚至可以將Java看成是類C語言發展和衍生的產物。比如Java語言的變數聲明,操作符形式,參數傳遞,流程式控制制等方面和C語言,C++語言完全相同.盡管如此,Java和C語言,C++語言又有許多差別,主要表現在如下幾個方面:
(1) Java中對內存的分配是動態的,它採用面向對象的機制,採用運算符new為每個對象分配內存空間,而且,實際內存還會隨程序運行情況而改變。程序運行中 Java系統自動對內存進行掃描,對長期不用的空間作為」垃圾」進行收集,使得系統資源得到更充分地利用.按照這種機制,程序員不必關注內存管理問題,這使Java程序的編寫變得簡單明了,並且避免了由於內存管理方面的差錯而導致系統出問題。而C語言通過malloc()和free()這兩個庫函數來分別實現分配內存和釋放內存空間的,C++語言中則通過運算符new和delete來分配和釋放內存。在C和C++這種機制中,程序員必須非常仔細地處理內存的使用問題。一方面,如果對己釋放的內存再作釋放或者對未曾分配的內存作釋放,都會造成死機;而另一方面,如果對長期不用的或不再使用的內存不釋放,則會浪費系統資源,甚至因此造成資源枯竭。
(2) Java不在所有類之外定義全局變數,而是在某個類中定義一種公用靜態的變數來完成全局變數的功能。 (3) Java不用goto語句,而是用try-catch-finally異常處理語句來代替goto語句處理出錯的功能。(4) Java不支持頭文件,而C和C++語言中都用頭文件來定義類的原型,全局變數,庫函數等,這種採用頭文件的結構使得系統的運行維護相當繁雜。
(5) Java不支持宏定義,而是使用關鍵字final來定義常量,在C++中則採用宏定義來實現常量定義,這不利於程序的可讀性。
(6) Java對每種數據類型都分配固定長度。比如,在Java中,int類型總是32位的,而在C和C++中,對於不同的平台,同一個數據類型分配不同的位元組數,同樣是int類型,在PC機中為二位元組即16位,而在VAX-11中,則為32位.這使得C語言造成不可移植性,而Java則具有跨平台性(平台無關性)。
(7) 類型轉換不同。在C和C++中,可通過指針進行任意的類型轉換,常常帶來不安全性,而在Java中,運行時系統對對象的處理要進行類型相容性檢查,以防止不安全的轉換。
(8) 結構和聯合的處理。在C和C++中,結構和聯合的所有成員均為公有,這就帶來了安全性問題,而在Java中根本就不包含結構和聯合,所有的內容都封裝在類裡面。
(9) Java不再使用指針。指針是C和C++中最靈活,也最容易產生錯誤的數據類型.由指針所進行的內存地址操作常會造成不可預知的錯誤,同時通過指針對某個內存地址進行顯式類型轉換後,可以訪問一個C++中的私有成員,從而破壞安全性。而Java對指針進行完全地控制,程序員不能直接進行任何指針操作。
(10)避免平台依賴。Java語言編寫的類庫可以在其它平台的Java應用程序中使用,而不像C++語言必須依賴於Windows平台。
(11)在B/S開發方面,Java要遠遠優於C++。 自從sun被甲骨文收購以後,Java的發展前景就變得撲朔迷離起來,很多程序開發者都感到很迷惑。2010年4月9日,被稱為Java之父的JamesGosling又在個人博客上宣布離開Oracle,這一事件更為Java的前景增加了一層迷霧。但是在進入5月份之後,一切開始變得明朗起來。首先是Oracle在Java的後續支持方面,宣布了一系列關於Java的相關計劃。然後是Java之父JamesGosling繼聲明Java不會死去之後又盛贊Oracle對Java所做的貢獻。在Oracle的活動發布網站上,連續發布了多個關於Java的推廣活動。
版本簡介
2010年5月12日,Oracle主要產品負責人DaveHofert將大談對JavaSE商業應用的改進和革新。根據宣傳資料,在這次演講中,DaveHofert將提到以下問題:
商業版與社區版本之間平台支持的差異。
如何獲得專家幫助,以幫助企業增強其Java應用。
對於舊版本的安全修補問題。
可使用的發布工具和更新。
2010年6月18、19、20、27日,將分別在赫爾辛基、斯圖加特、布達佩斯、倫敦舉行Oracle、Sun專家與用戶見面會,在見面會上與用戶一起探討Java的發展路線。主要討論的問題包括Oracle將如何繼續投資和改進Java技術,並且還會向用戶通報JavaSE、JavaME專家團隊的最新消息、JavaFX和JDK7最新的消息,以及OracleBerkeley DB的相關信息。
2010年5月3日,已經離開Oracle近一個月的Java之父JamesGosling在他的博客上表達了對NetBeans 6.9 和 FX1.3發布的關心。這兩個項目最新版本的發布,可以證明Oracle已經開始兌現當初的承諾。JamesGosling在其早期的博客中,也透露了不會放棄Java事業,只是需要解決一些與Oracle之間的法律問題。
這一切跡象表明,Oracle絕對不會輕易放棄Java這塊巨大的蛋糕,並且Oracle也開始逐漸學會了對開源社區的尊重。首先在JDK的商業版本方面,Oracle將會繼續深入挖掘Java的商業利益,與其固有產品進行更深入的整合。在社區版本方面,Oracle將與Java開發者一起探討和研發Java的技術。這里需要特別提到的一個產品是OracleBerkeleyDB,該產品是Oracle一直支持的一個開源非關系資料庫產品,在NOSQL大行其道的今天,如果Oracle能夠將BerkeleyDB與Java進行深入整合,將會為Java帶來更多的活力和生命。從JamesGosling的表現來看,他似乎與Oracle之間已經達成某種諒解,並且有進一步合作的可能性。
java發展
Java在日新月異的IT技術領域內不算年輕,在過去的十幾年中,Java曾憑借開放和跨平台等特性、藉助互聯網蓬勃發展的東風,改變了C/C++稱霸天下的局面,形成Java、C、C++三足鼎立的格局。特別是Java在編程語言排名榜上獨占鰲頭長達10年之久,並幫助Sun奠定了其在IT技術和開源領域的地位,都說明Java在開發領域中的重要性。
在未來發展方向上,Java在Web、移動設備以及雲計算方面前景非常廣闊。雖然面對來自網路的類似於Ruby on Rails這樣編程平台的挑戰,Java依然還是事實上的企業Web開發標准。在Java對新開發者吸引力方面,這么多年以來,Java一直都在面對那些不成熟的,基於腳本的程序語言的挑戰。比如PHP和Ruby,雖然經過多年努力,但是並沒有看到他們相具有比Java更強的競爭力。另一方面,隨著雲計算以及移動領域的擴張,更多的企業在考慮將其應用部署在Java平台上,無論是本地主機,公共雲,Java都是目前最合適的選擇。
事實上Java技術的開放性、安全性和龐大的社會已有資源,以及其跨平台性,即「編寫一次,到處運行」的特點,也使Java技術成為智能手機軟體平台的事實標准。採用Java技術後,編寫應用程序和提供服務的人就不必關心接受其服務的手機採用的是什麼操作系統和晶元,只要按照Java的要求去寫程序就好了;同樣,生產手機的廠商也不必顧慮將來誰來提供增值服務。同時在Oracle的技術投資擔保下,Java也將是企業在雲應用方面迴避微軟平台、在移動應用方面迴避蘋果公司的一個最佳選擇。比如VMware就宣布了一個稱為VMforce的服務,該服務將在雲計算機中布置Java應用,Google應用引擎也將一如既往的支持Java。他們都是微軟提供的,基於.Net和開源PHP語言基礎上的Azure雲平台的競爭對手。此外,進軍傳統的桌面應用仍是Java未來一個努力的方向之一。
JAVA作為主流的商業應用的語言在3G、物聯網時代下煥發出新的生機!
在互聯網時代,JAVA語言已經是使用最廣泛的伺服器端語言。隨著3G、互聯網時代的到來,JAVA語言並不會「過時」,相反,JAVA語言會在新的業務領域有著更輝煌的發展前景。
3G、互聯網的發展不僅僅帶動了「智能手機製造業」、「電信運營業」、「RFID產業」、「嵌入式設備」等硬體或系統軟體行業的發展;更重要的是:3G、互聯網開創了更多、更新的商業領域應用,而這些領域的核心編程語言仍然是JAVA!
在TTS4.0 課程體系中的基於智能手機平台的「航空公司移動服務門戶」項目和基於全球定位、實時訂單跟蹤、RFID倉儲管理等諸多互聯網新技術的「新一代物流管理系統」都是這些新商業應用領域的典型代表。
未來趨勢
對Java來說,2010年是不平凡的一年,從Oracle在年初完成對Sun的收購,使大家對Java的未來充滿了關注,而12月份在北京進行的JavaOne大會,可以說是Oracle在收購Sun之後的第一次正式大會,大家可以從 JavaOne上更多了解了Java未來的發展。而2011年,將成為Java新的開始。
Java走過了它15年的歷程,在日新月異的IT技術領域不算年輕,但它一直沒有停下變革、創新的腳步。Java已經不單單是一種計算機語言,很多情況下,我們稱它是一個平台,一個社區。下面從Java SE、Java EE、Java ME、JavaFX幾個方面,展望Java技術在2011年的發展。
Java SE
從Oracle公布的Java未來戰略我們可以看到,Oracle目標是加強和繼續擴大Java在新領域的應用,並將Java平台納入新的部署架構,加大對 Java社區的投資,允許社區更多地參與。開發人員比較關注的Java SE 7將會在2011年夏天就緒,其中JCP已經批准了JSR 334、JSR 335、JSR 336和JSR 337等,支持改進Java語言和API規范,比如switch in string、multi-catch、泛型實例創建中的precise rethrow、Lambda表達式(閉包)等。而Java SE 8也將在SE 7發布之後的一年到一年半的時間就緒。
模塊化的VM:可以將VM拆分成小塊由應用程序使用,並按需推向Internet,這樣的結果是Java應用程序的啟動時間更短了,當VM不在目標機器上時,下載的時間也更短了。
額外的語言支持:Java平台支持用不同語言編寫的應用程序,未來將會添加更多的語言支持,當然也包括對動態語言的支持,這就是所謂的達芬奇機或多語言虛擬機,請參考JSR-292。
增強的多核支持:需要藉助工具、庫和內置設施幫助新的和現有的Java應用程序更有效地利用多核硬體的優勢,Java的線程模型可以輕松地創建並行執行任務的線程,但你如何將一個單一的任務拆分成多片進行並行執行呢?
其它改進包括持續的性能改進,以及許多語言方面的增強,包括增加的閉包,在switch語句中對Strings的支持,以及多塊異常捕獲,閉包是一個有爭議的功能,它是通過使用匿名的Java內部類實現的。
Java EE
Oracle長期以來一直都是Java的支持者,也是最大的JCP成員之一,10多年前就開始參與Java EE規范的編制,因此對Oracle成為Java中間件市場的大鱷不應該感到意外。
Java EE展望
模塊化,開發標准:Java EE 6通過配置文件(Profile)定義實現了模塊化Java EE,允許廠商根據特定需求創建更小的Java EE堆棧子集,解決成本和Java EE使用復雜問題。通過模塊化設計和定義標准,有助於簡化Java EE,讓它的應用領域更廣泛。
Java EE 6規定了兩種配置文件:Web配置文件(Servlet,JSP和JSF)和Java EE企業配置文件。顯然還可以定義更多的配置文件種類,例如,為支持會話初始化協議(SIP)定義電信伺服器配置文件。
UI和RIA:HTML仍然是Java EE應用程序隱含的UI協議,通常有Java Servlet,JSP和JSF生成,考慮到生產的Web頁面是靜態的,可以使用Ajax技術,不過它已經超出了Java EE的范疇。
雖然Oracle沒有明確這方面的具體計劃,但未來Java EE和JavaFX集成時將會解決Ajax問題。
Java ME
作為 Oracle 首選的移動環境的 Java,這個堆棧未來默認的呈現方式將會是 HTML, CSS 和 Javascript。Java ME 將包含 WebKit 引擎,JavaScript. 引擎,和 Java/JavaScript. 橋,換言之,未來運行新版 Java ME 的手機,將能夠訪問瀏覽器以外的 Web 服務,而不會有任何性能問題。這些引擎將直接插入 Java ME虛擬機和插入 Java FX。
Oracle 的 Java ME 引擎,將利用當代圖形硬體加速器所擅長的(60 frames/秒)二維和三維渲染(在 Windows 環境下,微軟的 Direct X,還有 OpenGL 或未來「更好」的技術)。 Java ME 將會針對 ARM7 和 ARM9晶元組進行優化,包括 Broadcom,三星,NEC,德州儀器,以及其他取得授權的手機部件製造商,還將內置充分利用手機裝置的支付,通話,和定位等功能的 API。
JavaFX
隨著 JavaFX 和 Java 的整合,並運行於 JVM 之上,它的富媒體處理及二維和三維渲染功能,也將能提供給任何在 JVM 上運行的其他編程語言,這意味著,例如 Groovy, Scala 和 JRuby 等也都能用來整合 JavaFX 的能力。
JavaFX展望:
基於可視化組件創建一個設計範式
為JavaFX應用程序創建一個豐富的UI擴展庫
提升所有平台的JavaFX性能
增強跨設備移植JavaFX應用程序的能力
與Java,JavaScript和HTML 5無縫集成
支持新興設備和UI範式(如多點觸摸)
⑶ 請推薦java消息隊列
要求:
可持久化:數據不會丟失
簡單:不需安裝、不需要資料庫、最好是基於文件的
高效:支持大數據量的插入、讀取和刪除(支持每秒1000條的插入和刪除的並發操作),如果可以進行簡單的排序就更好了。
最好是第三方
jar
包,引入到項目中就可以使用。
消息隊列:消拍則息隊列是利用文件持久化技術,將用戶數據通過隨機訪問機制緩存到磁碟,同時在內存保留索引作為查詢依缺賀液伏物據的一種機制
目前已經嘗試了,文件、BerkeleyDB、JMS等作為隊列,均不能達到滿意的效果。
希望有該方面經驗的朋友給推薦一下。
回答問題的朋友,請不要直接粘貼網上的文章。最好自己使用或測試過,性能可靠的再發上來。拜託了
⑷ java開源的其它
Quartz 【Java開源 Job調度】
Quartz是OpenSymphony開源組織在Job scheling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的日程序表。Jobs可以做成標準的Java組件或 EJBs。Quartz的最新版本為Quartz 1.5.0。
Velocity 【Java開源 模板引擎】
Velocity是一個基於java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。 當Velocity應用於web開發時,界面設計人員可以和java程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由java程序開發人員關注業務邏輯編碼。Velocity將java代碼從web頁面中分離出來,這樣為web站點的長期維護提供了便利,同時也為我們在JSP和PHP之外又提供了一種可選的方案。 Velocity的能力遠不止web站點開發這個領域,例如,它可以從模板(template)產生SQL和PostScript、XML,它也可以被當作一個獨立工具來產生源代碼和報告,或者作為其他系統的集成組件使用。Velocity也可以為Turbine web開發架構提供模板服務(template service)。Velocity+Turbine提供一個模板服務的方式允許一個web應用以一個真正的MVC模型進行開發。 【VeloEclipse :Velocity在Eclipse平台下的一個輔助開發插件】
Roller Weblogger 【Java開源 Blog博客】
這個weblogging 設計得比較精巧,源代碼是很好的學習資料。它支持weblogging應有的特性如:評論功能,所見即所得HTML編輯,TrackBack,提供頁面模板,RSS syndication,blogroll管理和提供一個XML-RPC 介面。
XPlanner 【Java開源 項目管理】
XPlanner 一個基於Web的XP團隊計劃和跟蹤工具。XP獨特的開發概念如iteration、user stories等,XPlanner都提供了相對應的的管理工具,XPlanner支持XP開發流程,並解決利用XP思想來開發項目所碰到的問題。XPlanner特點包括:簡單的模型規劃,虛擬筆記卡(Virtual note cards),iterations、user stories與工作記錄的追蹤,未完成stories將自動迭代,工作時間追蹤,生成團隊效率,個人工時報表,SOAP界面支持。
JOnAS 【Java開源 J2EE伺服器】
JOnAS是一個開放源代碼的J2EE實現,在ObjectWeb協會中開發。整合了Tomcat或Jetty成為它的Web容器,以確保符合Servlet 2.3和JSP 1.2規范。JOnAS伺服器依賴或實現以下的Java API:JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。
FreeMarker 【Java開源 模板引擎】
FreeMarker允許Java servlet保持圖形設計同應用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用servlet提供的數據動態地生成 HTML。模板語言是強大的直觀的,編譯器速度快,輸出接近靜態HTML頁面的速度。
【FreeMarker Eclipse Plugin與FreeMarker IDE:Eclipse平台下的輔助開發工具】
Lucene 【Java開源 全文檢索】
Apache Lucene是一個開放源程序的搜尋器引擎,利用它可以輕易地為Java軟體加入全文搜尋功能。Lucene的最主要工作是替文件的每一個字作索引,索引讓搜尋的效率比傳統的逐字比較大大提高,Lucen提供一組解讀,過濾,分析文件,編排和使用索引的API,它的強大之處除了高效和簡單外,是最重要的是使使用者可以隨時應自己需要自訂其功能。
Beanshell 【Java開源 動態語言】
Beanshell是用Java寫成的,一個小型的、免費的、可以下載的、嵌入式的Java源代碼解釋器,具有對象腳本語言特性。BeanShell執行標准Java語句和表達式,另外包括一些腳本命令和語法。它將腳本化對象看作簡單閉包方法(simple method closure)來支持,就如同在Perl和JavaScript中的一樣。它具有以下的一些特點:使用Java反射API以提供Java語句和表達式的實時解釋執行;可以透明地訪問任何Java對象和API;可以在命令行模式、控制台模式、小程序模式和遠程線程伺服器模式等四種模式下面運行;與在應用程序中一樣,可以在小程序中(Applet)正常運行(無需編譯器或者類裝載器);非常精簡的解釋器jar文件大小為175k
Big Two 【Java開源 Java游戲】
採用Java開發的中國式紙牌升級游戲。源碼下載
JBoss SSO Framework 【Java開源 身份認證管理】
JBoss SSO Framework是一個組件集能夠很容易集成到現有的web應用中提供單一登錄功能.該框架已經能夠支持一些重要的SSO標准如SAML。整個系統包括以下組件:
1.聯合伺服器(Federation Server)– 一個聯合伺服器用於為放置在不同安全域(security domain)中的web應用程序安全地傳播Federation Token。
2.Token編排框架(Token Marshalling Framework)– 這是一組靈活的/可插件的Java API用來marshal/unmarshal一個Federation Token。該系統默認提供一個SAML兼容的編排器(Marshaller) 。
3.身份管管理框架(Identity Management Framework)–這是一組靈活的/可插件的Java API用來連接中中央身份存儲庫(Identity Store)。該系統默認提供一個Provider來連接基於LDAP的身份存儲庫。
JawFlow 【Java開源 開源工作流】
JawFlow是一個部分遵循WfMC規范,採用JMX技術開發的工作流引擎。它能夠解析XPDL,並能夠用Java或BSF支持的腳本語言來自定義行為。
rails-asyncweb 【Java開源 Web伺服器】
用於JRuby on Rails的一個快速Http伺服器。
jBatchEngine 【Java開源 Job調度】
jBatchEngine是一個採用Java開發的批任務spooler。jBatchEngine與其它以時間為驅動的Job調度引擎不同之處在於它是以事件以驅動,可用於啟動任何批處理程序。jBatchEngine可以安裝成一個Windows Service或一個Unix Daemon。
Gant 【Java開源 項目構建】
Gant是一個基於Ant的構建工具,它採用Groovy腳本代替XML來編寫構建邏輯。 Gant完全依賴於Ant task來做真正的事情,所以你如果用Ant實現構建,但不喜歡用XML構建文件,Gant是一個不錯的選擇。
Jaxmao 【Java開源 Web伺服器】
Tomcat是開源的JSP/Servlet伺服器。多年的開發使Tomcat已越來越完善,被越來越多的網站採用。Jaxmao(中文版Tomcat)項目的任務是為Tomcat提供一個友好的中文界面,推廣Tomcat在中文JSP/Serlet 開發者中的使用。
Metanotion BlockFile 【Java開源 DBMS資料庫】
BlockFile一個100%純Java,輕量級,單個文件嵌入式資料庫。它的功能介於SQLite與BerkeleyDB之間。專門為PDA和Mobile應用程序而開發。
JRuleEngine 【Java開源 規則引擎】
JRuleEngine基於JSR94規范的java規則引擎。
JBasic 【Java開源 動態語言】
JBasic是一個完全採用Java開發的BASIC語言解釋器。JBasic可運行在大部分Unix系統(包括Mac OS X),Windows command shell,或VMS DCL command line。
jSoapServer 【Java開源 Web Service】
jSoapServer這個Java類包可以集成到Java應用程序中為外部程序提供一個SOAP介面。jSoapServer是一個獨立的SOAP伺服器,因此不需要讓Java程序運行在像Tomcat這樣的容器中。
Artistic Style 【Java開源 代碼優化】
Artistic Style是一個C,C++,C#和Java源代碼縮排/格式化/美化工具。
JLoom 【Java開源 模板引擎】
JLoom是一個採用類似於JSP語法的模板引擎。參數可以是任何Java類型,甚至是泛型(generic)。JLoom還提供一個Eclipse插件來輔助開發。
Liquid look&feel 【Java開源 Swing外觀】
基於Mosfet Liquid KDE 3.x主題的Swing外觀。
MicroNova YUZU 【Java開源 JSP標簽】
MicroNova YUZU開源基於EL的JSP標簽庫。這是一個增強的JSTL(兼容JSP1.2與JSP 2.0)。
⑸ java的作用是什麼
Java 是一種編程語言,它本身的作用是通過編寫應用程序
幫助人們解決日常工作、生活和學習遇到的問題