??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧洲日产国码无码网站,亚洲精品人成网线在线播放va,亚洲成色WWW久久网站http://www.tkk7.com/steven2012/专注&坚持zh-cnFri, 09 May 2025 20:07:28 GMTFri, 09 May 2025 20:07:28 GMT60用Markdown写Bloghttp://www.tkk7.com/steven2012/archive/2013/06/29/401064.htmlsteven.cuisteven.cuiFri, 28 Jun 2013 17:30:00 GMThttp://www.tkk7.com/steven2012/archive/2013/06/29/401064.htmlhttp://www.tkk7.com/steven2012/comments/401064.htmlhttp://www.tkk7.com/steven2012/archive/2013/06/29/401064.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/401064.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/401064.html原来Markdown如此之方便,github又提供了page服务Q还能用上gitQ真是无法无天了Q?br />
http://www.100hack.com

或?br /> http://cuixin.github.com

steven.cui 2013-06-29 01:30 发表评论
]]>
《程序员的思维修炼》读书笔讎ͼ思维的重生)4http://www.tkk7.com/steven2012/archive/2012/08/13/385346.htmlsteven.cuisteven.cuiSun, 12 Aug 2012 17:38:00 GMThttp://www.tkk7.com/steven2012/archive/2012/08/13/385346.htmlhttp://www.tkk7.com/steven2012/comments/385346.htmlhttp://www.tkk7.com/steven2012/archive/2012/08/13/385346.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/385346.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/385346.htmlW??调试你的大脑


我从来都不想成ؓ(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论

  1. 改变工作条g和劳动效率之间没有直接的因果关系Q?/li>
  2. 提高生效率的决定因素是员工情AQ而不是工作条Ӟ
  3. 兛_员工的情感和员工的不满情l,有助于提高劳动生产率?/li>

研究者认为,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>

  • 能够清楚地发现员工关心的事项?/li>
  • 如果模型适当、准的话,它所l出的解决生产力的办法具有长期的、可持箋的特炏V?/li>
  • 对员工工作条件进行持l性衡量评伎ͼ有助于管理者指定长期的战略决策?/li>

     霍桑效应的缺?/p>

  • 一些内在的工作环境属性难以L识,如组l动力?/li>
  • 生力模型的参数选择a、b、c比较主观Q取决于理人员的个识?/li>
  • 关键性的工作环境属性是动态的Q模型需要不断调整反映现实情c?/li>
  • 从M上来看,生力模型的准确度与理人员的个人判断力、敏锐性紧密相兟?/li>

     霍桑效应的启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>

 



steven.cui 2012-08-13 01:38 发表评论
]]>
Clojure的变量和全局环境http://www.tkk7.com/steven2012/archive/2012/07/31/384387.htmlsteven.cuisteven.cuiMon, 30 Jul 2012 17:48:00 GMThttp://www.tkk7.com/steven2012/archive/2012/07/31/384387.htmlhttp://www.tkk7.com/steven2012/comments/384387.htmlhttp://www.tkk7.com/steven2012/archive/2012/07/31/384387.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/384387.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/384387.html原文请参考,如有问题和歧义请指正Q谢?)

http://clojure.org/vars

变量和全局环境

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



steven.cui 2012-07-31 01:48 发表评论
]]>
Clojure 性能 tipsQ翻译)http://www.tkk7.com/steven2012/archive/2012/07/29/384258.htmlsteven.cuisteven.cuiSun, 29 Jul 2012 06:15:00 GMThttp://www.tkk7.com/steven2012/archive/2012/07/29/384258.htmlhttp://www.tkk7.com/steven2012/comments/384258.htmlhttp://www.tkk7.com/steven2012/archive/2012/07/29/384258.html#Feedback2http://www.tkk7.com/steven2012/comments/commentRss/384258.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/384258.html原文章写?a >Google Groups thread里,但是q是值得再说下?/p>

有朋友把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 />

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))))))

 

 



steven.cui 2012-07-29 14:15 发表评论
]]>《程序员的思维修炼》读书笔讎ͼ思维的重生)3http://www.tkk7.com/steven2012/archive/2012/07/10/382670.htmlsteven.cuisteven.cuiMon, 09 Jul 2012 17:21:00 GMThttp://www.tkk7.com/steven2012/archive/2012/07/10/382670.htmlhttp://www.tkk7.com/steven2012/comments/382670.htmlhttp://www.tkk7.com/steven2012/archive/2012/07/10/382670.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/382670.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/382670.htmlW?? 利用双


人应该努力学?fn)洞察和培养自己内心深处的灵光一玎ͼq远q胜于外面流光溢彩的整个世界。然而,人M(x)下意识地抛弃自己Ҏ(gu)的想法,仅仅因ؓ(f)那是他自qx?/strong>

——拉尔?瓦尔?爱默生(1803-1882Q?/a>


启动感官输入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)惯让你觉得更能理解?



steven.cui 2012-07-10 01:21 发表评论
]]>
《程序员的思维修炼》读书笔讎ͼ思维的重生)2http://www.tkk7.com/steven2012/archive/2012/06/19/381120.htmlsteven.cuisteven.cuiTue, 19 Jun 2012 14:40:00 GMThttp://www.tkk7.com/steven2012/archive/2012/06/19/381120.htmlhttp://www.tkk7.com/steven2012/comments/381120.htmlhttp://www.tkk7.com/steven2012/archive/2012/06/19/381120.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/381120.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/381120.htmlW?? 认识你的大脑

