﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-混沌中立-随笔分类-非技术</title><link>http://www.blogjava.net/GandofYan/category/9718.html</link><description>－－－－－－－－－仰望星空，心中只剩下一片深蓝</description><language>zh-cn</language><lastBuildDate>Sun, 06 Sep 2009 21:13:10 GMT</lastBuildDate><pubDate>Sun, 06 Sep 2009 21:13:10 GMT</pubDate><ttl>60</ttl><item><title>关于系统设计的一点想法</title><link>http://www.blogjava.net/GandofYan/archive/2009/09/02/293549.html</link><dc:creator>混沌中立</dc:creator><author>混沌中立</author><pubDate>Wed, 02 Sep 2009 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/GandofYan/archive/2009/09/02/293549.html</guid><wfw:comment>http://www.blogjava.net/GandofYan/comments/293549.html</wfw:comment><comments>http://www.blogjava.net/GandofYan/archive/2009/09/02/293549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GandofYan/comments/commentRss/293549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GandofYan/services/trackbacks/293549.html</trackback:ping><description><![CDATA[在几年之前,在大学里面的时候,认为系统的架构设计,就像建筑设计一样,会把骨架搭成,然后有具体人员进行详细的开发.<br />
<br />
在后来,工作中,慢慢有了一些变化,因为原先的想法不太切合实际,系统就是在变化之中的,如果固定了骨架,那就很难的敏捷面对变化.<br />
所以,系统的架构设计,应该是面向接口的设计,确定各个部分之间的数据接口和方法接口.这样,即使有了变化,只要遵循接口的定义,就还是可以面对变化.<br />
<br />
<br />
最近,又有了想法的变化.架构的设计,应该就是规则和规约的设计.设计出一系列,统一的,和谐的规则,在这些规则之前圈住的部分,实际就是系统的全貌.<br />
接口的设计,实际只是规则和规约设计的一个部分.<br />
架构的设计,不应该只是程序方面的事情,同时也包含了心理学方面和社会学方面的一些规则.例如:团队在面对变化时候,需要采用的规则和流程.<br />
只有包含了这些非程序上的规则之后,才能保证架构风格的统一协调.<br />
<br />
<br />
以上,是我对系统设计的想法的转变过程.记录于此,以供回溯.<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/GandofYan/aggbug/293549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GandofYan/" target="_blank">混沌中立</a> 2009-09-02 10:53 <a href="http://www.blogjava.net/GandofYan/archive/2009/09/02/293549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OO设计中的度量</title><link>http://www.blogjava.net/GandofYan/archive/2006/06/07/51054.html</link><dc:creator>混沌中立</dc:creator><author>混沌中立</author><pubDate>Wed, 07 Jun 2006 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/GandofYan/archive/2006/06/07/51054.html</guid><wfw:comment>http://www.blogjava.net/GandofYan/comments/51054.html</wfw:comment><comments>http://www.blogjava.net/GandofYan/archive/2006/06/07/51054.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/GandofYan/comments/commentRss/51054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GandofYan/services/trackbacks/51054.html</trackback:ping><description><![CDATA[如同Tom DeMacro说的：无法控制的东西就不能管理，无法测量的东西就无法控制。<br /><pre><code>软件的度量对于设计者和开发者非常重要，之前只是对这些有一个简单的了解。今天看来，了解的还远远不够。<br /></code></pre><ul><li>Cyclomatic Complexity （圈复杂性）</li><li>Response for Class （类的响应）
                    </li><li>Weighted methods per class （每个类重量方法）</li></ul><pre>一个系统中的所有类的这三个度量能够说明这个系统的设计上的一些问题（不是全部），这三个度量越大越不好。<br />如果一个类这三个度量很高，证明了这个类需要重构了。<br /><br />以第一个度量来说，有下面的一个表格：<br /></pre><table style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0"><tbody><tr><td style="border: 0.5pt solid windowtext; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><b style=""><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">CC Value</span><span lang="EN-GB"><o:p></o:p></span></b></p></td><td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 0.5pt 0.5pt 0.5pt medium; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><b style=""><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">Risk</span><span lang="EN-GB"><o:p></o:p></span></b></p></td></tr><tr><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">1-10</span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.5pt 0.5pt medium; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">Low
  risk program</span></p></td></tr><tr><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">11-20</span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.5pt 0.5pt medium; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">Moderate
  risk</span></p></td></tr><tr><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">21-50</span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.5pt 0.5pt medium; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">High
  risk</span></p></td></tr><tr><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">&gt;50</span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.5pt 0.5pt medium; padding: 0in 5.4pt; width: 221.4pt;" valign="top" width="295"><p class="MsoNormal"><span style="font-family: &quot;Bookman Old Style&quot;;" lang="EN-GB">Most
  complex and highly unstable method</span></p></td></tr></tbody></table><br /><pre>CC数值高，可以通过减少if else（switch case也算）判断来达到目的；<br />可以通过减少类与其他类的调用来减少RFC；<br />通过分割大方法和大类来达到减少WMPC.</pre><pre><br />而Uncle Bob和Jdepend的度量标准应该算是另一个度量系统。<br /><br /></pre><ul><li><span style="font-weight: bold;">关系内聚性（H）</span></li></ul><div style="margin-left: 40px;">用包中的每个类平均的内部关系数目作为包内聚性的一种表示方式。用于表示包和它的所有类之间的关系。<br />H=(R+1)/N<br />R:包内类的关系数目（与包外部的类没有关系）<br />N:包内类的数量<br /><br /></div><ul><li><span style="font-weight: bold;">Number of Classes (Cc)</span></li></ul><div style="margin-left: 40px;">被分析package的具体和抽象类（和接口）的数量，用于衡量package的可扩展性。<br /><br /></div><ul><li><span style="font-weight: bold;">Afferent Couplings (Ca)</span></li></ul><div style="margin-left: 40px;">依赖于被分析package的其他package的数量，用于衡量pacakge的职责。<br /></div><ul style="font-weight: bold;"><li>Efferent Couplings (Ce)</li></ul><div style="margin-left: 40px;">被分析package的类所依赖的其他package的数量，用于衡量package的独立性。<br /></div><ul style="font-weight: bold;"><li>Abstractness (A)</li></ul><div style="margin-left: 40px;">被分析package中的抽象类和接口与所在package所有类数量的比例，取值范围为0－1。<br />A=Cc/N<br /></div><ul style="font-weight: bold;"><li>Instability (I)</li></ul><div style="margin-left: 40px;">用于衡量package的不稳定性，取值范围为0－1。I＝0表示最稳定，I＝1表示最不稳定。<br />I＝Ce/（Ce＋Ca）<br /></div><ul><li><span style="font-weight: bold;">Distance (D)<br /></span></li></ul>          被分析package和理想曲线A＋I＝1的垂直距离，用于衡量package在稳定性和抽象性之间的平衡。理想          的package要么完全是抽象类和稳定（x＝0，y＝1），要么完全是具体类和不稳定（x＝1，y＝0）。<br />          取值范围为0－1，D＝0表示完全符合理想标准，D＝1表示package最大程度地偏离了理想标准。<br />           D = |A+I-1|/0.70710678<br />           注：0.70710678*0.70710678 =2，既为“根号2“<br /><br />我认为D是一个综合的度量，架构和设计的改善可以通过D数值的减少来体现，反之就可以认为是设计和架构的退化。<br /><br /><br />读过http://javaboutique.internet.com/tutorials/metrics/index.html之后的一些想法<br /><br />另一篇中文的内容相近的文章可以参考http://www.jdon.com/artichect/coupling.htm<br /><br />不过第二篇的中文文章中间关于Cyclomatic Complexity，有一个情况遗漏了<br />public void findApplications(String id, String name){<br /><pre><code><br />     if(id!=null &amp;&amp; name!=null) {<br />        //do something<br />     }else{<br />        //do something<br />     }<br />}</code></pre>这种情况的CC不是2+1，而是2+1+1，依据是公式（1）。公式(2)应该是公式（1）的简化版。<pre><code>Cyclomatic Complexity</code> （<code>CC） = no of decision points + no of logical operations +1        （1）<br /><br /></code><code>Cyclomatic Complexity (CC) = number of decision points +1                                （2）<br /><br />参考了JDepend的参数和Uncle Bob的《</code><a href="http://www.amazon.com/exec/obidos/ASIN/0135974445/qid=1061890366/sr=2-1/ref=sr_2_1/103-3122957-5096662" target="_blank">Agile Software Development: Principles, Patterns, and Practices</a><code>》 </code>（敏捷软件开发：原则、模式与实践）</pre><img src ="http://www.blogjava.net/GandofYan/aggbug/51054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GandofYan/" target="_blank">混沌中立</a> 2006-06-07 10:52 <a href="http://www.blogjava.net/GandofYan/archive/2006/06/07/51054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RETE算法的描述(转)</title><link>http://www.blogjava.net/GandofYan/archive/2006/05/30/49012.html</link><dc:creator>混沌中立</dc:creator><author>混沌中立</author><pubDate>Tue, 30 May 2006 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/GandofYan/archive/2006/05/30/49012.html</guid><wfw:comment>http://www.blogjava.net/GandofYan/comments/49012.html</wfw:comment><comments>http://www.blogjava.net/GandofYan/archive/2006/05/30/49012.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/GandofYan/comments/commentRss/49012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GandofYan/services/trackbacks/49012.html</trackback:ping><description><![CDATA[
		<div>转自:http://www.keyusoft.cn/Contentview.aspx?year=2005&amp;month=$10&amp;day=$6&amp;postid=123<br /><br />通过一周左右的研究，对规则引擎有了一定的了解。现在写点东西跟大家一起交流，本文主要针对RETE算法进行描述。我的文笔不太好，如果有什么没讲明白的或是说错的地方，请给我留言。</div>
		<div>首先申明，我的帖子借鉴了网上很流行的一篇帖子，好像是来自CSDN；还有一点，我不想做太多的名词解释，因为我也不是个研究很深的人，定义的不好怕被笑话。</div>
		<div>好现在我们开始。</div>
		<div>首先介绍一些网上对于规则引擎比较好的帖子。</div>
		<div>1、 来自JAVA视频网 </div>
		<div>
				<a href="http://forum.javaeye.com/viewtopic.php?t=7803&amp;postdays=0&amp;postorder=asc&amp;start=0">http://forum.javaeye.com/viewtopic.php?t=7803&amp;postdays=0&amp;postorder=asc&amp;start=0</a>
		</div>
		<div>2、  RETE算法的最原始的描述，我不知道在哪里找到的，想要的人可以留下E-mail</div>
		<div>3、  CMU的一位博士生的毕业论文，个人觉得非常好，我的很多观点都是来自这里的，要的人也可以给我发mail   <a href="mailto:ipointer@163.com">mailto:ipointer@163.com</a></div>
		<div> </div>
		<div>接着统一一下术语，很多资料里的术语都非常混乱。</div>
		<div>1、  facts 事实，我们实现的时候，会有一个事实库。用F表示。</div>
		<div>2、  patterns 模板，事实的一个模型，所有事实库中的事实都必须满足模板中的一个。用P表示。</div>
		<div>3、
  conditions
