<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_流浪de小F君</title><subtitle type="text">传说中用下半身思考的非主流程序员</subtitle><id>http://feed.cnblogs.com/blog/u/45873/rss</id><updated>2010-09-14T09:02:10Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/45873/rss"/><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824876.html</id><title type="text">【转】SNS背后的科学（4）—— 信息的传播</title><summary type="text">转载自：http://mxwu.does-exist.info/blog/?p=296现在我们来考虑信息是如何在SNS的网络中传播的，然后，哪些因素可能会影响这种传播。结构&amp;amp;聚集SNS由于人们的关系，会产生不同的结构。而聚集说明的是一种现象，SNS中的人是分成不同团体的，不同的团体有不同的关注点不同的兴趣点。而且，在团体内的人互相之间认识的可能性很大。这里我假设了一个网络结构，人名代表节点...</summary><published>2010-09-13T03:55:00Z</published><updated>2010-09-13T03:55:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824876.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824876.html"/><content type="html">&lt;p&gt;&lt;p&gt;&lt;span  style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px;"&gt;&lt;span  style="text-align: left; line-height: 24px; font-family: Verdana, Geneva, sans-serif; color: #555555; font-size: 14px;"&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;转载自：&lt;a href="http://mxwu.does-exist.info/blog/?p=296"&gt;http://mxwu.does-exist.info/blog/?p=296&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;现在我们来考虑信息是如何在SNS的网络中传播的，然后，哪些因素可能会影响这种传播。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;结构&amp;amp;聚集&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;SNS由于人们的关系，会产生不同的结构。而聚集说明的是一种现象，SNS中的人是分成不同团体的，不同的团体有不同的关注点不同的兴趣点。而且，在团体内的人互相之间认识的可能性很大。这里我假设了一个网络结构，人名代表节点，连线代表他们之间认识：&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="396" width="527" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image_thumb.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;很直观的，黑人、蔡依林、罗志祥、小S是一个小团体，老沉、任志强、张欣、潘石屹是一个小团体，我和我的粉丝是另外一个小团体。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;盗梦空间&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;以盗梦空间为例子，我们把信息的传播设定为对《盗梦空间》的看法，假设每个看过《盗梦空间》的人都会说出自己对盗梦空间的评价，然后来观察网络中每个人是如何根据周围人的想法来做决策的。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;我们先设定一些假设：&lt;/p&gt;&#xD;
&lt;ul style="list-style-type: none; margin: 0px 0px 15px; padding: 0px;"&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;网络里的人只知道周围人的想法。比如，我知道任志强是否喜欢盗梦空间，却不知道潘石屹的想法。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;盗梦空间是一部非常不错的电影，如果我认识的人里有2个人说好看，则我也会去看，并且表达我的看法。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;起点&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;作为传播的最开始，有几个超级影迷，他们会主动的在网上搜集影片的信息，在大家之前首先去了电影院，然后发出积极的评价。比如，这几个影迷是罗志祥和小S：&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image1.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="408" width="544" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image_thumb1.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;发展&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;根据我们的设定：朋友中有两个人给出正面评价，则也会去看。于是，很快，小团体内，黑人和蔡依林受到影响，也观看了《盗梦空间》。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image2.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="396" width="527" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image_thumb2.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;消息在小团体内得到了迅速的传播，可是问题也很明显，罗志祥和小S对团体外的影响力十分有限，其余两个团体内的人并没有受到他们行动的影响。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;跨网络&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;本来此次传播进入了一个稳态，应该终结了。可是，一个小意外，通过其他途径，任志强也观看了，于是传播接着发展。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image3.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="403" width="536" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image_thumb3.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;值得注意的是：由于任志强在网路中的特殊位置&amp;mdash;&amp;mdash;他和他所属的团体外的小S和我都有联系，于是，他一个人不经意间的一个动作改变了整个传播的态势。老沉同时受到了他和罗志祥的影响，加入了观影大军，随后，张欣、潘石屹同时受到老沉、任志强影响，也改变了。另外一个网络中的我，同时受到小S和任志强，也随之改变。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;对于任志强这样有跨界联系的人，某些时候他们的看法能够影响到整个网络。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;最终&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image35.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="406" width="540" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/09/image35_thumb.png" alt="image[35]" border="0" title="image[35]" style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;由于我个人相对有限的影响力，粉丝A和粉丝B还是没能去看盗梦空间，他们错失了一部好电影。他们剩下的机会，就是这张图以外的网络给他们足够的影响了。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;总结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;通过这些假设、观察和分析，我们可以得到以下结论：&lt;/p&gt;&#xD;
&lt;ul style="list-style-type: none; margin: 0px 0px 15px; padding: 0px;"&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;SNS被割裂为不同的团体，团体与团体之间有明显的界限。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;信息在团体内很容易发生病毒式传播。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;作为起点的种子用户以及他们所处的网络位置十分重要。如果，这次的起点是粉丝A和粉丝B，那么传播不会发生，只能停滞。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;在一个团体内引起病毒式传播的最好方法是直接在团体内找到种子用户。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;信息本身的质地也会影响传播，提升信息本身的价值亦会影响传播。这里我们设定《盗梦空间》是2个人可以影响1个人。可能的情况是1.这个信息不足够有价值，需要3个人才能影响1个人，那么传播的可能性就会大大降低。 2.这个产品更加有价值，只需要1个人就能影响1个人，那么很快就会传遍整个网络。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;处于多个网络的人会在传播中扮演一个极为重要的角色。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;br  /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1824876.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824876.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824874.html</id><title type="text">【转】SNS背后的科学（3）—— 社会资本</title><summary type="text">转载自：http://mxwu.does-exist.info/blog/?p=230有这样一句话：&amp;ldquo;你周围的朋友决定了你自己的地位&amp;rdquo;。这句话放在SNS里就变成了，你的好友的地位决定了你的地位。这句话同时也回答了一个问题：&amp;ldquo;SNS是什么&amp;rdquo;。有人说，SNS是媒体；有人说，SNS是通信工具；我说，SNS是一种资本。提到资本，我最先想到的是实物资本（phy...</summary><published>2010-09-13T03:53:00Z</published><updated>2010-09-13T03:53:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824874.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824874.html"/><content type="html">&lt;p&gt;&lt;span  style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px;"&gt;&lt;span  style="text-align: left; line-height: 24px; font-family: Verdana, Geneva, sans-serif; color: #555555; font-size: 14px;"&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;转载自：&lt;a href="http://mxwu.does-exist.info/blog/?p=230"&gt;http://mxwu.does-exist.info/blog/?p=230&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;有这样一句话：&amp;ldquo;你周围的朋友决定了你自己的地位&amp;rdquo;。这句话放在SNS里就变成了，你的好友的地位决定了你的地位。这句话同时也回答了一个问题：&amp;ldquo;SNS是什么&amp;rdquo;。有人说，SNS是媒体；有人说，SNS是通信工具；我说，SNS是一种资本。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;提到资本，我最先想到的是实物资本（physical capital）、人力资本（human captical）。人与人之间的关系网络也是有价值的，这种价值被称之为社会资本（social capital）。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;定义&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;社会资本的概念，最早由L.J. Hanifan在1916年的一篇文章中提到，他这样描述社会资本这个概念：&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&amp;ldquo;我不是指不动产，个人财产或者冷冰冰的钞票，而是生活中那些人们实际生活中所拥有的信誉、友谊、认同、团体中个体间的交流以及组成社会的家庭。如果他和他的邻居有联系，他的邻居又和邻居的邻居有联系，这些联系积累起来就是社会资本。这种资本可以让他获得社会需求，也就是有可能在社区中提高实际的生活质量。社区，由组成它的各个个体联合起来，于是，个体能够得到社区的帮助、同情和邻居的友谊。&amp;rdquo;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Nan_Lin" style="color: #5c7a99; text-decoration: none;"&gt;Nan Lin&lt;/a&gt;的定义则更富有个人主义色彩：&lt;strong style="font-style: normal; font-weight: bold;"&gt;那些期望在市场中获得回报的社会关系投资。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;度量&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;社会资本涉及到的一个问题就是如何度量个体拥有多少资本。度量本身是一个极为复杂的问题，涉及到了网络本身的拓扑结构和个体的属性。这里，我忽略掉个体间的差异，仅分析几个最简单的例子，给出一个对度量的基本概念。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;首先我们要确定度量的步骤：&lt;/p&gt;&#xD;
&lt;ol style="list-style-type: none; margin: 0px 0px 15px; padding: 0px;"&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;选择一个图表述网络。图中的节点代表人，边代表人与人之间的联系。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;在边上放置一定的资源。简单起见，假定是放置1元钱。边两端的节点要争夺这1元钱。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;每一个节点可以和它的邻居争夺资源。这里定义这种争夺为交换。同时要强调，交换要遵守&lt;strong style="font-style: normal; font-weight: bold;"&gt;1次交换规则&lt;/strong&gt;：即每个节点只能同时和一个邻居交换。交换结束后，用掉的钱重新补满钱。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;节点之间可以通过谈判来分割资源。谈判也要遵守1词交换规则：只要节点和一个邻居节点达成共识，那么其他所有邻居的谈判也立即结束。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;重复上面的步骤，直到所有谈判结束。然后统计每个节点获得了多少钱。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;看起来有些复杂，实际操作一下：&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/06/image1.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="202" width="630" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/06/image_thumb1.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;网络示意图&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;strong style="font-style: normal; font-weight: bold;"&gt;2个节点&lt;/strong&gt;：这种情况非常简单。A、B各得0.5元。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;strong style="font-style: normal; font-weight: bold;"&gt;3个节点&lt;/strong&gt;：相对于2个节点，这种情况出现了微妙的变化。B可以选择和A谈判还是和C谈判，而由于1次交换规则，如果B不和A谈判和C谈判，那么A什么也得不到，A为了吸引B和他谈判，会要得比0.5元少。一些研究表明，通常情况下的A-B交换结果是：A 1/6 B 5/6&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;strong style="font-style: normal; font-weight: bold;"&gt;4个节点&lt;/strong&gt;：由于D的出现，B被削弱了。如果B不和A谈判，那么它就陷入了B-C-D的3个节点的分配中，只能拿到1/6。B-C之间仍然平分。实验表明，A-B谈判B大约能拿到2/3。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;strong style="font-style: normal; font-weight: bold;"&gt;5个节点&lt;/strong&gt;：C虽然处于中央，但是A为了争夺B，E为了争夺D，很可能出低价，这样的话C什么也得不到。于是C实际上和A、E出于相似的位置。实验中，C得到的比A、E多一点，且仅仅多一点。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;社会资本和SNS&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;真实生活中的人际关系网络就是一个人的社会资本，而SNS的出现，将这种资本得以在互联网上加以实现。SNS体现了个体在社会中的话语权。当我们真的尝试在SNS上发布一些信息从而影响其他人的时候，我们就会发现这种话语权可以实实在在的影响到真实的生活。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;前不久新浪微博上360大战金山网镖就是一个社会资本影响实物资本的例子。360董事长周鸿祎在微博上大批金山网镖恶意攻击360安全卫士。相关言论很快由周鸿祎的粉丝在网络上大量转发，一时间，整个舆论都倾向与360。 受此影响，几天之内金山公司的股票市值蒸发了6亿元。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;更为奇特的例子出现在日本。一个宅男在超市的厕所里忘记带手纸了，他随即在Twitter上求人帮他。经过推友的热情转发，最后真有人拿了手纸给他。这也印证了L.J. Hanifan对社会资本的那段定义：&amp;ldquo;这种资本可以让他获得社会需求&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;h2 style="margin: 0px 0px 10px; font-size: 15px; font-weight: bold; padding: 0px;"&gt;总结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul style="list-style-type: none; margin: 0px 0px 15px; padding: 0px;"&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;关系网络是一种资本。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;和实物资本（不动产、股票）、人力资本（教育）一样，社会资本也是一种值得投资的资本。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;你的粉丝的数量和质量决定了你在SNS的网络中所处的位置，也就决定了你在SNS中的社会资本。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1824874.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824874.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824866.html</id><title type="text">【转】SNS背后的科学 (2) —— 割裂的Web和割裂的Twitter</title><summary type="text">转载自：http://mxwu.does-exist.info/blog/?p=2141. 有向网络Web网也是一个网络，页面之间通过Hyperlink联系在一起，但是这样的连接是有向的，你可以写一篇Blog引用新浪的网页，却无法指望新浪的网页也能连接回你的Blog。同样是有向网络的Twitter也具有同样的性质，你可以Follow一个明星，明星却不会Follow你。这样具有方向性的连接组成的网络...</summary><published>2010-09-13T03:47:00Z</published><updated>2010-09-13T03:47:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824866.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824866.html"/><content type="html">&lt;p&gt;&lt;span  style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px;"&gt;&lt;span  style="text-align: left; line-height: 24px; font-family: Verdana, Geneva, sans-serif; color: #555555; font-size: 14px;"&gt;&#xD;
&lt;h4 style="margin: 0px; font-size: 14px; font-weight: normal; padding: 0px;"&gt;&lt;span style="background-color: #ffffff; color: #ff0000;"&gt;转载自：&lt;/span&gt;&lt;a href="http://mxwu.does-exist.info/blog/?p=214"&gt;http://mxwu.does-exist.info/blog/?p=214&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;h4 style="margin: 0px; font-size: 14px; font-weight: normal; padding: 0px;"&gt;1. 有向网络&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;Web网也是一个网络，页面之间通过Hyperlink联系在一起，但是这样的连接是有向的，你可以写一篇Blog引用新浪的网页，却无法指望新浪的网页也能连接回你的Blog。同样是有向网络的Twitter也具有同样的性质，你可以Follow一个明星，明星却不会Follow你。&lt;strong style="font-style: normal; font-weight: bold;"&gt;这样具有方向性的连接组成的网络称之为有向网络。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;问题就来了。从第一章我们知道了，Web网和Twitter都是无尺度网络，有20%的网页/人携带了80%的连接。那么在Web网上，我们真的能够从一个普通节点沿着这样的单向连接游历整个Web网么？在Twitter上，我们真的能够从一个普通人沿着这种单向关系联系上Twitter上的所有用户么？这就需要我们考虑有向连接对整个网络拓扑结构带来的影响。&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px; font-size: 14px; font-weight: normal; padding: 0px;"&gt;2. 结构&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;由于Web网出现得较早，早在2000年 AlterVista的Andrei Broder和IBM及康柏的研究人员就研究了2亿个Web网页，站在宏观角度了解Web网络的拓扑架构。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image6.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="369" width="488" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image_thumb6.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;Web网络的拓扑结构&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;Web网被分割成了4个大陆：&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;第1个大陆是中央大陆，它包括整个网络的1/4，主要是Yahoo和CNN等网站。中央大陆里的信息是畅通的，各个节点都能&lt;strong style="font-style: normal; font-weight: bold;"&gt;互相&lt;/strong&gt;到达。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;第2个和第3个大陆分别是IN大陆和OUT大陆，从IN大陆你能够很容易的连接进入中央大陆，但是一旦进入就再也回不来了。而OUT大陆则是可以从中央大陆连出来，但是也连接不回去了，这部分网页主要是公司网站。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;第4个大陆是由触须和孤立网络组成的孤立大陆。所谓孤立大陆，即是指无法从中央大陆中通过链接访问到。这部分占据了整个Web大约1/4的节点。&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px; font-size: 14px; font-weight: normal; padding: 0px;"&gt;3.成因&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;有向网络的这种拓扑结构似乎不怎么理想呢。有向网会不会在发展过程中，甚至通过一些人为的手段来消除各个大陆之间的隔阂呢？这个问题，在数学上已经得到了一个更为普遍的结论：&lt;strong style="font-style: normal; font-weight: bold;"&gt;只要是有向网络，必然会出现这样的结构&lt;/strong&gt;。也就是说，&lt;strong style="font-style: normal; font-weight: bold;"&gt;同样是有向网络的Twitter也必然是这样的结构。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;究其原因，在于Web网/Twitter是自组织的，是大量用户集体行为的结果，从某种程度上来说，这是一种民主的体现。那些出于中央大陆外的小站点，只能通过慢慢的努力，不断提高自身的价值才能够进入中央大陆。在大尺度的网络结构上来看，这是公平的，只要我们把建立连接的权利交给大众，就必然会形成这样的结构，其力量，甚至超过的政府和业内的明星企业。&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px; font-size: 14px; font-weight: normal; padding: 0px;"&gt;4. Twitter&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;同为有向网络，我们理所当然的会把Web网络和Twitter放在一起做一个比较，Twitter的网络拓扑结构比Web网有什么优势么？&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;strong style="font-style: normal; font-weight: bold;"&gt;*&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;有研究表明，Web网络之间页面的平均距离是19，也就是说，两个页面需要跳过19个Hyperlink才能够到达。而六度分割告诉我们，Twitter上用户之间的距离是6，更有一些统计数字表明，这个距离在Twitter上被缩短到5。从这个角度看，信息变得更容易被获得了。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;* Twitter上的节点是动态的人，而不是静态的页面。这意味着，节点上人会不断的产生内容，并且实时变动。产生信息不需要增加额外的节点。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;* 在Retweet被官方支持以后，大大降低了转发的成本。从Web网络的复制/粘贴到简单的点击一下Retweet，从传播的角度，信息传播变得容易了。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;用表格稍微总结一下：&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;table width="400" cellpadding="2" cellspacing="0" border="1" style="margin: 5px 0px 10px; border-collapse: collapse;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="129" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;&lt;/td&gt;&#xD;
&lt;td width="133" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;Web&lt;/td&gt;&#xD;
&lt;td width="136" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;Twitter&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="128" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;尺度&lt;/td&gt;&#xD;
&lt;td width="132" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;19&lt;/td&gt;&#xD;
&lt;td width="138" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;6&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="128" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;节点&lt;/td&gt;&#xD;
&lt;td width="132" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;静态&lt;/td&gt;&#xD;
&lt;td width="139" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;动态&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="127" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;转发&lt;/td&gt;&#xD;
&lt;td width="132" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;成本高&lt;/td&gt;&#xD;
&lt;td width="140" valign="top" style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 10px; padding-right: 10px; vertical-align: top; padding-top: 3px; border: #aaaaaa 1px solid;"&gt;成本低&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;h4 style="margin: 0px; font-size: 14px; font-weight: normal; padding: 0px;"&gt;5. Twitter上的孤立&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;大尺度结构上有向网络的分割让我们看到了大量孤立网络的存在。我自己作为一个Twitter的使用者，对这样的孤立深有感触。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;由于GFW的存在，能够访问Twitter的中文用户相当稀少，只被限定在IT行业的从业人员和互联网爱好者上。这样一个群体，实际上和主流Twitter用户所关注的东西相距甚远。每看一次Twitter Trending上的和我毫不相关关键字，这样的孤立感就会加深一次。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;这样畸形的网络是由于政治因素形成的，由于地理位置、文化背景、个人喜好等其他因素也会产生这样的孤立。当我们说Twitter可以用来获得信息的时候，事实的另外一面是我们被限定在了周围人组成的网络里，如果周围的人不提及一条信息，我们就很可能永远无法知道这样一条信息的存在。&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px; font-size: 14px; font-weight: normal; padding: 0px;"&gt;6. 总结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;我们首先从宏观的了解有向网络的结构。有向网络的结构说明了大量孤立网络的存在，这使得我们在进行社会化营销的时候不得不考虑如何针对这部分用户进行特定的优化。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;我们探讨了这种结构形成的原因，其力量来自于民主。从这种意义上讲，在我们总是期望能够通过Twitter获得更多的粉丝、更大的影响力、更接近中心的网络位置的时候，更多的应该是考虑应该是如何提高自身的产品和服务，这才是企业的根本。我们可以利用各种营销手段，包括社会化营销，但是社会化营销所做的，只是加快了企业本该获得的这样地位的过程。这也是之前一篇&lt;a href="http://www.lajidui.com/node/55/" style="color: #5c7a99; text-decoration: none;"&gt;《&amp;ldquo;精&amp;rdquo;于形而&amp;ldquo;简&amp;rdquo;于心的社会化媒体工作者们》&lt;/a&gt;上所说的社会化媒体的&amp;ldquo;心&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;我们比较了一下Twitter和Web在结构上的不同，说明了 Twitter的一些优势。&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1824866.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824866.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824864.html</id><title type="text">【转】SNS背后的科学（1）从六度分隔到无尺度网络</title><summary type="text">转载自：http://mxwu.does-exist.info/blog/?p=1980.前言一次偶然机会，我了解到SNS在国外是一门科学。再读过一些相关书籍后，我认识到，对于SNS的产品设计师绝对有必要了解SNS的一些基本知识&amp;mdash;&amp;mdash;这就如同为一个漂亮姑娘设计衣服，如果你连她的模样都不知道，如何能够为她设计出合适的衣服呢？本系列 Blog专注于SNS的网络特性，旨在为SNS产...</summary><published>2010-09-13T03:45:00Z</published><updated>2010-09-13T03:45:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824864.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824864.html"/><content type="html">&lt;p&gt;&lt;span  style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px;"&gt;&lt;span  style="text-align: left; line-height: 24px; font-family: Verdana, Geneva, sans-serif; color: #555555; font-size: 14px;"&gt;&#xD;
&lt;h4 style="margin: 0px 0px 10px; font-size: 13px; font-weight: bold; padding: 0px;"&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;转载自：&lt;a href="http://mxwu.does-exist.info/blog/?p=198"&gt;http://mxwu.does-exist.info/blog/?p=198&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;&lt;h4 style="margin: 0px 0px 10px; font-size: 13px; font-weight: bold; padding: 0px;"&gt;0.前言&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;一次偶然机会，我了解到SNS在国外是一门科学。再读过一些相关书籍后，我认识到，对于SNS的产品设计师绝对有必要了解SNS的一些基本知识&amp;mdash;&amp;mdash;这就如同为一个漂亮姑娘设计衣服，如果你连她的模样都不知道，如何能够为她设计出合适的衣服呢？&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;本系列 Blog专注于SNS的网络特性，旨在为SNS产品设计提供基本的理论基础。我既不想成为科普读物那样堆积一些故事，也不想过于学术化数学公式满篇飞，只想在这两者之间找到一个平衡点，从耳熟能详的事实和高深莫测的公式中提取出一些定律。这些定律，可以为我们的SNS产品设计、社会化营销指出一个方向。我们没有必要闭门造车，唯有站在巨人的肩膀上才能看得更远。&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px 0px 10px; font-size: 13px; font-weight: bold; padding: 0px;"&gt;1. 随机网络&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;现在我们来思考一个关于SNS形成的问题：我的朋友是从那里来的？&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;大约的故事是这样的：&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;从前，有个叫 mxwu的小孩出生在了中国某个二线城市的小院子里。他不知道为什么上帝没有把他安排在美国、英国、法国、甚至是非洲某个不知名的国家，而偏偏选中了中国；他也不知道为什么上帝没有选择北京、上海、深圳而又把地点选择到了这个二线城市。这种感觉就好像上帝在扔筛子：1美国，2英国，3法国，4中国，哦4 啊，mxwu，你出生在中国。更令人吃惊的是，还有一大群同样的小孩一样被上帝发配到了这个小院子里。于是这帮小朋友就都成了好朋友。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;保罗.艾尔德（Paul Erdős）就是其中一个思考这个问题的人，他认为人与人之间互相认识是随机的，用中国的一个词来说就是&amp;ldquo;缘分&amp;rdquo;。他把这个问题用图论来解释，把人抽象成点，人与人之间的关系抽象成边，那么一个集体中的所有人就组成了一张图，而点与点之间的连接就好像掷骰子一样完全是随机的。艾尔德的观点表明了一种对社会化网络直观的解释：人与人之间能够互相认识，是一个随机的过程，每个人都和其他人有相同的概率建立连接，于是组成的网络也就被称之为&lt;strong style="font-style: normal; font-weight: bold;"&gt;随机网络&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;随机网络的概念诞生与上世纪50年代，统治了社会网40多年的研究。那么真实社会的网络是否是随机网络呢？&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px 0px 10px; font-size: 13px; font-weight: bold; padding: 0px;"&gt;2. 六度分隔&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;现在我们地球上有60亿人，两个人之间需要跨过多少个人才能认识？我想你可以毫不犹豫的答出6个人。这就是著名的六度分隔理论。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;然而，如果按照我们地球上所有人按照随机网络模型进行数学仿真计算，给出的答案将会远远大于6个。问题出在哪儿呢？邓肯.瓦特（Duncan Watts)的小世界（Small world）理论告诉了我们答案：在一个随机网络中，添加几个连接以后可以大大降低节点之间的距离（图论中的距离定义为连接两点最短路径的边数）。反应到人类社会网络中，就是有一类人特别擅长交往，他们认识很多人，正是由于他们的存在，才使得六度分隔成为可能。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image2.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="208" width="458" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image_thumb2.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;小世界&amp;mdash;&amp;mdash;只添加了3根线，一个随机网络中节点之间的平均距离却大为减少&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;更进一步的研究表明，在社会网络中，正是有了20%擅长交往的人，携带了80%的连接，所以产生了多出来的几个连接，才保证了六度分隔的成立，这也是二八定律的一个应用。&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px 0px 10px; font-size: 13px; font-weight: bold; padding: 0px;"&gt;3.无尺度网络 (Scale-free network)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;好，我们终于接近正题了。如果，六度分隔告诉我们，人与人建立链接不是一个完全随机的过程，并且，每个人认识的人数分布必须符合二八定律。那么，真实社会化网络的建立，又是一个什么过程呢？&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;艾伯特-拉斯洛.巴拉巴拉西（Barab&amp;aacute;si, Albert-L&amp;aacute;szl&amp;oacute;）提出了他的看法。我们知道，二八定律、长尾实际上是幂律分布（Power Law）的一个口头表述。为了构造出符合幂律分布的网络，他给出了一个网络的构建过程，并把这种网络称之为&lt;strong style="font-style: normal; font-weight: bold;"&gt;无尺度网络&lt;/strong&gt;：&lt;/p&gt;&#xD;
&lt;ul style="list-style-type: none; margin: 0px 0px 15px; padding: 0px;"&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;网络是动态增长的，不断有新的节点加入，而不是随机网络中那样所有节点都已给出，仅仅是随机建立连接。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: disc; margin: 0px 0px 0px 25px; padding: 0px;"&gt;优先情结。新增的点并不是如随机网络中那样和其他点有相同的概率建立建立连接，它会有更大的概率和已有很多连接的节点建立连接。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image3.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="160" width="545" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image_thumb3.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;上图说明了了无尺度网络形成的过程。从最初的两个点开始，每次新增的一个绿色节点有更高的概率和已经有很多连接的节点建立连接。优先情节在现实中也是存在的，大多数的普通人总是期望和少数的活跃用户建立间接。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;下图对比了一个随机网络和一个无尺度网络。右边的黑色点就是活跃用户。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image4.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="239" width="546" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image_thumb4.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;也许你会问，为什么这个网络称之为无尺度网络？答案是，这是相对于有尺度网络来讲的。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;&lt;a href="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image5.png" style="color: #5c7a99; text-decoration: none;"&gt;&lt;img height="177" width="542" src="http://mxwu.does-exist.info/blog/wp-content/uploads/2010/05/image_thumb5.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;上图对比了一个有尺度的随机网络和一个无尺度网络。如果你有一定的概率知识，就知道泊松分布。随机网络中每个节点有的连接数是符合泊松分布的，也就是上图中的左图。简单说，人的身高就是一个泊松分布，绝大部分人处于150~190的中间部分，极少数很矮的，极少数很高的。因为有大多数节点的连接数居中，于是我们可以称这个中值为这个网络的尺度。&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;而无尺度网络的分布符合幂律分布，大多数人只有很少的连接，而有少数人有很多的连接，这个网络没有一个尺度来衡量网络中节点的距离，于是称之为无尺度网络。&lt;/p&gt;&#xD;
&lt;h4 style="margin: 0px 0px 10px; font-size: 13px; font-weight: bold; padding: 0px;"&gt;4. 结论&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0px 0px 15px; padding: 0px;"&gt;无尺度网络告诉我们什么？&lt;/p&gt;&#xD;
&lt;ol style="list-style-type: none; margin: 0px 0px 15px; padding: 0px;"&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;新用户建立连接时候的有优先情节。它更倾向于与活跃用户建立连接。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;拥有有大量连接的活跃用户，随着网络规模的增加，连接会越来越多，也就是富者愈富。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;建立一个完全草根化的SNS是不现实的。人们需要活跃用户，活跃用户对SNS的拉动不容忽视。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;SNS中20%的人产生了80%的连接。这些人是整个网络的核心。关注这部分人的行为、喜好、特点，设计有针对性的产品会产生更好的效果。&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal; margin: 0px 0px 0px 25px; padding: 0px;"&gt;另外80%的人在网络中处于失势的地位，虽然他们有出声的权利，但是他们的声音很难成为主流。&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1824864.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824864.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824317.html</id><title type="text">【原】书摘：大神和他的朋友们——《Coder at Work》审稿有感</title><summary type="text">最近有帮图灵俱乐部的《Coders at Work》审稿，主要负责Ken Thompson和Joshua Bloch的这两个部分，两位大神现在都在Google，前者是Unix之父，并且发明了C语言的前身&amp;mdash;&amp;mdash;B语言，他&amp;ldquo;对操作系统理论的发展的贡献，尤其是实现了UNIX操作系统&amp;rdquo;，使得他在1983年时和Dennis Ritchie一同获得了计算机科学的最...</summary><published>2010-09-13T03:38:00Z</published><updated>2010-09-13T03:38:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824317.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824317.html"/><content type="html">&lt;p style="text-align: center;"&gt;&lt;img src="http://pic002.cnblogs.com/img/huanghao1986/201009/2010091211280986.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最近有帮图灵俱乐部的《Coders at Work》审稿，主要负责Ken Thompson和Joshua Bloch的这两个部分，两位大神现在都在Google，前者是Unix之父，并且发明了C语言的前身&amp;mdash;&amp;mdash;B语言，他&amp;ldquo;对操作系统理论的发展的贡献，尤其是实现了UNIX操作系统&amp;rdquo;，使得他在1983年时和Dennis Ritchie一同获得了计算机科学的最高荣誉&amp;mdash;&amp;mdash;图灵奖；后者Joshua Bloch现任google的首席Java架构师，他之前在SUN工作，工作主要围绕着Java语言特性和库展开，他写的《Effective Java》获得当年的Jolt大奖，他还写过《Java 并发编程实践》和《Java Puzzles》（这两本可是Java面试和考SCJP必备）两本技术类畅销书。《Coders at Work》整本书都是以访谈录的形式组织，因此表达方式上都比较口语化，娓娓道来、平易近人却又充满了真知灼见，用简洁的语言表达深刻的哲学思想，不像《编程之道》里讲的那么玄乎。在内容上，囊括了优秀的编程实践和设计思想，还有大神艰辛而又充满热情的成长道路以及几十年的技术生涯带来的人生感悟。&lt;/p&gt;&#xD;
&lt;p&gt;Ken Thompson是属于那种传统意义上的Unix黑客，如今胡子一把了还对编程如此痴迷。从小学开始他就对逻辑运算和二进制就表现出了强烈的兴趣，大学就读于伯克利电气系（那个年代还没有计算机科学系），从那时开始接触计算机，从此一发不可收拾，热爱技术，酷爱钻研的他，很快就以牛逼的理论水平和实践能力在同学和老师中赢得了很高的评价，当过助研、当过讲师，毕业时Bell实验室的人三顾茅庐才把他请出山，最终的那一次上门经历比较搞笑，Ken回忆说，"他来到我的公寓，并且说希望我去他们那面试。我告诉他不去。他说：'哥们儿，就当是一次免费旅行吧。你去了干什么都行。&amp;rsquo;我说：&amp;ldquo;嗯，坦率点说，我对你们这个工作根本不感兴趣。不过有一次旅行，我倒很高兴。因为我在东海岸有很多朋友我想去见一下。&amp;rdquo;于是他就这样很&amp;ldquo;随意&amp;rdquo;的加入了Bell实验室，然后他就参与到Multics这个著名的分时操作系统项目中，然而由于种种原因，最后这个项目失败了，当整个团队都不愿再去啃分时OS这块硬骨头时，他仍凭借一腔热情坚持了下来，后来靠着老婆孩子回娘家去的一个月，没日没夜的干，终于和Ritchie一起把Unix给整出来了，他说，在那个月里&amp;ldquo;我每27~28个小时才睡一次，每次就睡6个小时&amp;rdquo;，&amp;ldquo;虽然如此，仍然精神饱满&amp;rdquo;，也听不见孩子哭闹了，老婆也不催着上床睡觉交公粮了，&amp;ldquo;他们在的时候，生活是必须遵循一天24个小时的&amp;rdquo;，现在他们走了，我想干嘛就干嘛！（&lt;strong&gt;看来要想在科研上干一番事业出来，光有热情还不够，老婆孩子回娘家也是必须的。。。&lt;/strong&gt;）除此之外，他在开发Unix的过程中，还发明了B语言，这玩意儿后来被Ritchie发展为C语言，C语言和它的衍生品们&amp;ldquo;毒害&amp;rdquo;了一代又一代的青年的思想，几乎霸占了整个编程语言的江山。同样今天也很难在操作系统领域中找到不属于Unix和它后代们的异类。对整个计算机业界产生了如此深远的影响，所以，Thompson拿到图灵奖也的确是实至名归。&lt;/p&gt;&#xD;
&lt;p&gt;Joshua Bloch相对于Thompson来说是个晚辈，他成长于70年代，那时的天下还属于DEC的。这小伙当时不如上面的那位前辈对技术的那么狂热，表现出来的更多是&amp;ldquo;觉得有意思&amp;rdquo;或者是&amp;ldquo;感兴趣&amp;rdquo;（&lt;strong&gt;这也就是为什么他的成就不如前者&lt;/strong&gt;）。从Colombia和CMU毕业后，几经风雨，在96年时才加入SUN，在那里第一次接触到了面向对象的语言，后来他领导了并参与了很多给Java带来翻天覆地变化的机制，比如Java并行编程库java.util.concurrent以及java 5中的泛型（generics）等。这时他才开始有名，其实很多人认识他主要还是通过Java领域的两本经典图书《Effective Java》和《Java Puzzles》（这两本书也成为了天朝Java程序员考SCJP认证和面试Java职位必备）。&lt;/p&gt;&#xD;
&lt;p&gt;在两位大神的访谈中，他们都对自己所认同的优秀的编程实践提出了看法。在对编程语言的观点上，Thompson是C语言的绝对忠实用户（废话，自己的孩子能不疼吗？），他自称自己&amp;ldquo;所有的无论是正式还是非正式的工作都是用C语言完成的"。他说总之他&amp;rdquo;拒绝使用C++&amp;ldquo;（C++在Google内可是属于绝对的头号开发语言）。众所周知，C++语言同样诞生于Bell实验室，Thompson的同事Bjarne Stroustrup创造了他，Thompson以前关于C++的过激言论曾经导致两人关系紧张，他说，即便如此，&lt;strong&gt;他还是觉得&amp;ldquo;C++是一门糟糕的语言，很多事情（语言特性）都是半途而废，最后互不相干的想法汇总成了一个垃圾堆&amp;rdquo;&lt;/strong&gt;。&lt;strong&gt;他说C++是如此的庞大以至于每个公司和个人只能用到其中很小的一部分子集（个人认为，显然这对代码的可复用性造成了很大的障碍）。&lt;/strong&gt;他还说造成C++今天这个格局，与Stroustrup和C++标准委员会的没有原则是分不开的，&lt;strong&gt;他们&amp;ldquo;将每一种存在的功能都加入到这种语言中，那不是一种清晰的设计，只是把所有的东西拼凑在一起&amp;rdquo;（深有同感！）&lt;/strong&gt;，所以他认为C++语言已经遭受到了重创，复杂度难以驾驭。对于此，Joshua有精辟的见解，他说&amp;ldquo;当你改进一个成熟语言的时候，你必须仔细考虑能力与复杂度之间的平衡，实际上，&lt;strong&gt;复杂度跟语言的功能数量间至少是平方级关系，为一门老语言加入加上了一个新的功能，通常就意味着加入了一大堆的复杂度。当一种语言已经达到或接近程序员的理解能力的极限时，那么加入如何复杂性都会急剧增加理解的难度&amp;rdquo;（难以理解，更不用说复用了！）。&lt;/strong&gt;Joshua的这个教训源自于Java 1.5中对泛型和通配符的引入（类似于C++的Template机制）在社区中所引起的广泛争议。我觉得按道理来说引入泛型的确可以减少很多bug，一个很明显的例子是集合中的元素不用再每次取出都要做向下转型了，这样可以再编译时尽早的发现问题；同时参数化类型和参数化方法的确可以给程序员带来很多实现上的灵活性。然而实际的情况却与想象中不同，Java中的泛型机制明显给程序员带来的理解上的难度大于它所带来的好处。这让我想起了C++，&lt;strong&gt;一堆在实际使用中浅尝辄止的特性最终成为了各大IT公司笔试面试中&amp;ldquo;高区分度&amp;rdquo;的偏题怪题，或者是少数热爱装B的程序员用来向大家炫耀用的奇巧淫技。&lt;/strong&gt;Joshua说，从这件事儿得到一个教训，&amp;ldquo;&lt;strong&gt;在你能够确保大部分软件从业人员能高效的使用该新特性，而且这一新特性会让他们活得更好之前，你不应该加入这一新特性&lt;/strong&gt;&amp;rdquo;。他还说，应该仔细聆听用户的声音，不能因为一个东西简洁，或者少部分人说好，就把它加进来，&amp;ldquo;&lt;strong&gt;因为你可以放进去的永远比应该放进去的多&amp;rdquo;。&lt;/strong&gt;我个人认为，语言的设计应该是个民主的决策过程，因为每一个修改都会牵扯到大量的人，所以需要聆听大量的来自于社区的声音。Joshua说，他一直都信奉&amp;ldquo;&lt;strong&gt;简单即为美&lt;/strong&gt;&amp;rdquo;，&lt;strong&gt;过度设计和过度复杂的东西最终还是会被证明是有害的&lt;/strong&gt;。我觉得实际上我们大多数程序员使用Java，仅仅是因为它的简洁和高效，这也是当年其能战胜C++坐上编程语言第一的原因。很不幸的是，随着时间的推移，以及为了与C#的阵营的竞争，我们看到了Oracle毫不犹豫的把闭包（Closure）加入了最新的Java规范，我也不愿意看到诸多Java程序员最终成为商业竞争的牺牲品，更不愿看到Java变成第二个C++。Thompson说每个人都在骂C++，每个人都在埋怨他的不好，但Google还是使用C++作为主流语言，关键在于公司可以省去针对刚入职的学生教育和再教育的费用，然而Joshua认为这是受公司&amp;ldquo;DNA&amp;rdquo;的影响，因为以前Google大部分系统都是基于C++构建，所以现在还是继续使用C++，除此之外，&lt;strong&gt;他还说程序员在选择实现系统的编程语言上可以在开发效率和运行效率中做一个很好的权衡&lt;/strong&gt;，如果一段程序非常关键，即使提升一丁点儿性能都会带来整个业务响应时延的一些下降或者吞吐率的一些上升，那么这段程序就应该使用C或者C++来编写。&lt;/p&gt;&#xD;
&lt;p&gt;对于编程风格，Joshua提出了两个原则，&lt;strong&gt;一是程序要具有很好的可读性&lt;/strong&gt;，那么首先需要有表意清楚的函数名、变量名，然而说起来容易做起来难，在编码大型系统的过程中这个问题曾经不止一次的困扰过我，Joshua提出的方案是，随身携带一本韦氏学院词典，我觉得这是一个不错的实践，除此之外，我认为也可以通过大量阅读优秀的开源项目代码来借鉴，还有个方法我经常用的就是在JDK API和MSDN中搜索与我所需要的函数、变量类似的名字，也算是一种借鉴吧。其次是要有表达简洁清晰的注释；&lt;strong&gt;二是尽量减少代码的冗余&lt;/strong&gt;，也就是著名的&amp;ldquo;Don't repeat yourself&amp;rdquo;原则，如果你不得不在系统内做复制粘贴代码的操作，那么一定说明你的设计有问题，总之不能纵容自己的这个坏习惯。对于第二点，Ken提出了类似的看法，他也觉得存在冗余的代码是脆弱的代码，对于脆弱的代码，有时修改一个小小的地方甚至需要修改上十几处位置。他认为代码就应该写得健壮简洁，珠圆玉润，完美无缺，这么多年来他一直坚持着&amp;ldquo;简洁详实、短小精悍&amp;rdquo;的编码风格，这样&amp;ldquo;没有什么花哨活儿，任何人都能看懂&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;对于调试方法，两位大神都表示几乎没用过调试器，一致表示自己调试时都是通过添加打印语句（比如printf）来跟踪想了解的代码。&lt;strong&gt;Joshua认为，再精美的调试器也不如程序员的大脑！&lt;/strong&gt;关于这一点，Linus一直都表现出来相同的固执，他说调试器让程序员变得懒惰，使得他们不能从整体上来理解代码，他的这个观点阻碍了Linux内核调试技术的发展，所以至今大多数人进行内核调试还是使用的printk。这个观点我只能表示大部分赞同，在有些情况下，比如代码存在一个逻辑上的小bug，我还是渴望使用断点和单步能快速修复它（Windbg调试windows内核的日子真美好，哎，KGDB真NM难用）。在断言的使用上，二者有不同的看法，Joshua认为应该使用断言来确保到达断言时程序所应该处于的状态以及后续程序运行中的&amp;ldquo;不变量&amp;rdquo;，并且断言可以作为一种代码的辅助理解方法，当你时隔六个月或者当别人来阅读你的代码的时候，通过断言可以知道：哦，原来进入这个函数时需要确保程序处于这样一种状态。而Ken表示自己从不用断言。其实这个原因很好理解，毕竟前者做的是应用程序，后者做的是操作系统，Java应用中断言悲剧时，顶多抛出个Exception（并且含有丰富信息），而OS断言悲剧的话内核就panic了。不过如今在Linux内核中，断言机制也被引入了，它就是BUG_ON这个宏。&lt;/p&gt;&#xD;
&lt;p&gt;谈及设计和编码实现，Joshua分享了自己在设计API时的一些经验。他说首先最重要的是了解你到底要设计什么，也就是需要解决什么问题，说简单点就是需求分析，但是这个需求分析必须是深层次的，比如当用户期望在系统中增加几个特性时，你必须从用户那弄清楚几个问题，&amp;ldquo;为什么？你想用这个系统做什么？你期望它怎么发展？&amp;rdquo;&lt;strong&gt;直到弄明白用户真正需要软件去做的事情，这些就是用例，它们就是用来衡量你的API设计到底是否优秀的基准&lt;/strong&gt;。接下来就到设计实现阶段了，Joshua建议先编写用例，再编写API原型骨架，然后逐步完善API，也就是先写使用API的代码，然后再写实现它们的代码，这个设计思路类似于TDD的思想。他还说在这个过程中应该不断对API进行重构，不合适的就要丢弃，太大的就要拆分，&amp;ldquo;&lt;strong&gt;总之在API设计中要保持一个原则：疑则不用，构建可运行的最简系统，然后毫不留情的重构。&amp;rdquo;&lt;/strong&gt;总的来说，Joshua认为API的设计有两点非常重要，一是要擅于倾听并且把握住用户真正的需求，&lt;strong&gt;如果你情商不够高，或者不懂共情（empathy，心理学词汇），就不应该掺和到API设计，编程语言设计和GUI设计中来&lt;/strong&gt;，二是尽量保持简洁，疑则不用，时刻牢记避免过度设计，因为复杂的东西最终会被证明是有害的。（Joshua曾经在OOPSLA上做过一个关于该话题的著名演讲，演讲的题目是《&lt;span style="text-decoration: underline; color: #0000ff;"&gt;&lt;a href="http://lcsd05.cs.tamu.edu/slides/keynote.pdf"&gt;&lt;span  style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: normal normal normal small/normal arial, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; word-spacing: 0px;"&gt;&lt;span  style="line-height: 16px; font-size: medium;"&gt;How to&lt;span &gt;&amp;nbsp;Design &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span  style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: normal normal normal small/normal arial, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; word-spacing: 0px;"&gt;&lt;span  style="line-height: 16px; font-size: medium;"&gt;a Good&lt;span &gt;&amp;nbsp;API&lt;/span&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;and Why it Matters&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;》，里面详细解释了他的API流程，感兴趣的童鞋可以去参考下。）我在看《Unix编程艺术》时，读到过这样一个观点：&lt;strong&gt;保持简洁是Unix世界中最根本的一条哲学思想&lt;/strong&gt;，Java语言也延续了这一风格，这也是奥卡姆剃刀法则（Occam&amp;lsquo;s Razor）在编程世界中的体现，关于&amp;ldquo;尽量保持简洁&amp;rdquo;，Tony Hoare的图灵奖获奖感言中有一句很犀利的话，&amp;ldquo;&lt;strong&gt;设计一个系统有两种方式：一种是尽量简单，这样明显不会有什么问题；另外一种是，尽量复杂，这样没什么问题会很明显&lt;/strong&gt;。&amp;rdquo;&lt;strong&gt;第一种方法其实更难，&amp;ldquo;它需要从复杂的现象中发现简单规律的那种投入和犀利的洞察力，甚至是那种灵感，同时你还要能够接受当你的目标受限于客观条件时，或者目标之间存在冲突时，你可以作出妥协。&lt;/strong&gt;（C++委员会从不妥协！）&lt;strong&gt;&amp;rdquo;&lt;/strong&gt;在这点上Ken也提出了相同的设计观点，他对比了MIT领导的MULTICS和他自产的Unix，他说MULTICS的失败归咎于&amp;ldquo;过度设计，过度建造，什么都过度，结果等同于无用。&amp;rdquo;结果MIT还声称这是一个巨大的成功，显然这纯粹是放屁。在代码实现上，他认为有两点经验，一是代码都是会腐烂的，所以要经常进行重构或者丢弃，不能有丝毫的怜悯之心；二是&lt;strong&gt;避免过早优化&lt;/strong&gt;，一开始做的时候尽量保持简单，有时候简单的穷举就可以工作的很好，过早的优化只能增加复杂度，并且不一定带来好处，因为这一段代码也许只会在系统中偶尔被运行。他说，&lt;strong&gt;对简洁的代码进行优化，要比让优化的代码简洁容易的多&lt;/strong&gt;。所以应该在实现之后站在系统全局之上再来考虑优化，优化只能针对那些在系统中关键的、经常运行的代码。&lt;/p&gt;&#xD;
&lt;p&gt;最后，两位大神都谈了一下&amp;ldquo;优秀的程序员应该具备那些素质&amp;rdquo;，以及干了这么多年&amp;ldquo;挨踢&amp;rdquo;的感想。Ken觉得一个优秀的程序员最重要的品质是需要有热情，需要有钻研和动手两方面的热情，他说这也是他在面试新人时最注重的品质（这种面试我有点怵），同时他也认为程序员需要有艺术细胞，这样才能创造出美和简洁的东西。Joshua认为，优秀的程序员首先应该要觉得编程是件有意思的事，需要对编程充满兴趣，其次要保持一个开放的心态，能够超越各个社区、阵营中的狭隘观点，接受并吸收来自于不同世界的优秀思想，最后需要有一点美学追求，一些数学技巧，一些人际关系技巧，一些写作技巧（我觉得他说的很实在）。在谈及这么多年技术生涯的感想时，ken说，自十年前的互联网出现以来，计算机领域估计很难再出现新的爆炸式的理论了，于是他让他的儿子去学生物。他说，时代已经和他那时不同了，越来越少的人会去了解系统底层，编程已经变味儿了，整个世界充满了各种复杂的分层，所以&amp;ldquo;自己这个倔强的老头不愿去理解它们&amp;rdquo;（哎，No country for old man！）。Joshua说，如果可以重来的话，希望自己能够多学点数学知识（我现在也觉得要是以前多学点数学知识和哲学哲学就好了，这对构建和评价系统特别有帮助。），但是不管怎么样，他始终认为coding是这个星球上最有意思的工作，他始终觉得&amp;ldquo;我们长大在这个时代，是幸运的&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;在书摘的最后，感想图灵出版社引入这本图书，也感谢辛苦工作的译者董金乾，武卫东，赫培强，朱巍。&lt;/p&gt;&#xD;
&lt;p&gt;以上。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1824317.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/09/13/1824317.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/09/02/1815870.html</id><title type="text">[转载]Linux内核中的GCC特性</title><summary type="text">Linux内核中的 GCC 特性(转) M. Tim Jones, 顾问工程师, Emulex Corp.2009 年 4 月 07 日Linux&amp;reg; 内核使用 GNU Compiler Collection (GCC) 套件的几个特殊功能。这些功能包括提供快捷方式和简化以及向编译器提供优化提示等等。了解这些特殊的 GCC 特性，学习如何在 Linux 内核中使用它们。GCC 和 Linux...</summary><published>2010-09-02T04:09:00Z</published><updated>2010-09-02T04:09:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/02/1815870.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/09/02/1815870.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  id="postmessage_6979187"&gt;Linux&amp;nbsp;&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%C4%DA%BA%CB" &gt;内核&lt;/span&gt;中的 GCC 特性(转)&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;M. Tim Jones, 顾问工程师, Emulex Corp.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;2009 年 4 月 07 日&amp;nbsp;&lt;br /&gt;Linux&amp;reg; 内核使用 GNU Compiler Collection (GCC) 套件的几个特殊功能。这些功能包括提供快捷方式和简化以及向&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%B1%E0%D2%EB" &gt;编译&lt;/span&gt;器提供优化提示等等。了解这些特殊的 GCC 特性，学习如何在 Linux 内核中使用它们。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;GCC 和 Linux 是出色的组合。尽管它们是独立的&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%C8%ED%BC%FE" &gt;软件&lt;/span&gt;，但是 Linux 完全依靠 GCC 在新的体系结构上运行。Linux 还利用 GCC 中的特性（称为扩展）实现更多功能和优化。本文讨论一些重要的扩展，讲解如何在 Linux 内核中使用它们。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;GCC 当前的稳定版本（版本 4.3.2）支持 C 标准的三个版本：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;* International Organization for Standardization (ISO) 最初的 C 语言标准（ISO C89 或 C90）&amp;nbsp;&lt;br /&gt;* 带修正 1 的 ISO C90&amp;nbsp;&lt;br /&gt;* 当前的 ISO C99（这是 GCC 使用的默认标准，本文也假设采用这种标准）&amp;nbsp;&lt;br /&gt;&lt;br /&gt;注意：本文假设使用 ISO C99 标准。如果指定比 ISO C99 版本旧的标准，那么可能无法使用本文描述的一些扩展。可以在&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%C3%FC%C1%EE" &gt;命令&lt;/span&gt;行上使用 -std 选项指定 GCC 使用的实际标准。可以通过 GCC 手册查看哪个标准版本支持哪些扩展（见 参考资料 中的链接）。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;可应用的版本&amp;nbsp;&lt;br /&gt;&lt;br /&gt;本文主要关注在 2.6.27.1 Linux 内核和 GCC 的 4.3.2 版本中使用 GCC 扩展。每个 C 扩展引用 Linux 内核源代码中的一个&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%CE%C4%BC%FE" &gt;文件&lt;/span&gt;，可以在其中找到示例。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;可以以几种方式对可用的 C 扩展进行分类。本文把它们分为两大类：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;* 功能性 扩展提供新功能。&amp;nbsp;&lt;br /&gt;* 优化 扩展帮助生成更高效的代码。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;功能性扩展&amp;nbsp;&lt;br /&gt;&lt;br /&gt;先讨论一些扩展标准 C 语言的 GCC 扩展。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;类型发现&amp;nbsp;&lt;br /&gt;&lt;br /&gt;GCC 允许通过变量的引用识别类型。这种操作支持泛型编程。在 C++、Ada 和 Java&amp;trade; 语言等许多现代编程语言中都可以找到相似的功能。Linux 使用 typeof 构建 min 和 max 等依赖于类型的操作。清单 1 演示如何使用 typeof 构建一个泛型宏（见 ./&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=linux" &gt;linux&lt;/span&gt;/include/linux/&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=kernel" &gt;kernel&lt;/span&gt;.h）。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 1. 使用 typeof 构建一个泛型宏&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define min(x, y) ({ \&amp;nbsp;&lt;br /&gt;typeof(x) _min1 = (x); \&amp;nbsp;&lt;br /&gt;typeof(y) _min2 = (y); \&amp;nbsp;&lt;br /&gt;(void) (&amp;amp;_min1 == &amp;amp;_min2); \&amp;nbsp;&lt;br /&gt;_min1 &amp;lt; _min2 ? _min1 : _min2; })&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;范围扩展&amp;nbsp;&lt;br /&gt;&lt;br /&gt;GCC 支持范围，在 C 语言的许多方面都可以使用范围。其中之一是 switch/case 块中的 case 语句。在复杂的条件结构中，通常依靠嵌套的 if 语句实现与清单 2（见 ./linux/drivers/scsi/sd.c）相同的结果，但是清单 2 更简洁。使用 switch/case 也可以通过使用跳转表实现进行编译器优化。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 2. 在 case 语句中使用范围&amp;nbsp;&lt;br /&gt;&lt;br /&gt;static int sd_major(int major_idx)&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;switch (major_idx) {&amp;nbsp;&lt;br /&gt;case 0:&amp;nbsp;&lt;br /&gt;return SCSI_DISK0_MAJOR;&amp;nbsp;&lt;br /&gt;case 1 ... 7:&amp;nbsp;&lt;br /&gt;return SCSI_DISK1_MAJOR + major_idx - 1;&amp;nbsp;&lt;br /&gt;case 8 ... 15:&amp;nbsp;&lt;br /&gt;return SCSI_DISK8_MAJOR + major_idx - 8;&amp;nbsp;&lt;br /&gt;default:&amp;nbsp;&lt;br /&gt;BUG();&amp;nbsp;&lt;br /&gt;return 0; /* shut up gcc */&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;还可以使用范围进行初始化，如下所示（见 ./linux/arch/cris/arch-v32/kernel/smp.c）。在这个示例中，spinlock_t 创建一个大小为 LOCK_COUNT 的数组。数组的每个元素初始化为 SPIN_LOCK_UNLOCKED 值。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;/* Vector of locks used for various atomic operations */&amp;nbsp;&lt;br /&gt;spinlock_t cris_atomic_locks[] = { [0 ... LOCK_COUNT - 1] = SPIN_LOCK_UNLOCKED};&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;范围还支持更复杂的初始化。例如，以下代码指定数组中几个子范围的初始值。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;零长度的数组&amp;nbsp;&lt;br /&gt;&lt;br /&gt;在 C 标准中，必须定义至少一个数组元素。这个需求往往会使代码设计复杂化。但是，GCC 支持零长度数组的概念，这对于结构定义尤其有用。这个概念与 ISO C99 中灵活的数组成员相似，但是使用不同的语法。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;下面的示例在结构的末尾声明一个没有成员的数组（见 ./linux/drivers/ieee1394/raw1394-private.h）。这允许结构中的元素引用结构实例后面紧接着的&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%C4%DA%B4%E6" &gt;内存&lt;/span&gt;。在需要数量可变的数组成员时，这个特性很有用。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;struct iso_block_store {&amp;nbsp;&lt;br /&gt;atomic_t refcount;&amp;nbsp;&lt;br /&gt;size_t data_size;&amp;nbsp;&lt;br /&gt;quadlet_t data[0];&amp;nbsp;&lt;br /&gt;};&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;判断调用地址&amp;nbsp;&lt;br /&gt;&lt;br /&gt;在许多情况下，需要判断给定函数的调用者。GCC 提供用于此用途的内置函数 __builtin_return_address。这个函数通常用于&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%B5%F7%CA%D4" &gt;调试&lt;/span&gt;，但是它在内核中还有许多其他用途。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;如下面的代码所示，__builtin_return_address 接收一个称为 level 的参数。这个参数定义希望获取返回地址的调用堆栈级别。例如，如果指定 level 为 0，那么就是请求当前函数的返回地址。如果指定 level 为 1，那么就是请求进行调用的函数的返回地址，依此类推。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void * __builtin_return_address( unsigned int level );&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在下面的示例中（见 ./linux/kernel/softirq.c），local_bh_disable 函数在本地处理器上禁用软中断，从而禁止在当前处理器上运行 softirqs、tasklets 和 bottom halves。使用 __builtin_return_address 捕捉返回地址，以便在以后进行跟踪时使用这个地址。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void local_bh_disable(void)&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;__local_bh_disable((unsigned long)__builtin_return_address(0));&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;常量检测&amp;nbsp;&lt;br /&gt;&lt;br /&gt;在编译时，可以使用 GCC 提供的一个内置函数判断一个值是否是常量。这种信息非常有价值，因为可以构造出能够通过常量叠算（constant folding）优化的表达式。__builtin_constant_p 函数用来检测常量。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;__builtin_constant_p 的原型如下所示。注意，__builtin_constant_p 并不能检测出所有常量，因为 GCC 不容易证明某些值是否是常量。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;int __builtin_constant_p( exp )&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Linux 相当频繁地使用常量检测。在清单 3 所示的示例中（见 ./linux/include/linux/log2.h），使用常量检测优化 roundup_pow_of_two 宏。如果发现表达式是常量，那么就使用可以优化的常量表达式。如果表达式不是常量，就调用另一个宏函数把值向上取整到 2 的幂。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 3. 使用常量检测优化宏函数&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define roundup_pow_of_two(n) \&amp;nbsp;&lt;br /&gt;( \&amp;nbsp;&lt;br /&gt;__builtin_constant_p(n) ? ( \&amp;nbsp;&lt;br /&gt;(n == 1) ? 1 : \&amp;nbsp;&lt;br /&gt;(1UL &amp;lt;&amp;lt; (ilog2((n) - 1) + 1)) \&amp;nbsp;&lt;br /&gt;) : \&amp;nbsp;&lt;br /&gt;__roundup_pow_of_two(n) \&amp;nbsp;&lt;br /&gt;)&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;函数属性&amp;nbsp;&lt;br /&gt;&lt;br /&gt;GCC 提供许多函数级属性，可以通过它们向编译器提供更多数据，帮助编译器执行优化。本节描述与功能相关联的一些属性。下一节描述 影响优化的属性。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;如清单 4 所示，属性通过其他符号定义指定了别名。可以以此帮助阅读源代码参考，了解属性的使用方法（见 ./linux/include/linux/compiler-gcc3.h）。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 4. 函数属性定义&amp;nbsp;&lt;br /&gt;&lt;br /&gt;# define __inline__ __inline__ __attribute__((always_inline))&amp;nbsp;&lt;br /&gt;# define __deprecated __attribute__((deprecated))&amp;nbsp;&lt;br /&gt;# define __attribute_used__ __attribute__((__used__))&amp;nbsp;&lt;br /&gt;# define __attribute_const__ __attribute__((__const__))&amp;nbsp;&lt;br /&gt;# define __must_check __attribute__((warn_unused_result))&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 4 所示的定义是 GCC 中可用的一些函数属性。它们也是在 Linux 内核中最有用的函数属性。下面解释如何使用这些属性：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;* always_inline 让 GCC 以内联方式处理指定的函数，无论是否启用了优化。&amp;nbsp;&lt;br /&gt;* deprecated 指出函数已经被废弃，不应该再使用。如果试图使用已经废弃的函数，就会收到警告。还可以对类型和变量应用这个属性，促使&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%BF%AA%B7%A2" &gt;开发&lt;/span&gt;人员尽可能少使用它们。&lt;br /&gt;* __used__ 告诉编译器无论 GCC 是否发现这个函数的调用实例，都要使用这个函数。这对于从&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%BB%E3%B1%E0" &gt;汇编&lt;/span&gt;代码中调用 C 函数有帮助。&amp;nbsp;&lt;br /&gt;* __const__ 告诉编译器某个函数是无状态的（也就是说，它使用传递给它的参数生成要返回的结果）。&amp;nbsp;&lt;br /&gt;* warn_unused_result 让编译器检查所有调用者是否都检查函数的结果。这确保调用者适当地检验函数结果，从而能够适当地处理错误。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;下面是在 Linux 内核中使用这些属性的示例。deprecated 示例来自与体系结构无关的内核（./linux/kernel/resource.c），const 示例来自 IA64 内核源代码（./linux/arch/ia64/kernel/unwind.c）。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;int __deprecated __check_region(struct resource&amp;nbsp;&lt;br /&gt;*parent, unsigned long start, unsigned long n)&amp;nbsp;&lt;br /&gt;&lt;br /&gt;static enum unw_register_index __attribute_const__&amp;nbsp;&lt;br /&gt;decode_abreg(unsigned char abreg, int memory)&amp;nbsp;&lt;br /&gt;&lt;br /&gt;优化扩展&amp;nbsp;&lt;br /&gt;&lt;br /&gt;现在，讨论有助于生成更好的机器码的一些 GCC 特性。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;分支预测提示&amp;nbsp;&lt;br /&gt;&lt;br /&gt;在 Linux 内核中最常用的优化技术之一是 __builtin_expect。在开发人员使用有条件代码时，常常知道最可能执行哪个分支，而哪个分支很少执行。如果编译器知道这种预测信息，就可以围绕最可能执行的分支生成最优的代码。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;如下所示，__builtin_expect 的使用方法基于两个宏 likely 和 unlikely（见 ./linux/include/linux/compiler.h）。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;#define likely(x) __builtin_expect(!!(x), 1)&amp;nbsp;&lt;br /&gt;#define unlikely(x) __builtin_expect(!!(x), 0)&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;通过使用 __builtin_expect，编译器可以做出符合提供的预测信息的指令选择决策。这使执行的代码尽可能接近实际情况。它还可以改进缓存和指令流水线。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;例如，如果一个条件标上了 &amp;ldquo;likely&amp;rdquo;，那么编译器可以把代码的 True 部分直接放在分支指令后面（这样就不需要执行分支指令）。通过分支指令&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%B7%C3%CE%CA" &gt;访问&lt;/span&gt;条件结构的 False 部分，这不是最优的方式，但是访问它的可能性不大。按照这种方式，代码对于最可能出现的情况是最优的。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 5 给出一个使用 likely 和 unlikely 宏的函数（见 ./linux/net/core/datagram.c）。这个函数预测 sum 变量将是零（数据包的 checksum 是有效的），而且 ip_summed 变量不等于 CHECKSUM_HW。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 5. likely 和 unlikely 宏的使用示例&amp;nbsp;&lt;br /&gt;&lt;br /&gt;unsigned int __skb_checksum_complete(struct sk_buff *skb)&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;unsigned int sum;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;sum = (u16)csum_fold(skb_checksum(skb, 0, skb-&amp;gt;len, skb-&amp;gt;csum));&amp;nbsp;&lt;br /&gt;if (likely(!sum)) {&amp;nbsp;&lt;br /&gt;if (unlikely(skb-&amp;gt;ip_summed == CHECKSUM_HW))&amp;nbsp;&lt;br /&gt;netdev_rx_csum_fault(skb-&amp;gt;dev);&amp;nbsp;&lt;br /&gt;skb-&amp;gt;ip_summed = CHECKSUM_UNNECESSARY;&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;br /&gt;return sum;&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;br /&gt;&lt;br /&gt;预抓取&amp;nbsp;&lt;br /&gt;&lt;br /&gt;另一种重要的性能改进方法是把必需的数据缓存在接近处理器的地方。缓存可以显著减少访问数据花费的时间。大多数现代处理器都有三类内存：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;* 一级缓存通常支持单周期访问&amp;nbsp;&lt;br /&gt;* 二级缓存支持两周期访问&amp;nbsp;&lt;br /&gt;*&amp;nbsp;&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%CF%B5%CD%B3" &gt;系统&lt;/span&gt;内存支持更长的访问时间&amp;nbsp;&lt;br /&gt;&lt;br /&gt;为了尽可能减少访问延时并由此提高性能，最好把数据放在最近的内存中。手工执行这个任务称为预抓取。GCC 通过内置函数 __builtin_prefetch 支持数据的手工预抓取。在需要数据之前，使用这个函数把数据放到缓存中。如下所示，__builtin_prefetch 函数接收三个参数：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;* 数据的地址&amp;nbsp;&lt;br /&gt;* rw 参数，使用它指明预抓取数据是为了执行读操作，还是执行写操作&amp;nbsp;&lt;br /&gt;* locality 参数，使用它指定在使用数据之后数据应该留在缓存中，还是应该清除&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void __builtin_prefetch( const void *addr, int rw, int locality );&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Linux 内核经常使用预抓取。通常是通过宏和包装器函数使用预抓取。清单 6 是一个辅助函数示例，它使用内置函数的包装器（见 ./linux/include/linux/prefetch.h）。这个函数为流操作实现预抓取机制。使用这个函数通常可以减少缓存缺失和停顿，从而提高性能。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;清单 6. 范围预抓取的包装器函数&amp;nbsp;&lt;br /&gt;&lt;br /&gt;#ifndef ARCH_HAS_PREFETCH&amp;nbsp;&lt;br /&gt;#define prefetch(x) __builtin_prefetch(x)&amp;nbsp;&lt;br /&gt;#endif&amp;nbsp;&lt;br /&gt;&lt;br /&gt;static inline void prefetch_range(void *addr, size_t len)&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;#ifdef ARCH_HAS_PREFETCH&amp;nbsp;&lt;br /&gt;char *cp;&amp;nbsp;&lt;br /&gt;char *end = addr + len;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;for (cp = addr; cp &amp;lt; end; cp += PREFETCH_STRIDE)&amp;nbsp;&lt;br /&gt;prefetch(cp);&amp;nbsp;&lt;br /&gt;#endif&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;变量属性&amp;nbsp;&lt;br /&gt;&lt;br /&gt;除了本文前面讨论的函数属性之外，GCC 还为变量和类型定义提供了属性。最重要的属性之一是 aligned 属性，它用于在内存中实现对象对齐。除了对于性能很重要之外，某些&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%C9%E8%B1%B8" &gt;设备&lt;/span&gt;或硬件配置也需要对象对齐。aligned 属性有一个参数，它指定所需的对齐类型。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;下面的示例用于软件暂停（见 ./linux/arch/i386/mm/init.c）。在需要页面对齐时，定义 PAGE_SIZE 对象。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;char __nosavedata swsusp_pg_dir[PAGE_SIZE]&amp;nbsp;&lt;br /&gt;__attribute__ ((aligned (PAGE_SIZE)));&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;清单 7 中的示例说明关于优化的两点：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;* packed 属性打包一个结构的元素，从而尽可能减少它们占用的空间。这意味着，如果定义一个 char 变量，它占用的空间不会超过一字节（8 位）。位字段压缩为一位，而不会占用更多存储空间。&amp;nbsp;&lt;br /&gt;* 这段源代码使用一个 __attribute__ 声明进行优化，它用逗号分隔的列表定义多个属性。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;清单 7. 结构打包和&lt;span href="http://www.cnblogs.com/huanghao1986/admin/tag.php?name=%C9%E8%D6%C3" &gt;设置&lt;/span&gt;多个属性&amp;nbsp;&lt;br /&gt;&lt;br /&gt;static struct swsusp_header {&amp;nbsp;&lt;br /&gt;char reserved[PAGE_SIZE - 20 - sizeof(swp_entry_t)];&amp;nbsp;&lt;br /&gt;swp_entry_t image;&amp;nbsp;&lt;br /&gt;char orig_sig[10];&amp;nbsp;&lt;br /&gt;char sig[10];&amp;nbsp;&lt;br /&gt;} __attribute__((packed, aligned(PAGE_SIZE))) swsusp_header;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;结束语&amp;nbsp;&lt;br /&gt;&lt;br /&gt;本文只讨论了在 Linux 内核中可以使用的几个 GCC 特性。可以通过 GNU GCC 手册进一步了解针对 C 和 C++ 语言的所有扩展。&lt;br /&gt;&lt;br /&gt;原文地址：&lt;a href="http://linux.chinaunix.net/bbs/viewthread.php?tid=1097241&amp;amp;extra="&gt;http://linux.chinaunix.net/bbs/viewthread.php?tid=1097241&amp;amp;extra=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;补充：&lt;br /&gt;1 有个我经常看到的，用于实现container_of宏的offsetof宏：&lt;br /&gt;#define offsetof(type, member) __builtin_offsetof (type, member)&lt;br /&gt;__builtin_offsetof是GCC的内置函数，返回指定结构中成员的相对偏移量。&lt;br /&gt;&lt;br /&gt;2 语句表达式&amp;nbsp;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;GNU C 把包含在括号中的复合语句看做是一个表达式，称为语句表达式，它可以出现在任何允许表达式的地方，你可以在语句表达式中使用循环、局部变量等，原本只能在复合语句中使用。例如：&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;++++ include/linux/kernel.h&amp;nbsp;&lt;br /&gt;159: #define min_t(type,x,y) \&amp;nbsp;&lt;br /&gt;160: ({ type __x = (x); type __y = (y); __x &amp;lt; __y ? __x: __y; })&amp;nbsp;&lt;br /&gt;++++ net/ipv4/tcp_output.c&amp;nbsp;&lt;br /&gt;654: int full_space = min_t(int, tp-&amp;gt;window_clamp, tcp_full_space(sk));&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;复合语句的最后一个语句应该是一个表达式，它的值将成为这个语句表达式的值。这里定义了一个安全的求最小值的宏，在标准 C 中，通常定义为:&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;#define min(x,y) ((x) &amp;lt; (y) ? (x) : (y))&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;这个定义计算 x 和 y 分别两次，当参数有副作用时，将产生不正确的结果，使用语句表达式改写这个宏的话只计算参数一次，避免了可能的错误。语句表达式通常用于宏定义。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1815870.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/09/02/1815870.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/08/26/1809454.html</id><title type="text">由一份书单引发的无逻辑随想</title><summary type="text">最近在infoq上看到了Jurgen Appelo列的一份书籍清单，列举出100本最热门的敏捷书籍，。其中跻身前10的书籍包括：　编号书名作者发行年份1《敏捷估计与规划》Mike Cohn20052《代码整洁之道》Robert C. Martin20083《修改代码的艺术》Michael Feathers20044《重构：改善既有代码的设计》Martin Fowler, et al.19995《T...</summary><published>2010-08-26T14:46:00Z</published><updated>2010-08-26T14:46:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/08/26/1809454.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/08/26/1809454.html"/><content type="html">&lt;p&gt;最近在&lt;a target="_blank" href="http://www.infoq.com/cn/news/2010/08/top-agile-books"&gt;infoq&lt;/a&gt;上看到了Jurgen Appelo列的一份书籍清单，列举出&lt;a href="http://www.noop.nl/2010/08/top-100-agile-books.html"&gt;100本最热门的敏捷书籍&lt;/a&gt;，。其中跻身前10的书籍包括：&lt;span style="line-height: normal; font-size: medium;"&gt;　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;table &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;编号&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;b&gt;书名&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;b&gt;作者&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;b&gt;发行年份&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.china-pub.com/35496"&gt;敏捷估计与规划&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Mike Cohn&lt;/td&gt;&#xD;
&lt;td&gt;2005&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.china-pub.com/196266"&gt;代码整洁之道&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Robert C. Martin&lt;/td&gt;&#xD;
&lt;td&gt;2008&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.china-pub.com/36363"&gt;修改代码的艺术&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Michael Feathers&lt;/td&gt;&#xD;
&lt;td&gt;2004&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.china-pub.com/196374"&gt;重构：改善既有代码的设计&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Martin Fowler, et al.&lt;/td&gt;&#xD;
&lt;td&gt;1999&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.amazon.com/gp/product/1933988274?ie=UTF8&amp;amp;tag=noopnl-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1933988274"&gt;The Art of Unit Testing: With Examples in .Net&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Roy Osherove&lt;/td&gt;&#xD;
&lt;td&gt;2009&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.china-pub.com/13569"&gt;敏捷软件开发：原则、模式与实践&amp;nbsp;&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Robert C. Martin&lt;/td&gt;&#xD;
&lt;td&gt;2002&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.china-pub.com/47975"&gt;程序员修炼之道&amp;mdash;从小工到专家&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Andrew Hunt, David Thomas&lt;/td&gt;&#xD;
&lt;td&gt;1999&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;8&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.amazon.com/gp/product/0984521402?ie=UTF8&amp;amp;tag=noopnl-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0984521402"&gt;Kanban: Successful Evolutionary Change for Your Technology Business&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;David J. Anderson&lt;/td&gt;&#xD;
&lt;td&gt;2010&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;9&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.amazon.com/gp/product/0321579364?ie=UTF8&amp;amp;tag=noopnl-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321579364"&gt;Succeeding with Agile: Software Development Using Scrum&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Mike Cohn&lt;/td&gt;&#xD;
&lt;td&gt;2009&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td&gt;&lt;b&gt;10&lt;/b&gt;&lt;/td&gt;&#xD;
&lt;td&gt;《&lt;a href="http://www.china-pub.com/196932"&gt;测试驱动的面向对象软件开发&lt;/a&gt;》&lt;/td&gt;&#xD;
&lt;td&gt;Steve Freeman, Nat Pryce&lt;/td&gt;&#xD;
&lt;td&gt;2009&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;这份书单中的书我买过五本，看过六本，然而现在回忆起来，要么就是浅尝辄止，最多只看了三分之一，要么就是看完之后，现在忘的一干二净。仔细想想，未免觉得汗颜。一直以来的技术生涯，竟然是如此的失败。涉猎甚广，然少有精通；即使现在精通，过几天就忘的没影儿了。做事情上手奇快，进度奇慢。充满激情却缺乏专注，创意无限却缺乏逻辑，知识是如此的丰富却又如此的缺乏系统组织。从来横在我面前的，是一片奇妙的充满不确定性的海洋，它是如此的不可捉摸，无法控制。一直妄图知晓世界全部的理，到头来却是蜻蜓点水，到最后也没得到什么深刻的东西。&lt;/p&gt;&#xD;
&lt;p&gt;以前看Raymond写的《UNIX编程艺术》，里面有说：&amp;ldquo;一次只做一件事，做到最好。&amp;rdquo;那时看到这句话时根本不以为然，总是固执的觉得人的潜力应该是可发掘的、没有极限的，然而我们毕竟不是尼采，也做不了超人。我们只是普普通通的人类，所以时常会觉得力所不及，心力憔悴。以有限的精力去与无限的世界去对抗，能不遍体鳞伤吗？&lt;/p&gt;&#xD;
&lt;p&gt;当意识到这点时，研究生的生涯已经接近尾声，看到周围的人的迅速成长，自己的原地踏步不前，世界观的崩塌，对不确定的未来感到迷茫，心中难免时常会沮丧，这时我也会像当年的lww同学一样去想，&amp;ldquo;究竟什么样的路才真正适合自己呢？&amp;rdquo;我到现在也回答不出这个问题，但是我知道，止步不前，凭空想象几乎不可能得到可行解，因为未来是片变化的，未知的海洋，我们毕竟不是神，无法预测，无法控制并且无法完全了解。我们能做的，只能是顺从自己的内心，勇于尝试，也许我们会犯错，会失败，会痛苦沮丧，然而我们还年轻还有机会，接受改变，勇于尝试，即使我们不知道理想确切的模样，却能够更接近它一步。就好比大雁虽然知道过冬要南飞，但是它们却不知道究竟该飞到哪，它们只能不断的停下，问问自己，这里够温暖吗？如果不够，它们就继续往南飞，它们不断的尝试，不断的犯错。这就是敏捷的方法论，尤其是scrum方法的思想精髓之一：试错法。&lt;/p&gt;&#xD;
&lt;p&gt;所以敏捷帝，XP大师Kent Beck如是说：拥抱变化。&lt;/p&gt;&#xD;
&lt;p&gt;随想完毕，开始行动。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="line-height: normal; font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1809454.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/08/26/1809454.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/07/26/1785244.html</id><title type="text">第一次sprint后的经验总结</title><summary type="text">动机：一 想利用scrum来改进自我时间管理；二 实践scrum，将敏捷能在团队中自下向上的推动。评价：总的来说第一次sprint是失败的。1 可用工作时间估计不足，有客观原因比如863项目的各种干扰，也有主观原因如拖沓，不尊重TODO List的优先级导致非要事第一，容易走神等。2 工作量估计严重失误。3 在实践中对总的backlog的缺失以及对sprint backlog的无视。4 任务之间缺...</summary><published>2010-07-26T06:04:00Z</published><updated>2010-07-26T06:04:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/07/26/1785244.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/07/26/1785244.html"/><content type="html">&lt;p&gt;动机：&lt;/p&gt;&#xD;
&lt;p&gt;一 想利用scrum来改进自我时间管理；&lt;/p&gt;&#xD;
&lt;p&gt;二 实践scrum，将敏捷能在团队中自下向上的推动。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;评价：总的来说第一次sprint是失败的。&lt;/p&gt;&#xD;
&lt;p&gt;1 &amp;nbsp;可用工作时间估计不足，有客观原因比如863项目的各种干扰，也有主观原因如拖沓，不尊重TODO List的优先级导致非要事第一，容易走神等。&lt;/p&gt;&#xD;
&lt;p&gt;2 &amp;nbsp;工作量估计严重失误。&lt;/p&gt;&#xD;
&lt;p&gt;3 &amp;nbsp;在实践中对总的backlog的缺失以及对sprint backlog的无视。&lt;/p&gt;&#xD;
&lt;p&gt;4 &amp;nbsp;任务之间缺乏优先级排序。&lt;/p&gt;&#xD;
&lt;p&gt;5 &amp;nbsp;任务细化粒度不够。采用量化的时间粒度过大。&lt;/p&gt;&#xD;
&lt;p&gt;6 &amp;nbsp;缺乏每日结束时的反馈与自我承诺（站立会议）&lt;/p&gt;&#xD;
&lt;p&gt;7 &amp;nbsp;缺乏每日开始时的细粒度的计划&lt;/p&gt;&#xD;
&lt;p&gt;8 &amp;nbsp;sprint长度估计失败。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;改进策略：&lt;/p&gt;&#xD;
&lt;p&gt;1 &amp;nbsp;必须早起，保证每天的工作学习时间&lt;/p&gt;&#xD;
&lt;p&gt;2 &amp;nbsp;在破冰时间之后，计划当天任务，作出自我承诺，在此之后，关闭各种IM和Gmail。&lt;/p&gt;&#xD;
&lt;p&gt;3 &amp;nbsp;在工作时间内，保证6小时的专心工作时间。&lt;/p&gt;&#xD;
&lt;p&gt;4 有一个基本的backlog，必要时请人一起来帮忙调整优先级。对于sprint backlog，要保持其稳定。&lt;/p&gt;&#xD;
&lt;p&gt;5 &amp;nbsp;调整sprint长度，一周时间太短了。&lt;/p&gt;&#xD;
&lt;p&gt;6 &amp;nbsp;根据sprint长度，选取最重要的事情，做一下任务细化，并且标注时间和明确任务DONE的标准，时间粒度最好为半小时，时间上可以宽裕。要充分考虑到有紧急事件会产生中断。&lt;/p&gt;&#xD;
&lt;p&gt;7 &amp;nbsp;每日结束不光是要更新burn down chart，也需要回顾下今天完成的事情。必须重视回顾（retrospective），希望能做到每日每周每月都要积极的反馈和回顾。&lt;/p&gt;&#xD;
&lt;p&gt;8 &amp;nbsp;工作量的估计不准问题目前主要只能靠回顾解决。在意识形态输出的第二阶段，会在团队中引入一些好的敏捷实践比如像&lt;a href="http://en.wikipedia.org/wiki/Planning_poker"&gt;扑克牌游戏&lt;/a&gt;来改进时间估计。有时间的话阅读下Steve McConnell大牛的&lt;a href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351"&gt;《&lt;/a&gt;&lt;a href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351"&gt;Software&lt;/a&gt;&lt;a href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351"&gt;&amp;nbsp;Estimation: Demystifying the Black Art》&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;总的来说，第一次试验难免会暴露过多问题，希望以后能打起精神，努力解决。也必须耐心，不可妄想一蹴而就。慢慢来，哥不急。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1785244.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/07/26/1785244.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/04/14/1711881.html</id><title type="text">软件工程何其哲学？（一） -- 敏捷是一种生活方式（转）</title><summary type="text">转载自InfoQ中文站：http://www.infoq.com/cn/articles/agile-authority论敏捷之生活方式和权威之实效使用作者Vinay Aggarwal译者郑柯发布于 2010年4月13日 上午12时5分几个月前，我在InfoQ上发表了一篇文章。尽管我在其中只是少数几次用到&amp;ldquo;权威&amp;rdquo;一词，可有些读者还是对&amp;ldquo;权威&amp;rdquo;持有保留...</summary><published>2010-04-14T07:43:00Z</published><updated>2010-04-14T07:43:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/04/14/1711881.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/04/14/1711881.html"/><content type="html">&lt;h1 style="font: normal normal bold 200%/normal arial; letter-spacing: -1px; margin: 0px;"&gt;&lt;span style="font-family: verdana, 'courier new'; font-size: medium;"&gt;&lt;span style="font-weight: normal; letter-spacing: normal; line-height: 21px;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="letter-spacing: -1px; line-height: normal; font-size: small;"&gt;&lt;b&gt;转载自InfoQ中文站：&lt;a href="http://www.infoq.com/cn/articles/agile-authority"&gt;http://www.infoq.com/cn/articles/agile-authority&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;span style="font-family: verdana, 'courier new'; font-size: medium;"&gt;&lt;span style="font-weight: normal; letter-spacing: normal; line-height: 21px;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="letter-spacing: -1px; line-height: normal; font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;h1 style="font: normal normal bold 200%/normal arial; letter-spacing: -1px; margin: 0px;"&gt;论敏捷之生活方式和权威之实效使用&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p  style="list-style-type: none; font-size: 12px; padding: 0px; margin: 0px;"&gt;作者&amp;nbsp;&lt;strong style="color: #1c497b; padding-top: 0px; padding-right: 2px; padding-bottom: 0px; padding-left: 2px;"&gt;&lt;a href="http://www.infoq.com/cn/bycategory.action?authorName=Vinay-Aggarwal"  style="text-decoration: none; color: #1c497b !important; padding-top: 0px; padding-right: 2px; padding-bottom: 0px; padding-left: 2px;"&gt;Vinay Aggarwal&lt;/a&gt;&amp;nbsp;&lt;/strong&gt;译者&lt;strong style="color: #1c497b; padding-top: 0px; padding-right: 2px; padding-bottom: 0px; padding-left: 2px;"&gt;&lt;a href="http://www.infoq.com/cn/bycategory.action?authorName=%E9%83%91%E6%9F%AF"  style="text-decoration: none; color: #1c497b !important; padding-top: 0px; padding-right: 2px; padding-bottom: 0px; padding-left: 2px;"&gt;&amp;nbsp;郑柯&lt;/a&gt;&amp;nbsp;&lt;/strong&gt;发布于 2010年4月13日 上午12时5分&lt;/p&gt;&#xD;
&lt;p  style="list-style-type: none; font-size: 12px; padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;几个月前，我在InfoQ上发表了&lt;a href="http://www.infoq.com/cn/articles/project-manager-role" title="一篇文章" style="text-decoration: underline; color: #0b59b2;"&gt;一篇文章&lt;/a&gt;。尽管我在其中只是少数几次用到&amp;ldquo;权威&amp;rdquo;一词，可有些读者还是对&amp;ldquo;权威&amp;rdquo;持有保留态度。这些有趣的回复激发我 再些一篇文章，以更好地说明我的观点。我会先从类比开始，稍后，我会指出如何在现实生活中实践敏捷；快到结尾时，我会再次从公众生活中给出一些例子，并将 其映射到敏捷和自组织的概念之上。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;范例1&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个心脏病患者的目标是重获健康，医生给他提出如下建议：&lt;/p&gt;&#xD;
&lt;p&gt;1. 每天步行一个小时，不要吃油腻的事物，这样心脏就能强壮起来。不用吃药。（&lt;b&gt;这种做法等同于完美的自组织。&lt;/b&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;很多患者遵循上面 的做法并且恢复了健康。&lt;/p&gt;&#xD;
&lt;p&gt;2. 病人没有遵守上述建议，病情恶化了。医生说病人需要吃药，甚至需要注射；但是仍然建议病人步行，不要进食油腻的事物。（&lt;b&gt;等同于敏捷教练/推进者，希 望把病人的心脏调整好，因为病人没有遵守第一条建议，没有首先做好自组织。&lt;/b&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;很多病人在这个步骤之后恢复健康。&lt;/p&gt;&#xD;
&lt;p&gt;3. 现在，病人确实吃药了，但是方式有问题，而且还是没有听取第一条建议（步行和良好的食物）。病情进一步恶化。现在需要拯救病人了，世界上所有的医生都会建 议采取心脏旁路手术，或其他类似手术，否则病人就会死掉。（&lt;b&gt;这等同于权威&lt;/b&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;现在，你还要花多长时间继续教育病人关于步行和食 物的好处？他根本不听， 而且快要见上帝了。你会把他从家庭和社会里抛弃掉么？在我看来，如果你希望病人好转，你会请求医生采取任何措施，请他拯救这个病人。这就是我对于权威的态度。&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;范例2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我有个朋友开了一家软件公司，使用敏捷作为开发方法论。他告诉我：&lt;/p&gt;&#xD;
&lt;p&gt;1. 他的团队非常松懈。他们甚至不去遵循敏捷最基本的原则：与客户的产品负责人（以下简称PO）协作。他们在演示后甚至不会去给PO打电话了解反馈。PO在回 顾中会说当前的sprint失败了。团队根本没有理解需求，很多细节没有深入讨论。我的朋友解释了与PO协作的好处，并鼓励团队在演示后采纳PO的反馈。&lt;/p&gt;&#xD;
&lt;p&gt;2. 团队没有听从建议。他们再一次没有与PO协作，而且也不觉得有必要在演示后了解PO的反馈。再一次，Sprint失败了，PO上报了问题。我的朋友再次尝 试鼓励团队。&lt;/p&gt;&#xD;
&lt;p&gt;3. 团队以自由、傲慢和信任的名义，仍没有听从。Sprint失败了，连续三次。PO准备放弃这个项目。&lt;/p&gt;&#xD;
&lt;p&gt;4. 现在我的朋友说：&amp;ldquo;你们最好跟随我的指示。如果下一个sprint再次失败，我就会把你们开除掉！&amp;rdquo;现在，团队不得不走出他们的舒适区域。直到今天，项目 进展非常顺利！现在团队也在更广的层面上成为了自组织团队。但是必须有人至少展示一次权威，让事情走上正规。这正是我对于&amp;ldquo;实效权威（pragmatic authority）&amp;rdquo;的看法。&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;范例3&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我另一个熟识的人打算把自己所有的钱都投入到一个小公司的股票上。他非常自信（而不是傲慢），认为自己做出了非常明智的投资，将会为自己带来高额回报。他 的父亲却心存怀疑，试图建议他不要向这个公司投资。我的朋友以自由的名义没有听从父亲的建议，而且对于自己的做法过于自信。然后他的父亲用权威阻止了他。 朋友很沮丧地遵循了父亲的建议，因为他很尊重自己的父亲。后来，我们都看到这家公司的倒闭，人们也都作鸟兽散。朋友感谢他父亲的权威，这让他避免了破产的窘境。&lt;/p&gt;&#xD;
&lt;p&gt;生活中，有些决策一旦做错，我们总是可以恢复过来，得到第二次机会，进行修正。然而有些决策却并非如此，生活不会给你第二次机会。如果出现错误，将会不可 扭转地改变你的生活、你的发展、你的项目、你与客户的关系、等等等等。在这些事情上，我们应该听从专家和更有经验的人的判断。如果他们所爱的人正要在毫无 知觉的情况下犯错，这些专家在某些场合也许会动用权威。这就是我对于&amp;ldquo;实效权威&amp;rdquo;的看法。&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;范例4&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个小孩拿着一把刀，坚持要他父亲和他一起玩。毫无疑问，他会伤到自己和他父亲，因为他还没有成熟到可以玩刀的年纪。他的父亲首先尝试跟他解释说不要玩 刀，但孩子就是孩子，根本不听。父亲接下来使用自己身为父亲的权威，把刀抢了过来。尽管孩子为此哭泣了一段时间，但是孩子和父亲因此避免受伤。此时，孩子 的哭泣和精神痛苦，相对于可能的肉体伤害来说就没有那么重要了。&lt;/p&gt;&#xD;
&lt;p&gt;这个孩子的例子与敏捷的话题背景放在一起有点滑稽，不过我相信：在我们人生的每个阶段，我们的内心都有一个孩子。这些阶段包括：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;缺 少知识（孩子对刀没有完全的认知）&lt;/li&gt;&#xD;
&lt;li&gt;顽固（孩子太喜欢刀了，不会轻易放弃）&lt;/li&gt;&#xD;
&lt;li&gt;不够成熟（当然，孩子的年纪还不知道玩刀的 风险）&lt;/li&gt;&#xD;
&lt;li&gt;贪婪（给的玩具越多，孩子要的越多）&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;可笑的是，在我们人生的不同阶段（比如中学毕业、大学毕业、开始工作、得到升职后等等），我们都觉得自己不再是孩子了。在我看来，上面这些特点都是 我们内在的孩子所展示出来的，而且我们总是要常常表现出来，不过明显是以一种经过修饰的方式，并且处于不同的场合。常常是缺少知识的状况。有人敢宣称自己 知道一切么？如果需要改变工作方式、行为方式和沟通方式的时候，我们就会变得不那么灵活。我们不是总想在自己的舒适区域内顽固地工作下去么？谁敢宣称自己 已经到达了成熟的最高阶段？我们中有多少人希望听从指令？我们对于已有的金钱、自由、技术或是其他东西满意吗？我们都是长大了的孩子。&lt;/p&gt;&#xD;
&lt;p&gt;那 么，如果孩子需要权威，那么大人也一样，不过当然是以经过修饰的方式。&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;敏捷是一种生活方式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我常常把人们在办公室和公共生活中的表现做关联。我们在办公室里面的行为是无法独立看待的。实际上，我们在工作场合中所采取的工作方式、行为表现和软技 能，都是我们生活中性格的映射。在我看来，无法把一个人在个人生活和职场中的表现分开看待。我只在一些好莱坞电影中见过分裂的人格。&lt;/p&gt;&#xD;
&lt;p&gt;我想把（敏捷所赋予的）授权和自由这两个概念扩展到日常的社会生活中。我认为：法律和政策不应由国会或参议院制订，而是应该授权草根阶层的人们管理 国家。不仅如此，老百姓们应该决定政治家和官僚们的薪水，同时负责决定他们的表现是否合格拿到薪水。应该有专人（等同于敏捷教练）持续不断地指导人民和社 区养成良好习惯、坚强的人格，以及所有我们在学校学到的神圣的道义。我真诚地相信这是现实而可能的，因为人类有意愿这么做。但即使如此，我们也不能排除警 察的存在。在这个宇宙中，人类是最复杂、最不可预测的生物。就像技术无法解决所有的难题一样，医学无法生产出所有的药品来治疗所有的疾病（有些疾病是无法 治愈的）。同样，你也无法激励和启发所有人，无法做到让所有人都能真正地自组织。如果这是真的，对于不走正道、做不到敏捷、也就是无法自组织的人，你该怎 么办？这些人也是人啊，他们有生命，理应得到尊重和拯救。他们应该得到不同的对待，以避免其他生命受到他们的影响。长久以来，对待这样的人最有成效的方式 就是使用权威控制他们不成熟的一面，当然要以职业的方式使用。&lt;/p&gt;&#xD;
&lt;p&gt;敏捷所有的理念都是非常出色的，我对于以敏捷写成的任何东西都很热衷。如果我 们能把这些理念应用到实际公共生活中，我们就能改变世界。&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;现实生活与敏捷理念&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;每个国家和文化都有鼓舞人心的领导者和传教士，他们宣扬和平、人性和圣心（这比敏捷教练和推进者的范围和影响力可要大多了），可是为什么 犯罪率还是不断上升呢？&lt;/li&gt;&#xD;
&lt;li&gt;每个国家都有警察，警察有权威。如果有人认为激励能够解决所有的问题，那我能问一下为什么每个国家都有警察吗？&lt;/li&gt;&#xD;
&lt;li&gt;为 了监控交通，我们用摄像头抓拍超速的车辆。即使几乎所有人都遵守交通故障，可这没有让摄像头显得多余。为什么我们不能相信人民，并消除管理这些摄像头的额 外开销呢？&lt;/li&gt;&#xD;
&lt;li&gt;与上一点类似，红绿灯告诉我们何时该停、何时该行。为什么我们不能去掉所有的红绿灯呢？自组织的人民可以以自组织的方式行 驶，不是么？&lt;/li&gt;&#xD;
&lt;li&gt;只要是有犯罪活动，不管是轻微犯罪，还是像炸弹袭击这样的重大犯罪，政府总是要派警察和军队去控制局势。如果我们能够按照 理想的方式，那么政府只要派牧师和圣徒去启发罪犯就可以了。我想这可能不太实用吧？&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;我把现实生活的行为与IT行业中的敏捷作比较，这听起来有点诡异。实际上，我是在拿人和人作对比。那些有罪恶企图的人和我们生活在同一个世界。我们需要红绿灯、摄像头、警察来维持公共秩序，同样是这样一群人，为什么走进办公室之后，我们就不再需要任何监督和管理了呢？敏捷是一种杰出的软件开发方法，不过在 我看来，它也不是拥有神奇力量的万灵丹，不会把走进办公室的人们瞬间变成完美的人。&lt;/p&gt;&#xD;
&lt;p&gt;公司中有种种罪恶，比如诽谤、嫉妒、大声喊叫以示炫耀、不与人分享知识，还有拍马屁等等。身染这些罪恶的人就跟欠公司钱的人一样，要以不同方式对待。长久 以来，使用权威就是对待他们的&amp;ldquo;不同方式&amp;rdquo;。我称之为&amp;ldquo;现实的理想主义&amp;rdquo;。我相信：&amp;ldquo;盲目的理想主义&amp;rdquo;无论在任何场合都不会成功。&lt;/p&gt;&#xD;
&lt;p&gt;我们在学校里的书本上都读到过：&amp;ldquo;永远讲真话，绝不讲谎言。&amp;rdquo;与此同时，书上也告诉我们：能够拯救生命的谎言并不坏。拯救生命要远为重要。与之类似，权威 可能不好，可有时为了拯救某个人、某项业务、某个项目或是某个sprint，就像上面的例子一样，权威又是不可避免的。&lt;/p&gt;&#xD;
&lt;p&gt;我认为：问题在于误用权威和在不必要的时候使用权威。它应该被用来保护事业，保护客户，保护项目，这都能间接地保护和帮助人。敏捷不仅仅是一系列规则，它 的范围更广。它需要我们的思考方式和工作态度在范式的层面做出迁移。仅仅在教室里接受几天的培训不可能完全将敏捷实施好。在变更、演化、自我激励和诚实意 图这些方面的能力和成熟度上，它都有一些基础的要求，这样我们才能作为一个团队表现杰出；同时，敏捷还需要经常的监督。&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;结论&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我认为自由和权威是有联系的。我发现某些敏捷的实践者对于&amp;ldquo;权威&amp;rdquo;这个词汇有着过敏反应。在我看来，问题不在于权威，而在于人们常常误用权威。有些人认为 权威是享受、权力和社会地位的象征。自由与权威有同样的属性。如果人们误用自由，结果同样可怕。有人认为有了自由就可以享受、不担义务、不负责任，等于拥有了杀人执照（license to kill），可以作任何事情。这样的人应该永远不给予自由，连受控制的自由也不行。公司解雇某个人，是权威的终极用法，即使采纳敏捷的公司也会解雇人员。 我想：在日常的项目和业务进程中，如果我们在有必要使用权威时小心而谨慎，我们也许不必以最终极的方式使用权威&amp;mdash;&amp;mdash;解雇。底线在于：权威和自由&amp;mdash;&amp;mdash;误用则 坏，以崇高之目的和正确之精神，善用则灵。&lt;/p&gt;&#xD;
&lt;h3 style="font: normal normal bold 1em/normal arial; letter-spacing: -1px; font-size: 16px;"&gt;关于作者&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Vinay Aggarwal是印度Xebia IT Architects的交付经理。他在IT业界有11年的经验。他拥有工程学学士学位，是PMI认证的项目管理专家(PMP)和经认证的Scrum Master(CSM)。曾在IBM和埃森哲等公司任职。他在瀑布和敏捷（Scrum）方法论上都有很多经验。他信奉横向思维，并将管理学概念应用于解决 各种交付上的挑战。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;b&gt;查看英文原文&lt;/b&gt;：&lt;a target="_blank" href="http://www.infoq.com/articles/agile-authority" style="text-decoration: underline; color: #0b59b2;"&gt;Agile &amp;ndash; A Way of Life and Pragmatic Use of Authority&lt;/a&gt;。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/huanghao1986/aggbug/1711881.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/huanghao1986/archive/2010/04/14/1711881.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/huanghao1986/archive/2010/01/11/1644467.html</id><title type="text">Mark一记：我是如何不再“迟到”的</title><summary type="text">Mark....</summary><published>2010-01-11T15:05:00Z</published><updated>2010-01-11T15:05:00Z</updated><author><name>流浪de小F</name><uri>http://www.cnblogs.com/huanghao1986/</uri></author><link rel="alternate" href="http://www.cnblogs.com/huanghao1986/archive/2010/01/11/1644467.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/huanghao1986/archive/2010/01/11/1644467.html"/></entry></feed>