我们的大脑就是双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>

  •      语言能力
  •      分析能力
  •      W号能力
  •      抽象能力
  •      旉能力
  •      推理能力
  •      数字能力
  •      逻辑能力
  •      U性思维能力

     R型:(x)

     非语a性的Q喜Ƣ综合学?fn),集成事物形成整体?/p>

  • 非语a
  • l合
  • 具体
  • 分析
  • 非理?/li>
  • I间?/li>
  • 直觉
  • 全面

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)

  1. 了解开源想的初衷和目标Q解决了什么问题,把握q个开源项目的方向性?/li>
  2. 开始了解开源项目的大致l构Q导出UML图,或者大致浏览项目的接口文gQ,以及开源项目中依赖的组件?/li>
  3. 有了整体全局观以后,下来试验下开源项目提供的tutorial?/li>
  4. 开发调试ƈ亲手实践一个例子,Ҏ(gu)个流E有个具体把握?/li>
  5. 试在开源项目上q行你自己项目的试验和业务逻辑Q?/li>
    1. 构徏一个具体的业务逻辑?/li>
    2. 。。。?/li>
    3. 。。。?/li>
    4. 。。。?/li>
  6. 回头再来看一些代码,q样实践相结合,更容易理解?/li>


训练自己的大?/strong>

     E序员大多数都显得死板和~少R型思维能力Q学?fn)一些新鲜的事物Q可以看看科qȝ(sh)影或者小说等{,增加自己的想象力Q想象力来源于生z,而生zd是无所不包Q包|万象的癄全书Q你甚至可以说Q何的发明都是来源于生z,唯有热爱生活的h才能做出好品,产品也许不需要你创造,只是在选择不同的组合?/strong>



steven.cui 2012-06-19 22:40 发表评论
]]>
《程序员的思维修炼》读书笔讎ͼ思维的重生)http://www.tkk7.com/steven2012/archive/2012/06/17/380946.htmlsteven.cuisteven.cuiSat, 16 Jun 2012 19:08:00 GMThttp://www.tkk7.com/steven2012/archive/2012/06/17/380946.htmlhttp://www.tkk7.com/steven2012/comments/380946.htmlhttp://www.tkk7.com/steven2012/archive/2012/06/17/380946.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/380946.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/380946.html 

 此读书笔记ƈ不完全作为阐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对于已知的问题是否能通过德雷斯模型解决或者避免?

                         

 



steven.cui 2012-06-17 03:08 发表评论
]]>
U程重命名(NettyQ和设计模式Decoratorhttp://www.tkk7.com/steven2012/archive/2012/06/16/380935.htmlsteven.cuisteven.cuiSat, 16 Jun 2012 14:32:00 GMThttp://www.tkk7.com/steven2012/archive/2012/06/16/380935.htmlhttp://www.tkk7.com/steven2012/comments/380935.htmlhttp://www.tkk7.com/steven2012/archive/2012/06/16/380935.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/380935.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/380935.htmljava的多U程ThreadcL供了setNameҎ(gu)或者通过构造器传入nameQ来指定U程的名U?/p>

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)

public run() {
     //Ҏ(gu)规则把线E名字进行修?/span>
     try {
          runnable.run(); // 调用传入接口的runҎ(gu)
     } finally {
          if (renamed)
               // 恢复之前的名?/span>
     }
}


只需要在构徏的你的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>

steven.cui 2012-06-16 22:32 发表评论
]]>
判断一个数是否?的nơ幂http://www.tkk7.com/steven2012/archive/2012/06/16/380934.htmlsteven.cuisteven.cuiSat, 16 Jun 2012 14:26:00 GMThttp://www.tkk7.com/steven2012/archive/2012/06/16/380934.htmlhttp://www.tkk7.com/steven2012/comments/380934.htmlhttp://www.tkk7.com/steven2012/archive/2012/06/16/380934.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/380934.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/380934.html判断一个数是否?的nơ幂

cMq样的数?/p>

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 }



steven.cui 2012-06-16 22:26 发表评论
]]>
记录一个NonFairSync问题Q死锁问题)(LeftRighLock)http://www.tkk7.com/steven2012/archive/2012/06/16/380933.htmlsteven.cuisteven.cuiSat, 16 Jun 2012 14:22:00 GMThttp://www.tkk7.com/steven2012/archive/2012/06/16/380933.htmlhttp://www.tkk7.com/steven2012/comments/380933.htmlhttp://www.tkk7.com/steven2012/archive/2012/06/16/380933.html#Feedback0http://www.tkk7.com/steven2012/comments/commentRss/380933.htmlhttp://www.tkk7.com/steven2012/services/trackbacks/380933.html业务上线后,在有大量q发后,出现了一个线E完全被占用的问题,后来通过得到jvm堆栈信息(kill -3)看出来是死锁问题?/p>

׃业务逻辑代码实在比较复杂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>

steven.cui 2012-06-16 22:22 发表评论
]]>
վ֩ģ壺 ˾޾ƷӰwww| 99ƷƵ߹ۿר| 2019Ļѿ| þѾƷav| òƵ| ձһѸ| ڵƵ| ޾Ʒm߹ۿ| Ƶ| 㽶һ| ƷٸAVѾþϴ| һ߹ۿ| ھƷ߹ۿ| ɫͼ߹ۿ| ߹ۿ91| ĻƵ| ߹ۿAVÿո| 鶹VAѾƷ| ӰԺҹײ| 4338ȫɫվ| ĻӰ| AV߹ۿɫ | ˾ƷƵȫ弶 | ҹƵ| Ƭѿ| ֳִִˬƵ| wwww߹ۿ| պaëƬѹۿ| ˳Ƶ| þ޾ƷƷ| ˹ۿëƬ| ˮƵwwwƵ| Ļ| ߲| ޾ƷƷ| ˳ɾƷþþþ| ëƬƵ| վ߿| ŷͽȺ| ˳վۿ| ĻƵ|