条件,规则的组成部分。也必须满足模板库中的一条模板。用C表示。我们可以这样理解facts、patterns、conditions之间的关系。
Patterns是一个接口，conditions则是实现这个接口的类，而facts是这个类的实例。</div>
		<div>4、  rules 规则，由一到多个条件构成。一般用and或or连接conditions。用R表示。</div>
		<div>5、  actions 动作，激活一条rule执行的动作。我们这里不作讨论。</div>
		<div>6、  还有一些术语，如：working-memory、production-memory，跟这里的概念大同小异。</div>
		<div>7、  还有一些，如：alpha-network、beta-network、join-node，我们下面会用到，先放一下，一会讨论。</div>
		<div> </div>
		<div>引用一下网上很流行的例子，我觉得没讲明白，我在用我的想法解释一下。</div>
		<div> </div>
		<div>假设在规则记忆中有下列三条规则</div>
		<div> </div>
		<div>if A(x) and B(x) and C(y) then add D(x)</div>
		<div>if A(x) and B(y) and D(x) then add E(x)</div>
		<div>if A(x) and B(x) and E(x) then delete A(x)</div>
		<div> </div>
		<div>RETE算法会先将规则编译成下列的树状架构排序网络</div>
		<div>
				<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/1.JPG" border="0" height="289" width="693" />
				<br />而工作记忆内容及顺序为{A(1)，A(2)，B(2)，B(3)，B(4)，C(5)}，当工作记忆依序进入网络后，会依序储存在符合条件的节点中，直到完全符合条件的推论规则推出推论。以上述例子而言， 最后推得D(2)。</div>
		<div> </div>
		<div>让我们来分析这个例子。</div>
		<div> </div>
		<div>模板库：（这个例子中只有一个模板，算法原描述中有不同的例子, 一般我们会用tuple,元组的形式来定义facts,patterns,condition）</div>
		<div>P: (?A , ?x)  其中的A可能代表一定的操作，如例子中的A,B,C,D,E ; x代表操作的参数。看看这个模板是不是已经可以描述所有的事实。</div>
		<div> </div>
		<div>条件库：(这里元组的第一项代表实际的操作，第二项代表形参)</div>
		<div>C1: (A , &lt;x&gt;)</div>
		<div>C2: (B , &lt;x&gt;)</div>
		<div>C3: (C , &lt;y&gt;)</div>
		<div>C4: (D , &lt;x&gt;)</div>
		<div>C5: (E , &lt;x&gt;)</div>
		<div>C6: (B , &lt;y&gt;)</div>
		<div> </div>
		<div>事实库：（第二项代表实参）</div>
		<div>F1: (A,1)</div>
		<div>F2: (A,2)</div>
		<div>F3: (B,2)</div>
		<div>F4: (B,3)</div>
		<div>F5: (B,4)</div>
		<div>F6: (C,5)</div>
		<div> </div>
		<div>       规则库：</div>
		<div>         R1: c1^c2^c3</div>
		<div>         R2: c1^c2^c4</div>
		<div>         R3: c1^c2^c5</div>
		<div> </div>
		<div>       </div>
		<div>       有人可能会质疑R1: c1^c2^c3，没有描述出，原式中：</div>
		<div>if A(x) and B(x) and C(y) then add D(x)，A=B的关系。但请仔细看一下，这一点已经在条件库中定义出来了。</div>
		<div> </div>
		<div>       下面我来描述一下，规则引擎中RETE算法的实现。</div>
		<div>       首先，我们要定一些规则，根据这些规则，我们的引擎可以编译出一个树状结构，上面的那张图中是一种简易的表现，其实在实现的时候不是这个样子的。</div>
		<div>       这就是beta-network出场的时候了，根据rules我们就可以确定beta-network，下面，我就画出本例中的beta-network，为了描述方便，我把alpha-network也画出来了。</div>
		<div>       </div>
		<div> <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/2.PNG" border="0" height="504" width="693" /></div>
		<div>上图中，左边的部分就是beta-network,右边是alpha-network,圆圈是join-node.</div>
		<div>从上图中，我们可以验证，在beta-network中，表现出了rules的内容，其中r1,r2,r3共享了许多BM和join-node,这是由于这些规则中有共同的部分，这样能加快match的速度。</div>
		<div>右
