<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>梁剑的Blog &#187; 工作日志</title>
	<atom:link href="http://icomes.net/category/%e5%b7%a5%e4%bd%9c%e6%97%a5%e5%bf%97/feed/" rel="self" type="application/rss+xml" />
	<link>http://icomes.net</link>
	<description>做有趣的事，做有用的人</description>
	<lastBuildDate>Sat, 05 Nov 2011 18:23:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>关于运维的一些想法</title>
		<link>http://icomes.net/2010/08/21/%e5%85%b3%e4%ba%8e%e8%bf%90%e7%bb%b4%e7%9a%84%e4%b8%80%e4%ba%9b%e6%83%b3%e6%b3%95/</link>
		<comments>http://icomes.net/2010/08/21/%e5%85%b3%e4%ba%8e%e8%bf%90%e7%bb%b4%e7%9a%84%e4%b8%80%e4%ba%9b%e6%83%b3%e6%b3%95/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 16:13:04 +0000</pubDate>
		<dc:creator>梁剑</dc:creator>
				<category><![CDATA[工作日志]]></category>
		<category><![CDATA[运维]]></category>

		<guid isPermaLink="false">http://icomes.net/?p=496</guid>
		<description><![CDATA[今天，由于一个比较低级的失误，影响到了系统的可用性。 （话说回来，又有哪次事故不是由于低级失误造成的呢？） 简单来说，起因是一个server有改动，需要部署到N台机器上。 改动后的server会读取一个之前已经存在，但是没有用到的配置文件。 配置文件里面有一项，应该是本机的IP。 由于某种原因（就是低级失误的根源）， 部分机器上的IP配置是相同的，都设成了其中的一台。 导致的结果就是那台不幸的机器由于负载过重，请求处理不过来。 而且由于这是一个比较关键的server，于是乎，系统的可用性被波及了。 但凡涉及到可用性（或者稳定性、用户体验之类用户可以感知的问题），总是比较容易引起关注的。 虽然不是事故的直接责任人，不过整个过程中暴露出来的问题，还是值得思考和总结一下。 追究责任或许有警示的作用，但正如代码都会有bug，人也总有犯错的时候。 如何在流程和制度上避免同样问题的再次出现，更值得去分析和研究吧。 有两个为什么需要解答： 1 为什么定位问题消耗了过长的时间？ 2 为什么会部署了错误的配置文件？ 对于第一个问题，有工具的原因、有个人的原因。 主要是因为出现状况的早期没有深入分析， 错过了尽早查出根源的机会，导致耗时较多。 对于这类问题，感觉唯一解是强化个人的责任心 。 而第二个问题，则是想讨论的重点。 虽然强调流程和制度，可能会被人诟病过于僵化。 但对于一个希望长期运营的产品来说，流程就像一个人的起居饮食一样， 虽然每天的重复会非常沉闷，但只要一天没有，就可能引起各种各样的缭乱。 其实流程对程序员来说也并不是完全的无聊和乏味，它可以搞定所有重复性的体力劳动， 省出来的时间，足够写不少有意思的程序了。而这还没考虑到由此避免的潜在的差错时间。 据个人感觉，流程上的问题有两个： 1 配置文件设置本机IP不是由部署脚本完成的，就算有部署脚本，也是人工写好再执行，并不是由部署系统根据占位符生成 2 上线后，开发人员会监控程序的运行，但通常不会检查每台机器上的配置文件是否正确，尤其是在机器很多的情况下 所以我的建议无非也是两个： 1 对于那些和机器有绑定关系的配置文件，由开发人员在运维平台上录入配置模板，部署时由脚本自动生成合适的配置文件。 如果再能够通过cron脚本，定期检查配置文件的合法性，则更加完美 2 开发人员在上线后，除了监控程序的运行状态，还要检查配置文件是否符合预期 其实只要第一条做到了，第二条就有蛇足之嫌。但又有谁能保证部署脚本没有bug呢？<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="Another Hello World is running on my iPhone!" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2009%2F08%2F30%2Fanother-hello-world-is-running-on-my-iphone%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/06/29/15015234.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Another Hello World is running on my iPhone!</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Second Screenshot" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2009%2F09%2F03%2Fsecond-screensho%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/06/29/15015227.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Second Screenshot</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="用visio画的UML图例" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2009%2F10%2F18%2F%25E7%2594%25A8visio%25E7%2594%25BB%25E7%259A%2584uml%25E5%259B%25BE%25E4%25BE%258B%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/06/29/15015128.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">用visio画的UML图例</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="The Last Lecture" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2011%2F10%2F15%2Fthe-last-lecture%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/10/15/9228539.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">The Last Lecture</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></description>
			<content:encoded><![CDATA[<p>今天，由于一个比较低级的失误，影响到了系统的可用性。<br />
（话说回来，又有哪次事故不是由于低级失误造成的呢？）</p>
<p>简单来说，起因是一个server有改动，需要部署到N台机器上。<br />
改动后的server会读取一个之前已经存在，但是没有用到的配置文件。<br />
配置文件里面有一项，应该是本机的IP。<br />
由于某种原因（就是低级失误的根源）， 部分机器上的IP配置是相同的，都设成了其中的一台。<br />
导致的结果就是那台不幸的机器由于负载过重，请求处理不过来。<br />
而且由于这是一个比较关键的server，于是乎，系统的可用性被波及了。</p>
<p>但凡涉及到可用性（或者稳定性、用户体验之类用户可以感知的问题），总是比较容易引起关注的。<br />
虽然不是事故的直接责任人，不过整个过程中暴露出来的问题，还是值得思考和总结一下。<br />
追究责任或许有警示的作用，但正如代码都会有bug，人也总有犯错的时候。<br />
如何在流程和制度上避免同样问题的再次出现，更值得去分析和研究吧。</p>
<p>有两个<strong>为什么</strong>需要解答：<br />
1 为什么定位问题消耗了过长的时间？<br />
2 为什么会部署了错误的配置文件？</p>
<p>对于第一个问题，有工具的原因、有个人的原因。<br />
主要是因为出现状况的早期没有深入分析， 错过了尽早查出根源的机会，导致耗时较多。<br />
对于这类问题，感觉唯一解是强化个人的责任心 。</p>
<p>而第二个问题，则是想讨论的重点。<br />
虽然强调流程和制度，可能会被人诟病过于僵化。<br />
但对于一个希望长期运营的产品来说，流程就像一个人的起居饮食一样，<br />
虽然每天的重复会非常沉闷，但只要一天没有，就可能引起各种各样的缭乱。<br />
其实流程对程序员来说也并不是完全的无聊和乏味，它可以搞定所有重复性的体力劳动，<br />
省出来的时间，足够写不少有意思的程序了。而这还没考虑到由此避免的潜在的差错时间。</p>
<p>据个人感觉，流程上的问题有两个：<br />
1 配置文件设置本机IP不是由部署脚本完成的，就算有部署脚本，也是人工写好再执行，并不是由部署系统根据占位符生成<br />
2 上线后，开发人员会监控程序的运行，但通常不会检查每台机器上的配置文件是否正确，尤其是在机器很多的情况下</p>
<p>所以我的<strong>建议</strong>无非也是两个：<br />
1 对于那些和机器有绑定关系的配置文件，由开发人员在运维平台上录入配置模板，部署时由脚本自动生成合适的配置文件。 如果再能够通过cron脚本，定期检查配置文件的合法性，则更加完美<br />
2 开发人员在上线后，除了监控程序的运行状态，还要检查配置文件是否符合预期</p>
<p>其实只要第一条做到了，第二条就有蛇足之嫌。但又有谁能保证部署脚本没有bug呢？</p>
<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">您可能也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="Second Screenshot" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2009%2F09%2F03%2Fsecond-screensho%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/06/29/15015227.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Second Screenshot</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Another Hello World is running on my iPhone!" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2009%2F08%2F30%2Fanother-hello-world-is-running-on-my-iphone%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/06/29/15015234.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Another Hello World is running on my iPhone!</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="浏览器战争" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2009%2F01%2F13%2F%25E6%25B5%258F%25E8%25A7%2588%25E5%2599%25A8%25E6%2588%2598%25E4%25BA%2589%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/06/29/15015466.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">浏览器战争</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="利用ssh tunnel建立本地sock代理" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Ficomes.net%2F2009%2F07%2F25%2F%25E5%2588%25A9%25E7%2594%25A8ssh-tunnel%25E5%25BB%25BA%25E7%25AB%258B%25E6%259C%25AC%25E5%259C%25B0sock%25E4%25BB%25A3%25E7%2590%2586%2F&from=http%3A%2F%2Ficomes.net%2F2010%2F08%2F21%2F%25E5%2585%25B3%25E4%25BA%258E%25E8%25BF%2590%25E7%25BB%25B4%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2583%25B3%25E6%25B3%2595%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/06/29/15015597.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 60px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">利用ssh tunnel建立本地sock代理</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></content:encoded>
			<wfw:commentRss>http://icomes.net/2010/08/21/%e5%85%b3%e4%ba%8e%e8%bf%90%e7%bb%b4%e7%9a%84%e4%b8%80%e4%ba%9b%e6%83%b3%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>关于重构</title>
		<link>http://icomes.net/2009/09/18/%e5%85%b3%e4%ba%8e%e9%87%8d%e6%9e%84/</link>
		<comments>http://icomes.net/2009/09/18/%e5%85%b3%e4%ba%8e%e9%87%8d%e6%9e%84/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 14:18:18 +0000</pubDate>
		<dc:creator>梁剑</dc:creator>
				<category><![CDATA[工作日志]]></category>
		<category><![CDATA[重构]]></category>

		<guid isPermaLink="false">http://icomes.net/?p=444</guid>
		<description><![CDATA[重构是最近想得比较多的一个词。 星期一去总部培训，其中一门课叫做《边重构边生活》，提到很多关于重构的意识。 对其中一个说法印象尤为深刻：火箭发射式的重构。 火箭发射是一件相当隆重的大事， 需要经过长时间的准备，花费不计其数的人力物力后， 在一个精心选择的时间，所有相关人物齐聚一堂，等待火箭的轰然升空。 最大的问题是，火箭发射可能失败，在付出巨大的努力后，依然失败。 个中的情形与后果，与软件开发中的一次性重构非常相似。 一次性重构是软件开发中一种相当具有冒险精神的活动， 需要实施者有“不成功便成人”的坚毅决心，埋头苦干若干日子， 最后在合十祈祷中，迎来一个充满不确定因素的发布。 用Bison的话来说，是找死。 找死也有两种找法， 一种是终止老版本，不接新需求，专心闭门造车，重写一个新版本； 还有一种是同时维护两个版本，老版本做新需求，等新版本做出来之后，再把新功能合并过去。 前一种伴随着巨大的风险，而后一种则会带来太多额外的复杂性，都不是一个理性程序员的选择。 更好的方式是采用平滑重构，这才是真正意义上的重构。 只要不是病入膏肓，这是最佳选择。 由此想到一个不太恰当的比喻：将编写程序比喻为治理国家。 假如现在的执政党已经日益腐朽，人浮于事，贪污横行。 总之，是到了需要改革（重构）的时候了。 此时有两个选择：革命，或者重新大选。 先不论大选的利弊，单看革命。 另一股势力，利用民众的不满，积极宣称自己的主义可以拯救这个岌岌可危的国家； 由于拥戴者渐多，力量日益强大，终于到了可以和执政者分庭抗礼的程度。 执政者当然不会轻易交出自己手中的权力， 于是经过非常暴力或者不太暴力（没有非暴力这个选择）的斗争， 新势力终于推翻了旧势力，春风得意的上台了。 一时间，气象一新，处处欣欣向荣的美好景象。 经过若干年后，执政党开始日益腐朽，人浮于事，贪污横行。 又一个轮回开始了⋯⋯ 这种情形，历史上还少见吗？ 软件终究会腐朽的，就像政党一样。 与其暴风骤雨，我宁可润物无声。]]></description>
			<content:encoded><![CDATA[<p>重构是最近想得比较多的一个词。<br />
星期一去总部培训，其中一门课叫做《边重构边生活》，提到很多关于重构的意识。<br />
对其中一个说法印象尤为深刻：<strong>火箭发射式的重构</strong>。</p>
<p>火箭发射是一件相当隆重的大事，<br />
需要经过长时间的准备，花费不计其数的人力物力后，<br />
在一个精心选择的时间，所有相关人物齐聚一堂，等待火箭的轰然升空。</p>
<p>最大的问题是，火箭发射可能失败，在付出巨大的努力后，依然失败。</p>
<p>个中的情形与后果，与软件开发中的一次性重构非常相似。</p>
<p>一次性重构是软件开发中一种相当具有冒险精神的活动，<br />
需要实施者有“不成功便成人”的坚毅决心，埋头苦干若干日子，<br />
最后在合十祈祷中，迎来一个充满不确定因素的发布。<br />
用Bison的话来说，是找死。</p>
<p>找死也有两种找法，<br />
一种是终止老版本，不接新需求，专心闭门造车，重写一个新版本；<br />
还有一种是同时维护两个版本，老版本做新需求，等新版本做出来之后，再把新功能合并过去。<br />
前一种伴随着巨大的风险，而后一种则会带来太多额外的复杂性，都不是一个理性程序员的选择。</p>
<p>更好的方式是采用平滑重构，这才是真正意义上的重构。<br />
只要不是病入膏肓，这是最佳选择。</p>
<p>由此想到一个不太恰当的比喻：将编写程序比喻为治理国家。</p>
<p>假如现在的执政党已经日益腐朽，人浮于事，贪污横行。<br />
总之，是到了需要改革（重构）的时候了。<br />
此时有两个选择：革命，或者重新大选。<br />
先不论大选的利弊，单看革命。<br />
另一股势力，利用民众的不满，积极宣称自己的主义可以拯救这个岌岌可危的国家；<br />
由于拥戴者渐多，力量日益强大，终于到了可以和执政者分庭抗礼的程度。<br />
执政者当然不会轻易交出自己手中的权力，<br />
于是经过非常暴力或者不太暴力（没有非暴力这个选择）的斗争，<br />
新势力终于推翻了旧势力，春风得意的上台了。<br />
一时间，气象一新，处处欣欣向荣的美好景象。<br />
经过若干年后，执政党开始日益腐朽，人浮于事，贪污横行。<br />
又一个轮回开始了⋯⋯</p>
<p>这种情形，历史上还少见吗？<br />
软件终究会腐朽的，就像政党一样。<br />
<strong>与其暴风骤雨，我宁可润物无声。</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://icomes.net/2009/09/18/%e5%85%b3%e4%ba%8e%e9%87%8d%e6%9e%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

