http://www.100hack.com
或者
http://cuixin.github.com
posted @ 2013-06-29 01:30 steven.cui 閱讀(243) | 評論 (0) | 編輯 收藏
|
|||
原來Markdown如此之方便,github又提供了page服務,還能用上git,真是無法無天了! http://www.100hack.com 或者 http://cuixin.github.com posted @ 2013-06-29 01:30 steven.cui 閱讀(243) | 評論 (0) | 編輯 收藏 第5章 調試你的大腦 我從來都不想成為怪人,但別人都認為我想。 ——弗蘭克.扎帕,美國作曲家、音樂家、電影導演 直覺是偉大的, 除了當它不偉大的時候。 我們必須直視自己,“調試”(debug)自己的大腦。 關于debugging,可以自己擴展閱讀,軟件是有人創造的,錯誤難免。 為什么這么說呢?人類大腦又不是開源軟件,沒法找到代碼去修正,只是展示出錯的地方,但你卻能知道自己的缺陷在哪里,只能盡量避免,卻幾乎難以修正。這就是人,而不是計算機: 1.認知偏見:思維如何被誤導 2.時代影響:同代人如何影響你 3.個性傾向:個性如何影響思維 4.硬件故障:大腦較老區域如何壓制較聰明的區域 了解認知偏見 Wikipedia列舉了大約90多種認知偏見,書中著重舉了幾個值得重視的偏見: 思維定勢 思維定勢(Thinking Set) 是由先前的活動而造成的一種對活動的特殊的心理準備狀態,或活動的傾向性。在環境不變的條件下,定勢使人能夠應用已掌握的方法迅速解決問題。而在情境發生變化時,它則會妨礙人采用新的方法。消極的思維定勢是束縛創造性思維的枷鎖。 基本歸因錯誤 歸因理論的一個現象,即人們常常把他人的行為歸因于人格或態度等內在特質上,而忽略他們所處情境的重要性。比如,盡管我們在評價他人的行為時有充分的證據支持,但我們總是傾向于低估外部因素的影響,而高估內部或個人因素的影響。這種現象解釋了當銷售人員的業績不佳時,銷售經理更傾向于將其歸因于下屬的懶惰而不是競爭對手的實力。 基本歸因錯誤(fundamental attribution error,FAE)描繪人們在考察某些行為或后果的原因時高估傾向性因素(譴責或贊譽人)、低估情境性因素(譴責或贊譽環境)的雙重傾向。 自私的偏見 這種偏見使人們相信,項目的成功是我的功勞,失敗則與我無關。這種行為可能是一種個人防御機制導致的,但是請記住你也是系統的一部分——無論結果好與壞。 需要定論 我們對疑問和不確定性感到不舒服,我們會竭盡全力解決不確定性。其實不確定性有時候是件好事,選擇是開放的。如果強行把不確定的事情強行的定論,會迫使你選擇放棄,易于犯錯,例如你宣布了一項項目截止日期,并沒有能力移除內在的不確定性,它只是一種自我掩飾。說到這里,我們常說靠譜還是不靠譜,我個人是比較煩不靠譜的人,而我愛人卻總結出,不靠譜的人有時候往往做朋友比靠譜的人好相處,而且有時候能幫到你。 因為不靠譜的人在事情模棱兩可的時候就可以承諾,但你別太把承諾當回事,也許他看似不靠譜的事情,真的就能辦到。因為靠譜的人從來不做沒把握的事情,不敢于嘗試,不去爭取嘗試甚至,特別覺得一旦說出去的話就得全部做到,要不就只字未提,聽她說完,身邊的朋友的確,雖然有些看似不靠譜的,卻真心對待的朋友,他們不是不靠譜,而是敢于給你幫助。 認可上的偏見 每個人都根據自己的成見和喜好原則來選擇相應的事實。 曝光效應 會因為習慣和熟悉某種事物對其偏愛,這包括不在好用或者出錯的工具或者技術。 1)社會心理學家所說的“霍桑效應”也就是所謂“宣泄效應”。霍桑工廠是美國西部電器公司的一家分廠。為了提高工作效率,這個廠請來包括心理學家在內的各種專家,在約兩年的時間內找工人談話兩萬余人次,耐心聽取工人對管理的意見和抱怨,讓他們盡情地宣泄出來。結果,霍桑廠的工作效率大大提高。這種奇妙的現象就被稱作“霍桑效應”。 2)1924年11月,以哈佛大學心理專家梅奧為首的研究小組進駐西屋(威斯汀豪斯)電氣公司的霍桑工廠,他們的初衷是試圖通過改善工作條件與環境等外在因素,找到提高勞動生產率的途徑。他們選定了繼電器車間的六名女工作為觀察對象。在七個階段的試驗中,支持人不斷改變照明、工資、休息時間、午餐、環境等因素,希望能發現這些因素和生產率的關系——這是傳統管理理論所堅持的觀點。但是很遺憾,不管外在因素怎么改變,試驗組的生產來效率一直未上升。 歷時九年的實驗和研究,學者們終于意識到了人不僅僅受到外在因素的刺激,更有自身主觀上的激勵,從而誕生了管理行為理論。就霍桑試驗本身來看,當這六個女工被抽出來成為一組的時候,她們就意識到了自己是特殊的群體,是試驗的對象,是這些專家一直關心的對象,這種受注意的感覺使得她們加倍努力工作,以證明自己是優秀的,是值得關注的。 有一所國外的學校,在入學的時候會對每個學生進行智力測試,以智力測驗的結果將學生分為優秀班和普通班。結果有一次在例行檢查時發現,一年之前入學的一批學生的測驗結果由于某種失誤被顛倒了,也就是說現在的優秀班其實是普通的孩子,而真正聰明的孩子卻在普通班。但是這一年的課程成績卻如同往年一樣,優秀班明顯高于普通班,并未出現異常。原本普通的孩子被當作優等生關注,他們自己也就認為自己是優秀的,額外的關注加上心理暗示使得丑小鴨真的成了白天鵝。 實驗結論
研究者認為,這種自然形成的非正式組織(群體),它的職能,對內在于控制其成員的行為,對外則為了保護其成員,使之不受來自管理階層的干預。這種非正式的組織一般都存在著自然形成的領袖人物。至于它形成的原因,并不完全取決于經濟的發展,主要是與更大的社會組織相聯系。 霍桑實驗最初的研究是探討一系列控制條件(薪水、車間照明度、濕度、休息間隔,等)對員工工作表現的影響。研究中意外發現,各種試驗處理對生產效率都有促進作用,甚至當控制條件回歸初始狀態時,促進作用仍然存在。這一現象發生在每一名受試驗者身上,對于受試驗者整體而言,促進作用的結論亦為真。 很顯然,實驗假設的各項條件并非是唯一的或決定性的生產效率影響因素。對此,喬治·埃爾頓·梅奧(George Elton Mayo)以及他的助手們所做的解釋是,受試者對于新的實驗處理會產生正向反應,即由于環境改變(試驗者的出現)而改變行為。所以績效的提高,并非由實驗操控造成。這種效果就是我們所稱的“霍桑效應”或“霍索恩效應”(Hawthorne Effect)。 霍桑效應的優點
霍桑效應的缺點
霍桑效應的啟示 “霍桑效應”,也就是社會心理學所說的“宣泄效應”,它給我們的啟示是:人在生產或者生活的過程中,對自己未能實現和不能滿足的情緒,要把它發泄出來,情緒的發泄對人的身心健康和工作效率都非常有利。 虛假記憶(讓我想到一部片子《羅生門》) 虛假記憶(pseudo memory)是大腦記憶的信息之間自動的組合導致不真實的回憶。每個人的大腦都可能產生虛假的記憶,或將事物的真實情況扭曲。人們會對自己的記憶堅信不疑,甚至會對大腦編造的謊言信以為真。這并非一種發病過程。所有人都會產生虛假記憶”,特別是關于童年時期親身經歷的場景的記憶。 符號約簡謬論和名詞謬論 移位給事物貼上個標簽就意味著理解或者能解釋它,例如:當你嘗試畫一只人手時,L型思維的人會把光線、陰影、紋理的負責性簡化為“五條線加一個棍”。就如同人們一直認為天鵝只能是白的。 在這里本人強烈推薦《怪誕心理學》,《影響力》,《引爆點》,《烏合之眾》等等,關于心理方面的書籍,每個人都應該讀點心理學,不是在于說自己腦子有問題,每個人都是有心理偏差的,正因為心理偏差造成的個體不同,才有各種不同的性格,社會進步的重要標志是能包容各種形式的不同形態存在。 心理偏差是你的個性也好性格也罷,敢于去了解別人和自己本身就是一種對自己思維的挑戰,或許說你再向自己發出改變的挑戰,也許習慣是最難改變的,我們看似對新鮮事物充滿好奇,但如果熟悉一種事物,卻很難接受和改變自己替換原有思維。 如果說中國古代皇帝最有作為的——李世民,如果只是但從人心理角度出發分析,對與其“元認知”的能力讓其能把國建建設的如此強大——自我批判和自我重塑,而這份能力恰恰是管理者最需要的能力。 預言的失敗 做預言太困難了,特別是關于未來的預測。 ——瑜伽.貝拉,偉大的智者、哲學家兼棒球手 符號約簡(請注意:不是符號簡約,這兩個字前后顛倒,卻意思相差萬里)是個非常有害的問題,看個例子,你在嘗試畫一只人手時,L型把光線、陰影、紋理的復雜性簡化為“五條線加一個棍”。這種簡化被認為把復雜的現實看做由基本原素的組成:柏拉圖立體。 我們善于將復雜的東西進行簡化和抽象,并且計算機編程也是如此之思想,但會讓我們陷入誤區。 以前從來沒有人認為有黑天鵝的存在,以至于科學界認為沒有黑天鵝,知道有一只黑天鵝真的出現了。沒發現不等于不存在,很少也不代表沒有。 作為一個團隊,我們往往會錯過重要的發展,因為我們關注了錯誤的事情或者提了錯誤的問題。 現在,還有人在討論學習java好還是.net好?N年前的各種爭吵:RMI還是CORBA能取得中間件的勝利?Windows還是Linux能贏得桌面的勝利? 就像是WEB的發展讓這些問題毫無意義,Web是典型的黑天鵝,其出乎意料的改變了游戲規則。 “很少“不意味著”沒有“ 2012,7.21北京據說60年一遇的暴雨,幾乎每年都喊。程序員在寫程序的時候,不可能出現這樣的bug啊,其實應該說概率低,但不代表沒有這種情況發生,花時間查一下認為的不可能的事情吧。不要說:”絕不可能“! 推遲下結論 軟件的制作過程在我本人看來就是一個消除不確定性的過程,而且跟時間成正比,如下圖所示: 到項目末尾時你會達到智力巔峰,而在項目開始時則是最無知的。 頂住壓力。你會做出決策,事情會解決,只不過不是今天。 適應不確定性,適應敏捷開發,盡可能的用更靈活的技術適應不確定性,適應了不確定性也就等于提高了效率。 難以回憶 記憶是靠不住的,舊的記憶會隨著時間改變,這反而會是你以為某些誤解和偏見是對的,不要僅僅依賴你的記憶。中國有句諺語說得好:好記性不如爛筆頭。 認清時代的影響 在這章里作者給出了美國從1901到現在經歷的幾個時代,從技術和人的思維的變化,相似年齡段的人對某種事物的開發更接近,也就是不同年齡層次的人有代溝。本人不再贅述作者講述的美國各年代的歷史,其實這是我們都難以去逾越的,要想避免你所處時代的特有偏見,最好的方法就是保持多樣性。承認一種事物的存在,但卻能淡定的確很難。 了解個性傾向 他人即地獄。 ——讓.保羅.薩特,法國思想家、作家、存在主義哲學 尊重不同人的不同性格,當你跟別人爭辯時,請想一想這點。 MBTI(Myers Briggs Type Indicator)性格評估測試,在國內有些機構可以做些專業評測,如果想找免費的,可以借助谷歌去找,但如果英文一般的同學想做這個測試,我建議你去百合網,雖然是個婚戀網站,但這個MBTI還是比較專業哦,不過MBTI的測試結果就如同你自己的性格一樣,性格有些人會發生改變,但有些人可能一輩子難以改變,曾經我做過測試,經歷過幾年后的測試有個界限發生了改變,所以不要讓MBTI成為你潛意識的引導,而是作為了解自己的途徑,但不要太過于相信,而是時常打破自己的”符號約簡“。 找出硬件問題 大腦常犯一些低級錯誤——硬件問題。 我曾見看過各種報到,為了一個誤會能讓人失去理智。。。 蜥蜴邏輯: 戰斗、逃跑或者恐懼 立刻行動,不加思考 領頭意識,隨意指使你的隊友 守衛領土,不分享信息和秘訣 受到傷害,憤憤不平,讓所有人都知道這是不公平的 像我這樣==好,不像我這樣==不好 你或許認識到以上幾點我們都有過呢? 見樣學樣,近朱者赤,近墨者黑,情緒就像傳染病,常跟一些樂觀的人在一起你也就變得樂觀了。 進化行為:當你開始重播這些喜歡的電影時,努力阻止自己,記住:這只是一部電影。 心靈是自己的地方,在那里可以把地獄變成天堂,也可以把天堂變成地獄。 ——約翰.米爾頓《失樂園》 現在我不知道該思考什么 在上幾章提過,直覺是一種強大的工具,是專家的標志。但直覺可能完全錯誤,我們認為“正常的”未必是正常的。除了各種偏見,你可能被你自己誤導,認為一切都好。 之前提到關于創造一個R型到L型的轉化,也就是說,思考時是全局性和經驗性的,然后轉換成更常規的實踐和技能,從而實現學習過程。 相信直覺,但是要驗證。 最后,測試你自己 當你堅信某種事情時,問問自己原因。 嘗試問問自己以下問題: 你怎么知道的? 誰說的? 有什么特別的? 我的做法會如何影響你? 與什么或者誰比較? 這總是發生么?你能想到一個特例么? 如果你這樣做了(或者不這樣做)會怎么樣? 什么阻止了你? 實踐: 當發生沖突時,考慮基本性格類型、不同年代的價值觀、你的偏見、別人的偏見和情境。通過司考更多因素,是不是更容易解決沖突? 仔細檢查你的立場。你是如何知道你所知道的?什么使你這樣認為? 我們通過邏輯來證明,通過直覺去發現。 ——龐加萊
posted @ 2012-08-13 01:38 steven.cui 閱讀(378) | 評論 (0) | 編輯 收藏 原文請參考,如有問題和歧義請指正,謝謝:) 變量和全局環境 Clojure是個很實用的語言,偶爾需要將維護和改變數據的值。她提供了4種不同的方式來操作變量:Vars, Refs, Agents, 和Atoms。Vars機制是是指向一個可改變的數據的位置,你可以為每個線程動態的綁定(制定一個新的存儲位置)一個新值。Vars可以初始化根綁定(不是必須的),綁定的值對于所有線程都是共享的,但卻別的線程就不能重新綁定。因此,要么Var可以為每個線程綁定值,要么使用根綁定。 下面的special form def 創建了一個Var,如果Var不存在和沒有給初始化,var就是不綁定的(不允許創建非動態的Var,必須顯式指定根綁定): user=> (def x) 為根值初始化(如果存在,就被再次綁定) user=> (def x 1) 默認情況下(定義的時候初始化了根綁定),Vars是靜態的(static),但是,建立動態Var的定義可以通過元數據標記的方式,然后在線程用時通過binding來指定。 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被創建后其他線程是是不可見的。創建的binding可以被賦值,也就是在沒有離開調用堆棧之前可以被上下文訪問。可以在一塊代碼之前設置matadata標簽:dynamic來指定: 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=>
如果你想讓函數編譯為static的,并且指定返回值,可以看下面的例子(速度提升不少,關鍵的調用函數可以采用這種方式加速): (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=>
在上下文中可能需要重定義靜態變量,從Clojure1.3開始提供with-redefs和with-redefs-fn這兩個宏來修改。 定義函數的defn也是Vars的存儲方式,也可以在運行時被重定義。這也為aop編程帶來很多方便,例如:你可以封裝一個類似logging函數給調用的上下文或者或者線程。
(set! var-symbol expr) 將Vars指定為special form 當地一個操作符為symbol的時候,它必須是全局變量。當前線程綁定的值就是后面的expr,也就是說必須是Thread-local的才可以,否則將會拋出一個使用set!來設定根綁定變量的錯誤。變量的表達式expr必須有返回值。 注意,你不能賦值給一個函數的參數或者本地綁定,只能是java的字段Vars Refs和Agents,因為這些數據在Clojure里可不變的。 使用set為java字段設置值,可以查看 Java Interop.
Interning 命名空間維護了每個Var對象的全局符號映射。如果使用def定義變量沒有在當前的命名空間找到該符號,就創建一個,否則使用現有的。創建或者尋找的過程被稱作interning。這就意味著,除非Var對象取消映射,否則Var對象每次被查詢,所以請在循環中千萬不要引用Var的全局變量,否則將非常慢,通過let或者binding讓全局變量取消映射來提高速度。命名空間在Evaluation中構建了全局環境,編譯器也把所有free symbols當做Vars來解析了。 可以使用閱讀宏(Reader)#’來得到Var對象的內部的值。
Non-interned的類型的變量 可以通過with-local-vars來創建non-interned類型的變量,在free symbol解析的時候將不會被發現,這些值只能被手工的訪問,但是也可以用作當前線程的變量。 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) | 評論 (0) | 編輯 收藏 原文章寫在Google Groups thread里,但是還是值得再說下。 有朋友把Java和Clojure的一些代碼片段放在Clojure Google group里比較,并提到Java的性能要比Clojure快太多了,疑問到底Clojure能不能趕上Java? 在我的一個開源項目clj-starcraft中,關于java的性能問題,實際上也是我始終面對的,在我寫這篇文章的時,我的Clojure代碼還是慢了Java代碼6倍(Clojure花了70秒解析了1050個文件,Java則只有12秒) 然而,70秒對過去的速度而言不算太糟糕,在剛開始的時候,竟然花了10分鐘來分析1050個文件。甚至比我用Python實現的還要慢。 感謝Java的profiler和熱情的Clojure朋友,下面列出了我在提升Clojure性能方面的一些tips: (set! *warn-on-reflection* true) 這恐怕是最重要的一個提升:打開這個設置將會警告你在任何一處用到Java反射API的方法和屬性。如你所想,直接調用永遠比反射要快,不管哪里Clojure都會你不能解析這個方法,你需要自己用type hint方式來避免反射調用。關于使用type hint,Clojure官方站點給了一個如何使用和提速的例子。 修復所有關于*warn-on-reflection* 的編譯警告后,我的clj-starcraft從10分鐘降到了3分半。 強制設置數據類型 Clojure可以使用Java的基礎數據類型,無論何時在循環的時候,堅決考慮將你的值強制轉換成基礎類型,這將大幅提高你的性能。基礎數據類型在Clojure官方網站有例子和如何進行強制轉換來提高性能。 使用二元運算符 Clojure可以在一行里面支持多個表達式,但對于運算操作符,只有在兩個的時候才被inlined,如果你發現自己的運算符已經超過了兩個,或許該考慮重寫你的代碼讓操作符顯示的成為兩個。下面請看兩者之間的比較: user> (time (dotimes [_ 1e7] (+ 2 4 5))) "Elapsed time: 1200.703487 msecs" user> (time (dotimes [_ 1e7] (+ 2 (+ 4 5)))) "Elapsed time: 241.716554 msecs" 使用==代替= 使用==比較數字來代替=,提升性能那是相當明顯: 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 在一段循環種,如果你想為了提升可讀性從vector中傳出值,考慮下標訪問來代替destructing binding。雖然代碼看起來更清晰,但卻非常慢。 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" 優先使用本地變量 如果你需要在循環中查詢一個值,你或許需要考慮使用本地變量(通過let定義)來代替全局變量。看下兩者的時間對比: 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" 如果你想使用本地變量來提升性能,可以考慮下面比較土的式的方式來避免全局變量: (let [local-x x] (defn my-fn [a b c] ...)) 使用profiler工具: JVM有兩個profiler工具, -Xprof和-Xrunhprof,找到程序瓶頸而不是瞎猜。 最后說明: 你已經注意到,在這些性能提升中,通過調用百萬量的執行來提升了幾百毫秒的性能。所以,不到萬不得已需要提升性能的時候,沒必要讓你的代碼看起來不夠清晰。 原文地址: http://gnuvince.wordpress.com/2009/05/11/clojure-performance-tips/ 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 閱讀(1960) | 評論 (2) | 編輯 收藏 |
|||