边的alpha-network是根据事实库构建的，其中除alpha-network节点的节点都是根据每一条condition,从事实库中
match过来的，这一过程是静态的，即在编译构建网络的过程中已经建立的。只要事实库是稳定的，即没有大幅度的变化，RETE算法的执行效率应该是非常
高的，其原因就是已经通过静态的编译，构建了alpha-network。我们可以验证一下，满足c1的事实确实是w1,w2。</div>
		<div>下
面我们就看一下，这个算法是怎么来运行的，即怎么来确定被激活的rules的。从top-node往下遍历，到一个join-node,与AM for
c1的节点汇合，运行到match c1节点。此时，match c1节点的内容就是：w1,w2。继续往下，与AM for
c2汇合（所有可能的组合应该是w1^w3,w1^w4,w1^w5,w2^w3,w2^w4,w2^w5），因为c1^c2要求参数相同，因此，
match
c1^c2的内容是：w2^w3。再继续，这里有一个扇出（fan-out），其中只有一个join-node可以被激活，因为旁边的AM只有一个非空。
因此，也只有R1被激活了。</div>
		<div>解决扇出带来的效率降低的问题，我们可以使用hashtable来解决这个问题。</div>
		<div>RETE算法还有一些问题，如：facts库变化，我们怎么才能高效的重建alpha-network，同理包括rules的变化对beta-network的影响。这一部分我还没细看，到时候再贴出来吧。</div>
