2013年5月14日
#
轉(zhuǎn)發(fā) http://blog.chinaunix.net/uid-23093301-id-90459.html
問題來源:
創(chuàng)建一個(gè)游戲系統(tǒng),其將運(yùn)行在互聯(lián)網(wǎng)的環(huán)境中。客戶端通過WWW服務(wù)或特定的客戶端軟件連接到游戲服務(wù)器,隨著流量的增加,系統(tǒng)不斷的膨脹,最終后臺(tái)數(shù)據(jù)、業(yè)務(wù)邏輯被分布式的部署。然而相比中心化的系統(tǒng),復(fù)雜度被無可避免的增大了,該如何降低各個(gè)組件之間的耦合度。
挑戰(zhàn):
需要保證可伸縮性、可維護(hù)性、可更新性,需要將服務(wù)劃分為各個(gè)相對(duì)獨(dú)立的組件,組件被分布式的部署,它們之間通過進(jìn)程間通信方式實(shí)現(xiàn)交互。服務(wù)的增加、刪除、改變都應(yīng)該被支持。理想情況,以開發(fā)者的角度看,集中化的系統(tǒng)和分布式的系統(tǒng)在中心邏輯上沒有什么不同。為實(shí)現(xiàn)這個(gè)目標(biāo):
l 可以遠(yuǎn)程的訪問服務(wù),而對(duì)于訪問者,服務(wù)的位置應(yīng)該是透明的。
l 提供服務(wù)的組件可以增加、刪除、改變,而且這些在運(yùn)行期同樣應(yīng)該被支持。
l 訪問服務(wù)的客戶端不應(yīng)該關(guān)心服務(wù)的實(shí)現(xiàn)細(xì)節(jié)。
解決方案:
引入一個(gè)Broker組件,解耦客戶端和服務(wù)端。服務(wù)端注冊(cè)自己到Broker,通過暴露接口的方式允許客戶端接入服務(wù)。客戶端是通過Broker發(fā)送請(qǐng)求的,Broker轉(zhuǎn)發(fā)請(qǐng)求道服務(wù)端,并將請(qǐng)求的結(jié)果或異常回發(fā)給客戶端。通過使用Broker模式,應(yīng)用可以通過發(fā)送消息訪問遠(yuǎn)程的服務(wù)。
這一架構(gòu)模式允許動(dòng)態(tài)的改變、添加、刪除服務(wù)端,從客戶端的角度,這些都是透明的。
結(jié)構(gòu):
Broker模式定義了6中類:Client,Server,Client_Proxy,Server_Proxy,Broker,Bridge。
Server:
l 責(zé)任:處理特定領(lǐng)域的問題,實(shí)現(xiàn)服務(wù)的細(xì)節(jié),注冊(cè)自己到Broker,處理請(qǐng)求并返回結(jié)果或異常。
l 協(xié)作類:Server_Proxy,Broker
Client:
Client是需要訪問遠(yuǎn)程服務(wù)的應(yīng)用程序,為此,Client發(fā)送請(qǐng)求到Broker,并從Broker上接收響應(yīng)或異常。Client和Server只是邏輯上相關(guān)而已,實(shí)際上Client并不知道Server的確切位置。
l 責(zé)任:1. 實(shí)現(xiàn)用戶端功能,2. 發(fā)送請(qǐng)求到Broker,3. 接收相應(yīng)和異常。
l 協(xié)作類:Broker,Client_Proxy
Broker:
Broker可以被看成消息轉(zhuǎn)發(fā)器。Broker也負(fù)責(zé)一些控制和管理操作。它能夠定位服務(wù)端的位置,若發(fā)生異常,能夠?qū)惓2东@傳給Client。Broker需要提供注冊(cè)服務(wù)的接口給Server。如果請(qǐng)求來自其他的Broker,本地的Broker需要轉(zhuǎn)發(fā)請(qǐng)求并最終將結(jié)果或異常回應(yīng)給相應(yīng)的遠(yuǎn)程Broker。Broker提供的服務(wù)和name service非常相像(如DNS、LDAP)。
l 責(zé)任:1. 注冊(cè)服務(wù)。2. 提供服務(wù)API。3. 轉(zhuǎn)發(fā)消息。4. 容錯(cuò)處理。5. 與其他Broker的交互。6。 定位服務(wù)。
l 協(xié)作類:Client_Proxy,Server_Proxy,Bridge
Client_Proxy:
連系Client和Broker,這一層保證了通訊的透明性,使Client調(diào)用遠(yuǎn)程服務(wù)就像調(diào)用本地的服務(wù)一樣。
l 責(zé)任:1. 封裝特定的系統(tǒng)調(diào)用。2. 封裝通訊的參數(shù)、控制信息等。
l 協(xié)作類:Client,Broker。
Server_Proxy:
Server_proxy是與Client_Proxy相對(duì)應(yīng)的,它接受請(qǐng)求,解包消息,解析出參數(shù)并調(diào)用服務(wù)的實(shí)現(xiàn)接口。
l 責(zé)任:1. 封裝特定的系統(tǒng)調(diào)用。2. 封裝通訊的參數(shù)、控制信息等。3. 調(diào)用server的服務(wù)接口。
l 協(xié)作類:Server,Broker。
Bridge:
Bridge用來連接各個(gè)Broker,一般這個(gè)組件是可選的。當(dāng)系統(tǒng)是發(fā)雜的網(wǎng)絡(luò)組成時(shí),有可能需要這一角色。
l 責(zé)任:1. 封裝特定的網(wǎng)絡(luò)特性。2. 傳遞Broker之間的通訊。
l 協(xié)作類:Broker。
應(yīng)用場(chǎng)景一:
直接通訊方式。Client和Server相互理解他們之間的通訊協(xié)議。Broker主要完成Client和Server之間的握手。之后所有的消息、異常都是由Client與Server直接交互。(想象DNS)。簡(jiǎn)單對(duì)象交互如圖:
應(yīng)用場(chǎng)景二:
l Broker啟動(dòng),完成自身的初始化,之后進(jìn)入事件循環(huán),等待消息到來。
l Server啟動(dòng),首先執(zhí)行自身的初始化,然后注冊(cè)自己到Broker。
l Broker接收Server的注冊(cè)請(qǐng)求,將其加入到可使用服務(wù)的列表,并回應(yīng)Ack給Server。
l Server接收Ack,進(jìn)入事件監(jiān)聽循環(huán),等待消息到來。
l Client調(diào)用遠(yuǎn)程服務(wù)對(duì)象的方法,Client_Proxy封裝消息請(qǐng)其發(fā)送給Broker。
l Broker查詢可使用的Server,將請(qǐng)求轉(zhuǎn)發(fā)給Server。
l Server_Proxy解析消息,分離出參數(shù)和控制信息,并調(diào)用特定的Server實(shí)現(xiàn)接口。Server處理完的結(jié)果通過Server_proxy封裝成消息轉(zhuǎn)發(fā)到Server。
l Broker將相應(yīng)消息轉(zhuǎn)發(fā)給正確的Client_Proxy,Client受到響應(yīng)繼續(xù)其他邏輯。
簡(jiǎn)單對(duì)象交互如圖:
應(yīng)用場(chǎng)景三:
l Broker A接收到請(qǐng)求,交由Server處理,但是發(fā)現(xiàn)該Server位于其他的網(wǎng)絡(luò)節(jié)點(diǎn)。
l Broker A將請(qǐng)求轉(zhuǎn)發(fā)給Bridge A,Bridge A將請(qǐng)求進(jìn)行必要的格式化,傳送給Bridge B。
l Bridge B將請(qǐng)求進(jìn)行必要的格式化,轉(zhuǎn)化成Broker B可以理解的格式,并轉(zhuǎn)發(fā)給Broker B。Broker B執(zhí)行場(chǎng)景二中的過程,處理的結(jié)果按如上逆序返回。
簡(jiǎn)單對(duì)象交互如圖:
部署示意圖:
總結(jié):
u 優(yōu)點(diǎn):
1. 服務(wù)的位置透明性。
2. 組件的可變性及擴(kuò)展性。由于Server是注冊(cè)到Broker上的,所以Server可以動(dòng)態(tài)的增加、刪除、改變。
3. Broker之間可交互。
4. 可重用性。
5. 由于組件的耦合度較小,調(diào)試和測(cè)試的工作也是可控的。
u 缺點(diǎn):
1. 效率;增加了一層Broker的消息轉(zhuǎn)發(fā),效率有所降低。
2. 容錯(cuò)能力必須要特別考慮。
3. 調(diào)試和測(cè)試的工作加大。
大師的非凡能力來源于何處?思維方式是關(guān)鍵。科學(xué)證據(jù)告訴人們,沒有天生的大師,只有煉就的專家。只要擁有專家的思維,你就能成為大師!
1909年的一天。多張象棋桌圍成了一個(gè)圈,一個(gè)男子在圈內(nèi)慢慢踱步。他的雙眼不斷掃描周圍的棋局,每隔兩三秒鐘就會(huì)下一步棋。而在圈外,數(shù)十位象棋迷不停地搔頭、苦想對(duì)策。這個(gè)人是誰?為什么他能以一人之力抗衡數(shù)十人的智慧?他就是國際象棋界的傳奇人物,古巴象棋大師卡帕布蘭卡(José Raúl Capablanca)。比賽結(jié)果毫無懸念,卡帕布蘭卡28局全勝。這只是他巡回表演賽中的一站,在整個(gè)巡回表演賽中,卡帕布蘭卡贏了168局。
為什么眨眼間他就能作出最正確的決定?面臨巨大的壓力,他能提前計(jì)算幾步?卡帕布蘭卡輕描淡寫地說:“我只提前看一步,但總是最正確的一步。”
這句話再簡(jiǎn)單不過,卻開創(chuàng)了心理學(xué)研究的新紀(jì)元:象棋大師優(yōu)于新手的地方就在于那電光火石間的思考。這種快速的、由知識(shí)引導(dǎo)的知覺,有時(shí)叫做“領(lǐng)悟”。在其他領(lǐng)域,專家們同樣具有“領(lǐng)悟”的本領(lǐng)。一次比賽完畢,象棋大師能記住自己走過的每一步棋;對(duì)于一段音樂,哪怕只聽過一遍,資深音樂家也能寫出樂章的曲譜。無論多么困難,象棋大師也能在瞬間想到最妙的棋著;不管多么復(fù)雜,經(jīng)驗(yàn)豐富的專業(yè)內(nèi)科醫(yī)生有時(shí)只須瞥上病人幾眼,就能作出準(zhǔn)確的診斷。
專家們的非凡技藝從何而來?源于天賦,還是得益于強(qiáng)化訓(xùn)練?通過對(duì)象棋大師的研究,心理學(xué)家找到了答案。一個(gè)世紀(jì)的探索積累了大量研究成果,新的理論應(yīng)運(yùn)而生,人腦處理信息(信息的組織與提取)之謎也由此破解。這項(xiàng)研究的意義還不僅在于此,人類的教育事業(yè)也將從中受益:象棋棋手提高棋藝的技巧,可否用于提高學(xué)生們的閱讀、寫作和計(jì)算能力呢?
象棋是最好的研究對(duì)象
人類何時(shí)開始擁有專業(yè)技術(shù)?這也許要從祖先們的狩獵說起。對(duì)于他們而言,狩獵技術(shù)是維系生命的重要工具,不掌握它就難以生存。經(jīng)驗(yàn)豐富的獵人不僅知道獅子在哪里出沒,而且還能推斷出獅子的行蹤。從孩提時(shí)代開始,他們就得跟隨長(zhǎng)輩練習(xí)追蹤技術(shù)。隨著年齡的增長(zhǎng),追蹤技術(shù)也日益嫻熟。“技術(shù)的熟練程度隨著年齡的增長(zhǎng)而增長(zhǎng),35歲左右達(dá)到技術(shù)的巔峰,”美國加利福尼亞大學(xué)富勒頓分校的人類學(xué)家約翰?博克(John Bock)說道。練習(xí)追蹤技術(shù)要花費(fèi)很多時(shí)間,可能比培養(yǎng)優(yōu)秀的腦外科醫(yī)生還要費(fèi)事。
相對(duì)于新手,如果在技術(shù)上沒有絕對(duì)優(yōu)勢(shì),那就難稱專家,只不過是多了一張唬人的文憑。這種披著專家外衣的人比比皆是。過去20年的研究結(jié)果表明,所謂的專業(yè)炒股者并不比業(yè)余者賺的錢多;知名品酒家對(duì)酒類的鑒別能力并不比饞酒的老農(nóng)強(qiáng);高學(xué)歷的精神病醫(yī)生并不比低文憑的同行出色……即使真的存在專業(yè)技術(shù),如教學(xué)、工商管理,都很難去衡量,更別提如何去闡釋。
不過,棋藝卻可以度量、可以分解、可以接受試驗(yàn)研究,并且十分直觀,尤其在比賽時(shí),任何人都能隨時(shí)觀看。正是基于以上原因,認(rèn)知科學(xué)家如獲至寶,將象棋作為研究思維理論的最佳試驗(yàn)對(duì)象。于是象棋被稱作“認(rèn)知科學(xué)的果蠅”。
對(duì)象棋手棋藝的度量,已經(jīng)走在了其他任何比賽、運(yùn)動(dòng)或競(jìng)技活動(dòng)的前面。運(yùn)用統(tǒng)計(jì)學(xué)公式,對(duì)棋手曾獲得的所有成績(jī)進(jìn)行分析,就可以得到棋手的實(shí)力等級(jí)。然后根據(jù)棋手的等級(jí)與對(duì)手的實(shí)力,即可準(zhǔn)確地推算出棋手的獲勝幾率。如果A棋手的等級(jí)分高于B棋手200點(diǎn),那么在比賽中,A戰(zhàn)勝B的平均幾率為75%。不管棋手是頂級(jí)的還是普通的,這種預(yù)測(cè)都很準(zhǔn)確。例如,俄羅斯特級(jí)象棋大師加里?卡斯帕羅夫(Garry Kasparov),他的等級(jí)分是2812點(diǎn),而荷蘭象棋大師揚(yáng)?蒂曼(Jan Timman)的等級(jí)分是2616點(diǎn)。如果二者對(duì)弈,那么卡斯帕羅夫就有75%的勝算。同樣,中等水平的棋手(1200點(diǎn))與另一個(gè)1000點(diǎn)的棋手對(duì)弈,前者亦有75%的勝算。選手的等級(jí)分代表著他們的真正實(shí)力,以選手的等級(jí)為標(biāo)準(zhǔn),心理學(xué)家就可以客觀地評(píng)估他們的專業(yè)技術(shù),動(dòng)態(tài)追蹤他們整個(gè)象棋生涯,而不會(huì)受到選手名氣的影響。
為什么認(rèn)知科學(xué)家沒有選擇臺(tái)球或橋牌作為研究模型,而偏偏選擇象棋呢?可能是因?yàn)橄笃灞荣愖羁简?yàn)人的智慧。正如德國詩人歌德所言,象棋是“智慧的試金石”。象棋大師的技藝出神入化,令人嘆為觀止,人們將他們的能力歸因于他們“擁有魔力”的大腦。這種魔力在下盲棋時(shí)體現(xiàn)得淋漓盡致。法國心理學(xué)家阿爾弗雷德?比奈(Alfred Binet)是首個(gè)智力測(cè)驗(yàn)的發(fā)明人之一。1894年,他曾請(qǐng)象棋大師描述他們下棋的過程。起初,他認(rèn)為棋盤就像照片一樣存在于象棋大師的大腦中,但是他很快斷定,大師們大腦中的圖像還要抽象得多。他們整體把握棋子的位置關(guān)系而不注重具體細(xì)節(jié),就像只關(guān)心馬而不關(guān)心馬的鬃毛一樣。
通過把握比賽的即時(shí)細(xì)節(jié)以及回想走過的棋步,盲棋大師能將腦海中的棋局補(bǔ)充完整。假設(shè)大師忘記了卒的準(zhǔn)確位置,該怎么辦呢?他立即開始回想開局時(shí)的套路,因?yàn)樵陂_局時(shí),套路相對(duì)固定,而且已經(jīng)爛熟于胸,因此很容易找到卒曾經(jīng)所在的位置。他也可以回憶走過的棋步,通過推理來找到卒的位置――“前兩步我沒能抓住他的相,所以當(dāng)時(shí)一定有卒在擋路……”他不必糾纏細(xì)節(jié)不放,利用組織完善的連接系統(tǒng),可以重獲任何想要的細(xì)節(jié)。
如果大師們的魔力――超凡的計(jì)算、計(jì)劃能力都是以復(fù)雜的知識(shí)結(jié)構(gòu)為基礎(chǔ),那么就可以肯定,專業(yè)技術(shù)多半來源于刻苦訓(xùn)練,而非上天的恩賜。荷蘭心理學(xué)家阿德里安?德赫羅特(Adriaan de Groot)是一位象棋大師。1938年,荷蘭舉行了一場(chǎng)國際象棋錦標(biāo)賽,他利用主場(chǎng)之便,對(duì)普通棋手、專業(yè)棋手與世界頂級(jí)大師進(jìn)行比較后,進(jìn)一步鞏固了上述觀點(diǎn)。他曾使用的一種方法就是請(qǐng)棋手觀看節(jié)選自比賽的棋局,然后說出自己的想法。他發(fā)現(xiàn),盡管專業(yè)棋手的分析能力要比普通棋手強(qiáng),但是當(dāng)他們的實(shí)力提升至大師級(jí)時(shí),反而不會(huì)去思索更多的下法。因?yàn)樵诟呤值男闹校粫?huì)留下最妙的棋著――正如卡帕布蘭卡聲稱的那樣。
近來研究表明,德赫羅特的發(fā)現(xiàn)只展示了象棋大師的部分實(shí)力。在一場(chǎng)對(duì)弈中,如果大量而精確的計(jì)算無法避免時(shí),大師們就會(huì)拿出真功夫,深入研究各種可能的棋步走法。這種能力,會(huì)讓普通棋手望塵莫及。同樣,知識(shí)淵博的物理學(xué)家遭遇難題時(shí),也會(huì)比他的學(xué)生想出更多的解決辦法。然而在上述兩種情況下,專家依靠的不是與生俱來的強(qiáng)大的分析能力,而是多年來逐漸建立起來的知識(shí)結(jié)構(gòu)。面對(duì)困難的棋局,一個(gè)實(shí)力平平的棋手可能會(huì)耗費(fèi)大半個(gè)小時(shí)去計(jì)算、提前看許多步,然而總是錯(cuò)過最正確的一步。相反,一個(gè)大師級(jí)的棋手根本不用有意識(shí)地去分析,立即就能看到精妙入微的一步。
德赫羅特還讓參加試驗(yàn)的棋手在短時(shí)間內(nèi)審視棋局,然后憑記憶重建棋局。在這樣的試驗(yàn)條件下,任何棋手的實(shí)力都會(huì)暴露無遺。就算用長(zhǎng)達(dá)30秒鐘的時(shí)間去回憶棋局,新手能記起的細(xì)節(jié)也是支離破碎的。而象棋大師,即使只瞟上幾眼,也能輕松重建棋局。這種差別源于一種特殊記憶,也就是對(duì)棋局的特異性記憶。特殊記憶是訓(xùn)練的結(jié)果,因?yàn)樵谝话阈缘挠洃洔y(cè)試中,大師的表現(xiàn)并不比其他人好。
同樣的現(xiàn)象還能從橋牌牌手(多場(chǎng)牌局后,仍記得出過的牌)、計(jì)算機(jī)程序設(shè)計(jì)師(能重組大量的計(jì)算機(jī)編碼)和音樂家(能記住大段大段的樂章)身上看到。在特殊領(lǐng)域,對(duì)主題事務(wù)的記憶能力,是衡量專業(yè)技術(shù)水平的重要標(biāo)準(zhǔn)。
一個(gè)不常見的案例也能證明,知識(shí)結(jié)構(gòu)才是專家們戰(zhàn)無不勝的法寶。一個(gè)叫D.H(姓名不全)的業(yè)余棋手,經(jīng)過9年的訓(xùn)練,終于在1987年成為了加拿大一流的象棋大師。美國佛羅里達(dá)州立大學(xué)的心理學(xué)教授尼爾?蔡內(nèi)斯(Neil Charness)指出,盡管這個(gè)棋手的實(shí)力已經(jīng)今非昔比,但是他對(duì)棋局的分析范圍并不比從前廣泛,反而是日益精深的棋局知識(shí)和相關(guān)策略幫助他連連告捷。
非凡能力來自何方
在上世紀(jì)60年代,美國卡耐基-梅隆大學(xué)的心理學(xué)家赫伯特?西蒙(Herbert Simon,1978年諾貝爾獎(jiǎng)得主)和威廉?蔡斯(William Chase),試圖通過研究專家的記憶局限性來更好地洞察專家的記憶能力。按照德赫羅特的研究思路,他們請(qǐng)各個(gè)級(jí)別的棋手重建曾被人動(dòng)過的棋局。不過這盤棋局不是大師對(duì)弈后的殘局,而是一盤亂擺的棋局。在重建這盤隨機(jī)棋局時(shí),棋手間的差距并不明顯。
因此,象棋運(yùn)動(dòng)中的特異性記憶不只取決于象棋這項(xiàng)運(yùn)動(dòng),還取決于棋局的類型。這些實(shí)驗(yàn)驗(yàn)證了早期的研究結(jié)果,有力地證明了能力的非通用性,不同的領(lǐng)域需要不同的能力。早在一個(gè)世紀(jì)前,美國心理學(xué)家愛德華?桑代克(Edward Thorndike)就首先提出了上述理論。當(dāng)時(shí)他指出,拉丁語說得好不等于英語水平高,幾何證明也不能教會(huì)人們?cè)谌粘I钪羞\(yùn)用邏輯思維。
象棋大師要處理的信息,數(shù)量極其龐大,似乎已經(jīng)超越了人類記憶的極限。為了解釋他們這種超凡的能力,西蒙引入了模塊理論。1956年,美國普林斯頓大學(xué)的心理學(xué)家喬治?米勒(George Miller)曾發(fā)表過一篇著名的論文――《非凡的數(shù)字7±2》。米勒在論文中指出,人的記憶有一定的限度,每次只能處理5~9條信息。西蒙強(qiáng)調(diào)說,通過把不同層次的信息構(gòu)建成一個(gè)一個(gè)模塊,大師就能突破記憶的極限。通過這種方法,他們會(huì)去捕捉5~9個(gè)模塊,而不是5~9個(gè)具體細(xì)節(jié)。
以“Mary had a little lamb”(瑪麗有一只小羊羔)這句詩為例。詩里的信息模塊數(shù)取決于讀者對(duì)詩歌與英語的熟悉程度。對(duì)于以英語為母語的人,這句詩是一個(gè)非常大的模塊――著名詩歌的一部分;對(duì)于懂英語卻不懂詩歌的人,這就是一句話――一個(gè)完整的模塊;對(duì)于記得單詞卻不明白含義的人,這句話是5個(gè)模塊(單詞);而對(duì)于認(rèn)得字母,卻不認(rèn)識(shí)單詞的人,這句詩就是18個(gè)模塊(字母)!
在象棋新手和象棋大師之間就能清楚地看到這種差別。假如有一個(gè)擺著20個(gè)棋子的棋局放在面前,新手和大師會(huì)怎么處理其中的信息呢?新手滿眼都是棋格,而棋子又有多種擺法,因此他獲取的信息模塊遠(yuǎn)多于20個(gè)。那么大師呢?他會(huì)將棋局整體化,然后把整個(gè)棋局分割成5~6個(gè)模塊,這樣記起來不就輕松多了!根據(jù)獲取一個(gè)新的記憶模塊所花掉的時(shí)間,以及普通棋手成長(zhǎng)為大師級(jí)選手所需要的時(shí)間,西蒙估算出了象棋大師的大腦中存儲(chǔ)的信息模塊數(shù):5萬~10萬個(gè)!就像我們聽?zhēng)讉€(gè)字就能背出一首古詩一樣,象棋大師只要看一眼棋局,就能從記憶中提取出相應(yīng)的信息模塊。
但是模塊理論還有缺陷。對(duì)一些記憶現(xiàn)象,例如當(dāng)大師們精力分散時(shí),他們的表現(xiàn)并沒有受到明顯影響,模塊理論就無法給出合理的解釋。佛羅里達(dá)州立大學(xué)的K?安德斯?埃里克森(K. Anders Ericsson)與蔡內(nèi)斯認(rèn)為,可能還存在另外一種機(jī)制,使得專家可以把長(zhǎng)時(shí)記憶當(dāng)作暫存區(qū)使用。埃里克森說:“訓(xùn)練有素的棋手在不看棋盤的情況下,能以幾乎正常的水平下棋,要用模塊理論來解釋這樣的事例,幾乎不可能。因?yàn)槟惚仨毾攘私馄寰郑缓蟛拍茉谟洃浿邪阉鰜怼?#8221;這一處理過程需要改變已有的信息模塊,就像倒背 “Mary had a little lamb”,雖然可以做到,但是很難,而且還會(huì)錯(cuò)誤不斷。然而在下盲棋的時(shí)候,象棋大師仍然可以精準(zhǔn)快速地下棋,讓對(duì)手無所適從。
埃里克森還引證了內(nèi)科醫(yī)生的學(xué)習(xí)過程。醫(yī)生們先把信息變?yōu)殚L(zhǎng)時(shí)記憶,當(dāng)需要使用這些信息來診斷疾病時(shí),再把它從記憶中提取出來。埃里克森還列舉了一個(gè)最普通、最常見的例子――閱讀。1995年,他在研究中發(fā)現(xiàn),越是熟練的讀者越不容易受到干擾。就算閱讀被打斷,熟練的讀者也能在幾秒鐘的時(shí)間內(nèi)恢復(fù)原有的閱讀速度。研究人員用長(zhǎng)時(shí)工作記憶來解釋這一現(xiàn)象。這一說法似乎自相矛盾,因?yàn)殚L(zhǎng)時(shí)記憶與工作記憶是兩個(gè)相互對(duì)立的概念。不過在2001年,德國康斯坦茨大學(xué)進(jìn)行的大腦成像研究卻為這一說法提供了依據(jù)。研究結(jié)果表明,較之新手,專業(yè)棋手的長(zhǎng)時(shí)記憶顯然更容易激活。
上世紀(jì)90年代末期,西蒙曾提出過一種競(jìng)爭(zhēng)理論。英國倫敦布魯內(nèi)爾大學(xué)的費(fèi)爾南德?戈貝特(Fernand Gobet)對(duì)它推崇備至。競(jìng)爭(zhēng)理論實(shí)際上是模塊理論的延伸,它引入了“模板”的概念,也就是一種極其典型并包含了大約12只棋子的大型布局。模板擁有許多插口,大師可以插入卒或者相這樣的變量。再以詩句“Mary had a little lamb”為例,如果某個(gè)詞的韻律與詩句中的詞等同,那么就可以用這個(gè)詞來替換詩中的詞。例如,用“Larry”替代“Mary”,用“pool”來替代“school”等等。任何知道原始模塊的人,都能在瞬間插入另一個(gè)詞。
天才是怎樣“煉”成的
要想在大腦中建立復(fù)雜的知識(shí)結(jié)構(gòu),就得不斷努力。西蒙提出了“十年規(guī)則”,他認(rèn)為要掌握任何技藝,十年的艱辛歷程是無法避免的。即便是數(shù)學(xué)天才高斯,音樂奇才莫扎特,象棋神童菲舍爾,也得去拼搏、去奮斗,也許他們所付出的努力是常人難以想象的。
近年來,象棋天才似乎不斷涌現(xiàn),但這都?xì)w因于計(jì)算機(jī)的強(qiáng)大功能。計(jì)算機(jī)能讓孩子們研究海量的大師級(jí)比賽,頻繁地與大師級(jí)程序?qū)梗谑窃谳^短的時(shí)間內(nèi),他們就能積累豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)。1958年,15歲的菲舍爾獲得了象棋大師的稱號(hào),當(dāng)時(shí)這一消息震驚了全世界。而目前的記錄保持者、烏克蘭的謝爾蓋?卡爾亞金(Sergey Karjakin)獲得大師稱號(hào)時(shí),僅有12歲零7個(gè)月!
埃里克森認(rèn)為,光是練習(xí)遠(yuǎn)遠(yuǎn)不夠,還需要全身心投入,不斷挑戰(zhàn)極限、超越自我。就像業(yè)余愛好者,他們可能會(huì)用大量的時(shí)間來練習(xí)下棋、打高爾夫球、演奏樂器,卻始終達(dá)不到專業(yè)水平;然而一個(gè)經(jīng)過正規(guī)訓(xùn)練的學(xué)生,卻能在較短的時(shí)間內(nèi)超過他們。這是一個(gè)很有趣的現(xiàn)象,說明練習(xí)和比賽對(duì)棋手的幫助似乎不如踏踏實(shí)實(shí)地學(xué)習(xí)。訓(xùn)練和比賽的主要價(jià)值在于,新手可以從中發(fā)現(xiàn)自己的缺陷,從而在以后逐漸彌補(bǔ)。
在學(xué)習(xí)初期,新手往往興趣濃厚,鉆研勁兒十足。他們剛開始學(xué)習(xí)打高爾夫球或者開車時(shí),技術(shù)的進(jìn)步速度可用“神速”二字來形容。但是技術(shù)一旦攀升到一定的階段,例如跟上了高爾夫球友的節(jié)奏,或者考取了駕照,大多數(shù)人就松懈了。于是,他們變得懶散,技術(shù)也被荒廢。相反,訓(xùn)練專家總是讓人不停地思考,因此參與學(xué)習(xí)的人就會(huì)自覺自律地去鉆研、不斷提高技術(shù),從而縮小與高手之間的差距。
人類在進(jìn)步,衡量專業(yè)水平的技術(shù)標(biāo)準(zhǔn)也在不斷提高。現(xiàn)在的高中生能在4分鐘內(nèi)跑完一英里(約合1.6公里);學(xué)音樂的學(xué)生敢于演奏曾經(jīng)只有名家才敢嘗試的曲子。如果說上述比較還不能讓人信服,那么我們?cè)賮砜纯聪笃迳系淖C據(jù)。英國人約翰?納恩(John Nunn)既是數(shù)學(xué)家,又是象棋大師。他利用計(jì)算機(jī),比較了1911年和1993年舉行的兩屆國際象棋錦標(biāo)賽。結(jié)果發(fā)現(xiàn),現(xiàn)代棋手出錯(cuò)的幾率要小很多,換言之,他們比前輩們下得更準(zhǔn)確。納恩還研究了1911年的一個(gè)棋手下過的所有棋局。在當(dāng)時(shí),這個(gè)棋手算是一個(gè)中等級(jí)別的選手。按照今天的標(biāo)準(zhǔn),他的等級(jí)分不會(huì)多于2100點(diǎn),離大師級(jí)標(biāo)準(zhǔn)還有一大段距離。與普通棋手相比,百年前的大師仍然實(shí)力強(qiáng)勁,不過與今天的大師相比,可能就有一定的差距。
在卡帕布蘭卡的那個(gè)時(shí)代,計(jì)算機(jī)、象棋數(shù)據(jù)庫都還沒有出現(xiàn),他們只能靠自己解決一切問題,正如巴赫、莫扎特和貝多芬。如果說今天的大師在技術(shù)上已經(jīng)超越了曾經(jīng)名滿天下的先輩們,然而在創(chuàng)造力方面他們卻難以望其項(xiàng)背。今天,剛畢業(yè)的物理學(xué)博士掌握的物理知識(shí),恐怕連牛頓也要自嘆弗如,但是在這些博士中,有誰能像當(dāng)年的牛頓一樣發(fā)現(xiàn)萬有引力定律?
說到這里,很多懷疑論者的耐心可能會(huì)蕩然無存。他們肯定會(huì)說,要步入卡耐基殿堂,除了練習(xí)、練習(xí)、再練習(xí)之外,還要付出更多的東西。雖然相信天資的重要性,尤其是專家和他們的學(xué)生對(duì)此深信不疑,然而奇怪的是,沒有任何證據(jù)來支持這一觀點(diǎn)。2002年,戈貝特曾做過一項(xiàng)研究。研究中,他用圖形記憶測(cè)驗(yàn)衡量各級(jí)別棋手的視覺空間智能。結(jié)果發(fā)現(xiàn),棋藝的高低與視覺空間智能的強(qiáng)弱根本沒有聯(lián)系。還有研究人員發(fā)現(xiàn),職業(yè)裁判預(yù)見賽馬結(jié)果的能力與他們的數(shù)學(xué)能力也沒有什么關(guān)系。
... ...
摘要: 熵是信息理論中非常重要的一個(gè)概念,用來度量信息,在實(shí)踐中大量使用。
信息檢索最重要的概念TF/IDF(term frequency/inverse document frequency)就是基于信息熵理論。搜索引擎、新聞分類、文本相似度計(jì)算都使用這個(gè)概念。
閱讀全文
看Chomsky的書是因?yàn)樵诰幾g原理課程中多次提到這個(gè)人,這是個(gè)變態(tài)天才,神一般的存在,而且還是活的。
Chomsky的語言學(xué)理論觀點(diǎn)在語言學(xué)、心理學(xué)和哲學(xué)領(lǐng)域都產(chǎn)生了廣泛而深刻的影響。Chomsky的哲學(xué)思想是一個(gè)貫穿了唯實(shí)論、自然主義和心智主義的連貫的、完整的體系。這一體系的核心是內(nèi)在語言理論。但是這一理論觀點(diǎn)與傳統(tǒng)觀點(diǎn)分歧很大 ,因此遭受到哲學(xué)界的強(qiáng)烈攻擊。Chomsky正是在這些爭(zhēng)論的過程中不斷地發(fā)現(xiàn)問題并對(duì)自己的理論和觀點(diǎn)進(jìn)行修改和補(bǔ)充 ,從而使其哲學(xué)系統(tǒng)乃至語言學(xué)理論系統(tǒng)更趨完善。哲學(xué)問題咱不關(guān)心這么無聊的問題留給哲學(xué)家們?nèi)コ丁?/p>
理論方法
Chomsky語言學(xué)的理論方法概況起來講,是自然科學(xué)中形式主義的演繹方法,用Chomsky自己的話講,叫伽利略研究風(fēng)格(Galileo Style),像伽利略為宇宙建立抽象的數(shù)學(xué)模型一樣,構(gòu)建有關(guān)語言知識(shí)的抽象數(shù)學(xué)模型,相信類似數(shù)學(xué)一樣的形式主義的演繹推理模型具有自足自明的真理性。Chomsky的語言研究所追求的是從世界各種語言五花八門的句子樣式中抽象出幾個(gè)簡(jiǎn)單的句法規(guī)則。
Chomsky的句法結(jié)構(gòu)一書中把語言學(xué)看成跟自然科學(xué)中的其他科學(xué)一樣,可以從假設(shè)出發(fā),進(jìn)行推演并形式化。換句話說,非經(jīng)驗(yàn)主義是可能的。《句法結(jié)構(gòu)》有一半篇幅用于英語語法的形式化。非經(jīng)驗(yàn)主義和形式化是轉(zhuǎn)換生成語法的首要標(biāo)志。
把句法關(guān)系作為語言結(jié)構(gòu)的中心并以此說明語句的生成是這場(chǎng)革命的又一表現(xiàn)。為了描寫和解釋語言現(xiàn)象,Chomsky在《句法結(jié)構(gòu)》中論證了語法的生成能力,認(rèn)為應(yīng)該把語法看成是能生成無限句子的有限規(guī)則系統(tǒng)。
它以"核心句"為基礎(chǔ),通過轉(zhuǎn)換規(guī)則描寫和分析不同句式之間的內(nèi)在聯(lián)系。該書分析了以"馬爾可夫過程"為基礎(chǔ)的通訊理論,認(rèn)為它只能生成有限狀態(tài)的語法,而這種"有限狀態(tài)的語法"不能生成象英語這種語言里含有不連續(xù)結(jié)構(gòu)的所有合乎語法的句子。基于此,喬姆斯基提出了轉(zhuǎn)換語法模式,認(rèn)為它才能生成所有合乎語法的句子而不會(huì)生成不合乎語法的句子。轉(zhuǎn)換語法模式由短語結(jié)構(gòu)規(guī)則、轉(zhuǎn)換規(guī)則、語素音位規(guī)則三套規(guī)則構(gòu)成。
短語結(jié)構(gòu)規(guī)則有三種:合并、遞歸、推導(dǎo)式,其基本形式是x→y 。→讀作"改寫",這個(gè)公式就是將x改寫成y。短語結(jié)構(gòu)規(guī)則生成的是"核心語符列",不經(jīng)過轉(zhuǎn)換直接由這種語符列得出的基本句型叫"核心句"。
轉(zhuǎn)換規(guī)則包括:移位、刪略、添加。最后運(yùn)用語素音位規(guī)則得出實(shí)際說出的句子。這三套規(guī)則中,最引人注目的是轉(zhuǎn)換規(guī)則,因?yàn)槎陶Z結(jié)構(gòu)規(guī)則和語素音位規(guī)則實(shí)際上繼承了描寫語言學(xué)的"直接成分分析"和語素音位的分析,轉(zhuǎn)換是一種創(chuàng)新,它使語法具有更強(qiáng)的解釋力。
《句法結(jié)構(gòu)》把語義排除在語法之外,這一時(shí)期的理論框架不包括語義部分。喬姆斯基認(rèn)為,語法理論不應(yīng)該建立在語義的基礎(chǔ)上,而應(yīng)該用某種嚴(yán)格的、客觀的方法去代替對(duì)于模糊的語義的依賴。不過這一理論在后來的發(fā)展中做了重大的修正。
Chomsky 定義的四種形式語言文法中, 0 型文法又稱為 ( A )文法; 1 型文法又稱為 ( C ) 文法; 2 型語言可由 ( G ) 識(shí)別。
A .短語結(jié)構(gòu)文法 B 前后文無關(guān)文法 C 前后文有關(guān)文法 D 正規(guī)文法
E 圖靈機(jī) F 有限自動(dòng)機(jī) G 下推自動(dòng)機(jī)
文法是用來定義語言的一個(gè)模型,常用的文法體系為Chomsky文法體系。
文法定義
文法G(Grammar)是一個(gè)四原組,G=(N,T,P,S),N(Non-terminator)是非終結(jié)符集合,T(Terminator)是終結(jié)符集合,P(Production)是產(chǎn)生式集合,S(Start)是起始符
其中:
N 交 T = 空集
P 是形式為 α -> β 的產(chǎn)生式
α ∈ (N∪T)*N+(N∪T)*,也就是說α中必須有一個(gè)非終結(jié)符
β ∈ (N∪T)* ,也就是說β可以是空串
S∈N
分類
0型文法(短語文法或無限制文法),識(shí)別0語言的機(jī)器叫做圖靈機(jī)
定義:P中產(chǎn)生式a-->b,其中a屬于V正閉包且至少含有一個(gè)非終結(jié)符,b屬于V星閉包
注:任何0型文法都是可遞歸可枚舉的
對(duì)0型文法作某些限制,可以得到其他文法的定義
1型文法 又稱上下文有關(guān)文法。生成式形式為 α->β, 且 |α| < |β| 并且不存在 A->ε
2型文法 又稱上下文無關(guān)文法。生成式形式為 A->α,即左邊必須只有一個(gè)非終結(jié)符
3型文法 又稱正則文法。
生成式 A->wB或A->w,稱為右線性文法
生成式 A->Bw或A->w,稱為左線性文法
0型文法 對(duì)生成式?jīng)]有任何限制的文法稱為0型文法。從0到3都是包含的關(guān)系,但是有特例,包含 A->ε 產(chǎn)生式的2,3型文法不屬于1型文法。
四種文法產(chǎn)生的語言分別稱為 上下文有關(guān)語言,上下文無關(guān)語言,正則語言,無限制性語言。
2型語言的表示法
2型語言是很重要的一種語言,除了用四元組的方法表示,此處再介紹兩種表示方法。
當(dāng)人們要解釋或者討論程序設(shè)計(jì)語言本身時(shí),經(jīng)常又需要一種語言,被討論的語言叫做對(duì)象語言,即某種程序設(shè)計(jì)語言,討論對(duì)象語言的語言稱為元語言,即元語言是描述語言的語言。BNF范式通常被作為討論某種程序設(shè)計(jì)語言語法的元語言,而語法圖是與BNF范式的描述能力等價(jià)的另一種文法表示形式,因其直觀性而經(jīng)常采用。
(1)巴科斯范式(Backus Normal Form,BNF)
2型文法生成式左端只有一個(gè)非終結(jié)符,所以可以把左端相同的生成式合并在一起,右端用|隔開,用::=代替->,所有非終結(jié)符用<>括起來,這是Backus為了描述AIGOL語言首次提出并使用的。
用BNF描述十進(jìn)制整數(shù)的生成語法:
<無符號(hào)整數(shù)> ::= <數(shù)字>|<數(shù)字><無符號(hào)整數(shù)>
<數(shù)字> ::= 0|1|2|3|4|5|6|7|8|9
(2)語法圖
語法圖有四種基本形式
(3)推導(dǎo)樹
2型文法還經(jīng)常用推導(dǎo)樹表示
節(jié)選自java.g
modifiers
:
( annotation
| 'public'
| 'protected'
| 'private'
| 'static'
| 'abstract'
| 'final'
| 'native'
| 'synchronized'
| 'transient'
| 'volatile'
| 'strictfp'
)*
;
Strictfp —— Java 關(guān)鍵字。
strictfp, 即 strict float point (精確浮點(diǎn))。
strictfp 關(guān)鍵字可應(yīng)用于類、接口或方法。使用 strictfp 關(guān)鍵字聲明一個(gè)方法時(shí),該方法中所有的float和double表達(dá)式都嚴(yán)格遵守FP-strict的限制,符合IEEE-754規(guī)范。當(dāng)對(duì)一個(gè)類或接口使用 strictfp 關(guān)鍵字時(shí),該類中的所有代碼,包括嵌套類型中的初始設(shè)定值和代碼,都將嚴(yán)格地進(jìn)行計(jì)算。嚴(yán)格約束意味著所有表達(dá)式的結(jié)果都必須是 IEEE 754 算法對(duì)操作數(shù)預(yù)期的結(jié)果,以單精度和雙精度格式表示。
如果你想讓你的浮點(diǎn)運(yùn)算更加精確,而且不會(huì)因?yàn)椴煌挠布脚_(tái)所執(zhí)行的結(jié)果不一致的話,可以用關(guān)鍵字strictfp.
import語句可以導(dǎo)入一個(gè)類或某個(gè)包中的所有類
import static語句導(dǎo)入一個(gè)類中的某個(gè)靜態(tài)成員(方法或?qū)傩裕┗蛩徐o態(tài)成員
語法舉例:
import static java.lang.Math.sin;
import static java.lang.Math.*;
例子:
//導(dǎo)入Math類中的所有static方法和屬性。
//這樣我們?cè)谑褂眠@些方法和屬性時(shí)就不必寫類名。
import static java.lang.Math.*;//import static java.lang.Math;//這樣寫報(bào)錯(cuò)
public class StaticImport {
public static void main(String[] args) {
// System.out.println(Math.max(3, 5));//沒有使用靜態(tài)導(dǎo)入
// System.out.println(Math.abs(1-9));//沒有使用靜態(tài)導(dǎo)入
System.out.println(max(3, 5));
System.out.println(abs(1-9));
}
注意:1默認(rèn)包無法用靜態(tài)導(dǎo)入。
2如果導(dǎo)入的類中有重復(fù)的方法和屬性則需要寫出類名,否則編譯時(shí)無法通過。
}
概述:
在設(shè)計(jì)開發(fā)過程中經(jīng)常會(huì)出現(xiàn)開發(fā)庫與測(cè)試庫不一致,測(cè)試庫與生產(chǎn)庫不一致,每次手工比對(duì)是個(gè)辛苦的活。
以前用java寫過一個(gè)數(shù)據(jù)庫結(jié)構(gòu)比較工具,最近騰出功夫來學(xué)習(xí)了一下python,用python重寫了一下,已經(jīng)提交到了github和sourceforage.
版本控制使用github
https://github.com/zhengys/dbcompare.gitsourceforage上邊放了exe文件(用pyinstaller打包的程序發(fā)現(xiàn)在部分win7上不能正常工作,
又用py2exe打包了一個(gè)64位版本的,已經(jīng)上傳sourceforage , 感謝itshu的反饋)http://sourceforge.net/projects/databasecompare/files/通過這個(gè)工具可以做到簡(jiǎn)單明了的看出區(qū)別。
對(duì)于數(shù)據(jù)庫和設(shè)計(jì)文檔不一致的情況,目前只能是先根據(jù)文檔生成數(shù)據(jù)庫,再和原來的庫做比對(duì)。未來考慮增加powerdesinger和數(shù)據(jù)庫的間直接比較。
目前只支持oracle,mysql,sqlserver,要是用的人多了再增加其它類型的數(shù)據(jù)庫。
使用:
功能類似文本比較工具,分別輸入數(shù)據(jù)庫連接信息,在結(jié)果頁面顯示比對(duì)結(jié)果。
操作很簡(jiǎn)單看圖就知道怎么用了。
如圖:

打包說明
一開始用py2exe打包,發(fā)現(xiàn)在winxp下用不了
改用pyinstaller打包,360會(huì)誤認(rèn)為是木馬攔截,文件夾形式打包,比較占地方,壓縮后也得36MB.
可根據(jù)源碼自行打包。