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

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

          2012年7月31日

          原來(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 閱讀(243) | 評(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ō)出去的話(huà)就得全部做到,要不就只字未提,聽(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)”?;羯9S(chǎng)是美國(guó)西部電器公司的一家分廠(chǎng)。為了提高工作效率,這個(gè)廠(chǎng)請(qǐng)來(lái)包括心理學(xué)家在內(nèi)的各種專(zhuān)家,在約兩年的時(shí)間內(nèi)找工人談話(huà)兩萬(wàn)余人次,耐心聽(tīng)取工人對(duì)管理的意見(jiàn)和抱怨,讓他們盡情地宣泄出來(lái)。結(jié)果,霍桑廠(chǎng)的工作效率大大提高。這種奇妙的現(xiàn)象就被稱(chēng)作“霍桑效應(yīng)”。

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

               歷時(shí)九年的實(shí)驗(yàn)和研究,學(xué)者們終于意識(shí)到了人不僅僅受到外在因素的刺激,更有自身主觀(guān)上的激勵(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)心員工的情感和員工的不滿(mǎ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)確的話(huà),它所給出的解決生產(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比較主觀(guān),取決于管理人員的個(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)和不能滿(mǎ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ì)把光線(xiàn)、陰影、紋理的負(fù)責(zé)性簡(jiǎn)化為“五條線(xià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ì)新鮮事物充滿(mǎn)好奇,但如果熟悉一種事物,卻很難接受和改變自己替換原有思維。

          如果說(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型把光線(xiàn)、陰影、紋理的復(fù)雜性簡(jiǎn)化為“五條線(xià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能贏(yíng)得桌面的勝利?

               就像是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è)觀(guān)的人在一起你也就變得樂(lè)觀(guān)了。

               進(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à)值觀(guān)、你的偏見(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 閱讀(378) | 評(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è)線(xiàn)程動(dòng)態(tài)的綁定(制定一個(gè)新的存儲(chǔ)位置)一個(gè)新值。Vars可以初始化根綁定(不是必須的),綁定的值對(duì)于所有線(xiàn)程都是共享的,但卻別的線(xiàn)程就不能重新綁定。因此,要么Var可以為每個(gè)線(xiàn)程綁定值,要么使用根綁定。

          下面的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)記的方式,然后在線(xiàn)程用時(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)建后其他線(xiàn)程是是不可見(jiàn)的。創(chuàng)建的binding可以被賦值,也就是在沒(méi)有離開(kāi)調(diào)用堆棧之前可以被上下文訪(fǎng)問(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)用的上下文或者或者線(xiàn)程。

           

          (set! var-symbol expr)

          將Vars指定為special form

          當(dāng)?shù)匾粋€(gè)操作符為symbol的時(shí)候,它必須是全局變量。當(dāng)前線(xiàn)程綁定的值就是后面的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),這些值只能被手工的訪(fǎng)問(wèn),但是也可以用作當(dāng)前線(xiàn)程的變量。

          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 閱讀(1499) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 米脂县| 开平市| 洞口县| 南京市| 县级市| 滦平县| 兴安县| 张家口市| 盐城市| 金昌市| 普陀区| 长宁县| 越西县| 井陉县| 赣州市| 建始县| 云林县| 商都县| 庄河市| 全州县| 孟州市| 沛县| 营口市| 沙湾县| 安西县| 湾仔区| 南充市| 永嘉县| 朝阳区| 宾阳县| 奉化市| 宜兰县| 远安县| 临夏县| 甘泉县| 大名县| 文登市| 弥渡县| 湾仔区| 西青区| 阜新市|