<img src ="http://www.blogjava.net/GandofYan/aggbug/49012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GandofYan/" target="_blank">混沌中立</a> 2006-05-30 15:30 <a href="http://www.blogjava.net/GandofYan/archive/2006/05/30/49012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>free mind 和mind manager ,还有visio</title><link>http://www.blogjava.net/GandofYan/archive/2006/05/30/48955.html</link><dc:creator>混沌中立</dc:creator><author>混沌中立</author><pubDate>Tue, 30 May 2006 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/GandofYan/archive/2006/05/30/48955.html</guid><wfw:comment>http://www.blogjava.net/GandofYan/comments/48955.html</wfw:comment><comments>http://www.blogjava.net/GandofYan/archive/2006/05/30/48955.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/GandofYan/comments/commentRss/48955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GandofYan/services/trackbacks/48955.html</trackback:ping><description><![CDATA[
		<div>
				<a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page">freemind</a>一个比较不错free的 
mind map 软件,很多人建议使用这个来管理自己的思路.</div>
		<div> </div>
		<div>
				<a href="http://www.mindjet.com/us/">mind manager</a>另一个比较不错的mind 
map的软件,可以和office兼容.不过是商业的</div>
		<div> </div>
		<div>visio,就不介绍了.office里面有的东西.做流程图来说,确实是比较好的软件.但是在思路不清楚的时候,很难画出什么有用的东西来.这点就比不上前面两个东西了.不过对我来说visio可能更顺手,因为我经常画的是软件流程图........</div>
