??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://www.100hack.com
或?br />
http://cuixin.github.com
我从来都不想成ؓ(f)怪hQ但别h都认为我惟?/p>
——弗兰?扎帕Q美国作曲家、音乐家、电(sh)影导?/p>
直觉是伟大的Q?除了当它不伟大的时候?/p>
我们必须直视自己Q?#8220;调试”(debug)自己的大脑?/p>
关于debuggingQ可以自己扩展阅读,软g是有人创造的Q错误难免?/p>
Z么这么说呢?人类大脑又不是开源YӞ没法扑ֈ代码M正,只是展示出错的地方,但你却能知道自己的缺陷在哪里Q只能尽量避免,却几乎难以修正。这是人,而不是计机Q?/p>
1.认知偏见Q思维如何被误?/p>
2.时代影响Q同代h如何影响?/p>
3.个性們Q个性如何媄响思维
4.g故障Q大脑较老区域如何压制较聪明的区?/p>
了解认知偏见
Wikipedia列D了大U?0多种认知偏见Q书中着重D了几个值得重视的偏见:(x)
思维定势
思维定势QThinking SetQ?是由先前的活动而造成的一U对zd的特D的心理准备状态,或活动的們性。在环境不变的条件下Q定势够应用已掌握的方法迅速解决问题。而在情境发生变化Ӟ它则?x)妨h采用新的Ҏ(gu)。消极的思维定势是束~?a _cke_saved_>创造性思维的枷锁?/p>
基本归因错误
归因理论的一个现象,即h们常常把他h的行为归因于人格或态度{内在特质上Q而忽略他们所处情境的重要性。比如,管我们在评价他人的行ؓ(f)时有充分的证据支持,但我们L們于低估外部因素的影响Q而高估内部或个h因素的媄响。这U现象解释了当销售h员的业W不佳Ӟ销售经理更們于将其归因于下属的懒惰而不是竞争对手的实力?/p>
基本归因错误Qfundamental attribution errorQFAEQ描lh们在考察某些行ؓ(f)或后果的原因旉估們性因素(谴责或赞誉hQ、低估情境性因素(谴责或赞誉环境)的双重們?/p>
自私的偏?/strong>
q种偏见使h们相信,目的成功是我的功劳Q失败则与我无关。这U行为可能是一U个人防御机制导致的Q但是请C你也是系l的一部分——无论l果好与坏?/p>
需要定?/strong>
我们对疑问和不确定性感C舒服Q我们会(x)竭尽全力解决不确定性。其实不定性有时候是件好事,选择是开攄。如果强行把不确定的事情的定论,?x)迫使你选择攑ּQ易于犯错,例如你宣布了一w目截止日期,q没有能力移除内在的不确定性,它只是一U自我掩饰。说到这里,我们常说靠谱q是不靠谱,我个人是比较烦不靠谱的hQ而我׃h却ȝ出,不靠q人有时候往往做朋友比靠谱的h好相处,而且有时候能帮到你?/p>
因ؓ(f)不靠q人在事情模棱两可的时候就可以承诺Q但你别太把承诺当回事,也许他看g靠谱的事情,真的p办到。因为靠qZ来不做没把握的事情,不敢于尝试,不去争取试甚至Q特别觉得一旦说出去的话得全部做到Q要不就只字未提Q听她说完,w边的朋友的,虽然有些看似不靠qQ却真心对待的朋友,他们不是不靠谱,而是敢于l你帮助?/p>
认可上的偏见
每个人都Ҏ(gu)自己的成见和喜好原则来选择相应的事实?/p>
曝光效应
?x)因Z(fn)惯和熟?zhn)某种事物对其偏爱Q这包括不在好用或者出错的工具或者技术?/p>
1Q社?x)心理学家所说的“霍桑效应”也就是所?#8220;宣泄效应”。霍桑工厂是国襉K?sh)器公司的一家分厂。ؓ(f)了提高工作效率,q个厂请来包括心理学家在内的各种专家Q在U两q的旉内找工h谈话两万余hơ,耐心听取工h对管理的意见和抱怨,让他们尽情地宣泄出来。结果,霍桑厂的工作效率大大提高。这U奇妙的现象pUC“霍桑效应”?/p>
2Q?924q?1月,以哈?jng)大学心理专家梅奥?f)首的研究组q驻西屋Q威斯汀豪斯Q电(sh)气公司的霍桑工厂Q他们的初衷是试N过改善工作条g与环境等外在因素Q找到提高劳动生产率的途径。他们选定了?sh)器车间的六名女工作察对象。在七个阶段的试验中Q支持h不断改变照明、工资、休息时间、午、环境等因素Q希望能发现q些因素和生产率的关p?#8212;—q是传统理理论所坚持的观炏V但是很遗憾Q不外在因素怎么改变Q试验组的生产来效率一直未上升?/p>
历时?ji)年的实验和研究Q学者们l于意识CZ仅仅受到外在因素的刺ȀQ更有自w主观上的激励,从而诞生了理行ؓ(f)理论。就霍桑试验本n来看Q当q六个女工被抽出来成Zl的时候,她们意识到了自己是Ҏ(gu)的群体,是试验的对象Q是q些专家一直关心的对象Q这U受注意的感觉得她们加倍努力工作,以证明自己是优秀的,是值得x的?/p>
有一所国外的学校,在入学的时候会(x)Ҏ(gu)个学生进行智力测试,以智力测验的l果学生分ZU班和普通班。结果有一ơ在例行查时发现Q一q之前入学的一批学生的验l果׃某种p被颠倒了Q也是说现在的优秀班其实是普通的孩子Q而真正聪明的孩子却在普通班。但是这一q的评成W却如同往q一P优秀班明N于普通班Qƈ未出现异常。原本普通的孩子被当作优{生xQ他们自׃p己是优秀的,额外的关注加上心理暗CZ得丑鸭真的成了白天鹅?/p>
实验l论
研究者认为,q种自然形成的非正式l织Q群体)Q它的职能,对内在于控制其成员的行ؓ(f)Q对外则Z保护其成员,使之不受来自理阶层的干预。这U非正式的组l一般都存在着自然形成的领袖h物。至于它形成的原因,q不完全取决于经的发展Q主要是与更大的C会(x)l织相联pR?/p>
霍桑实验最初的研究是探讨一pd控制条gQ薪水、R间照明度、湿度、休息间隔,{)对员工工作表现的影响。研I中意外发现Q各U试验处理对生效率都有促进作用Q甚臛_控制条g回归初始状态时Q促q作用仍然存在。这一现象发生在每一名受试验者n上,对于受试验者整体而言Q促q作用的l论亦ؓ(f)真?/p>
很显Ӟ实验假设的各Ҏ(gu)件ƈ非是唯一的或军_性的生效率影响因素。对此,乔治·埃尔?#183;梅奥Q?a _cke_saved_>George Elton MayoQ以及他的助手们所做的解释是,受试者对于新的实验处理会(x)产生正向反应Q即׃环境改变Q试验者的出现Q而改变行为。所以W效的提高Qƈ非由实验操控造成。这U效果就是我们所U的“霍桑效应”?#8220;霍烦恩效?#8221;QHawthorne EffectQ?/p>
霍桑效应的优?/p>
霍桑效应的缺?/p>
霍桑效应的启C?/p>
“霍桑效应”Q也是C会(x)心理学所说的“宣泄效应”Q它l我们的启示是:(x)人在生或者生zȝq程中,对自己未能实现和不能满的情l,要把它发泄出来,情A的发泄对人的w心健康和工作效率都非常有利?/p>
虚假记忆Q让我想C部片子《罗生门》)
虚假记忆Qpseudo memoryQ是大脑记忆的信息之间自动的l合D不真实的回忆。每个h的大脑都可能产生虚假的记忆,或将事物的真实情冉|曌Ӏh们会(x)对自q记忆坚信不疑Q甚至会(x)对大脑编造的谎言信以为真。这q一U发病过E。所有h都会(x)产生虚假记忆”Q特别是关于童年时期亲nl历的场景的记忆?/p>
W号U简谬论和名词谬?/strong>
UMl事物脓(chung)上个标签意味着理解或者能解释它,例如Q当你尝试画一只h手时QL型思维的h?x)把光线、阴影、纹理的负责性简化ؓ(f)“五条U加一个棍”。就如同Z一直认为天鹅只能是白的?/strong>
在这里本人强烈推荐《怪诞心理学》,《媄响力》,《引爆点》,《乌合之众》等{,关于心理斚w的书c,每个人都应该ȝ心理学,不是在于说自p子有问题Q每个h都是有心理偏差的Q正因ؓ(f)心理偏差造成的个体不同,才有各种不同的性格Q社?x)进步的重要标志是能包容各种形式的不同Ş态存在?/p>
心理偏差是你的个性也好性格也ŞQ敢于去了解别h和自己本w就是一U对自己思维的挑战,或许说你再向自己发出改变的挑战,也许?fn)惯是最难改变的Q我们看似对新鲜事物充满好奇Q但如果熟?zhn)一U事物,却很难接受和改变自己替换原有思维?/p>
如果说中国古代皇帝最有作为的——李世民,如果只是但从人心理角度出发分析,对与?#8220;元认?#8221;的能力让其能把国建徏讄如此强大——自我批判和自我重塑,而这份能力恰恰是理者最需要的能力?/p>
预言的失?/strong>
做预a太困难了Q特别是关于未来的预?/p>
——瑜伽.贝拉Q伟大的、哲学家兼棒球手
W号U简Q请注意Q不是符L(fng)U,q两个字前后颠倒,却意思相差万里)是个非常有害的问题,看个例子Q你在尝试画一只h手时QL型把光线、阴影、纹理的复杂性简化ؓ(f)“五条U加一个棍”。这U简化被认ؓ(f)把复杂的现实看做由基本原素的l成Q柏拉图立体?/p>
我们善于复杂的东西q行化和抽象Qƈ且计机~程也是如此之思想Q但?x)让我们陷入误区?/p>
以前从来没有为有黑天鹅的存在Q以至于U学界认为没有黑天鹅Q知道有一只黑天鹅真的出现了。没发现不等于不存在Q很也不代表没有?/p>
作ؓ(f)一个团队,我们往往?x)错q重要的发展Q因为我们关注了错误的事情或者提了错误的问题?/p>
现在Q还有h在讨论学?fn)java好还?net好?Nq前的各U争吵:(x)RMIq是CORBA能取得中间g的胜利?Windowsq是Linux能赢得桌面的胜利Q?/p>
像是WEB的发展让q些问题毫无意义QW(xu)eb是典型的黑天鹅,其出乎意料的改变了游戏规则?/p>
“很少“不意味着”没有“
2012Q?.21北京据说60q一遇的暴雨Q几乎每q都喊。程序员在写E序的时候,不可能出现这L(fng)bug啊,其实应该说概率低Q但不代表没有这U情况发生,花时间查一下认为的不可能的事情吧。不要说Q?#8221;l不可能“Q?/p>
推迟下结?/strong>
软g的制作过E在我本人看来就是一个消除不定性的q程Q而且跟时间成正比Q如下图所C:(x)
到项目末时你会(x)辑ֈ智力巅峰Q而在目开始时则是最无知的?/p>
住压力。你?x)做出决{,事情?x)解冻I只不q不是今天?/p>
适应不确定性,适应敏捷开发,可能的用更灉|的技术适应不确定性,适应了不定性也q于提高了效率?/p>
难以回忆
记忆是靠不住的,旧的记忆?x)随着旉改变Q这反而会(x)是你以ؓ(f)某些误解和偏见是对的Q不要仅仅依赖你的记忆。中国有句谚语说得好Q好记性不如烂W头?/p>
认清时代的媄?/strong>
在这章里作者给Z国?901到现在经历的几个时代Q从技术和人的思维的变化,怼q龄D늚人对某种事物的开发更接近Q也是不同q龄层次的h有代沟。本Z再赘qC者讲q的国各年代的历史Q其实这是我们都难以去逾越的,要想避免你所处时代的Ҏ(gu)偏见Q最好的Ҏ(gu)是保持多样性。承认一U事物的存在Q但却能淡定的确很难?/p>
了解个性們
他h卛_狱?/p>
——?保罗.萨特Q法国思想家、作家、存在主义哲?/p>
重不同人的不同性格Q当你跟别h争辩Ӟh一惌炏V?/p>
MBTI(Myers Briggs Type Indicator)性格评估试Q在国内有些机构可以做些专业评测Q如果想扑օ费的Q可以借助hLQ但如果英文一般的同学惛_q个试Q我你去癑|,虽然是个婚恋|站Q但q个MBTIq是比较专业哦,不过MBTI的测试结果就如同你自q性格一P性格有些Z(x)发生改变Q但有些人可能一辈子难以改变Q曾l我做过试Q经历过几年后的试有个界限发生了改变,所以不要让MBTI成ؓ(f)你潜意识的引|而是作ؓ(f)了解自己的途径Q但不要太过于相信,而是时常打破自己?#8221;W号U简“?/p>
扑ևg问题
大脑常犯一些低U错?#8212;—g问题?/p>
我曾见看q各U报刎ͼZ一个误?x)能让h失去理智。。?/p>
蜥蜴逻辑Q?/strong>
战斗、逃跑或者恐?/p>
立刻行动Q不加思?/p>
领头意识Q随意指使你的队?/p>
守卫领土Q不分n信息和秘诀
受到伤害Q愤愤不qI让所有h都知道这是不公^?/p>
像我q样==好,不像我这?=不好
你或许认识到以上几点我们都有q呢Q?/p>
见样学样Q近p赤Q近墨者黑Q情l就像传染病Q常跟一些乐观的人在一起你也就变得乐观了?/strong>
q化行ؓ(f)Q当你开始重播这些喜Ƣ的?sh)媄Ӟ努力L自己Q记住:(x)q只是一部电(sh)影?/strong>
心灵是自q地方Q在那里可以把地狱变成天堂,也可以把天堂变成地狱?/strong>
——U翰.c_ѝ失乐园?/strong>
现在我不知道该思考什?/strong>
在上几章提过Q直觉是一U强大的工具Q是专家的标志。但直觉可能完全错误Q我们认?#8220;正常?#8221;未必是正常的。除了各U偏见,你可能被你自p|认ؓ(f)一切都好?/p>
之前提到关于创造一个R型到L型的转化Q也是_(d)思考时是全局性和l验性的Q然后{换成更常规的实践和技能,从而实现学?fn)过E?/p>
怿直觉Q但是要验证?/p>
最后,试你自?/strong>
当你坚信某种事情Ӟ问问自己原因?/p>
试问问自己以下问题Q?/p>
你怎么知道的?
谁说的?
有什么特别的Q?/p>
我的做法?x)如何媄响你Q?/p>
与什么或者谁比较Q?/p>
qL发生么?你能惛_一个特例么Q?/p>
如果你这样做了(或者不q样做)?x)怎么P
什么阻止了你?
实践Q?/p>
当发生冲H时Q考虑基本性格cd、不同年代的价D、你的偏见、别人的偏见和情境。通过司考更多因素,是不是更Ҏ(gu)解决冲突Q?/p>
仔细查你的立场。你是如何知道你所知道的?什么你这栯为?
我们通过逻辑来证明,通过直觉d现?/strong>
——庞加?/strong>
变量和全局环境
Clojure是个很实用的语言Q偶?dng)需要将l护和改变数据的倹{她提供?U不同的方式来操作变量:(x)Vars, Refs, Agents, 和Atoms。Vars机制是是指向一个可改变的数据的位置Q你可以为每个线E动态的l定Q制定一个新的存储位|)一个新倹{Vars可以初始化根l定(不是必须?Q绑定的值对于所有线E都是共享的Q但却别的线E就不能重新l定。因此,要么Var可以为每个线E绑定|要么使用根绑定?/p>
下面的special form def 创徏了一个VarQ如果Var不存在和没有l初始化Qvar是不绑定的Q不允许创徏非动态的VarQ必L式指定根l定Q:(x)
user=> (def x)
#'user/x
user=> x
java.lang.IllegalStateException: Var user/x is unbound.
为根值初始化Q如果存在,p再次l定Q?/p>
user=> (def x 1)
#'user/x
user=> x
1
默认情况?定义的时候初始化了根l定Q,Vars是静态的(static)Q但是,建立动态Var的定义可以通过元数据标记的方式Q然后在U程用时通过binding来指定?/p>
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被创建后其他U程是是不可见的。创建的binding可以被赋|也就是在没有d调用堆栈之前可以被上下文讉K。可以在一块代码之前设|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=>
如果你想让函数编译ؓ(f)static的,q且指定q回|可以看下面的例子(速度提升不少Q关键的调用函数可以采用q种方式加?Q?/p>
(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开始提?a style="color: #546188; ">with-redefs?a style="color: #546188; ">with-redefs-fnq两个宏来修攏V?/p>
定义函数?a style="color: #546188; ">defn也是Vars的存储方式,也可以在q行时被重定义。这也ؓ(f)aop~程带来很多方便Q例如:(x)你可以封装一个类似logging函数l调用的上下文或者或者线E?/p>
(set! var-symbol expr)
Vars指定为special form
当地一个操作符为symbol的时候,它必L全局变量。当前线E绑定的值就是后面的exprQ也是说必LThread-local的才可以Q否则将?x)抛Z个用set!来设定根l定变量的错误。变量的表达式expr必须有返回倹{?/p>
注意Q你不能赋值给一个函数的参数或者本地绑定,只能是java的字DVars Refs和AgentsQ因些数据在Clojure里可不变的?/p>
使用set为java字段讄|可以查看 Java Interop.
Interning
命名I间l护了每个Var对象的全局W号映射。如果用def定义变量没有在当前的命名I间扑ֈ该符P创Z个,否则使用现有的。创建或者寻扄q程被称作interning。这意味着Q除非Var对象取消映射Q否则Var对象每次被查询,所以请在@环中千万不要引用Var的全局变量Q否则将非常慢,通过let或者binding让全局变量取消映射来提高速度。命名空间在Evaluation中构Z全局环境Q编译器也把所有free symbols当做Vars来解析了?/p>
可以使用阅读?Reader)#’来得到Var对象的内部的倹{?/p>
Non-interned的类型的变量
可以通过with-local-vars来创建non-internedcd的变量,在free symbol解析的时候将不会(x)被发玎ͼq些值只能被手工的访问,但是也可以用作当前线E的变量?/p>
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
有朋友把Java和Clojure的一些代码片D|在Clojure Google group里比较,q提到Java的性能要比Clojure快太多了Q疑问到底Clojure能不能赶上Java?
在我的一个开源项?a >clj-starcraft中,关于java的性能问题Q实际上也是我始l面对的Q在我写q篇文章的时Q我的Clojure代码q是慢了Java代码6?Clojure׃70U解析了1050个文ӞJava则只?2U?
然而,70U对q去的速度而言不算太糟p,在刚开始的时候,竟然׃10分钟来分?050个文件。甚x我用Python实现的还要慢?/p>
感谢Java的profiler和热情的Clojure朋友Q下面列Z我在提升Clojure性能斚w的一些tips:
(set! *warn-on-reflection* true)
q恐怕是最重要的一个提升:(x)打开q个讄会(x)警告你在M一处用到Java反射API的方法和属性。如你所惻I直接调用永远比反要快,不管哪里Clojure都会(x)你不能解析这个方法,你需要自qtype hint方式来避免反调用。关于用type hintQClojure官方站点l了一个如何用和提速的例子?/p>
修复所有关?strong>*warn-on-reflection* 的编译警告后Q我的clj-starcraft?0分钟降到?分半?/p>
强制讄数据cd
Clojure可以使用Java?a >基础数据cdQ无Z时在循环的时候,坚决考虑你的值强制{换成基础cdQ这大q提高你的性能。基数据cd在Clojure官方|站有例子和如何q行强制转换来提高性能?/p>
使用二元q算W?/strong>
Clojure可以在一行里面支持多个表辑ּQ但对于q算操作W,只有在两个的时候才被inlinedQ如果你发现自己的运符已经过了两个,或许该考虑重写你的代码让操作符昄的成Z个。下面请看两者之间的比较Q?/p>
user> (time (dotimes [_ 1e7] (+ 2 4 5)))
"Elapsed time: 1200.703487 msecs"
user> (time (dotimes [_ 1e7] (+ 2 (+ 4 5))))
"Elapsed time: 241.716554 msecs"
使用==代替=
使用==比较数字来代?Q提升性能那是相当明显Q?/p>
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
在一D@环种Q如果你想ؓ(f)了提升可L从vector中传出|考虑下标讉K来代替destructing binding。虽然代码看h更清晎ͼ但却非常慢?/p>
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"
优先使用本地变量
如果你需要在循环中查询一个|你或?dng)R要考虑使用本地变量(通过let定义)来代替全局变量。看下两者的旉Ҏ(gu)Q?/p>
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"
如果你想使用本地变量来提升性能Q可以考虑下面比较土的式的方式来避免全局变量Q?/p>
(let [local-x x]
(defn my-fn [a b c]
...))
使用profiler工具Q?/strong>
JVM有两个profiler工具Q?-Xprof?XrunhprofQ找到程序瓶颈而不是瞎猜?/p>
最后说明:(x)
你已l注意到Q在q些性能提升中,通过调用百万量的执行来提升了几百毫秒的性能。所以,不到万不得已需要提升性能的时候,没必要让你的代码看v来不够清晰?/p>
原文地址: http://gnuvince.wordpress.com/2009/05/11/clojure-performance-tips/
最后补充:(x)可以通过指定~译为staticҎ(gu)来提高性能Q?br />
人应该努力学?fn)洞察和培养自己内心深处的灵光一玎ͼq远q胜于外面流光溢彩的整个世界。然而,人M(x)下意识地抛弃自己Ҏ(gu)的想法,仅仅因ؓ(f)那是他自qx?/strong>
启动感官输入Q?/strong>
研究昄Q用多感官技术可以让学生的学?fn)效果提?倍,目前我本q的?sh)子产品ibooks2 已经是图文声ƈ茂的最的学习(fn)产品了,也许以后全息技术的普及带来所有电(sh)子感官输入和交互的一场革命?/p>
当你困在一个乏味的?sh)话会(x)议或者思考一个棘手的问题Ӟ把玩下回形针或者晚些触觉游戏能~解疲劳?/p>
增加感官体验以促q大脑的使用?/p>
在这里作者推荐不是用商业工?UML或者类似的东西Q直接创建或者记录设计和架构信息Q而是通过U木Q乐高积木等{来增加感官输入?/p>
Z么这样做呢?实际是刺激你的大脑Q大脑L渴望接受q种额外的、新奇的刺激。另外作者提刎ͼ团队成员可以q行角色扮演Q试试吧Q无意中你可能会(x)惛_xx的几句话真是让h捧腹Q但你却对这个过E记忆犹斎ͼ比你写上ȝ或者ȝ下来的文字要强好多倍?/p>
用右脑画画:(x)
l画既是观察?/p>
l画是一UR型活动,׃nȝ被占用,如果你进行的L型活动,同时R型就必须停止。很多休闲活动都能够ȀzR型停止L型的占用Q听音乐、绘甅R静思、慢跑、针U活、攀岩,{等?/p>
角色扮演Q?/p>
书中有个角色扮演的例子,有兴的可以ȝ?a >目理修炼之道》,琌.p描述了扮演的另一个用途:(x)培训团队。在向团队介l一U新框架的次数屡遭经历之后,她和同事大卫.得拉诺决定在下一个团队中用表演来模拟框架。这ơ,开发h员不再抱怨没有听明白Q而是抱怨表演简直浪Ҏ(gu)_(d)因ؓ(f)演出的内容简直是“太简单了Q?#8221;
q是因ؓ(f)角色扮演真的有效?/p>
认知转变Q感受R?/strong>
《用双l画?/strong>Q或者叫《像艺术家一h考?/a>Q来自作者的推荐
促成R型到L型的转变
L岩吧
|扎诺夫教学法(h搜烦Q罗扎诺夫的音乐暗示学习(fn)法)
酒酣写作Q酒醒修改(R型先行,L型做整理Q?/strong>
l对~程Q一人L型,一人R型)Q结对编E每个程序员都应该尝?/strong>
隐喻相同Q抽象与具体事物互相融合Q尝试将复杂的计机用Ş象化的比dl不懂的人,你可以玩玩魔方,实际能恢复不难,转得快需要很长时间的联系Q本人没有l研I下ȝ勇气Q但试了恢复的乐趣Q是个很有意思的q程Q?/strong>
q列参照p(随机q列Q也怸个想法相隔十万八千里Q你却能其q列h。例如,香烟和交通灯可以引出q样一个概念:(x)在香烟上使用U色标志区来作ؓ(f)帮助戒烟的提C。)
pȝ隐喻Q隐L维是编E的基础Q因为它存在于所有的抽象思维中)
讲个W话吧(q默既不是浪Ҏ(gu)_(d)也不是无害的消遣Q而是反映了思维、学?fn)和创造所必须的重要能力。它与联pL兟뀂培d默感以徏立更强的隐喻Q?/strong>
收获R性线?/strong>
你已l知?/strong>
你是否曾l听到电(sh)台里播放的一首老歌Q然后在若干天突然想h名或者歌手?你的R型思维一直在背后异步地思考这个问题,直到最l找到相应的记忆?/p>
伊莱亚斯.豪的奇遇
?845q_(d)一个名?a >伊莱亚斯.?/a>的美国h试发明一U实用缝U机。进展不是非帔R利。在l历了Oѝ艰苦、一无所L(fng)一天之后,晚上他做了一个非常可怕的噩梦Q在叫中惊醒,直冒h?/p>
在噩梦中Q他w处非洲Q被饥饿的食人鱼l架。他马上p被扔q沸水里煮死。他努力挣扎Q而猎手们׃直用一U看h非常可笑的长矛戳向他?/p>
W二天他描述噩梦时说Q他的注意力集中?#8220;可笑的长?#8221;上。因些长矛的前端钩子上有z,q就像是手持~n针上的洞Q只不过后者是在末梢上?/p>
伊莱亚斯接着获得了自动缝U机的第一份美国专利,q要归功于他来之不易的灵感:(x)~n机针的洞需要与q_的针持针方向相反?/p>
利用囑փ?/strong>
1.观察囑փQ努力看清所有细?/p>
2.大声地描q出来(真正发出声音Q这很关键)?/p>
3.利用全部五种感官惌?/p>
4.使用现在时态,即该图像都溜跑了?/p>
利用自由日记
写信是一U伟大的?fn)惯。blogq种模式很受Ƣ迎,wordpress或者blogspot(墙外)推荐?/p>
晨写技?/strong>
早上hW一件事情?/p>
臛_写三,最好不用电(sh)脑,如果使用?sh)脑x所有跟写作无关的东西(只开evernote)
不要审查删减你写的东ѝ不论是优秀的还是陈腐的Q只写下来?/p>
坚持天天?/p>
“自由?#8221;技?/strong>
开个blogQ将你的x随时记录Q或者用evernoteQ保持随旉地可以自由写
利用散步
遇到问题的时候,试着找个安静的地Ҏ(gu)散步Q不要坐在电(sh)脑旁Q离开键盘去解决难题。当你不寄希望于它时Q就?x)发现答案自己冒了出来?/p>
收获模式
代码中的模式
如果你不是一个特别在意编码排版的人,那我可以负责ȝ告诉你,你离真正E序员的路还很远Q反而用lisp的hQ更注意代码排版Q看代码的时间远q高于你写代码的旉Q如果你q代码都排列不好Q问题自焉免不了。切讎ͼ你可以桌子乱,实际是ؓ(f)了保持上下文不被切换Q而代码却不能格式混ؕQ格式都混ؕ甭提逻辑了?/p>
换换脑子
改变解决问题的角度,前面一章提到过Q了解一只青蛙不是解剖它Q而是如何创造它Q?/strong>
谕冲击的魔?/strong>
在古代,教堂的大Ll常通过谕求的。像大多数算命者或者占星师一P谕l予的响应或者信息通常非常模糊Q就像谜一栗你不得不自己来“解释”它。这是对大脑的一ơ冲凅R?/strong>
作曲家布莱恩.伊诺和彼?施密Ҏ(gu)Z一?00U间接策略来换脑。去看:(x)http://www.rtqe.net/ObliqueStrategies/
例子Q?/p>
q项别的什么东西么Q?/p>
不做M改变Q坚持始l如一
关上门,从外面听
错误是一U潜在的提示Q其实可能不是一U错误,一UŞ态)
莎士比亚的谜?/strong>
莎士比亚做过很多语言重造的工作Q?/p>
Full circle(l圈?/p>
Method of the madness(貌似疯狂实则有理的行?
Neither rhyme nor reason(莫名其妙)
Eaten out of house and home(吃的們֮荡)
在此Q也感谢译者(崔康Q对本书的给力翻译,没有对语a的融?x)诏通很隑ְ两者联pv来,谢谢?/p>
试一试:(x)
使用乐高U木做项目模块讨论?/strong>
使用双h机制Q让同伴Ȁ׃Q讨Z的进展?/strong>
使用隐喻描述你当前的目?/strong>
观察你认识的专家Q看看他们有什?#8220;奇?#8221;的习(fn)惯让你觉得更能理解?
我们的大脑就是双CPUQ单L设计ȝ?/p>
1号CPU即线性的Q也UCؓ(f)L型处理模式或者叫思考模式。程序员大多喜欢step by stepq种方式Q一步步的去U性处理?/p>
2号CPU是非U性的Q也UCؓ(f)R型处理模式,更多的是直接和创造性,但两者之间访问内存(大脑Q的时候,都是互相抢占pȝȝ的?/p>
你的记忆更像?a >全息影像方式在存储,在我刚上午看q的书,下午可能忘CQ但是我看到什么位|竟然是书中的插图提醒的我。h们对囑փ和声音的记忆更强于文字,L型记录的是一些@规蹈矩,有规律可循的记忆Q而R型则是突发奇惻I在你不经意间Q睡梦中Q洗澡时{等Q想C一个解x案,R型是异步的,q且有时候是你不l意_(d)而不是刻意去惛_能联pd另外一件事情上?/p>
随时随地记录你的x
作者的推荐: http://www.pocketmod.com
语音备忘?信箱
Fisher Space钢笔
MoleskineW记?/p>
我本人推荐:(x)
你应该有个tablet/pad(我个人推荐ipad)
你需要一C错的手机可以跟你的电(sh)脑或者padq行同步Qiphone? q是android都可以,屏幕臛_4.0总?/p>
软g斚wQEverNoteQ?GoodNotesQPenultimateQOmniFocusQMindjetQ?AwesomeNote{等?/p>
我们每个人都有好点子Q可真正付诸实践的却的可怜?/p>
L型和R型处理方式的特点
L型:(x)
处理令h感到舒适、熟(zhn)而放松,提供以下?ji)种能力Q?/p>
R型:(x)
非语a性的Q喜Ƣ综合学?fn),集成事物形成整体?/p>
R型思维能力是很难衡量的Q至比起L型来说要隄多。R型思维更是一U综合,大局观的体现Q也是一U逆向思维和想象力Q创新能力的体现。我个h推荐E序员应该至了解一门艺术,例如l画、摄影、音乐啊{等Q这些是R型非U性思维l与你的灉|和想象力Qƈ且会(x)l你犹如H发奇想q样的奇q,我们了解一U事物不是通过逆向倒推来了解他Q而是通过它是如何出现和创造的而去惛_何构建它。我个h推荐Q无论学什么至应该去了解q么技术或者艺术的诞生历史Qؓ(f)什么如此生的Qؓ(f)什么会(x)有这L(fng)xQ想法和初衷是什么?
作者给Z个很_辟的理论:(x)真正惌了解一只青蛙,传统的解剖不是办法,更好的方式是构造一只青蛙?/strong>
l合学习(fn)与分析学?fn)ƈ重?/strong>
设计胜于功能
无论什么品,面向的终端用户都需要理解你的品。苹果的ipod的广告上从来不说能容U_个GQ一个G{于多少多少字节Q这L(fng)户会(x)疯掉Q谁?x)听你扯淡这些他们不理解的东西,他们只需要知道能存放多少首歌曲Ş了?/p>
吸引力更有效
吸引力的界面比不h吸引力的界面更易于用。尽最大努力争取好的设计,它真的很有效Q好的设计也是需要不断修改出来的?/p>
来自于选择——路易.P对于一个程序员来说Q好的设计很多都是构Z各种选择Q开源稳定的lgQ,Z某种设计理论SEDAQCELL{等?/p>
R型看林QL型砍?wi)?/strong>
如果你想发现全局、整体的模式Q你需要R型,如果你需要分析部分和l节Q你需要L型。讲qC个程序员看开源项目的例子Q在拿到一个开源项目的时候,下面几个步骤开始:(x)
训练自己的大?/strong>
E序员大多数都显得死板和~少R型思维能力Q学?fn)一些新鲜的事物Q可以看看科qȝ(sh)影或者小说等{,增加自己的想象力Q想象力来源于生z,而生zd是无所不包Q包|万象的癄全书Q你甚至可以说Q何的发明都是来源于生z,唯有热爱生活的h才能做出好品,产品也许不需要你创造,只是在选择不同的组合?/strong>
此读书笔记ƈ不完全作为阐q想法,所以在阐述一些问题的时候可能没有前因后果,更是一Uȝ性的话语和书上言语的_֍Q这有点(zhn)论Q如果你想了解,请去看?/span>E序员的思维修炼》,q本书可以跨学科Q即便你不懂E序Q都值得一看,是从思维和大脑层面来开展介l的?/span>
W?/span>2?/span> 从新手到专家的历E?/span>
新手C安要经?/span>5个阶D(德雷斯技能获取模?/span>Q?/span>
真正的专家不怕考验Q而轻N?/span>~
真正的专家很隑ְ自己的行释清楚,而熟l到已经无意识了?/span>
新手Q?/span>?span style="color: #f00604; font-family: Arial; font-size: 12pt; ">在乎自己是否能成功,不知道自己是Ҏ(gu)错,不是特别惌学习(fn)Q只是实C个立竿见q目标Q不知道如何应付错误Q错误出C知所措。新手需要指令清单,有规则,有顺序。但规则只能让你启程Q不?x)让你走的更q?/strong>
高新手Q高U新?span style="color: #f00604; font-family: Arial; font-size: 12pt; ">不想要全局思维Q当公司在展C全q销售测量表和数据时Q你可能不感兴趣Q可q预C着明年你在q家公司是否q能l箋q下厅R但是,?/span>看不到这U联p,因ؓ(f)你层ơ还不够Q只处于较低的技能水q?/strong>?/span>
胜Q者:(x)可以独立解决自己遇到的问题,q开始考虑如何解决新的问题?/span>处于q样水^的h通常具备“d?/span>”?/span>“x多谋”Q往往在团队中发挥着领导作用Q他们是团队里的好hQ但~Z_的能?/span>——自我反思和U正?/span>
_N者:(x)_N?span style="color: #f00604; font-family: Arial; font-size: 12pt; ">需?/span>全局思维Q而且需要更大的概念框架Q过于简单化的信息,他们?x)非常沮丧。在_N者中Q最明显的特征:(x)自我改进和反?/strong>。同时他们善于們别h的意见,q从那些p|或者成功的目中认真观察、学?fn)和ȝ?/span>
专家Q大师)Q专家凭直觉工作Qƈ不需要理由。他们有丰富的经验,q能家当q用Q他们著书、写文章、做演讲{等。专家往往通过观察一些细节(可能思hҎ(gu)无法觉察到的一些细节)p判定特征和问题所在,那些无关紧要的会(x)自动qo(h)更是专家具备的能力?/span>
实践Q?/span>
你不知道自己不知?/span>
辑ְ文:(x)“无知往往来自于自信而不是知?/span>”
上面两句话,刚开始理解的时候没有突焉(zhn)的感觉Q但跟媳妇一番讨论后Q更加理解了Q?/span>
学生问老师自己所掌握的知识到底有多少Q?/span>
老师l出了下面的回答Q?/span>
你现在的知识׃?jng)是一个点Q而老师比你要多一些,是个圈,老师知道你不知道的,你有可能知道自己不知道的而老师知道的,你通过学习(fn)来?x)知道老师知道的,然后过老师ȝ道老师不知道的Q老师也在不停地学?fn),但随着知道的越来越多,也就意识到自׃知道的越来越多,因ؓ(f)大的圆外面׃(x)有更大的圆?/span>
辑ְ文的ȝQ一语道破了无知?/span>“自信”Q无知者无畏这句古话更是说明了“假自?/span>”Q,潜意识层面根本就是不知道自己不知道。有时候自信也很可怕,因ؓ(f)你要认自己到底是否真的知道?/span>
大师都是凭直觉办事,可公司更希望通过数据或者规则来定事情是否?/span>“对的”Q这U方式试囑֜“毁灭"专家Q公司往往轻视专家的直觉,认ؓ(f)q是“不科?/span>”?/span>“不可重复”。新手用规则,而专家用直觉,具备元认知能?/strong>Q?/span>metacognitive)Q或者叫具备自我认知能力的h往往出现在较高层ơ中?/span>
知道你不知道什?/span>?/span>
专家!=老师Q教学是一门技能,你在某个领域是专Ӟ但这q不能保证你可以它教给别h?/span>
有效C用dL(fng)斯模?/span>
十年一剑,也许需要一辈子或者更长?学O漫\漫OQ我们需要积极实践自己:(x)
• 需要一个明定义的d
• d需要有适当的难?/span>——有挑战性但可行
• d环境可以提供大量反馈Q以便于你采取行?/span>
• 提供重复犯错和纠正错误的Z(x)
• 一旦你成ؓ(f)某个领域的专Ӟ在别的领域成Z家就?x)变得更?gu)。你已经有了现成的获取知识的技能和模型构徏的能力?/span>
软g开发的职业特征Q?/span>
• E序员往往认ؓ(f)自己是一U工P从而漠视工作,只是执行分析师的指o(h)Q而不期望自己寚w目的设计和架构有所创见?/span>
• ׃薪酬{的不q等Q专家的程序员争先恐后的离开一U编码,通过理、教学或者E回演讲赚更多的钱?/span>
• 软g工程教育开始受到质疑。很多h认ؓ(f)正规的实跉|式是最好的教育Ҏ(gu)。这U对正规Ҏ(gu)和工L(fng)q度依赖削弱了实践中真正l验的作用?/span>
R&D_(Rip off and duplicate, 偷学技?/span>/偷师学艺)Q我们可以从他们的工作中借鉴很多l验教训q应用到软g开发中?/span>
勇于承担责QQ?/span>
• 新手往往只是执行命o(h)Q新手过渡到胜Q者最大的区别在于能独立解决问?/span>
和承担责仅R?/span>
• 通过观察和模仿来学习(fn)Q?/span>R&D)。如果你有孩子你?x)发玎ͼ他们很少照你说的做,而是大多时候在模仿你?/span>
• 模仿的同时就是实늚q程Q没有实践就没有技能。模?/span>->吸收->创新
• 保持实践以维持专家水qI全世界最优秀的那些专家没有因为做?/span>20q以上开发而不ȝ码了Q实跉|保持技能的唯一手段?/span>
警惕工具陷阱Q?/span>
曄Q在我刚接触软g领域的时候,曾一度认?/span>UMLQ?/span>MDA以及TDD是未来解册Y件的必要良方Q甚至也其滥用Q然而合宜的工具需要放到合宜的
环境去运用,模型只是工具Q而非镜子。如果你需要创造力、直觉或者独创能力,避免使用形式Ҏ(gu)?/span>
再次考虑情境Q?/span>
高端的顾问最喜欢回答_(d)(x)“具体情况具体分析”Q当然他们是对的Q他们的分析依赖于很多事?/span>——所有那些专业h士懂得去L臛_重要的细节,?/span>
时也忽略无关的细节?/span>
在系l思维中,如面向对象编E,往往是事物之间的联系最让h感兴,而不是事物本w。这也是面向对象化编E的特点Q你大多数时候在想事物本w的联系Q而实际问题的解决却放C后面Q本人的目前的理解是Q面向对象编E真的有那么重要么?或许只是在某些方面比较重要Ş了,扩展性和低耦合的确是面向对象的实践的目的,可除此之外纯Z面向对象而行动,存在滥用們了。例?/span>javaq种语言的面向对象纯属ؓ(f)l一思想而设|的E序员枷锁?/span>
日常中的德雷斯模型Q?/span>
• 新手需要快速成功和与情节无关的规则Q而专安要获得全貌。理x况下Q你希望团队里合各U层ơ技能水q的人,拥有一个全部是专家?/span> 团队存在它的隑֤。当所有h在考虑林的时候,你也需要一些h来关注一|大树(wi)?/span>
• 学习(fn)如何学习(fn)的技能?/span>
ȝQ?/span>
了解自己Z德雷斯模型中的哪个阶段Qƈ自我评h(hun)Q了解你的团队成员,他们的技能阶D,以及对你有何帮助。回曾l团队经历的问题Qƈq用德雷斯模型解释q些问题Q对于已知的问题是否能通过德雷斯模型解决或者避免?
q些旉在开源方面看到NettyQ观察到Netty的重命名U程的策略类Q?/p>
ThreadNameDeterminer。这个接口有两个{略Q一个是使用PROPOSEDQ徏议名UͼQ还有个是CURRENTQ当前名Uͼ
当前名称的策略是未实现的Q可能ؓ(f)以后扩展考虑吧?/p>
另外是ThreadRenamingRunnableq个c,q个c里面构建函C入Runnable接口Q和proposed名称?/p>
׃本nThreadRenamingRunnable也是实现RunnablecȝQ所以你在自׃务逻辑U还是照样实现Runnable接口来写逻辑Q完全对业务代码没有侵入?/p>
代码中大概是q样的情况:(x)
只需要在构徏的你的Runnable的时候,重新包装一下即可:(x)
new ThreadRenamingRunnable(new OioWorker(acceptedChannel),
"Old I/O server worker (parentId: " + channel.getId() + ", " + channel + ')'));
q样的Decorator模式Q重新将Runnable接口q行?#8220;装饰”Q其具备了U程名称的功能?/p>
Runnable接口q是原来的接口,对runҎ(gu)的再ơ封装其具备了另外一功能,q就是Decorator模式的精华所在?/p>
cMq样的数?/p>
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 …
if ((n & -n) == n)
…
׃业务逻辑代码实在比较复杂Q此处o(h)掉业务代码把U程竞争关系展示出来Q?/p>
1U程———>获得A?#8212;——>获得B?#8212;——>释放B?#8212;———>释放A?/strong>
2U程———>获得A?#8212;——>释放A?/p>
3U程-——————>获得B?#8212;——>获得A?/strong>
问题出??U程之间的AB锁嵌套导致死锁问题,1U程在没有获得B锁的时候,3U程开始获得B锁然后又得到了A锁,q时候就完全释放不了A锁了Q死锁生了?/p>
׃旉关系Q问题是理清楚了Q只要删?U程的A锁就可以了,当时q是仔细了解q是否删?U程A锁,发现对业务A锁是没必要的。但是线E??x)不会(x)也会(x)像刚才一样生线E死锁呢Q不?x),因?f)U程2里ƈ不会(x)得到B锁?/p>
1U程———>获得B?#8212;——>释放B?/p>
2U程-——————————>获得A?#8212;———>释放A?/p>
3U程———>获得B?#8212;——>获得A?#8212;———>释放A?#8212;———>释放B?/p>
问题是死锁,但暴露了两部分问题:(x)
1.q早的认p控制好竞争关p,对线E间的竞争过早的做出了判?/p>
2.每多设计一个锁增加了一个竞争的因素Q尽量小心,一个锁有可能是一个地P一不小心就可能D严重的问题?/p>
?a >《javaq发~程实践?/a>q本书中介绍qLeftRightLockQ详l了解这个问题的朋友可以L下这本书?strong>W十?nbsp;避免z跃性危?/strong>
此书极其详细的介l了LeftRightLock出现的可能,有可能是因ؓ(f)自己~写E序的疏忽导_(d)或者由于对锁的认识不DQ诸多原因都能找到解释?/p>