心不停歇,希望就始終存在

          專(zhuān)注&堅(jiān)持
          posts - 11, comments - 9, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          日歷

          <2012年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          隨筆分類(lèi)

          搜索

          •  

          最新評(píng)論

          2012年5月15日

          原來(lái)Markdown如此之方便,github又提供了page服務(wù),還能用上git,真是無(wú)法無(wú)天了!

          http://www.100hack.com

          或者
          http://cuixin.github.com

          posted @ 2013-06-29 01:30 steven.cui 閱讀(246) | 評(píng)論 (0)編輯 收藏

          第5章 調(diào)試你的大腦


          我從來(lái)都不想成為怪人,但別人都認(rèn)為我想。

          ——弗蘭克.扎帕,美國(guó)作曲家、音樂(lè)家、電影導(dǎo)演


          直覺(jué)是偉大的, 除了當(dāng)它不偉大的時(shí)候。

          我們必須直視自己,“調(diào)試”(debug)自己的大腦。

          關(guān)于debugging,可以自己擴(kuò)展閱讀,軟件是有人創(chuàng)造的,錯(cuò)誤難免。

          為什么這么說(shuō)呢?人類(lèi)大腦又不是開(kāi)源軟件,沒(méi)法找到代碼去修正,只是展示出錯(cuò)的地方,但你卻能知道自己的缺陷在哪里,只能盡量避免,卻幾乎難以修正。這就是人,而不是計(jì)算機(jī):

               1.認(rèn)知偏見(jiàn):思維如何被誤導(dǎo)

               2.時(shí)代影響:同代人如何影響你

               3.個(gè)性?xún)A向:個(gè)性如何影響思維

               4.硬件故障:大腦較老區(qū)域如何壓制較聰明的區(qū)域


          了解認(rèn)知偏見(jiàn)

               Wikipedia列舉了大約90多種認(rèn)知偏見(jiàn),書(shū)中著重舉了幾個(gè)值得重視的偏見(jiàn):

             思維定勢(shì)

               思維定勢(shì)(Thinking Set) 是由先前的活動(dòng)而造成的一種對(duì)活動(dòng)的特殊的心理準(zhǔn)備狀態(tài),或活動(dòng)的傾向性。在環(huán)境不變的條件下,定勢(shì)使人能夠應(yīng)用已掌握的方法迅速解決問(wèn)題。而在情境發(fā)生變化時(shí),它則會(huì)妨礙人采用新的方法。消極的思維定勢(shì)是束縛創(chuàng)造性思維的枷鎖。

             基本歸因錯(cuò)誤

               歸因理論的一個(gè)現(xiàn)象,即人們常常把他人的行為歸因于人格或態(tài)度等內(nèi)在特質(zhì)上,而忽略他們所處情境的重要性。比如,盡管我們?cè)谠u(píng)價(jià)他人的行為時(shí)有充分的證據(jù)支持,但我們總是傾向于低估外部因素的影響,而高估內(nèi)部或個(gè)人因素的影響。這種現(xiàn)象解釋了當(dāng)銷(xiāo)售人員的業(yè)績(jī)不佳時(shí),銷(xiāo)售經(jīng)理更傾向于將其歸因于下屬的懶惰而不是競(jìng)爭(zhēng)對(duì)手的實(shí)力。

            基本歸因錯(cuò)誤(fundamental attribution error,F(xiàn)AE)描繪人們?cè)诳疾炷承┬袨榛蚝蠊脑驎r(shí)高估傾向性因素(譴責(zé)或贊譽(yù)人)、低估情境性因素(譴責(zé)或贊譽(yù)環(huán)境)的雙重傾向。

             自私的偏見(jiàn)

               這種偏見(jiàn)使人們相信,項(xiàng)目的成功是我的功勞,失敗則與我無(wú)關(guān)。這種行為可能是一種個(gè)人防御機(jī)制導(dǎo)致的,但是請(qǐng)記住你也是系統(tǒng)的一部分——無(wú)論結(jié)果好與壞。

              需要定論

               我們對(duì)疑問(wèn)和不確定性感到不舒服,我們會(huì)竭盡全力解決不確定性。其實(shí)不確定性有時(shí)候是件好事,選擇是開(kāi)放的。如果強(qiáng)行把不確定的事情強(qiáng)行的定論,會(huì)迫使你選擇放棄,易于犯錯(cuò),例如你宣布了一項(xiàng)項(xiàng)目截止日期,并沒(méi)有能力移除內(nèi)在的不確定性,它只是一種自我掩飾。說(shuō)到這里,我們常說(shuō)靠譜還是不靠譜,我個(gè)人是比較煩不靠譜的人,而我愛(ài)人卻總結(jié)出,不靠譜的人有時(shí)候往往做朋友比靠譜的人好相處,而且有時(shí)候能幫到你。

               因?yàn)椴豢孔V的人在事情模棱兩可的時(shí)候就可以承諾,但你別太把承諾當(dāng)回事,也許他看似不靠譜的事情,真的就能辦到。因?yàn)榭孔V的人從來(lái)不做沒(méi)把握的事情,不敢于嘗試,不去爭(zhēng)取嘗試甚至,特別覺(jué)得一旦說(shuō)出去的話就得全部做到,要不就只字未提,聽(tīng)她說(shuō)完,身邊的朋友的確,雖然有些看似不靠譜的,卻真心對(duì)待的朋友,他們不是不靠譜,而是敢于給你幫助。


              認(rèn)可上的偏見(jiàn)

               每個(gè)人都根據(jù)自己的成見(jiàn)和喜好原則來(lái)選擇相應(yīng)的事實(shí)。

              曝光效應(yīng)

               會(huì)因?yàn)榱?xí)慣和熟悉某種事物對(duì)其偏愛(ài),這包括不在好用或者出錯(cuò)的工具或者技術(shù)。

               霍桑效應(yīng)/宣泄效應(yīng)

               1)社會(huì)心理學(xué)家所說(shuō)的“霍桑效應(yīng)”也就是所謂“宣泄效應(yīng)”。霍桑工廠是美國(guó)西部電器公司的一家分廠。為了提高工作效率,這個(gè)廠請(qǐng)來(lái)包括心理學(xué)家在內(nèi)的各種專(zhuān)家,在約兩年的時(shí)間內(nèi)找工人談話兩萬(wàn)余人次,耐心聽(tīng)取工人對(duì)管理的意見(jiàn)和抱怨,讓他們盡情地宣泄出來(lái)。結(jié)果,霍桑廠的工作效率大大提高。這種奇妙的現(xiàn)象就被稱(chēng)作“霍桑效應(yīng)”。

               2)1924年11月,以哈佛大學(xué)心理專(zhuān)家梅奧為首的研究小組進(jìn)駐西屋(威斯汀豪斯)電氣公司的霍桑工廠,他們的初衷是試圖通過(guò)改善工作條件與環(huán)境等外在因素,找到提高勞動(dòng)生產(chǎn)率的途徑。他們選定了繼電器車(chē)間的六名女工作為觀察對(duì)象。在七個(gè)階段的試驗(yàn)中,支持人不斷改變照明、工資、休息時(shí)間、午餐、環(huán)境等因素,希望能發(fā)現(xiàn)這些因素和生產(chǎn)率的關(guān)系——這是傳統(tǒng)管理理論所堅(jiān)持的觀點(diǎn)。但是很遺憾,不管外在因素怎么改變,試驗(yàn)組的生產(chǎn)來(lái)效率一直未上升。

               歷時(shí)九年的實(shí)驗(yàn)和研究,學(xué)者們終于意識(shí)到了人不僅僅受到外在因素的刺激,更有自身主觀上的激勵(lì),從而誕生了管理行為理論。就霍桑試驗(yàn)本身來(lái)看,當(dāng)這六個(gè)女工被抽出來(lái)成為一組的時(shí)候,她們就意識(shí)到了自己是特殊的群體,是試驗(yàn)的對(duì)象,是這些專(zhuān)家一直關(guān)心的對(duì)象,這種受注意的感覺(jué)使得她們加倍努力工作,以證明自己是優(yōu)秀的,是值得關(guān)注的。

               有一所國(guó)外的學(xué)校,在入學(xué)的時(shí)候會(huì)對(duì)每個(gè)學(xué)生進(jìn)行智力測(cè)試,以智力測(cè)驗(yàn)的結(jié)果將學(xué)生分為優(yōu)秀班和普通班。結(jié)果有一次在例行檢查時(shí)發(fā)現(xiàn),一年之前入學(xué)的一批學(xué)生的測(cè)驗(yàn)結(jié)果由于某種失誤被顛倒了,也就是說(shuō)現(xiàn)在的優(yōu)秀班其實(shí)是普通的孩子,而真正聰明的孩子卻在普通班。但是這一年的課程成績(jī)卻如同往年一樣,優(yōu)秀班明顯高于普通班,并未出現(xiàn)異常。原本普通的孩子被當(dāng)作優(yōu)等生關(guān)注,他們自己也就認(rèn)為自己是優(yōu)秀的,額外的關(guān)注加上心理暗示使得丑小鴨真的成了白天鵝。

               實(shí)驗(yàn)結(jié)論

          1. 改變工作條件和勞動(dòng)效率之間沒(méi)有直接的因果關(guān)系;
          2. 提高生產(chǎn)效率的決定因素是員工情緒,而不是工作條件;
          3. 關(guān)心員工的情感和員工的不滿情緒,有助于提高勞動(dòng)生產(chǎn)率。

          研究者認(rèn)為,這種自然形成的非正式組織(群體),它的職能,對(duì)內(nèi)在于控制其成員的行為,對(duì)外則為了保護(hù)其成員,使之不受來(lái)自管理階層的干預(yù)。這種非正式的組織一般都存在著自然形成的領(lǐng)袖人物。至于它形成的原因,并不完全取決于經(jīng)濟(jì)的發(fā)展,主要是與更大的社會(huì)組織相聯(lián)系。

          霍桑實(shí)驗(yàn)最初的研究是探討一系列控制條件(薪水、車(chē)間照明度、濕度、休息間隔,等)對(duì)員工工作表現(xiàn)的影響。研究中意外發(fā)現(xiàn),各種試驗(yàn)處理對(duì)生產(chǎn)效率都有促進(jìn)作用,甚至當(dāng)控制條件回歸初始狀態(tài)時(shí),促進(jìn)作用仍然存在。這一現(xiàn)象發(fā)生在每一名受試驗(yàn)者身上,對(duì)于受試驗(yàn)者整體而言,促進(jìn)作用的結(jié)論亦為真。

          很顯然,實(shí)驗(yàn)假設(shè)的各項(xiàng)條件并非是唯一的或決定性的生產(chǎn)效率影響因素。對(duì)此,喬治·埃爾頓·梅奧George Elton Mayo)以及他的助手們所做的解釋是,受試者對(duì)于新的實(shí)驗(yàn)處理會(huì)產(chǎn)生正向反應(yīng),即由于環(huán)境改變(試驗(yàn)者的出現(xiàn))而改變行為。所以績(jī)效的提高,并非由實(shí)驗(yàn)操控造成。這種效果就是我們所稱(chēng)的“霍桑效應(yīng)”或“霍索恩效應(yīng)”(Hawthorne Effect)。

               霍桑效應(yīng)的優(yōu)點(diǎn)

          • 能夠清楚地發(fā)現(xiàn)員工關(guān)心的事項(xiàng)。
          • 如果模型建設(shè)適當(dāng)、準(zhǔn)確的話,它所給出的解決生產(chǎn)力的辦法具有長(zhǎng)期的、可持續(xù)的特點(diǎn)。
          • 對(duì)員工工作條件進(jìn)行持續(xù)性衡量評(píng)估,有助于管理者指定長(zhǎng)期的戰(zhàn)略決策。

               霍桑效應(yīng)的缺點(diǎn)

          • 一些內(nèi)在的工作環(huán)境屬性難以辨識(shí),如組織動(dòng)力。
          • 生產(chǎn)力模型的參數(shù)選擇a、b、c比較主觀,取決于管理人員的個(gè)人認(rèn)識(shí)。
          • 關(guān)鍵性的工作環(huán)境屬性是動(dòng)態(tài)的,模型需要不斷調(diào)整反映現(xiàn)實(shí)情況。
          • 從總體上來(lái)看,生產(chǎn)力模型的準(zhǔn)確度與管理人員的個(gè)人判斷力、敏銳性緊密相關(guān)。

               霍桑效應(yīng)的啟示

               “霍桑效應(yīng)”,也就是社會(huì)心理學(xué)所說(shuō)的“宣泄效應(yīng)”,它給我們的啟示是:人在生產(chǎn)或者生活的過(guò)程中,對(duì)自己未能實(shí)現(xiàn)和不能滿足的情緒,要把它發(fā)泄出來(lái),情緒的發(fā)泄對(duì)人的身心健康和工作效率都非常有利。

              虛假記憶(讓我想到一部片子《羅生門(mén)》)

               虛假記憶(pseudo memory)是大腦記憶的信息之間自動(dòng)的組合導(dǎo)致不真實(shí)的回憶。每個(gè)人的大腦都可能產(chǎn)生虛假的記憶,或?qū)⑹挛锏恼鎸?shí)情況扭曲。人們會(huì)對(duì)自己的記憶堅(jiān)信不疑,甚至?xí)?duì)大腦編造的謊言信以為真。這并非一種發(fā)病過(guò)程。所有人都會(huì)產(chǎn)生虛假記憶”,特別是關(guān)于童年時(shí)期親身經(jīng)歷的場(chǎng)景的記憶。

               符號(hào)約簡(jiǎn)謬論和名詞謬論

               移位給事物貼上個(gè)標(biāo)簽就意味著理解或者能解釋它,例如:當(dāng)你嘗試畫(huà)一只人手時(shí),L型思維的人會(huì)把光線、陰影、紋理的負(fù)責(zé)性簡(jiǎn)化為“五條線加一個(gè)棍”。就如同人們一直認(rèn)為天鵝只能是白的。

          在這里本人強(qiáng)烈推薦《怪誕心理學(xué)》,《影響力》,《引爆點(diǎn)》,《烏合之眾》等等,關(guān)于心理方面的書(shū)籍,每個(gè)人都應(yīng)該讀點(diǎn)心理學(xué),不是在于說(shuō)自己腦子有問(wèn)題,每個(gè)人都是有心理偏差的,正因?yàn)樾睦砥钤斐傻膫€(gè)體不同,才有各種不同的性格,社會(huì)進(jìn)步的重要標(biāo)志是能包容各種形式的不同形態(tài)存在。

          心理偏差是你的個(gè)性也好性格也罷,敢于去了解別人和自己本身就是一種對(duì)自己思維的挑戰(zhàn),或許說(shuō)你再向自己發(fā)出改變的挑戰(zhàn),也許習(xí)慣是最難改變的,我們看似對(duì)新鮮事物充滿好奇,但如果熟悉一種事物,卻很難接受和改變自己替換原有思維。

          如果說(shuō)中國(guó)古代皇帝最有作為的——李世民,如果只是但從人心理角度出發(fā)分析,對(duì)與其“元認(rèn)知”的能力讓其能把國(guó)建建設(shè)的如此強(qiáng)大——自我批判和自我重塑,而這份能力恰恰是管理者最需要的能力。

          預(yù)言的失敗

               做預(yù)言太困難了,特別是關(guān)于未來(lái)的預(yù)測(cè)。

                                                          ——瑜伽.貝拉,偉大的智者、哲學(xué)家兼棒球手

               符號(hào)約簡(jiǎn)(請(qǐng)注意:不是符號(hào)簡(jiǎn)約,這兩個(gè)字前后顛倒,卻意思相差萬(wàn)里)是個(gè)非常有害的問(wèn)題,看個(gè)例子,你在嘗試畫(huà)一只人手時(shí),L型把光線、陰影、紋理的復(fù)雜性簡(jiǎn)化為“五條線加一個(gè)棍”。這種簡(jiǎn)化被認(rèn)為把復(fù)雜的現(xiàn)實(shí)看做由基本原素的組成:柏拉圖立體。

               我們善于將復(fù)雜的東西進(jìn)行簡(jiǎn)化和抽象,并且計(jì)算機(jī)編程也是如此之思想,但會(huì)讓我們陷入誤區(qū)。

               以前從來(lái)沒(méi)有人認(rèn)為有黑天鵝的存在,以至于科學(xué)界認(rèn)為沒(méi)有黑天鵝,知道有一只黑天鵝真的出現(xiàn)了。沒(méi)發(fā)現(xiàn)不等于不存在,很少也不代表沒(méi)有。

               作為一個(gè)團(tuán)隊(duì),我們往往會(huì)錯(cuò)過(guò)重要的發(fā)展,因?yàn)槲覀冴P(guān)注了錯(cuò)誤的事情或者提了錯(cuò)誤的問(wèn)題。

               現(xiàn)在,還有人在討論學(xué)習(xí)java好還是.net好?N年前的各種爭(zhēng)吵:RMI還是CORBA能取得中間件的勝利?Windows還是Linux能贏得桌面的勝利?

               就像是WEB的發(fā)展讓這些問(wèn)題毫無(wú)意義,Web是典型的黑天鵝,其出乎意料的改變了游戲規(guī)則。


          “很少“不意味著”沒(méi)有“

               2012,7.21北京據(jù)說(shuō)60年一遇的暴雨,幾乎每年都喊。程序員在寫(xiě)程序的時(shí)候,不可能出現(xiàn)這樣的bug啊,其實(shí)應(yīng)該說(shuō)概率低,但不代表沒(méi)有這種情況發(fā)生,花時(shí)間查一下認(rèn)為的不可能的事情吧。不要說(shuō):”絕不可能“!


          推遲下結(jié)論

               軟件的制作過(guò)程在我本人看來(lái)就是一個(gè)消除不確定性的過(guò)程,而且跟時(shí)間成正比,如下圖所示:

               到項(xiàng)目末尾時(shí)你會(huì)達(dá)到智力巔峰,而在項(xiàng)目開(kāi)始時(shí)則是最無(wú)知的。

               頂住壓力。你會(huì)做出決策,事情會(huì)解決,只不過(guò)不是今天。

               適應(yīng)不確定性,適應(yīng)敏捷開(kāi)發(fā),盡可能的用更靈活的技術(shù)適應(yīng)不確定性,適應(yīng)了不確定性也就等于提高了效率。


          難以回憶

               記憶是靠不住的,舊的記憶會(huì)隨著時(shí)間改變,這反而會(huì)是你以為某些誤解和偏見(jiàn)是對(duì)的,不要僅僅依賴(lài)你的記憶。中國(guó)有句諺語(yǔ)說(shuō)得好:好記性不如爛筆頭。


          認(rèn)清時(shí)代的影響

               在這章里作者給出了美國(guó)從1901到現(xiàn)在經(jīng)歷的幾個(gè)時(shí)代,從技術(shù)和人的思維的變化,相似年齡段的人對(duì)某種事物的開(kāi)發(fā)更接近,也就是不同年齡層次的人有代溝。本人不再贅述作者講述的美國(guó)各年代的歷史,其實(shí)這是我們都難以去逾越的,要想避免你所處時(shí)代的特有偏見(jiàn),最好的方法就是保持多樣性。承認(rèn)一種事物的存在,但卻能淡定的確很難。


          了解個(gè)性?xún)A向

               他人即地獄。

                    ——讓.保羅.薩特,法國(guó)思想家、作家、存在主義哲學(xué)

               尊重不同人的不同性格,當(dāng)你跟別人爭(zhēng)辯時(shí),請(qǐng)想一想這點(diǎn)。

               MBTI(Myers Briggs Type Indicator)性格評(píng)估測(cè)試,在國(guó)內(nèi)有些機(jī)構(gòu)可以做些專(zhuān)業(yè)評(píng)測(cè),如果想找免費(fèi)的,可以借助谷歌去找,但如果英文一般的同學(xué)想做這個(gè)測(cè)試,我建議你去百合網(wǎng),雖然是個(gè)婚戀網(wǎng)站,但這個(gè)MBTI還是比較專(zhuān)業(yè)哦,不過(guò)MBTI的測(cè)試結(jié)果就如同你自己的性格一樣,性格有些人會(huì)發(fā)生改變,但有些人可能一輩子難以改變,曾經(jīng)我做過(guò)測(cè)試,經(jīng)歷過(guò)幾年后的測(cè)試有個(gè)界限發(fā)生了改變,所以不要讓MBTI成為你潛意識(shí)的引導(dǎo),而是作為了解自己的途徑,但不要太過(guò)于相信,而是時(shí)常打破自己的”符號(hào)約簡(jiǎn)“。


          找出硬件問(wèn)題

               大腦常犯一些低級(jí)錯(cuò)誤——硬件問(wèn)題。

               我曾見(jiàn)看過(guò)各種報(bào)到,為了一個(gè)誤會(huì)能讓人失去理智。。。

               蜥蜴邏輯:

                    戰(zhàn)斗、逃跑或者恐懼

                    立刻行動(dòng),不加思考

                    領(lǐng)頭意識(shí),隨意指使你的隊(duì)友

                    守衛(wèi)領(lǐng)土,不分享信息和秘訣

                    受到傷害,憤憤不平,讓所有人都知道這是不公平的

                    像我這樣==好,不像我這樣==不好

               你或許認(rèn)識(shí)到以上幾點(diǎn)我們都有過(guò)呢?

               見(jiàn)樣學(xué)樣,近朱者赤,近墨者黑,情緒就像傳染病,常跟一些樂(lè)觀的人在一起你也就變得樂(lè)觀了。

               進(jìn)化行為:當(dāng)你開(kāi)始重播這些喜歡的電影時(shí),努力阻止自己,記住:這只是一部電影。

               心靈是自己的地方,在那里可以把地獄變成天堂,也可以把天堂變成地獄。

                                                                                                         ——約翰.米爾頓《失樂(lè)園》


          現(xiàn)在我不知道該思考什么

               在上幾章提過(guò),直覺(jué)是一種強(qiáng)大的工具,是專(zhuān)家的標(biāo)志。但直覺(jué)可能完全錯(cuò)誤,我們認(rèn)為“正常的”未必是正常的。除了各種偏見(jiàn),你可能被你自己誤導(dǎo),認(rèn)為一切都好。

               之前提到關(guān)于創(chuàng)造一個(gè)R型到L型的轉(zhuǎn)化,也就是說(shuō),思考時(shí)是全局性和經(jīng)驗(yàn)性的,然后轉(zhuǎn)換成更常規(guī)的實(shí)踐和技能,從而實(shí)現(xiàn)學(xué)習(xí)過(guò)程。

               相信直覺(jué),但是要驗(yàn)證。


          最后,測(cè)試你自己

               當(dāng)你堅(jiān)信某種事情時(shí),問(wèn)問(wèn)自己原因。

               嘗試問(wèn)問(wèn)自己以下問(wèn)題:

                    你怎么知道的?

                    誰(shuí)說(shuō)的?

                    有什么特別的?

                    我的做法會(huì)如何影響你?

                    與什么或者誰(shuí)比較?

                    這總是發(fā)生么?你能想到一個(gè)特例么?

                    如果你這樣做了(或者不這樣做)會(huì)怎么樣?

                    什么阻止了你?

               實(shí)踐:

               當(dāng)發(fā)生沖突時(shí),考慮基本性格類(lèi)型、不同年代的價(jià)值觀、你的偏見(jiàn)、別人的偏見(jiàn)和情境。通過(guò)司考更多因素,是不是更容易解決沖突?

               仔細(xì)檢查你的立場(chǎng)。你是如何知道你所知道的?什么使你這樣認(rèn)為?


               我們通過(guò)邏輯來(lái)證明,通過(guò)直覺(jué)去發(fā)現(xiàn)。

                                                       ——龐加萊

           

          posted @ 2012-08-13 01:38 steven.cui 閱讀(381) | 評(píng)論 (0)編輯 收藏

          原文請(qǐng)參考,如有問(wèn)題和歧義請(qǐng)指正,謝謝:)

          http://clojure.org/vars

          變量和全局環(huán)境

          Clojure是個(gè)很實(shí)用的語(yǔ)言,偶爾需要將維護(hù)和改變數(shù)據(jù)的值。她提供了4種不同的方式來(lái)操作變量:Vars, Refs, Agents, 和Atoms。Vars機(jī)制是是指向一個(gè)可改變的數(shù)據(jù)的位置,你可以為每個(gè)線程動(dòng)態(tài)的綁定(制定一個(gè)新的存儲(chǔ)位置)一個(gè)新值。Vars可以初始化根綁定(不是必須的),綁定的值對(duì)于所有線程都是共享的,但卻別的線程就不能重新綁定。因此,要么Var可以為每個(gè)線程綁定值,要么使用根綁定。

          下面的special form def 創(chuàng)建了一個(gè)Var,如果Var不存在和沒(méi)有給初始化,var就是不綁定的(不允許創(chuàng)建非動(dòng)態(tài)的Var,必須顯式指定根綁定):

          user=> (def x)
          #'user/x
          user=> x
          java.lang.IllegalStateException: Var user/x is unbound.

          為根值初始化(如果存在,就被再次綁定)

          user=> (def x 1)
          #'user/x
          user=> x
          1
           

          默認(rèn)情況下(定義的時(shí)候初始化了根綁定),Vars是靜態(tài)的(static),但是,建立動(dòng)態(tài)Var的定義可以通過(guò)元數(shù)據(jù)標(biāo)記的方式,然后在線程用時(shí)通過(guò)binding來(lái)指定。

          user=> (def ^:dynamic x 1)

          user=> (def ^:dynamic y 1)

          user=> (+ x y)

          2

          user=> (binding [x 2 y 3]

                   (+ x y))

          5

          user=> (+ x y)

          2

           

          binding被創(chuàng)建后其他線程是是不可見(jiàn)的。創(chuàng)建的binding可以被賦值,也就是在沒(méi)有離開(kāi)調(diào)用堆棧之前可以被上下文訪問(wèn)。可以在一塊代碼之前設(shè)置matadata標(biāo)簽:dynamic來(lái)指定:

          user=> (def ^:dynamic x 1)

          #'user/x

          user=> (meta #'x)

          {:ns #<Namespace user>, :name x, :dynamic true, :line 30, :file "NO_SOURCE_PATH"}

          user=> (binding [x 2] (println x))

          2

          nil

          user=> x

          1

          user=>

           

          如果你想讓函數(shù)編譯為static的,并且指定返回值,可以看下面的例子(速度提升不少,關(guān)鍵的調(diào)用函數(shù)可以采用這種方式加速):

           (defn fib [n]   (if (<= n 1)

              1

              (+ (fib (dec n)) (fib (- n 2)))))

          #'user/fib

           (defn ^:static fib2 ^long [^long n]

            (if (<= n 1)

              1

              (+ (fib2 (dec n)) (fib2 (- n 2)))))

          #'user/fib2

          user=> (time (fib 38))

          "Elapsed time: 1831.113 msecs"

          63245986

          user=> (time (fib2 38))

          "Elapsed time: 328.715 msecs"

          63245986

          user=> (meta (var fib))

          {:arglists ([n]), :ns #<Namespace user>, :name fib, :line 1, :file "NO_SOURCE_PATH"}

          user=> (meta (var fib2))

          {:arglists ([n]), :ns #<Namespace user>, :name fib2, :static true, :line 4, :file "NO_SOURCE_PATH"}

          user=>

           

          在上下文中可能需要重定義靜態(tài)變量,從Clojure1.3開(kāi)始提供with-redefswith-redefs-fn這兩個(gè)宏來(lái)修改。

          定義函數(shù)的defn也是Vars的存儲(chǔ)方式,也可以在運(yùn)行時(shí)被重定義。這也為aop編程帶來(lái)很多方便,例如:你可以封裝一個(gè)類(lèi)似logging函數(shù)給調(diào)用的上下文或者或者線程。

           

          (set! var-symbol expr)

          將Vars指定為special form

          當(dāng)?shù)匾粋€(gè)操作符為symbol的時(shí)候,它必須是全局變量。當(dāng)前線程綁定的值就是后面的expr,也就是說(shuō)必須是Thread-local的才可以,否則將會(huì)拋出一個(gè)使用set!來(lái)設(shè)定根綁定變量的錯(cuò)誤。變量的表達(dá)式expr必須有返回值。

          注意,你不能賦值給一個(gè)函數(shù)的參數(shù)或者本地綁定,只能是java的字段Vars Refs和Agents,因?yàn)檫@些數(shù)據(jù)在Clojure里可不變的。

          使用set為java字段設(shè)置值,可以查看 Java Interop.

           

          Interning

          命名空間維護(hù)了每個(gè)Var對(duì)象的全局符號(hào)映射。如果使用def定義變量沒(méi)有在當(dāng)前的命名空間找到該符號(hào),就創(chuàng)建一個(gè),否則使用現(xiàn)有的。創(chuàng)建或者尋找的過(guò)程被稱(chēng)作interning。這就意味著,除非Var對(duì)象取消映射,否則Var對(duì)象每次被查詢(xún),所以請(qǐng)?jiān)谘h(huán)中千萬(wàn)不要引用Var的全局變量,否則將非常慢,通過(guò)let或者binding讓全局變量取消映射來(lái)提高速度。命名空間在Evaluation中構(gòu)建了全局環(huán)境,編譯器也把所有free symbols當(dāng)做Vars來(lái)解析了。

          可以使用閱讀宏(Reader)#’來(lái)得到Var對(duì)象的內(nèi)部的值。

           

          Non-interned的類(lèi)型的變量

          可以通過(guò)with-local-vars來(lái)創(chuàng)建non-interned類(lèi)型的變量,在free symbol解析的時(shí)候?qū)⒉粫?huì)被發(fā)現(xiàn),這些值只能被手工的訪問(wèn),但是也可以用作當(dāng)前線程的變量。

          user=> (defn factorial [x]

                   (with-local-vars [acc 1, cnt x]

                     (while (> @cnt 0)

                       (var-set acc (* @acc @cnt))

                       (var-set cnt (dec @cnt)))

                     @acc))

          #'user/factorial

          user=> (factorial 7)

          5040

          posted @ 2012-07-31 01:48 steven.cui 閱讀(1502) | 評(píng)論 (0)編輯 收藏

          原文章寫(xiě)在Google Groups thread里,但是還是值得再說(shuō)下。

          有朋友把Java和Clojure的一些代碼片段放在Clojure Google group里比較,并提到Java的性能要比Clojure快太多了,疑問(wèn)到底Clojure能不能趕上Java?

          在我的一個(gè)開(kāi)源項(xiàng)目clj-starcraft中,關(guān)于java的性能問(wèn)題,實(shí)際上也是我始終面對(duì)的,在我寫(xiě)這篇文章的時(shí),我的Clojure代碼還是慢了Java代碼6倍(Clojure花了70秒解析了1050個(gè)文件,Java則只有12秒)

          然而,70秒對(duì)過(guò)去的速度而言不算太糟糕,在剛開(kāi)始的時(shí)候,竟然花了10分鐘來(lái)分析1050個(gè)文件。甚至比我用Python實(shí)現(xiàn)的還要慢。

          感謝Java的profiler和熱情的Clojure朋友,下面列出了我在提升Clojure性能方面的一些tips:


          (set! *warn-on-reflection* true)

          這恐怕是最重要的一個(gè)提升:打開(kāi)這個(gè)設(shè)置將會(huì)警告你在任何一處用到Java反射API的方法和屬性。如你所想,直接調(diào)用永遠(yuǎn)比反射要快,不管哪里Clojure都會(huì)你不能解析這個(gè)方法,你需要自己用type hint方式來(lái)避免反射調(diào)用。關(guān)于使用type hint,Clojure官方站點(diǎn)給了一個(gè)如何使用和提速的例子。

          修復(fù)所有關(guān)于*warn-on-reflection* 的編譯警告后,我的clj-starcraft從10分鐘降到了3分半。


          強(qiáng)制設(shè)置數(shù)據(jù)類(lèi)型

          Clojure可以使用Java的基礎(chǔ)數(shù)據(jù)類(lèi)型,無(wú)論何時(shí)在循環(huán)的時(shí)候,堅(jiān)決考慮將你的值強(qiáng)制轉(zhuǎn)換成基礎(chǔ)類(lèi)型,這將大幅提高你的性能。基礎(chǔ)數(shù)據(jù)類(lèi)型在Clojure官方網(wǎng)站有例子和如何進(jìn)行強(qiáng)制轉(zhuǎn)換來(lái)提高性能。


          使用二元運(yùn)算符

          Clojure可以在一行里面支持多個(gè)表達(dá)式,但對(duì)于運(yùn)算操作符,只有在兩個(gè)的時(shí)候才被inlined,如果你發(fā)現(xiàn)自己的運(yùn)算符已經(jīng)超過(guò)了兩個(gè),或許該考慮重寫(xiě)你的代碼讓操作符顯示的成為兩個(gè)。下面請(qǐng)看兩者之間的比較:

          user> (time (dotimes [_ 1e7] (+ 2 4 5)))

          "Elapsed time: 1200.703487 msecs"

          user> (time (dotimes [_ 1e7] (+ 2 (+ 4 5))))

          "Elapsed time: 241.716554 msecs"


          使用==代替=

          使用==比較數(shù)字來(lái)代替=,提升性能那是相當(dāng)明顯:

          user> (time (dotimes [i 1e7] (= i i)))

          "Elapsed time: 230.797482 msecs"

          user> (time (dotimes [i 1e7] (== i i)))

          "Elapsed time: 5.143681 msecs"


          避免vectors的destructing binding

          在一段循環(huán)種,如果你想為了提升可讀性從vector中傳出值,考慮下標(biāo)訪問(wèn)來(lái)代替destructing binding。雖然代碼看起來(lái)更清晰,但卻非常慢。

          user> (let [v [1 2 3]]

                  (time

                   (dotimes [_ 1e7]

                     (let [[a b c] v]

                       a b c))))

          "Elapsed time: 537.239895 msecs"

          user> (let [v [1 2 3]]

                  (time

                   (dotimes [_ 1e7]

                     (let [a (v 0)

                           b (v 1)

                           c (v 2)]

                       a b c))))

          "Elapsed time: 12.072122 msecs"


          優(yōu)先使用本地變量

          如果你需要在循環(huán)中查詢(xún)一個(gè)值,你或許需要考慮使用本地變量(通過(guò)let定義)來(lái)代替全局變量。看下兩者的時(shí)間對(duì)比:

          user> (time

                 (do

                   (def x 1)

                   (dotimes [_ 1e8]

                     x)))

          "Elapsed time: 372.373304 msecs"

          user> (time

                 (let [x 1]

                   (dotimes [_ 1e8]

                     x)))

          "Elapsed time: 3.479041 msecs"

          如果你想使用本地變量來(lái)提升性能,可以考慮下面比較土的式的方式來(lái)避免全局變量:

          (let [local-x x]

            (defn my-fn [a b c]

              ...))

          使用profiler工具:

          JVM有兩個(gè)profiler工具, -Xprof和-Xrunhprof,找到程序瓶頸而不是瞎猜。


          最后說(shuō)明:

          你已經(jīng)注意到,在這些性能提升中,通過(guò)調(diào)用百萬(wàn)量的執(zhí)行來(lái)提升了幾百毫秒的性能。所以,不到萬(wàn)不得已需要提升性能的時(shí)候,沒(méi)必要讓你的代碼看起來(lái)不夠清晰。

          原文地址: http://gnuvince.wordpress.com/2009/05/11/clojure-performance-tips/

          最后補(bǔ)充:可以通過(guò)指定編譯為static方法來(lái)提高性能:

          pasting

           

          (defn
            ^{:static true}
            fib
            [n]
            (loop [a (long 1) b (long 1) i (long 1) r (list 1 1)]
              (if (== n i)
              r
              (recur b (+ a b) (inc i) (conj r (+ a b))))))

           

           

          posted @ 2012-07-29 14:15 steven.cui 閱讀(1964) | 評(píng)論 (2)編輯 收藏

          第4章  利用右腦


          人應(yīng)該努力學(xué)習(xí)洞察和培養(yǎng)自己內(nèi)心深處的靈光一現(xiàn),這遠(yuǎn)遠(yuǎn)勝于外面流光溢彩的整個(gè)世界。然而,人總會(huì)下意識(shí)地拋棄自己特有的想法,僅僅因?yàn)槟鞘撬约旱南敕ā?/strong>

          ——拉爾夫.瓦爾多.愛(ài)默生(1803-1882)


          啟動(dòng)感官輸入:

               研究顯示,使用多感官技術(shù)可以讓學(xué)生的學(xué)習(xí)效果提高5倍,目前我本人見(jiàn)過(guò)的電子產(chǎn)品ibooks2 已經(jīng)算是圖文聲并茂的最棒的學(xué)習(xí)產(chǎn)品了,也許以后全息技術(shù)的普及將帶來(lái)所有電子感官輸入和交互的一場(chǎng)革命。

               當(dāng)你困在一個(gè)乏味的電話會(huì)議或者思考一個(gè)棘手的問(wèn)題時(shí),把玩下回形針或者晚些觸覺(jué)游戲能緩解疲勞。

               增加感官體驗(yàn)以促進(jìn)大腦的使用。

               在這里作者推薦不是使用商業(yè)工具(UML或者類(lèi)似的東西)直接創(chuàng)建或者記錄設(shè)計(jì)和架構(gòu)信息,而是通過(guò)積木,樂(lè)高積木等等來(lái)增加感官輸入。

               為什么這樣做呢?實(shí)際就是刺激你的大腦,大腦總是渴望接受這種額外的、新奇的刺激。另外作者提到,團(tuán)隊(duì)成員可以進(jìn)行角色扮演,試試吧,無(wú)意中你可能會(huì)想到xx的幾句話真是讓人捧腹,但你卻對(duì)這個(gè)過(guò)程記憶猶新,比你寫(xiě)上去的或者總結(jié)下來(lái)的文字要強(qiáng)好多倍。


          用右腦畫(huà)畫(huà):

               繪畫(huà)既是觀察。

               繪畫(huà)是一種R型活動(dòng),共享總線被占用,如果你進(jìn)行的L型活動(dòng),同時(shí)R型就必須停止。很多休閑活動(dòng)都能夠激活R型停止L型的占用:聽(tīng)音樂(lè)、繪畫(huà)、靜思、慢跑、針線活、攀巖,等等。

               角色扮演:

               書(shū)中有個(gè)角色扮演的例子,有興趣的可以去看《項(xiàng)目管理修煉之道》,琳達(dá).萊辛描述了扮演的另一個(gè)用途:培訓(xùn)團(tuán)隊(duì)。在向團(tuán)隊(duì)介紹一種新框架的次數(shù)屢遭經(jīng)歷之后,她和同事大衛(wèi).得拉諾決定在下一個(gè)團(tuán)隊(duì)中用表演來(lái)模擬框架。這次,開(kāi)發(fā)人員不再抱怨沒(méi)有聽(tīng)明白,而是抱怨表演簡(jiǎn)直浪費(fèi)時(shí)間,因?yàn)檠莩龅膬?nèi)容簡(jiǎn)直是“太簡(jiǎn)單了!”

               這是因?yàn)榻巧缪菡娴挠行Ч?/p>

               認(rèn)知轉(zhuǎn)變,感受R型

               《用右腦繪畫(huà)》,或者叫《像藝術(shù)家一樣思考》,來(lái)自作者的推薦


          促成R型到L型的轉(zhuǎn)變

               去攀巖吧

               羅扎諾夫教學(xué)法(谷歌搜索:羅扎諾夫的音樂(lè)暗示學(xué)習(xí)法)

               酒酣寫(xiě)作,酒醒修改(R型先行,L型做整理)

               結(jié)對(duì)編程(一人L型,一人R型),結(jié)對(duì)編程每個(gè)程序員都應(yīng)該嘗試

               隱喻相同(抽象與具體事物互相融合,嘗試將復(fù)雜的計(jì)算機(jī)用形象化的比喻將給不懂的人,你可以玩玩魔方,實(shí)際能恢復(fù)不難,轉(zhuǎn)得快需要很長(zhǎng)時(shí)間的聯(lián)系,本人沒(méi)有繼續(xù)研究下去的勇氣,但嘗試了恢復(fù)的樂(lè)趣,是個(gè)很有意思的過(guò)程)

               并列參照系(隨機(jī)并列,也許兩個(gè)想法相隔十萬(wàn)八千里,你卻能將其并列起來(lái)。例如,香煙和交通燈可以引出這樣一個(gè)概念:在香煙上使用紅色標(biāo)志區(qū)來(lái)作為幫助戒煙的提示。)

               系統(tǒng)隱喻(隱喻思維是編程的基礎(chǔ),因?yàn)樗嬖谟谒械某橄笏季S中)

               講個(gè)笑話吧(幽默既不是浪費(fèi)時(shí)間,也不是無(wú)害的消遣,而是反映了思維、學(xué)習(xí)和創(chuàng)造所必須的重要能力。它與聯(lián)系有關(guān)。培養(yǎng)幽默感以建立更強(qiáng)的隱喻)


          收獲R性線索

               你已經(jīng)知道

               你是否曾經(jīng)聽(tīng)到電臺(tái)里播放的一首老歌,然后在若干天突然想起歌名或者歌手?你的R型思維一直在背后異步地思考這個(gè)問(wèn)題,直到最終找到相應(yīng)的記憶。

               伊萊亞斯.豪的奇遇


           

               在1845年,一個(gè)名叫伊萊亞斯.豪的美國(guó)人嘗試發(fā)明一種實(shí)用縫紉機(jī)。進(jìn)展不是非常順利。在經(jīng)歷了漫長(zhǎng)、艱苦、一無(wú)所獲的一天之后,晚上他做了一個(gè)非常可怕的噩夢(mèng),在尖叫中驚醒,直冒冷汗。

               在噩夢(mèng)中,他身處非洲,被饑餓的食人魚(yú)綁架。他馬上就要被扔進(jìn)沸水里煮死。他努力掙扎,而獵手們就一直用一種看起來(lái)非常可笑的長(zhǎng)矛戳向他。

               第二天他描述噩夢(mèng)時(shí)說(shuō),他的注意力集中在“可笑的長(zhǎng)矛”上。因?yàn)檫@些長(zhǎng)矛的前端鉤子上有洞,這就像是手持縫紉針上的洞,只不過(guò)后者是在末梢上。

               伊萊亞斯接著獲得了自動(dòng)縫紉機(jī)的第一份美國(guó)專(zhuān)利,這要?dú)w功于他來(lái)之不易的靈感:縫紉機(jī)針的洞需要與平常的針持針?lè)较蛳喾础?/p>


               利用圖像流

                    1.觀察圖像,努力看清所有細(xì)節(jié)

                    2.大聲地描述出來(lái)(真正發(fā)出聲音,這很關(guān)鍵)。

                    3.利用全部五種感官想象它

                    4.使用現(xiàn)在時(shí)態(tài),即使該圖像都溜跑了。


               利用自由日記

                    寫(xiě)信是一種偉大的習(xí)慣。blog這種模式很受歡迎,wordpress或者blogspot(墻外)推薦。

               晨寫(xiě)技術(shù)

                    早上起來(lái)第一件事情。

                    至少寫(xiě)三頁(yè),最好不用電腦,如果使用電腦關(guān)掉所有跟寫(xiě)作無(wú)關(guān)的東西(只開(kāi)evernote)

                    不要審查刪減你寫(xiě)的東西。不論是優(yōu)秀的還是陳腐的,只管寫(xiě)下來(lái)。

                    堅(jiān)持天天寫(xiě)

               “自由寫(xiě)”技術(shù)

                    開(kāi)個(gè)blog,將你的想法隨時(shí)記錄,或者用evernote,保持隨時(shí)隨地可以自由寫(xiě)

               利用散步

                    遇到問(wèn)題的時(shí)候,試著找個(gè)安靜的地方散散步,不要坐在電腦旁,離開(kāi)鍵盤(pán)去解決難題。當(dāng)你不寄希望于它時(shí),就會(huì)發(fā)現(xiàn)答案自己冒了出來(lái)。


          收獲模式

               代碼中的模式

                    如果你不是一個(gè)特別在意編碼排版的人,那我可以負(fù)責(zé)任的告訴你,你離真正程序員的路還很遠(yuǎn),反而用lisp的人,更注意代碼排版,看代碼的時(shí)間遠(yuǎn)遠(yuǎn)高于你寫(xiě)代碼的時(shí)間,如果你連代碼都排列不好,問(wèn)題自然避免不了。切記,你可以桌子混亂,實(shí)際是為了保持上下文不被切換,而代碼卻不能格式混亂,格式都混亂甭提邏輯了。


               換換腦子

                    改變解決問(wèn)題的角度,前面一章提到過(guò),了解一只青蛙不是解剖它,而是如何創(chuàng)造它!


               神諭沖擊的魔力

                    在古代,教堂的大主教經(jīng)常通過(guò)神諭求的建議。像大多數(shù)算命者或者占星師一樣,神諭給予的響應(yīng)或者信息通常非常模糊,就像謎一樣。你不得不自己來(lái)“解釋”它。這就是對(duì)大腦的一次沖擊。

                   作曲家布萊恩.伊諾和彼得.施密特提出了一套100種間接策略來(lái)?yè)Q腦。去看:http://www.rtqe.net/ObliqueStrategies/



           

                    例子:

                         這項(xiàng)別的什么東西么?

                         不做任何改變,堅(jiān)持始終如一

                         關(guān)上門(mén),從外面聽(tīng)

                         錯(cuò)誤是一種潛在的提示(其實(shí)可能不是一種錯(cuò)誤,一種形態(tài))


               莎士比亞的謎語(yǔ)

                    莎士比亞做過(guò)很多語(yǔ)言重造的工作:

                         Full circle(繞圈子

                         Method of the madness(貌似瘋狂實(shí)則有理的行為)

                         Neither rhyme nor reason(莫名其妙)

                         Eaten out of house and home(吃的傾家蕩產(chǎn))


               在此,也感謝譯者(崔康)對(duì)本書(shū)的給力翻譯,沒(méi)有對(duì)語(yǔ)言的融會(huì)貫通很難將兩者聯(lián)系起來(lái),謝謝。


          試一試:


                    使用樂(lè)高積木做項(xiàng)目模塊討論。

                    使用雙人機(jī)制,讓同伴激勵(lì)你,討論你的進(jìn)展。

                    使用隱喻描述你當(dāng)前的項(xiàng)目。

                    觀察你認(rèn)識(shí)的專(zhuān)家,看看他們有什么“奇怪”的習(xí)慣讓你覺(jué)得更能理解?

          posted @ 2012-07-10 01:21 steven.cui 閱讀(392) | 評(píng)論 (0)編輯 收藏

          第3章  認(rèn)識(shí)你的大腦

          我們的大腦就是雙CPU,單主機(jī)設(shè)計(jì)總線。




          1號(hào)CPU即線性的,也稱(chēng)為L(zhǎng)型處理模式或者叫思考模式。程序員大多喜歡step by step這種方式,一步步的去線性處理。

          2號(hào)CPU是非線性的,也稱(chēng)為R型處理模式,更多的是直接和創(chuàng)造性,但兩者之間訪問(wèn)內(nèi)存(大腦)的時(shí)候,都是互相搶占系統(tǒng)總線的。


          你的記憶更像是全息影像方式在存儲(chǔ),在我剛上午看過(guò)的書(shū),下午可能就忘記了,但是我看到什么位置竟然是書(shū)中的插圖提醒的我。人們對(duì)圖像和聲音的記憶更強(qiáng)于文字,L型記錄的是一些循規(guī)蹈矩,有規(guī)律可循的記憶,而R型則是突發(fā)奇想,在你不經(jīng)意間(睡夢(mèng)中,洗澡時(shí)等等)想到了一個(gè)解決方案,R型是異步的,并且有時(shí)候是你不經(jīng)意間,而不是刻意去想就能聯(lián)系到另外一件事情上。


          隨時(shí)隨地記錄你的想法


               作者的推薦: http://www.pocketmod.com

               語(yǔ)音備忘錄/信箱

               Fisher Space鋼筆

               Moleskine筆記本


          我本人推薦:

               你應(yīng)該有個(gè)tablet/pad(我個(gè)人推薦ipad)

               你需要一臺(tái)不錯(cuò)的智能手機(jī)可以跟你的電腦或者pad進(jìn)行同步,iphone? 還是android都可以,屏幕至少4.0寸以上

               軟件方面:EverNote, GoodNotes,Penultimate,OmniFocus,Mindjet, AwesomeNote等等。


          我們每個(gè)人都有好點(diǎn)子,可真正付諸實(shí)踐的卻少的可憐。



          L型和R型處理方式的特點(diǎn)

               L型:

               處理令人感到舒適、熟悉而放松,提供以下九種能力:

          •      語(yǔ)言能力
          •      分析能力
          •      符號(hào)能力
          •      抽象能力
          •      時(shí)間能力
          •      推理能力
          •      數(shù)字能力
          •      邏輯能力
          •      線性思維能力

               R型:

               非語(yǔ)言性的,喜歡綜合學(xué)習(xí),集成事物形成整體。

          • 非語(yǔ)言
          • 綜合
          • 具體
          • 分析
          • 非理性
          • 空間性
          • 直覺(jué)
          • 全面

          R型思維能力是很難衡量的,至少比起L型來(lái)說(shuō)要難的多。R型思維更是一種綜合,大局觀的體現(xiàn),也是一種逆向思維和想象力,創(chuàng)新能力的體現(xiàn)。我個(gè)人推薦程序員應(yīng)該至少了解一門(mén)藝術(shù),例如繪畫(huà)、攝影、音樂(lè)啊等等,這些是R型非線性思維給與你的靈感和想象力,并且會(huì)給你猶如突發(fā)奇想這樣的奇跡,我們了解一種事物不是通過(guò)逆向倒推來(lái)了解他,而是通過(guò)它是如何出現(xiàn)和創(chuàng)造的而去想如何構(gòu)建它。我個(gè)人推薦,無(wú)論學(xué)什么至少應(yīng)該去了解這么技術(shù)或者藝術(shù)的誕生歷史,為什么如此產(chǎn)生的,為什么會(huì)有這樣的想法,想法和初衷是什么?


          作者給出一個(gè)很精辟的理論:真正想要了解一只青蛙,傳統(tǒng)的解剖不是辦法,更好的方式是構(gòu)造一只青蛙。


          綜合學(xué)習(xí)與分析學(xué)習(xí)并重。


          設(shè)計(jì)勝于功能

               無(wú)論什么產(chǎn)品,面向的終端用戶(hù)都需要理解你的產(chǎn)品。蘋(píng)果的ipod的廣告上從來(lái)不說(shuō)能容納多少個(gè)G,一個(gè)G等于多少多少字節(jié),這樣用戶(hù)會(huì)瘋掉,誰(shuí)會(huì)聽(tīng)你扯淡這些他們不理解的東西,他們只需要知道能存放多少首歌曲罷了。


          吸引力更有效

               吸引力的界面比不具有吸引力的界面更易于使用。盡最大努力爭(zhēng)取好的設(shè)計(jì),它真的很有效,好的設(shè)計(jì)也是需要不斷修改出來(lái)的。

               美來(lái)自于選擇——路易.康,對(duì)于一個(gè)程序員來(lái)說(shuō),好的設(shè)計(jì)很多都是構(gòu)建于各種選擇(開(kāi)源穩(wěn)定的組件),基于某種設(shè)計(jì)理論SEDA,CELL等等。


          R型看森林,L型砍樹(shù)木

               如果你想發(fā)現(xiàn)全局、整體的模式,你需要R型,如果你需要分析部分和細(xì)節(jié),你需要L型。講述一個(gè)程序員看開(kāi)源項(xiàng)目的例子,在拿到一個(gè)開(kāi)源項(xiàng)目的時(shí)候,下面幾個(gè)步驟開(kāi)始:

          1. 了解開(kāi)源想的初衷和目標(biāo),解決了什么問(wèn)題,把握這個(gè)開(kāi)源項(xiàng)目的方向性。
          2. 開(kāi)始了解開(kāi)源項(xiàng)目的大致結(jié)構(gòu)(導(dǎo)出UML圖,或者大致瀏覽項(xiàng)目的接口文件),以及開(kāi)源項(xiàng)目中依賴(lài)的組件。
          3. 有了整體全局觀以后,下來(lái)試驗(yàn)下開(kāi)源項(xiàng)目提供的tutorial。
          4. 開(kāi)發(fā)調(diào)試并親手實(shí)踐一個(gè)例子,對(duì)整個(gè)流程有個(gè)具體把握。
          5. 嘗試在開(kāi)源項(xiàng)目上進(jìn)行你自己項(xiàng)目的試驗(yàn)和業(yè)務(wù)邏輯:
            1. 構(gòu)建一個(gè)具體的業(yè)務(wù)邏輯。
            2. 。。。。
            3. 。。。。
            4. 。。。。
          6. 回頭再來(lái)看一些代碼,這樣實(shí)踐相結(jié)合,更容易理解。


          訓(xùn)練自己的大腦

               程序員大多數(shù)都顯得死板和缺少R型思維能力,學(xué)習(xí)一些新鮮的事物,可以看看科幻電影或者小說(shuō)等等,增加自己的想象力,想象力來(lái)源于生活,而生活卻是無(wú)所不包,包羅萬(wàn)象的百科全書(shū),你甚至可以說(shuō)任何的發(fā)明都是來(lái)源于生活,唯有熱愛(ài)生活的人才能做出好產(chǎn)品,產(chǎn)品也許不需要你創(chuàng)造,只是在選擇不同的組合。

          posted @ 2012-06-19 22:40 steven.cui 閱讀(758) | 評(píng)論 (0)編輯 收藏

           

           此讀書(shū)筆記并不完全作為闡述想法,所以在闡述一些問(wèn)題的時(shí)候可能沒(méi)有前因后果,更是一種總結(jié)性的話語(yǔ)和書(shū)上言語(yǔ)的精華,這有點(diǎn)悖論,如果你想了解,請(qǐng)去看《程序員的思維修煉》,這本書(shū)可以跨學(xué)科,即便你不懂程序,都值得一看,是從思維和大腦層面來(lái)開(kāi)展介紹的。

           

          2 從新手到專(zhuān)家的歷程

           

               新手到專(zhuān)家需要經(jīng)歷5個(gè)階段(德雷福斯技能獲取模型

               真正的專(zhuān)家不怕考驗(yàn),而輕松面對(duì)~

               真正的專(zhuān)家很難將自己的行為解釋清楚,而熟練到已經(jīng)無(wú)意識(shí)了。

               

               新手:在乎自己是否能成功,不知道自己是對(duì)是錯(cuò),不是特別想要學(xué)習(xí),只是實(shí)現(xiàn)一個(gè)立竿見(jiàn)影的目標(biāo),不知道如何應(yīng)付錯(cuò)誤,錯(cuò)誤出現(xiàn)不知所措。新手需要指令清單,有規(guī)則,有順序。但規(guī)則只能讓你啟程,不會(huì)讓你走的更遠(yuǎn)。

               高級(jí)新手:高級(jí)新手不想要全局思維,當(dāng)公司在展示全年銷(xiāo)售測(cè)量表和數(shù)據(jù)時(shí),你可能不感興趣,可這預(yù)示著明年你在這家公司是否還能繼續(xù)干下去。但是,你看不到這種聯(lián)系,因?yàn)槟銓哟芜€不夠,只處于較低的技能水平

               勝任者:可以獨(dú)立解決自己遇到的問(wèn)題,并開(kāi)始考慮如何解決新的問(wèn)題。處于這樣水平的人通常具備主動(dòng)性足智多謀,往往在團(tuán)隊(duì)中發(fā)揮著領(lǐng)導(dǎo)作用,他們是團(tuán)隊(duì)里的好人,但缺乏足夠的能力——自我反思和糾正。

               精通者:精通者需要全局思維,而且需要更大的概念框架,過(guò)于簡(jiǎn)單化的信息,他們會(huì)非常沮喪。在精通者中,最明顯的特征:自我改進(jìn)和反思。同時(shí)他們善于傾聽(tīng)別人的意見(jiàn),并從那些失敗或者成功的項(xiàng)目中認(rèn)真觀察、學(xué)習(xí)和總結(jié)。

               專(zhuān)家(大師):專(zhuān)家憑直覺(jué)工作,并不需要理由。他們有豐富的經(jīng)驗(yàn),并能家當(dāng)運(yùn)用,他們著書(shū)、寫(xiě)文章、做演講等等。專(zhuān)家往往通過(guò)觀察一些細(xì)節(jié)(可能常人根本無(wú)法覺(jué)察到的一些細(xì)節(jié))就能判定特征和問(wèn)題所在,那些無(wú)關(guān)緊要的會(huì)自動(dòng)過(guò)濾更是專(zhuān)家具備的能力。

           

          實(shí)踐:

          你不知道自己不知道

                       達(dá)爾文:無(wú)知往往來(lái)自于自信而不是知識(shí)

           

          上面兩句話,剛開(kāi)始理解的時(shí)候沒(méi)有突然頓悟的感覺(jué),但跟媳婦一番討論后,更加理解了:

          學(xué)生問(wèn)老師自己所掌握的知識(shí)到底有多少?

          老師給出了下面的回答:

          你現(xiàn)在的知識(shí)就仿佛是一個(gè)點(diǎn),而老師比你要多一些,是個(gè)圈,老師知道你不知道的,你有可能知道自己不知道的而老師知道的,你通過(guò)學(xué)習(xí)將來(lái)會(huì)知道老師知道的,然后超過(guò)老師去知道老師不知道的,老師也在不停地學(xué)習(xí),但隨著知道的越來(lái)越多,也就意識(shí)到自己不知道的越來(lái)越多,因?yàn)樵酱蟮膱A外面就會(huì)有更大的圓。

                       

          達(dá)爾文的總結(jié),一語(yǔ)道破了無(wú)知的自信(無(wú)知者無(wú)畏這句古話更是說(shuō)明了假自信),潛意識(shí)層面根本就是不知道自己不知道。有時(shí)候自信也很可怕,因?yàn)槟阋_認(rèn)自己到底是否真的知道。

           

          大師都是憑直覺(jué)辦事,可公司更希望通過(guò)數(shù)據(jù)或者規(guī)則來(lái)確定事情是否是對(duì)的,這種方式試圖在毀滅"專(zhuān)家,公司往往輕視專(zhuān)家的直覺(jué),認(rèn)為這是不科學(xué)不可重復(fù)。新手使用規(guī)則,而專(zhuān)家使用直覺(jué),具備元認(rèn)知能力metacognitive),或者叫具備自我認(rèn)知能力的人往往出現(xiàn)在較高層次中。

          知道你不知道什么

          專(zhuān)家!=老師,教學(xué)是一門(mén)技能,你在某個(gè)領(lǐng)域是專(zhuān)家,但這并不能保證你可以將它教給別人。

           

               有效地使用德雷福斯模型

               十年磨一劍,也許需要一輩子或者更長(zhǎng)?學(xué)漫漫路漫漫,我們需要積極實(shí)踐自己:

                需要一個(gè)明確定義的任務(wù)

                任務(wù)需要有適當(dāng)?shù)碾y度——有挑戰(zhàn)性但可行

                任務(wù)環(huán)境可以提供大量反饋,以便于你采取行動(dòng)

                提供重復(fù)犯錯(cuò)和糾正錯(cuò)誤的機(jī)會(huì)

                一旦你成為某個(gè)領(lǐng)域的專(zhuān)家,在別的領(lǐng)域成為專(zhuān)家就會(huì)變得更容易。你已經(jīng)有了現(xiàn)成的獲取知識(shí)的技能和模型構(gòu)建的能力。

               軟件開(kāi)發(fā)的職業(yè)特征:

                程序員往往認(rèn)為自己是一種工具,從而漠視工作,只是執(zhí)行分析師的指令,而不期望自己對(duì)項(xiàng)目的設(shè)計(jì)和架構(gòu)有所創(chuàng)見(jiàn)。

                由于薪酬等級(jí)的不平等,專(zhuān)家級(jí)的程序員爭(zhēng)先恐后的離開(kāi)一線編碼,通過(guò)管理、教學(xué)或者巡回演講賺更多的錢(qián)。

                軟件工程教育開(kāi)始受到質(zhì)疑。很多人認(rèn)為正規(guī)的實(shí)踐模式是最好的教育方法。這種對(duì)正規(guī)方法和工具的過(guò)度依賴(lài)削弱了實(shí)踐中真正經(jīng)驗(yàn)的作用。

                     R&D精神(Rip off and duplicate, 偷學(xué)技藝/偷師學(xué)藝),我們可以從他們的工作中借鑒很多經(jīng)驗(yàn)教訓(xùn)并應(yīng)用到軟件開(kāi)發(fā)中。

           

               勇于承擔(dān)責(zé)任:

                新手往往只是執(zhí)行命令,新手過(guò)渡到勝任者最大的區(qū)別在于能獨(dú)立解決問(wèn)題
          和承擔(dān)責(zé)任。

                通過(guò)觀察和模仿來(lái)學(xué)習(xí)(R&D)。如果你有孩子你會(huì)發(fā)現(xiàn),他們很少照你說(shuō)的做,而是大多時(shí)候在模仿你。

                模仿的同時(shí)就是實(shí)踐的過(guò)程,沒(méi)有實(shí)踐就沒(méi)有技能。模仿->吸收->創(chuàng)新

                保持實(shí)踐以維持專(zhuān)家水平,全世界最優(yōu)秀的那些專(zhuān)家沒(méi)有因?yàn)樽隽?/span>20年以上開(kāi)發(fā)而不去編碼了,實(shí)踐是保持技能的唯一手段。

               警惕工具陷阱:

               曾經(jīng),在我剛接觸軟件領(lǐng)域的時(shí)候,曾一度認(rèn)為UMLMDA以及TDD是未來(lái)解決軟件的必要良方,甚至也將其濫用,然而合宜的工具需要放到合宜的

               環(huán)境去運(yùn)用,模型只是工具,而非鏡子。如果你需要?jiǎng)?chuàng)造力、直覺(jué)或者獨(dú)創(chuàng)能力,避免使用形式方法。

           

               再次考慮情境:

               高端的顧問(wèn)最喜歡回答說(shuō):具體情況具體分析,當(dāng)然他們是對(duì)的,他們的分析依賴(lài)于很多事情——所有那些專(zhuān)業(yè)人士懂得去尋找至關(guān)重要的細(xì)節(jié),同

               時(shí)也忽略無(wú)關(guān)的細(xì)節(jié)。

               在系統(tǒng)思維中,如面向?qū)ο缶幊蹋鞘挛镏g的聯(lián)系最讓人感興趣,而不是事物本身。這也是面向?qū)ο蠡幊痰奶攸c(diǎn),你大多數(shù)時(shí)候在想事物本身的聯(lián)系,而實(shí)際問(wèn)題的解決卻放到了后面,本人的目前的理解是,面向?qū)ο缶幊陶娴挠心敲粗匾矗炕蛟S只是在某些方面比較重要罷了,擴(kuò)展性和低耦合的確是面向?qū)ο蟮膶?shí)踐的目的,可除此之外純?yōu)榱嗣嫦驅(qū)ο蠖袆?dòng),就存在濫用傾向了。例如java這種語(yǔ)言的面向?qū)ο蠹儗贋榻y(tǒng)一思想而設(shè)置的程序員枷鎖。

           

               日常中的德雷福斯模型:

                   新手需要快速成功和與情節(jié)無(wú)關(guān)的規(guī)則,而專(zhuān)家需要獲得全貌。理想情況下,你希望團(tuán)隊(duì)里混合各種層次技能水平的人,擁有一個(gè)全部是專(zhuān)家的
     團(tuán)隊(duì)存在它的難處。當(dāng)所有人在考慮森林的時(shí)候,你也需要一些人來(lái)關(guān)注一棵棵大樹(shù)。

                   學(xué)習(xí)如何學(xué)習(xí)的技能。

           

          總結(jié):

               了解自己出于德雷福斯模型中的哪個(gè)階段,并自我評(píng)價(jià),了解你的團(tuán)隊(duì)成員,他們的技能階段,以及對(duì)你有何幫助。回顧曾經(jīng)團(tuán)隊(duì)經(jīng)歷的問(wèn)題,并運(yùn)用德雷福斯模型解釋這些問(wèn)題,對(duì)于已知的問(wèn)題是否能通過(guò)德雷福斯模型解決或者避免?

                                   

           

          posted @ 2012-06-17 03:08 steven.cui 閱讀(470) | 評(píng)論 (0)編輯 收藏

          java的多線程Thread類(lèi)提供了setName方法或者通過(guò)構(gòu)造器傳入name,來(lái)指定線程的名稱(chēng)。

          近些時(shí)間在開(kāi)源方面看到Netty,觀察到Netty的重命名線程的策略類(lèi):

          ThreadNameDeterminer。這個(gè)接口有兩個(gè)策略,一個(gè)是使用PROPOSED(建議名稱(chēng)),還有個(gè)是CURRENT(當(dāng)前名稱(chēng))

          當(dāng)前名稱(chēng)的策略是未實(shí)現(xiàn)的,可能為以后擴(kuò)展考慮吧。

          另外就是ThreadRenamingRunnable這個(gè)類(lèi),這個(gè)類(lèi)里面構(gòu)建函數(shù)傳入Runnable接口,和proposed建議名稱(chēng)。

          由于本身ThreadRenamingRunnable也是實(shí)現(xiàn)Runnable類(lèi)的,所以你在自己業(yè)務(wù)邏輯種還是照樣實(shí)現(xiàn)Runnable接口來(lái)寫(xiě)邏輯,完全對(duì)業(yè)務(wù)代碼沒(méi)有侵入。

          代碼中大概是這樣的情況:

          public run() {
               //根據(jù)規(guī)則把線程名字進(jìn)行修改
               try {
                    runnable.run(); // 調(diào)用傳入接口的run方法
               } finally {
                    if (renamed)
                         // 恢復(fù)之前的名字
               }
          }


          只需要在構(gòu)建的你的Runnable的時(shí)候,重新包裝一下即可:

          new ThreadRenamingRunnable(new OioWorker(acceptedChannel),

                                         "Old I/O server worker (parentId: " + channel.getId() + ", " + channel + ')'));


          這樣的Decorator模式,重新將Runnable接口進(jìn)行了“裝飾”,使其具備了線程名稱(chēng)的功能。

          Runnable接口還是原來(lái)的接口,對(duì)run方法的再次封裝使其具備了另外一項(xiàng)功能,這就是Decorator模式的精華所在。

          posted @ 2012-06-16 22:32 steven.cui 閱讀(1162) | 評(píng)論 (0)編輯 收藏

          判斷一個(gè)數(shù)是否是2的n次冪

          類(lèi)似這樣的數(shù)字

          1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 …


          if ((n & -n) == n)

          1 public class Is2Power {
          2      public static void main(String[] args) {
          3           for (int i = 0;i <= 1024; i++) {
          4                if ((i & -i) == i)
          5                     System.out.println(Integer.toBinaryString(i) + ", " + Integer.toBinaryString(-i) + " " + i);
          6           }
          7      }
          8 }

          posted @ 2012-06-16 22:26 steven.cui 閱讀(650) | 評(píng)論 (0)編輯 收藏

          業(yè)務(wù)上線后,在有大量并發(fā)后,出現(xiàn)了一個(gè)線程完全被占用的問(wèn)題,后來(lái)通過(guò)得到j(luò)vm堆棧信息(kill -3)看出來(lái)是死鎖問(wèn)題。

          由于業(yè)務(wù)邏輯代碼實(shí)在比較復(fù)雜,此處濾掉業(yè)務(wù)代碼把線程競(jìng)爭(zhēng)關(guān)系展示出來(lái):

          1線程———>獲得A鎖———>獲得B鎖———>釋放B鎖————>釋放A鎖

          2線程———>獲得A鎖———>釋放A鎖

          3線程-——————>獲得B鎖———>獲得A鎖


          問(wèn)題就出在1和3線程之間的AB鎖嵌套導(dǎo)致死鎖問(wèn)題,1線程在沒(méi)有獲得B鎖的時(shí)候,3線程開(kāi)始獲得B鎖然后又得到了A鎖,這時(shí)候就完全釋放不了A鎖了,死鎖產(chǎn)生了。

          由于時(shí)間關(guān)系,問(wèn)題是理清楚了,只要?jiǎng)h掉1線程的A鎖就可以了,當(dāng)時(shí)還是仔細(xì)了解過(guò)是否刪除1線程A鎖,發(fā)現(xiàn)對(duì)業(yè)務(wù)A鎖是沒(méi)必要的。但是線程2會(huì)不會(huì)也會(huì)像剛才一樣產(chǎn)生線程死鎖呢?不會(huì),因?yàn)榫€程2里并不會(huì)得到B鎖。

          1線程———>獲得B鎖———>釋放B鎖

          2線程-——————————>獲得A鎖————>釋放A鎖

          3線程———>獲得B鎖———>獲得A鎖————>釋放A鎖————>釋放B鎖


          問(wèn)題是死鎖,但暴露了兩部分問(wèn)題:

          1.過(guò)早的認(rèn)為自己能控制好競(jìng)爭(zhēng)關(guān)系,對(duì)線程間的競(jìng)爭(zhēng)過(guò)早的做出了判斷

          2.每多設(shè)計(jì)一個(gè)鎖就增加了一個(gè)競(jìng)爭(zhēng)的因素,盡量小心,一個(gè)鎖就有可能是一個(gè)地雷,一不小心就可能導(dǎo)致嚴(yán)重的問(wèn)題。


          《java并發(fā)編程實(shí)踐》這本書(shū)中介紹過(guò)LeftRightLock,詳細(xì)了解這個(gè)問(wèn)題的朋友可以去查下這本書(shū)的第十章 避免活躍性危險(xiǎn)

          此書(shū)極其詳細(xì)的介紹了LeftRightLock出現(xiàn)的可能,有可能是因?yàn)樽约壕帉?xiě)程序的疏忽導(dǎo)致,或者由于對(duì)鎖的認(rèn)識(shí)不足導(dǎo)致,諸多原因都能找到解釋。

          posted @ 2012-06-16 22:22 steven.cui 閱讀(509) | 評(píng)論 (0)編輯 收藏

          NIO的理解,請(qǐng)參照:http://www.goldendoc.org/category/java-nio/

          Netty的一些理解,請(qǐng)參照:

          http://www.kafka0102.com/2010/06/167.html

          http://rdc.taobao.com/team/jm/archives/423


          Netty的高可靠性,可伸縮性,以及效率的確讓人著迷,為什么Netty這么快呢?

          Netty高效的原因:

          1. 實(shí)現(xiàn)了多路Selector用于讀和注冊(cè),線程數(shù)量是cpu*2,reactor都是這么做的,自己處理寫(xiě)事件,這個(gè)我在自己框架中也是這么做的,nio的selector處理注冊(cè)和讀,并且也優(yōu)化了wakeup,Netty中的wakeup也是優(yōu)化過(guò)的,本身一次wakeup對(duì)Nio并不大,但是大批量并發(fā)的時(shí)候就需要進(jìn)行優(yōu)化處理了,只有當(dāng)selector堵塞的時(shí)候進(jìn)行wakeup,或者說(shuō)需要下次立刻返回的時(shí)候wakeup。
          2. Netty在開(kāi)啟多路讀寫(xiě)的時(shí)候,用的是DirectBuffer,并用了SoftReferrence來(lái)做緩存優(yōu)化,減少傳輸數(shù)據(jù)的內(nèi)存移動(dòng)和GC。還有預(yù)測(cè)數(shù)據(jù)算法,這個(gè)具體能不能提高有待討論
          3. 并發(fā)的控制,基于SEDA的設(shè)計(jì)理論構(gòu)建的高效事件模型,真正的異步處理,吞吐量和伸縮性都可以得到保證。


          nio的實(shí)現(xiàn)并不復(fù)雜,但想讓你的底層通訊,效率,以及可伸縮性和高可靠性做好,還是極具挑戰(zhàn)性的。


          目前有個(gè)項(xiàng)目是自己寫(xiě)的nio,但效率比起netty來(lái),小了幾個(gè)數(shù)量級(jí),當(dāng)然以本人一己之力能做到目前這個(gè)情況,還算自己滿意,也用到生產(chǎn)環(huán)境中了,一個(gè)web game,及時(shí)性要求很高,一臺(tái)server,5000人沒(méi)問(wèn)題。同時(shí)廣播消息在10000人以?xún)?nèi),當(dāng)然有些優(yōu)化是在業(yè)務(wù)邏輯層面的。當(dāng)然比起netty的效率來(lái)講還是差了幾個(gè)數(shù)量級(jí)。


          除了高效,Netty在擴(kuò)展性方面做的不錯(cuò):

          1. 豐富的decoder/encoder實(shí)現(xiàn),你可以輕松的繼承一個(gè)類(lèi)實(shí)現(xiàn)自己的邏輯,例如游戲中,直接繼承FiledLengthBaseFrameDecoder即可。
          2. 自行添加decoder或者encoder,自由的控制事件流向順序,通過(guò)這個(gè),可以實(shí)現(xiàn)一些協(xié)議加密解密,協(xié)議過(guò)濾器,統(tǒng)計(jì)工具等等
          3. 提供很多工具類(lèi):Timeout的一些實(shí)現(xiàn),還有ChannelBuffers的一些工具,通常情況下,我們?yōu)榱藴p少對(duì)Netty的依賴(lài),會(huì)自己再封裝一層,以完全達(dá)到脫離Netty的目的,都會(huì)再次封裝一層ChannelBuffer,這樣目的是不要讓上層邏輯跟底層通訊有任何關(guān)聯(lián),降低耦合,當(dāng)然也在為考慮更換底層通訊而不影響上層邏輯。
          4. 提供監(jiān)聽(tīng)底層消息的ChannelFuture,例如發(fā)送完消息可以斷開(kāi)連接等等
          5. 可調(diào)控的通訊架構(gòu),可以根據(jù)業(yè)務(wù)的吞吐量來(lái)調(diào)整,Netty的各項(xiàng)參數(shù)不只有socket的一些設(shè)置,還能控制事件流順序和吞吐量的大小等等。


          最后,基于Netty我簡(jiǎn)單封裝了一個(gè)web game所具備的一些GameBuffer,目前比較簡(jiǎn)陋,后續(xù)可能加入一些別的功能。


          項(xiàng)目在:https://github.com/cuixin/XGameEnginee/


          posted @ 2012-05-15 17:09 steven.cui 閱讀(13462) | 評(píng)論 (7)編輯 收藏

          主站蜘蛛池模板: 新平| 兴安盟| 包头市| 江源县| 黄石市| 永年县| 开封县| 长治市| 安龙县| 开江县| 西宁市| 绥化市| 闽清县| 元阳县| 马龙县| 沧州市| 赣榆县| 宿松县| 平顶山市| 濉溪县| 嘉善县| 广灵县| 精河县| 阿坝县| 阜南县| 涞水县| 龙陵县| 绥棱县| 隆回县| 南平市| 巴塘县| 平顶山市| 三穗县| 松溪县| 买车| 乌拉特前旗| 镇雄县| 定西市| 湘乡市| 夹江县| 怀安县|