<img src ="http://www.blogjava.net/GandofYan/aggbug/48955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GandofYan/" target="_blank">混沌中立</a> 2006-05-30 13:36 <a href="http://www.blogjava.net/GandofYan/archive/2006/05/30/48955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>18世纪的贝叶斯定理成为Google计算的新力量--zt from http://www.code365.com/web/122/Article/17927.Asp</title><link>http://www.blogjava.net/GandofYan/archive/2006/05/30/48936.html</link><dc:creator>混沌中立</dc:creator><author>混沌中立</author><pubDate>Tue, 30 May 2006 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/GandofYan/archive/2006/05/30/48936.html</guid><wfw:comment>http://www.blogjava.net/GandofYan/comments/48936.html</wfw:comment><comments>http://www.blogjava.net/GandofYan/archive/2006/05/30/48936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GandofYan/comments/commentRss/48936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GandofYan/services/trackbacks/48936.html</trackback:ping><description><![CDATA[
		<p>
				<b>from http://www.code365.com/web/122/Article/17927.Asp<br /></b>
		</p>
		<p>
				<b>
						<br />
				</b>
		</p>
		<p>
				<b>Thomas Bayes，一位伟大的数学大师，他的理论照亮了今天的计算领域，和他的同事们不同：他认为上帝的存在可以通过方程式证明，他最重要的作品被别人发行，而他已经去世241年了。</b>
		</p>
		<p>18世纪牧师们关于概率的理论成为应用发展的数学基础的一部分。 
</p>
		<p>搜索巨人Google和Autonomy，一家出售信息恢复工具的公司，都使用了贝叶斯定理（Bayesian
principles）为数据搜索提供近似的（但是技术上不确切）结果。研究人员还使用贝叶斯模型来判断症状和疾病之间的相互关系，创建个人机器人，开发
能够根据数据和经验来决定行动的人工智能设备。 </p>
		<p>
				<img src="http://www.zdnet.com.cn/i/biztech/images/special_report/18century/123.jpg" align="left" /> 虽然听起来很深奥，而这个原理的意思--大致说起来--却很简单：某件事情发生的概率大致可以由它过去发生的频率近似地估计出来。研究人员把这个原理应用在每件事上，从基因研究到过滤电子邮件。 
</p>
		<p>在明尼苏达州大学的网站上能够找到一份详细的数学概要。而在Gametheory.net上的一个Bayes Rule Applet程序让你能够回答诸如“如果你测试某种疾病，有多大风险”之类的问题。 
</p>
		<p>贝叶斯理论的一个出名的倡导者就是微软。该公司把概率用于它的Notification Platform。该技术将会被内置到微软未来的软件中，而且让计算机和蜂窝电话能够自动地过滤信息，不需要用户帮助，自动计划会议并且和其他人联系。 
</p>
		<p>如果成功的话，该技术将会导致“context server”--一种电子管家的出现，它能够解释人的日常生活习惯并在不断变换的环境中组织他们的生活。 
</p>
		<p>“Bayes的研究被用于决定我应该怎样最好地分配计算和带宽，” Eric Horvitz表示，他是微软研究部门Adaptive
Systems &amp; Interaction
Group的高级研究员和分组管理者。“我个人相信在这个不确定的世界里，你不能够知道每件事，而概率论是任何智能的基础。” </p>
		<p>到今年年底，Intel也将发布它自己的基于贝叶斯理论的工具包。一个关于照相机的实验警告医生说病人可能很快遭受痛苦。在本周晚些时候在该公司的Developer Forum（开发者论坛）上将讨论这种发展。 
</p>
		<p>虽然它在今天很流行，Bayes的理论并不是一直被广泛接受的：就在10年前，Bayes研究人员还在他们的专业上踌躇不前。但是其后，改进的数学模型，更快的计算机和实验的有效结果增加了这种学派新的可信程度。 
</p>
		<p>“问题之一是它被过度宣传了，” Intel微处理器实验室的应用软件和技术管理经理Omid Moghadam表示。“事实上，能够处理任何事情的能力并不存在。真正的执行在过去的10年里就发生了。” 
</p>
		<p>
				<span class="mdeck">
						<b>Bayes哑元</b>
				</span>
				<br />Bayes的理论可以粗略地被简述成一条原则：为了预见未来，必须要看看过去。Bayes的理论表示未来某件事情发生的概率可以通过计算它过去发生的频率来估计。一个弹起的硬币正面朝上的概率是多少？实验数据表明这个值是50%。 
