﻿<?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>博客园-www.Walzer.cn  -  技术与管理博客</title><link>http://www.cnblogs.com/walzer/</link><description>专注于移动应用开发本博客文章，未在标题中写明转载的, 均为原创.  所谓高手，也就是熟悉别人制定的游戏规则、并且能在规则内跳舞的人。</description><language>zh-cn</language><lastBuildDate>Fri, 19 Mar 2010 14:12:16 GMT</lastBuildDate><pubDate>Fri, 19 Mar 2010 14:12:16 GMT</pubDate><ttl>60</ttl><item><title>个人思考：软件产品在什么情况下一定要走精品路线</title><link>http://www.cnblogs.com/walzer/archive/2010/03/19/1689646.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Fri, 19 Mar 2010 03:05:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2010/03/19/1689646.html</guid><description><![CDATA[<p>阅读: 1161 评论: 16 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2010-03-19 11:05 <a href="http://www.cnblogs.com/walzer/archive/2010/03/19/1689646.html" target="_blank">原文链接</a></p>我最近一直思考这个问题。下文暂且使用目前比较流行的说法，原子经济 vs 比特经济<br /><br />原子商品的边际成本不为零。比如小车，一辆宝马和一辆QQ的制造成本是不同的，做5辆QQ和5万辆QQ，每台车的成本摆在那儿，所以原子产品有贵的有便宜的，消费者可以根据自己的消费能力去购买不同档次的产品。对于原子商品，品质100可以卖100块钱，品质60可以卖60块钱，消费区间能拉开。<br /><br />而对于比特商品，软件，成本集中在初期，出第一份拷贝，到出第1万份拷贝，每份拷贝的边际成本约等于零。比如我们做一个在线斗地主，服务器搭起来后，有5个用户，和有5000个用户，对我们来说成本是一样的。这种边际成本为零的商品，消费者自然会要求你免费。即使你不免费，由于它复制几乎不花成本的特点，自然也会有人帮你免费，那就是盗版和破解，于是你就&#8220;被免费&#8221;了<br /><br />所以，对于免费的产品，品质是100，和品质是60，消费者同样都不用付钱的情况下，自然会去选择品质100的产品。品质60的会一点市场也没有。品质100的产品有了众多用户后，它才可能通过交叉补贴或者后向广告等其他方式来赢利，而品质60的产品则直接出局，非常残酷。<br /><br />就像我去年做一个类似GOOGLE手机地图的导航软件，别人看了后多数会问：这和GOOGLE手机地图有什么差别？给我个理由来使用你这软件。实际上我们做完这套软件，自己需要找路时仍然是用GOOGLE地图来搜索信息和定位。当然这个项目的投资者最后一分钱也没收回来。<br /><br />一件商品只有边际成本不为零的时候，才会有消费区间，做到60分的产品才会有生存空间。比如软件搭载了技术支持服务，如用友的ERP，它在软件上捆绑了人工的技术支持服务，卖给1家企业和卖给10家企业，人工服务的边际成本不为零，所以ERP类软件会有价格差异，软件做得差一点也会有资金不宽裕的小企业买单。<br /><br />看官可以参考一下这篇文章：《开发者:苹果App Store游戏根本不挣钱》 http://www.pcpop.com/doc/0/407/407455.shtml 。文章说，一个在苹果App Store上排名第34位的应用，保持每天有30-35次的下载量，在苹果扣除了相关费用后，开发者每天只能获得20美元左右的收益。折算下来一个月只有4000RMB左右的收入。而iPhone的应用已经号称有10万个了，无数边际成本为零的软件，几乎没赚到什么钱。<br /><p><br /></p><p>综上，我认为可以得到下面这么几个结论： <br /></p><p>1、边际成本为零（或近似为零）的产品，一定会进入免费市场 &nbsp;</p><p>2、在免费市场中，产品一定要走精品路线</p><p>3、纯软件是边际成本为零的比特商品，</p>所以，我思考的结论是：如果想做纯软件就一定要走精品路线，把品质尽量做好；如果软件自身水准达不到业内领先，做个六七成水准就拿出来卖，那么最好捆绑上一些边际成本不为零的原子商品，比如人工技术支持服务、硬件电路板，这样避免开在免费世界里竞争，才会有生存的可能。<img src="http://www.cnblogs.com/walzer/aggbug/1689646.html?type=1" width="1" height="1" alt=""/><p>评论: 16　<a href="http://www.cnblogs.com/walzer/archive/2010/03/19/1689646.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2010/03/19/1689646.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>用AHP层次分析法挑选最佳结婚对象</title><link>http://www.cnblogs.com/walzer/archive/2009/12/21/1628774.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Mon, 21 Dec 2009 04:48:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/21/1628774.html</guid><description><![CDATA[<p>阅读: 2122 评论: 20 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-21 12:48 <a href="http://www.cnblogs.com/walzer/archive/2009/12/21/1628774.html" target="_blank">原文链接</a></p><p>为了使文章读起来比较有趣，假设屏幕前的你现在中了彩票头奖，奖金5亿RMB。于是你彻底解放不用再写代码啦，天天开辆法拉利到处玩，来给你介绍对象的媒人踏破家门。经过初赛、复赛、泳装、晚装、才艺展示之后，仍然有三位佳丽胜出。她们各有所长，但又无法量化比较，让你无法取舍。如下表</p>
<p>
<table style="width: 723pt; border-collapse: collapse" border="0" cellspacing="0" cellpadding="0" width="963">
<colgroup>
<col style="width: 66pt; mso-width-source: userset; mso-width-alt: 2816" width="88">
<col style="width: 237pt; mso-width-source: userset; mso-width-alt: 10112" width="316">
<col style="width: 211pt; mso-width-source: userset; mso-width-alt: 8992" width="281">
<col style="width: 209pt; mso-width-source: userset; mso-width-alt: 8896" width="278">
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; width: 66pt; height: 13.5pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" height="18" width="88"><font face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 237pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" width="316"><font face="宋体">如花</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 211pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" width="281"><font face="宋体">如月</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 209pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" width="278"><font face="宋体">如云</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: #d4d0c8; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66" height="18"><font face="宋体">相貌身材</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66"><font face="宋体">身材娇小,苗条</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66"><font face="宋体">身材高挑</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66"><font face="宋体">身材性感</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: #d4d0c8; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67" height="18"><font face="宋体">　</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">五官有点像刘亦菲</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">声音比较甜</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">五官有点像林志玲</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68" height="18"><font face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68"><font face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68"><font face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68"><font face="宋体">　</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: #d4d0c8; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66" height="18"><font face="宋体">学识智慧</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66"><font face="宋体">硕士, 绘画专业</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66"><font face="宋体">本科, 舞蹈专业</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66"><font face="宋体">本科, 表演专业</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: #d4d0c8; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67" height="18"><font face="宋体">　</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">目前职业是时装设计师</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">目前职业是舞蹈演员</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">目前职业是平面模特</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: #d4d0c8; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67" height="18"><font face="宋体">　</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">平时爱呆在家里看闲书,或画画涂鸦</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">钢琴和声乐上受过专门训练,有一定水准</font></td>
<td style="border-bottom: #d4d0c8; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl67"><font face="宋体">爱好到世界各地旅游</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68" height="18"><font face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68"><font face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68"><font face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #d4d0c8; border-right: windowtext 0.5pt solid" class="xl68"><font face="宋体">　</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl65" height="18"><font face="宋体">气质</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl65"><font face="宋体">清纯、阳光</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl65"><font face="宋体">优雅</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl65"><font face="宋体">高贵、性感</font></td></tr></table></p>
<p>&nbsp;</p>
<p>但可惜你不是泰国人或阿拉伯人，只能按照中国的法律一夫一妻，所以你不得不做出选择。这时候我们的AHP（The analytic hierarchy process）层次分析法就华丽丽地登场了！</p>
<p><br /><strong style="font-size: 14pt">一、AHP方法适合这样的场合：</strong><br />1、有决策目标、有几种可选方案，并且能在方案之间提炼出比较要素<br />2、各方案在比较要素上只有定性的描述，无法定量衡量<br />3、你只能凭直觉或经验，对某两方案的某两要素进行两两比较<br />3、需要对所有方案排出座次。</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">二、AHP方法的理论基础和数学模型</strong></p>
<p>数学模型比较复杂，详见MBALIB的&nbsp;<a href="http://wiki.mbalib.com/wiki/%E5%B1%82%E6%AC%A1%E5%88%86%E6%9E%90%E6%B3%95" target="_blank">层次分析法</a> 词条，对高数还念念不忘的同学可以进去怀旧一下。我们现在的目的是挑老婆，不是做矩阵运算，因此计算的事就找个软件代劳。AHP的计算软件有很多，下文我用了<a href="http://www.jeffzhang.cn/?q=node/2" target="_blank">YAAHP这个软件</a>，可以<a href="http://www.jeffzhang.cn/download/yaahpSetup051.msi" target="_blank">点这里直接下载</a>。虽然你已经是亿万富翁，但是咱们不能忘了程序员的良好习惯，坚持使用盗版或免费软件，这个YAAHP就是免费的，符合勤俭朴素的你。</p>
<p>首先声明我不是托来宣传这个免费软件的，而是因为传授我AHP方法的老师向我推荐了这套软件。</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">三、建立层次结构模型</strong></p>
<p>最上面粉色的是目标层，中间黄色的是要素层，最下面蓝色的是方案层。具体使用方法见<a href="http://www.jeffzhang.cn/yaahpflash/yaahp.swf.html" target="_blank">YAAHP的flash演示动画</a>，下载安装后也有。这个FLASH动画里演示了买车的决策分析，而且要素层里面再细分为两层。不过你已经买完法拉力了，现在要选老婆。我们把模型建得简单点，要素只有一层，如下图。</p>
<p>&nbsp;</p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/AHP_1.JPG" width="525" height="250" /></p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">四、填写判断矩阵</strong></p>
<p>如上面所述的选老婆场景，判断矩阵一共有有4个。分别是：</p>
<p>（1）你对三个比较要素的侧重程度。也就是说，你更看重相貌身材，还是更看中学识智慧或气质，这三者在后面比较中的权重各占多少</p>
<p>（2）三个美女在&#8220;相貌身材&#8221;上的两两比较矩阵<br />（3）三个美女在&#8220;学识智慧&#8221;上的两两比较矩阵<br />（4）三个美女在&#8220;气质&#8221;上的两两比较矩阵<br />由于都是两两比较，所以每个3*3矩阵里只用填入一半不到的格子就行了。如下图，在右上方黄色柱子里拉动那个蓝色方块就行了。</p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/AHP_2.JPG" width="608" height="557" /></p>
<p>&nbsp;</p>
<p>注意这里有个&#8220;一致性&#8221;，定义和公式见<a href="http://wiki.mbalib.com/wiki/%E5%B1%82%E6%AC%A1%E5%88%86%E6%9E%90%E6%B3%95" target="_blank">这里</a>。判断矩阵的一致性如果超过0.1, 则上面那行蓝字会提示&#8220;不一致&#8221;，然后这个软件就鄙视你拒绝为你计算结果。可以调节矩阵里的数值避免这种情况。</p>
<p><br /><strong style="font-size: 14pt">五、计算结果</strong></p>
<p>某个邪恶的男人把四个判断矩阵填写完后（后面三个矩阵的数值保密，免得我老婆看到了扁我），YAAHP软件就自动帮你算出结果了：</p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/AHP_3.JPG" width="421" height="98" /></p>
<p><u>注意，这是AHP层次分析法计算出来的结果，而不是程序软件计算的结果. 抛开软件，我们直接在纸张上画格子填判断矩阵, 最后也能手算出同样的结果来. 根据每个人凭主观判断而填入矩阵的数值不同，最后也会呈现不同的结果. </u></p>
<p>所以，按照某个邪恶男人的审美标准，如月胜出当正房，其次是如云做二奶，如花出局。</p>
<p>这个计算结果会由你对每个要素的倾向而不同，最后把主观的东西变为量化的结果，很神奇吧。</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">六、群体决策</strong></p>
<p>假设这时候作为亿万富翁的老爸老妈对你的层次分析法结果表示异议，也希望加入决策，那么你可以在AHP中加入群体决策，<a href="http://www.jeffzhang.cn/yaahpflash/group.swf.html" target="_blank">如这个视频所演示的</a>，你还可以为各个参与者设定权重。</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">七、回到现实</strong></p>
<p>这样挑老婆当然很爽，可惜你还没中那5亿RMB，所以只好老老实实做产品策划、功能取舍。</p>
<p>用好AHP层次分析可以让你的团队对目标更加明确，做出正确的取舍，赚它个5亿10亿的也不是不可能，到时候就可以如上文那样用AHP方法挑老婆了^_^</p><img src="http://www.cnblogs.com/walzer/aggbug/1628774.html?type=1" width="1" height="1" alt=""/><p>评论: 20　<a href="http://www.cnblogs.com/walzer/archive/2009/12/21/1628774.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/21/1628774.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>免费商业模式的四种基本模型</title><link>http://www.cnblogs.com/walzer/archive/2009/12/20/1628520.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Sun, 20 Dec 2009 15:23:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/20/1628520.html</guid><description><![CDATA[<p>阅读: 1693 评论: 23 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-20 23:23 <a href="http://www.cnblogs.com/walzer/archive/2009/12/20/1628520.html" target="_blank">原文链接</a></p><p>我有一种强烈的预感，将来所有<a href="http://wiki.mbalib.com/wiki/%E8%BE%B9%E9%99%85%E6%88%90%E6%9C%AC" target="_blank">边际成本</a>为零、或趋近于零的产品，最后都应该、也都会成为免费的。比如各种软件、MP3歌曲、音视频节目、电视剧拷贝，等等。毛主席说，一切反动派都是纸老虎。因此，现在那些叫嚣版权的、封杀盗版的都是纸老虎。这些组织和团体无法顺应潮流，而是占住已有利益不放，试图去挽救一种即将被淘汰的商业模式，估计最后只能成为历史的笑柄。</p>
<p>&nbsp;</p>
<p>在<a href="http://wiki.mbalib.com/wiki/%E9%95%BF%E5%B0%BE%E7%90%86%E8%AE%BA" target="_blank">《长尾理论》</a>的作者<a href="http://wiki.mbalib.com/wiki/Chris_Anderson" target="_blank">Chris Anderson</a>的新书<a href="http://product.dangdang.com/product.aspx?product_id=20675080" target="_blank">《免费：商业的未来》</a>中，为目前市面上流行的免费模式建立了四种模型，为广大奋战在软件开发第一线的战士们送来了理论武装。</p>
<p>（以下四种模式的名字及图片转载自此书，但案例和分析是我个人原创）</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">模式一：直接交叉补贴</strong></p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/免费模式一_直接交叉补贴.JPG" width="266" height="210" /></p>
<p>&nbsp;</p>
<p><strong>什么免费：吸引你掏腰包买其他的商品<br />谁享受免费：以某种方式最后掏腰包的人</strong></p>
<p>&nbsp;</p>
<p>直接交叉补贴可以参考以下例子：<br />1、充话费送手机。手机是免费的，但你事先得充足够的话费。<br />2、微软新出的PIM服务&#8220;MyPhone&#8221;是免费的。但是消费者用MyPhone之前，已经为Windows Mobile手机付过费了<br />3、你到演唱会里听歌是要付钱的，但是到酒吧里听歌则是免费的，因为你已经为买酒付钱了，这部分钱会补贴给歌手的演唱收入。<br />3、市政府提供免费的公园给市民休息游玩，因为你已经付过税了<br />4、厦门广电的免费送机顶盒。机顶盒是免费的，但广电预计消费者多少会买些付费频道，用这块钱来补贴机顶盒。// 可惜他们打错了算盘，很少人愿意买付费频道，这块收入不理想，所以最后机顶盒要收钱，闹出了很大矛盾，公众并不鸟你什么交叉补贴模式。<br /><br /><strong style="font-size: 14pt">模式二：三方市场</strong></p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/免费模式二_三方市场.JPG" width="303" height="213" /><br /></p>
<p><strong>什么免费：内容、服务、软件等<br />谁享受免费：任何人</strong></p>
<p>&nbsp;</p>
<p>这几乎是目前使用最普遍的一种免费方式。比如：<br />1、免费看CCTV的电视剧，因为它有巨额的广告收入<br />2、免费用PPStream, youtobe, YouKu看电影，广告主为视频开始前的广告买单。// 所以其实某菊封杀视频网站，我觉得不是因为盗版或政治原因，而是蚕食到自己的利益了。所以我们做产品设计赢利点的时候要尽量避开垄断集团利益，QQ尚且被飞信给强X了，何况咱们这些草民。<br />3、免费用百度的搜索，广告主到竞价排名系统中买单。<br />4、免费看新浪和网易的新闻，广告主买单</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">模式三：免费加收费模式</strong></p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/免费模式三_免费加收费模式.JPG" width="284" height="211" /></p>
<p><strong>什么免费：和付费版本相匹配的任何商品<br />谁享受免费：基本用户</strong></p>
<p>&nbsp;</p>
<p>我们所谓的&#8220;增值服务&#8221;都属于这类。其应用场景如：<br />1、免费的网络游戏，付费的道具。据说最早是韩国人发明的，被史玉柱发扬广大。目前大陆按时间收费的道具已经非常少了，基本都是道具付费模式。<br />2、Skype，PC之间可以免费语音通话，而PC和手机、手机和手机之间通话就需要付费了。// 注意在大陆手机上用互联网络做语音通讯这是个禁区，建议不要去碰。<br />3、网易邮箱，大量的免费用户，少数的VIP用户的付费。</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">模式四：非货币市场</strong></p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/免费模式四_非货币市场.JPG" width="237" height="216" /></p>
<p><strong>什么免费： 人们选择免费赠送的、没有寄希望别人付钱的任何东西<br />谁享受免费：任何人<br /></strong></p>
<p>这种模式简而言之就是&#8220;赔本赚吆喝&#8221;。应用场景如：<br />1、360安全卫士目前是完全免费的，纯粹是为了破坏原有的杀毒软件商业模式，吸引装机量并扩大整个杀毒软件的市场规模。就目前阶段而言，就属于这种模式。以后很可能演变为广告主付费的模式二，或者企业用户付费的模式三，或者两种模式兼而有之。</p>
<p>2、以前我在大学时成立了一个钢琴社，每个季度都有免费的演出，很多人苦练几个月就为上台演奏一首曲子，不求任何金钱回报，也是这个性质。<br />3、这种免费模式里很典型的就是写博客，以及CSDN上的专家分。知识提供者并不需要什么货币收入，只是喜欢一种观点被关注和认可的感觉，或者纯粹就是分享知识的快乐而已。</p>
<p>&nbsp;</p>
<p>------</p>
<p>目前做嵌入式软件主流的赢利模式有四种：<br />1、由设备厂商为软件付费（不管是内部的还是外部的），软件和硬件捆绑在一起卖给消费者。大陆用户虽然没有为软件付费的习惯，但是买硬件还是得付费的。<br />2、行业定制。为政府部门和企事业单位开发定制设备。由于总能帮客户单位提高了生产率或降低了成本，企业付钱是比较愿意的。缺点是比较难形成规模效应（相对于第1条），因此很累人很辛苦。<br />3、把移动应用软件放到APP STORE上面去卖。这个模式在大陆刚开始，国内的环境和国外大不一样，大陆消费者是否愿意为软件版权买单还很难说，本人观望中。<br />4、考虑上述的免费模式。</p>
<p>（欢迎补充）</p>
<p>而免费模式中：<br />模式四不适合长时间地做，只能短期烧钱玩一把，把领域里地主老财们的命革掉，打土豪分田地，自己建立新秩序（如360安全卫士）。适合有钱人玩。<br />模式三需要花一大笔投资去吸引广告主，适合做中长线。（其实手机上的屏幕太小，做文字/图片等空间属性的广告效果可能不好，我怀疑最终形式是时间属性的广告，如音频广告）<br />模式一和模式二，我认为这种方式可以使投资在短时间内有收益，值得重点考虑。<br /></p><img src="http://www.cnblogs.com/walzer/aggbug/1628520.html?type=1" width="1" height="1" alt=""/><p>评论: 23　<a href="http://www.cnblogs.com/walzer/archive/2009/12/20/1628520.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/20/1628520.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>哀乐相生, 君子以正</title><link>http://www.cnblogs.com/walzer/archive/2009/12/16/1625270.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Wed, 16 Dec 2009 01:20:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/16/1625270.html</guid><description><![CDATA[<p>阅读: 106 评论: 0 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-16 09:20 <a href="http://www.cnblogs.com/walzer/archive/2009/12/16/1625270.html" target="_blank">原文链接</a></p><p>突然翻出一篇自己比较早时候写的， 遗留在MSN SPACE里面, 转过来。<br />有点小意思，古人谈论事情貌似就需要这样生拉硬扯，开头必先圣人云如何如何，再把自己的观点附会上去说圣人也是这么说的。
<p>------------------------------------------------------ 
<p>&nbsp; 
<p>早上看一篇项目管理文章中提到的这个比喻. 作者是台湾的高焕堂. 
<p>孔子在提到的"五至"是<br />物之所至, 志亦至焉.<br />志之所至, 礼亦至焉.<br />礼之所至, 乐亦至焉.<br />乐之所至, 哀亦至焉.<br />哀乐相生, 君子以正. 
<p>被高焕堂解释为：<br />物 &#8212;&#8212; 就是软件系统及其架构<br />志 &#8212;&#8212; 就是客户的需求<br />礼 &#8212;&#8212; 就是流程管理制度，如CMMI，或agility<br />乐 &#8212;&#8212; 就是需求获得满足<br />哀 &#8212;&#8212; 就是需求无法满足 
<p>&nbsp; 
<p>以下是我个人的解读，高焕堂在后面的解释都比较牵强，下文就不采用了。 
<p>物之所至, 志亦至焉.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;系统的软硬件条件（物），决定了在其基础上哪些是合理的需求，两者必须和谐不冲突。<br />志之所至, 礼亦至焉.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;在和谐、可实现的需求上，就能制订项目执行计划（礼）。<br />礼之所至, 乐亦至焉.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;根据计划（礼）开发出合乎需求的产品，满足了客户的需求（乐）<br />乐之所至, 哀亦至焉.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;时间在变，产品的竞争局面在变，客户/用户的需求也随之改变了。对需求的满足只是一时的。产品无法完全满足客户/用户的新需求时，抱怨（哀）就产生了。<br />哀乐相生, 君子以正.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;所以我们得及时调整项目计划，做出适当的需求变更，做出有合适的竞争力的产品。如此哀乐相生循环不已，有智者以此为常态。 </p>
<p>&nbsp;</p>
<p>孔子的"五至"实际上指导了我们以下几点：<br />1、需求必须在系统软硬件基础上合理提出，不能不切实际地凭空想象。（比如在100MHz的CPU上模仿iPhone界面的动画效果）<br />2、而开发计划是根据需求和系统软硬件条件而定的。<br />3、五至篇的重点在于&#8220;乐之所至, 哀亦至焉&#8221;的转折，和&#8220;哀乐相生, 君子以正&#8221;的总结。实际上就是从哲学层面上强调了<br />（1）对需求的满足感不会是长久的恒定的，必然是哀由乐生。用户/客户在对需求的一时满意之后，必然会有新的需求提出来。需求是无止境的。<br />（2）对于需求的变更和增加，有智者应该理解为一种常态。实际上这也是整个产业能够发展的根本动力所在。<br />4、第3点谈到的需求变更，又等于回头到第1点上，需求变更同样必须在&#8220;物&#8221;的基础上合理提出。如果当前的系统软硬件条件无法满足新的需求，那就得升级我们的&#8220;物&#8221;了。这时候一个新的平台或新的项目就又开始了。</p>
<p>&nbsp;</p>
<p>Walzer @ 2008-10-7</p><img src="http://www.cnblogs.com/walzer/aggbug/1625270.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/walzer/archive/2009/12/16/1625270.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/16/1625270.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>代码高效性和健壮性的权衡</title><link>http://www.cnblogs.com/walzer/archive/2009/12/14/1623945.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Mon, 14 Dec 2009 09:29:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/14/1623945.html</guid><description><![CDATA[<p>阅读: 108 评论: 0 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-14 17:29 <a href="http://www.cnblogs.com/walzer/archive/2009/12/14/1623945.html" target="_blank">原文链接</a></p><p>这个是比较早, 09年4月份的事情了。整理文档翻出来，觉得还有点意思.</p>
<p>&nbsp;</p>
<p>当时CLIENT-SERVER的通讯封包格式有两种方案</p>
<p>a. 以7E为开头和结尾, PAYLOAD中所有7E的字节, 都在其后扩展一个BYTE, 写为7E, 7D, (称为转义). 封包中不带CHECKSUM, CRC等校验用的字段</p>
<p>b. 以7E为开头和结尾, 带一个CHECKSUM字段, PAYLOAD中不进行7E-&gt;7E 7D的转义.</p>
<p>几个同事就这个通信封包格式, 采用方案一或方案二, 开会激烈讨论了个把小时。<br />我原先反对转义方案的出发点比较模糊, 只是觉得原先转义的方案"不优雅"; 后来才想清楚了不优雅的"本质"在哪里.</p>
<p>&nbsp;</p>
<p>所有的代码, 可以在抽象意义上分作两大块, 两者的着重点是不同的.</p>
<p><strong>(1) 正常运行的代码. 首要追求高效性,</strong> <br />&nbsp;&nbsp;&nbsp; 这个"高效性"如果从逻辑的角度来解释, 那么一方面是"高效"地对正确的数据执行正确的算法(方法/策略), 另一方面是"高效"地找出异常, 然后丢给异常处理代码去处理. </p>
<p><strong>(2) 处理异常的代码. 首要追求健壮性.</strong>&nbsp;<br />&nbsp;&nbsp;&nbsp; 就是程序必须能从异常中自我恢复. 由于代码多数时间跑的是"正常"逻辑, 少数情况下才不得不处理"异常", 所以"异常"处理的代码中, 首要任务是健壮, 跑不死, 而高效性则是次要的.</p>
<p>&nbsp;</p>
<p>那么回到转义的策略上来看，原先的7E -&gt; 7E 7D, 使得装包和拆包的时候, 时间上都必须挨字节扫描过去, 空间上必须另开一块内存, 这些"不优雅"的工作是为了应对网络传输时包数据丢失. 包数据丢失是一个异常情况，而转义策略本质上就是不论好包坏包，一棍子打死, 统统要经过转义算法. 用上面的观点解释, 即"<strong>为了异常情况下的健壮性，牺牲了正常情况下的高效性</strong>".</p>
<p>而用Header + Length + CheckSum + Payload + Tailer的做法, 逻辑上是这样的</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;以Length为基础,&nbsp;得知CheckSum正确&nbsp;和&nbsp;Tailer正确)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;正确的包，走正常处理流程,&nbsp;直接把Payload传给上层逻辑处理<br />}&nbsp;<br /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;错误的包，走异常处理流程，挨字节扫描下一个Header,&nbsp;然后再算length,&nbsp;checksum,&nbsp;tailer等<br />}</span></div></div>
<p>这是在上面"正常-&gt;高效性 &amp; 异常-&gt;健壮性"指导思想下的做法. 那么现在就剩最后一个问题, 计算checksum和转义的工作相比, 哪一个更快? 如果转义处理的效率, 比checksum更高，那么上面的假设就不成立了.</p>
<p>所以我做了个实验, 代码如下</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('73690524-15e5-453f-b193-2d9d56499d54')"><img id="code_img_closed_73690524-15e5-453f-b193-2d9d56499d54" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img style="display: none" id="code_img_opened_73690524-15e5-453f-b193-2d9d56499d54" class="code_img_opened" onclick="cnblogs_code_hide('73690524-15e5-453f-b193-2d9d56499d54',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">代码</span> 
<div id="cnblogs_code_open_73690524-15e5-453f-b193-2d9d56499d54" class="cnblogs_code_hide">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">BYTE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pBuf1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BYTE[</span><span style="color: #800080">1024</span><span style="color: #000000">];<br />BYTE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pBuf2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BYTE[</span><span style="color: #800080">1024</span><span style="color: #000000">*</span><span style="color: #800080">2</span><span style="color: #000000">];<br />UINT8&nbsp;sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />DWORD&nbsp;tStart&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;tEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;CODE&nbsp;1,&nbsp;转义处理</span><span style="color: #008000"><br /></span><span style="color: #000000">tStart&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetTickCount();&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;WM上的毫秒级时间</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">100000</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;i2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1024</span><span style="color: #000000">;&nbsp;i1</span><span style="color: #000000">++</span><span style="color: #000000">,&nbsp;i2</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pBuf1[i1]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0x7E</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;pBuf1[i1</span><span style="color: #000000">+</span><span style="color: #800080">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0x7D</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuf2[i2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBuf1[i1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i1</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuf2[i2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pBuf1[i1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />tEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetTickCount();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />printf(</span><span style="color: #800000">"</span><span style="color: #800000">copy&nbsp;1024&nbsp;bytes&nbsp;*&nbsp;100K&nbsp;times,&nbsp;use&nbsp;%d&nbsp;ms\n</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;tEnd&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;tStart);<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;CODE&nbsp;2,&nbsp;CHECK&nbsp;SUM</span><span style="color: #008000"><br /></span><span style="color: #000000">tStart&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetTickCount();<br /><br /></span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">100000</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1024</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;pBuf1[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />tEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetTickCount();<br /><br />printf(</span><span style="color: #800000">"</span><span style="color: #800000">check&nbsp;sum&nbsp;1024&nbsp;bytes&nbsp;*100K&nbsp;times,&nbsp;&nbsp;use&nbsp;%d&nbsp;ms\n</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;tEnd&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;tStart);<br /></span></div></div></div>
<p>上面这段代码，在SAMSUNG 2442 400MHz的CPU, WM 6.1系统上运行结果是</p>
<p>copy 1024 bytes * 100K times, use 11677 ms<br />check sum 1024 bytes *100K times,&nbsp; use 7504 ms</p>
<p>所以, 一个正确的数据包, 经过CHECKSUM计算的时间, 比其经过转义计算的时间要快得多, 仅为其64%.&nbsp; 这是手机上的情况, 服务器上的百分比不太清楚是什么样，但至少有一点是肯定的，就是用CHECKSUM的方案比用转义的方案，在正常逻辑情况下速度更快、内存开销更少。当服务器同时处理十万数量级网络数据包的时候, 性能提升还是比较可观的。</p>
<p>&nbsp;</p>
<p>这篇文章的重点不在于哪个方案更严谨，或者上面的逻辑对不对，而是在于这么一个思想：</p>
<p>(1) 正常运行的代码. 首要追求高效性, </p>
<p>(2) 处理异常的代码. 首要追求健壮性.&nbsp;</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/walzer/aggbug/1623945.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/walzer/archive/2009/12/14/1623945.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/14/1623945.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>软件质量的分层控制方法</title><link>http://www.cnblogs.com/walzer/archive/2009/12/12/1622772.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Sat, 12 Dec 2009 15:21:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/12/1622772.html</guid><description><![CDATA[<p>阅读: 1150 评论: 12 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-12 23:21 <a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622772.html" target="_blank">原文链接</a></p><p><strong>一、质量的相对概念</strong></p>
<p>1、多数比较上进的程序员，都希望自己的代码作品是优雅的、高质量的、别人看到能赞赏不已的。但事实上，紧迫的进度压力使程序员没有太多时间思考，匆忙赶出功能后，赶快测试发布赶快交付给客户。因此有人提出需要重构，有人提出各种测试方法，计算&#8220;每千行代码缺陷率&#8221;，以追求&#8220;零缺陷&#8221;为目标。总之多数技术人员认为<u>&#8220;质量越高越好&#8221;。</u>这里有个典型例子<a href="http://www.cnblogs.com/sillyemperor/archive/2009/12/12/1622506.html" target="_blank">《养成重构的习惯有多重要》，</a>原文和后面的回帖都很有代表性。</p>
<p>2、现在我们假设一种场景，筷子的质量。<br />首先你到了五星级酒店，它的筷子必须是如象牙般优雅，笔直而对称，没有任何瑕疵斑点，有合适的重量手感，等等，也就是说五星级酒店对筷子的质量要求是很高的，否则客户会发飚。<br />然后你到了一家路边的快餐店，顺手拿过来一双&#8220;一次性筷子&#8221;，拆开后发现毛刺很多容易扎手，甚至筷子有点弯曲，但你还是凑合着用了，或者实在无法忍受就扔掉再拿一把，因为这是在路边快餐店，用户对筷子的要求是低的。<br />如果你把快餐店的筷子卖到酒店里会发生什么情况？质量太低客人无法接受。如果五星级酒店的筷子卖到快餐店会发生什么情况？用户不需要那么好，也不愿意付那么多钱。所以同样做一个筷子，却对质量有不同要求。<br />所以说：<u>质量是相对的。</u></p>
<p>3、基于第2点，所以一味追求&#8220;高质量代码&#8221;，<u>把&#8220;高质量目标&#8221;凌驾于&#8220;企业赢利目标&#8221;之上，是多数技术人员所犯的错误。</u></p>
<p>&nbsp;</p>
<p><strong>二、对质量目标进行逐级分解和控制</strong></p>
<p>多数成熟度不高的软件公司会有一定的质量控制方法，但将其用于所有的项目和所有的软件层面。我认为这是一种资源浪费。适度降低对外围层次、用户需求弱相关、使用频度低模块的质量控制，会给项目带来进度和成本上的收益。<br />比如下面这个案例。这是一个比较成功的网游公司中，项目代码分层控制情况</p>
<p>
<table style="width: 842pt; border-collapse: collapse" border="0" cellspacing="0" cellpadding="0" width="1123">
<colgroup>
<col style="width: 15pt; mso-width-source: userset; mso-width-alt: 640" width="20">
<col style="width: 229pt; mso-width-source: userset; mso-width-alt: 9760" width="305">
<col style="width: 143pt; mso-width-source: userset; mso-width-alt: 6112" width="191">
<col style="width: 164pt; mso-width-source: userset; mso-width-alt: 7008" width="219">
<col style="width: 141pt; mso-width-source: userset; mso-width-alt: 6016" width="188">
<col style="width: 150pt; mso-width-source: userset; mso-width-alt: 6400" width="200">
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #c5d9f1; width: 15pt; height: 13.5pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl66" height="18" width="20"><font size="2" face="宋体">　</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #c5d9f1; width: 229pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl67" width="305"><font size="2" face="宋体">层次功能</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #c5d9f1; width: 143pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl67" width="191"><font size="2" face="宋体">质量要求</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #c5d9f1; width: 164pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl67" width="219"><font size="2" face="宋体">开发者</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #c5d9f1; width: 141pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl67" width="188"><font size="2" face="宋体">编程语言</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #c5d9f1; width: 150pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl67" width="200"><font size="2" face="宋体">代码开放度</font></td></tr>
<tr style="height: 24pt" height="32">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; width: 15pt; height: 24pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl68" height="32" width="20"><font size="2" face="宋体">5</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 229pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="305"><font size="2" face="宋体">任务脚本、战斗剧情、数值设定等外围脚本</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #fde9d9; width: 143pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl70" width="191"><font size="2" face="宋体">逻辑正常，跑起来不会导致程序崩溃就行。手工测试</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="219"><font size="2" face="宋体">项目策划组的非编程专业人员，简单培训后即可编写</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 141pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="188"><font size="2" face="宋体">自定义的、类似python的低难度脚本</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 150pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="200"><font size="2" face="宋体">所有人可见</font></td></tr>
<tr style="height: 24pt" height="32">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; width: 15pt; height: 24pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl68" height="32" width="20"><font size="2" face="宋体">4</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 229pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="305"><font size="2" face="宋体">项目外围代码</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #fcd5b4; width: 143pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl71" width="191"><font size="2" face="宋体">详细设计由主程评审，代码未评审。手工测试</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="219"><font size="2" face="宋体">项目程序组的非主力人员，多数是普通大学本科毕业生</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 141pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="188"><font size="2" face="宋体">某种业内标准的脚本语言（商业原因不便透露）</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 150pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="200"><font size="2" face="宋体">所有人可见</font></td></tr>
<tr style="height: 24pt" height="32">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; width: 15pt; height: 24pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl68" height="32" width="20"><font size="2" face="宋体">3</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 229pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="305"><font size="2" face="宋体">跨项目使用的游戏主要逻辑，核心代码。如好友系统、聊天系统、帮派系统等</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #fac090; width: 143pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl72" width="191"><font size="2" face="宋体">详细设计由技术总监亲自评审，部份模块有做单元测试.</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="219"><font size="2" face="宋体">项目程序组的主力人员，主要由重点大学本科生构成</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 141pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="188"><font size="2" face="宋体">同上，业内标准的脚本语言</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 150pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="200"><font size="2" face="宋体">所有人可见</font></td></tr>
<tr style="height: 36pt" height="48">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; width: 15pt; height: 36pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl68" height="48" width="20"><font size="2" face="宋体">2</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 229pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="305"><font size="2" face="宋体">跨项目使用的开源游戏引擎，研究/优化/集成/针对特殊需求进行二次开发</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #e46d0a; width: 143pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl73" width="191"><font size="2" face="宋体">技术总监亲自带队，测试方法未知</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="219"><font size="2" face="宋体">研究部成员。基本都是211大学硕士或海归，计算机或数学专业</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 141pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="188"><font size="2" face="宋体">C/C++</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 150pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="200"><font size="2" face="宋体">研究部成员及工程项目的经理、程序经理、测试经理可见。其余人员不可见</font></td></tr>
<tr style="height: 24pt" height="32">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; width: 15pt; height: 24pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl68" height="32" width="20"><font size="2" face="宋体">1</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 229pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="305"><font size="2" face="宋体">上面3/4层所用的脚本解释器、服务器分布式框架等</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #974807; width: 143pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl74" width="191"><font size="2" face="宋体">技术总监亲自开发和测试。测试方法未知</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="219"><font size="2" face="宋体">技术总监和几个创业元老，清一色海归</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 141pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="188"><font size="2" face="宋体">C/C++</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 150pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl69" width="200"><font size="2" face="宋体">仅技术总监和公司股东/创业元老，及几个项目经理可见</font></td></tr></table>&nbsp;</p>
<p>大家特别注意每个层次的质量要求，从&#8220;不使程序崩溃、逻辑正确不使程序崩溃即可&#8221;，到&#8220;技术总监亲自开发测试，不许别人碰里面代码&#8221;分级管理，越是核心部分对代码质量要求越高，从开发人员的级别/背景/资历/审核人员级别/测试方法上可以体现出来。而4和5两层比较外围的代码, 只要实现功能就可以了, 我阅读了这些代码并在其中开发过一小段时间，里面到处充斥着&#8220;坏味道&#8221;的代码，程序员都是边改边骂，但这并不影响这个游戏有60万的活跃用户和300万以上的注册用户，给公司带来强劲的现金流。而这套对质量进行分级控制的方法，则是技术总监传授讲解给我的。</p>
<p>（表格中代码开放度仅供参考，小公司是输不起的，看看pudn.com上那些把老东家代码拿出来开源的人渣就知道了）</p>
<p>&nbsp;</p>
<p>大家知道项目的时间-质量-成本铁三角, 如果把上面5层代码的铁三角列个表格出来，大致如此(我们假设在每个软件层面投入的成本是一致的)</p>
<p>
<table style="width: 595pt; border-collapse: collapse" border="0" cellspacing="0" cellpadding="0" width="793">
<colgroup>
<col style="width: 54pt" width="72">
<col style="width: 233pt; mso-width-source: userset; mso-width-alt: 9920" width="310">
<col style="width: 144pt; mso-width-source: userset; mso-width-alt: 6144" width="192">
<col style="width: 164pt; mso-width-source: userset; mso-width-alt: 7008" width="219">
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #fde9d9; width: 54pt; height: 13.5pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" height="18" width="72"><font face="宋体">层次</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #fde9d9; width: 233pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" width="310"><font face="宋体">质量</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #fde9d9; width: 144pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" width="192"><font face="宋体">进度</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #fde9d9; width: 164pt; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid" class="xl65" width="219"><font face="宋体">成本</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #e5e0ec; width: 54pt; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl67" height="18" width="72" align="right"><font face="宋体">5</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 233pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="310" align="right"><font face="宋体">5</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 144pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="192" align="right"><font face="宋体">1</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="219" align="right"><font face="宋体">3</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #e5e0ec; width: 54pt; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl67" height="18" width="72" align="right"><font face="宋体">4</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 233pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="310" align="right"><font face="宋体">4</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 144pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="192" align="right"><font face="宋体">2</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="219" align="right"><font face="宋体">3</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #e5e0ec; width: 54pt; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl67" height="18" width="72" align="right"><font face="宋体">3</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 233pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="310" align="right"><font face="宋体">3</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 144pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="192" align="right"><font face="宋体">3</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="219" align="right"><font face="宋体">3</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #e5e0ec; width: 54pt; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl67" height="18" width="72" align="right"><font face="宋体">2</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 233pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="310" align="right"><font face="宋体">2</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 144pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="192" align="right"><font face="宋体">4</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="219" align="right"><font face="宋体">3</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #e5e0ec; width: 54pt; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl67" height="18" width="72" align="right"><font face="宋体">1</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 233pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="310" align="right"><font face="宋体">1</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 144pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="192" align="right"><font face="宋体">5</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl64" width="219" align="right"><font face="宋体">3</font></td></tr>
<tr style="height: 13.5pt" height="18">
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: #d7e4bc; width: 54pt; height: 13.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66" height="18" width="72"><font face="宋体">平均</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #d7e4bc; width: 233pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66" width="310" align="right"><font face="宋体">3</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #d7e4bc; width: 144pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66" width="192" align="right"><font face="宋体">3</font></td>
<td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: #d7e4bc; width: 164pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl66" width="219" align="right"><font face="宋体">3</font></td></tr></table></p>
<p>越是核心层（1层）, 其需要修改的代码越少，但是对代码执行的时间和空间开销越小, 稳定性要求越高. 越外围的代码（5层）, 针对需求而开发和改动的代码量越大. 选取上表中的1层、5层、平均画图来表示是这样的：</p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/QTC3.JPG" width="640" height="278" /></p>
<p>&nbsp;</p>
<p>因此，精益求精、重构只适用于靠近核心的代码层；而对于外围代码层, 由于赶工而导致代码质量低、放松测试条件，则是完全合理的。&nbsp;</p>
<p>&nbsp;</p>
<p><strong>三、结论<br /></strong>所以，在做软件工程的质量控制时，应该把握软件的关键层面，抓住质量控制的瓶颈。横向而言，就是开发框架、引擎、核心功能之类的层级；纵向而言，就是用户使用频率最高的模块、和竞争对手做差异化竞争的功能等。对于外围代码和次要模块代码，前者一般不容易出错得太离谱（被开发框架限制住），后者使用频度低，则可以适当牺牲质量以求开发速度。</p>
<p>因此，处于外围代码开发的兄弟们就不要成天抱怨、不要提出各种重构要求了。我也曾经在&#8220;坏味道&#8221;的代码，确切地说是&#8220;粪坑&#8221;中扑腾，深知其中感受。但就像魔兽世界里组队打某些副本BOSS，有的人职责是拉住BOSS的仇恨（拉住客户），有的人职责是砍BOSS（解决核心模块），有的人则需要群杀不断刷出来的小怪（快速开发外围逻辑）。如果不是这样的配合，那就会团灭；如果不是这样的配合，下个月的工资可能就发不出来，不是吗？</p><img src="http://www.cnblogs.com/walzer/aggbug/1622772.html?type=1" width="1" height="1" alt=""/><p>评论: 12　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622772.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622772.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>开发方法的“轻”和“重”定义</title><link>http://www.cnblogs.com/walzer/archive/2009/12/12/1622544.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Sat, 12 Dec 2009 07:55:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/12/1622544.html</guid><description><![CDATA[<p>阅读: 98 评论: 0 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-12 15:55 <a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622544.html" target="_blank">原文链接</a></p><p>轻量级开发方法和重量级开发方法的本质区别，在于开发过程中的中间产物（如文档、图纸、工作日报/周报）数量多少。中间产物数量越多，则开发方法越重，开发者需要花更多时间去做那些无法体现在最终交付结果之内的工作。比如花了30%的时间在写详细设计文档，5%的时间在写工作日报和周报等等。用图表示如下：<br /><br /><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/HeavyMethod.JPG" width="910" height="61" /></p>
<p>可以看到，过程中有很多&#8220;中间产物&#8221;，如需求文档、概要设计文档、详细设计文档、测试文档、测试结果报告、工作日报/周报/月报等。按照网上流行的说法，重量级方法呈现的是一种&#8220;防御型&#8221;的姿态。在应用&#8220;重量级方法&#8221;的软件组织中，由于项目管理者不参与或者很少参与程序设计，无法从细节上把握项目进度，因而会对项目产生&#8220;恐惧感&#8221;，不得不要求程序员不断撰写很多&#8220;软件开发文档&#8221;及&#8220;工作日报/周报/月报&#8221;。</p>
<p>&nbsp;</p>
<p>而轻量级方法则呈现&#8220;进攻型&#8221;的姿态，如下图：<br /><br /><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/walzer/LightMethod.JPG" width="751" height="61" /></p>
<p>轻量级方法强调所有工作都与交付结果强相关，尽量减少无关的工作，使得开发速度更快。当然XP方法里有个重要前提，就是团队中的程序员必须都是高水平的、可信任的。这种方法比较激进，每个过程拉得更长，而审核时若无法通过，则需要返工的工作量比重型方法中的多，结果可能导致&#8220;欲速则不达&#8221;的结果。</p>
<p>&nbsp;</p>
<p>具体哪个方法好，这个还在争论。觉得凡事无绝对，适合自己团队的方法，就是好方法</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/walzer/aggbug/1622544.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622544.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622544.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>学习型组织和自我优化型组织</title><link>http://www.cnblogs.com/walzer/archive/2009/12/12/1622501.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Sat, 12 Dec 2009 06:45:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/12/1622501.html</guid><description><![CDATA[<p>阅读: 431 评论: 1 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-12 14:45 <a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622501.html" target="_blank">原文链接</a></p><p><strong>一、三个组织的故事<br /></strong>先讲故事。以我呆过的三个研发组织为例：</p>
<p><strong>组织A：</strong>从公司老板到基层程序员，都保持了很高的继续学习受教育的意识，大老板带头读了MBA，中层和基层成员根据个人的爱好和职业规划，有的读了MBA，有的读了项目管理在职硕，有的读了软件工程或集成电路在职硕。另外大家在业余时间也会读一些书、看一些开源项目的代码，然后在吃饭时谈论这些东西，书籍会相互推荐相互赠送。组织内鼓励知识共享，鼓励成员把工作经验写成技术总结发在内部BLOG上，以相互交流经验。一方面写技术总结是作为业绩的硬性考核指标，对程序员要求每个月一篇，对组长要求每月两篇并要求全组提交的要有一定数量和质量，年终和中秋聚餐时会表彰在知识共享上贡献突出的成员。这是一种难能可贵的学习型组织，但是在这个组织由于公司规模太大，因此规范流程等相对稳定，在管理层面没有比较强的&#8220;自我优化&#8221;能力，只在编程等业务小范围内会&#8220;自我优化&#8221;。因此我认为<u>这是一个学习型组织，但不是自我优化型组织.</u></p>
<p><strong>组织B：</strong>一个疯狂的创业型组织，大概一半的人以工作为事业而疯狂，另一半人则被环境和氛围所迫，每人每周工作60小时以上，骨干成员每周工作甚至能达到70小时。有的核心成员非常典型：一个项目经理因为工作太忙而申请MBA休学并且很可能干脆退学、一个主程因为长时间工作过度劳累导致脑溢血回家躺了一年，一个主策划因为连续工作时间太长太亢奋太疯狂而直接在加班时昏倒被同事送医院。在这种组织里，虽然公司图书馆里提供了很多书籍和期刊，但实际上已经没有给成员留出业余自我学习提高的时间了。不过这组织另外有一个很强的能力，那就是&#8220;自我优化&#8221;。大家都能主动发现规则、流程、设计和开发、甚至企业经营中的存在问题，在内部WIK上提出来讨论，讨论也很热烈甚至演变为争论，最后再收拢成为更新后的制度流程。整个组织始终是朝着更健康更高效的方向发展。因此我认为<u>这是一个自我优化型组织，但不是一个学习型组织。</u></p>
<p><strong>组织C：</strong>一个现金流雄厚稳定的大公司下面一个试图开拓新业务的组织。很遗憾这个组织继承了稳定成熟期大公司的特点，稳定有余而进取不足。他们的绝大多数成员不会在业余时间自己去寻找进修机会，也很少阅读书籍后拿出来谈论，在开发流程和代码设计中存在各种显而易见的陋习和弊病，却没有人提出来改进。所以这<u>既不是一个学习型组织，也不是一个自我优化型组织</u>。另外，我注意到了很有趣的一点, 该公司的第一个程序员，也就是创业元老, 在创业成功后既不想继续提高技术做个CTO, 也不想往管理方向发展做个经理管个部门，而是选择了工会主席这样的闲职, 拿分红日子过得逍遥。这是否导致了后面入职的技术人员就有样学样、进取不足，那就不得而知了。<br /></p>
<p><strong>二、学习型组织和自我优化型组织的关系</strong></p>
<p>其实学习型和自我优化型，两者之间表面上关联性并不大。但我仍然觉得可以扯到一起。我认为，自我优化是基础，一个组织不可能在各方面是完美的，需要各级成员在自己工作岗位上，对所负责的事务发现问题、提出优化方案，整个组织才能在管理、设计、编码各层面上新陈代谢日益健康。而学习型是对前者的增强，如果自我优化只是基于自己直觉和经验的优化，那么步伐是比较小的；而如果学习后能基于管理学、经济学等理论，以及敏捷、CMM、GOF设计模式等正确的方法论进行优化，那么进步的步伐就会更大。</p>
<p>打个比喻，把一个组织比成游戏里的角色的攻击力，那么建立自我优化型组织是增加攻击力的上限点数，优化一次从攻击力100点提升到110点，再优化一次就从110点提高到120点；而建立学习型组织则是给予攻击力百分比加成，比如一次优化能提高10点攻击力，有了百分10%的加成后，每次优化就能提高11点攻击力。</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/walzer/aggbug/1622501.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622501.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622501.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>技术研究与工程开发</title><link>http://www.cnblogs.com/walzer/archive/2009/12/12/1622415.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Sat, 12 Dec 2009 03:41:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/12/1622415.html</guid><description><![CDATA[<p>阅读: 1487 评论: 14 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-12 11:41 <a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622415.html" target="_blank">原文链接</a></p><p><strong>一、R&amp;D概念的分拆</strong><br />搞研发的掏出名片来一般会印上这么个部门：R&amp;D。所谓R&amp;D就是Research &amp; Develop，研究与开发，所以简称研发。我曾经碰到个高人，强调把这两词拆开来单独理解。&#8220;研究&#8221;就是把一个团队知识之外的知识点弄懂，引入项目中使用；&#8220;开发&#8221;就是把已经明白的东西做出来。</p>
<p>&nbsp;</p>
<p><strong>二、为什么多数程序员更喜欢搞研究</strong><br />一般来说，研究人员比较嚣张，不喜欢按规矩行事，理想状态是中国文化里那种特立独行的大侠，一人单挑各种技术难题、熬夜数周最后搞定，写个DEMO CODE解决了关键问题，最多再搞篇技术总结文档，就可以长嘘一口气，等待众同事膜拜；而开发人员相对比较孙子，胆敢做点不合规矩的事，那就是藐视流程藐视公司制度，要镇压的。所以在研发领域，绝大多数人比较向往研究岗位，待遇好地位高、可以单干、能够证明自己的智商，最重要的是能够不断做新的东西不用重复劳动；而开发人员是苦力，整天做些&#8220;体力活&#8221;，比较没有技术含量，也难有比较大的长进，工作本质和手机生产线上按图纸插元器件的小妹差不了多少。</p>
<p>我也遇到过某些比较特别的、喜欢做重复性劳动的、喜欢在已知领做工程开发的程序员，实际上这些程序员没有很好的职业素养，而且基本都缺乏上进心，朽木不可雕也。</p>
<p>&nbsp;</p>
<p><strong>三、重研究轻开发的中小型团队多数下场悲哀</strong></p>
<p>但对于中小型团队，尤其是创业阶段的团队，如果只做开发而不做研究，运气好还能苟延残喘一阵子，养活团队估计还没问题；而侧重研究而没有开发，绝对是死路一条，结果就是工程师做完研究，砍完大BOSS获得经验值和等级的快速提升（我称为&#8220;镀金&#8221;）完毕后，已经把投资人的钱烧光了，留个废品给投资人，然后各自高飞。</p>
<p>比如一个创业阶段的小团队想做个很炫的UI框架能和iPhone媲美；或者想自己做个3D游戏引擎；或者想做一个矢量地图引擎。不仅多数程序员喜欢砍这种高经验值的大BOSS，投资人也很难挡住这种诱惑力。但如果不是在该领域已有很深厚的积累，而是在只掌握了一二成核心技术的情况下去做这种研究，试图把这种高风险项目做出来以获得高回报的话，那基本上等于找死。高度研究型项目对于中小型团队来说，就是投资人的高风险，程序员的高回报。</p>
<p>我就有过这方面的教训。本人天赋不咋地，04年底从零开始奉命研究播放器核心，死磕TCPMP代码，到07年自己写出一个播放器核心的时候，我这组人已经是换第三拨了，前两拨十几个兄弟都耐不住寂寞离职了。另一组人则有企业博士后带队，对MP3、REAL、H264的解码效率进行优化，研究也持续了两年多，换了两拨人马。最后这个播放器和优化了效率的解码器也没在手机电视市场爆发的时候为公司带来多少价值。还好是个大公司养着这两个&#8220;研究团队&#8221;，要是换小公司的话，两三年投入不出产品，早就死了。</p>
<p>&nbsp;</p>
<p><strong>四、研究和开发的资源布局</strong><br />既然是R&amp;D并提，说明两者基本上密不可分。做软件不可避免地、或多或少都会有研究的成分，而不纯粹是工程开发。所以出现下面两种资源布局：<br />（1）有的公司是把研究和开发任务混在一起，平均分给每个工程师；</p>
<p>（2）有的公司则把两者割裂开，有专门的精英团队做研究，有专门的工程团队做开发。</p>
<p>有些软件团队会有这样的追求：少数几个大牛搞定一个开发框架，然后用月薪两三千块钱大量招&#8220;代码工人&#8221;进来，快速开发出客户需求。这是一种&#8220;软件流水线化生产&#8221;的思路。当我们把这种软件公司的模式比作&#8220;中国制造&#8221;的时候，就发现这很有趣。这种模式在国内做企业开发（ERP、CRM、OA等）和网络游戏开发的公司中被广泛采用，实际上就是上面所说的第二种方式，建立两个团队分别做研究和开发。</p>
<p>补充: 网友评论中提到, 现在第二种方法是业界趋势，甚至工程团队中根本不用自己的人，向人力资源外包公司"租借"工程师来完成. 这使我想起华为、微软上海也是这么干的，而福州某家效益很好的软件公司能够用200名左右的项目经理和系统分析师, 管理2000多人的外包派遣工程师来做项目.&nbsp;</p>
<p>&nbsp;</p>
<p>这两种方式都有利有弊，前者会把核心人员浪费在体力活上，但有利于团队的&#8220;和谐稳定&#8221;以及从外围人员培养出新的核心成员；后者的组织效率会更高一些，但是由于阶级化明显，做工程开发的外围团队人员流失率会比较高，也不利于培养核心成员出来。</p>
<p>&nbsp;</p>
<p>所以我认为，对于一个想获得成功的研发团队而言<br />（1）要想清楚研就和开发的投入比例。用虽然笨拙的已知方法替代对未知的、高效的、很酷的未知方法，在很多时候是必要的。项目风险必须处于可控范围内。我见过个数据，软件项目中的未知核心技术如果能占所需核心技术的20%以下，那么这个项目的成功率会大大提高。当然，这个也和行业领域的特点也有关系。<br />（2）要想清楚如何分配研究和开发任务。如上面所说，是分拆成两个团队单独做，还是把任务混合后平均地分配所有工程师。<br /></p><img src="http://www.cnblogs.com/walzer/aggbug/1622415.html?type=1" width="1" height="1" alt=""/><p>评论: 14　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622415.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622415.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>敏捷的陷阱</title><link>http://www.cnblogs.com/walzer/archive/2009/12/12/1622372.html</link><dc:creator>Walzer</dc:creator><author>Walzer</author><pubDate>Sat, 12 Dec 2009 02:55:00 GMT</pubDate><guid>http://www.cnblogs.com/walzer/archive/2009/12/12/1622372.html</guid><description><![CDATA[<p>阅读: 223 评论: 3 作者: <a href="http://www.cnblogs.com/walzer/" target="_blank">Walzer</a> 发表于 2009-12-12 10:55 <a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622372.html" target="_blank">原文链接</a></p><p>敏捷开发对于中小型项目还是非常适用的，不过我在实践过程中遇到两个问题:</p>
<p>&nbsp;</p>
<p><strong>1、重构 = 返工？</strong></p>
<p>（1）需求和设计角度。</p>
<p>我对敏捷的理解，是允许需求人员在开发过程中不断地更新需求，而开发人员靠版本迭代来实现。迭代过程中，对于无法满足新需求的模块、以及前面迭代周期里性能不良的模块进行重构。从另个角度来讲，重构 = 返工，浪费了时间和人力。</p>
<p>如果有可能的话：</p>
<p>a. 还是要尽量让需求人员在项目初期就把需求定清楚，尽量减少在开发进行中进行重大调整的次数。不能因为敏捷了就放弃对需求制定的严格把关，想着反正迭代周期可以解决一切。</p>
<p>b. 设计中留下一定的可扩展性。这是个度，不同产品团队得自己把握。完全不留扩展性，在需求变更的时候往往不得不重构；而留下过度的扩展性，可能在前期浪费了大量时间而后面不一定用得着。</p>
<p>（2）项目后期、维护阶段的重构</p>
<p>我发现一个很有趣的事情，程序员一般不喜欢给维护别人的代码，给别人&#8220;擦屁股&#8221;。因此项目后期加入团队的程序员、和维护代码的程序员一般都会骂前任留下的代码如何垃圾，&#8220;需要重构&#8221;。实际上这是一个冠冕堂皇的陷阱。</p>
<p>一方面，重构后会出多少BUG还是未知数, 而且重新开发和测试并不能使客户掏出更多的钱为这些工作买单；</p>
<p>另一方面，重构后只是重构者自己后期做维护和开发轻松了，因为他在自己的代码基础上修改。对团队其他人来说，效率提升并不明显，因为他们需要重新熟悉新的接口甚至框架。</p>
<p>而最最严重的问题是，敢提出重构的程序员会认为自己的设计是最好的，前人留下的那是垃圾。因此即使他对代码重构过自己很满意了，一旦代码转手，这岗位上的下一任仍然会大骂垃圾并试图把这些代码再重构一遍, 然后只维护自己写的代码. 这会是项目进度控制和风险控制的无间地狱。<br />&nbsp;</p>
<p><strong>2、测试驱动开发</strong></p>
<p>这里面有个很危险的陷阱。因为多数团队不可能把需求定得很细，需要在开发中让程序员和需求工程师边做边讨论细节，最后定下来，这种模式用图来表示是</p>
<p>需求 -&gt; 测试</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 开发</p>
<p>传统的V字型结构，但这里的箭号方向表示了<u>产品需求理解的传递路线和方向</u>。而如果测试驱动开发的话，结果是这样的：</p>
<p>需求 -&gt; 测试 -&gt; 开发</p>
<p>也就是说，<u>开发者并不直接去和需求打交道，其工作目的不是实现需求，而是让测试能跑通。这样就要求测试团队，尤其是测试经理要对需求有很强的理解力，并且在需求制定者和开发团队之间承担沟通的责任。</u>而国内的普遍情况是，重开发轻测试。体现在测试人员的学历要求和薪水普遍比开发人员低，有些草班子甚至在项目计划中不给集成测试和DEBUG留时间。所以在这种现状下，试图用测试驱动开发的方法，隔离开了开发团队对需求细节的直接把握，让能力较弱的测试团队来做这事，基本上就是&#8212;&#8212;找死。</p><img src="http://www.cnblogs.com/walzer/aggbug/1622372.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622372.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walzer/archive/2009/12/12/1622372.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59189/" target="_blank">邵晓锋调任阿里集团秘书长 协调子公司资源</a><span style="color:gray">(2010-03-19 22:08)</span><br/>· <a href="http://news.cnblogs.com/n/59187/" target="_blank">Notifo推iPhone应用：弥补邮件推送缺陷</a><span style="color:gray">(2010-03-19 21:04)</span><br/>· <a href="http://news.cnblogs.com/n/59186/" target="_blank">分析：微软IE9现身 网络视频标准争议依旧未解</a><span style="color:gray">(2010-03-19 20:57)</span><br/>· <a href="http://news.cnblogs.com/n/59185/" target="_blank">连线朱骏：陈晓薇离开九城与魔兽无关</a><span style="color:gray">(2010-03-19 20:52)</span><br/>· <a href="http://news.cnblogs.com/n/59184/" target="_blank">九城总裁陈晓薇5月期满离任 朱骏将代理总裁</a><span style="color:gray">(2010-03-19 20:48)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>