88250

          Java

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            82 隨筆 :: 0 文章 :: 5 評(píng)論 :: 0 Trackbacks

          2011年1月5日 #



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/netbeans-chinese-newsletter-134.html
          posted @ 2011-01-26 00:32 88250 閱讀(279) | 評(píng)論 (0)編輯 收藏

          上周硅谷非常熱鬧,重大消息頻繁出現(xiàn),其中包括了喬布斯因病休假,蘋果的恐怖財(cái)報(bào)等等。對(duì)于我們所關(guān)心的移動(dòng)業(yè)界跟互聯(lián)網(wǎng)來(lái)說(shuō),Google 換帥是另外一個(gè)重量級(jí)消息。

          Quora 上有一個(gè)討論串,題目是“Larry Page 上任之后,Google 的重點(diǎn)應(yīng)該是什么?”,討論相當(dāng)活躍。我也在這里湊個(gè)熱鬧,談一談在我看來(lái),Larry Page 應(yīng)該如何去改變 Google。

          download (4).png

          1:關(guān)注核心業(yè)務(wù),也就是搜索

          Google 前段時(shí)間在搜索結(jié)果上算是飽受攻擊,由于與日俱增的垃圾內(nèi)容,搜索結(jié)果的污染狀況越發(fā)嚴(yán)重。Stack Overflow 的創(chuàng)始人之一 Jeff Atwood 在一篇文章里這樣評(píng)價(jià) Google 現(xiàn)在的搜索結(jié)果:

          Google ,這個(gè)曾經(jīng)的必備工具,某種程度上已經(jīng)失去了它的優(yōu)勢(shì)地位。垃圾內(nèi)容制造者、以點(diǎn)擊率為終極目標(biāo)的內(nèi)容聚合站點(diǎn)正在走向勝利。

          在 這一點(diǎn)上來(lái)說(shuō),ifanr 感同身受。作為內(nèi)容提供者,我們是創(chuàng)造價(jià)值的人,是在給互聯(lián)網(wǎng)不斷添磚加瓦的一方。而之前在 Google 里搜索我們的原創(chuàng)文章,出現(xiàn)在結(jié)果最頂端的卻往往是是通過(guò)拷貝+粘貼、有時(shí)候還不注明出處進(jìn)行轉(zhuǎn)載的內(nèi)容聚合站點(diǎn)。它們用毫無(wú)成本的方式奪取著應(yīng)該屬于原 作者的訪問量。

          好在 Google 似乎已經(jīng)認(rèn)識(shí)到了這一點(diǎn)。之前搜索質(zhì)量組的 Matt Cutts 表示他 們已經(jīng)意識(shí)到了垃圾內(nèi)容的增多,以及劣質(zhì)內(nèi)容聚合站點(diǎn)引發(fā)的不滿,并且會(huì)很快進(jìn)行處理。從我今早的實(shí)驗(yàn)來(lái)看,似乎 Google 已經(jīng)采取了措施,最近 ifanr 的原創(chuàng)文章都出現(xiàn)在首頁(yè)頭條。從根子上(點(diǎn)擊量帶來(lái)的經(jīng)濟(jì)利益)驅(qū)逐劣質(zhì)內(nèi)容聚合站點(diǎn),對(duì)現(xiàn)代互聯(lián)網(wǎng)來(lái)說(shuō),確實(shí)是件好事

          搜索,是 Google 的立身之本,從上周發(fā)布的財(cái)報(bào)來(lái)看,Google 收入的主要增長(zhǎng)點(diǎn)仍然是在網(wǎng)站本身的業(yè)務(wù)。不斷改進(jìn)搜索,添加新的搜索方式,才能保持和增強(qiáng) Google 在這個(gè)領(lǐng)域的領(lǐng)導(dǎo)地位。后院不起火,才有在其他領(lǐng)域發(fā)展的資本。

          2323.jpg

          這一條,是 Larry Page 上任以后最需要關(guān)注的。未來(lái)十年的搜索是什么樣子?如何提高內(nèi)容關(guān)聯(lián)性,改進(jìn)使用體驗(yàn)?怎么樣通過(guò)創(chuàng)新,把 Bing 等競(jìng)爭(zhēng)對(duì)手遠(yuǎn)遠(yuǎn)甩開,對(duì) Google 來(lái)說(shuō),至關(guān)重要。

          2:在社交網(wǎng)絡(luò)方面另辟蹊徑

          Google 在社交網(wǎng)絡(luò)方面的試探,到目前為止都是悲劇,坦率地說(shuō),我個(gè)人認(rèn)為Google 已經(jīng)錯(cuò)過(guò)了第一班社交網(wǎng)絡(luò)的列車。

          RIP-Google-Wave-Dead.jpg

          作為新生事物的社交網(wǎng)絡(luò),從一開始負(fù)載的是用戶虛擬交流的需求。

          目 前的勝利者里面,F(xiàn)acebook 滿足了人們交流的愿望,利用網(wǎng)絡(luò),表現(xiàn)了某種程度上真實(shí)的人與人關(guān)系,而大量互動(dòng)元素的引入,則是模擬了現(xiàn)實(shí)生活的部分人際往來(lái),從根底上來(lái)說(shuō),沒有理念 上的創(chuàng)新,然而它仍然足夠偉大,F(xiàn)acebook 把現(xiàn)實(shí)生活成功投影到了虛擬世界,是真正意義上的創(chuàng)造者。

          另一個(gè)贏家是 Twitter,它滿足的,是人們表達(dá)自己的愿望。通過(guò)簡(jiǎn)短的 140 個(gè)字,人與人之間形成了一種奇妙的交流關(guān)系,普通人也可以第一時(shí)間見證重大事件。可以說(shuō),Twitter 與智能手機(jī)的結(jié)合,創(chuàng)造了一種新媒體。表達(dá)自己,記錄周邊,關(guān)注別人,是 Twitter 類社交網(wǎng)絡(luò)的根本。無(wú)論是變種的 foursquare,還是 Quora,從理念上看,都是這樣的東西。

          Google 之前的嘗試呢? Wave 那個(gè)體驗(yàn)一塌糊涂的東西不去說(shuō)它,出生太早了;Buzz 則是無(wú)限制版本的 Twitter:Google 試圖利用現(xiàn)成的龐大用戶群,但沒有實(shí)質(zhì)性創(chuàng)新,再加上拙劣的整合方式,這個(gè)產(chǎn)品的前景樂觀不到哪兒去。

          社交網(wǎng)絡(luò)走到現(xiàn)在,實(shí)際上已經(jīng)到了一個(gè)重要的關(guān)口,即:虛擬的內(nèi)容如何與現(xiàn)實(shí)社會(huì)結(jié)合起來(lái),怎樣把線上關(guān)系與實(shí)體經(jīng)濟(jì)整合,創(chuàng)造出一個(gè)嶄新的商業(yè)模式。在我看來(lái),這才是第二代社交網(wǎng)絡(luò),也即成熟版本的社交網(wǎng)絡(luò)。這個(gè)方向是未來(lái)兩年的熱點(diǎn),也是 Google 下一步可以突圍的角度。

          Google 的最大優(yōu)勢(shì)是什么?大家應(yīng)該都非常清楚,其一是龐大的用戶群,其二就是信息了。Google 相對(duì)于 Twittter、fousquare 等來(lái)說(shuō),先天就有信息方面的優(yōu)勢(shì)。而 Google 在建設(shè)社交網(wǎng)絡(luò)的時(shí)候,卻完全忽略了這個(gè)優(yōu)勢(shì),捆著手腳去從頭開始跟已經(jīng)成熟的對(duì)手競(jìng)爭(zhēng),怎么可能勝利?

          舉個(gè)最簡(jiǎn)單的例子,Google Maps 信息豐富,我經(jīng)常用它來(lái)尋找晚餐地點(diǎn),最大的好處之一就是可以看到多個(gè)網(wǎng)站的用戶評(píng)價(jià),看看截圖:

          Untitled-1.jpg

          看 到了吧,有 Buzz 選項(xiàng),然而搞笑的事來(lái)了。我可以看到其他網(wǎng)站的評(píng)價(jià),可以在 Buzz 上分享這個(gè)地點(diǎn),然后呢?沒了。我完全看不到 Buzz 關(guān)于這個(gè)餐館的討論,看不到我分享以后朋友的看法——一點(diǎn)也沒有。實(shí)體經(jīng)濟(jì)方面的內(nèi)容本身就是 Google 的長(zhǎng)項(xiàng),然而在它的任何產(chǎn)品里面,都沒有把這個(gè)長(zhǎng)處跟自己的社交網(wǎng)絡(luò)更緊密得結(jié)合起來(lái)。

          放著龐大的現(xiàn)實(shí)數(shù)據(jù)不用,幾個(gè)產(chǎn)品之間幾乎沒有交流,捧著金飯碗要飯,這就是 Google 的社交網(wǎng)絡(luò)。跟現(xiàn)實(shí)社會(huì)結(jié)合的社交網(wǎng)絡(luò),將是 Google 在這一領(lǐng)域的最后一個(gè)機(jī)會(huì)。

          3:細(xì)節(jié),細(xì)節(jié),還是細(xì)節(jié)

          有一句老話,細(xì)節(jié)決定成敗,然而 Google 現(xiàn)在的很多做法,卻表現(xiàn)了一種對(duì)細(xì)節(jié)的漠視,極大影響了產(chǎn)品的使用體驗(yàn)。還是要以 Android 為例(這玩意簡(jiǎn)直就是反面教材):

          就從簡(jiǎn)單的設(shè)置界面說(shuō)起。Android 平鋪直敘的設(shè)置界面,完全沒有突出重點(diǎn)(我甚至懷疑這幫人安排順序的時(shí)候是不是拍腦門做出的決定。),跟右邊的 iOS 比,孰優(yōu)孰劣,一目了然。

          Untitled-2.jpg

          還有應(yīng)用市場(chǎng),每次談到 Android 的應(yīng)用市場(chǎng),我都有爆粗口的沖動(dòng)。緩慢的速度、時(shí)常丟失的已下載應(yīng)用列表、遲遲沒有解決的應(yīng)用無(wú)法下載問題……這是整個(gè)產(chǎn)業(yè)的核心之一,Google 就準(zhǔn)備這么糊弄下去?

          Android 不講究的地方何止這些,工程師文化并不代表著可以不拘小節(jié),Google 的目光,應(yīng)該多放些在細(xì)節(jié)上。移動(dòng)設(shè)備,用戶體驗(yàn)至關(guān)重要。

          4: 繼續(xù)擁抱云,下注新能源產(chǎn)業(yè)

          在這個(gè)賣雜貨的、搞 B2C 的、做軟件的都在搞云應(yīng)用平臺(tái)的當(dāng)口,互聯(lián)網(wǎng)界巨頭,擁抱云的先驅(qū)之一,可能擁有著世界上最好硬件以及網(wǎng)絡(luò)設(shè)施的 Google,當(dāng)然也擁有自家的 App Engine。

          download (3).png

          云 計(jì)算平臺(tái)對(duì)于中小企業(yè)、個(gè)人的意義,無(wú)論如何贊揚(yáng)也不會(huì)過(guò)分,它直接引領(lǐng)了當(dāng)前的互聯(lián)網(wǎng)創(chuàng)業(yè)潮。低廉的平臺(tái)成本,按需付費(fèi)的方式,Amazon EC2 吸引了大量的個(gè)人開發(fā)者,Google 的 App Engine 當(dāng)然不錯(cuò),但我要說(shuō),還是不夠靈活,如果能提供更多語(yǔ)言支持,就再好不過(guò)了。

          新能源很好理解,隨著碳交易市場(chǎng)的興起,碳排放量眼看就要變成金融市場(chǎng)上的一個(gè)新產(chǎn)品。在這個(gè)趨勢(shì)影響下,每個(gè)企業(yè)都應(yīng)該考慮下自己的能源來(lái)源,為將來(lái)更加嚴(yán)格的排放調(diào)控措施做好準(zhǔn)備,規(guī)避可能的經(jīng)濟(jì)風(fēng)險(xiǎn)。

          data-center.jpg

          降低所消耗能源的碳排放,對(duì)于 Google 這種能源消耗大戶來(lái)說(shuō),是經(jīng)濟(jì)跟政治上都很正確的方向,而且同樣有大量的利益存在。新能源產(chǎn)業(yè),應(yīng)該成為 Google 下一步的重點(diǎn)投入方向。

          5:提高決策速度與質(zhì)量,減少內(nèi)部溝通環(huán)節(jié)

          大 家都知道 Google 著名的 20% 規(guī)則:?jiǎn)T工可以把 20% 的上班時(shí)間放在其他項(xiàng)目上。Google 的員工無(wú)疑是優(yōu)秀的,這些業(yè)余時(shí)間做出的項(xiàng)目也應(yīng)該有很多不錯(cuò)的點(diǎn)子,然而,從中孵化的成果卻并不多。其中的部分原因,恐怕與 Google 的內(nèi)部引導(dǎo)以及溝通機(jī)制存在很大的關(guān)系。由于缺乏引導(dǎo),員工的項(xiàng)目往往與 Google 本身沒什么聯(lián)系,而因?yàn)闇贤▎栴},好的項(xiàng)目不一定能夠獲得公司的幫助。

          Google 的前員工遍布整個(gè)互聯(lián)網(wǎng)業(yè)界,大量創(chuàng)新卻往往出現(xiàn)在他們離開 Google 以后。應(yīng)該如何去引發(fā)員工的創(chuàng)造力、提高內(nèi)部效率跟執(zhí)行力度,Larry Page 需要仔細(xì)考慮,以便調(diào)整內(nèi)部架構(gòu)來(lái)適應(yīng)這個(gè)變化迅速的世界。三星這個(gè)反應(yīng)快到根本不像大公司的大公司在全世界攻城掠地,諾基亞反應(yīng)稍微遲緩一點(diǎn)就束手束 腳,Google,你要快一點(diǎn),再快一點(diǎn),才能跟 Facebook 以及數(shù)以千計(jì)的創(chuàng)業(yè)企業(yè)進(jìn)行競(jìng)爭(zhēng)。

          轉(zhuǎn)自:http://www.oschina.net/news/14996/larry-page-google-five-things-todo



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/larry-page-google-five-things-todo.html
          posted @ 2011-01-25 09:21 88250 閱讀(280) | 評(píng)論 (0)編輯 收藏

          沒有人能說(shuō)清哪種緩存算法優(yōu)于其他的緩存算法。(以下的幾種緩存算法,有的我也理解不好,如果感興趣,你可以Google一下)

          Least Frequently Used(LFU):

          大家好,我是 LFU,我會(huì)計(jì)算為每個(gè)緩存對(duì)象計(jì)算他們被使用的頻率。我會(huì)把最不常用的緩存對(duì)象踢走。

          Least Recently User(LRU):

          我是LRU緩存算法,我把最近最少使用的緩存對(duì)象給踢走。

          我總是需要去了解在什么時(shí)候,用了哪個(gè)緩存對(duì)象。如果有人想要了解我為什么總能把最近最少使用的對(duì)象踢掉,是非常困難的。

          瀏覽器就是使用了我(LRU)作為緩存算法。新的對(duì)象會(huì)被放在緩存的頂部,當(dāng)緩存達(dá)到了容量極限,我會(huì)把底部的對(duì)象踢走,而技巧就是:我會(huì)把最新被訪問的緩存對(duì)象,放到緩存池的頂部。

          所以,經(jīng)常被讀取的緩存對(duì)象就會(huì)一直呆在緩存池中。有兩種方法可以實(shí)現(xiàn)我,array 或者是 linked list。

          我的速度很快,我也可以被數(shù)據(jù)訪問模式適配。我有一個(gè)大家庭,他們都可以完善我,甚至做的比我更好(我確實(shí)有時(shí)會(huì)嫉妒,但是沒關(guān)系)。我家庭的一些成員包括LRU2 和 2Q,他們就是為了完善 LRU 而存在的。

          Least Recently Used 2(LRU2):

          我是 Least Recently Used 2,有人叫我最近最少使用twice,我更喜歡這個(gè)叫法。我會(huì)把被兩次訪問過(guò)的對(duì)象放入緩存池,當(dāng)緩存池滿了之后,我會(huì)把有兩次最少使用的緩存對(duì)象踢走。 因?yàn)樾枰檶?duì)象2次,訪問負(fù)載就會(huì)隨著緩存池的增加而增加。如果把我用在大容量的緩存池中,就會(huì)有問題。另外,我還需要跟蹤那么不在緩存的對(duì)象,因?yàn)樗?們還沒有被第二次讀取。我比LRU好,而且是 adoptive to access 模式 。

          Two Queues(2Q):

          我是 Two Queues;我把被訪問的數(shù)據(jù)放到LRU的緩存中,如果這個(gè)對(duì)象再一次被訪問,我就把他轉(zhuǎn)移到第二個(gè)、更大的LRU緩存。

          我踢走緩存對(duì)象是為了保持第一個(gè)緩存池是第二個(gè)緩存池的1/3。當(dāng)緩存的訪問負(fù)載是固定的時(shí)候,把 LRU 換成 LRU2,就比增加緩存的容量更好。這種機(jī)制使得我比 LRU2 更好,我也是 LRU 家族中的一員,而且是 adoptive to access 模式 。

          Adaptive Replacement Cache(ARC):

          我是 ARC,有人說(shuō)我是介于 LRU 和 LFU 之間,為了提高效果,我是由2個(gè) LRU 組成,第一個(gè),也就是 L1,包含的條目是最近只被使用過(guò)一次的,而第二個(gè) LRU,也就是 L2,包含的是最近被使用過(guò)兩次的條目。因此, L1 放的是新的對(duì)象,而 L2 放的是常用的對(duì)象。所以,別人才會(huì)認(rèn)為我是介于 LRU 和 LFU 之間的,不過(guò)沒關(guān)系,我不介意。

          我被認(rèn)為是性能最好的緩存算法之一,能夠自調(diào),并且是低負(fù)載的。我也保存著歷史對(duì)象,這樣,我就可以記住那些被移除的對(duì)象,同時(shí),也讓我可以看到被移除的對(duì)象是否可以留下,取而代之的是踢走別的對(duì)象。我的記憶力很差,但是我很快,適用性也強(qiáng)。

          Most Recently Used(MRU):

          我是 MRU,和 LRU 是對(duì)應(yīng)的。我會(huì)移除最近最多被使用的對(duì)象,你一定會(huì)問我為什么。好吧,讓我告訴你,當(dāng)一次訪問過(guò)來(lái)的時(shí)候,有些事情是無(wú)法預(yù)測(cè)的,并且在緩存系統(tǒng)中找出最少最近使用的對(duì)象是一項(xiàng)時(shí)間復(fù)雜度非常高的運(yùn)算,這就是為什么我是最好的選擇。

          我是數(shù)據(jù)庫(kù)內(nèi)存緩存中是多么的常見!每當(dāng)一次緩存記錄的使用,我會(huì)把它放到棧的頂端。當(dāng)棧滿了的時(shí)候,你猜怎么著?我會(huì)把棧頂?shù)膶?duì)象給換成新進(jìn)來(lái)的對(duì)象!

          First in First out(FIFO):

          我是先進(jìn)先出,我是一個(gè)低負(fù)載的算法,并且對(duì)緩存對(duì)象的管理要求不高。我通過(guò)一個(gè)隊(duì)列去跟蹤所有的緩存對(duì)象,最近最常用的緩存對(duì)象放在后面,而更早的緩存對(duì)象放在前面,當(dāng)緩存容量滿時(shí),排在前面的緩存對(duì)象會(huì)被踢走,然后把新的緩存對(duì)象加進(jìn)去。我很快,但是我并不適用。

          Second Chance:

          大家好,我是 second chance,我是通過(guò)FIFO修改而來(lái)的,被大家叫做 second chance 緩存算法,我比 FIFO 好的地方是我改善了 FIFO 的成本。我是 FIFO 一樣也是在觀察隊(duì)列的前端,但是很FIFO的立刻踢出不同,我會(huì)檢查即將要被踢出的對(duì)象有沒有之前被使用過(guò)的標(biāo)志(1一個(gè)bit表示),沒有沒有被使用 過(guò),我就把他踢出;否則,我會(huì)把這個(gè)標(biāo)志位清除,然后把這個(gè)緩存對(duì)象當(dāng)做新增緩存對(duì)象加入隊(duì)列。你可以想象就這就像一個(gè)環(huán)隊(duì)列。當(dāng)我再一次在隊(duì)頭碰到這個(gè) 對(duì)象時(shí),由于他已經(jīng)沒有這個(gè)標(biāo)志位了,所以我立刻就把他踢開了。我在速度上比FIFO快。

          CLock

          我是Clock,一個(gè)更好的FIFO,也比 second chance更好。因?yàn)槲也粫?huì)像second chance那樣把有標(biāo)志的緩存對(duì)象放到隊(duì)列的尾部,但是也可以達(dá)到second chance的效果。

          我持有一個(gè)裝有緩存對(duì)象的環(huán)形列表,頭指針指向列表中最老的緩存對(duì)象。當(dāng)緩存miss發(fā)生并且沒有新的緩存空間時(shí),我會(huì)問問指針指向的緩存對(duì)象的標(biāo) 志位去決定我應(yīng)該怎么做。如果標(biāo)志是0,我會(huì)直接用新的緩存對(duì)象替代這個(gè)緩存對(duì)象;如果標(biāo)志位是1,我會(huì)把頭指針遞增,然后重復(fù)這個(gè)過(guò)程,知道新的緩存對(duì) 象能夠被放入。我比second chance更快。

          Simple time-based:

          我是 simple time-based 緩存算法,我通過(guò)絕對(duì)的時(shí)間周期去失效那些緩存對(duì)象。對(duì)于新增的對(duì)象,我會(huì)保存特定的時(shí)間。我很快,但是我并不適用。

          Extended time-based expiration:

          我是 extended time-based expiration 緩存算法,我是通過(guò)相對(duì)時(shí)間去失效緩存對(duì)象的;對(duì)于新增的緩存對(duì)象,我會(huì)保存特定的時(shí)間,比如是每5分鐘,每天的12點(diǎn)。

          Sliding time-based expiration:

          我是 sliding time-based expiration,與前面不同的是,被我管理的緩存對(duì)象的生命起點(diǎn)是在這個(gè)緩存的最后被訪問時(shí)間算起的。我很快,但是我也不太適用。

          好了!聽了那么多緩存算法的自我介紹,其他的緩存算法還考慮到了下面幾點(diǎn):

          • 成本。如果緩存對(duì)象有不同的成本,應(yīng)該把那些難以獲得的對(duì)象保存下來(lái)。
          • 容量。如果緩存對(duì)象有不同的大小,應(yīng)該把那些大的緩存對(duì)象清除,這樣就可以讓更多的小緩存對(duì)象進(jìn)來(lái)了。
          • 時(shí)間。一些緩存還保存著緩存的過(guò)期時(shí)間。電腦會(huì)失效他們,因?yàn)樗麄円呀?jīng)過(guò)期了。

          根據(jù)緩存對(duì)象的大小而不管其他的緩存算法可能是有必要的。

          原文:http://www.zavakid.com/27



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/general-cache-algorithms.html
          posted @ 2011-01-21 14:13 88250 閱讀(2768) | 評(píng)論 (0)編輯 收藏



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/netbeans-chinese-newsletter-133.html
          posted @ 2011-01-20 00:19 88250 閱讀(254) | 評(píng)論 (0)編輯 收藏

          提交 B3log Solo(運(yùn)行在 GAE/J 上的博客程序) 代碼后發(fā)現(xiàn) Google Code 版本控制系統(tǒng)會(huì)將提交日志同步發(fā)布到 Google Buzz 中:

          code-buzz.png

          但在 Buzz connected sites 里并沒有看到與 Google Code 關(guān)聯(lián):

          buzz-connected.png

           

          現(xiàn)在一提交代碼就 Buzz,還是比較無(wú)奈的....



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/code-buzz.html
          posted @ 2011-01-14 10:04 88250 閱讀(219) | 評(píng)論 (0)編輯 收藏



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/netbeans-chinese-newsletter-132.html
          posted @ 2011-01-11 22:09 88250 閱讀(266) | 評(píng)論 (0)編輯 收藏

          有時(shí)我們需要隨機(jī)地獲取數(shù)據(jù)記錄(實(shí)體),比如博客程序中的“隨機(jī)文章”的實(shí)現(xiàn)。

          目前 GAE 并沒有 API 可以直接獲取隨機(jī)實(shí)體,要實(shí)現(xiàn)這樣的需求我們只能自己想辦法了 :-)

          在 stackoverflow 上也有人提過(guò)該問題,總結(jié)如下:

          • Generate and store a random number on your entities as you create them, then pick a random number and look (via a query) for the closet record(s) to it.
          • Implement some mechanism to ensure your entity ids are "densely" populated, then fetch within the known range using keys.
          • Periodically generate random lists of the entities and return entities from those lists. This may take the form of a stack that entities are popped off of, or as actual lists that are returned.

          目前 B3log Solo 在處理“隨機(jī)閱讀”上采用的是方法一,即在每個(gè)文章實(shí)體上添加一個(gè)屬性保存 0-1 的隨機(jī)浮點(diǎn)數(shù)。

          在獲取隨機(jī)文章時(shí)生成一個(gè) 0-1 的隨機(jī)數(shù)(mid)作為查詢條件,以此查詢條件作為邊界(0 <= mid <=1)來(lái)過(guò)濾實(shí)體保存的隨機(jī)值屬性。

          這個(gè)方法基本可以達(dá)到隨機(jī)的效果了,為了讓隨機(jī)的效果更動(dòng)態(tài)一點(diǎn),我們可以考慮經(jīng)常更新文章實(shí)體中的隨機(jī)浮點(diǎn)值:

          • 訪問文章時(shí)(即在更新文章瀏覽次數(shù)時(shí)一并更新該文章的隨機(jī)浮點(diǎn)值)
          • 后臺(tái)定時(shí)任務(wù)(獲取一定數(shù)量的隨機(jī)文章然后更新它們的隨機(jī)浮點(diǎn)值)
          • 用戶做文章更新時(shí)

          加上以上處理后,隨機(jī)的效果比較好了 :-)



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/get-gae-random-entities.html
          posted @ 2011-01-10 21:16 88250 閱讀(233) | 評(píng)論 (0)編輯 收藏

          作者 榮浩 發(fā)布于 2010年12月28日 上午12時(shí)0分

          對(duì)jBPM來(lái)說(shuō),今年最大的事件莫過(guò)于jBPM的創(chuàng)建者Tom Baeyens離開JBoss了。Tom Baeyens離開的具體原因尚不清楚,但他的離開產(chǎn)生了兩個(gè)結(jié)果:一是jBPM的下一個(gè)版本jBPM5完全放棄了jBPM4的基礎(chǔ)代碼,基于Drools Flow重頭來(lái)過(guò);二是Tom Baeyens加入Alfresco后很快推出了新的基于jBPM4的開源工作流系統(tǒng)Activiti。 由此不難推測(cè)Tom Baeyens離開的部分原因:JBoss內(nèi)部對(duì)jBPM未來(lái)版本的架構(gòu)實(shí)現(xiàn)產(chǎn)生了嚴(yán)重的意見分歧。更加巧合的是12月1日Activiti5剛發(fā)布,緊 接著12月2日jBPM5就發(fā)布了第一個(gè)候選發(fā)布版本,jBPM與Activiti之間的微妙關(guān)系可見一般。

          在這篇文章里,我們將一起回顧jBPM從jBPM3到j(luò)BPM5以及Activiti5的發(fā)展歷程,我們可以清晰的看見jBPM(包括 Activiti)設(shè)計(jì)所遵循的一致原則:強(qiáng)調(diào)流程服務(wù)的可嵌入性和可擴(kuò)展性。同時(shí),從各個(gè)版本之間的變化我們也能看見產(chǎn)品設(shè)計(jì)思路的變化:更加強(qiáng)調(diào)面向 業(yè)務(wù)人員,增加BPMS(業(yè)務(wù)流程管理系統(tǒng))特性。

          在回顧之前,我們首先討論一下BPMS應(yīng)該嵌入還是獨(dú)立部署的問題,因?yàn)椴还苁莏BPM還是Activiti,都強(qiáng)調(diào)了流程服務(wù)的可嵌入性。此外,我們還需要討論一下什么是BPMS的特性,它們所解決的問題是什么。

          一、嵌入式還是獨(dú)立部署?

          不管是jBPM還是Activiti,都強(qiáng)調(diào)了流程服務(wù)的可嵌入性。Tom Baeyens在其個(gè)人博客里稱作為獨(dú)立部署的BPMS已死,原因有兩個(gè):一是獨(dú)立部署的BPMS需要很高的安裝使用成本,需要獨(dú)立部署、需要用戶支出大 量的培訓(xùn)成本和維護(hù)成本;二是獨(dú)立部署的BPMS與外部系統(tǒng)的交互方式是分布式,這使得很多問題變得復(fù)雜,例如分布式事務(wù)。Tom Baeyens代表了相當(dāng)一部分人特別是開發(fā)人員的觀點(diǎn)。

          Tom Baeyens沒有完全理解BPMS。什么是BPMS?BPMS最重要的目標(biāo)就是需要打破各個(gè)應(yīng)用系統(tǒng)(CRM、ECM、ERP、SCM)之間的界線,將 分散在這些系統(tǒng)中的流程集中管理,這是BPMS的實(shí)質(zhì)。一如流程再造,打破各個(gè)部門之間的壁壘,減少浪費(fèi),建立流程驅(qū)動(dòng)性的組織。如下圖1所示:

          圖 1:BPMS打破應(yīng)用系統(tǒng)之間的界線

          BPMS所要解決的問題要求其必然是獨(dú)立部署的。Tom Baeyens錯(cuò)誤的根本原因在于其將BPMS與工作流系統(tǒng)的定義混為了一談,他如此定義BPMS:BPMS旨在簡(jiǎn)化對(duì)組織核心流程進(jìn)行支撐的軟件創(chuàng)建。 也就是BPMS面向的是軟件開發(fā)人員,旨在簡(jiǎn)化他們的開發(fā),降低他們使用流程的門檻。而這正是工作流系統(tǒng)需要解決的問題。

          BPMS面向企業(yè)用戶,工作流面向開發(fā)社區(qū)和系統(tǒng)集成商。

          二、BPMS特性

          jBPM4、jBPM5和Activiti5都增加了其BPMS特性,那些特性能夠稱為BPMS特性呢?我們先看一看BPMS需要解決的問題,為解決這些問題所增加的特性就是BPMS特性。

          1. 如何設(shè)計(jì)流程,在組織中高效地對(duì)設(shè)計(jì)出的流程進(jìn)行溝通,取得共識(shí)?

            • 提供跨越組織的流程標(biāo)準(zhǔn)標(biāo)記符號(hào)與術(shù)語(yǔ)(BPMN已經(jīng)成為標(biāo)準(zhǔn))
            • 流程及相關(guān)文檔的可視化(流程/內(nèi)容存儲(chǔ)倉(cāng)庫(kù))
            • 提供在組織結(jié)構(gòu)內(nèi)進(jìn)行不同層次之間的流程導(dǎo)航(流程存儲(chǔ)倉(cāng)庫(kù)支持組織模型)
            • 流程定義在各個(gè)層次/部門間的一致性,避免業(yè)務(wù)人員的流程建模轉(zhuǎn)換到IT系統(tǒng)時(shí)受到損耗(流程引擎支持基于圖的建模,支持?jǐn)U展)
          2. 如何更好地執(zhí)行流程?

            • 業(yè)務(wù)活動(dòng)的實(shí)時(shí)監(jiān)控,預(yù)警與控制(BAM)
            • 流程執(zhí)行的仿真
            • 流程執(zhí)行的統(tǒng)計(jì)分析與反饋(報(bào)表)
          3. 如何更好地管理流程?
            • 打破各個(gè)應(yīng)用系統(tǒng)之間的界線,統(tǒng)一管理所有流程(EAI,與ESB的集成)
            • 對(duì)業(yè)務(wù)人員友好的建模工具
          4. 如何在執(zhí)行流程過(guò)程中遵循業(yè)內(nèi)最佳實(shí)踐和規(guī)則?
            • 面向流程的知識(shí)管理
            • 規(guī)則引擎

          三、完整的工作流實(shí)現(xiàn)jBPM3

          jBPM3的最新版本是3.2.7,其包括了以下組件:基于Eclipse的流程設(shè)計(jì)器、用于監(jiān)控案例(流程實(shí)例)和處理任務(wù)的Web控制臺(tái)以及jPDL核心庫(kù)。如下圖2所示:

          圖 2:jBPM3組件

          1. 基于Eclipse的流程設(shè)計(jì)器

            提供給開發(fā)人員繪制jPDL流程圖,因?yàn)樵撛O(shè)計(jì)器基于Eclipse,所以生成的流程文件可以與開發(fā)代碼一起組織管理,非常容易進(jìn)行單元測(cè)試。實(shí)現(xiàn)了工作流管理系統(tǒng)參考模型里的接口1。

          2. Web管理控制臺(tái)

            主要有兩個(gè)功能:一是作為工作流客戶端應(yīng)用接口,給用戶提供一種手段,以處理案例運(yùn)行過(guò)程中需要人工處理的任務(wù);二是對(duì)案例的狀態(tài)進(jìn)行監(jiān)控與管理。實(shí)現(xiàn)了工作流管理系統(tǒng)參考模型里的接口2和5。

          3. jPDL核心庫(kù)

            jPDL核心庫(kù)是一個(gè)單獨(dú)的JAR包,可以嵌入到目標(biāo)應(yīng)用中執(zhí)行,它包括了:

            • 流程倉(cāng)庫(kù):解析jPDL流程定義文件并存儲(chǔ)讀取;
            • 流程引擎:對(duì)流程定義進(jìn)行初始化和調(diào)度執(zhí)行,節(jié)點(diǎn)的運(yùn)行期行為與jPDL里定義的節(jié)點(diǎn)類型一一綁定;
            • 任務(wù)管理:生成任務(wù)節(jié)點(diǎn)所對(duì)應(yīng)的工作項(xiàng),管理工作項(xiàng)的生命周期(初始化、分配執(zhí)行者、執(zhí)行、掛起、結(jié)束、終止);
            • 事件管理:發(fā)布案例和任務(wù)的開始、結(jié)束事件,通過(guò)監(jiān)聽者模式調(diào)用相應(yīng)的事件處理器;
            • 異步執(zhí)行機(jī)制:通過(guò)線程實(shí)現(xiàn)了Job Executor,進(jìn)行異步工作的處理,這些工作包括了時(shí)間處理、異步動(dòng)作。
            • 身份組件模型:實(shí)現(xiàn)了一套簡(jiǎn)單的身份組件模型,包括了組、用戶和權(quán)限。

            通過(guò)調(diào)用自定義Java代碼實(shí)現(xiàn)了對(duì)外部應(yīng)用的調(diào)用,從而實(shí)現(xiàn)工作流管理系統(tǒng)參考模型里的接口3。

          4. jBPM3是一個(gè)輕量級(jí)的嵌入式工作流系統(tǒng)。它在Java社區(qū)的成功得益于兩個(gè)方面:一是嵌入式,這降低了使用工作流的門檻;二是對(duì)開發(fā)人 員友好,這表現(xiàn)在易讀的jPDL、流程的可測(cè)試性(Eclipse插件)以及節(jié)點(diǎn)行為的可擴(kuò)展性,我們可以非常容易的在流程運(yùn)行中加入自己定制的行為(通 過(guò)事件處理器和Action)。jBPM3面向開發(fā)人員,它解決的問題是流程的自動(dòng)化,它的影響力集中在Java開發(fā)社區(qū),是一個(gè)完整的工作流系統(tǒng)實(shí)現(xiàn)。

          四、向BPMS努力的jBPM4

          與jBPM3相比,jBPM4最大的變化是引入了流程虛擬機(jī)(PVM),同時(shí)增加了BPMS的特性。jBPM4不再滿足于工作流系統(tǒng)的定位,開始向BPMS努力。

          1. 為什么引入流程虛擬機(jī)

            盡管jBPM3在Java社區(qū)取得了很大的成功,但是有一件事始終被人們?cè)嵅。蔷褪撬恢С至鞒陶Z(yǔ)言規(guī)范,從最開始的XPDL、BPEL 到后來(lái)的BPMN,它采用了自定義的jPDL。在jBPM3中,節(jié)點(diǎn)的運(yùn)行期行為與jPDL里定義的節(jié)點(diǎn)類型是一一綁定的,這造成了流程引擎與特定流程語(yǔ) 言的綁定,要支持其他的流程語(yǔ)言變得困難。于是在jBPM4中,jBPM提出了流程虛擬機(jī)的概念,即流程引擎與流程語(yǔ)言解耦,通過(guò)一套通用的流程模型并配 以可定制的節(jié)點(diǎn)運(yùn)行期行為實(shí)現(xiàn)了對(duì)多流程語(yǔ)言的支持。

            流程虛擬機(jī)帶來(lái)的好處是多方面的:第一也是最重要的是jBPM4支持了BPMN。

            第二是實(shí)現(xiàn)了基于流程組件的流程引擎,流程圖(語(yǔ)言)與實(shí)現(xiàn)解耦,我們使用通用編程語(yǔ)言實(shí)現(xiàn)節(jié)點(diǎn)運(yùn)行期行為,稱之為流程組件,通過(guò)將流程圖 與流程組件掛接,避免了圖的損耗。在這一點(diǎn)上,Tom Baeyens對(duì)BPMN到BPEL的轉(zhuǎn)換提出了一針見血的批評(píng):BPMN和jPDL以及XPDL都是基于圖的,而BPEL是基于塊的,這造成了當(dāng)將業(yè)務(wù) 人員使用BPMN所建立的流程模型向BPEL執(zhí)行模型進(jìn)行轉(zhuǎn)換時(shí),出現(xiàn)許多的不匹配,最初的流程模型會(huì)扭曲變形。而扭曲的后果就是業(yè)務(wù)人員與開發(fā)人員之間 的協(xié)作困難,這影響了流程從業(yè)務(wù)到技術(shù)的實(shí)現(xiàn)。

            第三個(gè)好處是我們可以定義領(lǐng)域特定語(yǔ)言(DSL),在特定的應(yīng)用里,采用DSL約定并隱藏了大部分的技術(shù)細(xì)節(jié)可能做到業(yè)務(wù)人員對(duì)執(zhí)行流程的直接修改,例如企業(yè)文檔管理里的審批流程。

          2. BPMS特性的加入

            這表現(xiàn)在以下三個(gè)方面:第一是支持了BPMN,BPMN已經(jīng)成為業(yè)務(wù)人員的流程建模標(biāo)準(zhǔn);第二是引入了Signavio作為面向業(yè)務(wù)人員的Web建模器;第三是在已有的Web管理控制臺(tái)加入了對(duì)案例和任務(wù)的統(tǒng)計(jì)功能。jBPM4的組件如下圖3所示:

            圖3:jBPM4組件

            和jBPM3一樣,jBPM4依然是輕量級(jí)的、可嵌入的工作流系統(tǒng)。相比jBPM3,它將業(yè)務(wù)人員作為最終用戶之一,增加了部分BPMS特性,同時(shí)PVM的引入使得它的可擴(kuò)展性得到了極大的增強(qiáng),我們甚至可以定義自己的DSL。

            在BPMS特性里我們提到了應(yīng)該避免業(yè)務(wù)人員的流程建模轉(zhuǎn)換到IT系統(tǒng)時(shí)受到損耗,最理想的情況是業(yè)務(wù)人員與開發(fā)人員共用一個(gè)流程模型,業(yè) 務(wù)人員能夠直接對(duì)流程進(jìn)行調(diào)整(在特定應(yīng)用中,通過(guò)DSL是可以做到的);其次是通過(guò)BPMS將業(yè)務(wù)人員的模型與實(shí)際執(zhí)行的技術(shù)模型關(guān)聯(lián)起來(lái)(很多商業(yè)產(chǎn) 品已經(jīng)做到了這一點(diǎn),在Activiti5中我們也會(huì)看到這一點(diǎn)),業(yè)務(wù)人員、開發(fā)人員以及運(yùn)營(yíng)團(tuán)隊(duì)之間能夠做到很好的協(xié)調(diào);最差是業(yè)務(wù)人員與開發(fā)人員各 自為政,獨(dú)立維護(hù)各自的流程模型,并且模型之間存在極大的不匹配,此時(shí)流程的迅速變化基本上是奢望。

          五、鳩占鵲巢的Drools Flow與jBPM5

          目前jBPM5剛剛發(fā)布了第一個(gè)候選發(fā)布版本,jBPM5基本上完全拋棄了jBPM4的代碼,所有代碼全部來(lái)自原先的Drools Flow。Drools Flow最初被用來(lái)解決規(guī)則執(zhí)行順序的問題。其實(shí)從Drools Flow開始支持BPMN時(shí)起,我們已經(jīng)預(yù)感到它與jBPM的競(jìng)爭(zhēng)關(guān)系。

          jBPM5依舊定位為輕量級(jí)的可嵌入的工作流系統(tǒng)。在jBPM5的特性里,有這么兩條引人關(guān)注:一是引入了Guvnor作為流程倉(cāng)庫(kù),這解決了流程 的可視化問題,流程定義作為資源被管理,我們可以對(duì)流程定義進(jìn)行可視化管理以及全文檢索(Guvnor使用了Jackrabbit作為了其存儲(chǔ)實(shí)現(xiàn),但我 們的經(jīng)驗(yàn)表明Jackrabbit在大數(shù)據(jù)量情況下性能存在嚴(yán)重問題);第二是規(guī)則引擎(Drools Expert)、事件處理引擎(Drools Fusion)與流程引擎的合三為一,這是jBPM5最讓人期待的地方。jBPM5的組件如下圖4所示:

          圖 4:jBPM5組件

          規(guī)則引擎在流程中的應(yīng)用已經(jīng)非常廣泛了,我們這里說(shuō)說(shuō)事件處理引擎。

          事件處理引擎是業(yè)務(wù)活動(dòng)監(jiān)控(BAM)的基礎(chǔ),BAM的功能及執(zhí)行過(guò)程,如下:

          • 捕獲:BAM捕獲各種事件(通過(guò)消息監(jiān)聽器、適配器、代理等)。這些事件來(lái)自應(yīng)用、系統(tǒng)軟件、外部交易伙伴。消息是BAM的核心——它們反應(yīng)底層業(yè)務(wù)流程的狀況。
          • 過(guò)濾:BAM過(guò)濾掉沒有直接后果的事件,在很多情況下由支持事件流處理(Event Stream Processing,簡(jiǎn)稱ESP)或復(fù)雜事件處理(Complex Event Processing,簡(jiǎn)稱CEP)引擎來(lái)進(jìn)行過(guò)濾。
          • 分析:BAM根據(jù)分析模型和規(guī)則將相關(guān)事件聯(lián)系起來(lái)。
          • 警告:BAM向用戶提出警告,以便用戶在必要時(shí)進(jìn)行控制。

          如上所示,BAM的執(zhí)行過(guò)程包含四個(gè)步驟,而前三個(gè)步驟都是對(duì)事件進(jìn)行相關(guān)的處理(捕獲事件、過(guò)濾事件、分析事件、關(guān)聯(lián)事件),因此在大多數(shù)BAM的技術(shù)實(shí)現(xiàn)方案中,都基于CEP和ESP的引擎來(lái)實(shí)現(xiàn)BAM的功能。

          與jBPM4相比,jBPM5對(duì)PVM的放棄也帶來(lái)了幾個(gè)不小的問題:第一是對(duì)開發(fā)人員來(lái)說(shuō)只支持BPMN,不再支持jPDL(當(dāng)然提供了遷移工 具);第二是流程執(zhí)行的可擴(kuò)展性回到了jBPM3的年代,僅僅支持自定義動(dòng)作(相當(dāng)于jBPM3里的Action)。此外,Web建模器由 Signavio替換為了Oryx Designer。

          總而言之,jBPM5通過(guò)引入流程倉(cāng)庫(kù)和BAM繼續(xù)向BPMS邁進(jìn)(目前的進(jìn)展是與流程倉(cāng)庫(kù)的集成還未完成,BAM基于日志進(jìn)行分析),同時(shí),由于不再支持PVM和jPDL,帶來(lái)了流程擴(kuò)展性的降低和社區(qū)開發(fā)人員的未來(lái)流失。

          六、Activiti5的反擊

          Activiti5是Tom Baeyens加入Alfresco后推出的新的基于jBPM4的開源工作流系統(tǒng),1號(hào)剛剛發(fā)布第一個(gè)版本。Activiti的開發(fā)團(tuán)隊(duì)相比與jBPM強(qiáng) 大了許多,有23位核心開發(fā)者。當(dāng)然這也是由于activiti規(guī)劃的功能所致:包括核心引擎、Web的流程建模器、協(xié)作工具Activiti Cycle、Activiti Probe、Activiti Explorer、與Spring的集成、與Mule的集成等。

          圖 5:Activiti5的組件

          如上圖所示,Activiti5由三種類型的組件組成,分別是:專用工具(Dedicated Tools)、內(nèi)容存儲(chǔ)工具(Stored Content)和協(xié)作工具(Collaboration Tool)。

          專用工具包括以下:

          • Alfresco—Alfresco公司的企業(yè)級(jí)內(nèi)容管理產(chǎn)品
          • Alfresco 是一個(gè)開源的、企業(yè)級(jí)的內(nèi)容管理系統(tǒng),功能包括:文檔管理、協(xié)作、記錄管理、知識(shí)庫(kù)管理、Web內(nèi)容管理等功能。Alfresco與Activiti的深 入集成實(shí)現(xiàn)了流程及相關(guān)文檔的可視化。更重要的是Alfresco支持組織模型,能夠提供在組織結(jié)構(gòu)內(nèi)進(jìn)行不同層次之間的流程導(dǎo)航。

          • Activiti Modeler—建模器
          • 基于開源Signavio Web流程編輯器的一個(gè)定制版本,提供了對(duì)BPMN2.0圖形化規(guī)范的支持,建模后的流程以文件格式進(jìn)行存儲(chǔ)。

          • Activiti Designer—Eclipse插件形式的建模器
          • Activiti probe—管理及監(jiān)控組件
          • 對(duì)流程引擎運(yùn)行期實(shí)例提供管理及監(jiān)控的Web控制臺(tái)。包含部署的管理、流程定義的管理、數(shù)據(jù)庫(kù)表的檢視、日志查看、事務(wù)的平均執(zhí)行時(shí)間、失敗多次的工作等功能。

          • Activiti Explorer—任務(wù)管理組件
          • 提供任務(wù)管理功能和對(duì)案例、任務(wù)基于歷史數(shù)據(jù)的統(tǒng)計(jì)分析(報(bào)表)功能。Web應(yīng)用程序。

          內(nèi)容存儲(chǔ)工具:包括了文檔倉(cāng)庫(kù)、模型倉(cāng)庫(kù)、SVN倉(cāng)庫(kù)、MVN倉(cāng)庫(kù)和Activiti引擎。其中文檔倉(cāng)庫(kù)、SVN倉(cāng)庫(kù)和MVN倉(cāng)庫(kù)三個(gè)組件為協(xié)作工具(Activiti Cycle)提供底層的支撐。Activiti引擎則是以前的PVM。

          協(xié)作工具:與jBPM4相比,Activiti5最令人矚目的特性就在于它的協(xié)作工具組件。

          Activiti Cycle完全是一種新類型的BPM組件。它是一個(gè)用來(lái)促進(jìn)業(yè)務(wù)人員、開發(fā)人員和IT運(yùn)營(yíng)人員協(xié)作的Web應(yīng)用程序。 在現(xiàn)實(shí)的場(chǎng)景中,業(yè)務(wù)文檔有業(yè)務(wù)人員所持有,而軟件程序由開發(fā)團(tuán)隊(duì)所管理,被部署的軟件應(yīng)用則被IT管理人員所管理。三者之間不能很好的協(xié)作。我們可以想 象這樣一個(gè)場(chǎng)景,業(yè)務(wù)經(jīng)理用文檔來(lái)維護(hù)需求和visio格式的流程圖,開發(fā)人員管理可執(zhí)行的流程和大量的Java源文件而IT維護(hù)人員則管理部署在 Tomcat中的.war文件和存儲(chǔ)在Activiti數(shù)據(jù)庫(kù)中的流程。

          圖 6:Activiti cycle協(xié)作組件邏輯示意圖

          Activiti Cycle通過(guò)BusinessLink將與流程相關(guān)的業(yè)務(wù)人員、開發(fā)團(tuán)隊(duì)與IT維護(hù)人員關(guān)聯(lián)起來(lái),實(shí)現(xiàn)他們之間的協(xié)作。

          總而言之,與jBPM4相比,Activiti5目前最重要的增強(qiáng)就是實(shí)現(xiàn)了流程的可視化以及創(chuàng)新的Activiti Cycle協(xié)作組件,此外,通過(guò)與Mule的集成加強(qiáng)了其集成能力。其對(duì)PVM的保留使其繼承了jBPM4強(qiáng)大的可擴(kuò)展能力,對(duì)jBPM的老用戶來(lái)說(shuō),這是向其遷移的重要理由。

          七、總結(jié)

          jBPM3是一個(gè)完整的工作流系統(tǒng)實(shí)現(xiàn),面向開發(fā)人員,目的在于簡(jiǎn)化對(duì)組織核心流程進(jìn)行支撐的軟件創(chuàng)建,不支持標(biāo)準(zhǔn)。

          jBPM4引入PVM,使其擁有更強(qiáng)大的擴(kuò)展性,同時(shí)增加BPMS特性,這些特性包括了對(duì)BPMN的支持、面向業(yè)務(wù)人員的Web建模器和簡(jiǎn)單統(tǒng)計(jì)分析功能的加入。

          jBPM5基于原先的Drools Flow,支持BPMN,通過(guò)與Drools的合并支持BAM,通過(guò)內(nèi)容倉(cāng)庫(kù)增加對(duì)流程可視化的支持。由于放棄了jBPM4的PVM,引擎的可擴(kuò)展性受到損害,并且不再支持jPDL。

          Activiti5基于jBPM4,與Alfresco的集成增加了其流程可視化與管理能力,同時(shí)通過(guò)創(chuàng)新的Activiti Cycle協(xié)作組件支持流程相關(guān)人員之間的協(xié)調(diào),最后,它加強(qiáng)了集成能力。

          對(duì)于工作流應(yīng)用或者jBPM3、jBPM4的老用戶,建議轉(zhuǎn)向Activiti5。

          關(guān)于作者

          榮浩,ThoughtWorks咨詢師,關(guān)注敏捷和企業(yè)流程改進(jìn)過(guò)程,目前正與辛鵬合著《Head First Process-深入淺出IT流程》一書。博客地址http://ronghao.javaeye.com

          轉(zhuǎn)自:http://www.infoq.com/cn/articles/rh-jbpm5-activiti5



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/rh-jbpm5-activiti5.html
          posted @ 2011-01-05 13:55 88250 閱讀(8581) | 評(píng)論 (4)編輯 收藏

          有很多理由都能說(shuō)明為什么我們應(yīng)該寫出清晰、可讀性好的程序。最重要的一點(diǎn),程序你只寫一次,但以后會(huì)無(wú)數(shù)次的閱讀。當(dāng)你第二天回頭來(lái)看你的代碼 時(shí),你就要開始閱讀它了。當(dāng)你把代碼拿給其他人看時(shí),他必須閱讀你的代碼。因此,在編寫時(shí)多花一點(diǎn)時(shí)間,你會(huì)在閱讀它時(shí)節(jié)省大量的時(shí)間。

          讓我們看一些基本的編程技巧:

           

          1. 盡量保持方法簡(jiǎn)短
          2. 永遠(yuǎn)永遠(yuǎn)不要把同一個(gè)變量用于多個(gè)不同的目的
          3. 使用自描述的變量名和方法名
          4. 盡可能的把變量定義在靠近使用它的地方
          5. 拒絕神秘?cái)?shù)字
          6. 友好的對(duì)待你的語(yǔ)言
          7. 不要逆常規(guī)而行
          8. 警惕過(guò)早優(yōu)化
          9. 積極重構(gòu)測(cè)試過(guò)的程序
          10. 不要過(guò)度沉迷于技巧
          11. 通過(guò)習(xí)例學(xué)習(xí)新知

          現(xiàn)在,讓我們把每個(gè)小點(diǎn)展開來(lái)詳細(xì)講一下。

          1. 盡量保持方法簡(jiǎn)短

          盡管很多人都遵循這個(gè)規(guī)則,但它仍然非常的重要。你寫的方法要始終能在一個(gè)屏幕里放得下。如果你需要去滾動(dòng)屏幕,這會(huì)分散你的注意力,而且你看不到 整個(gè)的上下文。最佳長(zhǎng)度是5-20行,這根據(jù)你的情況而定。當(dāng)然,getters/setters 通常是一行代碼的方法,但與其說(shuō)它們是真正的方法,不如說(shuō)它們只是存取工具。

          2. 永遠(yuǎn)永遠(yuǎn)不要把同一個(gè)變量用于多個(gè)不同的目的

          一個(gè)變量應(yīng)該始終只為一個(gè)目的服務(wù)。通過(guò)使變量常量化(C++里的const, Java里的final),使得編譯器能夠優(yōu)化編譯,而且使你的代碼醒目表達(dá)這個(gè)變量是不能改變的,你的程序的可讀性會(huì)變得更好。

          3. 使用自描述的變量名和方法名

          你的代碼應(yīng)該,對(duì)于任何人來(lái)說(shuō),只要看一眼就能知道是干嘛的。盡量不要用簡(jiǎn)寫方式,除非有特殊的習(xí)慣,就像下面的:

           src - source
          pos - position
          prev - previous

          如果你認(rèn)為描述性的名稱并不是那么有價(jià)值,請(qǐng)對(duì)比一下n, ns, nsisdnumTeamMembers, seatCount, numSeatsInStadium

          4. 盡可能的把變量定義在靠近使用它的地方

          蓋房子時(shí),你可不希望把錘子放到別人的院子里。你希望把它們放的離手頭越近越好。定義變量也是同樣的道理。

          int foo = 3;
          int bar = 5;
          // 一大段使用“bar”的代碼,
          // 但沒用到“foo”
          // ...

          baz(foo);

          這段代碼可以簡(jiǎn)單的重構(gòu)成

          int bar = 5;
          // 一大段使用“bar”的代碼,
          // 但沒用到“foo”
          // ...

          int foo = 3;
          baz(foo);

          當(dāng)你把變量的聲明和第一次用到它的地方間隔太遠(yuǎn)時(shí)(距離超過(guò)一個(gè)屏幕),這確實(shí)會(huì)成為一個(gè)問題。記住上下文關(guān)系會(huì)變得困難,你需要滾動(dòng)屏幕去找哪來(lái)的這個(gè)變量。

          5. 拒絕神秘?cái)?shù)字

          當(dāng)你要把什么東西跟一個(gè)常量值做比較時(shí),記得把這個(gè)值定義成常量。沒有什么會(huì)比去猜測(cè)你的同事寫的這樣的代碼更讓人頭疼的事了:

          il < 4384

          換個(gè)形式感覺如何?

          inputLength < MAX_INPUT_LENGTH

          6. 友好的對(duì)待你的語(yǔ)言

          學(xué)習(xí)新語(yǔ)言是一種很有樂趣的事情,你能學(xué)到一種新的完成任務(wù)的途徑。當(dāng)一個(gè)對(duì)一種語(yǔ)言已經(jīng)很專業(yè)的人去學(xué)習(xí)另一種語(yǔ)言時(shí),會(huì)出現(xiàn)一種很大的負(fù)面效應(yīng)。比如說(shuō)你是一個(gè)Java開發(fā)者,試圖去學(xué)習(xí)Ruby。你應(yīng)該學(xué)會(huì)用Ruby的方式解決問題,而不是沿用Java的解決問題的思想。

          當(dāng)你需要重復(fù)5遍”Hello world!“時(shí),在Java里,你可能會(huì)這樣做:

          for (int i = 0; i < 5; i++) {
          System.out.println("Hello world!");
          }

          在Ruby里,你也許會(huì)禁不住這樣寫:

          for i in (0..5)
          puts "Hello world!"
          end

          這樣看起來(lái)沒問題,但有一個(gè)更好的方式:

          5.times { puts "Hello world!" }

          7. 不要逆常規(guī)而行

          每種語(yǔ)言都有自己不同的習(xí)俗約定。一般來(lái)說(shuō),人們聽的最多的是Java的編碼規(guī)范。讓我們看看其中的一些習(xí)俗規(guī)范:

          • 方法名應(yīng)該小寫字母開頭,其后用字母大寫的單詞連接(veryLongVariableName)
          • 類名應(yīng)該都使用首字母大寫的單詞連接而成
          • 常量名應(yīng)該全部大寫,用下劃線連接(MY_CONSTANT)
          • 左大括號(hào)應(yīng)該跟 if 語(yǔ)句在同一行

          只有在有必要的理由時(shí)才去打破這些常規(guī),不要輕易的因?yàn)槟悴桓吲d就違反它。如果你只是在團(tuán)隊(duì)里改變一些這樣的習(xí)慣,那也沒問題,但當(dāng)把你代碼拿出來(lái)和其他的沒有這些思想準(zhǔn)備的程序員共享時(shí),問題就會(huì)來(lái)了。

          8. 警惕過(guò)早優(yōu)化

          過(guò)早優(yōu)化是所有問題的根源,至少電視上是這么說(shuō)的 … 你第一應(yīng)該關(guān)心的事情是寫出易于理解的代碼。起初寫的程序不要求快。除非你的程序很慢,否則談優(yōu)化都是為時(shí)太早。如果你想優(yōu)化什么東西,你首先需要知道問題出在哪。這就是我們需要profilers這個(gè)工具的原因。

          在沒有知道問題在哪的情況下試圖對(duì)程序進(jìn)行優(yōu)化,其結(jié)果必然是把程序能壞,至少你的代碼會(huì)喪失可讀性。如果你覺得有些地方很慢,不要盲目的重寫代碼,你應(yīng)先找到慢的證據(jù)

          不要傻乎乎的去解決根本不存在的問題。

          9. 積極重構(gòu)測(cè)試過(guò)的程序

          沒有任何東西會(huì)是完美的。即使你感覺你真正寫出了一段完美的代碼,幾個(gè)月后回頭再看看,你可能會(huì)驚訝道”怎么會(huì)這樣傻?“

          改進(jìn)程序的一個(gè)好方法就是重構(gòu),但要等程序測(cè)試通過(guò)之后。你首先要確保程序是好的可運(yùn)行的,你可以通過(guò)自動(dòng)化測(cè)試或手工測(cè)試完成這個(gè)工作。

          之初,你需要的是程序可用。不要期望在第一次就寫出完美的程序,你只需要把它寫出來(lái),可用。然后重構(gòu)它,使之完美。對(duì)于你們當(dāng)中知道測(cè)試驅(qū)動(dòng)開發(fā) (TDD)的人來(lái)說(shuō),對(duì)這個(gè)會(huì)很熟悉。這里的關(guān)鍵就在于你要習(xí)慣于重構(gòu)這種事情。如果你使用的是像IntelliJ IDEA這樣強(qiáng)大的集成開發(fā)工具的話,重構(gòu)的工作會(huì)變得簡(jiǎn)單的多。

          重構(gòu)之后,你也許會(huì)弄出一些Bug,導(dǎo)致某些功能出問題。這就是為什么說(shuō)寫自動(dòng)化測(cè)試的原因。不論何時(shí)重構(gòu)后,只要運(yùn)行一下所有的測(cè)試用例,你就能準(zhǔn)確的知道什么地方出了問題。

          10. 不要過(guò)度沉迷于技巧

          當(dāng)我第一次讀到有關(guān)設(shè)計(jì)模式的知識(shí)時(shí),我覺得我找到了圣杯。這些精心設(shè)計(jì)的思想作用顯著,它能使你的設(shè)計(jì)易于理解,因?yàn)槟憧梢院?jiǎn)單的說(shuō)”我使用的是 ‘觀察器模式’“,而不用從頭到尾的解釋一遍。那么,有問題嗎?一切看起來(lái)都這么自然、簡(jiǎn)單,你開始不論在哪都使用設(shè)計(jì)模式。為什么不把這個(gè)類做成 singleton呢?干嘛不去再創(chuàng)建一些工廠類呢?

          于是一個(gè)80行就能寫完的腳本,你最終使用了10個(gè)類,15個(gè)接口,外加一大堆范式和標(biāo)記符。97%的代碼不做任何事情。設(shè)計(jì)模式是一種十分有用的用來(lái)簡(jiǎn)化你的設(shè)計(jì)的工具,但這不意味著你該在所有能用到的地方都用它。你應(yīng)該用它們,但不能濫用。

          11. 通過(guò)習(xí)例學(xué)習(xí)新知

          編程是一種學(xué)習(xí)新知的過(guò)程。當(dāng)你學(xué)到了新的程序庫(kù)或新語(yǔ)言,你可能會(huì)迫不及待的丟掉舊的代碼,用你新學(xué)到的東西重新寫一遍。有很多的理由都能說(shuō)明你不該這么做。

          往現(xiàn)有的應(yīng)用里增加新的類庫(kù)或框架同屬于這種情況。就說(shuō)你寫了一個(gè)Javascript的web應(yīng)用,期間,你發(fā)現(xiàn)了jQuery。現(xiàn)在你突然急切的想丟到你的Javascript程序,重新用jQuery寫,盡管你還從來(lái)沒用過(guò)它。

          最好的方式是你先用jQuery寫一些簡(jiǎn)單的例子,通過(guò)這種方式把你在應(yīng)用里將要用到的知識(shí)都學(xué)會(huì)。需要AJAX?在你的項(xiàng)目之外做一些小例子,當(dāng)完全弄懂了后,丟掉例子,應(yīng)用到你的產(chǎn)品里。

          如果你非常關(guān)注編程技術(shù),我強(qiáng)烈的推薦你閱讀Steve McConnell寫的 《代碼大全》 一書。它會(huì)永遠(yuǎn)的改變你對(duì)編程的認(rèn)識(shí)。:)

           

          [英文出處]:11 tips for better code

          [譯文來(lái)源]:外刊IT評(píng)論



          本文是使用 B3log Solo簡(jiǎn)約設(shè)計(jì)の藝術(shù) 進(jìn)行同步發(fā)布的
          原文地址:http://88250.b3log.org/11-tips-for-better-code.html
          posted @ 2011-01-05 09:08 88250 閱讀(335) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 龙泉市| 和田县| 凤翔县| 宝鸡市| 塘沽区| 宜章县| 平度市| 永城市| 寿宁县| 淮滨县| 綦江县| 会泽县| 香港 | 黄冈市| 紫金县| 南郑县| 越西县| 甘孜县| 大渡口区| 略阳县| 马龙县| 乐安县| 容城县| 五家渠市| 察隅县| 嵩明县| 光泽县| 中卫市| 获嘉县| 阿坝| 乐平市| 沾益县| 乾安县| 周至县| 左云县| 连云港市| 靖西县| 昌吉市| 金湖县| 鸡西市| 蒙城县|