</p>
		<p>
				<img src="http://www.zdnet.com.cn/i/biztech/images/special_report/18century/bayes_ms_pic.jpg" align="right" /> “Bayes表示从本质上说，每件事都有不确定性，你有不同的概率类型，”斯坦佛的管理科学和工程系（Department of Management Science and Engineering at Stanford）的教授Ron Howard表示。 
</p>
		<p>例如，假设不是硬币，一名研究人员把塑料图钉往上抛，想要看看它钉头朝上落地的概率有多大，或者有多少可能性是侧面着地，而钉子是指向什么方向的。形状，成型过程中的误差，重量分布和其他的因素都会影响该结果。 
</p>
		<p>Bayes技术的吸引力在于它的简单性。预测完全取决于收集到的数据--获得的数据越多，结果就越好。另一个优点在于Bayes模型能够自我纠正，也就是说数据变化了，结果也就跟着变化。 
</p>
		<p>概率论的思想改变了人们和计算机互动的方式。“这种想法是计算机能够更象一个帮助者而不仅仅是一个终端设备，” Peter Norvig表示。他是Google的安全质量总监。他说“你在寻找的是一些指导，而不是一个标准答案。” 
</p>
		<p>从这种转变中，研究获益非浅。几年前，所谓的Boolean搜索引擎的一般使用需要把搜索按照“if, and, or but”的语法进行提交，然后去寻找匹配的词。现在的搜索引擎采用了复杂的运算法则来搜索数据库，并找出可能的匹配。 
</p>
		<p>如同图钉的那个例子显示的那样，复杂性和对于更多数据的需要可能很快增长。由于功能强大的计算机的出现，对于把好的猜测转变成近似的输出所必须的结果进行控制成为可能。 
</p>
		<p>更重要的是，UCLA的Judea Pearl这样的研究人员研究出如何让Bayes模型能够更好地追踪不同的现象之间条件关系的方法，这样能够极大地减少计算量。 
</p>
		<p>例如，对于人口进行大规模的关于肺癌成因的调查可能会发现它是一种不太广泛的疾病，但是如果局限在吸烟者范围内进行调查就可能会发现一些关联性。对于肺癌患者进行检查能够帮助调查清楚习惯和这种疾病之间的关系。 
</p>
		<p>
				<img src="http://www.zdnet.com.cn/i/biztech/images/special_report/18century/bayes_pull1.jpg" align="left" />
“每一个单独的属性或者征兆都可能取决于很多不同的事情，但是直接决定它的却是为数不多的事情，”斯坦佛计算机科学系（computer
science department at Stanford）的助理教授Daphne
Koller表示。“在过去的15年左右的时间里，人们在工具方面进行了改革，这让你能够描绘出大量人群的情况。” </p>
		<p>和其他一些项目一样，Koller是使用概率论技术来更好地把病症和疾病联系起来，并把遗传基因和特定的细胞现象联系起来。 
</p>
		<p>
				<span class="mdeck">
						<b>记录演讲</b>
				</span>
				<br />一项相关的技术，名为Hidden Markov模型，让概率能够预测次序。例如，一个演讲识别应用知道经常在“q”之后的字母是“u”。除了这些，该软件还能够计算“Qagga”（一种灭绝了的斑马的名称）一词出现的概率。 
</p>
		<p>概率技术已经内置在微软的产品中了。Outlook Mobile
Manage是一个能够决定什么时候往移动设备上发出一封内勤的电子邮的软件。它是从Priorities发展而来的，Priorities是微软在
1998年公布的一个实验系统。Windows XP的故障检修引擎也依赖于概率计算。 </p>
		<p>随着该公司的Notification Platform开始内置在产品中，在未来的一年中会有更多的应用软件发布，微软的Horvitz这样表示。 
</p>
		<p>Notification
Platform的一个重要组成部分名为Coordinate，它从个人日历，键盘，传感器照相机以及其他来源收集数据，来了解某个人生活和习惯。收集的
数据可能包括到达的时间，工作时间和午餐的时间长度，哪种类型的电话或电子邮件被保存，而哪些信息被删除，在某天的特定时间里键盘被使用的频率，等等。
</p>
		<p>这些数据可以被用来管理信息流和使用者收到的其他信息。例如，如果一位经理在下午2：40发送了一封电子邮件给一名员工，
Coordinate可以检查该员工的日历程序，然后发现他在下午2：00有一个会议。该程序还可以扫描关于该员工习惯的数据，然后发现该员工通常会在有
会议之后大约一个小时才重新使用键盘。该程序可能还能够发现该名员工通常会在5分钟之内回复该经理的电子邮件。根据上面这些数据，该软件能够估计出该员工
可能至少在20分钟之内不可能回复该电子邮件，该软件可能会把这条信息发送到该员工的手提电话上。同时，该软件可能会决定不把别人的电子邮件也转发出去。
</p>
		<p>“我们正在平衡以打搅你为代价所获得信息的价值，” Horvitz表示。使用这个软件，他坚持道，“能够让更多的人跟上事情的发展，而不被大量的信息所淹没。” 
</p>
		<p>Horvitz补充道，隐私和对于这些功能的用户控制是确定的。呼叫者并不知道为什么一条信息可能会被优先或推迟处理。 
</p>
		<p>微软还把Bayes模型使用在其他的一些产品上，包括DeepListener 以及Quartet （语音激活），SmartOOF 以及TimeWave （联系控制）。消费者多媒体软件也获益非浅，Horvitz表示。 
</p>
		<p>Bayes技术不仅仅被应用在PC领域。在University of
Rochester，研究人员发现一个人的步伐可以在一步前发生改变。虽然这种改变对于人类来说太过于细微，一台和电脑连接在一起的照相机可以捕捉并跟踪
这种动作。如果行走异常出现，计算机就能够发出警报。 </p>
		<p>一个实验用的安全照相机采用了同样的原理：大部分到达机场的人都会在停车以后直接走向目的地，所以如果有人停了车，然后走向另一辆车就不太正常，因此就可能引发警报。今年秋天一个创建Bayes模型和技术信息的基本引擎将会公布在Intel的开发者网站上。 
</p>
		<p>
				<span class="mdeck">
						<b>理论冲突</b>
				</span>
				<br />虽然该技术听起来简单易懂，关于它的计算可能却比较慢。Horvitz回忆说他是斯坦佛20世纪80年代仅有的两个概率和人工智能的毕业生之一。其他所有的人学习的是逻辑系统，采用的是“if and then”的模式和世界互动。 
</p>
		<p>
				<img src="http://www.zdnet.com.cn/i/biztech/images/special_report/18century/bayes_pull2.jpg" align="right" /> “概率论那时候不流行，” Horvitz表示。但是当逻辑系统不能够预测所有的意外情况时，潮流发生了转变。 
</p>
		<p>很多研究人员开始承认人类的决策过程比原来想象的要神秘的多。“在人工智能领域存在着文化偏见，” Koller表示。“人们现在承认他们并不知道他们的脑子是如何工作的。” 
</p>
		<p>即便在他的时代，Bayes发现他自己置身于主流之外。他于1702年出生于伦敦，后来他成为了一名Presbyterian
minister。虽然他看到了自己的两篇论文被发表了，他的理论很有效，但是《Essay Toward Solving a Problem in
the Doctrine of Chances》却一直到他死后的第三年，也就是1764年才被发表。 </p>
		<p>他的王室成员身份一直是个谜，直到最近几年，新发现的一些信件表明他私下和英格兰其他一些思想家看法一致。 
</p>
		<p>“就我所知，他从来没有写下贝叶斯定理，” Howard表示。 
</p>
		<p>神学家Richard Price和法国的数学家Pierre Simon
LaPlace成为了早期的支持者。该理论和后来George Boole，布尔数学之父，的理论背道而驰。George
Boole的理论是基于代数逻辑的，并最终导致了二进制系统的诞生。也是皇室成员之一的Boole死于1864年。 </p>
		<p>虽然概率的重要性不容置疑，可是关于它的应用的争论却没有停止过。批评者周期性地声称Bayes模型依赖于主观的数据，而让人类去判断答案是否正确。而概率论模型没有完全解决在人类思维过程中存在的细微差别的问题。 
</p>
		<p>“儿童如何学习现在还不是很清楚，”IBM研究部门的科学和软件副总裁 Alfred
Spector这样表示。他计划把统计学方法和逻辑系统在他的Combination
Hypothesis之中结合起来。“我最初相信是统计学的范畴，但是从某方面说，你将会发现不仅仅是统计学的问题。” </p>
		<p>但是，很有可能概率论是基础。 
</p>
		<p>“这是个基础，” Horvitz表示。“它被忽略了一段时间，但是它是推理的基础。”</p>
<img src ="http://www.blogjava.net/GandofYan/aggbug/48936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GandofYan/" target="_blank">混沌中立</a> 2006-05-30 12:51 <a href="http://www.blogjava.net/GandofYan/archive/2006/05/30/48936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于团队的一些想法</title><link>http://www.blogjava.net/GandofYan/archive/2006/04/08/40020.html</link><dc:creator>混沌中立</dc:creator><author>混沌中立</author><pubDate>Sat, 08 Apr 2006 12:01:00 GMT</pubDate><guid>http://www.blogjava.net/GandofYan/archive/2006/04/08/40020.html</guid><wfw:comment>http://www.blogjava.net/GandofYan/comments/40020.html</wfw:comment><comments>http://www.blogjava.net/GandofYan/archive/2006/04/08/40020.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/GandofYan/comments/commentRss/40020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GandofYan/services/trackbacks/40020.html</trackback:ping><description><![CDATA[工作了几年,在不同的公司进入了几个不同的团队.感觉团队之间的差异很大.<br /><br />1.一个好的团队,是需要时间来培养的.团队中的成员需要时间来互相熟悉,这个熟悉不单是平常说的认识,还要包括熟悉其他的编程方式设计倾向,工作习惯.只有这样以后,在讨论问题讨论方案的时候,可以形成默契,基本简单几句就会明白在说什么问题.团队也需要时间来形成团队的风格,一个有团队所有成员的风格组合在一起形成的风格.包括文档,编码,设计,沟通等方面上的一致风格.中间需要不断进行review,按照review的结果,对所有成果物进行修改.<br /><br />2.一个好的团队的人员流动应该是良性的.这个良性流动指的是有人员的变化,但是变化的数量和范围不会使得团队的风格发生大的变化,如果一个10人的团队,突然发生的5人的变化,就是说调整到其他团队5个人,又调整进来5个人,那对于这个团队基本可以算是重新形成一个新的团队了.<br /><br />3.一个好的团队,不单需要团队内部成员的努力,同时也需要SPEG和QA在团队之外对团队的开发流程的监督和规范.如果没有了解开发流程和开发规范的SPEG对流程进行监督,即使团队形成了风格,那这个风格很有可能不是健康的风格,可能会导致团队在以后的开发的过程中产生问题.<br /><br />4.一个好的团队,需要比较有控制力的PM,能力强的PSM,设计能力优秀的SA.正因为有这样的人,才能快速的将加入团队的新成员,融入团队.<br /><br />好像具备了上面这些条件想不形成一个好的团队也是很不容易的事情了:)<br /><img src ="http://www.blogjava.net/GandofYan/aggbug/40020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GandofYan/" target="_blank">混沌中立</a> 2006-04-08 20:01 <a href="http://www.blogjava.net/GandofYan/archive/2006/04/08/40020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rich client的回归</title><link>http://www.blogjava.net/GandofYan/archive/2006/03/17/35779.html</link><dc:creator>混沌中立</dc:creator><author>混沌中立</author><pubDate>Fri, 17 Mar 2006 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/GandofYan/archive/2006/03/17/35779.html</guid><wfw:comment>http://www.blogjava.net/GandofYan/comments/35779.html</wfw:comment><comments>http://www.blogjava.net/GandofYan/archive/2006/03/17/35779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GandofYan/comments/commentRss/35779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GandofYan/services/trackbacks/35779.html</trackback:ping><description><![CDATA[最近一直在想这个事情，从近几年的web application的发展情况和工作项目的用户需求来看，rich client应该又要成为一个潮流了。<br /><br />主要原因有两点：<br />一是网速的提高，过去使用browser是因为过去的网络速度比较慢，所以只能给客户端传送很少的信息量，让客户通过网络传输的信息尽可能少的完成操作。而现在网络速度的提高，让这样的要求变少了，网速慢的这个瓶颈也不再存在了。<br />二是用户的要求，用户实际上不在意什么client还是brower，用户在意的是使用是否方便，响应是否迅速,能否满足业务需要。如果网速慢,机器配置差的瓶颈在今天的技术条件下不存在了，用户对于易用性和快速响应的要求就要提高了。这个快速响应不是指那种客户端&lt;-----&gt;服务器的响应，而已一个操作之后快速的出现结果，这个就要求有一部分在C/S模式下在客户端实现的功能但是在B/S情况下被转移到服务器上的一些功能需要在客户端实现。<br /><br />但是这个rich client不是几年前的那种臃肿的不行的方式了，应该是比现在的应用的client包含的内容多，但是比以前的client的内容要少。主要解决的问题是，快速响应用户的操作，让用户的操作更简单。<br /><br /><br />（思路不是很清晰，暂时是这样，之后再修改）<br /><img src ="http://www.blogjava.net/GandofYan/aggbug/35779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GandofYan/" target="_blank">混沌中立</a> 2006-03-17 10:12 <a href="http://www.blogjava.net/GandofYan/archive/2006/03/17/35779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>