<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkEBQHc6fSp7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028</id><updated>2011-11-27T16:04:11.915-08:00</updated><category term="loadrunner" /><category term="Decorator" /><category term="幽默" /><category term="wikipeddia" /><category term="模式" /><category term="最接近点对" /><category term="软件危机" /><category term="思想" /><category term="GFW" /><category term="快速排序" /><category term="递归" /><category term="分治" /><category term="算法" /><category term="programmer programming" /><category term="快乐" /><category term="Krishnamuti" /><category term="Google" /><category term="软件" /><title>小博客，大世界</title><subtitle type="html">有意思的计算机世界

^_^</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://smartxiaofish.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/mKILS" /><feedburner:info uri="blogspot/mkils" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0cFRn4_eip7ImA9Wx5TFUs.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-7799027372327799271</id><published>2010-07-31T01:26:00.000-07:00</published><updated>2010-07-31T01:30:17.042-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-31T01:30:17.042-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Krishnamuti" /><title>时间与烦劳</title><content type="html">我们总认为自己将来会有所改变，&lt;div&gt;我们内心所向往的和谐境界，&lt;/div&gt;&lt;div&gt;也会一点一点，一天地实现。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;事实上，时间并不会带来任何的和谐与平安，&lt;/div&gt;&lt;div&gt;我们必须停止这种渐近的想法。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;这意味着，使我们平安的明天是根本不存在的，&lt;/div&gt;&lt;div&gt;我们必须在当下这一刻找到和谐。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;《Freedom, From the know》 ——J. Krishnamuti&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-7799027372327799271?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/k4IVII7ZqwIZyUssOITdtvi_d1s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k4IVII7ZqwIZyUssOITdtvi_d1s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/k4IVII7ZqwIZyUssOITdtvi_d1s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k4IVII7ZqwIZyUssOITdtvi_d1s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/ro-azGDaJPQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/7799027372327799271/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=7799027372327799271" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7799027372327799271?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7799027372327799271?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/ro-azGDaJPQ/blog-post.html" title="时间与烦劳" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2010/07/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEMRn46eyp7ImA9Wx5TFUs.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-546000310253647137</id><published>2010-07-31T01:10:00.000-07:00</published><updated>2010-07-31T01:24:47.013-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-31T01:24:47.013-07:00</app:edited><title>Invictus</title><content type="html">&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Out of the night that covers me&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Black as the pit from pole to pole&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I think what ever gods may be&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;For my unconquerable soul&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;In the fell clutch of circumstance&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I have not winced nor cried aloud&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Under the bludgeonings of chance&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;My head is blooding, but unbowed&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Beyond the place of wrath and tears&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Looms but the horror of shade&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;And get the menace of years&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Finds, and shall find, me unafraid&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;It matters not how strait the gate&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;How charge with punishments the scroll&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I am the master of my fate&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I am the captain of my soul.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-546000310253647137?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7c-y2zG13rrU-4ygYhIs8teUHSI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7c-y2zG13rrU-4ygYhIs8teUHSI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7c-y2zG13rrU-4ygYhIs8teUHSI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7c-y2zG13rrU-4ygYhIs8teUHSI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/yhVX0wx1Tw8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/546000310253647137/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=546000310253647137" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/546000310253647137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/546000310253647137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/yhVX0wx1Tw8/invictus.html" title="Invictus" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2010/07/invictus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAGRn48eip7ImA9WxVaFU8.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-7332916132985131650</id><published>2009-04-12T01:58:00.000-07:00</published><updated>2009-04-12T02:15:27.072-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-12T02:15:27.072-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="loadrunner" /><title>LoaderRunner 8.1之无法录制访问http/html的脚本</title><content type="html">初次使用LoadRunner安装的8.1&lt;br /&gt;录制一个访问html资源的脚本，&lt;br /&gt;可以捕获时间，就是录不到脚本，&lt;br /&gt;Action中始终是：&lt;br /&gt;Action ()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;解决方法：&lt;br /&gt;Tools -&gt; Recording Options -Port Mapping&lt;br /&gt;的Capture Level：&lt;br /&gt;默认是Socket level&lt;br /&gt;选择Socket level and WinINet level data 即可&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-7332916132985131650?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WIeFyMUy2XQTc6UjzIGVvQs3v_M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WIeFyMUy2XQTc6UjzIGVvQs3v_M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WIeFyMUy2XQTc6UjzIGVvQs3v_M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WIeFyMUy2XQTc6UjzIGVvQs3v_M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/TDqj4S-omIs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/7332916132985131650/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=7332916132985131650" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7332916132985131650?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7332916132985131650?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/TDqj4S-omIs/loaderrunner-81httphtml.html" title="LoaderRunner 8.1之无法录制访问http/html的脚本" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2009/04/loaderrunner-81httphtml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ECRX84cSp7ImA9WxVTF0U.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-3961890421229054679</id><published>2008-12-31T21:58:00.000-08:00</published><updated>2008-12-31T22:01:04.139-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-31T22:01:04.139-08:00</app:edited><title>我的2008</title><content type="html">上半年：专业学习，&lt;br /&gt;参与了导师的一个科研项目，有些结果，感觉很烂，倒也学到不少东西。&lt;br /&gt;暑假：hp培训，华迪实习，&lt;br /&gt;下半年：税务局项目，很累，常常加班到夜里3、4点，通宵&lt;br /&gt;也算一段磨练，还有点收入。&lt;br /&gt;平均每周上2节课，要点名，考前花两小时看下书&lt;br /&gt;签了工作，一个变态公司，挑战。&lt;br /&gt;&lt;br /&gt;偶尔玩下游戏，放松&lt;br /&gt;&lt;br /&gt;多事的2008，也对这个现实的世界有了另一番认识。&lt;br /&gt;认识了一些朋友，缘分。&lt;br /&gt;&lt;br /&gt;这一年倒也充实&lt;br /&gt;&lt;br /&gt;想找个没电脑、汽车、噪声的地方睡觉，看书……&lt;br /&gt;回家&lt;br /&gt;那里有明媚的阳光，新鲜的空气，&lt;br /&gt;微风，鸟叫，河流，原野，宁静……&lt;br /&gt;&lt;br /&gt;很多年没享受家乡的春天了，&lt;br /&gt;想必以后也没什么机会了。&lt;br /&gt;怀念&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-3961890421229054679?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w1Xoa1x_ZraQcPh0NPptqaQ0Kvg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w1Xoa1x_ZraQcPh0NPptqaQ0Kvg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w1Xoa1x_ZraQcPh0NPptqaQ0Kvg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w1Xoa1x_ZraQcPh0NPptqaQ0Kvg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/8Q7vyOeQvXE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/3961890421229054679/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=3961890421229054679" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/3961890421229054679?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/3961890421229054679?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/8Q7vyOeQvXE/2008.html" title="我的2008" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/12/2008.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBQHY6fCp7ImA9WxRUGUo.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-7447740432368659789</id><published>2008-11-29T07:04:00.000-08:00</published><updated>2008-11-29T07:40:51.814-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-29T07:40:51.814-08:00</app:edited><title>冰川下的秘密</title><content type="html">&lt;div class="Section0" style=""&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span class="Apple-style-span" style=";font-family:宋体;font-size:130%;"  &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 153); font-weight: bold;font-family:微软雅黑;font-size:130%;"  &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 153);font-family:黑体;font-size:130%;"  &gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);font-family:Simsun;" &gt;&lt;div   style="border-width: 0px; margin: 0px; padding: 3px; width: auto; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; text-align: left;font-family:Georgia,serif;font-size:100%;"&gt;&lt;div class="Section0"&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 153);font-family:黑体;" &gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);font-family:Simsun;" &gt;&lt;div   style="border-width: 0px; margin: 0px; padding: 3px; width: auto; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; text-align: left;font-family:Georgia,serif;font-size:100%;"&gt;&lt;div class="Section0"&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: rgb(51, 51, 153); font-weight: normal;font-family:黑体;" &gt;    你知道冰川的90%出自水下这样一个事实吗？使得，大多数软件也是这样——用户接口设计只占到大约10%的工作量，而90%的编程工作都不是浮现在表面可以看得见的。再说，要是将修复故障所花的时间按也计算在内的话，那么用户界面方面的工作量就只占到整个工作量的5%了。更进一步地说，加入只是把眼睛放在用户界面的可视部分上面，那么所花的时间连1%就不到。&lt;/span&gt;&lt;span style="font-weight: normal;font-family:黑体;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal;font-family:黑体;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family:黑体;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(153, 102, 51);"&gt;推论1.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(153, 51, 102); font-weight: normal;font-family:黑体;" &gt; 如果你把一个程序的90%的用户界面设计的很差劲拿给某位非程序人员看，那么他会认为整个程序的90%都是糟糕的。&lt;/span&gt;&lt;span style="color: rgb(153, 51, 102); font-weight: normal;font-family:黑体;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(153, 102, 51);"&gt;推论2.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(153, 51, 102); font-weight: normal;font-family:黑体;" &gt; 要是你让非程序人员看一个精美的没法挑剔的用户界面，那么他们就会认为该程序基本上是搞定了。&lt;/span&gt;&lt;span style="color: rgb(153, 51, 102); font-weight: normal;font-family:黑体;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family:黑体;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(153, 102, 51);"&gt;推论3.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(153, 51, 102); font-weight: normal;font-family:黑体;" &gt; 当你在向人推介自己的作品时，唯一要紧的事情就是让人对屏幕感觉良好，百分之百地要让它做得好看。&lt;/span&gt;&lt;span style="font-weight: normal;font-family:黑体;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-weight: normal;font-family:黑体;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: rgb(0, 128, 128); font-weight: normal;font-family:黑体;" &gt;确保要事实本身而不是人们的任何看法来评估项目是否在以正常的速度向前推进。&lt;/span&gt;&lt;span style="font-weight: normal;font-family:黑体;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: rgb(204, 153, 255); font-weight: normal;font-family:黑体;" &gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;——Joel on Software&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span class="Apple-style-span"  style="font-family:黑体;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 102, 0);"&gt;ps:《Joel on software》&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;font-family:微软雅黑;" &gt;&lt;span style="font-weight: normal; font-style: normal;font-family:Arial;" &gt;&lt;span style="font-family:宋体;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 102, 0);"&gt;中文版翻译的实在是烂&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 102, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: rgb(204, 153, 255); font-weight: normal;font-family:'黑体';font-size:130%;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-7447740432368659789?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ibntDD0qfAfW3hkFBlSgGaizXiE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ibntDD0qfAfW3hkFBlSgGaizXiE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ibntDD0qfAfW3hkFBlSgGaizXiE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ibntDD0qfAfW3hkFBlSgGaizXiE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/UbcPgAojX1E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/7447740432368659789/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=7447740432368659789" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7447740432368659789?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7447740432368659789?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/UbcPgAojX1E/blog-post.html" title="冰川下的秘密" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/11/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IGRn49fSp7ImA9WxRQEEg.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-222040627244074560</id><published>2008-10-01T10:00:00.000-07:00</published><updated>2008-10-03T10:38:47.065-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-03T10:38:47.065-07:00</app:edited><title>技术法则</title><content type="html">&lt;span style="font-family:verdana;"&gt;&lt;span style="color:#663366;"&gt;&lt;span style="font-size:130%;"&gt;当所有的努力都失败后，就看看手册吧。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;任何非常先进的技术简直就是魔术。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;如果花时间任何事情都会成功，如果花足够长的时间就会超越它。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;“更换一个电灯泡需要多少软件工程师？”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;“不需要。在手册中已经说明。”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;“不需要。这是硬件问题。”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;“一个。但是他到2010年才能完成。”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;“两个。而且其中一个必定在项目过程中离开。”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;“四个。一个负责设计更换，一个负责执行，一个负责编写文档，最后一个负责今后的维护。”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;一个不能正常运行的复制系统总是从一个运作良好的简单系统演化而来的。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;专家就是对越来越窄的领域知道得越来越多，最终对该领域完全了然于胸的人。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;逻辑往往是一种自信地导致错误结论的系统方法。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;任何简单的思想都将用最复杂的方式表述。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;在周五下午4：30以后，任何bug都得不到及时修复。但在周一早上9：15正确的解决方案就不言自明了。——墨菲第五推论&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;除了终端用户以外谁也不能检测到软件的bug。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;如果建筑工人想程序员编写程序那样建造大楼，那么来的第一个啄木鸟也许就会毁灭文明。——墨菲技术法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;只需要看就可以观察到很多。——贝拉的第一法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;当事情进展顺利时，没有人注意到！——齐默曼的抱怨法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;没有障碍的路可能哪里也到不了。——狄弗克&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;没有任何事物简单到不会被误解。——傅雷曼法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;每个解决方案都会带来新问题。——墨菲第五推论&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;每个人都有一个还没有实施的计划。——豪的法则&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;墨菲是一个乐天派。——贝克的假设条件&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-222040627244074560?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_2tzp9ZSKXDnyMXSO_S4EByp48Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_2tzp9ZSKXDnyMXSO_S4EByp48Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_2tzp9ZSKXDnyMXSO_S4EByp48Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_2tzp9ZSKXDnyMXSO_S4EByp48Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/QUeLHLcWOUc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/222040627244074560/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=222040627244074560" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/222040627244074560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/222040627244074560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/QUeLHLcWOUc/blog-post.html" title="技术法则" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/10/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ADQHsycCp7ImA9WxdaE08.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-5226798669964331789</id><published>2008-08-07T08:53:00.000-07:00</published><updated>2008-08-21T05:29:31.598-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-21T05:29:31.598-07:00</app:edited><title>PC历史上的20位英雄</title><content type="html">&lt;div id="up-3" style="TEXT-ALIGN: center"&gt;&lt;b id="up-30"&gt;&lt;span id="up-31"  style="font-size:180%;"&gt;PC历史上的20位英雄&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div id="up-32" style="TEXT-ALIGN: center"&gt;webzen发布于 2008-08-07 20:29:37&lt;/div&gt;&lt;div id="hd5o0" style="TEXT-ALIGN: center"&gt;&lt;a id="hd5o2" href="http://www.cnbeta.com/articles/61925.htm"&gt;http://www.cnbeta.com/articles/61925.htm&lt;/a&gt;&lt;/div&gt;&lt;div id="hd5o3" style="TEXT-ALIGN: center"&gt;&lt;/div&gt;&lt;div id="up-33"&gt;回首PC的20年，它的历史就是一部英雄的历史，一个个闪亮的名字，就像一颗颗璀璨的星星，为人羡慕、令人敬仰；他们对PC业的兴起，对计算机技术的繁荣，对人类的贡献是我们不应忘记的。当本文重现历史的一幕幕时，我们会看到什么?无疑，其中有光辉与荣耀，有财富与成就，当然，也有遗憾与悲怆……&lt;br id="up-34"&gt;&lt;br id="up-35"&gt;&lt;/div&gt;&lt;p id="up-36"&gt;&lt;p id="up-37"&gt;&lt;b id="up-38"&gt;一、电脑始祖&lt;/b&gt;：&lt;b id="up-39"&gt;冯·诺依曼&lt;/b&gt;&lt;/p&gt;&lt;p id="up-310"&gt;&lt;img class="fit-image" id="up-311" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547200.jpg" border="0" /&gt;　&lt;/p&gt;&lt;p id="up-312"&gt;冯·诺依曼(John Von Neuman)凭他的天才和敏锐，在电脑初创期，高屋建瓴地提出了现代计算机的理论基础，从而规范和决定了电脑的发展方向。时至今日，我们所有的电脑又都叫“冯·诺依曼机器”，就是对这位数学天才最好的评价。&lt;/p&gt;&lt;p id="up-313"&gt;对于冯·诺依曼来说，人类第一台电脑造了一半时才参与开发，多少有些遗憾。但是，他刚好在那大机器程序存储问题无法解决的关键时刻出现，这使得冯·诺依曼的天才得到淋漓尽致的发挥。他明确指出：一定要彻底实现程序由外存储向内存储的转化，原有的设计必须作修改，经费不够再追加。在冯·诺依曼的影响下，整个研制工作取得了突破性的进展。冯·诺依曼提出了新的改进方案：一是用二进制代替十进制，进一步提高电子元件的运算速度；二是存储程序(Stored Program)，即把程序放在计算机内部的存储器中，换言之，把能进行数据处理的程序放在数据处理系统内部，程序和该程序处理的数据用同样的方式储存，即把程序本身当作数据来对待。冯·诺依曼的改进方案被称为“爱达法克”(EDVAC)，即离散变量自动电子计算机(Electronic Diserete Variable Computer)的简称。&lt;/p&gt;&lt;p id="up-314"&gt;1945年6月，他写了一篇题为《关于离散变量自动电子计算机的草案》的论文，第一次提出了在数字计算机内部的存储器中存放程序的概念(Stored Program Concept)，这是所有现代电子计算机的范式，被称为“冯·诺依曼结构”。按这一结构建造的电脑称为存储程序计算机(Stored Program Computer)，又称为通用计算机。时至今日，所有的电脑都逃脱不了冯·诺依曼的掌心，我们所有的电脑，都有一个共同的名字，叫“冯·诺依曼机器”，它超越了品牌、国界、速度和岁月。&lt;/p&gt;&lt;p id="up-315"&gt;&lt;b id="up-316"&gt;二、摩尔定律：高登·摩尔&lt;/b&gt;&lt;/p&gt;&lt;p id="up-317"&gt;&lt;img class="fit-image" id="up-318" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547201.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-319"&gt;当人们不断追逐新款PC时,殊不知这后面有一只无形的大手在推动,那就是摩尔定律,而这著名定律的发明人就是高登·摩尔(Gordon Moore)。&lt;/p&gt;&lt;p id="up-320"&gt;1965年的一天，摩尔顺手拿了把尺子和一张纸，画了一张草图，纵坐标代表不断发展的集成电路，横坐标是时间。他在月份上逐个描点，得到一幅增长的曲线图。这条曲线显示出每24个月，集成电路由于内部晶体管数量的几何级数的增长，而使性能几乎翻倍提高，同时集成电路的价格也恰好减少一倍。后来高登·摩尔把时间调整为18个月。摩尔是在集成电路技术的早期作出结论的，那时候，超大规模集成电路技术还远未出现，所以他在1965年的预言并未引起世人的注意。&lt;/p&gt;&lt;p id="up-321"&gt;高登·摩尔的另一壮举是在1968年与罗伯特·诺伊斯带头“造反”，率领一群工程师离开仙童公司，成立了一家叫集成电子的公司，简称“Intel”，这就是今日名震世界的英特尔公司。&lt;br id="up-322"&gt;&lt;br id="up-323"&gt;&lt;b id="up-324"&gt;三、预言大师：阿伦·凯&lt;/b&gt;&lt;/p&gt;&lt;p id="up-325"&gt;&lt;img class="fit-image" id="up-326" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547202.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-327"&gt;凯的形象既不像傲慢自大、反潮流的黑客，也不同于一夜暴富的计算机富翁，更不像象牙塔里的计算机科学家。他时常穿着跑鞋和灯芯绒裤子，一小撮胡子，短短的、略微零乱的头发，使他看上去极为普通。即使他是你的老板，可能也不会给你留下多深的印象。但这也不是说他很谦逊，他喜欢引用自己的话，且经常以这样的词作为发言的开端：“凯的第一法则指出……”。&lt;/p&gt;&lt;p id="up-328"&gt;阿伦·凯（Alan Kay）不是一位公众人物，但在计算机界，尤其是技术圈内，他是能让大家都心服口服屈指可数的大师之一。成为硅谷的又一位亿万富翁或让他当麻省理工的院长，都无法激起他的兴奋，但他会有足够的耐性与一群8岁左右的孩子一起玩电脑。他最大的乐趣就是发明他喜欢的东西。&lt;/p&gt;&lt;p id="up-329"&gt;阿伦·凯是Smalltalk面向对象编程环境语言的发明人之一，也是面向对象编程思想的创始人之一，同时，他还是笔记本电脑最早的构想者和现代Windows GUI的建筑师。&lt;/p&gt;&lt;p id="up-330"&gt;近年来有一句话挺流行：“预测未来的最好办法，就是把它创造出来。”不少人误以为此言出自尼葛洛庞帝之口，实际上，这句话是阿伦·凯的名言。有很多人说布兰德是第一个使用PC一词的人，但布兰德说自己也是顺手牵羊，最早提出“PC”概念的就是阿伦·凯。20世纪90年代程序员设计的基本模式就是“面向对象”，发明这一术语的也是阿伦·凯。在20世纪70年代的一份备忘录上，阿伦·凯还正确预言到，“20世纪90年代将有成百万的个人计算机，而且都将连接到全球公用的信息设施上”，这不正是今天的互联网吗？&lt;/p&gt;&lt;p id="up-331"&gt;&lt;b id="up-332"&gt;四、集成电路之父：罗伯特·诺伊斯&lt;/b&gt;&lt;/p&gt;&lt;p id="up-333"&gt;&lt;img class="fit-image" id="up-334" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547203.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-335"&gt;硅谷是传奇人士扎堆之地。但是一个人要想在硅谷同时获得财富、威望和成就，实在比登天还难。举目远眺大概只有罗伯特·诺伊斯(Robort Noyce)才是惟一一位三位于一体式的人物。&lt;/p&gt;&lt;p id="up-336"&gt;作为集成电路的发明者，诺伊斯在科学史上已名垂青史，这个具有划时代意义的发明促成了历史的大转折。而且他还与别人共同创办了两家硅谷最伟大的公司，第一家是半导体工业的摇篮——仙童（Fairchild）公司，这已成为历史；第二家则仍跻身美国最大的公司之列，这就是英特尔公司。他带着特有的神圣和威严，让同行和对手都得永远敬仰。以尖刻著称的硅谷杂志《Upside》敢对硅谷任何一位大腕儿进行任何刺激，但对诺伊斯却只能毕恭毕敬，在诺伊斯去世前几天的采访录，甚至成为杂志社经常炫耀的一种荣光。&lt;/p&gt;&lt;p id="up-337"&gt;在仙童，诺伊斯最大的成就是发明了集成电路。当基尔比在德州仪器用锗晶片研制集成电路时，诺伊斯和摩尔已把眼光直接盯住了硅晶片，因为硅的商业前景要远远超出锗。1959年2月，诺伊斯为“微型电路”申请了专利，但没有为他用平面处理技术制造的集成电路申请专利，直到同年7月才补全了这一手续。而此前德州仪器公司已宣布生产集成电路的产品，该公司的基尔比拥有第一个专利，但他的设计不实际，而诺伊斯则是第二个提出该专利的人。于是整个60年代，仙童和德仪相互控告，最后法庭将集成电路的发明专利授予了基尔比，而将关键的内部连接技术专利授予诺伊斯。诺伊斯的专利使仙童公司在沉闷的70年代得以存活下来，这一时期的仙童成为硅谷最具神话色彩的历史。&lt;/p&gt;&lt;p id="up-338"&gt;当然诺伊斯成就的最高峰还是英特尔公司，他与高登·摩尔和安迪·葛鲁夫一同创业，而且构建了业界极为罕见、完美和谐的三人“执政”局面。三人的合作只能说是天作之合，缺任何一位可能都会让英特尔历史大幅改写。诺伊斯自然是最耀眼的人物，传奇式的发明家、仙童公司的总经理和半导体业的“政治家”，他是英特尔公司的“脸面”。而甘于默默无闻的高登·摩尔则是公司的“心脏”，没有摩尔，英特尔不可能有足够的力量和士气；而没有强硬的葛鲁夫，英特尔甚至不会成为一家著名的大公司。&lt;br id="up-339"&gt;&lt;br id="up-340"&gt;&lt;b id="up-341"&gt;五、微处理器之父：特德·霍夫&lt;/b&gt;&lt;/p&gt;&lt;p id="up-342"&gt;&lt;img class="fit-image" id="up-343" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547204.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-344"&gt;1971年1月，第一个可以运转的微处理器诞生了，定名为“4004型”。其中，第一个“4”是指以4位为单位的设计思想，后一个“4”是指由英特尔制造的第4种专用芯片，而它的发明人就是特德·霍夫。霍夫认为自己占了天时和地利之便：“如果我们没有在1971年发明4004微处理器，那么别人也会在一两年里发明它。”&lt;/p&gt;&lt;p id="up-345"&gt;在普遍认为大型机才是大有可为的时代，霍夫另辟蹊径，投入到微处理器的研制中。霍夫说服了刚从仙童公司跳槽的斯坦·麦卓尔与他合作，共同设计了一种比4004型更强大的微处理器，称为“8008型”，这是第一个真正意义的微处理器。&lt;/p&gt;&lt;p id="up-346"&gt;1973年8月，“8080型”微处理器问世，它首次使用了MOS(金属氧化物半导体)工艺，成为有史以来最成功的微处理器之一，这也是第一个通用微处理器，是20世纪最后25年里一项具有划时代意义的发明。&lt;/p&gt;&lt;p id="up-347"&gt;著名的《经济学家》杂志将霍夫称作是“第二次大战以来最有影响的7位科学家之一”。1978年，他被提升为英特尔研究员(至今一共只有两个人获得过类似的称号)，这意味着他在研究方面具有很大的自主权。&lt;/p&gt;&lt;p id="up-348"&gt;在评价微处理器和PC时，霍夫说：“我对微处理器在个人计算机中的应用感到非常惊讶，我也没有想到人们会仅仅为了业余的爱好而买微机。随着影像游戏机的发展，个人计算机成为人们又一种娱乐工具，任何一位发明家如果能够创造出什么来提供给人们娱乐，他就能获得成功。”&lt;br id="up-349"&gt;&lt;br id="up-350"&gt;&lt;b id="up-351"&gt;六、PC之父：爱德华·罗伯茨&lt;/b&gt;&lt;/p&gt;&lt;p id="up-352"&gt;&lt;img class="fit-image" id="up-353" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547205.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-354"&gt;创造出世界上第一台微电脑的殊荣，现在一般都归到爱德华·罗伯茨（Edward Roberts）身上。&lt;/p&gt;&lt;p id="up-355"&gt;罗伯茨是位电脑爱好者，1974年，罗伯茨决定利用8080微处理器装配一种供黑客试验的计算机，《大众电子》杂志为寻找独家新闻，主动上门观看了罗伯茨的设计方案，之后决定让他制成一台原型机，由杂志社在封面予以报道。&lt;/p&gt;&lt;p id="up-356"&gt;1975年１月，《大众电子》封面刊出一台很小的计算机照片，大字标题写着：“世界上第一组堪与商业机相媲美的以成套形式提供的小型计算机——牛郎星8800”。根据杂志的介绍，“牛郎星”勉勉强强算是一台电脑，在金属制成的小盒内，罗伯茨装进两块集成电路，一块即8080微处理芯片，另一块是存储器芯片。既没有可输入数据的键盘，也没有显示计算结果的“面孔”。插上电源后，使用者需要用手按下面板上的8个开关，把二进制数“0”或“1”输进机器。计算完成后，面板上的几排小灯泡忽明忽灭，就像军舰上用灯光发信号那样表示输出的结果。&lt;/p&gt;&lt;p id="up-357"&gt;就是这样一个简单的装置，却引发了大地震。罗伯茨的“牛郎星”电脑问世后，美国出现了一个电脑业余爱好者购买散件、在家庭车库内组装微电脑的热潮。 尽管“牛郎星”十分原始，但它把计算机发展到大型机时代料想不到的辉煌阶段。 &lt;br id="up-358"&gt;&lt;br id="up-359"&gt;&lt;b id="up-360"&gt;七、商用软件之父：布莱克林&lt;/b&gt;&lt;/p&gt;&lt;p id="up-361"&gt;&lt;b id="up-362"&gt;&lt;img class="fit-image" id="up-363" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547206.jpg" border="0" /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p id="up-364"&gt;个人电脑的真正飓风是由AppleⅡ刮起的，而AppleⅡ成功的重要推进器就是VisiCalc电子表格软件。因为售价3000美元的AppleⅡ对家庭并没有多少吸引力，但配备了电子表格的AppleⅡ，就足以让人们把VisiCalc作为惟一的理由而购买它。从某种意义上说，AppleⅡ就是一台VisiCalc机器。&lt;/p&gt;&lt;p id="up-365"&gt;VisiCalc的发明人就是丹·布莱克林(Dan Bricklin)。1973年毕业后，布莱克林进入DEC，与他人合作编制了DEC的第一个字处理软件WPS－8。26岁时，布莱克林进入哈佛商学院寻求新的职业生涯，他在哈佛的分时计算机系统上用BASIC编写软件，进行财务计算。当时他常遇到的问题是，对不同的题目必须重新编写程序，于是他便开始思考能否用一种通用的计算模式来解决该问题。布莱克林用一个周末的时间粗粗地做出了一个演示版本。虽然这个演示版本是用BASIC写成的，速度很慢，而且行列只能添满一屏，但它已经具备电子表格的许多基本功能，此时已是1978年初。由于AppleⅡ等个人电脑产品的问世，布莱克林和麻省理工的老朋友富兰克斯顿一起合作，成立了软件艺术公司(SA)，决定为AppleⅡ开发VisiCalc，发行商是丹·弗莱斯特拉的公司叫Personal软件公司(PS)，可以说这是最早的微机应用软件公司。&lt;/p&gt;&lt;p id="up-366"&gt;电子表格VisiCalc的出现将PC从业余爱好者手中的玩具变成了炙手可热的商业工具，独立地改变了PC业的发展方向。布莱克林创造的不仅仅是一个产品、一家公司，而是整个软件产业。VisiCalc引发了真正的PC革命，它极大地激励了软件开发者，并从此宣告了PC商用化的到来。&lt;br id="up-367"&gt;&lt;br id="up-368"&gt;&lt;b id="up-369"&gt;八、IBM PC之父：埃斯特利奇&lt;/b&gt;&lt;/p&gt;&lt;p id="up-370"&gt;&lt;img class="fit-image" id="up-371" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547207.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-372"&gt;如果说个人电脑之火是由苹果引燃的，那么IBM的介入，才真正将这场大火燃遍全球，热度持续近20年而不减。而缔造IBM PC的，就是颇富个人魅力的唐·埃斯特利奇。&lt;/p&gt;&lt;p id="up-373"&gt;1980年中，IBM召集高层咨询会议，要对如火如荼的个人电脑浪潮作出应对。这时实验室主任洛伊站起来，提议打破常规，秘密组织一个精干小组，在一年内搞出PC来。 洛伊仅挑选了12名最优秀的工程师来演绎一段类似苹果公司经历过的传奇故事，担当这个名为“西洋棋”项目的负责人就是埃斯特利奇。以往，埃斯特利奇在工作上被认为“极不合作”，不听别人使唤，只凭自己的意思行事。而这种不合群的态度，正适合IBM PC计划，洛伊将它交给埃斯特利奇，事实证明这个选择十分英明。&lt;/p&gt;&lt;p id="up-374"&gt;1981年8月12日，IBM PC如人们预想的那样跨进了PC业，没有人惊奇和兴奋，因为要等一段时间，人们才真正明白PC时代的开始。在第一台PC发布前几个月，埃斯特利奇还着手下一代产品——PC XT的开发。XT的推出，再次把IBM推到PC科技的最前端，XT疯狂畅销，使IBM一举占有企业PC市场的75％。同时埃斯特利奇还启动另一计划，以PC攻打家庭市场，但推出时间太晚,错过了圣诞销售旺季，后来这个产品无疾而终。1982年，埃斯特利奇开始着手下一个大计划，即生产真正强劲的AT机。AT机象征着IBM是惟一能使用80286处理器的厂商。1984年 8月，AT机推出好几个月后，竞争对手才推出AT级产品。1984年， IBM PC的收入已达到40亿美元，这意味着光是PC一个部门就可以在美国工业公司中排名第74位，并可名列美国第三大计算机公司，仅次于IBM自己和DEC。埃斯特利奇还安排了一个争议性的计划，让经销商销售个人电脑，这是IBM产品第一次由非IBM业务代表的人销售， 从而开拓了电脑分销的先河。&lt;/p&gt;&lt;p id="up-375"&gt;1985年8月2日埃斯特利奇终于带着太太，去渡公司承诺已久的假期。两人乘坐的191航班试图在暴风雨中降落到达拉斯机场时，飞机失控，埃斯特利奇和太太玛丽不幸丧生。虽然他的生命结束于不幸的飞行事故,但打开昨日的篇章，历史永远会承认一个真正有贡献的人。&lt;br id="up-376"&gt;&lt;br id="up-377"&gt;&lt;b id="up-378"&gt;九：PC软件先锋：加里·基尔达尔&lt;/b&gt;&lt;/p&gt;&lt;p id="up-379"&gt;&lt;img class="fit-image" id="up-380" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547208.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-381"&gt;加里·基尔达尔被称为PC软件的开拓者，因为正是他打开了微处理器和微电脑之间的通道，在PC革命英特尔公司锋利的弹片中，有着基尔达尔历史性的贡献。&lt;/p&gt;&lt;p id="up-382"&gt;加里·基尔达尔敏锐地发现，4004微处理器可以用来编制程序，基尔达尔突然想到：“能不能在这里编制电脑的程序呢?”，这想法诞生了微程序(Microprogram)设计。基尔达尔在DEC公司的PDP-10小型机上为英特尔4004微处理器创建新的“微语言”后，英特尔马上聘请基尔达尔做技术顾问。在基尔达尔的主持下，创建了在个人电脑史上革命性的微处理程序设计语言PL/M(Programing language for Microprocessor)。这一新的语言随着Intel 8008、8080微处理器的进展，对个人电脑的革命起着巨大的推动作用。如果没有基尔达尔这一贡献，英特尔的微处理器肯定还会在计算器里“沉沦”许久，PL/M语言与Intel、Zilog、Motorola微处理器的结合，在70年代末，终于使微机的性能能同60年代的大型机和小型机相媲美。&lt;/p&gt;&lt;p id="up-383"&gt;另外，基尔达尔还是第一个光盘(CD－ROM)驱动程序的编写者，也是图形用户界面的先驱，当时还没有GUI(Graphic User Interface)的说法，基尔达尔把它叫做“图形环境管理员(Graphic Enviroment Manager)”。&lt;/p&gt;&lt;p id="up-384"&gt;&lt;b id="up-385"&gt;十、电脑奇才：道格·恩格尔巴特&lt;/b&gt;&lt;/p&gt;&lt;p id="up-386"&gt;&lt;img class="fit-image" id="up-387" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/1547209.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-388"&gt;恩格尔巴特(Doug Engelbart)是电脑界的一位奇才，被称为“人机交互”领域里的大师。从20世纪60年代初期开始，他在人机交互方面做出了许多开创性的贡献，共发表论文30余篇，拥有20余项发明专利。世界上第一个电子邮件系统(E-Mail)、文字处理系统、在线呼叫集成系统和超文本链接都出自他之手。另外，他还发明了电脑显示器上的多重视窗、共享屏幕的电视会议、新的电脑交互输入设备等等。在恩格尔巴特的众多发明中，人们最熟悉的就是电脑上用的鼠标。1963年，美国国家专利局批准恩格尔巴特几年前提交的一份申请，确认一种叫“搜寻点击”的输入装置是一项独创的技术。在英语中，mouse有老鼠的意思，因此“搜寻点击”装置又被称为鼠标。1968年，恩格尔巴特应邀参加在旧金山举行的一次电脑会议，在会上，他拿出了许多令人吃惊的绝活：视窗(Windows)、超媒体(Supermedia)、群件(Groupware)，还有鼠标，这也是鼠标第一次作为“搜寻工具”公开亮相。&lt;br id="up-389"&gt;&lt;br id="up-390"&gt;&lt;b id="up-391"&gt;十一、MS-DOS之父：蒂姆·帕特森&lt;/b&gt;&lt;/p&gt;&lt;p id="up-392"&gt;&lt;img class="fit-image" id="up-393" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472010.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-394"&gt;谁都知道MS-DOS是美国微软公司的产品，而且正是MS-DOS使微软公司实现了从一个不知名的软件开发公司到全球软件巨头的第一次飞跃。MS-DOS曾是微软公司的拳头产品，长期统治着个人电脑操作系统市场。虽然现在的微软“视窗”已经成为新一代PC操作系统霸主，但MS-DOS对业界的功劳仍不可磨灭。不过MS-DOS的真正主人蒂姆·帕特森的名字可能并不为每个人所知道。&lt;/p&gt;&lt;p id="up-395"&gt;帕特森在西雅图电脑制造公司任副总裁时,自己动手花了半年时间成功地推出了自己的操作系统，命名为SCP-DOS，本意为“快而粗糙的磁盘操作系统”，这个SCP-DOS便是现在DOS的前身。SCP-DOS推出之后，应用效果不错，但也曾被数据研究公司指责剽窃了他们当时颇受欢迎的CP/M操作系统。这两个操作系统确实有相似之处，不过 SCP-DOS在储存数据、组织文件等方面与CP/M有极大的不同。那么后来SCP-DOS如何成为MS-DOS呢？这还得从IBM的“西洋棋方案”说起。&lt;/p&gt;&lt;p id="up-396"&gt;1980年，IBM公司决心开发自己的个人电脑，便制定了“西洋棋方案”。他们需要找一家软件公司合作开发一套个人电脑操作系统。当时的微软为了不错过这个千载难逢的发展机会，向IBM称自己有软件操作系统，实际上，虽然当时微软公司在软件行业已有一席之地，但依靠的却是其程序语言，并无现成的操作系统。为了与IBM公司合作，微软不得不去找帕特森。&lt;/p&gt;&lt;p id="up-397"&gt;微软从帕特森那里，仅以2.5万美元的转让价格便获得了SCP-DOS的使用权。SCP-DOS虽比较粗糙，但已经具有了雏形，只要在其基础上进行加工，搞出合乎要求的产品并不太难。事实上，SCP-DOS对微软的重大意于义在于，它使IBM公司放弃了CP/M，转而与微软合作，从而成就了微软的未来。&lt;/p&gt;&lt;p id="up-398"&gt;1981年4月，帕特森离开了西雅图电脑制造公司，投到微软公司门下，这时才知道自己的操作系统被微软拿来作为IBM公司合作的产品之一。他当时非常恼火和后悔，不过也无可奈何，自己的成果虽然潜力无限，但在西雅图电脑制造公司却无法得到推广，相反由微软公司去发展完善，总比埋没了要好。&lt;/p&gt;&lt;p id="up-399"&gt;&lt;b id="up-3100"&gt;十二、便携计算机之父：亚当·奥斯本&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3101"&gt;&lt;img class="fit-image" id="up-3102" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472011.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3103"&gt;在硅谷历史上，亚当·奥斯本（Adam Osborne）绝对算得上是一个人物，他在20世纪70年代初期得到了一份为英特尔新发明的微处理器编写说明书的工作，随后成为技术领域的自由撰稿人，先后在计算机杂志《界面时代》（Interface Age）和《Infoworld》上开辟专栏。&lt;/p&gt;&lt;p id="up-3104"&gt;但奥斯本有更大的计划，他想要成为这个行业的一分子、硅谷的大亨，向对他的逻辑天才发生过怀疑的人证明他们的错误。他毫不谦虚，甚至有些自大地说：“我跟每一个人说，他们应该制造什么，可是没有人听我的话，所以我自己去制造了。”&lt;/p&gt;&lt;p id="up-3105"&gt;令人惊奇的是，奥斯本证明了他的设想是合理的。奥斯本有两个很妙的主意：首先，利用眼下电路体积变得越来越小的优势，制造出一种既小又轻而且结实的便携式个人计算机；其次，把当时需单独购买并且价格昂贵的最流行软件，算在个人计算机的价格内卖给顾客。此前，硬件和软件公司从来不会同时提供这两项服务。&lt;/p&gt;&lt;p id="up-3106"&gt;1980年3月，在西海岸计算机展览会上，奥斯本见到了为一家硬件公司设计电路板的Lee Felsenstein。奥斯本向他提出了自己的设想，并对Felsenstein提出设计要求：这台计算机一是要廉价结实，既小又轻；二是要捆绑字处理和电子表格软件。&lt;/p&gt;&lt;p id="up-3107"&gt;1981年4月奥斯本Ⅰ型计算机全新亮相，含软件在内的整机价格仅1795美元。这一下子就轰动四方，到1981年9月，公司月销售额就攀升至100万美元，第二年公司收入就达7000万美元。&lt;/p&gt;&lt;p id="up-3108"&gt;但奥斯本公司在成立的第二年的年中，便开始出现严重的错误。管理上的混乱导致产品质量下降、交货延误和财政空虚,而市场策略的错误更使它功亏一篑。当时在市场上占统治地位的是IBM，而奥斯本公司的“管理者”却不能与之兼容，这本不算太糟，但奥斯本不能忍受这样的情况。于是，奥斯本在新产品投放市场一星期后，宣布他已开始准备与IBM兼容，这等于无形之中宣布自己的产品已经过时，使销售量顿时一落千丈。一个美丽的计算机神话仅仅维持了不到两年时间。这个以自己的创新理念，促使计算机业发展方向发生革命的人物，这个一度是PC业内最具影响力、最富争议的人物，就这样从业界淡出，将一切甩在了自己的身后。&lt;br id="up-3109"&gt;&lt;br id="up-3110"&gt;&lt;b id="up-3111"&gt;十三、磁盘之父：艾伦·舒加特&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3112"&gt;&lt;img class="fit-image" id="up-3113" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472012.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3114"&gt;各种类型的软、硬磁盘，是个人电脑最重要的存储设备，磁盘的历史并不太长，从世界上第一台硬盘发明至今，也不过40余年时间。&lt;/p&gt;&lt;p id="up-3115"&gt;20世纪50年代，IBM公司董事长小托马斯·沃森迅速把事业扩展到美国西海岸，下令在加利福尼亚圣何塞市附近新建实验室和工厂。约翰逊带领着30多名青年工程师，在不到三年时间，就为IBM创造了引人注目的技术成果——磁盘存储器。在约翰逊领导IBM圣何塞实验室研制硬盘的过程中，一位名叫艾伦·舒加特（Al.Shugart）的青年工程师发挥了关键作用。&lt;/p&gt;&lt;p id="up-3116"&gt;舒加特1951年大学毕业后加盟IBM，在研究部门工作了十多年。 1969年，他离开IBM建立舒加特合伙人公司，并研制出世界上第一片以塑料材质为基础的5英寸软磁盘，即PC机上使用的标准软盘。&lt;/p&gt;&lt;p id="up-3117"&gt;1974年，舒加特首次创办的公司倒闭，五年之后，舒加特重返电脑行业，在著名的硅谷腹地， 与过去的几位同事共同创建了希捷（Seagate）技术公司，专门为个人电脑研制高性能的小型硬盘。&lt;/p&gt;&lt;p id="up-3118"&gt;1980年，希捷技术公司宣布研制出第一台5.25英寸温式硬盘，容量达5～10MB，后来成为IBM PC/XT个人电脑最具特点的标准配置。 舒加特领导的这家公司，目前已是资产数十亿美元、员工10余万人的世界上最大的PC硬盘生产厂商之一。&lt;/p&gt;&lt;p id="up-3119"&gt;&lt;b id="up-3120"&gt;十四、自由软件之神：理查德·斯托尔曼&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3121"&gt;&lt;img class="fit-image" id="up-3122" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472013.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3123"&gt;20世纪末，软件业发生的最大变革就是自由软件的全面复兴。在自由软件的浪潮下，软件业的商业模式脱胎换骨，从以卖程序代码为中心，转化为以服务为中心，而理查德·斯托尔曼则被称为软件业的自由之神。有人说，斯托尔曼应该算是世界上写软件最多的程序设计师。但是，斯托尔曼真正的力量是他的思想。在斯托尔曼的理论下，用户彼此拷贝软件不但不是“盗版”，而是体现了人类天性的互助美德。对斯托尔曼来说，自由是根本，用户可自由共享软件成果，随便拷贝和修改代码。他说：“想想看，如果有人同你说‘只要你保证不拷贝给其他人用的话，我就把这些宝贝拷贝给你’。其实，这样的人才是魔鬼”。&lt;/p&gt;&lt;p id="up-3124"&gt;理查德·斯托尔曼一副披头士的打扮,看起来像现代都市里的野人，但如果他将一件“麻布僧袍”穿在身上，又戴上一顶圆形宽边帽子，有如绘画作品中环绕圣像头上的光环。一眨眼的功夫，他又变成圣人，散发着先知般的威严和力量。野人与圣人，恰恰就是这位自由软件的精神领袖理查德·斯托尔曼的双重属性，他既是当今商业软件领域野蛮的颠覆者，又是无数程序员和用户心目中神圣的自由之神。&lt;/p&gt;&lt;p id="up-3125"&gt;&lt;b id="up-3126"&gt;十五、微软帝国：比尔·盖茨&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3127"&gt;&lt;img class="fit-image" id="up-3128" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472014.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3129"&gt;据不久前的一期《福布斯》杂志的年度统计，微软创始人比尔·盖茨（Bill Gates）以587亿美元的个人资产仍排名世界首富。他在短短20多年的时间里创造的财富比传统的汽车大王、石油大王、钢铁大王或金融寡头在200年时间里创造的家庭财富还多。&lt;/p&gt;&lt;p id="up-3130"&gt;像苹果砸出牛顿的智慧一样,个人电脑突入盖茨的脑海也有一个外在的启蒙者，这就是1975年1月份的《大众电子学》杂志,它封面上Altair 8080型计算机的图片一下子点燃了比尔·盖茨的电脑梦。盖茨打电话给罗伯茨表示要给Altair研制Basic语言,之后,盖茨和艾伦在哈佛阿肯计算机中心没日没夜地干了8周，为8008配上Basic语言,开辟了PC软件业的新路。&lt;/p&gt;&lt;p id="up-3131"&gt;1975年5月，比尔·盖茨产生了退学的想法，他希望能和好友艾伦一起创办一个软件公司，由于父母的极力反对，比尔·盖茨没能马上退学，但他还是离开了西雅图到了亚帕克基。1975年7月，他与艾伦合作创建公司。微软公司前身成立时，比尔·盖茨正好20岁。&lt;/p&gt;&lt;p id="up-3132"&gt;如今微软已成为了业内的“帝国”,除了主宰PC操作系统和办公软件外(这是微软的命脉),还涉足个人财务软件、教育及游戏软件、网络操作系统、商用电子邮件、数据库及工具软件、内部网服务器软件、手持设备软件、网络浏览器、网络电视、上网服务及近20个不同的Web网站。&lt;/p&gt;&lt;p id="up-3133"&gt;&lt;b id="up-3134"&gt;十六、PC直销：迈克尔·戴尔&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3135"&gt;&lt;img class="fit-image" id="up-3136" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472015.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3137"&gt;迈克·戴尔(Michael Dell)曾就读于奥斯汀的德克萨斯大学，19岁退学。&lt;/p&gt;&lt;p id="up-3138"&gt;1984年，迈克·戴尔以1000美元和一个在个人计算机业中前所未有的理念建立了戴尔公司，即避开给产品增值较少的中间商，直接向最终用户销售量身订制的个人计算机。这样可以根据订单生产以取消库存，并把后勤服务与供应商结合起来，创造出一种规范化、低成本的企业文化。通过这种创新的直线订购方式和在业界率先倡导的服务和技术支持方案，戴尔公司已成为全球顶尖的个人计算机供应商之一，并且是领先的计算机直线订购公司和全球发展最快的主要计算机系统公司。&lt;/p&gt;&lt;p id="up-3139"&gt;戴尔公司在PC的领导地位带来了全球革命，还被公认为是最大的计算机系统网上供应商，迈克·戴尔因此成为当时最年轻的首席执行官之一，他的个人资产曾达到214.9亿美元。&lt;br id="up-3140"&gt;&lt;br id="up-3141"&gt;&lt;b id="up-3142"&gt;十七、苹果创始人：史蒂夫·乔布斯&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3143"&gt;&lt;img class="fit-image" id="up-3144" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472016.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3145"&gt;不久前，美国《洛杉矶时报》评选出了“20世纪经济领域50名最有影响力人物”，史蒂夫·乔布斯（Steve Jobs）与另一名苹果电脑公司创办人沃兹·尼克并列第5名，他们的贡献主要表现为“创办苹果电脑，带动了全球个人电脑普及应用浪潮，并迫使IBM PC于1981年面市”。历经了20多年的磨炼，人们在史蒂夫·乔布斯身上发现了一系列走向成功的闪光之处：首先是信息消费技术产品的主导者，其次，是随机应变的企业家。&lt;/p&gt;&lt;p id="up-3146"&gt;1976年，21岁的乔布斯和26岁的沃兹·尼艾克在乔布斯自家的车库里成立了苹果电脑公司。他们的第一个产品是一种没有键盘、机箱、声音和图像的计算机电路板，他们称之为Apple I。1977年4月他们成功开发了AppleⅡ,这是有史以来第一台具有彩色图形显示功能、键盘、电源和造型的个人电脑产品，也是第一台在市场上进行销售的个人电脑。1985年，苹果公司已经拥有了20亿美元的资产,成长为当时硅谷灿烂的明珠。&lt;/p&gt;&lt;p id="up-3147"&gt;乔布斯的另一个功绩是在1997年9月重返该公司任首席执行官后，对奄奄一息的苹果公司进行大刀阔斧的公司改组和一连串新产品降价促销的措施。乔布斯抓住Internet浪潮带来的机遇，相继推出了Power Macintosh G3、iMac和iBook等一系列划时代产品，不仅让苹果电脑公司起死回生，从赤字累累奇迹般地变为连番获利，而且使苹果在1998第四个财政季度创造了1.09亿美元的利润。苹果重新回到了全球信息技术潮流领袖的地位，并带动全球个人电脑与信息技术产品时尚化、易用化的新潮流。&lt;/p&gt;&lt;p id="up-3148"&gt;&lt;b id="up-3149"&gt;十八、以太网之父：鲍伯.梅特卡夫&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3150"&gt;&lt;img class="fit-image" id="up-3151" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472017.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3152"&gt;鲍伯·梅特卡夫(Bob Metcalfo)被称为以太网之父，并且提出了网络的实用性与其使用者数目的平方成正比的“梅特卡夫法则”，即如果网络中有n个用户时，网络中就有n(n-1)个潜在商品，当第n+1个顾客加入此网时，该用户就向其他所有用户提供了2n个潜在商品。&lt;/p&gt;&lt;p id="up-3153"&gt;鲍伯·梅特卡夫毕业于麻省理工学院，后来到哈佛念博士。他在哈佛大学宣读了阐述以太网的论文，哈佛大学说理论性不强，要他进行理论升华，然后再答辩。梅特卡夫无奈，只好到心理学家泰勒这里来“升华”，想不到却搞出惊人之举。在他主持下，施乐硅谷研究中心1973年5月，第一次在局域范围内实现了微机间的联网。梅特卡夫欣喜不已，当他要给这个新联网系统取名字时，一想到哈佛大学说他的理论深度不够，就气不打一处来，想到19世纪末物理学家们提出的玄虚不已的以太(Ether)理论，就郑重其事把它命名为“以太网”(Ethernet)，并于1977年申请了专利。1979年4月，鲍伯·梅特卡夫正式成立了3Com公司，目标就是推进以太网成为业界标准。现在当以太网带宽开始向10G迈进时，谁还能说以太网不是业界的一个标准呢？ IT偏执狂&lt;/p&gt;&lt;p id="up-3154"&gt;葛鲁夫绝对是20世纪史上最重要的角色之一：他开创了微处理器产业、引爆了个人电脑革命并一手将英特尔打造成超级竞争机器。他的竞争策略是：推出新产品、主动降价打击竞争对手、再推出新产品……，这个逼迫自己不断进步，不让对手有任何喘息空间的策略，让英特尔主宰个个电脑产业的时间超过十年。现在他虽然已经退居二线，但葛鲁夫仍然是位值得研究的大师。 &lt;br id="up-3155"&gt;&lt;br id="up-3156"&gt;&lt;b id="up-3157"&gt;十九、英特尔：安迪·葛鲁夫&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3158"&gt;&lt;img class="fit-image" id="up-3159" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472018.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3160"&gt;1998年1月5日，是葛鲁夫一生中最辉煌的时刻，他战胜了英国王妃戴安娜、克隆绵羊多莉之父伊安·威尔马特和美联储主席艾伦·格林斯潘，成为《时代周刊》新一届的年度世界风云人物，加上1997年英特尔辉煌的业绩，葛鲁夫的名声和威望被推上了巅峰。&lt;/p&gt;&lt;p id="up-3161"&gt;而之后的葛鲁夫选择了急流勇退，1998年5月他将CEO一职交给公司总裁贝瑞特,只留下更具象征性的董事会主席一职。这一方面与他的年龄和身体状况有关，另一方面是处于战略转折点的CPU市场，迫使他提前让贤。此后，由于公司业绩不佳，加上低端市场操作不力，公司股票比高峰时下跌30%以上。葛鲁夫走得恰是时候，这位好斗、爱发脾气、有驾驭力的铁腕人物必须将权力之杖让与一个更和气、更具亲和力的人，才能使英特尔力挽狂澜。&lt;/p&gt;&lt;p id="up-3162"&gt;&lt;b id="up-3163"&gt;二十、蓝色救星：路易斯·郭士纳&lt;/b&gt;&lt;/p&gt;&lt;p id="up-3164"&gt;&lt;img class="fit-image" id="up-3165" alt="" src="http://fellow.51cto.com/files/uploadimg/20080721/15472019.jpg" border="0" /&gt;&lt;/p&gt;&lt;p id="up-3166"&gt;20世纪80年代末，将头埋在沙里的IBM公司经理们，面对新崛起的个人电脑还死抱着大型电脑的概念不放。20世纪90年代初期，由于欧美经济萧条，IBM公司内部机构臃肿，连续几年公司股票不断下跌，一时间，不少持悲观态度的人士认为，IBM已经难以逃脱覆舟的命运，当时的IBM几乎成了一辆没人要的破车。&lt;/p&gt;&lt;p id="up-3167"&gt;1993年郭士纳正式接管IBM,开始发起向PC业的进军,重振IBM雄威。1994年底，IBM获得了自20世纪90年代以来的第一次赢利30亿美元。正如郭士纳所说，信息革命即将发生，IBM再也不能靠亮皮鞋和微笑来过关了。&lt;/p&gt;&lt;p id="up-3168"&gt;1995年6月5日，处理完内部事务的郭士纳终于将锋芒扫向了外界。他瞄上了Lotus公司，不顾Lotus总裁吉姆·曼兹的反对，决定强行吞并。6月11日，这桩生意最终以35亿美元成交，成为当时软件史上最大的购并案。之后，郭士纳将Lotus的Notes软件作为武器，向软件市场发动总攻，并一举拿下了企业网络市场。1995年，IBM营收突破了700亿美元大关。 &lt;br id="up-3169"&gt;&lt;br id="up-3170"&gt;郭士纳为IBM带来了滚滚利润，也为他自己挣得了不菲的收入。1996年他已获得了82．5万股期权，账面价值6900万美元。1997年3月，董事会同意再给他增加30万股期权，希望他再干一个任期到2002年，为此公司将另加200万股票认购权。如果IBM股票能保持10％的增势，那这批股票将值3.3亿美元。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-5226798669964331789?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yHdRT1E8fMKIAeQzM_MVzcjA0Bo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yHdRT1E8fMKIAeQzM_MVzcjA0Bo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yHdRT1E8fMKIAeQzM_MVzcjA0Bo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yHdRT1E8fMKIAeQzM_MVzcjA0Bo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/lSZ_LYOsYGc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/5226798669964331789/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=5226798669964331789" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5226798669964331789?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5226798669964331789?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/lSZ_LYOsYGc/pc20-webzen-2008-08-07-202937-httpwww.html" title="PC历史上的20位英雄" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/08/pc20-webzen-2008-08-07-202937-httpwww.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYFRXw6eCp7ImA9WxdUF04.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-1928926850178490067</id><published>2008-08-02T20:57:00.000-07:00</published><updated>2008-08-02T21:18:34.210-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-02T21:18:34.210-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Decorator" /><category scheme="http://www.blogger.com/atom/ns#" term="模式" /><title>Decorator模式</title><content type="html">&lt;div id="ylps" style="TEXT-ALIGN: center"&gt;&lt;b id="c_.b"&gt;&lt;span id="c_.b0"   style="font-size:180%;color:#0b5394;"&gt;Decorator模式&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div id="c_.b1" style="TEXT-ALIGN: center"&gt;&lt;/div&gt;&lt;div id="ylps0"&gt;动态地给一个对象添加一些额外的职责。就增加功能来说，Decorator模式相比生成子类更为灵活。&lt;/div&gt;&lt;div id="ylps2"&gt;&lt;div id="y6:r" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img id="u0ta" src="http://docs.google.com/File?id=df32pbm_207fp69k3cx_b" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="rqy:"&gt;&lt;/div&gt;&lt;div id="rqy:0"&gt;&lt;/div&gt;&lt;div id="rqy:1"&gt;ConcreteDecoratorB对象执行自己的Operation方法，然后调用Decorator类的Operation方法。这会调用ConcreteDecoratorB对徐爱那个之后的Component对象的Operation方法。&lt;/div&gt;&lt;div id="ylps4"&gt;每个Decorator对象都对气候的对象封装自己的新功能。每个Decorator对象在被装饰的功能之前或之后执行自己的附加功能。&lt;/div&gt;&lt;div id="ylps5"&gt;&lt;/div&gt;&lt;div id="ylps6"&gt;Decorator模式帮助我们将问题分解为两个部分：&lt;/div&gt;&lt;ul id="ylps7"&gt;&lt;li id="ylps8"&gt;如何实现提供新功能的对象。 &lt;li id="ylps9"&gt;如何为每种特定情况将对象组织起来。&lt;/li&gt;&lt;/ul&gt;&lt;div id="ylps10"&gt;将“Decorator对象的实现”与“判断如何使用它们的对象”相分离。这提高了内聚度，因为每个Decorator对象只关心自己添加的功能——而不关心自己如何被添加到对象链中。&lt;/div&gt;&lt;div id="ylps11"&gt;Decorator模式的威力要求对象链的实例化与使用它的对象完全分离。最典型的实现方式是：使用工厂对象，在某些配置信息的基础上实例化对象链。&lt;/div&gt;&lt;div id="ylps12"&gt;&lt;/div&gt;&lt;div id="ylps13"&gt;Decorator模式是为现有的功能动态添加附加功能的一种方法。实际情况要求创建一条对象链来提供需要的行为。对象链的第一个对象被客户对象调用，客户对象不关心对象链的创建。&lt;span id="q1m1"  style="color:#0000ff;"&gt;&lt;b id="ylps14"&gt;通过保持对象链的创建与使用的互相独立，添加功能的新需求不会对客户对象造成影响&lt;/b&gt;。&lt;/span&gt;&lt;/div&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="bzse1"&gt;&lt;/div&gt;&lt;div id="ylps15"&gt;&lt;/div&gt;&lt;div id="brz-" style="TEXT-ALIGN: center"&gt;&lt;b id="q1m10"&gt;&lt;span id="q1m11"   style="font-size:100%;color:#351c75;"&gt;Decorator模式：关键特征&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="TEXT-ALIGN: center"&gt;&lt;strong&gt;&lt;span style="color:#351c75;"&gt;&lt;/span&gt;&lt;/strong&gt; &lt;/div&gt;&lt;div id="gbd-" style="TEXT-ALIGN: center"&gt;&lt;/div&gt;&lt;div id="brz-0"&gt;&lt;span id="g.bg"   style="font-size:130%;color:#660000;"&gt;&lt;strong&gt;意图&lt;/strong&gt;&lt;/span&gt; &lt;span id="o5fa"  style="color:#660000;"&gt;为一个对象动态连接附加的职责。&lt;/span&gt;&lt;/div&gt;&lt;span style="color:#660000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="brz-1"&gt;&lt;/div&gt;&lt;div id="y4pz"&gt;&lt;span id="sapj"   style="font-size:130%;color:#b45f06;"&gt;&lt;strong&gt;问题&lt;/strong&gt;&lt;/span&gt; &lt;span id="o5fa0"  style="color:#b45f06;"&gt;你需要使用的对象执行你要求的基本功能。但是，你可能需要为这个对象添加某些功能，&lt;/span&gt;&lt;/div&gt;&lt;div id="y4pz0"&gt;&lt;span id="o5fa1"  style="color:#b45f06;"&gt;这些附加功能可能发生在对象的基础功能之前或之后。（Java基础类在I/O处理中广泛使用了&lt;/span&gt;&lt;/div&gt;&lt;div id="y4pz1"&gt;&lt;span id="o5fa2"  style="color:#b45f06;"&gt;Decorator模式）&lt;/span&gt;&lt;/div&gt;&lt;span style="color:#b45f06;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="y4pz2"&gt;&lt;/div&gt;&lt;div id="y4pz3"&gt;&lt;span id="sapj0"   style="font-size:130%;color:#38761d;"&gt;&lt;strong&gt;解决方案&lt;/strong&gt;&lt;/span&gt; &lt;span id="o5fa3"  style="color:#38761d;"&gt;允许扩展一个对象的更能，而不必借助于子类型化。&lt;/span&gt;&lt;/div&gt;&lt;span style="color:#38761d;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="iqmq"&gt;&lt;/div&gt;&lt;div id="iqmq0"&gt;&lt;span id="sapj1"   style="font-size:130%;color:#7f6000;"&gt;&lt;strong&gt;参与者与协作者&lt;/strong&gt;&lt;/span&gt; &lt;span id="td_q"  style="color:#7f6000;"&gt;Decorator对象为ConcreteComponent添加功能。有时候ConcreteComponent的派生类&lt;/span&gt;&lt;span id="td_q0"  style="color:#7f6000;"&gt;被用于提供核心功能，在这种情况下ConcreteComponent类就不再是具体的，而是抽象的。&lt;/span&gt;&lt;span id="td_q1"  style="color:#7f6000;"&gt;Component类定义了所有这些类使用的接口。&lt;/span&gt;&lt;/div&gt;&lt;span style="color:#7f6000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="q5w61"&gt;&lt;/div&gt;&lt;div id="q5w62"&gt;&lt;span id="td_q2"  style="color:#0b5394;"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;效果&lt;/strong&gt;&lt;/span&gt; 被添加的功能属于小的对象。好处是可以在ConcreteComponent对象的功能之前或之后动&lt;/span&gt;&lt;/div&gt;&lt;div id="vdso"&gt;&lt;span id="td_q3"  style="color:#0b5394;"&gt;态添加功能。注意：虽然一个装饰着可以在被装饰者之前或之后添加功能，但对象链总是以&lt;/span&gt;&lt;span id="td_q4"  style="color:#0b5394;"&gt;ConcreteComponent对象结束。&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div id="kha9"&gt;&lt;/div&gt;&lt;div id="kha90"&gt;&lt;span id="td_q5"  style="color:#674ea7;"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;实现&lt;/span&gt;&lt;/strong&gt; 创建一个抽象类来表示原始的类和要添加到这个类上的新功能。在装饰者类中，将“对新功能&lt;/span&gt;&lt;span id="td_q6"  style="color:#674ea7;"&gt;的调用”放在“对紧随其后对象的调用”之前或之后，以获得正确的顺序。&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-1928926850178490067?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6SeGMhxjq6XquKeEdBwgu3nK0l0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6SeGMhxjq6XquKeEdBwgu3nK0l0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6SeGMhxjq6XquKeEdBwgu3nK0l0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6SeGMhxjq6XquKeEdBwgu3nK0l0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/JvGh5r0e5U8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/1928926850178490067/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=1928926850178490067" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/1928926850178490067?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/1928926850178490067?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/JvGh5r0e5U8/decorator-decorator-concretedecoratorbo.html" title="Decorator模式" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/08/decorator-decorator-concretedecoratorbo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08NRn8zcSp7ImA9WxdaE08.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-6466787239077378637</id><published>2008-07-22T06:07:00.000-07:00</published><updated>2008-08-21T05:31:37.189-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-21T05:31:37.189-07:00</app:edited><title>阿玛蒂亚·森：民主是一种普遍价值观</title><content type="html">&lt;table id="c.qt" cellspacing="0" cellpadding="0" width="680" border="0"&gt;&lt;tbody id="c.qt0"&gt;&lt;tr id="c.qt1"&gt;&lt;td class="text17-b" id="c.qt2" height="40"&gt;&lt;div id="c.qt3" align="center"&gt;阿玛蒂亚·森：民主是一种普遍价值观 &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="c.qt4"&gt;&lt;td class="text12" id="c.qt5" style="TEXT-ALIGN: center" height="22"&gt;&lt;div id="c.qt6" style="TEXT-ALIGN: left"&gt;&lt;a id="t3vl" href="http://www.tecn.cn/data/detail.php?id=5647"&gt;http://www.tecn.cn/data/detail.php?id=5647&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="c.qt7"&gt;&lt;td class="text12" id="c.qt8" align="right" height="32"&gt;标签： &lt;a id="c.qt9" href="http://www.tecn.cn/data/search.php?keyWords=%C3%F1%D6%F7&amp;amp;searchfield=keywords"&gt;&lt;u id="c.qt10"&gt;民主 &lt;/u&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="c.qt11"&gt;&lt;td class="text14" id="c.qt12" height="22"&gt;● &lt;b id="c.qt13"&gt;阿玛蒂亚·森&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr id="c.qt14"&gt;&lt;td class="text15" id="contenttd" valign="top"&gt;&lt;br id="c.qt15"&gt;（一九九八年经济学诺贝尔奖获得者阿玛蒂亚·森，是剑桥大学三一学院院长和哈佛大学拉蒙特荣誉教授。下面这篇论文是他一九九九年二月在印度新德里“建设世界民主运动”讨论会上的主调演讲。此次会议由国家民主基金会、印度产业联盟和新德里政策研究中心赞助。美国阿弗雷德·克诺夫出版社今年年底出版的阿玛蒂亚·森《自由的发展》一书，更详尽地讨论了本文的论点） &lt;br id="c.qt17"&gt;&lt;br id="c.qt18"&gt;一九九七年夏天，日本一家重要报纸问我，二十世纪发生的最重要事件是什麽？这是一个启人思迪的问题。过去的一百年发生了不少重要事件。主宰十九世纪世界的一些欧洲帝国，特别是英帝国和法帝国，已走向结束。法西斯主义和纳粹主义兴起和灭亡。共产主义的兴盛和衰亡 ( 如前苏联 - 东欧集团 ) ，或发生剧烈改变 ( 如中国 ) 。西方国家居支配地位的世界经济转变为日本、东亚、东南亚具有更大优势的世界经济。虽然後者目前出现了一些金融和经济上的问题，但这并没有改变数十年来世界经济的这种发展趋势 ( 日本的经济转变花了将近一百年时间 ) 。过去的一百年的确发生了许多重要的事件。 &lt;br id="c.qt20"&gt;&lt;br id="c.qt21"&gt;尽管如此，在二十世纪出现的各项发展中，我毫无困难地挑选出一项该时期的最重要发展：民主的兴起。这并不是说其他的发展不重要。但我认为，人们在遥远的未来回顾本世纪发生的事件时，他们会发现，必须把民主制成为占优势地位的政府形式置於最重要的地位。 民主的观念当然起源於两千多年前的古希腊。包括印度在内的其他一些国家也有过一些零星的民主化尝试，但民主的观念确实形成於希腊，而且，在希腊崩溃并被更为威权主义的政府取代之前，民主被认真地，尽管是在一种有限程度上付诸实践。其他地方没有出现过任何形式的民主制度。 &lt;br id="c.qt23"&gt;&lt;br id="c.qt24"&gt;民主制作为一种可以运作的政府制度，是隔了很长一段时间之後，才慢慢重新出现并获得最终胜利。在这个过程中，有许多事件帮助了民主的复苏，包括一二一五年英国的大宪章运动，十八世纪的法国革命和美国革命，和十九世纪欧洲和北美选举权的扩大。然而，到二十世纪，民主才成为任何国家政府应具有的“常规”形式，无论这个国家是在欧洲、美洲、亚洲或非洲。 &lt;br id="c.qt26"&gt;&lt;br id="c.qt27"&gt;民主是一种普遍性制度，这一观念非常新颖，而且实质上是二十世纪的产物。用大宪章限制国王权力的英国反叛者们，将民主制完全视为地方性的需要。相比之下，追求美国独立的战士和法国革命者，对於民主成为一种普遍制度的发展贡献极大，但其实际要求的核心仍然是地方性的，在效果上仅限於大西洋两岸，并且以该地区特殊的经济、社会和政治历史为基础。 &lt;br id="c.qt29"&gt;&lt;br id="c.qt30"&gt;在整个十九世纪，政治理论家们讨论某个国家是否“适用於民主制”，这是很自然的事。只有在二十世纪，这种讨论才发生变化。政治理论家们认识到这个问题本身就是一个错误的问题：不需要判定某个国家是否适用於民主制，相反，国家必须通过民主制才能适应社会需要。将民主的适用范围扩展到具有不同历史、文化和富裕程度的数十亿人，这的确是一项惊人的变化。 &lt;br id="c.qt32"&gt;&lt;br id="c.qt33"&gt;正是在本世纪，人们终於接受“所有成人的普选权”必须包括“所有成人”，不仅包括男人还包括女人。今年一月我见到一位非常出名的女性 ---- 瑞士总统露丝·德雷佛斯，她使我回想起仅在四分之一世纪以前，瑞士妇女还没有投票权。我们终於认识到，民主的普遍性就像善行一样，是没有限制的。 &lt;br id="c.qt35"&gt;&lt;br id="c.qt36"&gt;我不否认，民主具有普遍性的说法受到了来自各种方向、采用各种形式的挑战。这也就是本文讨论的主题之一。我不得不讨论民主是一种普遍价值的观点及其相关的争论。但在讨论之前，我们一定要清楚认识到，民主已成为当今世界中一种处於优势地位的信念。 &lt;br id="c.qt38"&gt;&lt;br id="c.qt39"&gt;任何时代和社会都有一些处於优势地位的信念，它们就像电脑程序中的预设 (default) 指令组，被当做一种应该普遍遵守的规则。除非以某种方式明确地加以否定，它们的内容一般被认为是正确的。在世界各国尚未全部接受民主观念、也未全部采用民主制的情况下，民主制现已被普遍地认为是一种正确的制度。诋毁民主和反对民主的人，现在完全处於守势地位。 &lt;br id="c.qt41"&gt;&lt;br id="c.qt42"&gt;这一历史性变化是不久之前才发生的，当时主张民主制适合於亚洲和非洲的人处於绝望的境地。虽然我们现在有充足理由与那些公开或隐含地反对民主制的人展开论战，我们必须清楚看到，和数世纪以前相比，普遍的观念环境发生了多麽大的变化。某个国家 ( 南非、柬埔寨或智利 ) 是否“适用於民主制”这类问题，尽管在十九世纪的话语中非常流行，我们讨论时却无需每次都从头开始，因为我们现已认为这是理所当然的事。认识到民主是一种普遍适合的制度，并且正在成为一种普遍价值，这是思想史上的一场伟大革命，也是二十世纪的主要贡献之一。这就是我们讨论民主是一种普遍价值时所处的大环境。 &lt;br id="c.qt44"&gt;&lt;br id="c.qt45"&gt;&lt;b id="c.qt46"&gt;印度的经验&lt;/b&gt; &lt;br id="c.qt47"&gt;&lt;br id="c.qt48"&gt;民主的实践效果如何？现在没有人会真正怀疑民主在美国、英国、法国等国所起的好作用，但对於世界上许多较穷的国家，这仍然是一个颇有争议的话题。本文不打算详细探讨民主的历史记录，但我认为民主的实践效果相当好。 &lt;br id="c.qt50"&gt;&lt;br id="c.qt51"&gt;印度当然是这种争论的主要战场之一。英国人在反对印度独立时，非常怀疑印度人管理自己国家的能力。印度一九四七年独立时的状况确实非常混乱。印度政府缺乏经验，分治状态极不稳定，政治组合不明朗，加上普遍存在种族暴力和社会动乱。人们对於印度会成为一个民主的统一国家缺乏信心。但半个世纪以後，以和平手段解决困难问题的印度民主制，其实践效果相当好。政治分歧主要是通过法律来解决。按照选举和国会规则来组织政府。印度这个由各种不同成份草率组合起来的国家，却作为一个民主的政治单位而生存下来，并运作得相当好。它确实是通过实行民主而结为一体。 &lt;br id="c.qt53"&gt;&lt;br id="c.qt54"&gt;印度的生存经历了严重的挑战。这些挑战包括解决多种语言和多种宗教的问题。宗教和种族上的不同往往容易被宗派政客利用，而且确实在一些问题上受到利用 ( 例如最近数月发生的事件 ) ，从而引起全国的极大惊恐。但实际上，宗派暴力引起的惊恐，受到全国各阶层的谴责，这就为反对狭隘宗派主义最终提供了重要的民主保障。对於印度这样一个成份复杂国家的生存和兴旺，这是非常重要的保障。印度不仅有其主要的教派印度教，还拥有人数居世界第三的穆斯林教徒，数百万基督教和佛教徒，以及居世界第一的锡克教徒、帕西教徒和耆那教徒。 &lt;br id="c.qt56"&gt;&lt;br id="c.qt57"&gt;&lt;b id="c.qt58"&gt;民主与经济发展&lt;/b&gt; &lt;br id="c.qt59"&gt;&lt;br id="c.qt60"&gt;人们常说，非民主国家的经济发展速度更快。这种观点的提倡者是新加坡领袖和前总理李光耀，因而它有时被称为“李氏假说”。的确，南韩、新加坡和改革後的中国等威权国家的经济发展速度，高於印度、牙买加、哥斯达黎加等威权性较少的国家。然而李氏假设的根据是一些零星经验，和非常有选择性的有限资料，而不是对范围广泛的现有资料进行的普遍性统计研究。根据非常有选择性的资料，不可能建立这类普遍关系。我们不能把新加坡或中国的高速经济增长，作为威权国家更能促进经济发展的“确凿证据”。同样，我们也不能根据非洲的民主绿洲博茨瓦纳，在数十年内其经济增长率居非洲第一、在全世界也名列前茅，而得出相反结论。我们需要进行更多的系统性经验研究，才能得出结论。 &lt;br id="c.qt62"&gt;&lt;br id="c.qt63"&gt;事实上，没有可信的普遍证据可以证明，威权统治和压迫政治权利与公民权利确实有助於经济发展。普遍的统计资料的确不支持这种推论。罗伯特·巴洛 (Robert Barro) 或亚当．普泽沃斯基 (Adam Przeworski) 等人的系统性经验研究，并不支持政治权利与经济发展相冲突的观点。两者之间的定向关系可能取决於许多其他环境条件。有一些统计学研究提出，两者存在一种微弱的负向相关关系，另外一些研究却提出存在强烈的正向相关关系。综合考虑所有的比较研究之後可以看出，经济增长与民主之间很可能不存在任何方向的明确关系。虽然民主与政治自由本身极为重要，但两者的关系问题并没有获得解决。 &lt;br id="c.qt65"&gt;&lt;br id="c.qt66"&gt;这个问题还涉及经济学研究方法的基本问题。我们不仅研究统计学联系，还要研究与经济增长与发展有关的因果过程。对於导致东亚国家经济成功的经济政策和环境条件，我们现已有相当透彻的了解。尽管各种经验研究具有不同的重点，对於一系列有助於经济发展的政策，学术界已有广泛的共识，这些政策包括开放竞争，利用国际市场，鼓励投资和出口的公共政策，高水平的文化教育，成功的土地改革，以及扩大参与经济发展过程的其他社会机会。然而，没有理由假设，这些政策与民主相冲突，因而必须用南韩、新加坡和中国的威权主义手段来强力压制民主。相反，压倒性的证据证明，快速发展经济需要一种友好的经济环境，而不是一种严厉的政治制度。 &lt;br id="c.qt68"&gt;&lt;br id="c.qt69"&gt;为了全面考虑这个问题，我们必须超越狭隘的经济增长领域，考察更宽阔的经济发展需求，包括对经济与社会安全的需求。我们必须考察政治权利与公民权利，和防止严重灾难之间的关系。政治权利与公民权利使人民获得一个好机会，来提醒政府注意普通民众的需要、□□取合适的措施。政府对人民遭受严重灾难的反应，取决於它受到的压力。投票选举、批评、抗议等政治权利的表现，确实能够对政府的运作提供一种真正不同的政治鼓励机制。 &lt;br id="c.qt71"&gt;&lt;br id="c.qt72"&gt;我在其他地方讨论过一项重要规律，即在令人恐怖的世界饥荒史上，新闻自由具有相对独立地位的任何民主国家，从未发生过真正的饥荒。对於这个规律，我们无论在任何地方都找不出例外，无论是在最近发生饥荒的埃塞俄比亚、索马里等独裁国家，还是三十年代发生饥荒的苏联，或者一九五八至一九六一年大跃进失败後发生大饥荒的中国，或者在外国人统治时期发生饥荒的爱尔兰和印度。尽管在许多方面中国德经济发展比印度好得多，但中国仍然发生过饥荒，而且确实是全世界有史以来最严重的饥荒。中国一九五八至一九六一年的饥荒饿死近三千万人，而在整整三年内，中国政府的错误政策一直得不到纠正，其原因就在於中国没有议会中的反对党，没有新闻出版自由，没有多党制选举。由於没有人敢批评中国政府，即使每年饿死数百万人，其错误政策依然能够持续下去。现在北韩和苏丹的饥荒也属於类似情况。 &lt;br id="c.qt74"&gt;&lt;br id="c.qt75"&gt;饥荒似乎往往与自然灾害有关系。评论家经常简单地用自然灾害来解释发生饥荒的原因，如中国在大跃进期间发生水灾，埃塞俄比亚发生乾旱，或者北韩因天灾而农作物歉收。然而，其他许多国家也发生过类似的甚至更严重的自然灾害，但由於政府采取负责的干预措施，减轻了民众的饥饿，妥善地解决了饥荒问题。由於饥荒的主要受害者是穷人，政府可以通过雇佣计画等政策来提高穷人的收入，使饥荒受害者得到食物，从而防止民众的死亡。甚至在一些发生严重旱灾、水灾等天灾的最贫穷民主国家，如一九七三年的印度，八十年代初期的津巴布韦或博茨瓦纳，民众也能够吃饱肚子，而没有出现饥荒。 &lt;br id="c.qt77"&gt;&lt;br id="c.qt78"&gt;只要政府认真努力，饥荒并不难预防。而一个民主政府在面对选举、反对党和独立报纸的情况下，只能这样作。印度在独立之前被英国统治的时代，发生过多次饥荒。我记得印度最後一次饥荒是在一九四三年，即独立之前四年，我当时还是儿童。但在印度出现多党制和新闻自由之後，饥荒就消失了。 &lt;br id="c.qt80"&gt;&lt;br id="c.qt81"&gt;我的研究工作，特别是我和让．德累兹 (Jean Dreze) 的合作研究，考察过这个课题，所以我就不用在这里饶舌。饥荒问题仅仅是民主可以解决的例子之一，尽管在许多方面它是最容易分析的例子。在防止经济与社会灾难方面，政治权利与社会权利普遍扮演了正面角色。在正常情况下，人们也许不会怀念民主的这种工具作用。如果因为某种原因，经济情况恶化，民主制度所具有的政治鼓励机制，就会发挥巨大的实际作用。 &lt;br id="c.qt83"&gt;&lt;br id="c.qt84"&gt;这里有一个重要教训。许多专家治国论者在宣传市场制度可以提供经济鼓励机制的同时，却忽略了政治鼓励机制。他们选择了是一组极不均衡的基本规则。一个国家在走好运，没有严重灾害威胁，一切发展顺利的时候，人们不大会怀念民主的保护功能。但如果经济或其他条件发生变化，或者政策失误，一个似乎是健康的国家就潜伏著不安全的危险性。 &lt;br id="c.qt86"&gt;&lt;br id="c.qt87"&gt;最近东亚和东南亚出现的问题，就是不民主制度带来的惩罚。这在两个方面特别明显。首先，南韩、泰国、印尼等国发生的金融危机，与这些国家的商业运作缺乏透明度，特别是与金融政策缺乏公众的监督密切相关。导致这一危机的核心原因是缺乏一个有效的民主论坛。其次，一旦金融危机导致全面经济衰退，印尼等国的人们就特别怀念民主的保护功能，即民主国家防止饥荒的那种保护功能。在非民主国家，受害者没有地方发出他们的声音。 &lt;br id="c.qt89"&gt;&lt;br id="c.qt90"&gt;过去数十年来，这些国家的经济每年增长百分之五至百分之十，因而其国民生产总值减少百分之十似乎并不算严重问题。但如果经济收缩的负担没有被广泛地分担，而是集中在承受力最小的一部分失业者或者被解雇者身上，经济衰退就会严重破坏民众生活，使数百万人陷於悲惨境地。在经济良好时，印尼人民可能并不怀念民主。但在经济危机的分担很不平等的国家，民主的缺乏使人们发不出声音或者根本没有声音。人们在最需要民主的保护功能时，才会最强烈地怀念它。 &lt;br id="c.qt92"&gt;&lt;br id="c.qt93"&gt;&lt;b id="c.qt94"&gt;民主的功能&lt;/b&gt; &lt;br id="c.qt95"&gt;&lt;br id="c.qt96"&gt;到目前为止，本文的分析局限在民主的批评者、尤其是经济方面的批评者所限定的范围。在後面我将讨论民主的文化方面批评者的论点。我现在要从正面进一步分析民主所做的事，以及说它是一种普遍价值的根据。 &lt;br id="c.qt98"&gt;&lt;br id="c.qt99"&gt;民主究竟是什麽？我们绝不能把民主等同於多数人统治。民主的内容很复杂，它的确包括投票和尊重选举结果，但它还包括保护自由，尊重法律机构，保障自由讨论，和发表新闻和公正评论时不受政府的检查。如果不同派别没有获得充分机会表达自己的观点，或者选民没有获得新闻和思考不同观点的自由，选举也会变成一场大骗局。民主是一套需求系统，而不仅是在孤立情况下所选择的某种机械性的方法 ( 如多数决 ) 。 &lt;br id="c.qt101"&gt;&lt;br id="c.qt102"&gt;用这种观点来看，民主及其是普遍价值说法的优点，与某些特定美德及其自由实际很相似。我们可以分辨出民主丰富公民生活的三种方式。 &lt;br id="c.qt104"&gt;&lt;br id="c.qt105"&gt;首先，政治自由是人类普遍自由的一部分。实行公民权利与社会权利，是作为社会存在的个人，其幸福生活的关键组成部分。政治参与与社会参与对於人类的幸福生活具有天然的价值。人民不能参与社会政治生活是一种非常悲惨的处境。 &lt;br id="c.qt107"&gt;&lt;br id="c.qt108"&gt;第二，正如我在驳斥民主与经济发展相冲突的观点时所指出，在促使政府倾听人民发出的包括经济需求在内的各种需求的声音方面，民主具有一种重要的工具价值。 &lt;br id="c.qt110"&gt;&lt;br id="c.qt111"&gt;第三，实行民主可以为公民提供一个相互学习的机会，并有助於整个社会形成价值观和找到需要优先解决的问题。这一点需要作进一步分析。即使是理解“需求” ( 包括“经济需求” ) 的概念，也必须让公众对各种资讯、观点和分析进行讨论和交换意见。在这种意义上，民主除了具有在公民幸福生活的天然价值和政治决策方面的工具性价值外，还具有重要的建设性价值。我们在讨论民主的普遍价值时，必须进行这种多方面的分析。 &lt;br id="c.qt113"&gt;&lt;br id="c.qt114"&gt;要了解包括“经济需求”在内的人民的各种“需求”，就需要人民行使其政治权利和公民权利。要真正掌握经济需求的内容和及其影响，必须进行讨论和意见交换。政治权利和公民权利，特别是与保障人民公开讨论、辩论、批评和坚持异议有关的权利，乃是制订出资讯充分的、深思熟虑的政策这一过程的核心。这种过程对於形成社会的价值观与发现重要问题也极为重要。一般来说，没有公开的讨论，不进行公开地交换意见和争论，我们就不能发现需要优先处理的社会问题。 &lt;br id="c.qt116"&gt;&lt;br id="c.qt117"&gt;事实上，在评估社会与政治问题时，公开对话的范围和效果往往被低估。例如，公开讨论对於许多发展中国家的高生育率的降低，起著重要作用。大量证据表明，公开讨论高生育率对社区的恶劣後果，特别是对青年妇女生活的恶劣影响，对於印度文化水平较高地区生育率的显著下降，起了很大作用。印度喀拉拉邦或泰米尔纳德邦现在开始形成现代幸福家庭是小家庭的观念，这种观念的产生就与公众的广泛讨论有密切关系。喀拉拉邦现在的生育率为百分之一点七，与英国和法国差不多，却比中国的百分之一点九低。这种结果并非通过强制方法达到，而是由於社会形成了新的价值观，而政治对话与社会对话在这一过程中扮演了重要角色。喀拉拉邦民众，尤其是妇女的文化水平较高 ( 比中国任何省份都高 ) ，这也是社会政治对话成为可能的重要因素。 &lt;br id="c.qt119"&gt;&lt;br id="c.qt120"&gt;人类社会存在著各种悲剧与危险处境，其中有些比较容易通过社会手段来加以克服。人类的各种危险处境应该是我们辨识自己“需求”的根据。例如，有许多我们很向往的东西，可能被我们视为自己的“需求”。例如，我们可能像古人那样，希望自己长生不老。但我们并不把长生不老视为一种“需求”，因为显然做不到。我们关於“需要”的观念，与我们知道有些危险处境可以预防，而且知道其预防办法，有著密切的关系。在政府了解民众需求和相信政策的可行性 ( 特别是社会可行性 ) 的过程中，公共讨论扮演了关键角色。政治权利，包括自由表达与讨论的权利，不仅对於促进政府对经济需要作出反应很重要，对於了解经济需要的过程本身也非常重要。 &lt;br id="c.qt122"&gt;&lt;br id="c.qt123"&gt;&lt;b id="c.qt124"&gt;价值的普遍性&lt;/b&gt; &lt;br id="c.qt125"&gt;&lt;br id="c.qt126"&gt;如果上述分析正确，民主的价值就不仅在於它具有某一项优点，而在於它具有的许多优点。这些优点包括：第一，自由与政治参与在人类生活中的天然重要性；第二，在促使政府对公众需要负责方面，民主提供政治鼓励机制的工具重要性；第三，民主对於形成价值观、理解公众需要、权利和职责的建设性作用。根据这一分析，我们现在可以讨论本文的中心论点，即民主是一种普遍价值。 &lt;br id="c.qt128"&gt;&lt;br id="c.qt129"&gt;在讨论这个问题时，人们有时说，并非人人都同意民主具有决定性作用，尤其是把民主与引起我们向往的其他东西相比的时候更是如此。情况的确如此，这里不存在共识。但有些人将不存在共识当做民主并非普遍价值观的充分证据。 &lt;br id="c.qt131"&gt;&lt;br id="c.qt132"&gt;显然我们必须从方法论开始讨论：什麽是普遍价值？某种被视为普遍价值的东西是否必须要获得所有人的共识？如果必须如此，那麽普遍价值就可能不存在，因为没有哪种价值 ( 包括母爱 ) 没有遭到某些人的反对。我认为，普遍价值并不需要人人赞同，而是任何地方的人都可能有理由认为它是有价值的。 &lt;br id="c.qt134"&gt;&lt;br id="c.qt135"&gt;甘地提出非暴力是普遍价值的观点时，他没有说任何人都认为非暴力是自己的行动准则，而只是说任何人都有充分理由认为非暴力有价值。与此类似，泰戈尔提出思想自由是普遍价值时，也没有说所有人都接受这项原则，而是说所有人都有足够理由接受它，他对这些理由作了大量探索、说明和讨论。从这种角度来看，关於某种东西是普遍价值的任何主张，都与某些反事实的 (counterfactual) 分析有关，尤其是人们是否可以在他们尚未充分思考过的主张中看到某种价值。不仅是关於民主，所有关於普遍价值的主张，都隐含著这种假设。 &lt;br id="c.qt137"&gt;&lt;br id="c.qt138"&gt;我认为，正是在这种隐含性的假设方面，人们对民主的态度在二十世纪发生了最大的转变。对於某个没有民主的、许多人没有机会考虑民主制的国家，我们在讨论民主问题时，往往假设一旦民主变成他们的生活现实，那里的人民就会赞同它。十九世纪的人通常不作这种假设。这种被认为是天然的假设 ( 即我前面所说的“预设”立场 ) 在二十世纪发生了剧烈变化。 &lt;br id="c.qt140"&gt;&lt;br id="c.qt141"&gt;我还必须指出，这一变化在很大程度上是来自对二十世纪历史的考察。随著民主的扩展，民主的支持者是越来越多，而不是日益减少。起源於欧洲和美国的民主制度，现已扩散到地球的许多遥远角落，这些地方的人民自愿参与并接受民主制度。而且，如果某个民主制度遭到推翻，民众就会举行广泛的抗议，尽管这些抗议後来往往遭到残酷镇压。许多人□意冒著生命危险为恢复民主而战斗。 &lt;br id="c.qt143"&gt;&lt;br id="c.qt144"&gt;有些人反对民主是普遍价值，其理由并不是民主没有得到所有人赞同，而是各国的国情不同。这些不同的国情有时是指某些国家的贫穷。按照他们的说法，穷人关心的是面包，而不是民主。这种流行说法存在两个方面的错误。 &lt;br id="c.qt146"&gt;&lt;br id="c.qt147"&gt;首先，如上所述，民主的保护作用对於穷人特别重要。显然这适用於面临饥饿的饥荒受害者。它也适用於金融危机中从经济阶梯上摔下来的赤贫者。有经济需求的人需要在政治上发出自己声音。民主并不是一种要达到普遍富裕後才需要的奢侈品。 &lt;br id="c.qt149"&gt;&lt;br id="c.qt150"&gt;其次，没有证据证明，在可以选择的情况下，穷人会拒绝民主。七十年代中期，印度政府宣布在“紧急状态”取消各种政治权利与公民权利时，也提出了类似理由，在随後的选举中，选民们以不同的立场而分裂成旗帜鲜明的两派。在这场至关紧要的选举中，这个问题成为双方争论的焦点。大多数选民坚决反对取消基本的政治与於公民权利。印度是世界上最贫穷的国家之一，其选民对於其基本自由与权利的重视程度，超过对於经济困境的重视。 &lt;br id="c.qt152"&gt;&lt;br id="c.qt153"&gt;印度的历史经验，完全否定了穷人不关心公民政治权利的说法。考察南韩、泰国、孟加拉、巴基斯坦、缅甸、印尼等亚洲国家争取民主自由的斗争之後，我们可以得到相同结论。同样，尽管非洲国家普遍否定政治自由，一旦条件允许，那里就出现反对这种压迫的运动与抗议。 &lt;br id="c.qt155"&gt;&lt;br id="c.qt156"&gt;&lt;b id="c.qt157"&gt;来自文化差异的理由&lt;/b&gt; &lt;br id="c.qt158"&gt;&lt;br id="c.qt159"&gt;还有一些为民主的地区差异性辩护的论点，不是与经济环境有关，而是与文化差异有关。这些论点中最有名的也许是所谓的“亚洲价值观”，据说亚洲人具有重视纪律而不重视政治自由的传统，因而这些国家对民主必然持更为怀疑的态度。我在“卡内基道德与国际事务理事会”的讲座中比较详细地讨论了这种观点。 &lt;br id="c.qt161"&gt;&lt;br id="c.qt162"&gt;在亚洲文化史上，尤其是在印度、中东、伊朗和亚洲其他国家的古典传统中，我们很难找到支持这种观点的任何确实根据。例如，公元前三世纪印度帝王 Ashoka 的铭文中就有关於容忍多元主义、保护少数是国家职责的最早最明确的记载。 &lt;br id="c.qt164"&gt;&lt;br id="c.qt165"&gt;亚洲面积广袤，人口占全世界的百分之六十。对亚洲的多种民族归纳出普遍的结论很不容易。主张“亚洲价值观”的人有时首先将东亚当作特别适合这种主张的地区。尽管有人野心勃勃地主张，亚洲各国都很相似，但关於东西方差异的普遍命题往往以泰国以东的亚洲国家为例。我们应该感谢李光耀，他清晰而充分地解释了这种观点，而其他人的解释往往模糊不清。李光耀说，“西方关於社会和政府的观念与东方有根本不同”，“我所说的东亚，是指韩国、日本、中国、越南，它们与东南亚不同，後者是中国文化与印度文化的混和物，尽管印度文化本身也强调类似的价值观”。 &lt;br id="c.qt167"&gt;&lt;br id="c.qt168"&gt;然而，在东亚的内部，不仅在日本、中国、韩国和其他国家之间，而且在每一个国家内部，存在著的差异很大的文化成份。人们在解释“亚洲价值观”时经常引用孔子的话，但这些国家的文化不仅受到孔子的影响，也受到其他影响。例如，日本、中国和韩国的佛教传统，历史悠久而影响广泛，在一千五百多年内具有很大势力。另外，这些国家还受到基督教的相当大影响。这些国家中，没有哪个国家存在一种崇尚秩序胜於崇尚自由的均质文化。 &lt;br id="c.qt170"&gt;&lt;br id="c.qt171"&gt;而且，孔子本人也不主张对国家的盲目崇拜。子路曾向他请教如何为君王服务，孔子的回答可能要引起当今威权政府新闻检查官的怀疑。他说：“即使得罪君王也要讲真话” ( 《论语·宪问篇》：“子路问事君，子曰勿欺也而犯之” ) 。孔子并非反对在现实中要谨慎和讲究策略，而是主张在必要时人民可以反对坏的政府。他说：“如果政府表现好，要大胆说话和行事；如果政府表现不好，要行事勇敢但说话温和。” ( 论语·宪问篇》：“邦有道危言危行，邦无道危行言逊” ) 。 &lt;br id="c.qt173"&gt;&lt;br id="c.qt174"&gt;孔子确实明确指出，想象中的宏伟“亚洲价值观”的两个标尺，即对国家的忠诚 ( 忠君 ) 与对家庭的忠诚 ( 孝 ) 之间，可能发生严重冲突。许多主张亚洲价值观的人认为国家角色是家庭角色的延伸。但正如孔子所说，两者是相互冲突的。叶公对孔子说：“我有一个刚直不阿的邻人，他父亲偷了一只羊，他就谴责自己的父亲。”孔子答道：“在我的邻人中间，刚直不阿的人行事不同：父子相互掩盖，这也是刚直不阿。” ( 《论语·子路篇》：“叶公语孔子曰：吾党有直躬者，其父攘羊而子责之。孔子曰：吾党之直者异於是，父为子隐，子为父隐，直在其中矣。” ) &lt;br id="c.qt176"&gt;&lt;br id="c.qt177"&gt;将亚洲价值观单一地解释为反对民主与政治权利，这种观点经不起严格推敲。我们不应该过於严格地批评这类观点缺乏学术证据，因为提出这类观点的并不是学者而是政客，而且往往是威权政府的正式或非正式的代言人。有趣的是，我们学者对实际政治的态度也许不大现实，但现实政客讨论学术问题的态度却非常不实事求是。 &lt;br id="c.qt179"&gt;&lt;br id="c.qt180"&gt;当然，在亚洲传统中不难找到关於威权主义的记述，但西方经典中也很容易发现这类记载。只要查一下柏拉图或者阿奎纳 (Aquinas) 的著作，就可发现崇尚纪律并非亚洲的专利品。仅仅因亚洲存在一些关於纪律和秩序的记载，就否定民主是普遍价值的可能性，就犹如根据柏拉图或阿奎纳的著作 ( 姑且不提欧洲中世纪的大量赞成宗教裁判的著作 ) ，而反对民主可能是现今欧洲或美国政府的一种自然形式。 &lt;br id="c.qt182"&gt;&lt;br id="c.qt183"&gt;由於当代世界尤其是中东的政治斗争经验，人们常常把伊斯兰教描绘成根本不容忍或敌视个人的自由。但同一文化传统内存在著多样性的规律同样适用於伊斯兰教。印度的阿克巴及其他大多数莫卧尔王朝帝王 (Aurangzeb 是明显例外 ) ，是在理论与实践上实行政治宽容和宗教宽容的的最佳范例。土耳其的帝王比同时代的欧洲帝王更为宽容。开罗和巴格达也有不少类似例子。十二世纪的伟大犹太学者 Maimonides 不得不逃离其出生地 ---- 不宽容的、迫害犹太人的欧洲，在宽容的开罗得到萨拉丁苏丹的庇护从而获得安全。 &lt;br id="c.qt185"&gt;&lt;br id="c.qt186"&gt;多样性是世界上大多数文化的特徵。西方文明也不例外。民主在现代欧洲国家获得胜利，这主要是欧洲自启蒙运动和工业革命以来，特别是在二十世纪逐渐形成一项共识的结果。把这个现象解释为西方一千多年来对於民主的历史使命，然後与非西方传统 ( 把每一种非西方传统视为一种单质文化 ) 对比，这是一种绝大的错误。这种过於简单化的倾向，不仅存在於一些亚洲国家政府发言人的著作，也存在於一些西方学者的著作中。 &lt;br id="c.qt188"&gt;&lt;br id="c.qt189"&gt;让我举一位重要学者的著作为例，在其他许多方面，这位学者的著作给人留下了深刻印象。这就是杭亭顿关於文明冲突的著作。他没有充分认识到各种文化的多元性。他明确地得出结论说：在文明社会中处於独特地位的西方，存在著“一种个人主义观念和关於权利与自由的传统”。杭亭顿还说：“在西方现代化之前，西方文明就出现了不同於其他文明的核心特徵。”他认为，“在西方现代化之前很久，西方就已经是西方”。我认为，这一论点经不起历史的检验。 &lt;br id="c.qt191"&gt;&lt;br id="c.qt192"&gt;对於亚洲国家政府发言人的所谓“亚洲价值观”与所谓西方价值观相对立的每一种说法，似乎存在著西方知识份子从另一角度得出的相应说法。假设对於亚洲的每一种说法，西方都有势均力敌的说法与之相对应。即使把双方的说法加在一起，也无法否定民主是一种普遍价值。 &lt;br id="c.qt194"&gt;&lt;br id="c.qt195"&gt;&lt;b id="c.qt196"&gt;结 论&lt;/b&gt; &lt;br id="c.qt197"&gt;&lt;br id="c.qt198"&gt;我已经讨论了有关民主是一种普遍价值的许多问题。民主的价值包括其在人类生活中的天然重要性，在产生政治鼓励机制方面的工具性作用，以及在形成社会价值，在了解民众需求、权利、职责方面的效力和政策可行性方面的建设性功能。这些优越性并不具有地区性特徵。崇尚纪律与秩序也不具有地区性特徵。价值的多元性似乎是大多数，甚至是所有文化的特徵。文化差异方面的讨论并不排斥，也不能限制我们现在可以作出的选择。 &lt;br id="c.qt200"&gt;&lt;br id="c.qt201"&gt;我们现在必须作出这种选择，特别是要强调民主的功能性作用，它是当今世界的民主制赖以立足的基础。我已经指出，用这样的方式来分析民主，具有强大的说服力，而且不受地区的局限。民主是一种普遍价值的主张，其最终的理由就来自这种分析。这就是本文讨论的核心。如果从来自不同历史背景的、假想的文化忌禁或假设的文明先决条件出发，就不可能得到这一结论。 &lt;br id="c.qt203"&gt;&lt;br id="c.qt204"&gt;□( 曹思华译，参考文献从略。) &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-6466787239077378637?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZtaZ90Oy7KzIIBE8VjCoJxh8gM0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZtaZ90Oy7KzIIBE8VjCoJxh8gM0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZtaZ90Oy7KzIIBE8VjCoJxh8gM0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZtaZ90Oy7KzIIBE8VjCoJxh8gM0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/CVNYl1gK0lo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/6466787239077378637/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=6466787239077378637" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/6466787239077378637?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/6466787239077378637?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/CVNYl1gK0lo/httpwww.html" title="阿玛蒂亚·森：民主是一种普遍价值观" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/07/httpwww.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUDQXkycSp7ImA9WxdWFk8.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-6221888027005676204</id><published>2008-07-09T09:06:00.001-07:00</published><updated>2008-07-09T09:17:50.799-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-09T09:17:50.799-07:00</app:edited><title>Google Lively</title><content type="html">Google最新推出Lively 服务，为用户创建一个虚拟的聊天环境，下面是个叫Lost的场景，挺酷的，不过刚开始用似乎挺麻烦的，进入房间后可以用鼠标任意拖动。试试...&lt;br /&gt;&lt;iframe marginwidth="0" marginheight="0" src="http://embed.lively.com/iframe?rid=3399687792768660690" frameborder="0" width="460" scrolling="no" height="400"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-6221888027005676204?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fwgA1Cd6W2djuAi2ppWGu2WlIpk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fwgA1Cd6W2djuAi2ppWGu2WlIpk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fwgA1Cd6W2djuAi2ppWGu2WlIpk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fwgA1Cd6W2djuAi2ppWGu2WlIpk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/C6pr8N6weT4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/6221888027005676204/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=6221888027005676204" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/6221888027005676204?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/6221888027005676204?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/C6pr8N6weT4/lost.html" title="Google Lively" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/07/lost.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcHQHY4fCp7ImA9WxdWE0k.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-3450962221049682465</id><published>2008-07-01T19:28:00.000-07:00</published><updated>2008-07-06T05:07:11.834-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-06T05:07:11.834-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="软件" /><category scheme="http://www.blogger.com/atom/ns#" term="幽默" /><title>《大腕》之程序员篇</title><content type="html">&lt;div&gt;一定得是N层结构，&lt;br /&gt;层数越多越好，层少了用户误会我们不重视，&lt;br /&gt;什么数据访问层呀，实体控制层啊，&lt;br /&gt;能给他加上的全加上。&lt;br /&gt;&lt;br /&gt;程序员一定都得是老鸟，30一下的基本不考虑，&lt;br /&gt;还得是清一色的外企空降兵，&lt;br /&gt;都有10年以上的编程经验的那种，用过的语言越多越好，&lt;br /&gt;编程都不带查MSDN的，牛吧！ &lt;a href="http://bp3.blogger.com/_qB1PewA0e3Y/SHC1PEb9xiI/AAAAAAAABGI/g04ovGGoO64/s1600-h/programmer-expression-mic.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5219871238616106530" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://bp3.blogger.com/_qB1PewA0e3Y/SHC1PEb9xiI/AAAAAAAABGI/g04ovGGoO64/s320/programmer-expression-mic.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;程序员各个都配IBM笔记本，&lt;br /&gt;CPU要3G以上的，内存硬盘和屏幕都要最大的，&lt;br /&gt;扩展槽别剩下，能插上的全插上。&lt;br /&gt;能安的操作系统全安上，&lt;br /&gt;开机一屏幕上就一堆系统等你选，&lt;br /&gt;倍有面子！&lt;br /&gt;&lt;br /&gt;系统平台就得是J2EE，&lt;br /&gt;人家竞争对手除了C++就是Java，&lt;br /&gt;你要用.NET都不好意思和别人打招呼。&lt;br /&gt;你说这样的系统设计出来得卖多少钱？&lt;br /&gt;我觉得怎么着也得100万吧？&lt;br /&gt;100万，那是单机版！&lt;br /&gt;1000万起！&lt;br /&gt;你还别嫌太贵，还不免实施服务费。&lt;br /&gt;你得研究有钱用户的心理，&lt;br /&gt;愿意花1000万买这套软件用的，&lt;br /&gt;根本不在乎多花上几百万？&lt;br /&gt;&lt;br /&gt;什么叫软件泡沫，你知道什么？&lt;br /&gt;软件泡沫就是做都做最复杂的，&lt;br /&gt;用就得用最贵的，还得特难用，显的用户水平高。&lt;br /&gt;&lt;br /&gt;所以我们搞软的口号就是，&lt;br /&gt;不求好用，但求费劲！&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-3450962221049682465?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Uo-54JncwoGqihV0PCF9YiVCljA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Uo-54JncwoGqihV0PCF9YiVCljA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Uo-54JncwoGqihV0PCF9YiVCljA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Uo-54JncwoGqihV0PCF9YiVCljA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/e0sCCyquqEs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/3450962221049682465/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=3450962221049682465" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/3450962221049682465?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/3450962221049682465?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/e0sCCyquqEs/blog-post.html" title="《大腕》之程序员篇" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp3.blogger.com/_qB1PewA0e3Y/SHC1PEb9xiI/AAAAAAAABGI/g04ovGGoO64/s72-c/programmer-expression-mic.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/07/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08BRHszcSp7ImA9WxdaE08.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-1837871606884839996</id><published>2008-06-24T18:12:00.000-07:00</published><updated>2008-08-21T05:30:55.589-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-21T05:30:55.589-07:00</app:edited><title>美国兰德公司对中国人的评价</title><content type="html">&lt;div id="clickeye_content"&gt;&lt;div id="w7.m"&gt;&lt;p id="w7.m3" style="TEXT-ALIGN: center"&gt;&lt;b id="w7.m4"&gt;&lt;span id="w7.m5"  style="font-size:180%;"&gt;美国兰德公司对中国人的评价&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p id="w7.m6"&gt;&lt;span id="t-fe0"  style="font-size:78%;"&gt;&lt;span id="t-fe1"  style="color:#0b5394;"&gt;美国兰德公司是一家著名的非盈利的研究机构，为美国官方提供"客观的分析和有效的解决方案"。最近，他们公布了一份对中国现状分析报告，即有肯定，也有严厉批评，值得国人反省。本文观点来自兰德公司亚太政策中心&lt;/span&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p id="t-fe2"&gt;&lt;/p&gt;&lt;p id="w7.m7"&gt;如果20世纪的中国是一个富裕和统一的国家，我们会有一个完全不同的第一次世界大战，我们就不会有第二次世界大战而是第二次欧洲大战。 中国能够阻止日本侵略或者打败日本。美国在这些冲突上的花费从根本意义上会减少很多，因为珍珠港事件不会发生。我们和整个世界，更不用说10亿中国人，一 个多世纪以来，已经为中国的弱小付出了惨重的代价。世界需要一个健康的中国。&lt;/p&gt;&lt;p id="w7.m10"&gt;中国的需求对日本走出衰退起到了促进作用。日本状况给世界经济带来了风险。关于这一点，怎么说都不夸张。日本巨额的债务会产生多米诺骨 牌效应，逐渐波及到全世界。在中国有力的帮助下，危险似乎已经过去。中国全球化给美国带来了很多影响。最明显的是，中国成为美国商品最大的市场。&lt;/p&gt;&lt;p id="w7.m11"&gt;可口可乐早就完成了那个看上去像是神话的目标：卖10亿瓶可口可乐；曾经嘲笑中国梦的通用在中国卖了很多的别克汽车，在困难时期，中国 带来的利润占通用利润的很大一部分；中国联想购买IBM个人电脑业务，挽救了这个垂死部门的工作岗位。中国提供更低价的生活必需品给美国人的生活水平做出 了很大的贡献，尤其是对我们不是那么富裕的居民而言。有迹象表明由于能够购买中国低价的出口货物，低收入美国人的生活水平可能提高了5%到10%。&lt;/p&gt;&lt;p id="w7.m12"&gt;中国金融体系的不合理意味著中国建造了垂死企业，导致巨大的生产力过剩。近些年来，中国财政政策上的反复无常导致过度建造，对铁、铝、 水泥和其他原材料产生了巨大的需求。日本人和现在的中国人看上去似乎会买下世界上所有的东西，但是当你看到他们的财政状况的潜在问题时，你会发现一个黑 洞。日本人在90年代陷入了这样一个黑洞，至今还在努力地爬出来。中国人很多年后仍将会为目前这种无节制的狂热的购买行为感到心痛。&lt;/p&gt;&lt;p id="w7.m15"&gt;目前，中国面临著巨大的挑战。中国的银行是我们所知道的世界上最糟糕的银行。中国每一代，都有相当于美国规模的人口从农村涌入城市。每 年，都有1200-1300万新工人加入就业大军。在制造业，生产力对就业的影响比我们国家要严重得多。到2020年，中国人口老龄化会使工作人口与不工 作人口的比率成为世界上最糟糕的，比日本更甚。如果没有特效的新政策的话，中国的经济在那个时期就会狠狠地撞墙。到2020年，以我们的标准来看，它会是 一个非常穷的国家。&lt;/p&gt;&lt;p id="w7.m16"&gt;中国人缺乏诚信和社会责任感。中国人不了解他们作为社会个体应该对国家和社会所承担的责任和义务。普通中国人通常只关心他们的家庭和亲属，中国的文化是建立在家族血缘关系上而不是建立在一个理性的社会基础之上。中国人只在乎他们直系亲属的福址，对与自己毫不相关的人所遭受的苦难则视而不见。毫无疑问，这种以血缘关系为基础的道德观势必导致自私，冷酷，这种自私和冷酷已经成为阻碍中国社会向前发展的最关键因素。&lt;/p&gt;&lt;p id="w7.m17"&gt;中国从来就没有成为一个法制社会，因为中国人的思维方式与守法行为格格不入。中国人老想走捷径。他们不明白这样一个事实：即成就来自于与努力工作和牺牲。中国人倾向于索取而不给予。他们需要明白一个道理：生活的真蒂不在于你你索取多少而在于你能给予社会和你的人类同胞多少。&lt;/p&gt;&lt;p id="w7.m18"&gt;大多数中国人从来就没有学到过什么是体面和尊敬的生活意义。中国人普遍不懂得如何为了个人和社会的福址去进行富有成效的生活。潜意识里，中国人视他们的生活目的就是抬高自己从而获得别人的认知。这样一来，一个人就会对"保有面子"这样微不足道欲望感到满足。"面子"是中国人心理最基本 的组成部分，它已经成为了中国人难以克服的障碍，阻碍中国人接受真理并尝试富有意义的生活。&lt;/p&gt;&lt;p id="w7.m19"&gt;这个应受谴责的习性使得中国人生来就具有无情和自私的特点，它已成为中国落后的主要原因。&lt;/p&gt;&lt;p id="w7.m20"&gt;中国人没有勇气追求他们认为正确的事情。首先，他们没有从错误中筛选正确事物的能力，因为他们的思想被贪婪所占据。再有，就算他们有能力筛选出正确的事情，他们也缺乏勇气把真理化为实践。&lt;/p&gt;&lt;p id="w7.m21"&gt;中国人习惯接受廉价和免费的事物，他们总是梦想奇迹或者好运，因为他们不愿意付出努力，他们总想不劳而获。很少有中国人明白一个事实， 就是威望和成就是通过一步步努力的工作和牺牲实现的，不付出就没有所得。简单来说，如果是为了谋生，那一个人只有去索取；但如果是为了生活，一个人必须要 去奉献。&lt;/p&gt;&lt;p id="w7.m22"&gt;由于在贫穷的环境下生长并且缺少应有的教育，大多数中国人不懂得优雅的举止和基本的礼貌。他们中的大多数人着装笨拙粗鄙却不感到害羞。他们在青少年时所受的教育就是如何说谎并从别人那里索取，而不是去与别人去分享自己的所有。&lt;/p&gt;&lt;p id="w7.m25"&gt;中国是一个物产丰富的国家。但无限制生育政策所带来恶果使得中国成为了无限廉价劳动力的输出国。这些输出也包括那些受过教育的劳力输出，除了他们的教育水平，实则和其他一般苦力没有本质上的区别。&lt;/p&gt;&lt;p id="w7.m26"&gt;中国大规模生产的便宜产品降低了输入这些产品的地区的商业信用度。由于技术落后，管理失败，中国制造的单位能耗要比发达国家如日本，美国高出很多。因此，随着出口额的增加，中国在扩大生产的同时丧失着宝贵的能源。同时，这种行为也严重的污染了环境，使中国变为全世界最不适宜人类居住的国家。&lt;br id="wt-h"&gt;&lt;br id="wt-h0"&gt;目前中国正在遭受着资本主义社会2大邪恶的折磨，即环境的破坏与人性的丧失。由于中国人天生的贪婪的本性，它们可以毫无保留的接受资本主义的阴暗面即无止境的追求利润，忽视人的尊严。中国人对西方的技术与产品狂热追求却对西方管理文化所强调的坦率，直接，诚实这些品质漠不关心。&lt;br id="wt-h1"&gt;&lt;br id="wt-h2"&gt;由于中国文化不鼓励敢于冒险这种优良品质，所以中国人极力避免冒险，他们也不想寻求机会来改善自己的生活。中国人对于生活的平衡性和意义性并不感兴趣，相反他们更执迷于对物质的索取，这点上要远远胜于西方人。大多数中国人发现他们不懂得"精神灵性"，"自由信仰"以及"心智健康"这样的 概念，因为他们的思想尚不能达到一个生命（补：即肉体和灵性的并存）存在的更高层次。他们的思想还停留在专注于动物本能对性和食物那点贪婪可怜的欲望上。&lt;br id="wt-h3"&gt;&lt;br id="wt-h4"&gt;在中国人的眼中，受教育不是为了寻求真理或者改善生活质量，而只是身份和显赫地位的象征和标志。中国的知识分子从别人那里得到尊敬并不 是因为他们为了别人的幸福做过什么，而只是因为他们获得占有了相当的知识。事实上，他们中的大多数只不过是一群仅仅通晓考试却从不关心真理和道德的食客。&lt;br id="wt-h5"&gt;&lt;br id="wt-h6"&gt;中国的教育体系很大程度上已经成为一种失败和耻辱。它已经不能够服务于教育本应所服务的对象：社会。这个教育体系不能提供给社会许多有用的个体。它只是制造出一群投机分子，他们渴望能够受益于社会所提供的好处却毫不关心回报。&lt;/p&gt;&lt;p id="w7.m35"&gt;中国可以培养出大批的高级能人才，但却很少可以培养出合格的可以独立主持的管理级专家。服务于一个公司或者社会，光有技术是不够的；还 需要有勇气，胆量，正直和诚实的领导才能，这恰恰是大多数中国人所缺少的品性。正如亚瑟.史密斯，一位著名的西方传教士一个世纪前所指出的，中国人最缺乏 的不是智慧，而是勇气和正直的纯正品性。这个评价，虽然历经百年，如今依旧准确诊断出中国综合症的病因。&lt;/p&gt;&lt;p id="w7.m36"&gt;大多数中国毕业生对选择出国并为外国工作不会感到内疚，事实上他们首先欠下了中国人民在教育上为他们所做出的牺牲。随着传统文化价值观的破坏和逐步衰弱，大多数的中国人，包括受过教育的人都徘徊在精神和内心世界的路口，像迷失的狗一样不知何去何从。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-1837871606884839996?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XAJBM-4E5V2ua1M0ajN5Z9HAtus/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XAJBM-4E5V2ua1M0ajN5Z9HAtus/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XAJBM-4E5V2ua1M0ajN5Z9HAtus/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XAJBM-4E5V2ua1M0ajN5Z9HAtus/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/6sdeACE4Yjw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/1837871606884839996/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=1837871606884839996" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/1837871606884839996?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/1837871606884839996?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/6sdeACE4Yjw/20-10-10-ibm-510-90-1200-13002020-2020.html" title="美国兰德公司对中国人的评价" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/06/20-10-10-ibm-510-90-1200-13002020-2020.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04GRHw9eyp7ImA9WxdaE08.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-842583714103365177</id><published>2008-06-07T00:27:00.000-07:00</published><updated>2008-08-21T05:32:05.263-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-21T05:32:05.263-07:00</app:edited><title>阿玛蒂亚·森：民主是一种普遍价值观</title><content type="html">&lt;h1 id="q9yb0"&gt;Design Patterns &lt;/h1&gt;&lt;div id="q9yb1"&gt;面向对象范式的核心是“对象”的概念。所有的东西都聚焦于对象。围绕对象——而非函数——组织代码。 &lt;/div&gt;&lt;div id="q9yb2"&gt;什么是对象？对象最初被定义为“拥有方法（面向对象版本的函数）的数据”。很不幸，这种看待对象的观点有很大的局限性。 &lt;/div&gt;&lt;div id="q9yb3"&gt;&lt;/div&gt;&lt;div id="q9yb4"&gt;有种对象技术是：对象的识别来自于对问题领域中实体的观察。观察这些实体需要做些什么，我为每个对象确定他们的责任（或方法）； &lt;/div&gt;&lt;div id="q9yb5"&gt;&lt;/div&gt;&lt;div id="q9yb6"&gt;更有用的定义是基于概念视角的定义——对象是拥有责任的实体。这些责任让对象拥有自己的行为。对象应该对自己负责，并且这种责任应该被清楚地定义出来。 &lt;/div&gt;&lt;div id="q9yb7"&gt;这是一个更好的定义，因为他帮助我将注意力集中在“对象应该做什么”，而不是仅仅是“如何实现他们”。这让我可以分两步构建软件： &lt;/div&gt;&lt;div id="q9yb8"&gt;1.建立一个初步的设计，不必担心涉及的任何细节。 &lt;/div&gt;&lt;div id="q9yb9"&gt;2.实现前面一个步骤得到的设计。 &lt;/div&gt;&lt;div id="q9yb10"&gt;&lt;/div&gt;&lt;div id="q9yb11"&gt;最后，这样的视角让我可以得到更好的对象选择及定义（在某种意义上面这是任何涉及的要点）。对象定义将更灵活；通过关注对象“做什么”，我们可以借助继承在需要的是有使用不同的、特定的行为。如果集中注意力与实现细节，我们也许可以得到这样的效果，但要获得相应的灵活性就必须付出更高的代价。 &lt;/div&gt;&lt;div id="q9yb12"&gt;&lt;/div&gt;&lt;div id="q9yb13"&gt;按照责任来考虑问题可以使问题更简单化，因为这样可以帮助我们定义对象的公共接口。如果对象有某种责任，就一定有某种途径要求他履行自己的责任。但是，这并不是对对象内容做任何的暗示。关于对象的责任信息甚至可以不再这个对象内部。 &lt;/div&gt;&lt;div id="q9yb14"&gt;“关注动机而不是实现”的情景在设计模式中反复出现。 &lt;/div&gt;&lt;div id="q9yb15"&gt;用这样的方法看待对象。让它成为你对对象的基本观点。如果你这样做了，你将获得出众的设计。 &lt;/div&gt;&lt;blockquote class="gn_c" id="q9yb16"&gt;摘自：Design Patters Explained-Alan Shalloway &amp;amp; James R.Trott &lt;/blockquote&gt;&lt;br id="q9yb17"&gt;&lt;span id="q9yb18"   style="font-size:78%;color:#006633;"&gt;对象, 设计模式&lt;/span&gt;&lt;br id="q9yb19"&gt;&lt;br id="q9yb20"&gt;学习设计模式的理由：&lt;br id="q9yb21"&gt;&lt;ul id="q9yb22"&gt;&lt;li id="q9yb23"&gt;复用解决方案——通过复用已经建立的设计，我为自己的问题找到更高的起点并避免了绕弯路。我受益于学习别人的经验。我不必再为普通、重复的问题重新设计解决方案。 &lt;li id="q9yb24"&gt;建立通用的术语——交流与协作都需要一个共同的词汇基础、一个对问题的共同观点。设计模式在项目的分析和设计简短提供了一个通用的参考点。 &lt;li id="q9yb25"&gt;对于问题、设计过程和面向对象，模式给你一个更高层次的视角。这样的视角将你从“过早处理细节”的“暴政”中解放初来。 &lt;li id="q9yb26"&gt;复用现有的、高质量的、针对常见的重复出现问题的解决方案。 &lt;li id="q9yb27"&gt;建立通过术语一改善团队内部的沟通。 &lt;li id="q9yb28"&gt;将思考转移到更高的视角。 &lt;li id="q9yb29"&gt;判断是否拥有正确的设计，而不是仅仅一个可以运行的设计。 &lt;li id="q9yb30"&gt;改善代码的可修改性。 &lt;li id="q9yb31"&gt;促进对改良设计的选用，甚至在没有明确使用模式的时候。 &lt;li id="q9yb32"&gt;发现“庞大的继承体系”的替代方案。 &lt;/li&gt;&lt;/ul&gt;&lt;br id="q9yb33"&gt;创建优秀面向对象设计：&lt;br id="q9yb34"&gt;&lt;ul id="q9yb35"&gt;&lt;li id="q9yb36"&gt;针对接口变编程。 &lt;li id="q9yb37"&gt;优化使用对象组合，而不是类继承。 &lt;li id="q9yb38"&gt;找到并封装变化点。 &lt;/li&gt;&lt;/ul&gt;&lt;blockquote class="gn_c" id="q9yb39"&gt;&lt;blockquote class="gn_c" id="q9yb40"&gt;摘自： Design Patters Explained-Alan Shalloway &amp;amp; James R.Trott &lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br id="q9yb41"&gt;&lt;span id="q9yb42"   style="font-size:78%;color:#006633;"&gt;设计模式&lt;/span&gt;&lt;br id="q9yb43"&gt;&lt;br id="q9yb44"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-842583714103365177?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_wEb1oh9f3GOqH_BKBUxtmsFkxg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_wEb1oh9f3GOqH_BKBUxtmsFkxg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_wEb1oh9f3GOqH_BKBUxtmsFkxg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_wEb1oh9f3GOqH_BKBUxtmsFkxg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/pjqx2g9bVm0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/842583714103365177/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=842583714103365177" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/842583714103365177?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/842583714103365177?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/pjqx2g9bVm0/design-patterns-1.html" title="阿玛蒂亚·森：民主是一种普遍价值观" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/06/design-patterns-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08AQX89fCp7ImA9WxdaE08.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-4722739368972832270</id><published>2008-05-30T08:06:00.000-07:00</published><updated>2008-08-21T05:30:40.164-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-21T05:30:40.164-07:00</app:edited><title>JSP数据库连接池的必要性</title><content type="html">&lt;table id="zgzj0" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"&gt;&lt;tbody id="zgzj1"&gt;&lt;tr id="zgzj2"&gt;&lt;td class="title" id="zgzj3"&gt;&lt;h1 id="zgzj4"&gt;JSP数据库连接池的必要性&lt;/h1&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="zgzj5"&gt;&lt;td id="zgzj6"&gt;&lt;hr id="zgzj7" size="1"&gt;&lt;br /&gt;&lt;table id="zgzj8" cellspacing="5" cellpadding="0" width="1%" align="right" border="0"&gt;&lt;tbody id="zgzj9"&gt;&lt;tr id="zgzj10"&gt;&lt;td id="zgzj11" height="20"&gt;&lt;div id="zgzj14"&gt;-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="Content" id="zgzj15"&gt;&lt;span class="t18" id="zgzj16"&gt;一般情况下，在使用开发基于数据库的WEB程序时，传统的模式基本是按以下步骤：&lt;br id="zgzj22"&gt;　　1． 在主程序（如Servlet、Beans）中建立数据库连接。 &lt;br id="zgzj23"&gt;　　2． 进行SQL操作，取出数据。&lt;br id="zgzj24"&gt;　　3． 断开数据库连接。&lt;br id="zgzj25"&gt;　　使用这种模式开发，存在很多问题。首先，我们要为每一次WEB请求（例如察看某一篇文章的内容）建立一次数据库连接，对于一次或几次操作来讲，或许你觉察不到系统的开销，但是，对于WEB程序来讲，即使在某一较短的时间段内，其操作请求数也远远不是一两次，而是数十上百次（想想全世界的网友都有可能在您的网页上查找资料），在这种情况下，系统开销是相当大的。事实上，在一个基于数据库的WEB系统中，建立数据库连接的操作将是系统中代价最大的操作之一。很多时候，可能您的网站速度瓶颈就在于此。&lt;br id="zgzj26"&gt;　　其次，使用传统的模式，你必须去管理每一个连接，确保他们能被正确关闭，如果出现程序异常而导致某些连接未能关闭，将导致数据库系统中的内存泄露，最终我们将不得不重启数据库。&lt;br id="zgzj27"&gt;　　针对以上问题，我们首先想到可以采用一个全局的Connection对象，创建后就不关闭，以后程序一直使用它，这样就不存在每次创建、关闭连接的问题了。但是，同一个连接使用次数过多，将会导致连接的不稳定，进而会导致WEB SERVER的频频重启。故而，这种方法也不可取。实际上，我们可以使用连接池技术来解决上述问题。首先，介绍一下连接池技术的基本原理。顾名思义，连接池最基本的思想就是预先建立一些连接放置于内存对象中以备使用：&lt;br id="zgzj28"&gt;　 &lt;p id="zgzj29" align="center"&gt;&lt;img id="zgzj30" src="http://www.knowsky.com/img/2003-8-4843171.gif" /&gt;&lt;/p&gt;　　　&lt;br id="zgzj31"&gt;如图所示，当程序中需要建立数据库连接时，只须从内存中取一个来用而不用新建。同样，使用完毕后，只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时，我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池，将大大提高程序效率，同时，我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。下面我们以一个名为ConnectionPool的连接池为例来看看连接池的实现。先看看ConnectionPool的基本属性：&lt;br id="zgzj32"&gt;　　m_ConnectionPoolSize：连接池中连接数量下限&lt;br id="zgzj33"&gt;　　m_ConnectionPoolMax：连接池中连接数量上限 &lt;br id="zgzj34"&gt;　　m_ConnectionUseCount：一个连接的最大使用次数&lt;br id="zgzj35"&gt;　　m_ConnectionTimeout：一个连接的最长空闲时间&lt;br id="zgzj36"&gt;　　m_MaxConnections = -1：同一时间的最大连接数&lt;br id="zgzj37"&gt;　　m_timer：定时器 &lt;br id="zgzj38"&gt;　　这些属性定义了连接池与其中的每个连接的有效状态值。连接池的自我管理，实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。其管理流程如下：&lt;br id="zgzj39"&gt;&lt;p id="zgzj40" align="center"&gt;&lt;img id="zgzj41" src="http://www.knowsky.com/img/2003-8-4843173.gif" /&gt;&lt;/p&gt;&lt;br id="zgzj42"&gt;通过上图，我们可以定义出ConnectionPool要完成管理所需要的基本接口： &lt;br id="zgzj43"&gt;public class ConnectionPool implements TimerListener{&lt;br id="zgzj44"&gt;　　public boolean initialize() //连接池初始化 &lt;br id="zgzj45"&gt;　　public void destroy() //连接池的销毁 &lt;br id="zgzj46"&gt;　　public synchronized java.sql.Connection getConnection() //取一个连接 &lt;br id="zgzj47"&gt;　　public synchronized void close() //关闭一个连接 &lt;br id="zgzj48"&gt;　　private synchronized void removeFromPool() //把一个连接从连接池中删除 &lt;br id="zgzj49"&gt;　　private synchronized void fillPool() //维护连接池大小 &lt;br id="zgzj50"&gt;　　public synchronized void TimerEvent() //定时器事件处理函数 &lt;br id="zgzj51"&gt;} &lt;br id="zgzj52"&gt;　　通过这几个接口，已经可以完成连接池的基本管理。在TimeEvent（）函数中完成连接池的状态检验工作，fillPool()时连接池至少保持最小连接数。因为我们要保存每一个连接的状态，所以还需要一个数据库连接对象： &lt;br id="zgzj53"&gt;class ConnectionObject{&lt;br id="zgzj54"&gt;　　public java.sql.Connection con; public boolean inUse; //是否被使用标志 &lt;br id="zgzj55"&gt;　　public long last&lt;a class="ReplaceKeyword" id="zgzj56" href="http://www.knowsky.com/article.asp?typeid=173" target="_blank"&gt;Access&lt;/a&gt;; //最近一次开始使用时间 &lt;br id="zgzj57"&gt;　　public int useCount; //被使用次数&lt;br id="zgzj58"&gt;}&lt;br id="zgzj59"&gt;加入了ConnectionObject对象后，在ConnectionPool中操作的应该只是ConnectionObject,而其他进程需要的只是ConnectionObject的con属性，因此我们再加入一个类，作为其他进程获得与返回连接的接口： CLASS Conn{&lt;br id="zgzj60"&gt;　　GetConnection(); //从连接池中取出一个有效连接 &lt;br id="zgzj61"&gt;　　CloseConnection(); //返回连接，此时并没有关闭连接，只是放回了连接池 &lt;br id="zgzj62"&gt;　　DestroyPool(); //销毁连接池 &lt;br id="zgzj63"&gt;}&lt;br id="zgzj64"&gt;　　最后我们的整个系统总的架构如下： &lt;br id="zgzj65"&gt;　　　　　 &lt;p id="zgzj66" align="center"&gt;&lt;img id="zgzj67" src="http://www.knowsky.com/img/2003-8-4843175.gif" /&gt;&lt;/p&gt;&lt;br id="zgzj68"&gt;通过上面的介绍，我们可以看出，连接池技术的关键就是其自身的管理机制，以上的管理流程只是本人一点见解，关键是想向大家介绍一种思路，在此基础上，您可以进一步完善连接池技术为您所用。 &lt;br id="zgzj69"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-4722739368972832270?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WX_GrET9_MEY6dJ_1ap6LEoF1aw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WX_GrET9_MEY6dJ_1ap6LEoF1aw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WX_GrET9_MEY6dJ_1ap6LEoF1aw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WX_GrET9_MEY6dJ_1ap6LEoF1aw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/REHzN_6FMwI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/4722739368972832270/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=4722739368972832270" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/4722739368972832270?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/4722739368972832270?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/REHzN_6FMwI/jsp-jsp-jspj2eejboosweblogic-web-1.html" title="JSP数据库连接池的必要性" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/05/jsp-jsp-jspj2eejboosweblogic-web-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08GQHc6eCp7ImA9WxdaE08.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-2174501250281696698</id><published>2008-05-24T08:52:00.000-07:00</published><updated>2008-08-21T05:30:21.910-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-21T05:30:21.910-07:00</app:edited><title>Struts，MVC 的一种开放源码实</title><content type="html">&lt;table id="evfl0" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="evfl1"&gt;&lt;tr id="evfl2" valign="top"&gt;&lt;td id="evfl3" width="100%"&gt;&lt;h1 id="evfl4"&gt;Struts，MVC 的一种开放源码实现&lt;/h1&gt;&lt;p id="subtitle"&gt;用这种 servlet 和 JSP 框架管理复杂的大型网站&lt;/p&gt;&lt;img class="display-img" id="evfl5" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" /&gt;&lt;/td&gt;&lt;td class="no-print" id="evfl6" width="192"&gt;&lt;img id="evfl7" height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/i/dw.gif" width="192" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table id="evfl8" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="evfl9"&gt;&lt;tr id="evfl10" valign="top"&gt;&lt;td id="evfl11" width="10"&gt;&lt;img id="evfl12" height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /&gt;&lt;/td&gt;&lt;td id="evfl13" width="100%"&gt;&lt;table id="evfl14" cellspacing="0" cellpadding="0" width="160" align="right" border="0"&gt;&lt;tbody id="evfl15"&gt;&lt;tr id="evfl16"&gt;&lt;td id="evfl17" width="10"&gt;&lt;img id="evfl18" height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /&gt;&lt;/td&gt;&lt;td id="evfl19"&gt;&lt;table id="evfl20" cellspacing="0" cellpadding="0" width="150" border="0"&gt;&lt;tbody id="evfl21"&gt;&lt;tr id="evfl22"&gt;&lt;td class="v14-header-1-small" id="evfl23"&gt;文档选项&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table id="evfl24" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="evfl25"&gt;&lt;tr id="evfl26"&gt;&lt;td class="no-padding" id="evfl27" width="150"&gt;&lt;table id="evfl28" cellspacing="0" cellpadding="0" width="143" border="0"&gt;&lt;img id="evfl30" height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /&gt; &lt;form id="evfl31" name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp"&gt;&lt;/form&gt;&lt;form id="evfl31" name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp"&gt;&lt;tbody id="evfl36"&gt;&lt;tr id="evfl37" valign="top"&gt;&lt;td id="evfl38" width="8"&gt;&lt;img id="evfl39" height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /&gt;&lt;/td&gt;&lt;td id="evfl40" width="16"&gt;&lt;img id="evfl41" height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" /&gt;&lt;/td&gt;&lt;td id="evfl42" width="122"&gt;&lt;p id="evfl43"&gt;&lt;a class="smallplainlink" id="evfl44"&gt;&lt;b id="evfl45"&gt;&lt;span id="evfl46"  style="color:#5c81a7;"&gt;将此页作为电子邮件发送&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/form&gt;&lt;tbody id="evfl36"&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn80"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p id="qfn81"&gt;级别： 初级&lt;/p&gt;&lt;p id="qfn82"&gt;&lt;a id="qfn83" href="http://www.ibm.com/developerworks/cn/java/j-struts/#author"&gt;&lt;span id="qfn84"  style="color:#5c81a7;"&gt;Malcolm Davis&lt;/span&gt;&lt;/a&gt; (&lt;a id="qfn85" href="mailto:malcolm@nuearth.com?subject=Struts，MVC" cc="'malcolm@nuearth.com"&gt;&lt;span id="qfn86"  style="color:#5c81a7;"&gt;malcolm@nuearth.com&lt;/span&gt;&lt;/a&gt;), 顾问&lt;br id="qfn87"&gt;&lt;/p&gt;&lt;p id="qfn88"&gt;2001 年 2 月 23 日&lt;/p&gt;&lt;blockquote id="qfn89"&gt;本文介绍 Struts，它是使用 servlet 和 JavaServer Pages 技术的一种 Model-View-Controller 实现。Struts 可帮助您控制 Web 项目中的变化并提高专业化水平。尽管您可能永远不会用 Struts 实现一个系统，但您可以将其中的一些思想用于您以后的 servlet 和 JSP 网页的实现中。&lt;/blockquote&gt;&lt;p id="qfn810"&gt;&lt;a id="qfn811" name="1"&gt;&lt;span class="atitle" id="qfn812"&gt;简介&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn813"&gt;小学生也可以在因特网上发布 HTML 网页。但是，小学生的网页和专业开发的网站有质的区别。网页设计人员（或者 HTML 开发人员）必须理解颜色、用户、生产流程、网页布局、浏览器兼容性、图像创建和 JavaScript 等等。设计漂亮的网站需要做大量的工作，大多数 Java 开发人员更注重创建优美的对象接口，而不是用户界面。JavaServer Pages (JSP) 技术为网页设计人员和 Java 开发人员提供了一种联系钮带。&lt;/p&gt;&lt;p id="qfn814"&gt;如果您开发过大型 Web 应用程序，您就理解 &lt;i id="qfn815"&gt;变化&lt;/i&gt; 这个词的含义。“模型-视图-控制器”(MVC) 就是用来帮助您控制变化的一种设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合。Struts 是一种 MVC 实现，它将 Servlet 2.2 和 JSP 1.1 标记（属于 J2EE 规范）用作实现的一部分。尽管您可能永远不会用 Struts 实现一个系统，但了解一下 Struts 或许使您能将其中的一些思想用于您以后的 Servlet 的 JSP 实现中。 &lt;/p&gt;&lt;p id="qfn816"&gt;在本文中，我将以一个 JSP 文件为起点讨论该网页的优缺点，该文件中使用的元素可能是您所熟悉的。随后我将讨论 Struts，并说明它是如何控制您的 Web 项目中的变化并提高专业化水平的。最后，我将重新开发这个简单的 JSP 文件，在开发过程中我已顾及到网页设计人员和变化。&lt;/p&gt;&lt;br id="qfn817"&gt;&lt;table id="qfn818" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn819"&gt;&lt;tr id="qfn820"&gt;&lt;td id="qfn821"&gt;&lt;img id="qfn822" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn823"&gt;&lt;img id="qfn824" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn825" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn826"&gt;&lt;tr id="qfn827" align="right"&gt;&lt;td id="qfn828"&gt;&lt;img id="qfn829" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn830"&gt;&lt;table id="qfn831" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn832"&gt;&lt;tr id="qfn833"&gt;&lt;td id="qfn834" valign="center"&gt;&lt;img id="qfn835" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn836"&gt;&lt;/td&gt;&lt;td id="qfn837" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn838" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn839"&gt;&lt;span id="qfn840"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn841"&gt;&lt;br id="qfn842"&gt;&lt;p id="qfn843"&gt;&lt;a id="qfn844" name="2"&gt;&lt;span class="atitle" id="qfn845"&gt;一个 JSP 文件就是一个 Java servlet&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn846"&gt;JavaServer Page (JSP) 文件只是审视 servlet 的另一种方式。JSP 文件的概念使我们能够将 Java servlet 看作一个 HTML 网页。JSP 消除了 Java 代码中经常出现的讨厌的 &lt;code id="qfn847"&gt;print()&lt;/code&gt; 语句。JSP 文件首先被预处理为 &lt;code id="qfn848"&gt;.java&lt;/code&gt; 文件，然后再编译为 &lt;code id="qfn849"&gt;.class&lt;/code&gt; 文件。如果您使用的是 Tomcat，则可以在 &lt;code id="qfn850"&gt;work&lt;/code&gt; 目录下查看预处理后的 &lt;code id="qfn851"&gt;.java&lt;/code&gt; 文件。别的容器可能将 &lt;code id="qfn852"&gt;.java&lt;/code&gt; 和 &lt;code id="qfn853"&gt;.class&lt;/code&gt; 文件存储在其他位置；这个位置与容器有关。图 1 说明了从 JSP 文件到 servlet 的流程。 &lt;/p&gt;&lt;br id="qfn854"&gt;&lt;a id="qfn855" name="art1"&gt;&lt;b id="qfn856"&gt;图 1. 从 JSP 文件到 servlet 的流程&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn857"&gt;&lt;img id="qfn858" height="65" alt="JSP to servlet flow" src="http://www.ibm.com/developerworks/cn/java/j-struts/jsp_to_servlet.gif" width="410" /&gt; &lt;br id="qfn859"&gt;&lt;p id="qfn860"&gt;（这与 Microsoft 的 Active Server Page (ASP) 明显不同。ASP 被编译到内存中，而不是编译到一个单独的文件中。）&lt;/p&gt;&lt;p id="qfn861"&gt;&lt;a id="qfn862" name="N1008C"&gt;&lt;span class="smalltitle" id="qfn863"&gt;&lt;b id="qfn864"&gt;&lt;span id="qfn865"   style="font-family:Arial;font-size:100%;"&gt;简单的独立 JSP 文件&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn866"&gt;在小型 JSP 应用程序中，经常会看到数据、业务逻辑和用户界面被组合在一个代码模块中。此外，应用程序通常还包含用来控制应用程序流程的逻辑。清单 1 和图 2 展示了允许用户加入一个邮件列表的一个简单 JSP 文件。&lt;/p&gt;&lt;br id="qfn867"&gt;&lt;a id="qfn868" name="N10095"&gt;&lt;b id="qfn869"&gt;清单 1. join.jsp -- 一个简单的请求和响应 JSP 文件 &lt;/b&gt;&lt;/a&gt;&lt;br id="qfn870"&gt;&lt;table id="qfn871" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn872"&gt;&lt;tr id="qfn873"&gt;&lt;td class="code-outline" id="qfn874"&gt;&lt;pre class="displaycode" id="qfn875"&gt;&amp;lt;%@ page language="java" %&amp;gt; &amp;lt;%@ page import="business.util.Validation" %&amp;gt; &amp;lt;%@ page import="business.db.MailingList" %&amp;gt; &amp;lt;% String error = ""; String email = request.getParameter("email"); // 是否有电子邮件地址 if( email!=null ) {     // 验证输入...     if( business.util.Validation.isValidEmail(email) ) {         // 存储输入...         try {             business.db.MailingList.AddEmail(email);         } catch (Exception e) {             error = "Error adding email address to system.  " + e;         }         if( error.length()==0 ) { %&amp;gt;             // 重定向到欢迎页...             &amp;lt;jsp:forward page="welcome.html"/&amp;gt; &amp;lt;%         }     } else {         // 设置错误消息并重新显示网页         error = email + " is not a valid email address, please try again.";     } } else {     email = ""; } %&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;Join Mailing List&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;font color=red&amp;gt;&amp;lt;%=error%&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt; &amp;lt;h3&amp;gt;Enter your email to join the group&amp;lt;/h3&amp;gt; &amp;lt;form action="join.jsp" name="joinForm"&amp;gt;     &amp;lt;input name="email" id="email" value=&amp;lt;%=email%&amp;gt;&amp;gt;&amp;lt;/input&amp;gt;     &amp;lt;input type=submit value="submit"&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn876"&gt;&lt;br id="qfn877"&gt;&lt;a id="qfn878" name="N100A5"&gt;&lt;b id="qfn879"&gt;图 2. 在简单的请求和响应中，JSP 文件设置数据、控制到下一个网页的流程并创建 HTML&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn880"&gt;&lt;img id="qfn881" height="70" alt="Simple request and response JSP" src="http://www.ibm.com/developerworks/cn/java/j-struts/simple_jsp.gif" width="430" /&gt; &lt;br id="qfn882"&gt;&lt;p id="qfn883"&gt;这个邮件列表 JSP 文件是一个独立的、自主完成所有任务的模块。未包含在这个 JSP 文件中的仅有代码是包含在 &lt;code id="qfn884"&gt;isValidEmail()&lt;/code&gt; 中的实际验证代码和将电子邮件地址存入数据库的代码。（将 &lt;code id="qfn885"&gt;isValidEmail()&lt;/code&gt; 方法分离到可重用的代码中似乎是当然的选择，但我曾见过直接嵌入网页中的 &lt;code id="qfn886"&gt;isValidEmail()&lt;/code&gt; 代码。单页方法的优点是易于理解，并且最初也易于构建。此外，对于各种图形化开发工具，入门也很容易。 &lt;/p&gt;&lt;p id="qfn887"&gt;&lt;a id="qfn888" name="N100C1"&gt;&lt;span class="smalltitle" id="qfn889"&gt;&lt;b id="qfn890"&gt;&lt;span id="qfn891"   style="font-family:Arial;font-size:100%;"&gt;join.jsp 的活动 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol id="qfn892"&gt;&lt;li id="qfn893"&gt;显示打开的输入网页。 &lt;li id="qfn894"&gt;从表单参数中读取 &lt;code id="qfn895"&gt;email&lt;/code&gt; 的值。 &lt;li id="qfn896"&gt;验证 &lt;code id="qfn897"&gt;email&lt;/code&gt; 地址。 &lt;li id="qfn898"&gt;如果 &lt;code id="qfn899"&gt;email&lt;/code&gt; 地址有效： &lt;ul id="qfn8100"&gt;&lt;li id="qfn8101"&gt;将该地址添加到数据库中。 &lt;li id="qfn8102"&gt;重定向到下一个网页。 &lt;/li&gt;&lt;/ul&gt;&lt;li id="qfn8103"&gt;如果 &lt;code id="qfn8104"&gt;email&lt;/code&gt; 地址无效： &lt;ul id="qfn8105"&gt;&lt;li id="qfn8106"&gt;设置错误消息。 &lt;li id="qfn8107"&gt;重新显示含有错误消息的 &lt;code id="qfn8108"&gt;join.jsp&lt;/code&gt; 。 &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p id="qfn8109"&gt;&lt;a id="qfn8110" name="N10103"&gt;&lt;span class="smalltitle" id="qfn8111"&gt;&lt;b id="qfn8112"&gt;&lt;span id="qfn8113"   style="font-family:Arial;font-size:100%;"&gt;单页方法的后果&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul id="qfn8114"&gt;&lt;li id="qfn8115"&gt;&lt;b id="qfn8116"&gt;HTML 和 Java 强耦合在一起&lt;/b&gt; &lt;br id="qfn8117"&gt;JSP 文件的编写者必须既是网页设计者，又是 Java 开发者。其结果通常要么是很糟的 Java 代码，要么是难看的网页，有时甚至 Java 代码和网页都很糟。 &lt;li id="qfn8118"&gt;&lt;b id="qfn8119"&gt;Java 和 JavaScript 的不足&lt;/b&gt; &lt;br id="qfn8120"&gt;随着网页逐渐变大，很容易想到实现一些 JavaScript。当网页中出现 JavaScript 时，这种脚本就可能与 Java 代码产生混淆。可能产生混淆的一个例子是使用客户端的 JavaScript 来验证 &lt;code id="qfn8121"&gt;email&lt;/code&gt; 域。 &lt;br id="qfn8122"&gt;&lt;li id="qfn8123"&gt;&lt;b id="qfn8124"&gt;内嵌的流程逻辑&lt;/b&gt; &lt;br id="qfn8125"&gt;要理解应用程序的整个流程，您必须浏览所有网页。试想一下拥有 100 个网页的网站的错综复杂的逻辑。 &lt;li id="qfn8126"&gt;&lt;b id="qfn8127"&gt;调试困难&lt;/b&gt; &lt;br id="qfn8128"&gt;除了很糟的外观之外，HTML 标记、Java 代码和 JavaScript 代码都集中在一个网页中还使调试变得相当困难。 &lt;li id="qfn8129"&gt;&lt;b id="qfn8130"&gt;强耦合&lt;/b&gt; &lt;br id="qfn8131"&gt;更改业务逻辑或数据可能牵涉相关的每个网页。 &lt;li id="qfn8132"&gt;&lt;b id="qfn8133"&gt;美学&lt;/b&gt; &lt;br id="qfn8134"&gt;在很大的网页中，这编码样式看起来杂乱无章。我过去进行 Microsoft ASP 开发时，我经常看到有 1000 行的网页。即使有彩色语法显示，阅读和理解这些代码仍然比较困难。 &lt;/li&gt;&lt;/ul&gt;&lt;br id="qfn8135"&gt;&lt;table id="qfn8136" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8137"&gt;&lt;tr id="qfn8138"&gt;&lt;td id="qfn8139"&gt;&lt;img id="qfn8140" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8141"&gt;&lt;img id="qfn8142" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8143" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8144"&gt;&lt;tr id="qfn8145" align="right"&gt;&lt;td id="qfn8146"&gt;&lt;img id="qfn8147" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8148"&gt;&lt;table id="qfn8149" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8150"&gt;&lt;tr id="qfn8151"&gt;&lt;td id="qfn8152" valign="center"&gt;&lt;img id="qfn8153" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8154"&gt;&lt;/td&gt;&lt;td id="qfn8155" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8156" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8157"&gt;&lt;span id="qfn8158"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8159"&gt;&lt;br id="qfn8160"&gt;&lt;p id="qfn8161"&gt;&lt;a id="qfn8162" name="3"&gt;&lt;span class="atitle" id="qfn8163"&gt;请别在我的 HTML 中加入太多的 Java 代码&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8164"&gt;在清单 1 中，不是 Java 代码中有大量的 HTML，而是在 HTML 文件中有大量的 Java 代码。从这个观点来看，除了允许网页设计人员编写 Java 代码之外，我实际上没做什么。但是，我们并不是一无所有；在 JSP 1.1 中，我们获得一种称为“标记”的新特性。&lt;/p&gt;&lt;p id="qfn8165"&gt;JSP 标记只是将代码从 JSP 文件中抽取出来的一种方式。有人将 JSP 标记看作是 JSP 文件的宏，其中用于这个标记的代码包含在 servlet 中。（宏的观点在很大程度上是正确的。）出于同样的原因，我不希望在 Java 代码中看到 HTML 标记，我也不希望在 JSP 文件中看到 Java 代码。JSP 技术的整个出发点就是允许网页设计人员创建 servlet，而不必纠缠于 Java 代码。标记允许 Java 程序员将 Java 代码伪装成 HTML 来扩展 JSP 文件。图 3 显示了从 JSP 网页中抽取代码并将它们放入 JSP 标记中的一般概念。&lt;/p&gt;&lt;br id="qfn8166"&gt;&lt;a id="qfn8167" name="N10150"&gt;&lt;b id="qfn8168"&gt;图 3. JSP 标记&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8169"&gt;&lt;img id="qfn8170" height="70" alt="JSP tag breakdown" src="http://www.ibm.com/developerworks/cn/java/j-struts/jsp_tag_breakdown.gif" width="220" /&gt; &lt;br id="qfn8171"&gt;&lt;p id="qfn8172"&gt;清单 2 是用来说明 Struts 标记的功能的一个例子。在清单 2 中，正常的 HTML &lt;code id="qfn8173"&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 标记被用 Struts &lt;code id="qfn8174"&gt;&amp;lt;form:form&amp;gt;&lt;/code&gt; 标记替换。清单 3 显示了浏览器接收到的结果 HTML。浏览器获得 HTML &lt;code id="qfn8175"&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 标记，但带有附加代码，如 JavaScript。附加的 JavaScript 激活 &lt;code id="qfn8176"&gt;email&lt;/code&gt; 地址域。服务器端的 &lt;code id="qfn8177"&gt;&amp;lt;form:form&amp;gt;&lt;/code&gt; 标记代码创建适当的 HTML，并使网页设计人员不再接触 JavaScript。 &lt;/p&gt;&lt;br id="qfn8178"&gt;&lt;a id="qfn8179" name="N10174"&gt;&lt;b id="qfn8180"&gt;清单 2. Struts 的 form 标记&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8181"&gt;&lt;table id="qfn8182" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8183"&gt;&lt;tr id="qfn8184"&gt;&lt;td class="code-outline" id="qfn8185"&gt;&lt;pre class="displaycode" id="qfn8186"&gt;&amp;lt;form:form action="join.do" focus="email" &amp;gt;     &amp;lt;form:text   property="email" size="30" maxlength="30"/&amp;gt;     &amp;lt;form:submit property="submit" value="Submit"/&amp;gt; &amp;lt;/form:form&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8187"&gt;&lt;br id="qfn8188"&gt;&lt;br id="qfn8189"&gt;&lt;a id="qfn8190" name="N10180"&gt;&lt;b id="qfn8191"&gt;清单 3. 发送给浏览器的结果 HTML&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8192"&gt;&lt;table id="qfn8193" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8194"&gt;&lt;tr id="qfn8195"&gt;&lt;td class="code-outline" id="qfn8196"&gt;&lt;pre class="displaycode" id="qfn8197"&gt;&amp;lt;form name="joinForm" method="POST" action="join.do;jsessionid=ndj71hjo01"&amp;gt;     &amp;lt;input type="text" name="email" maxlength="30" size="30" value=""&amp;gt;     &amp;lt;input type="submit" name="submit" value="Submit"&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;script language="JavaScript"&amp;gt; &amp;lt;!--     document.joinForm.email.focus() // --&amp;gt; &amp;lt;/script&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8198"&gt;&lt;p id="qfn8199"&gt;&lt;a id="qfn8200" name="N1018A"&gt;&lt;span class="smalltitle" id="qfn8201"&gt;&lt;b id="qfn8202"&gt;&lt;span id="qfn8203"   style="font-family:Arial;font-size:100%;"&gt;有关 JSP 标记的注意事项：&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul id="qfn8204"&gt;&lt;li id="qfn8205"&gt;JSP 标记需要一个运行 JSP 1.1 或更高版本的容器。 &lt;li id="qfn8206"&gt;JSP 标记在服务器上运行，而不像 HTML 标记那样由客户机解释。 &lt;li id="qfn8207"&gt;JSP 标记提供了适当的代码重用机制。 &lt;li id="qfn8208"&gt;可以使用一种称为 &lt;code id="qfn8209"&gt;include&lt;/code&gt; 的 JSP 机制将 HTML 和 JavaScript 添加到网页中。但是，开发人员常常会创建巨大的 JavaScript 库文件，这些库文件被包含在 JSP 文件中。结果返回给客户机的 HTML 网页要比必需的 HMTL 网页大得多。 &lt;code id="qfn8210"&gt;include&lt;/code&gt; 的正确用法是仅将它用于生成诸如页眉和页脚这类内容的 HTML 代码段。 &lt;li id="qfn8211"&gt;通过抽取出 Java 代码，JSP 标记使开发角色更加专业化。 &lt;/li&gt;&lt;/ul&gt;&lt;br id="qfn8212"&gt;&lt;table id="qfn8213" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8214"&gt;&lt;tr id="qfn8215"&gt;&lt;td id="qfn8216"&gt;&lt;img id="qfn8217" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8218"&gt;&lt;img id="qfn8219" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8220" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8221"&gt;&lt;tr id="qfn8222" align="right"&gt;&lt;td id="qfn8223"&gt;&lt;img id="qfn8224" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8225"&gt;&lt;table id="qfn8226" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8227"&gt;&lt;tr id="qfn8228"&gt;&lt;td id="qfn8229" valign="center"&gt;&lt;img id="qfn8230" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8231"&gt;&lt;/td&gt;&lt;td id="qfn8232" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8233" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8234"&gt;&lt;span id="qfn8235"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8236"&gt;&lt;br id="qfn8237"&gt;&lt;p id="qfn8238"&gt;&lt;a id="qfn8239" name="4"&gt;&lt;span class="atitle" id="qfn8240"&gt;模型-视图-控制器 (MVC)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8241"&gt;JSP 标记只解决了部分问题。我们还得处理验证、流程控制和更新应用程序的状态等问题。这正是 MVC 发挥作用的地方。MVC 通过将问题分为三个类别来帮助解决单一模块方法所遇到的某些问题：&lt;/p&gt;&lt;ul id="qfn8242"&gt;&lt;li id="qfn8243"&gt;&lt;b id="qfn8244"&gt;Model（模型）&lt;/b&gt; &lt;br id="qfn8245"&gt;模型包含应用程序的核心功能。模型封装了应用程序的状态。有时它包含的唯一功能就是状态。它对视图或控制器一无所知。 &lt;li id="qfn8246"&gt;&lt;b id="qfn8247"&gt;View（视图）&lt;/b&gt; &lt;br id="qfn8248"&gt;视图提供模型的表示。它是应用程序的 &lt;i id="qfn8249"&gt;外观&lt;/i&gt;。视图可以访问模型的读方法，但不能访问写方法。此外，它对控制器一无所知。当更改模型时，视图应得到通知。 &lt;br id="qfn8250"&gt;&lt;li id="qfn8251"&gt;&lt;b id="qfn8252"&gt;Controller（控制器）&lt;/b&gt; &lt;br id="qfn8253"&gt;控制器对用户的输入作出反应。它创建并设置模型。 &lt;/li&gt;&lt;/ul&gt;&lt;br id="qfn8254"&gt;&lt;table id="qfn8255" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8256"&gt;&lt;tr id="qfn8257"&gt;&lt;td id="qfn8258"&gt;&lt;img id="qfn8259" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8260"&gt;&lt;img id="qfn8261" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8262" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8263"&gt;&lt;tr id="qfn8264" align="right"&gt;&lt;td id="qfn8265"&gt;&lt;img id="qfn8266" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8267"&gt;&lt;table id="qfn8268" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8269"&gt;&lt;tr id="qfn8270"&gt;&lt;td id="qfn8271" valign="center"&gt;&lt;img id="qfn8272" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8273"&gt;&lt;/td&gt;&lt;td id="qfn8274" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8275" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8276"&gt;&lt;span id="qfn8277"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8278"&gt;&lt;br id="qfn8279"&gt;&lt;p id="qfn8280"&gt;&lt;a id="qfn8281" name="5"&gt;&lt;span class="atitle" id="qfn8282"&gt;MVC Model 2&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8283"&gt;Web 向软件开发人员提出了一些特有的挑战，最明显的就是客户机和服务器的无状态连接。这种无状态行为使得模型很难将更改通知视图。在 Web 上，为了发现对应用程序状态的修改，浏览器必须重新查询服务器。&lt;/p&gt;&lt;p id="qfn8284"&gt;另一个重大变化是实现视图所用的技术与实现模型或控制器的技术不同。当然，我们可以使用 Java（或者 PERL、C/C++ 或别的语言）代码生成 HTML。这种方法有几个缺点：&lt;/p&gt;&lt;ul id="qfn8285"&gt;&lt;li id="qfn8286"&gt;Java 程序员应该开发服务，而不是 HTML。 &lt;li id="qfn8287"&gt;更改布局时需要更改代码。 &lt;li id="qfn8288"&gt;服务的用户应该能够创建网页来满足它们的特定需要。 &lt;li id="qfn8289"&gt;网页设计人员不能直接参与网页开发。 &lt;li id="qfn8290"&gt;嵌在代码中的 HTML 很难看。 &lt;/li&gt;&lt;/ul&gt;&lt;p id="qfn8291"&gt;对于 Web，需要修改标准的 MVC 形式。图 4 显示了 MVC 的 Web 改写版，通常也称为 MVC Model 2 或 MVC 2。&lt;/p&gt;&lt;br id="qfn8292"&gt;&lt;a id="qfn8293" name="N101F6"&gt;&lt;b id="qfn8294"&gt;图 4. MVC Model 2&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8295"&gt;&lt;img id="qfn8296" height="170" alt="MVC Model 2" src="http://www.ibm.com/developerworks/cn/java/j-struts/mvc2.gif" width="410" /&gt; &lt;br id="qfn8297"&gt;&lt;br id="qfn8298"&gt;&lt;table id="qfn8299" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8300"&gt;&lt;tr id="qfn8301"&gt;&lt;td id="qfn8302"&gt;&lt;img id="qfn8303" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8304"&gt;&lt;img id="qfn8305" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8306" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8307"&gt;&lt;tr id="qfn8308" align="right"&gt;&lt;td id="qfn8309"&gt;&lt;img id="qfn8310" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8311"&gt;&lt;table id="qfn8312" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8313"&gt;&lt;tr id="qfn8314"&gt;&lt;td id="qfn8315" valign="center"&gt;&lt;img id="qfn8316" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8317"&gt;&lt;/td&gt;&lt;td id="qfn8318" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8319" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8320"&gt;&lt;span id="qfn8321"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8322"&gt;&lt;br id="qfn8323"&gt;&lt;p id="qfn8324"&gt;&lt;a id="qfn8325" name="6"&gt;&lt;span class="atitle" id="qfn8326"&gt;Struts，MVC 2 的一种实现&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8327"&gt;Struts 是一组相互协作的类、servlet 和 JSP 标记，它们组成一个可重用的 MVC 2 设计。这个定义表示 Struts 是一个框架，而不是一个库，但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类。图 5 显示了 Struts 的一个概览。&lt;/p&gt;&lt;br id="qfn8328"&gt;&lt;a id="qfn8329" name="N1020E"&gt;&lt;b id="qfn8330"&gt;图 5. Struts 概览&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8331"&gt;&lt;img id="qfn8332" height="170" alt="Struts overview" src="http://www.ibm.com/developerworks/cn/java/j-struts/mvc2_struts.gif" width="410" /&gt; &lt;br id="qfn8333"&gt;&lt;p id="qfn8334"&gt;&lt;a id="qfn8335" name="N1021B"&gt;&lt;span class="smalltitle" id="qfn8336"&gt;&lt;b id="qfn8337"&gt;&lt;span id="qfn8338"   style="font-family:Arial;font-size:100%;"&gt;Struts 概览&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul id="qfn8339"&gt;&lt;li id="qfn8340"&gt;&lt;b id="qfn8341"&gt;Client browser（客户浏览器）&lt;/b&gt; &lt;br id="qfn8342"&gt;来自客户浏览器的每个 HTTP 请求创建一个事件。Web 容器将用一个 HTTP 响应作出响应。 &lt;li id="qfn8343"&gt;&lt;b id="qfn8344"&gt;Controller（控制器）&lt;/b&gt; &lt;br id="qfn8345"&gt;控制器接收来自浏览器的请求，并决定将这个请求发往何处。就 Struts 而言，控制器是以 servlet 实现的一个命令设计模式。 &lt;code id="qfn8346"&gt;struts-config.xml&lt;/code&gt; 文件配置控制器。 &lt;br id="qfn8347"&gt;&lt;li id="qfn8348"&gt;&lt;b id="qfn8349"&gt;业务逻辑&lt;/b&gt; &lt;br id="qfn8350"&gt;业务逻辑更新模型的状态，并帮助控制应用程序的流程。就 Struts 而言，这是通过作为实际业务逻辑“瘦”包装的 &lt;code id="qfn8351"&gt;Action&lt;/code&gt; 类完成的。 &lt;br id="qfn8352"&gt;&lt;li id="qfn8353"&gt;&lt;b id="qfn8354"&gt;Model（模型）的状态&lt;/b&gt; &lt;br id="qfn8355"&gt;模型表示应用程序的状态。业务对象更新应用程序的状态。ActionForm bean 在会话级或请求级表示模型的状态，而不是在持久级。JSP 文件使用 JSP 标记读取来自 ActionForm bean 的信息。 &lt;li id="qfn8356"&gt;&lt;b id="qfn8357"&gt;View（视图）&lt;/b&gt; &lt;br id="qfn8358"&gt;视图就是一个 JSP 文件。其中没有流程逻辑，没有业务逻辑，也没有模型信息 -- 只有标记。标记是使 Struts 有别于其他框架（如 Velocity）的因素之一。 &lt;/li&gt;&lt;/ul&gt;&lt;br id="qfn8359"&gt;&lt;table id="qfn8360" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8361"&gt;&lt;tr id="qfn8362"&gt;&lt;td id="qfn8363"&gt;&lt;img id="qfn8364" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8365"&gt;&lt;img id="qfn8366" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8367" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8368"&gt;&lt;tr id="qfn8369" align="right"&gt;&lt;td id="qfn8370"&gt;&lt;img id="qfn8371" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8372"&gt;&lt;table id="qfn8373" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8374"&gt;&lt;tr id="qfn8375"&gt;&lt;td id="qfn8376" valign="center"&gt;&lt;img id="qfn8377" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8378"&gt;&lt;/td&gt;&lt;td id="qfn8379" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8380" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8381"&gt;&lt;span id="qfn8382"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8383"&gt;&lt;br id="qfn8384"&gt;&lt;p id="qfn8385"&gt;&lt;a id="qfn8386" name="7"&gt;&lt;span class="atitle" id="qfn8387"&gt;详细分析 Struts&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8388"&gt;图 6 显示的是 &lt;code id="qfn8389"&gt;org.apache.struts.action&lt;/code&gt; 包的一个最简 UML 图。图 6 显示了 &lt;code id="qfn8390"&gt;ActionServlet&lt;/code&gt; (Controller)、 &lt;code id="qfn8391"&gt;ActionForm&lt;/code&gt; (Form State) 和 &lt;code id="qfn8392"&gt;Action&lt;/code&gt; (Model Wrapper) 之间的最简关系。 &lt;/p&gt;&lt;br id="qfn8393"&gt;&lt;a id="qfn8394" name="N10273"&gt;&lt;b id="qfn8395"&gt;图 6. Command (ActionServlet) 与 Model (Action &amp;amp; ActionForm) 之间的关系的 UML 图&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8396"&gt;&lt;img id="qfn8397" height="228" alt="Relationship of ActionServlet to Action and ActionForm" src="http://www.ibm.com/developerworks/cn/java/j-struts/action_servlet.jpg" width="600" /&gt; &lt;br id="qfn8398"&gt;&lt;p id="qfn8399"&gt;&lt;a id="qfn8400" name="N10280"&gt;&lt;span class="smalltitle" id="qfn8401"&gt;&lt;b id="qfn8402"&gt;&lt;span id="qfn8403"   style="font-family:Arial;font-size:100%;"&gt;ActionServlet 类 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8404"&gt;您还记得函数映射的日子吗？在那时，您会将某些输入事件映射到一个函数指针上。如果您对此比较熟悉，您会将配置信息放入一个文件，并在运行时加载这个文件。函数指针数组曾经是用 C 语言进行结构化编程的很好方法。&lt;/p&gt;&lt;p id="qfn8405"&gt;现在好多了，我们有了 Java 技术、XML、J2EE，等等。Struts 的控制器是将事件（事件通常是 HTTP post）映射到类的一个 servlet。正如您所料 -- 控制器使用配置文件以使您不必对这些值进行硬编码。时代变了，但方法依旧。&lt;/p&gt;&lt;p id="qfn8406"&gt;&lt;code id="qfn8407"&gt;ActionServlet&lt;/code&gt; 是该 MVC 实现的 Command 部分，它是这一框架的核心。 &lt;code id="qfn8408"&gt;ActionServlet&lt;/code&gt; (Command) 创建并使用 &lt;code id="qfn8409"&gt;Action&lt;/code&gt; 、 &lt;code id="qfn8410"&gt;ActionForm&lt;/code&gt; 和 &lt;code id="qfn8411"&gt;ActionForward&lt;/code&gt; 。如前所述， &lt;code id="qfn8412"&gt;struts-config.xml&lt;/code&gt; 文件配置该 Command。在创建 Web 项目时，您将扩展 &lt;code id="qfn8413"&gt;Action&lt;/code&gt; 和 &lt;code id="qfn8414"&gt;ActionForm&lt;/code&gt; 来解决特定的问题。文件 &lt;code id="qfn8415"&gt;struts-config.xml&lt;/code&gt; 指示 &lt;code id="qfn8416"&gt;ActionServlet&lt;/code&gt; 如何使用这些扩展的类。这种方法有几个优点： &lt;/p&gt;&lt;ul id="qfn8417"&gt;&lt;li id="qfn8418"&gt;应用程序的整个逻辑流程都存储在一个分层的文本文件中。这使得人们更容易查看和理解它，尤其是对于大型应用程序而言。 &lt;li id="qfn8419"&gt;网页设计人员不必费力地阅读 Java 代码来理解应用程序的流程。 &lt;li id="qfn8420"&gt;Java 开发人员也不必在更改流程以后重新编译代码。 &lt;/li&gt;&lt;/ul&gt;&lt;p id="qfn8421"&gt;可以通过扩展 &lt;code id="qfn8422"&gt;ActionServlet&lt;/code&gt; 来添加 Command 功能。 &lt;/p&gt;&lt;p id="qfn8423"&gt;&lt;a id="qfn8424" name="N102CE"&gt;&lt;span class="smalltitle" id="qfn8425"&gt;&lt;b id="qfn8426"&gt;&lt;span id="qfn8427"   style="font-family:Arial;font-size:100%;"&gt;ActionForm 类 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8428"&gt;&lt;code id="qfn8429"&gt;ActionForm&lt;/code&gt; 维护 Web 应用程序的会话状态。 &lt;code id="qfn8430"&gt;ActionForm&lt;/code&gt; 是一个抽象类，必须为每个输入表单模型创建该类的子类。当我说 &lt;i id="qfn8431"&gt;输入表单模型&lt;/i&gt; 时,是指 &lt;code id="qfn8432"&gt;ActionForm&lt;/code&gt; 表示的是由 HTML 表单设置或更新的一般意义上的数据。例如，您可能有一个由 HTML 表单设置的 &lt;code id="qfn8433"&gt;UserActionForm&lt;/code&gt; 。Struts 框架将执行以下操作： &lt;/p&gt;&lt;ul id="qfn8434"&gt;&lt;li id="qfn8435"&gt;检查 &lt;code id="qfn8436"&gt;UserActionForm&lt;/code&gt; 是否存在；如果不存在，它将创建该类的一个实例。 &lt;br id="qfn8437"&gt;&lt;li id="qfn8438"&gt;Struts 将使用 HttpServletRequest 中相应的域设置 &lt;code id="qfn8439"&gt;UserActionForm&lt;/code&gt; 的状态。没有太多讨厌的 &lt;code id="qfn8440"&gt;request.getParameter()&lt;/code&gt; 调用。例如，Struts 框架将从请求流中提取 &lt;code id="qfn8441"&gt;fname&lt;/code&gt; ，并调用 &lt;code id="qfn8442"&gt;UserActionForm.setFname()&lt;/code&gt; 。 &lt;br id="qfn8443"&gt;&lt;li id="qfn8444"&gt;Struts 框架在将 &lt;code id="qfn8445"&gt;UserActionForm&lt;/code&gt; 传递给业务包装 &lt;code id="qfn8446"&gt;UserAction&lt;/code&gt; 之前将更新它的状态。 &lt;br id="qfn8447"&gt;&lt;li id="qfn8448"&gt;在将它传递给 &lt;code id="qfn8449"&gt;Action&lt;/code&gt; 类之前，Struts 还会对 &lt;code id="qfn8450"&gt;UserActionForm&lt;/code&gt; 调用 &lt;code id="qfn8451"&gt;validation()&lt;/code&gt; 方法进行表单状态验证。 &lt;b id="qfn8452"&gt;注：&lt;/b&gt; 这并不总是明智之举。别的网页或业务可能使用 &lt;code id="qfn8453"&gt;UserActionForm&lt;/code&gt; ，在这些地方，验证可能有所不同。在 &lt;code id="qfn8454"&gt;UserAction&lt;/code&gt; 类中进行状态验证可能更好。 &lt;br id="qfn8455"&gt;&lt;li id="qfn8456"&gt;可在会话级维护 &lt;code id="qfn8457"&gt;UserActionForm&lt;/code&gt; 。 &lt;/li&gt;&lt;/ul&gt;&lt;p id="qfn8458"&gt;注：&lt;/p&gt;&lt;ul id="qfn8459"&gt;&lt;li id="qfn8460"&gt;&lt;code id="qfn8461"&gt;struts-config.xml&lt;/code&gt; 文件控制 HTML 表单请求与 &lt;code id="qfn8462"&gt;ActionForm&lt;/code&gt; 之间的映射关系。 &lt;li id="qfn8463"&gt;可将多个请求映射到 &lt;code id="qfn8464"&gt;UserActionForm&lt;/code&gt; 。 &lt;li id="qfn8465"&gt;&lt;code id="qfn8466"&gt;UserActionForm&lt;/code&gt; 可跨多页进行映射，以执行诸如向导之类的操作。 &lt;/li&gt;&lt;/ul&gt;&lt;p id="qfn8467"&gt;&lt;a id="qfn8468" name="N1035E"&gt;&lt;span class="smalltitle" id="qfn8469"&gt;&lt;b id="qfn8470"&gt;&lt;span id="qfn8471"   style="font-family:Arial;font-size:100%;"&gt;Action 类 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8472"&gt;&lt;code id="qfn8473"&gt;Action&lt;/code&gt; 类是业务逻辑的一个包装。 &lt;code id="qfn8474"&gt;Action&lt;/code&gt; 类的用途是将 &lt;code id="qfn8475"&gt;HttpServletRequest&lt;/code&gt; 转换为业务逻辑。要使用 &lt;code id="qfn8476"&gt;Action&lt;/code&gt; ，请创建它的子类并覆盖 &lt;code id="qfn8477"&gt;process()&lt;/code&gt; 方法。 &lt;/p&gt;&lt;p id="qfn8478"&gt;&lt;code id="qfn8479"&gt;ActionServlet&lt;/code&gt; (Command) 使用 &lt;code id="qfn8480"&gt;perform()&lt;/code&gt; 方法将参数化的类传递给 &lt;code id="qfn8481"&gt;ActionForm&lt;/code&gt; 。仍然没有太多讨厌的 &lt;code id="qfn8482"&gt;request.getParameter()&lt;/code&gt; 调用。当事件进展到这一步时，输入表单数据（或 HTML 表单数据）已被从请求流中提取出来并转移到 &lt;code id="qfn8483"&gt;ActionForm&lt;/code&gt; 类中。 &lt;/p&gt;&lt;p id="qfn8484"&gt;注：扩展 &lt;code id="qfn8485"&gt;Action&lt;/code&gt; 类时请注意简洁。 &lt;code id="qfn8486"&gt;Action&lt;/code&gt; 类应该控制应用程序的流程，而不应该控制应用程序的逻辑。通过将业务逻辑放在单独的包或 EJB 中，我们就可以提供更大的灵活性和可重用性。 &lt;/p&gt;&lt;p id="qfn8487"&gt;考虑 &lt;code id="qfn8488"&gt;Action&lt;/code&gt; 类的另一种方式是 Adapter 设计模式。 &lt;code id="qfn8489"&gt;Action&lt;/code&gt; 的用途是“将类的接口转换为客户机所需的另一个接口。Adapter 使类能够协同工作，如果没有 Adapter，则这些类会因为不兼容的接口而无法协同工作。”（摘自 Gof 所著的 &lt;i id="qfn8490"&gt;Design Patterns - Elements of Reusable OO Software&lt;/i&gt; ）。本例中的客户机是 &lt;code id="qfn8491"&gt;ActionServlet&lt;/code&gt; ，它对我们的具体业务类接口一无所知。因此，Struts 提供了它能够理解的一个业务接口，即 &lt;code id="qfn8492"&gt;Action&lt;/code&gt; 。通过扩展 &lt;code id="qfn8493"&gt;Action&lt;/code&gt; ，我们使得我们的业务接口与 Struts 业务接口保持兼容。（一个有趣的发现是， &lt;code id="qfn8494"&gt;Action&lt;/code&gt; 是类而不是接口）。 &lt;code id="qfn8495"&gt;Action&lt;/code&gt; 开始为一个接口，后来却变成了一个类。真是金无足赤。） &lt;/p&gt;&lt;p id="qfn8496"&gt;&lt;a id="qfn8497" name="N103C3"&gt;&lt;span class="smalltitle" id="qfn8498"&gt;&lt;b id="qfn8499"&gt;&lt;span id="qfn8500"   style="font-family:Arial;font-size:100%;"&gt;Error 类 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8501"&gt;UML 图（图 6）还包括 &lt;code id="qfn8502"&gt;ActionError&lt;/code&gt; 和 &lt;code id="qfn8503"&gt;ActionErrors&lt;/code&gt; 。 &lt;code id="qfn8504"&gt;ActionError&lt;/code&gt; 封装了单个错误消息。 &lt;code id="qfn8505"&gt;ActionErrors&lt;/code&gt; 是 &lt;code id="qfn8506"&gt;ActionError&lt;/code&gt; 类的容器，View 可以使用标记访问这些类。 &lt;code id="qfn8507"&gt;ActionError&lt;/code&gt; 是 Struts 保持错误列表的方式。 &lt;/p&gt;&lt;br id="qfn8508"&gt;&lt;a id="qfn8509" name="N103EA"&gt;&lt;b id="qfn8510"&gt;图 7. Command (ActionServlet) 与 Model (Action) 之间的关系的 UML 图&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8511"&gt;&lt;img id="qfn8512" height="261" alt="Relationship of ActionServlet to Action" src="http://www.ibm.com/developerworks/cn/java/j-struts/action_mapping.jpg" width="525" /&gt; &lt;br id="qfn8513"&gt;&lt;p id="qfn8514"&gt;&lt;a id="qfn8515" name="N103F7"&gt;&lt;span class="smalltitle" id="qfn8516"&gt;&lt;b id="qfn8517"&gt;&lt;span id="qfn8518"   style="font-family:Arial;font-size:100%;"&gt;ActionMapping 类 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8519"&gt;输入事件通常是在 HTTP 请求表单中发生的，servlet 容器将 HTTP 请求转换为 &lt;code id="qfn8520"&gt;HttpServletRequest&lt;/code&gt; 。控制器查看输入事件并将请求分派给某个 &lt;code id="qfn8521"&gt;Action&lt;/code&gt; 类。 &lt;code id="qfn8522"&gt;struts-config.xml&lt;/code&gt; 确定 Controller 调用哪个 &lt;code id="qfn8523"&gt;Action&lt;/code&gt; 类。 &lt;code id="qfn8524"&gt;struts-config.xml&lt;/code&gt; 配置信息被转换为一组 &lt;code id="qfn8525"&gt;ActionMapping&lt;/code&gt; ，而后者又被放入 &lt;code id="qfn8526"&gt;ActionMappings&lt;/code&gt; 容器中。（您可能尚未注意到这一点，以 &lt;i id="qfn8527"&gt;s&lt;/i&gt;结尾的类就是容器） &lt;/p&gt;&lt;p id="qfn8528"&gt;&lt;code id="qfn8529"&gt;ActionMapping&lt;/code&gt; 包含有关特定事件如何映射到特定 &lt;code id="qfn8530"&gt;Action&lt;/code&gt; 的信息。 &lt;code id="qfn8531"&gt;ActionServlet&lt;/code&gt; (Command) 通过 &lt;code id="qfn8532"&gt;perform()&lt;/code&gt; 方法将 &lt;code id="qfn8533"&gt;ActionMapping&lt;/code&gt; 传递给 &lt;code id="qfn8534"&gt;Action&lt;/code&gt; 类。这样就使 &lt;code id="qfn8535"&gt;Action&lt;/code&gt; 可访问用于控制流程的信息。 &lt;/p&gt;&lt;p id="qfn8536"&gt;&lt;a id="qfn8537" name="N10442"&gt;&lt;span class="smalltitle" id="qfn8538"&gt;&lt;b id="qfn8539"&gt;&lt;span id="qfn8540"   style="font-family:Arial;font-size:100%;"&gt;ActionMappings &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8541"&gt;&lt;code id="qfn8542"&gt;ActionMappings&lt;/code&gt; 是 &lt;code id="qfn8543"&gt;ActionMapping&lt;/code&gt; 对象的一个集合。 &lt;/p&gt;&lt;br id="qfn8544"&gt;&lt;table id="qfn8545" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8546"&gt;&lt;tr id="qfn8547"&gt;&lt;td id="qfn8548"&gt;&lt;img id="qfn8549" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8550"&gt;&lt;img id="qfn8551" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8552" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8553"&gt;&lt;tr id="qfn8554" align="right"&gt;&lt;td id="qfn8555"&gt;&lt;img id="qfn8556" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8557"&gt;&lt;table id="qfn8558" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8559"&gt;&lt;tr id="qfn8560"&gt;&lt;td id="qfn8561" valign="center"&gt;&lt;img id="qfn8562" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8563"&gt;&lt;/td&gt;&lt;td id="qfn8564" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8565" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8566"&gt;&lt;span id="qfn8567"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8568"&gt;&lt;br id="qfn8569"&gt;&lt;p id="qfn8570"&gt;&lt;a id="qfn8571" name="8"&gt;&lt;span class="atitle" id="qfn8572"&gt;再访邮件列表样例&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8573"&gt;下面我们看一下 Struts 是如何解决困扰 &lt;code id="qfn8574"&gt;join.jsp&lt;/code&gt; 的这些问题的。改写后的方案由两个项目组成。第一个项目包含应用程序的逻辑部分，这个应用程序是独立于 Web 应用程序的。这个独立层可能是用 EJB 技术实现的公共服务层。为了便于说明，我使用 Ant 构建进程创建了一个称为 &lt;code id="qfn8575"&gt;business&lt;/code&gt; 的包。有几个原因促使我们使用独立的业务层： &lt;/p&gt;&lt;ul id="qfn8576"&gt;&lt;li id="qfn8577"&gt;&lt;b id="qfn8578"&gt;划分责任&lt;/b&gt; &lt;br id="qfn8579"&gt;单独的包使管理人员能够在开发小组内委派责任。这也有助于提高开发人员的责任心。 &lt;li id="qfn8580"&gt;&lt;b id="qfn8581"&gt;通用件&lt;/b&gt; &lt;br id="qfn8582"&gt;我们设想开发人员将这个包看作一个商业软件。将它放在另外的包中使它更像通用件。这个包可能是通用件，也可能是由组织内部的另一个小组开发的。 &lt;li id="qfn8583"&gt;&lt;b id="qfn8584"&gt;避免不必要的构建和单元测试。&lt;/b&gt; &lt;br id="qfn8585"&gt;分开的构建进程有助于避免不必要的构建和单元测试。 &lt;li id="qfn8586"&gt;&lt;b id="qfn8587"&gt;使用接口开发&lt;/b&gt; &lt;br id="qfn8588"&gt;在进行开发和避免不必要的耦合时，它有助于从接口的观点来思考问题。这是极重要的一个方面。当开发您自己的业务包时，这些业务类不应该关心到底是 Web 应用程序执行调用，还是独立应用程序执行调用。因此，应该避免在业务逻辑层使用对 servlet API 或 Struts API 调用的任何引用。 &lt;li id="qfn8589"&gt;&lt;b id="qfn8590"&gt;稳定性&lt;/b&gt; &lt;br id="qfn8591"&gt;并不是每个组织都每天、每周甚至每月进行检修。因此，在进行开发时，稳定的接口点是重要的。不能因为业务包处于变迁阶段就认为 Web 项目也应该处于变迁阶段。 &lt;/li&gt;&lt;/ul&gt;&lt;p id="qfn8592"&gt;&lt;a id="qfn8593" name="N10493"&gt;&lt;span class="smalltitle" id="qfn8594"&gt;&lt;b id="qfn8595"&gt;&lt;span id="qfn8596"   style="font-family:Arial;font-size:100%;"&gt;业务构建注释&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8597"&gt;我用 Ant 构建项目，并用 JUnit 运行单元测试。business.zip 包含构建业务项目所需的一切，当然 Ant 和 JUnit 除外。这个包脚本将构建类，运行单元测试，创建 Java 文档和 jar 文件，最后将所有这些内容压缩到一个 zip 文件中发送给客户。只要对 &lt;code id="qfn8598"&gt;build.xml&lt;/code&gt; 作一些修改，您就可以将它部署到其他平台上。 &lt;code id="qfn8599"&gt;Business.jar&lt;/code&gt; 位于 Web 的下载部分，因此，您并非必须下载并构建这个业务包。 &lt;/p&gt;&lt;p id="qfn8600"&gt;&lt;a id="qfn8601" name="N104A4"&gt;&lt;span class="smalltitle" id="qfn8602"&gt;&lt;b id="qfn8603"&gt;&lt;span id="qfn8604"   style="font-family:Arial;font-size:100%;"&gt;Web 项目&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8605"&gt;第二个项目是用 Struts 开发的一个 Web 应用程序。您将需要一个符合 JSP 1.1 和 Servlet 2.2 规范的容器。最快的入门方法是下载并安装 Tomcat 3.2（请参阅 &lt;a id="qfn8606" href="http://www.ibm.com/developerworks/cn/java/j-struts/#resources"&gt;&lt;span id="qfn8607"  style="color:#5c81a7;"&gt;参考资源&lt;/span&gt;&lt;/a&gt; ）。直到有 Struts 的 1.0 发行版之前，我建议您从 Jakarta 项目获得最新的版本（请参阅 &lt;a id="qfn8608" href="http://www.ibm.com/developerworks/cn/java/j-struts/#resources"&gt;&lt;span id="qfn8609"  style="color:#5c81a7;"&gt;参考资源&lt;/span&gt;&lt;/a&gt; ）。这对我来说是个大问题，我不能确保我的 Web 项目样例能与您下载的 Struts 一起工作。Struts 仍在不断变化，所以我不得不经常更新我的项目。在本项目中，我使用的是 jakarta-struts-20010105.zip。图 8 显示了此 Web 项目的结构。如果您已安装了 Ant，则运行这个版本将创建一个称为 &lt;code id="qfn8610"&gt;joinStruts.war&lt;/code&gt; 的 war 文件，您随时可以部署这个文件。 &lt;/p&gt;&lt;br id="qfn8611"&gt;&lt;a id="qfn8612" name="N104BB"&gt;&lt;b id="qfn8613"&gt;图 8. Web 项目的结构&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8614"&gt;&lt;img id="qfn8615" height="170" alt="Web project layout" src="http://www.ibm.com/developerworks/cn/java/j-struts/web_project_layout.gif" width="345" /&gt; &lt;br id="qfn8616"&gt;&lt;p id="qfn8617"&gt;清单 4 显示了转换后的 JSP 文件，称为 &lt;code id="qfn8618"&gt;joinMVC.jsp&lt;/code&gt; 。这个文件从最初的 50 行变为 19 行，并且现在不含任何 Java 代码。从网页设计人员的角度来看，这是个巨大的改进。 &lt;/p&gt;&lt;br id="qfn8619"&gt;&lt;a id="qfn8620" name="N104CF"&gt;&lt;b id="qfn8621"&gt;清单 4. joinMVC.jsp -- 再访简单的 JSP &lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8622"&gt;&lt;table id="qfn8623" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8624"&gt;&lt;tr id="qfn8625"&gt;&lt;td class="code-outline" id="qfn8626"&gt;&lt;pre class="displaycode" id="qfn8627"&gt;&amp;lt;%@ page language="java" %&amp;gt; &amp;lt;%@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %&amp;gt; &amp;lt;%@ taglib uri="/WEB-INF/struts-form.tld" prefix="form" %&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;&amp;lt;struts:message key="join.title"/&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body bgcolor="white"&amp;gt; &amp;lt;form:errors/&amp;gt; &amp;lt;h3&amp;gt;Enter your email to join the group&amp;lt;/h3&amp;gt; &amp;lt;form:form action="join.do" focus="email" &amp;gt;     &amp;lt;form:text   property="email" size="30" maxlength="30"/&amp;gt;     &amp;lt;form:submit property="submit" value="Submit"/&amp;gt; &amp;lt;/form:form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8628"&gt;&lt;p id="qfn8629"&gt;&lt;a id="qfn8630" name="N104DD"&gt;&lt;span class="smalltitle" id="qfn8631"&gt;&lt;b id="qfn8632"&gt;&lt;span id="qfn8633"   style="font-family:Arial;font-size:100%;"&gt;网页的变化&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8634"&gt;下面是使用 Struts 标记库之后所发生变化的列表：&lt;/p&gt;&lt;ul id="qfn8635"&gt;&lt;li id="qfn8636"&gt;Import &lt;br id="qfn8637"&gt;&lt;table id="qfn8638" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8639"&gt;&lt;tr id="qfn8640"&gt;&lt;td class="code-outline" id="qfn8641"&gt;&lt;pre class="displaycode" id="qfn8642"&gt;&amp;lt;%@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8643"&gt;用于 Java 代码的 &lt;code id="qfn8644"&gt;&amp;lt;%@page import?&lt;/code&gt; 已被替换为用于 Struts 标记库的 &lt;code id="qfn8645"&gt;&amp;lt;%@ taglib uri?&lt;/code&gt; 。 &lt;br id="qfn8646"&gt;&lt;li id="qfn8647"&gt;文本 &lt;br id="qfn8648"&gt;&lt;table id="qfn8649" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8650"&gt;&lt;tr id="qfn8651"&gt;&lt;td class="code-outline" id="qfn8652"&gt;&lt;pre class="displaycode" id="qfn8653"&gt;&amp;lt;struts:message key="join.title"/&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8654"&gt;资源属性文件包含 &lt;code id="qfn8655"&gt;join.title&lt;/code&gt; 的文本。在本例中，ApplicationResources 属性文件包含这个名值对。这使字符串更易于查看和国际化。 &lt;br id="qfn8656"&gt;&lt;li id="qfn8657"&gt;错误 &lt;br id="qfn8658"&gt;&lt;table id="qfn8659" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8660"&gt;&lt;tr id="qfn8661"&gt;&lt;td class="code-outline" id="qfn8662"&gt;&lt;pre class="displaycode" id="qfn8663"&gt;&amp;lt;form:errors/&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8664"&gt;&lt;code id="qfn8665"&gt;ActionServlet&lt;/code&gt; 或 &lt;code id="qfn8666"&gt;ActionForm&lt;/code&gt; 构建要显示的错误消息。这些错误消息也可以包含在属性文件中。ApplicationResources 也提供了一种格式化错误的方法，即设置 &lt;code id="qfn8667"&gt;error.header&lt;/code&gt; 和 &lt;code id="qfn8668"&gt;error.footer&lt;/code&gt; 。 &lt;br id="qfn8669"&gt;&lt;li id="qfn8670"&gt;HTML 表单 &lt;br id="qfn8671"&gt;&lt;table id="qfn8672" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8673"&gt;&lt;tr id="qfn8674"&gt;&lt;td class="code-outline" id="qfn8675"&gt;&lt;pre class="displaycode" id="qfn8676"&gt;&amp;lt;form:form action="join.do" focus="email" &amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8677"&gt;&lt;ul id="qfn8678"&gt;&lt;li id="qfn8679"&gt;JSP &lt;code id="qfn8680"&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 标记和属性替代了 HTML &lt;code id="qfn8681"&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 标记和属性。 &lt;code id="qfn8682"&gt;&amp;lt;form action="join.jsp" name="join"&amp;gt;&lt;/code&gt; 已更改为 &lt;code id="qfn8683"&gt;&amp;lt;form:form action="join.do" focus="email" &amp;gt;&lt;/code&gt; 。 &lt;li id="qfn8684"&gt;HTML &lt;code id="qfn8685"&gt;&amp;lt;input&amp;gt;&lt;/code&gt; 标记已替换为 &lt;code id="qfn8686"&gt;&amp;lt;form:text/&amp;gt;&lt;/code&gt; 。 &lt;li id="qfn8687"&gt;HTML &lt;code id="qfn8688"&gt;&amp;lt;submit&amp;gt;&lt;/code&gt; 标记已替换为 &lt;code id="qfn8689"&gt;&amp;lt;form:submit/&amp;gt;&lt;/code&gt; 。 &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id="qfn8690"&gt;&lt;a id="qfn8691" name="N1055B"&gt;&lt;span class="smalltitle" id="qfn8692"&gt;&lt;b id="qfn8693"&gt;&lt;span id="qfn8694"   style="font-family:Arial;font-size:100%;"&gt;模型 -- 会话状态&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8695"&gt;&lt;code id="qfn8696"&gt;JoinForm&lt;/code&gt; 扩展了 &lt;code id="qfn8697"&gt;ActionForm&lt;/code&gt; 并包含表单数据。本例中的表单数据只有电子邮件地址。我已为电子邮件地址添加了一个写方法和读方法，以供框架访问。为了便于说明，我重写了 &lt;code id="qfn8698"&gt;validate()&lt;/code&gt; 方法，并使用了 Struts 的跟踪功能。Struts 将创建 &lt;code id="qfn8699"&gt;JoinForm&lt;/code&gt; 并设置状态信息。 &lt;/p&gt;&lt;p id="qfn8700"&gt;&lt;a id="qfn8701" name="N10574"&gt;&lt;span class="smalltitle" id="qfn8702"&gt;&lt;b id="qfn8703"&gt;&lt;span id="qfn8704"   style="font-family:Arial;font-size:100%;"&gt;模型 -- 业务逻辑&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8705"&gt;如前所述， &lt;code id="qfn8706"&gt;Action&lt;/code&gt; 是控制器和实际业务对象之间的接口。 &lt;code id="qfn8707"&gt;JoinAction&lt;/code&gt; 包装了对 &lt;code id="qfn8708"&gt;business.jar&lt;/code&gt; 的调用，这些调用最初在 &lt;code id="qfn8709"&gt;join.jsp&lt;/code&gt; 文件中。 &lt;code id="qfn8710"&gt;JoinAction&lt;/code&gt; 的 &lt;code id="qfn8711"&gt;perform()&lt;/code&gt; 方法在清单 5 中列表。 &lt;/p&gt;&lt;br id="qfn8712"&gt;&lt;a id="qfn8713" name="N10595"&gt;&lt;b id="qfn8714"&gt;清单 5. - JoinAction.perform()&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8715"&gt;&lt;table id="qfn8716" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8717"&gt;&lt;tr id="qfn8718"&gt;&lt;td class="code-outline" id="qfn8719"&gt;&lt;pre class="displaycode" id="qfn8720"&gt;public ActionForward perform(ActionMapping mapping,                              ActionForm form,                              HttpServletRequest request,                              HttpServletResponse response)                              throws IOException, ServletException {     // 抽取我们将会用到的属性和参数     JoinForm joinForm = (JoinForm) form;     String email = joinForm.getEmail();     ActionErrors errors = new ActionErrors();     // 存储输入....     try {         business.db.MailingList.AddEmail(email);     } catch (Exception e) {         // 记录日志，打印栈         // 将错误回显给用户         errors.add("email",new ActionError("error.mailing.db.add"));     }     // 如需任何消息，请将指定的错误消息键保存到     //  HTTP 请求中，以供 &amp;lt;struts:errors&amp;gt; 标记使用。     if (!errors.empty()) {         saveErrors(request, errors);         // 返回到初始表单         return (new ActionForward(mapping.getInput()));     }     // 将控制权转交给 Action.xml 中指定的 'success' URI     return (mapping.findForward("success")); } &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8721"&gt;&lt;p id="qfn8722"&gt;注： &lt;code id="qfn8723"&gt;perform()&lt;/code&gt; 返回一个称为 &lt;code id="qfn8724"&gt;ActionForward&lt;/code&gt; 的类，该类通知控制器下一步该执行什么操作。在本例中，我使用从控制器传入的映射来决定下一步的操作。 &lt;/p&gt;&lt;p id="qfn8725"&gt;&lt;a id="qfn8726" name="N105AA"&gt;&lt;span class="smalltitle" id="qfn8727"&gt;&lt;b id="qfn8728"&gt;&lt;span id="qfn8729"   style="font-family:Arial;font-size:100%;"&gt;控制器&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8730"&gt;我已修改了 JSP 文件，并创建了两个新类：一个类用来包含表单数据，一个类用来调用业务包。最后，我通过修改配置文件 &lt;code id="qfn8731"&gt;struts-config.xml&lt;/code&gt; 将它们整合起来。清单 6 显示了我添加的 action 元素，这个元素用来控制 &lt;code id="qfn8732"&gt;joinMVC.jsp&lt;/code&gt; 的流程。 &lt;/p&gt;&lt;br id="qfn8733"&gt;&lt;a id="qfn8734" name="N105BB"&gt;&lt;b id="qfn8735"&gt;清单 6. Action 配置&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8736"&gt;&lt;table id="qfn8737" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8738"&gt;&lt;tr id="qfn8739"&gt;&lt;td class="code-outline" id="qfn8740"&gt;&lt;pre class="displaycode" id="qfn8741"&gt;&amp;lt;action  path="/join"          name="joinForm"          type="web.mailinglist.JoinAction"         scope="request"         input="/joinMVC.jsp"      validate="true"&amp;gt;     &amp;lt;forward  name="success"  path="/welcome.html"/&amp;gt; &amp;lt;/action&amp;gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8742"&gt;&lt;p id="qfn8743"&gt;&lt;code id="qfn8744"&gt;action&lt;/code&gt; 元素描述了从请求路径到相应的 Action 类的映射，应该用这些类来处理来自这个路径的请求。每个请求类型都应该有相应的 &lt;code id="qfn8745"&gt;action&lt;/code&gt; 元素，用来描述如何处理该请求。对于 join 请求： &lt;/p&gt;&lt;ol id="qfn8746"&gt;&lt;li id="qfn8747"&gt;&lt;code id="qfn8748"&gt;joinForm&lt;/code&gt; 用来容纳表单数据。 &lt;li id="qfn8749"&gt;因为 validate 被标记为 true，所以 &lt;code id="qfn8750"&gt;joinForm&lt;/code&gt; 将试图进行自我验证。 &lt;li id="qfn8751"&gt;&lt;code id="qfn8752"&gt;web.mailinglist.JoinAction&lt;/code&gt; 是用来处理对这个映射的请求的 action 类。 &lt;li id="qfn8753"&gt;如果一切顺利，该请求将转到 &lt;code id="qfn8754"&gt;welcome.jsp&lt;/code&gt; 。 &lt;li id="qfn8755"&gt;如果出现业务逻辑故障，流程将返回到 &lt;code id="qfn8756"&gt;joinMVC.jsp&lt;/code&gt; ，这是最初发出请求的网页。为什么会这样呢？在清单 6 的 action 元素中，有一个称为 &lt;code id="qfn8757"&gt;input&lt;/code&gt; 的属性，其值为 &lt;code id="qfn8758"&gt;"/joinMVC.jsp"&lt;/code&gt; 。在我的 &lt;code id="qfn8759"&gt;JoinAction.perform()&lt;/code&gt; （如清单 5 所示）中，如果业务逻辑失败， &lt;code id="qfn8760"&gt;perform()&lt;/code&gt; 就返回一个 &lt;code id="qfn8761"&gt;ActionForward&lt;/code&gt; ，并以 &lt;code id="qfn8762"&gt;mapping.getInput()&lt;/code&gt; 作为参数。本例中的 &lt;code id="qfn8763"&gt;getInput()&lt;/code&gt; 是 &lt;code id="qfn8764"&gt;"/joinMVC.jsp"&lt;/code&gt; 。如果业务逻辑失败，它将返回到 &lt;code id="qfn8765"&gt;joinMVC.jsp&lt;/code&gt; ，这是最初发出请求的网页。 &lt;/li&gt;&lt;/ol&gt;&lt;br id="qfn8766"&gt;&lt;table id="qfn8767" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8768"&gt;&lt;tr id="qfn8769"&gt;&lt;td id="qfn8770"&gt;&lt;img id="qfn8771" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8772"&gt;&lt;img id="qfn8773" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8774" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8775"&gt;&lt;tr id="qfn8776" align="right"&gt;&lt;td id="qfn8777"&gt;&lt;img id="qfn8778" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8779"&gt;&lt;table id="qfn8780" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8781"&gt;&lt;tr id="qfn8782"&gt;&lt;td id="qfn8783" valign="center"&gt;&lt;img id="qfn8784" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8785"&gt;&lt;/td&gt;&lt;td id="qfn8786" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8787" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8788"&gt;&lt;span id="qfn8789"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8790"&gt;&lt;br id="qfn8791"&gt;&lt;p id="qfn8792"&gt;&lt;a id="qfn8793" name="9"&gt;&lt;span class="atitle" id="qfn8794"&gt;使用 Struts 前后的比较&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8795"&gt;正如我们在图 9 中所看到的那样，复杂性和层都有显著增加。不再存在从 JSP 文件到 Service 层的直接调用。&lt;/p&gt;&lt;br id="qfn8796"&gt;&lt;a id="qfn8797" name="N10625"&gt;&lt;b id="qfn8798"&gt;图 9. 使用 Struts 前后的比较&lt;/b&gt;&lt;/a&gt;&lt;br id="qfn8799"&gt;&lt;img id="qfn8800" height="185" alt="Before and after Struts" src="http://www.ibm.com/developerworks/cn/java/j-struts/before_after.gif" width="385" /&gt; &lt;br id="qfn8801"&gt;&lt;p id="qfn8802"&gt;&lt;a id="qfn8803" name="N10632"&gt;&lt;span class="smalltitle" id="qfn8804"&gt;&lt;b id="qfn8805"&gt;&lt;span id="qfn8806"   style="font-family:Arial;font-size:100%;"&gt;Struts 的优点&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul id="qfn8807"&gt;&lt;li id="qfn8808"&gt;&lt;b id="qfn8809"&gt;JSP 标记机制的使用&lt;/b&gt; &lt;br id="qfn8810"&gt;标记特性从 JSP 文件获得可重用代码和抽象 Java 代码。这个特性能很好地集成到基于 JSP 的开发工具中，这些工具允许用标记编写代码。 &lt;li id="qfn8811"&gt;&lt;b id="qfn8812"&gt;标记库&lt;/b&gt; &lt;br id="qfn8813"&gt;为什么要另发明一种轮子，或标记库呢？如果您在库中找不到您所要的标记，那就自己定义吧。此外，如果您正在学习 JSP 标记技术，则 Struts 为您提供了一个起点。 &lt;li id="qfn8814"&gt;&lt;b id="qfn8815"&gt;开放源码&lt;/b&gt; &lt;br id="qfn8816"&gt;您可以获得开放源码的全部优点，比如可以查看代码并让使用库的每个人检查代码。许多人都可以进行很好的代码检查。 &lt;li id="qfn8817"&gt;&lt;b id="qfn8818"&gt;MVC 实现样例&lt;/b&gt; &lt;br id="qfn8819"&gt;如果您希望创建您自己的 MVC 实现，则 Struts 可增加您的见识。 &lt;li id="qfn8820"&gt;&lt;b id="qfn8821"&gt;管理问题空间&lt;/b&gt; &lt;br id="qfn8822"&gt;分治是解决问题并使问题可管理的极好方法。当然，这是一把双刃剑。问题越来越复杂，并且需要越来越多的管理。 &lt;/li&gt;&lt;/ul&gt;&lt;p id="qfn8823"&gt;&lt;a id="qfn8824" name="N10663"&gt;&lt;span class="smalltitle" id="qfn8825"&gt;&lt;b id="qfn8826"&gt;&lt;span id="qfn8827"   style="font-family:Arial;font-size:100%;"&gt;Struts 的缺点&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul id="qfn8828"&gt;&lt;li id="qfn8829"&gt;&lt;b id="qfn8830"&gt;仍处于发展初期&lt;/b&gt; &lt;br id="qfn8831"&gt;Struts 开发仍处于初级阶段。他们正在向着发行版本 1.0 而努力，但与任何 1.0 版本一样，它不可能尽善尽美。 &lt;li id="qfn8832"&gt;&lt;b id="qfn8833"&gt;仍在变化中&lt;/b&gt; &lt;br id="qfn8834"&gt;这个框架仍在快速变化。Struts 1.0 与 Struts 0.5 相比变化极大。为了避免使用不赞成使用的方法，您可能隔一天就需要下载最新的 Struts。在过去的 6 个月中，我目睹 Struts 库从 90K 增大到 270K 以上。由于 Struts 中的变化，我不得不数次修改我的示例，但我不保证我的示例能与您下载的 Struts 协同工作。 &lt;li id="qfn8835"&gt;&lt;b id="qfn8836"&gt;正确的抽象级别&lt;/b&gt; &lt;br id="qfn8837"&gt;Struts 是否提供了正确的抽象级别？对于网页设计人员而言，什么是正确的抽象级别呢？这是一个用 $64K 的文字才能解释清楚的问题。在开发网页的过程中，我们是否应该让网页设计人员访问 Java 代码？某些框架（如 Velocity）说不应该，但它提供了另一种 Web 开发语言让我们学习。在 UI 开发中限制访问 Java 有一定的合理性。最重要的是，如果让网页设计人员使用一点 Java，他将使用大量的 Java。在 Microsoft ASP 的开发中，我总是看到这样的情况。在 ASP 开发中，您应该创建 COM 对象，然后编写少量的 ASP 脚本将这些 COM 对象联系起来。但是，ASP 开发人员会疯狂地使用 ASP 脚本。我会听到这样的话，“既然我可以用 VBScript 直接编写 COM 对象，为什么还要等 COM 开发人员来创建它呢？”通过使用标记库，Struts 有助于限制 JSP 文件中所需的 Java 代码的数量。Logic Tag 就是这样的一种库，它对有条件地生成输出进行管理，但这并不能阻止 UI 开发人员对 Java 代码的狂热。无论您决定使用哪种类型的框架，您都应该了解您要在其中部署和维护该框架的环境。当然，这项任务真是说起来容易做起来难。 &lt;li id="qfn8838"&gt;&lt;b id="qfn8839"&gt;有限的适用范围&lt;/b&gt; &lt;br id="qfn8840"&gt;Struts 是一种基于 Web 的 MVC 解决方案，所以必须用 HTML、JSP 文件和 servlet 来实现它。 &lt;li id="qfn8841"&gt;&lt;b id="qfn8842"&gt;J2EE 应用程序支持&lt;/b&gt; &lt;br id="qfn8843"&gt;Struts 需要支持 JSP 1.1 和 Servlet 2.2 规范的 servlet 容器。仅凭这一点远不能解决您的全部安装问题，除非使用 Tomcat 3.2。我用 Netscape iPlanet 6.0 安装这个库时遇到一大堆问题，按理说它是第一种符合 J2EE 的应用程序服务器。我建议您在遇到问题时访问 Struts 用户邮件列表的归档资料（请参阅 &lt;a id="qfn8844" href="http://www.ibm.com/developerworks/cn/java/j-struts/#resources"&gt;&lt;span id="qfn8845"  style="color:#5c81a7;"&gt;参考资源&lt;/span&gt;&lt;/a&gt;）。 &lt;br id="qfn8846"&gt;&lt;li id="qfn8847"&gt;&lt;b id="qfn8848"&gt;复杂性&lt;/b&gt; &lt;br id="qfn8849"&gt;在将问题分为几个部分的同时也引入了复杂性。毫无疑问，要理解 Struts 必须接受一定的培训。随着变化的不断加入，这有时会令人很沮丧。欢迎访问本网站。 &lt;li id="qfn8850"&gt;&lt;b id="qfn8851"&gt;在何处...&lt;/b&gt; &lt;br id="qfn8852"&gt;我还能指出其他问题，例如，控制器的客户端验证、可适用工作流程和动态策略模式在什么地方？但是，目前这太容易成为吹毛求疵的问题，有些问题是无关紧要的，或者说应该对 1.0 发行版提这些问题。随着 Struts 小组的不断努力，到您阅读本文时 Struts 说不定已经有了这些功能，或者它很快就会具有这些功能。 &lt;/li&gt;&lt;/ul&gt;&lt;br id="qfn8853"&gt;&lt;table id="qfn8854" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8855"&gt;&lt;tr id="qfn8856"&gt;&lt;td id="qfn8857"&gt;&lt;img id="qfn8858" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8859"&gt;&lt;img id="qfn8860" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8861" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8862"&gt;&lt;tr id="qfn8863" align="right"&gt;&lt;td id="qfn8864"&gt;&lt;img id="qfn8865" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8866"&gt;&lt;table id="qfn8867" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8868"&gt;&lt;tr id="qfn8869"&gt;&lt;td id="qfn8870" valign="center"&gt;&lt;img id="qfn8871" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8872"&gt;&lt;/td&gt;&lt;td id="qfn8873" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8874" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8875"&gt;&lt;span id="qfn8876"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8877"&gt;&lt;br id="qfn8878"&gt;&lt;p id="qfn8879"&gt;&lt;a id="qfn8880" name="10"&gt;&lt;span class="atitle" id="qfn8881"&gt;Struts 的前景&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8882"&gt;在这个软件开发的新时代，一切都变得很快。在不到 5 年的时间内，我已经目睹了从 cgi/perl 到 ISAPI/NSAPI、再到使用 VB 的 ASP、一直到现在的 Java 和 J2EE 的变迁。Sun 正在尽力将新的变化反映到 JSP/servlet 体系结构中，正如他们对 Java 语言和 API 所作的更改一样。您可以从 Sun 的网站获得新的 JSP 1.2 和 Servlet 2.3 规范的草案。此外，一个标准 JSP 标记库即将出现；有关这些规范和标记库的链接，请参阅 &lt;a id="qfn8883" href="http://www.ibm.com/developerworks/cn/java/j-struts/#resources"&gt;&lt;span id="qfn8884"  style="color:#5c81a7;"&gt;参考资源&lt;/span&gt;&lt;/a&gt;。 &lt;/p&gt;&lt;br id="qfn8885"&gt;&lt;table id="qfn8886" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8887"&gt;&lt;tr id="qfn8888"&gt;&lt;td id="qfn8889"&gt;&lt;img id="qfn8890" height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /&gt;&lt;br id="qfn8891"&gt;&lt;img id="qfn8892" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="no-print" id="qfn8893" cellspacing="0" cellpadding="0" align="right"&gt;&lt;tbody id="qfn8894"&gt;&lt;tr id="qfn8895" align="right"&gt;&lt;td id="qfn8896"&gt;&lt;img id="qfn8897" height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;br id="qfn8898"&gt;&lt;table id="qfn8899" cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody id="qfn8900"&gt;&lt;tr id="qfn8901"&gt;&lt;td id="qfn8902" valign="center"&gt;&lt;img id="qfn8903" height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /&gt;&lt;br id="qfn8904"&gt;&lt;/td&gt;&lt;td id="qfn8905" valign="top" align="right"&gt;&lt;a class="fbox" id="qfn8906" href="http://www.ibm.com/developerworks/cn/java/j-struts/#main"&gt;&lt;b id="qfn8907"&gt;&lt;span id="qfn8908"  style="color:#5c81a7;"&gt;回页首&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br id="qfn8909"&gt;&lt;br id="qfn8910"&gt;&lt;p id="qfn8911"&gt;&lt;a id="qfn8912" name="11"&gt;&lt;span class="atitle" id="qfn8913"&gt;最后的注释&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="qfn8914"&gt;Struts 使用标记和 MVC 解决了某些重大问题。这个方法有助于提高代码的可重用性和灵活性。通过将问题划分为更小的组件，当技术空间或问题空间中出现变化时，您就有更多的机会重用代码。此外，Struts 使网页设计人员和 Java 开发人员能将精力集中于自己最擅长的方面。但是，在强健性增强的同时，也意味着复杂性的增加。Struts 比简单的单个 JSP 网页要复杂得多，但对于更大的系统而言，Struts 实际上有助于管理复杂性。另外，我并不想编写自己的 MVC 实现，而只想了解一个这样的实现。不管您是否会使用 Struts，回顾这个 Struts 框架（对不起，应该是库）都会使您对 JSP 文件和 servlet 的特性、以及如何将它们组合起来用于您的下一个 Web 项目有更好的了解。正像翼间支柱是机翼结构中不可缺少的一部分一样，Strut 也可能成为您下一个 Web 项目的不可缺少的一部分。&lt;/p&gt;&lt;br id="qfn8915"&gt;&lt;br id="qfn8916"&gt;&lt;p id="qfn8917"&gt;&lt;a id="qfn8918" name="resources"&gt;&lt;span class="atitle" id="qfn8919"&gt;参考资料 &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul id="qfn8920"&gt;&lt;li id="qfn8921"&gt;您可以参阅本文在 developerWorks 全球站点上的 &lt;a id="qfn8922" href="http://www.ibm.com/developerworks/library/j-struts/index.html?S_TACT=105AGX52&amp;amp;S_CMP=cn-a-j"&gt;&lt;span id="qfn8923"  style="color:#5c81a7;"&gt;英文原文&lt;/span&gt;&lt;/a&gt;. &lt;br id="qfn8924"&gt;&lt;br id="qfn8925"&gt;&lt;li id="qfn8926"&gt;您可以下载本文中所用的代码： &lt;a id="qfn8927" href="http://www.ibm.com/developerworks/cn/java/j-struts/business.zip"&gt;&lt;span id="qfn8928"  style="color:#5c81a7;"&gt;business.zip&lt;/span&gt;&lt;/a&gt; 用来构建 &lt;code id="qfn8929"&gt;business.jar&lt;/code&gt; 文件， &lt;a id="qfn8930" href="http://www.ibm.com/developerworks/cn/java/j-struts/joinStruts.zip"&gt;&lt;span id="qfn8931"  style="color:#5c81a7;"&gt;joinStruts.zip&lt;/span&gt;&lt;/a&gt; 用来构建 &lt;code id="qfn8932"&gt;joinStruts.war&lt;/code&gt; 文件。 &lt;br id="qfn8933"&gt;&lt;br id="qfn8934"&gt;&lt;br id="qfn8935"&gt;&lt;li id="qfn8936"&gt;有关 Struts 的文档、安装说明和下载，请参阅 &lt;a id="qfn8937" href="http://jakarta.apache.org/struts/"&gt;&lt;span id="qfn8938"  style="color:#5c81a7;"&gt;Struts 的主页&lt;/span&gt;&lt;/a&gt;。 &lt;br id="qfn8939"&gt;&lt;br id="qfn8940"&gt;&lt;br id="qfn8941"&gt;&lt;li id="qfn8942"&gt;您可以从 &lt;a id="qfn8943" href="http://jakarta.apache.org/builds/jakarta-struts/nightly/"&gt;&lt;span id="qfn8944"  style="color:#5c81a7;"&gt;Jakarta 项目&lt;/span&gt;&lt;/a&gt;下载最近的 Struts 实现。 &lt;br id="qfn8945"&gt;&lt;br id="qfn8946"&gt;&lt;br id="qfn8947"&gt;&lt;li id="qfn8948"&gt;如想入门，我建议您下载 JSP servlet 的参考实现 &lt;a id="qfn8949" href="http://jakarta.apache.org/builds/tomcat/release/v3.2.1/"&gt;&lt;span id="qfn8950"  style="color:#5c81a7;"&gt;Tomcat 3.2&lt;/span&gt;&lt;/a&gt;。如果您使用 Tomcat 以外的容器，请访问 &lt;a id="qfn8951" href="http://www.mail-archive.com/struts-user@jakarta.apache.org/"&gt;&lt;span id="qfn8952"  style="color:#5c81a7;"&gt;Struts 用户邮件列表&lt;/span&gt;&lt;/a&gt;，以获得在您特定的环境中安装 Struts 的帮助。 &lt;br id="qfn8953"&gt;&lt;br id="qfn8954"&gt;&lt;br id="qfn8955"&gt;&lt;li id="qfn8956"&gt;要获得文档或安装指南中未包含的信息，请参阅 &lt;a id="qfn8957" href="http://www.mail-archive.com/struts-user@jakarta.apache.org/"&gt;&lt;span id="qfn8958"  style="color:#5c81a7;"&gt;Struts 用户邮件列表归档文件&lt;/span&gt;&lt;/a&gt;。 &lt;br id="qfn8959"&gt;&lt;br id="qfn8960"&gt;&lt;br id="qfn8961"&gt;&lt;li id="qfn8962"&gt;要了解将构建和测试过程组合在一起的详细信息，请参阅 " &lt;a id="qfn8963" href="http://www.ibm.com/developerworks/cn/java/j-ant/index.html"&gt;&lt;span id="qfn8964"  style="color:#5c81a7;"&gt;Incremental development with Ant and JUnit&lt;/span&gt;&lt;/a&gt;"。 &lt;br id="qfn8965"&gt;&lt;br id="qfn8966"&gt;&lt;br id="qfn8967"&gt;&lt;li id="qfn8968"&gt;请参阅 &lt;a id="qfn8969" href="http://java.sun.com/aboutJava/communityprocess/first/jsr053/index.html"&gt;&lt;span id="qfn8970"  style="color:#5c81a7;"&gt;Proposed Final Draft for Java Servlet 2.3 and JavaServer Pages 1.2 Specifications&lt;/span&gt;&lt;/a&gt;. &lt;br id="qfn8971"&gt;&lt;br id="qfn8972"&gt;&lt;br id="qfn8973"&gt;&lt;li id="qfn8974"&gt;请参阅 Standard Tag Library for JavaServer Pages， &lt;a id="qfn8975" href="http://java.sun.com/aboutJava/communityprocess/jsr/jsr_052_jsptaglib.html"&gt;&lt;span id="qfn8976"  style="color:#5c81a7;"&gt;JSR #000052&lt;/span&gt;&lt;/a&gt;。 &lt;br id="qfn8977"&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br id="qfn8978"&gt;&lt;br id="qfn8979"&gt;&lt;p id="qfn8980"&gt;&lt;a id="qfn8981" name="author"&gt;&lt;span class="atitle" id="qfn8982"&gt;关于作者&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;table id="qfn8983" cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody id="qfn8984"&gt;&lt;tr id="qfn8985"&gt;&lt;td id="qfn8986" colspan="3"&gt;&lt;img id="qfn8987" height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="qfn8988" valign="top" align="left"&gt;&lt;td id="qfn8989"&gt;&lt;p id="qfn8990"&gt;&lt;/p&gt;&lt;/td&gt;&lt;td id="qfn8991"&gt;&lt;img id="qfn8992" height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /&gt;&lt;/td&gt;&lt;td id="qfn8993" width="100%"&gt;&lt;p id="qfn8994"&gt;Malcolm G. Davis 住在阿拉巴马州伯明翰市，他在自己的咨询公司当总裁。他自称是一名 Java 传道者。他在宣传 Java 的优点的闲暇之余，他会去长跑，或者与自己的孩子一起玩。可以通过 &lt;a id="qfn8995" href="mailto:malcolm@nuearth.com?cc=malcolm@nuearth.com"&gt;&lt;span id="qfn8996"  style="color:#5c81a7;"&gt;malcolm@nuearth.com&lt;/span&gt;&lt;/a&gt; 与 Malcolm 联系。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-2174501250281696698?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dwgFs9u3C90RShQ7O4iY1gaWo40/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dwgFs9u3C90RShQ7O4iY1gaWo40/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dwgFs9u3C90RShQ7O4iY1gaWo40/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dwgFs9u3C90RShQ7O4iY1gaWo40/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/4ZnZRlfxFeo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/2174501250281696698/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=2174501250281696698" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/2174501250281696698?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/2174501250281696698?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/4ZnZRlfxFeo/strutsmvc-servlet-jsp-malcolm-davis.html" title="Struts，MVC 的一种开放源码实" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/05/strutsmvc-servlet-jsp-malcolm-davis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcNRH86cCp7ImA9WxdTEUo.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-7263247461708118389</id><published>2008-05-07T08:18:00.000-07:00</published><updated>2008-05-07T09:01:35.118-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-07T09:01:35.118-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="快乐" /><category scheme="http://www.blogger.com/atom/ns#" term="思想" /><title>培养快乐的心情</title><content type="html">&lt;span &gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;&lt;span style="color:#cc6600;"&gt;    生活是否快乐，完全取决于自己对人生、世界和万物的看法，因此可以说，生活是由思想决定的。&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;    如果我们整天沉浸在快乐之中，所思所想都市快乐的事，我们就能找到快乐；如果我们所想的都是悲伤的事情，我们就会悲伤；如果我们想象一些可怕的事情会发生，我们就会满怀恐惧；如果我们所想的念头都是邪恶的，我们就会心神不安；如果我们害怕失败，结果就会失败；如果我们顾影自怜，人们就会像躲避瘟疫一样躲避我们。&lt;br /&gt;这种说法并不是指心理暗示，也不意味着对于所有的困难，我们都应该用乐天的态度去对待。不是，生命绝对不会如此简单。我的目的在于鼓励大家以正面积极的态度，而不是反面消极的态度去面对生活。换言之，我们不需关注自身的种种问题，但不能仅仅停留在忧虑上。&lt;br /&gt;    关注的意思是要了解问题的关键所在，然后冷静地采取行动加以解决；而忧虑却是在一个狭小的圈子里打转，是自己变得疯狂。&lt;br /&gt;&lt;br /&gt;    内心的平静和我们生活中的种种快乐并不是在于我们身在何处有，拥有什么，或者我们是什么人，而是在于我们的心境如何。&lt;br /&gt;拿破仑用后普通人所追求的一切：荣耀、权力、财富，可是，他却对圣海莲娜说：“我一生中从未有过一天快乐的日子。”海伦·凯特，一个又瞎又聋的女子表示：“我发现生命是如此美好。”&lt;br /&gt;    法国伟大的哲学家蒙坦曾将一下两句话作为自己生活的座右铭：“人们因意外事件所遭受的伤害，不及因自己对这件事情的看法更深。而对所发生的一切事物的意见，完全取决于我们自己。”&lt;br /&gt;    詹姆士·艾伦的《人的思想》说到：&lt;br /&gt;    一个人会发现，当他改变自己对事物和其他人的看法时，事物和其他的人对他来说就会发生改变……要是一个人把他的思想望向光明，他就会很吃惊地发现，他的生活受到很大的影响。人不能吸引他们所要的，却可能吸引他们所有的……能变化气质的神性就存在于我们自己的心思，也就是我们自己……一个人所能得到的，正是他们自己思想的直接结果……有了奋发向上的思想之后，一个人才能兴奋、征服，而能有所成就。如果他不能奋起他的思想，他就永远只能衰弱而愁苦。&lt;br /&gt;&lt;br /&gt;最后送上已故的西贝儿·派屈吉所写的《为了今天》：&lt;br /&gt;(1)、只为今天，我要很快乐。如果林肯所说的“大部分的人只要下决心都能很快乐”这句话是对的，那么快乐是来自内心，而不是存在于外在。&lt;br /&gt;&lt;br /&gt;(2)、只为今天，我要让自己适应一切，而不是试着调整一切来适应我的欲望。我要以这种态度接受我的家庭、我的事业和我的运气。&lt;br /&gt;&lt;br /&gt;(3)、只为今天，我要爱护我的身体。我要多加运动，善自照顾，善自珍惜，不损伤它、不忽视它，使它能成为我争取成功的好基础。&lt;br /&gt;&lt;br /&gt;(4)、只为今天，我要加强我的思想。我要学一些有用的东西，我决不做一个胡思乱想的人。我要看一些需要思考、更需要集中精神才能看的书。&lt;br /&gt;&lt;br /&gt;(5)、只为今天，我要用三件事来锻炼我的灵魂：我要为别人做一件好事，但不要让人家知道；我还要做两件我并不想做的事，而这就是为了锻炼。&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span &gt;&lt;span style="font-size:130%;"&gt;(6)、只为今天，我要做个讨人喜欢的人，外表要尽量修饰，衣着要尽量得体，说话低声，行动优雅，丝毫不在乎别人的毁誉。对任何事情都不挑毛病，也不干涉或教训别人。&lt;br /&gt;&lt;br /&gt;(7)、只为今天，我要试着只考虑怎么度过今天，而不把我一生的问题都想一次解决。因为我虽能连续12小时做—件事，但如果要我一辈子都这样做下去的话，就会吓坏了我。&lt;br /&gt;&lt;br /&gt;(8)、只为今天，我要订下—个计划。我要写下每小时该做些什么，也许我不会完全照着做，但还要订下这个计划；这样至少可以免除两种缺点——过分仓促和犹豫不决。&lt;br /&gt;&lt;br /&gt;(9)、只为今天，我要为自己留下安静的半小时，轻松一番。&lt;br /&gt;&lt;br /&gt;(10)、只为今天，我要心中毫无惧怕。特别是，我不怕快乐，我要去欣赏美的一切，去爱，去相信我爱的那些人会爱我。&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-7263247461708118389?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sygzUBT3ywx_jfx8iwhWIRio_ys/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sygzUBT3ywx_jfx8iwhWIRio_ys/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sygzUBT3ywx_jfx8iwhWIRio_ys/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sygzUBT3ywx_jfx8iwhWIRio_ys/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/i5QV0u2PzWA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/7263247461708118389/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=7263247461708118389" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7263247461708118389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/7263247461708118389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/i5QV0u2PzWA/blog-post.html" title="培养快乐的心情" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/05/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AMRX0zfip7ImA9WxZbGEo.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-5357877768183835754</id><published>2008-04-22T06:19:00.001-07:00</published><updated>2008-04-22T06:43:04.386-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-22T06:43:04.386-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="算法" /><category scheme="http://www.blogger.com/atom/ns#" term="递归" /><category scheme="http://www.blogger.com/atom/ns#" term="分治" /><category scheme="http://www.blogger.com/atom/ns#" term="快速排序" /><title>算法——递归与分治之快速排序</title><content type="html">快速排序的基本思想是，对于输入的子数组a[p:r]，进行&lt;br /&gt;(1)分解(Divide):以a[p]为基准元素将a[p:r]划分为三段a[p:q-1],a[q]和a[q+1:r].是a[p:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于a[q].下表q在划分过程中确定.&lt;br /&gt;(2)递归(Conquer):通过递归调用快速排序算法分别对a[p:q-1]和a[q+1,r]进行排序.&lt;br /&gt;(3)合并(Merge):由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,所以在a[p:q-1]和a[q+1:r]都已排好序后,不需要执行任何计算,a[p:r]就已排好序.&lt;br /&gt;&lt;table bgcolor="#6495ed" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;br /&gt;&lt;strong&gt;#include "iostream.h"&lt;br /&gt;&lt;br /&gt;void QuickSort(int a[], int p, int r);&lt;br /&gt;int Partition(int a[], int p, int r);&lt;br /&gt;void print(int a[], int length);&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt; int a[] = {3, 5, 8, 2, 4, 7, 1};&lt;br /&gt; print(a, 7);&lt;br /&gt; QuickSort(a, 0, 6);&lt;br /&gt; &lt;br /&gt; print(a, 7);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void QuickSort(int a[], int p, int r)&lt;br /&gt;{&lt;br /&gt; if(p &lt; r){&lt;br /&gt;  int q = Partition(a, p, r);&lt;br /&gt;  print(a, 7);&lt;br /&gt;  QuickSort(a, p, q-1);&lt;br /&gt;  print(a, 7);&lt;br /&gt;  QuickSort(a, q+1, r);&lt;br /&gt;  print(a, 7);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int Partition(int a[], int p, int r)&lt;br /&gt;{&lt;br /&gt; int i = p, j = r + 1;&lt;br /&gt; int x = a[p];&lt;br /&gt;&lt;br /&gt; while(true){&lt;br /&gt;  while(a[++i] &lt; x &amp;&amp; i &lt; r);&lt;br /&gt;  while(a[--j] &gt; x);&lt;br /&gt;  if(i &gt;= j)&lt;br /&gt;   break;&lt;br /&gt;  //Swap(a[i], a[j]);&lt;br /&gt;  int temp = a[i];&lt;br /&gt;  a[i] = a[j];&lt;br /&gt;  a[j] = temp;&lt;br /&gt; }&lt;br /&gt; a[p] = a[j];&lt;br /&gt; a[j] = x;&lt;br /&gt;  &lt;br /&gt; return j;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void print(int a[], int length)&lt;br /&gt;{&lt;br /&gt; for(int i = 0; i &lt; length; i++){&lt;br /&gt;  cout &lt;&lt; a[i] &lt;&lt; ", ";&lt;br /&gt; }&lt;br /&gt; cout &lt;&lt; endl;&lt;br /&gt;}&lt;/pre&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-5357877768183835754?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VHCbHraS0i_Lbet_EuwgX_w56oM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VHCbHraS0i_Lbet_EuwgX_w56oM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VHCbHraS0i_Lbet_EuwgX_w56oM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VHCbHraS0i_Lbet_EuwgX_w56oM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/wNygJWjGyV4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/5357877768183835754/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=5357877768183835754" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5357877768183835754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5357877768183835754?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/wNygJWjGyV4/blog-post_22.html" title="算法——递归与分治之快速排序" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/04/blog-post_22.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08AQn8yfyp7ImA9WxZbGEo.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-448830681050158572</id><published>2008-04-22T01:52:00.000-07:00</published><updated>2008-04-22T06:44:03.197-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-22T06:44:03.197-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="算法" /><category scheme="http://www.blogger.com/atom/ns#" term="最接近点对" /><category scheme="http://www.blogger.com/atom/ns#" term="递归" /><category scheme="http://www.blogger.com/atom/ns#" term="分治" /><title>算法——递归与分治之最接近点对问题</title><content type="html">&lt;span style="font-size:130%;"&gt;给定平面上n个点，找其中的一对点，使得在n个点组成的所有点对中，该点对的距离最小。&lt;/span&gt;&lt;br /&gt;1.一维的情况&lt;br /&gt;&lt;table bgcolor="#6495ed" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;br /&gt;&lt;strong&gt;package com.yuxh.nearestPoints;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;import java.util.Collections;&lt;br /&gt;import java.util.LinkedList;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import com.yuxh.util.SimplePrint;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author YuXH&lt;br /&gt; * @version $Revision: 1.0 $, $Date: 2008/04/22 16:27:55 $&lt;br /&gt; */&lt;br /&gt;public class NearestPoints {&lt;br /&gt;&lt;br&gt;&lt;br /&gt; /*&lt;br /&gt;  * 求一维点集s的最接近点对的算法&lt;br /&gt;  */&lt;br /&gt; public int cpair1(int s[]) {&lt;br /&gt;  int d = 1000;&lt;br /&gt;  if (s.length == 2) {&lt;br /&gt;   d = Math.abs(s[0] - s[1]);&lt;br /&gt;  } else if (s.length == 1) {&lt;br /&gt;   d = 1000;&lt;br /&gt;  } else {&lt;br /&gt;   // m = s中各点的中位数&lt;br /&gt;   // 构造s1和s2&lt;br /&gt;   int s1[] = new int[(s.length + 1) / 2];&lt;br /&gt;   int s2[] = new int[s.length / 2];&lt;br /&gt;   int midDivArray[] = midDiv(s);&lt;br /&gt;   for (int i = 0; i &lt; midDivArray.length; i++) {&lt;br /&gt;    if (i &lt; (midDivArray.length + 1) / 2) {// 构造s1&lt;br /&gt;     s1[i] = midDivArray[i];&lt;br /&gt;    } else {// 构造s2&lt;br /&gt;     s2[i - ((s.length + 1) / 2)] = midDivArray[i];&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;&lt;br&gt;&lt;br /&gt;   SimplePrint.print("s1: ", s1);&lt;br /&gt;   SimplePrint.print("s2: ", s2);&lt;br /&gt;&lt;br&gt;&lt;br /&gt;   int d1 = cpair1(s1);&lt;br /&gt;   int d2 = cpair1(s2);&lt;br /&gt;   int p = max(s1);&lt;br /&gt;   int q = min(s2);&lt;br /&gt;   int res[] = { d1, d2, q - p };&lt;br /&gt;   d = min(res);&lt;br /&gt;  }&lt;br /&gt;&lt;br&gt;&lt;br /&gt;  System.out.println("d: " + d);&lt;br /&gt;  return d;&lt;br /&gt; }&lt;br /&gt;&lt;br&gt;&lt;br /&gt; /*&lt;br /&gt;  * 求s中的最大元素&lt;br /&gt;  */&lt;br /&gt; private int max(int s[]) {&lt;br /&gt;  LinkedList&lt;Integer&gt; list = new LinkedList&lt;Integer&gt;();&lt;br /&gt;  for (int i = 0; i &lt; s.length; i++) {&lt;br /&gt;   list.add(s[i]);&lt;br /&gt;  }&lt;br /&gt;&lt;br&gt;&lt;br /&gt;  return Collections.max(list);&lt;br /&gt; }&lt;br /&gt;&lt;br&gt;&lt;br /&gt; /*&lt;br /&gt;  * 求s中的最小元素&lt;br /&gt;  */&lt;br /&gt; private int min(int s[]) {&lt;br /&gt;  LinkedList&lt;Integer&gt; list = new LinkedList&lt;Integer&gt;();&lt;br /&gt;  for (int i = 0; i &lt; s.length; i++) {&lt;br /&gt;   list.add(s[i]);&lt;br /&gt;  }&lt;br /&gt;&lt;br&gt;&lt;br /&gt;  return Collections.min(list);&lt;br /&gt; }&lt;br /&gt;&lt;br&gt;&lt;br /&gt; /*&lt;br /&gt;  * 求中位数&lt;br /&gt;  */&lt;br /&gt; private int[] midDiv(int inputArray[]) {&lt;br /&gt;  int midLoc = inputArray.length / 2;&lt;br /&gt;  for (int i = 0; i &lt; inputArray.length; i++) {&lt;br /&gt;   if (i &lt; midLoc) {&lt;br /&gt;    if (inputArray[i] &gt; inputArray[midLoc]) {&lt;br /&gt;     // 交换&lt;br /&gt;     int temp = inputArray[i];&lt;br /&gt;     inputArray[i] = inputArray[midLoc];&lt;br /&gt;     inputArray[midLoc] = temp;&lt;br /&gt;    }&lt;br /&gt;   } else {&lt;br /&gt;    if (inputArray[i] &lt; inputArray[midLoc]) {&lt;br /&gt;     // 交换&lt;br /&gt;     int temp = inputArray[i];&lt;br /&gt;     inputArray[i] = inputArray[midLoc];&lt;br /&gt;     inputArray[midLoc] = temp;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br&gt;&lt;br /&gt;  return inputArray;&lt;br /&gt; }&lt;br /&gt;&lt;br&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  NearestPoints np = new NearestPoints();&lt;br /&gt;  int testArray[] = { 2, 10, 6, 79, 15, 68, 45, 66, 75 };&lt;br /&gt;  SimplePrint.print("origenal array: ", testArray);&lt;br /&gt;  System.out.println("End of d: " + np.cpair1(testArray));&lt;br /&gt; }&lt;br /&gt;}&lt;/strong&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-448830681050158572?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fUZjXZQXqPfYwg4lzJK8hGx3fdA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fUZjXZQXqPfYwg4lzJK8hGx3fdA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fUZjXZQXqPfYwg4lzJK8hGx3fdA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fUZjXZQXqPfYwg4lzJK8hGx3fdA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/hkcrzdBUWiM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/448830681050158572/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=448830681050158572" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/448830681050158572?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/448830681050158572?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/hkcrzdBUWiM/blog-post.html" title="算法——递归与分治之最接近点对问题" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YHQX0zfyp7ImA9WxZUFEQ.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-8380039172467887459</id><published>2008-04-02T06:54:00.000-07:00</published><updated>2008-04-06T08:18:50.387-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-06T08:18:50.387-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wikipeddia" /><category scheme="http://www.blogger.com/atom/ns#" term="GFW" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>神奇，可以上wekipedia了！</title><content type="html">今天无意，居然上了wikipedia！&lt;br /&gt;&lt;br /&gt;听完微软亚洲研究院副院长王坚的讲座，提到以个叫memex的东西，觉得比较有意思，&lt;br /&gt;回来Google了一下，"手气不错"。&lt;br /&gt;奇迹出现了，居然转到wikipedia上了，因该有人知道wikipedia是被GFW长期封杀的对象，再从wikipedia的memex页面转到wikipedia的主页，成功了。不管是浏览内容还是搜索资料，速度都很快。&lt;br /&gt;wikipedia就不用介绍了吧&lt;br /&gt;看看主页：&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5184647874372741970" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 493px; CURSOR: hand; HEIGHT: 394px; TEXT-ALIGN: center" height="297" alt="" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_ORxbV4q1I/AAAAAAAAAB4/ObyTxig99G4/s320/main.bmp" width="400" border="0" /&gt;&lt;br /&gt;看看wikipedia上的GFW： &lt;img id="BLOGGER_PHOTO_ID_5184648497142999906" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 325px; CURSOR: hand; HEIGHT: 153px; TEXT-ALIGN: center" height="179" alt="" src="http://bp3.blogger.com/_qB1PewA0e3Y/R_OSVrV4q2I/AAAAAAAAACA/pM1gIft_r_I/s320/gfw.bmp" width="339" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;好，现在分享一下wikipedia&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Main_Page"&gt;http://en.wikipedia.org/wiki/Main_Page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;只是不明白，为什么中国大陆要封了wikipedia这么好的资源，实在可惜&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-8380039172467887459?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-8Wwhwg6oOM30eEyXz4JkchZm80/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-8Wwhwg6oOM30eEyXz4JkchZm80/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-8Wwhwg6oOM30eEyXz4JkchZm80/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-8Wwhwg6oOM30eEyXz4JkchZm80/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/KL3RSIilFsU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/8380039172467887459/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=8380039172467887459" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/8380039172467887459?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/8380039172467887459?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/KL3RSIilFsU/wekipedia.html" title="神奇，可以上wekipedia了！" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_qB1PewA0e3Y/R_ORxbV4q1I/AAAAAAAAAB4/ObyTxig99G4/s72-c/main.bmp" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/04/wekipedia.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEARHk6cCp7ImA9WxZXGUU.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-4656799904755074105</id><published>2008-03-08T04:42:00.000-08:00</published><updated>2008-03-08T04:50:45.718-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-08T04:50:45.718-08:00</app:edited><title>失败的英雄-查尔斯·巴贝奇(Charles Babbage)</title><content type="html">&lt;a href="http://bp3.blogger.com/_qB1PewA0e3Y/R9KLifxq3oI/AAAAAAAAABk/jTrJ77rqYq0/s1600-h/2.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_qB1PewA0e3Y/R9KLifxq3oI/AAAAAAAAABk/jTrJ77rqYq0/s320/2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5175352346563763842" /&gt;&lt;/a&gt;&lt;br /&gt;今天出版的许多计算机书籍扉页里，都登载着这位先生的照片：宽阔的额，狭长的嘴，锐利的目光显得有些愤世嫉俗，坚定的但绝非缺乏幽默的外貌，给人以一种极富深邃思想的学者形象，有人或许知道他的大名——查尔斯•巴贝奇（Charles Babbage）。 &lt;br /&gt;　　巴贝奇，1792年出生在英格兰西南部的托特纳斯，是一位富有的银行家的儿子，后来继承了相当丰厚的遗产，但他把金钱都用于了科学研究。童年时代的巴 贝奇显示出极高的数学天赋，考入剑桥大学后，他发现自己掌握的代数知识甚至超过了教师。毕业留校，24岁的年青人荣幸地受聘担任剑桥“路卡辛讲座”的数学 教授。这是一个很少有人能够获得的殊荣，牛顿的老师巴罗是第一名，牛顿是第二名。假若巴贝奇继续在数学理论领域耕耘，他本来是可以走上鲜花铺就的坦途。然 而，这位旷世奇才却选择了一条无人敢于攀登的崎岖险路。 &lt;br /&gt;　　事情恐怕还得从法国讲起。18世纪末，法兰西发起了一项宏大的计算工程——人工编制《数学用表》，这在没有先进计算工具的当时，可是件极其艰巨的工 作。法国数学界调集大批精兵强将，组成了人工手算的流水线，算得个天昏地暗，才完成了17卷大部头书稿。即便如此，计算出的数学用表仍然存在大量错误。 &lt;br /&gt;　　据说有一天，巴贝奇与著名的天文学家赫舍尔凑在一起，对两大部头的天文数表评头论足，翻一页就是一个错，翻两页就有好几双。面对错误百出的数学表，巴 贝奇目噔口呆，他甚至喊出声来：“天哪，但愿上帝知道，这些计算错误已经充斥弥漫了整个宇宙！”这件事也许就是巴贝奇萌生研制计算机构想的起因。巴贝奇在 他的自传《一个哲学家的生命历程》里，写到了大约发生在1812年的一件事：“有一天晚上，我坐在剑桥大学的分析学会办公室里，神志恍惚地低头看着面前打 开的一张对数表。一位会员走进屋来，瞧见我的样子，忙喊道：‘喂！你梦见什么啦？’我指着对数表回答说：‘我正在考虑这些表也许能用机器来计算！’” &lt;br /&gt;　　巴贝奇的第一个目标是制作一台“差分机”，那年他刚满20岁。他从法国人杰卡德发明的提花织布机上获得了灵感，差分机设计闪烁出了程序控制的灵光—— 它能够按照设计者的旨意，自动处理不同函数的计算过程。1882年，巴贝奇小试锋芒，初战告捷，第一台差分机呱呱坠地。但是，这一“小试”也耗去了整整 10年。这是因为当时的工业技术水平极差，从设计绘图到零件加工，都得自己亲自动手。好在巴贝奇自小就酷爱并熟悉机械加工，车钳刨铣磨，样样拿手。在他孤 军奋战下造出的这台机器，运算精度达到了6位小数，当即就演算出好几种函数表。以后实际运用证明，这种机器非常适合于编制航海和天文方面的数学用表。 &lt;br /&gt;　　“春风得意马蹄疾”。成功的喜悦激励着巴贝奇，他连夜奋笔上书皇家学会，要求政府资助他建造第二台运算精度为20位的大型差分机。英国政府看到巴贝奇 的研究有利可图，破天荒地与科学家签订了第一个合同，财政部慷慨地为这台大型差分机提供出1.7万英镑的资助。巴贝奇自己也贴进去1.3万英镑巨款，用以 弥补研制经费的不足。在当年，这笔款项的数额无异于天文数字——有关资料介绍说，1831年约翰•布尔制造一台蒸汽机车的费用才784英磅。 &lt;br /&gt;　　然而，英国政府和巴贝奇都失了算，第二台差分机在剑桥的“阴沟”里面翻了船！我们可以设身处地替巴贝奇想一想，第二台差分机大约有25000个零件， 主要零件的误差不得超过每英寸千分之一，即使用现在的加工设备和技术，要想造出这种高精度的机械也绝非易事。巴贝奇把差分机交给了英国最著名的机械工程师 约瑟夫•克莱门特所属的工厂制造，但工程进度十分缓慢。设计师心急火燎，从剑桥到工厂，从工厂到剑桥，一天几个来回。他把图纸改了又改，让工人把零件重做 一遍又一遍。年复一年，日复一日，直到又一个10年过去后，巴贝奇依然望着那些不能运转的机器发愁，全部零件亦只完成不足一半数量。参加试验的同事们再也 坚持不下去，纷纷离他而去如鸟兽散。巴贝奇独自苦苦支撑了第三个１０年，终于感到自己再也无力回天。那天清晨，巴贝奇蹒跚走进车间。 偌大的作业场空无一人，只剩下满地的滑车和齿轮， 四处一片狼籍。 他呆立在尚未完工的机器旁， 深深地叹了口气， 终于“怆然而涕下”。在痛苦的煎熬中，他无计可施，只得把全部设计图纸和已完成的部分零件送进伦敦皇家学院博物馆供人观赏。&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_qB1PewA0e3Y/R9KLAvxq3lI/AAAAAAAAABM/s0UGZ_ZC5KU/s1600-h/Img240038544.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_qB1PewA0e3Y/R9KLAvxq3lI/AAAAAAAAABM/s0UGZ_ZC5KU/s320/Img240038544.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5175351766743178834" /&gt;&lt;/a&gt; &lt;br /&gt;1842年，在巴贝奇的一生中是极不平常的一年。那年冬天，伦敦的气候格外寒冷，巴贝奇的身心全都冷得发颤。英国政府宣布断绝对他的一切资助，连科学 界的友人都用一种怪异的目光看着他。英国首相讥讽道：“这部机器的唯一用途，就是花掉大笔金钱！”同行们讥笑他是“愚笨的巴贝奇”。皇家学院的权威人士， 包括著名的天文学家艾瑞等人，都公开宣称他的差分机“毫无任何价值”…… &lt;br /&gt;　　就在这痛苦艰难的时刻，一缕春风悄然吹开巴贝奇苦闷的心扉。他意外地收到一封来信，写信人不仅对他表示理解而且还希望与他共同工作。娟秀字体的签名，表明了她不凡的身份——伯爵夫人。 &lt;br /&gt;　　接到信函后不久，巴贝奇实验室门口走进来一位年轻的女士。只见她身披素雅的斗蓬，鬓角上斜插一束白色的康乃馨，显得那么典雅端庄，面带着衿持的微笑， 向巴贝奇弯腰行了个致敬礼。巴贝奇一时愣在那里，他与这位女士似曾相识，又想不起曾在何处邂逅。女士落落大方地作了自我介绍，来访者正是那位伯爵夫人。 &lt;br /&gt;　　“您还记得我吗？”女士低声问道，“十多年前，您还给我讲过差分机原理。”看到巴贝奇迷惑的眼神，她又笑着补充说：“您说我像野人见到了望远镜。”巴 贝奇恍然大悟，想起已经十分遥远的往事。面前这位俏丽的女士和那个小女孩之间，依稀还有几分相似。 &lt;br /&gt;　　原来，夫人本名叫阿达•奥古斯塔，是英国大名鼎鼎的诗人拜伦之独生女。她比巴贝奇的年龄要小２０多岁，１８１５年才出生。阿达自小命运多蹇，来到人世 的第二年，父亲拜伦因性格不合与她的母亲离异，从此别离英国。可能是从未得到过父爱的缘由，小阿达没有继承到父亲诗一般的浪漫热情，却继承了母亲的数学才 能和毅力。那还是阿达的少女时代，母亲的一位朋友领着她们去参观巴贝奇的差分机。其他女孩子围着差分机叽叽喳喳乱发议论，摸头不是脑。只有阿达看得非常仔 细，她十分理解并且深知巴贝奇这项发明的重大意义。 &lt;br /&gt;　　或许是这个小女孩特殊的气质，在巴贝奇的记忆里打下了较深的印记。他赶紧请阿达入座，并欣然同意与这位小有名气的数学才女共同研制新的计算机器。 &lt;br /&gt;　　就这样，在阿达２７岁时，她成为巴贝奇科学研究上的合作伙伴，迷上这项常人不可理喻的“怪诞”研究。其时，她已经成了家，丈夫是洛甫雷斯伯爵。按照英国的习俗，许多资料在介绍里都把她称为“洛甫雷斯伯爵夫人”。 &lt;br /&gt;　　30年的困难和挫折并没有使巴贝奇折服，阿达的友情援助更坚定了他的决心。还在大型差分机进军受挫的1834年，巴贝奇就已经提出了一项新的更大胆的 设计。他最后冲刺的目标，不是仅仅能够制表的差分机，而是一种通用的数学计算机。巴贝奇把这种新的设计叫做“分析机”，它能够自动解算有100个变量的复 杂算题，每个数可达25位，速度可达每秒钟运算一次。今天我们再回首看看巴贝奇的设计，分析机的思想仍然闪烁着天才的光芒。 &lt;br /&gt;　　巴贝奇首先为分析机构思了一种齿轮式的“存贮库”，每一齿轮可贮存10个数，总共能够储存1000个50位数。分析机的第二个部件是所谓“运算室”， 其基本原理与帕斯卡的转轮相似，但他改进了进位装置，使得50位数加50位数的运算可完成于一次转轮之中。此外，巴贝奇也构思了送入和取出数据的机构、以 及在“存储库”和“运算室”之间运输数据的部件。他甚至还考虑到如何使这台机器处理依条件转移的动作。一个多世纪过去后，现代电脑的结构几乎就是巴贝奇分 析机的翻版，只不过它的主要部件被换成了大规模集成电路而已。仅此一说，巴贝奇就当之无愧于计算机系统设计的“开山鼻祖”。 &lt;br /&gt;　　俏阿达“心有灵犀一点通”，她非常准确地评价道：“分析机‘编织’的代数模式同杰卡德织布机编织的花叶完全一样”。于是，为分析机编制一批函数计算程 序的重担，落到了数学才女柔弱的肩头。阿达开天辟地第一回为计算机编出了程序，其中包括计算三角函数的程序、级数相乘程序、伯努利函数程序等等。阿达编制 的这些程序，即使到了今天，电脑软件界的后辈仍然不敢轻易改动一条指令。人们公认她是世界上第一位软件工程师，港台地区的书刊，还把她请上了软件界“开山 祖师奶”的赫赫宝座。众所周知，美国国防部据说是花了250亿美元和10年的光阴，把它所需要软件的全部功能混合在一种计算机语言中，希望它能成为军方数 千种电脑的标准。1981年，这种语言被正式命名为ADA语言，使阿达的英名流传至今。 &lt;br /&gt;　　不过，以上讲的都是后话，殊不知巴贝奇和阿达当年处在怎样痛苦的水深火热之中！由于得不到任何资助，巴贝奇为把分析机的图纸变成现实，耗尽了自己全部 财产，搞得一贫如洗。他只好暂时放下手头的活，和阿达商量设法赚一些钱，如制作什么国际象棋玩具，什么赛马游戏机等等。为筹措科研经费，他们不得不“下 海”搞“创收”。最后，两人陷入了惶惶不可终日的窘境。阿达忍痛两次把丈夫家中祖传的珍宝送进当铺，以维持日常开销，而这些财宝又两次被她母亲出资赎了回 来。 &lt;br /&gt;　　贫困交夹，无休无止脑力劳动，阿达的健康状况急剧恶化。1852年，怀着对分析机成功的美好梦想和无言的悲怆，巾帼软件奇才魂归黄泉，香消魄散，死时年仅36岁。 &lt;br /&gt;　　阿达去后，巴贝奇又默默地独自坚持了近20年。晚年的他已经不能准确地发音，甚至不能有条理地表达自己的意思，但是他仍然百折不挠地坚持工作。 &lt;br /&gt;　　上帝对巴贝奇和阿达太不公平！分析机终于没能造出来，他们失败了。巴贝奇和阿达的失败是因为他们看得太远，分析机的设想超出了他们所处时代至少一个世 纪！然而，他们留给了计算机界后辈们一份极其珍贵的精神遗产，包括30种不同的设计方案，近2000张组装图和50000张零件图……，更包括那种在逆境 中自强不息，为追求理想奋不顾身的拼搏！ &lt;br /&gt;　　1871年，为计算机事业而贡献了终生的先驱者终于闭上了眼睛。当时就有人把他的大脑用盐渍着保存起来，想经过若干年后，有更先进技术来研究他大脑特别的机制；现在的人们，当然更不会以成败来论英雄！ &lt;br /&gt;&lt;br /&gt;摘自百度博客：http://hi.baidu.com/cmpang/blog/item/d8bfbc519dd4bf18377abe16.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-4656799904755074105?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xDg5ZI-Oyow0RWzR4METkIe2uDk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xDg5ZI-Oyow0RWzR4METkIe2uDk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xDg5ZI-Oyow0RWzR4METkIe2uDk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xDg5ZI-Oyow0RWzR4METkIe2uDk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/jLXd7n3og9Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/4656799904755074105/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=4656799904755074105" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/4656799904755074105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/4656799904755074105?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/jLXd7n3og9Y/charles-babbage.html" title="失败的英雄-查尔斯·巴贝奇(Charles Babbage)" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp3.blogger.com/_qB1PewA0e3Y/R9KLifxq3oI/AAAAAAAAABk/jTrJ77rqYq0/s72-c/2.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/03/charles-babbage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UCQHo4fyp7ImA9WxZXGUo.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-3086938757763391337</id><published>2008-03-08T04:22:00.000-08:00</published><updated>2008-03-08T04:27:41.437-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-08T04:27:41.437-08:00</app:edited><title>C语言和Unix的发明史</title><content type="html">&lt;a href="http://bp2.blogger.com/_qB1PewA0e3Y/R9KF5Pxq3iI/AAAAAAAAAA0/puPFcz7u7mw/s1600-h/thompson.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_qB1PewA0e3Y/R9KF5Pxq3iI/AAAAAAAAAA0/puPFcz7u7mw/s320/thompson.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5175346140336021026" /&gt;&lt;/a&gt;&lt;br /&gt;在计算机发展的历史上，大概没有哪个程序设计语言像C那样得到如此广泛地流行；也没有哪个操作系统像UNIX那样获得计算机厂家和用户的普遍青睐和厚爱。它们对整个软件技术和软件产业都产生了深远的影响。而C和UNIX两者都是贝尔实验室的丹尼斯·里奇（Dennis MacAlistair Ritchie）和肯尼思·汤普森（Kenneth Lane Thompson）设计、开发的。因此，他们两人共同获得1983年度的图灵奖是情理中的事。我们先介绍汤普森，因为就C和UNN两者的关系而言，UNIX的开发在前，C是为了使UNIX具有可移植性而后来研制的；就里奇和汤普森两人的关系而言，他们两人当然是亲密的合作者，但汤普森在UNIX的开发中起了主导的作用，而里奇则在C的设计中起的作用更大一些。&lt;br /&gt;汤普森1943年2月4日生于路易斯安娜州的新奥尔良，其父是美国海军战斗机的驾驶员。汤普森自幼的爱好有两个，一个是下棋，一个是组装晶体管收音机。他父亲为了发展孩子的智力和能力，在晶体管当时问世不久，价格不菲（每只晶体管约售10美元）的情况下，很舍得为汤普森买晶体管让他摆弄。由于爱好无线电，汤普森上加州大学伯克利分校时学的专业是电气工程，于1965年取得学士学位，第二年又取得硕士学位。求诩洌共渭恿送ㄓ枚ρЧ荆?General Dynamics Corporation）在伯克利实行的半工半读计划（ work－study Program），因此既增长了知识，又积累了不少实践经验。&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_qB1PewA0e3Y/R9KFnPxq3hI/AAAAAAAAAAs/yZ4sCzS-G6w/s1600-h/431px-Dennis_Ritchie.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_qB1PewA0e3Y/R9KFnPxq3hI/AAAAAAAAAAs/yZ4sCzS-G6w/s320/431px-Dennis_Ritchie.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5175345831098375698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;毕业以后，汤普森加盟贝尔实验室。虽然他学的是电子学，主要是硬件课程，但由于他半工半读时在一个计算中心当过程序员，对软件也相当熟悉，而且更加偏爱，因此很快就和里奇一起被贝尔派到MIT去参加由ARPA出巨资支持的MAC项目，开发第二代分时系统MULTICS。但就在项目完成前不久，贝尔因感到开发费用太大，而成功的希望则不大而退出了该项目，把所有成员都调回贝尔。这使汤普森和里奇深感沮丧。返回贝尔以后，面对实验室中仍以批处理方式工作的落后的计算机环境，他们决心以他们在MAC项目中已学到的多用户、多任务技术来改造这种环境，以提高程序员的效率和设备的效率，便于人机交互和程序员之间的交互，用他们后来描写自己当时的心情和想法的话来说，就是“要创造一个舒适、愉快的工作环境”。但他们意识到，贝尔领导人既然下决心退出MAC，就不可能支持他们的想法，不可能为之立项，提供资金和设备，他们只能悄悄干，自己去创造条件。1969年，万般无奈的汤普森在库房中偶然发现一台已弃置不用的PDP－7，大喜过望，立即开始用它来实施他们的设想。但开头是十分困难的，因为这q PDP－7除了有一个硬盘、一个图形显示终端和一台电传打字机这些硬设备外，什么软件也没有。&lt;br /&gt;&lt;br /&gt;他们只能在一台 GE 645大型机上编程、调试，调通以后穿孔在纸带上，再输入PDP－7。以这种“可怕的”工作方式开发两年以后，连这台PDP－7也损坏得不能再用了。这时，他们听到一个消息，实验室的专利部需要一个字处理系统以便处理专利申请书（贝尔每年要提出不少专利申请），汤普森立即找到上级自告奋勇承担这一开发任务，在这个冠冕堂皇的借口下，他们申请到了一台新的、设备完善的PDP－ 11，这才使开发工作顺利地真正开展起来。&lt;br /&gt;&lt;br /&gt;汤普森以极大的热情和极高的效率投入工作。开发基本上以每个月就完成一个模块（内核，文件系统，内存管理，I/O……）的速度向前推进，到1971年底，UNIX基本成形。UNIX这个名称是从MUL－TICS演变而来的：他们变MULTI为UNI，变CS为X。为了向上级“交差”，UNIX首先交给实验室的专利部使用，3个打字员利用UNIX输人贝尔当年的专利申请表，交口称赞系统好用，大大提高了工作效率，这样，UNIX迅速从专利部推广到贝尔的其他部门，又从贝尔内部推向社会。贝尔实验室的领导人终于认识到了UNIX的巨大价值，把它注册成为商标（但有趣的是，由于法律上的原因，注册商标及版权被贝尔的上属公司AT＆T取得），推向市场。贝尔的一个行政长官甚至宣称，在贝尔的无数发明中，UNIX是继晶体管之后的最重要的一项发明。著名的国际咨询公司 IDC的高级分析员 Huie Bruce Kin估计，1985年单是美国就有27万7千个计算机系统使用UNIX，1990年这个数字增长至210万。目前世界上UNIX的安装数量超过500万套，用户数达到3000万。&lt;br /&gt;&lt;br /&gt;UNIX之所以获得如此巨大的成功，主要是它采用了一系列先进的技术和措施，解决了一系列软件工程的问题，使系统具有功能简单实用，操作使用方便，结构灵活多样的特点。它是有史以来使用最广的操作系统之一，也是关键应用中的首选操作系统。UNIX成为后来的操作系统的楷模，也是大学操作系统课程的“示范标本”。归纳起来，UNIX的主要特性如下：&lt;br /&gt;&lt;br /&gt;1作为多用户多任务操作系统，每个用户都可同时运行多个进程。&lt;br /&gt;&lt;br /&gt;2提供了丰富的经过精心编选的系统调用。整个系统的实现紧凑、简洁、优美。&lt;br /&gt;&lt;br /&gt;3提供功能强大的可编程外壳（Shell）语言作为用户界面，具有简洁高效的特点。&lt;br /&gt;&lt;br /&gt;4采用树形文件结构，具有良好的安全性、保密性和可维护性。&lt;br /&gt;&lt;br /&gt;5提供多种通信机制，如管道通信、软中断通信、消息通信、共享存储器通信和信号灯通信。&lt;br /&gt;&lt;br /&gt;6采用进程对换内存管理机制和请求调页内存管理方式实现虚存，大大提高了内存使用效率。&lt;br /&gt;&lt;br /&gt;7系统主要用C编写，不但易读、易懂、易修改，更极大提高了可移植性。&lt;br /&gt;&lt;br /&gt;由于以上特点，也由于看好UNIX的应用和前景，各大公司纷纷推出自己的 UNIX版本，如 IBM的 AIX，SUN的Solaris，HP的 HP－UX， SCO的 UNIXWARE和 open Server， DEC（已被 Compaq收购）的digital UNIX，以及加州大学伯克利分校的 UNIX BSD。这些 UNIX各具特色，形成百花齐放的局面。到20世纪op年代，UNIX版本多达100余个。UNIX的标准化工作则经历了一个复杂的过程。最早是UNIX用户协会从20世纪80年代开始此项工作，1984年颁布了试用标准。后来此工作被IEEE接收和继承，制定了多个基于UNIX的“仍移植操作系统环境”标准，即POSIX。而计算机厂家在UNIX标准上则分裂为两大阵营，即以AT＆T和SUN为首的UNIX国际（UI）和以IBM、HP、DEC为首的开放系统基金会（OSF）。分裂和竞争一方面促进了UNIX技术的迅猛发展，另外一方面则引起用户的困惑，不利于UNIX市场的健康发展。因此，1993年3月，两大阵营终于走到一起，成立了“公共开发软件环境”组织（COSE），以实现UNIX系统的统一化。1993年10月，Novell公司将从AT＆T购得的UNN商标权无偿移交给开放系统标准化组织X／OPEN，这样，UNIX商标不再受某一厂商控制，而由中性的国际组织管理。1995年，关于UNIX的两个重要标准 CDE（规定 UNIX的图形界面）和 UNIX 95（规定 UNIX的应用程序界面，也叫Spec．1170）正式颁布，为整个UNIX的标准化打下了基础。1998年，IBM、Intel和SC0三家业界巨头在加利福尼亚的蒙特雷（Monterey）聚会，进一步商讨了UNIX统一问题，制定了蒙特雷计划。这个计划结合了IBM公司的AIX、NUMA－Q和SCO的UnixWare技术，建立一条企业级商用 UNIX产品线，使之能同时运行在 Intel IA－32、IA－64和 IBM PowerPC处理器之上，平台适用范围将覆盖从部门级服务器到大型数据库中心的超级服务器。目前，AIX和UnixWare已经相互融合并达到了二进制级的互操作性。&lt;br /&gt;&lt;br /&gt;应该指出，目前操作系统平台形成了 UNIX、Windows NT和 LINUX三强鼎立的局面，而由芬兰大学生 Linus Torvalds推出的 LINUX本身实际上也是UNIX见的一个变种。&lt;br /&gt;&lt;br /&gt;由于功能强劲，用途多样，使用方便，因此有人把UNIX称作软件中的“瑞士多用途折叠刀”（或叫“瑞士军刀”）。&lt;br /&gt;&lt;br /&gt;汤普森本人围绕UNIX的开发工作于1978年结束。之后他从事过的项目有 Plan 9，这是另一个操作系统，旨在提高分布式计算的性能。 Plan 9用单一协议查询不同的资源、过程、程序和数据，并与之进行通信，为访问分布于由服务器、终端和其他设备组成的网络上的计算资源提供一个统一的方式，尤其适合于那些要求安全运行的Web服务器。 Plan 9的设计思路是惊人的，它小而功能强大，而且非常灵活，是 UNIX和 LINUX的竞争产品。 Plan 9早在 20世纪 80年代后期就已设计成型，目前的 Plan 9第三版是 1995年推出的。但 Plan9至今只限于贝尔实验室内部使用，没有推广和流行。最近（2000年6月），贝尔实验室采取惊人措施，免费开放 Plan 9源代码，以便让实验室以外的人使用 Plan 9。贝尔实验室的这一举措也许会像当年推出UNIX一样，在软件界引起一次新的震荡。此外，鉴于汤普森自幼爱好下棋，他还建造过一台名为Belle的下棋计算机，还与康顿（Joseph Condon）合作，在 PDP－ 11／23和 PDP－ 11／70上编制了下棋程序，这个程序从1979年到1983年在连续几届计算机下棋世界比赛中都独占鳌头，成为“四连冠”，同时也成为被美国围棋联盟USCF授予“大师”称号的第一个下棋程序。这个程序每秒可观察15万个棋步，与现今的IBM的“深蓝”当然无法相比，但在当时却是一个了不起的成就。&lt;br /&gt;&lt;br /&gt;里奇比汤普森年长2岁，1941年9月9日生于纽约州的勃浪克斯山庄（Bronxville），但在9岁时移居新泽西州的塞米特。里奇的父亲是一个电气工程师，在贝尔实验室的交换系统工程实验室当主任，因此，里奇一家可谓“呗尔世家”。里奇中学毕业后进哈佛大学学物理，并于1963年获得学士学位。其间，哈佛大学有了一台UNIVAC I，并给学生开设有关计算机系统的课程，里奇听了以后产生了很大的兴趣。毕业以后他在应用数学系攻读博士学位，完成了一个有关递归函数论方面的课题，写出了论文，但不知什么原因没有答辩，没有取得博士学位，他就离开了哈佛，于1967年进入贝尔实验室，与比他早一年到贝尔的汤普森会合，从此开始了他们长达数十年的合作。&lt;br /&gt;&lt;br /&gt;前面说过，UNIX的开发是以汤普森为主的，那末，为什么文献资料中一提到UNIX，都一致地说是里奇和汤普森共同于发的，而且在“排名”上往往是里奇在前，汤普森在后呢？包括他们在1973年由ACM主办、IBM承办的操作系统原理讨论会上首次向社会推介UNIX的论文 The UNIX Time－ Sharing System的署名，里奇也是第一作者，汤普森则为第二作者。里奇在UNIX开发中有些什么功劳呢？&lt;br /&gt;&lt;br /&gt;这里有两个很重要的因素。首先，UNIX的成功应归功于它的创新。前面曾经提到，UNIX吸取与借鉴了MULTICS的经验，如内核，进程，层次式目录，面向流的I／0，把设备当作文件，等等。这是可以理解的，因为任何新事物必然是对原有事物的继承和发展。尤其是UNIX，毕竟没有正式立项，是汤普森、里奇等少数几个人偷偷干的，如果一切都要从头从新设计，那几乎是不可能的。但是UNIX在继承中又有创新，比如 UNIX采用一种无格式的文件结构，文件由字节串加句号组成。这带来两大好处：一是在说明文件时不必加进许多无关的“填充物”（类似于COBOL中的FILLER），二是任何程序的输出可直接用作其他任何程序的输入，不必经过转换。后面这一点叫做“流水”（piping），就是UNIX首创的。此外，像把设备当作文件，从而简化了设备管理这一操作系统设计中的难题，虽然不是UNIX的发明，但是实现上它采用了一些新方法，比MULTICS更高明一些。正是在这些方面，里奇发挥了很重要的作用，使UNIX独具特色。&lt;br /&gt;&lt;br /&gt;其次，UNIX成功的一个重要因素是它的可移植性。正是里奇竭尽全力开发了C语言，并把UNIX用C重写了一遍，这才使它具有了这一特性。汤普森是用汇编语言开发UNIX的，这种语言高度依赖于硬件，由它开发的软件只能在相同的硬件平台上运行。里奇在由剑桥大学的里查德（M．Richard）于1969年开发的BCPL语言（Basic Combined Programming Language）的基础上，巧妙地对它进行改进、改造，形成了既具有机器语言能直接操作二进制位和字符的能力，又具有高级语言许多复杂处理功能如循环、转移、分支等的一种简单易学而又灵活、高效的高级程序设计语言。他们把这种语言称为C，一方面指明了继承关系（因为BCPL的首字母是B。有些资料说是汤普森先根据BCPL开发了一种称为B的语言，再由里奇根据B开发了C。这种说法并不太确切，因为我们在汤普森与里奇本人的叙述中，都没有见到有关B语言这一中间过程的说法），另一方面也反映了他们对软件追求简洁明了的一贯风格。C开发成功以后，里奇用C把U－NIX重写了一遍。我们这里用了“重写”这个词，因为文献资料在提到这件事时都是用的这一说法，显得很轻巧；实际上，里奇做的这件事本身就是“移植”，即把汤普森用汇编语言实现的UNIX改用C来实现，这决不是什么轻巧的工作，尤其是对UNIX这样的大型软件。这需要付出艰苦的劳动，也是一件需要创造性的工作。单是里奇此举就是可以大书特书的，而C作为可以不依附于UNIX的一个独立的软件产品，也自有其本身的巨大价值，在计算机发展史上可以写下浓重的一笔。C已经实现标准化，即ISO于1990年公布的ISO／IEC9899，它以 ANSIC为基础，是第一个支持多8位字符集的程序设计语言国际标准。&lt;br /&gt;&lt;br /&gt;前述里奇和汤普森的论文 The UNIX Time-Sharing Symtem后来发表于 Communications of ACM，1974年 7月。 ACM 1983年在纪念该刊创刊25周年时曾经评选出刊登于其上的25篇文章称之为具有里程碑式意义的研究论文，该文就是其中之一。&lt;br /&gt;&lt;br /&gt;除了论文以外，里奇还和凯尼汉（B．W．Kernighan）合著了一本介绍 C的专著：《C程序设计语言》（The C Programming Language, Prentice－Hall，1978，1988）。我们现在见到的大量论述C语言程序设计的教材和专著都是以本书为蓝本的。&lt;br /&gt;&lt;br /&gt;汤普森和里奇在成名以后，都没有走办公司、挣大钱的路，他们仍然在贝尔做他们喜爱做的事，而且还一直保持着他们历来的生活习惯和作风，常常工作到深夜，在贝尔是出名的“夜猫子”。里奇在接受记者采访时，就自称自己是 definitely a night person。里奇 1983年接受图灵奖时已经42岁，但仍然单身。&lt;br /&gt;&lt;br /&gt;ACM于1983年10月举行的年会上向汤普森和里奇颁奖。有趣的是，ACM当年决定新设立一个奖项叫“软件系统奖”（Software Sys－tem Award），奖励优秀的软件系统及其开发者。而首届软件系统奖评选结果中奖的也是UNIX。这样，这届年会上汤普森和里奇成了最受关注的大红人，他们同时接受了“图灵”和“软件系统”两个大奖，这在ACM历年的颁奖仪式上是从来没有过的。里奇发表的图灵奖演说题为“对软件研究的反思”（Reflections on Software Research），汤普森的演说题为“对深信不疑的信任的反思”（Reflections on Trusting Trust），它们刊载于 Communications of ACM，1984年 8月，757－ 763页，或见《前20年 ACM图灵奖演说集》（ACM Turing Award Lectures——The First 20 Years： 1966－ 1985， ACM Pr．）， 163－ 178页。里奇在演说中强调了UNIX成功的因素，包括比较长的酝酿时期和他们在开发时没有商业上的压力。里奇认为，对研究工作而言，受到过份的关注反而会影响创造力和自由的交换意见。汤普森在演说中谦虚地自称是“程序员”（在他以前获图灵奖的狄克斯特拉、霍尔、克努特和弗洛伊德也都这样称呼过自己）。同里奇一样，汤普森强调了开发程序系统时环境和背景的重要性。&lt;br /&gt;&lt;br /&gt;除图灵奖外，汤普森和里奇还从两个著名的杂志那里获得奖励和荣誉，一是《电子学》（Electronics）周刊，它从1974年起设立“成就奖”（achievement award），奖励在电子线路、工艺、仪器设备等方面有重大发明创造的科学家，曾经获得该项奖励的人中包括著名的提出“摩尔定理”的 Intel总裁摩尔（G． E． Moors），MOS工 的发明者里趣曼（P．Richman），发明软盘的舒格特（A．F．Shugart）等。但由于UNIX和C的巨大成功和影响，使1982年的这个奖破例授予了软件开发者汤普森和里奇。二是读者面很广的Datamation月刊，它于1987年创刊30周年时建立了一个“计算机名人堂”（Hall of Fame），首批 30位名人中包括图灵、冯·诺伊曼及多位图灵奖得主，如克努特（D．Knuth），巴克斯（J．Backus），麦卡锡（J．McCarthy）等。第二年首次增补名人，就选中了汤普森和里奇。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-3086938757763391337?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/k22Iucs15UHAQPWlpPS64CA2Ed4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k22Iucs15UHAQPWlpPS64CA2Ed4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/k22Iucs15UHAQPWlpPS64CA2Ed4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k22Iucs15UHAQPWlpPS64CA2Ed4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/FQx9hHbVQ04" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/3086938757763391337/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=3086938757763391337" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/3086938757763391337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/3086938757763391337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/FQx9hHbVQ04/cunix.html" title="C语言和Unix的发明史" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_qB1PewA0e3Y/R9KF5Pxq3iI/AAAAAAAAAA0/puPFcz7u7mw/s72-c/thompson.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/03/cunix.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAMQXgyeSp7ImA9WxZXGUo.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-2094128514907243285</id><published>2008-03-08T04:15:00.000-08:00</published><updated>2008-03-08T04:19:40.691-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-08T04:19:40.691-08:00</app:edited><title>阿兰-图灵（Alan Turing）</title><content type="html">&lt;a href="http://bp2.blogger.com/_qB1PewA0e3Y/R9KEFPxq3gI/AAAAAAAAAAk/WVMapApvFU8/s1600-h/alan-turing.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_qB1PewA0e3Y/R9KEFPxq3gI/AAAAAAAAAAk/WVMapApvFU8/s320/alan-turing.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5175344147471195650" /&gt;&lt;/a&gt;&lt;br /&gt;2004年6月7日，是英国数学家、被称为计算机科学之父的阿兰-图灵（Alan Turing）去世五十周年的日子。1954年的6月7日，42岁的图灵过早离开了人世。图灵的过早去世，至少对当年的世界计算机科学领域来说，是一个难以估量的巨大损失。&lt;br /&gt;&lt;br /&gt;　　计算机科学发展到半个世纪后的今天，当这门科学已经如此广泛深刻的影响到全世界的文明进步和绝大部分人的工作与生活的时候，人们理应衷心的感谢象图灵这样做出开创性贡献的人。正是归功于图灵、冯-诺伊曼等人的才智和辛勤工作，让人们更早的享受到了电脑技术的神奇和效率。可以这么说，最近半个世纪以来，世界计算机科学界的重大进步，离不开图灵等人的理论奠基作用和多方面的开创性研究成果。图灵是当之无愧的计算机科学和人工智能之父。&lt;br /&gt;&lt;br /&gt;　　学习计算机科学的大学生都应该知道，在计算机基础理论中有著名的“图灵机”和“图灵测试”。这些理论简洁的概括了图灵伟大贡献的一部分：他是第一个提出利用某种机器实现逻辑代码的执行，以模拟人类的各种计算和逻辑思维过程的科学家。而这一点，成为了后人设计实用计算机的思路来源，成为了当今各种计算机设备的理论基石。当今计算机科学中再常用不过的程序语言、代码存储和编译等基本概念，就是来自图灵的原始构思。&lt;br /&gt;&lt;br /&gt;　　了解世界计算机科学发展进程的人也应该知道，美国计算机学会（ACM）的年度“图灵奖”，自从1966年设立以来，一直是世界计算机科学领域的最高荣誉，相当于计算机科学界的诺贝尔奖。图灵奖已经被先后授予给了47位计算机科学界的杰出人物，其中包括关系数据库理论的开创者Edgar Codd、程序语言和算法理论的知名科学家Dijkstra、UNIX操作系统的开创者Dennis Ritchie、面向对象程序设计理论的奠基人以及苹果个人电脑基于鼠标的GUI界面（也就是WINDOWS图形界面的最原始来源）的首创者Alan Kay、Fortran语言的设计者John Backus、IBM-RISC体系结构的创立者John Cocke等大名鼎鼎的计算机科学家。这个以图灵的名字命名的大奖，代表着几十年来世界计算机科学的重大进步和创新，代表着计算机科学和相关技术产业的一次次质的飞跃，同时，也代表着计算机科学界对图灵的崇高敬意。&lt;br /&gt;&lt;br /&gt;　　图灵的诞辰和去世纪念日，都在六月份。然而，从某种意义上来说，他的去世纪念日更显得特别。图灵的诞辰，只是象其他无数普通人那样，来到这个世界上。而图灵的过早离世，却是当年愚昧落后的社会观念导致的。对同性恋者的无知和偏见，正是杀害图灵的幕后凶手。如今的英国以及世界上其它很多地方，已经从半个多世纪前的落后观念和政策中改变，走向了尊重、平等和反对歧视的现代社会。今天，人们在纪念图灵的同时，除了敬仰和感佩图灵为计算机科学做出的杰出贡献之外，更应该懂得尊重和珍视每一个不同的人。正是每一个各自不同的善良的人，在以不同的方式让我们的世界更加美好。假如图灵能够快乐的多活在世上十年、二十年或者更久，凭着他的才华智慧和探索精神，说不定，我们当今世界的计算机科学以及所有被直接或间接影响到的方方面面，都会更加向前推进。歧视和偏见，只会阻碍社会的文明进步，尊重和包容，才能带来社会的繁荣美好。这方面的思考，正是我们纪念图灵去世五十周年的意义所在。&lt;br /&gt;&lt;br /&gt;　　作为个人，图灵是一个同性恋者。不论你在个人观念上是理解或不理解同性爱，有一点是无法否认的：图灵是一个有深邃思想和敏锐智慧的人，图灵是一个勤奋工作和勇于探索的人，图灵是一个广受世人尊敬的人，图灵为我们的社会做出了不可磨灭的贡献。我们应该对所有为人类做出伟大贡献的人表达敬意，包括其中的同性恋者和异性恋者，包括阿兰-图林。&lt;br /&gt;&lt;br /&gt;　　阿兰-图灵（Alan Turing，也被译作阿兰-图林）生平简介（部分资料参考自Andrew Hodges所著的图灵传记“Alan Turing: the Enigma”）：&lt;br /&gt;&lt;br /&gt;　　1912年6月23日，出生于英国伦敦。&lt;br /&gt;　　1931年-1934年，在英国剑桥大学国王学院（King's College）学习。&lt;br /&gt;　　1932年-1935年，主要研究量子力学、概率论和逻辑学。&lt;br /&gt;　　1935年，年仅23岁的图灵，被选为剑桥大学国王学院院士。&lt;br /&gt;　　1936年，主要研究可计算理论，并提出“图灵机”的构想。&lt;br /&gt;　　1936年-1938年，主要在美国普林斯顿大学做博士研究，涉及逻辑学、代数和数论等领域。&lt;br /&gt;    1938-1939年，返回剑桥从事研究工作，并应邀加入英国政府破译二战德军密码的工作。&lt;br /&gt;　　1940年-1942年，作为主要参与者和贡献者之一，在破译纳粹德国通讯密码的工作上成就杰出，并成功破译了德军U-潜艇密码，为扭转二战盟军的大西洋战场战局立下汗马功劳。&lt;br /&gt;　　1943年-1945年，担任英美密码破译部门的总顾问。&lt;br /&gt;　　1945年，应邀在英国国家物理实验室从事计算机理论研究工作。&lt;br /&gt;　　1946年，这个时候，图灵在计算机和程序设计原始理论上的构思和成果，已经确定了他的理论开创者的地位。由于图灵的杰出贡献，年轻的他被英国皇室授予OBE爵士勋衔。&lt;br /&gt;　　1947年-1948年，主要从事计算机程序理论的研究，并同时在神经网络和人工智能领域做出开创性的理论研究。&lt;br /&gt;　　1948年，应邀加入英国曼彻斯特大学从事研究工作，担任曼彻斯特大学计算实验室副主任。&lt;br /&gt;　　1949年，成为世界上第一位把计算机实际用于数学研究的科学家。&lt;br /&gt;　　1950年，发表论文“计算机器与智能”，为后来的人工智能科学提供了开创性的构思。提出著名的“图灵测试”理论。&lt;br /&gt;　　1951年，从事生物的非线性理论研究。年仅39岁的图林，被选为英国皇家学会会员。&lt;br /&gt;　　1952年，在当年保守愚昧和冷战的时代，当警察得知图灵与同性朋友密切交往的消息之后，同性恋倾向的图灵被逮捕入狱。在法庭审判过程中，图灵明确告知人们，他认为自己没有做错什么事。在那个观念落后的年代，为了避免被判刑入狱，图灵被迫选择了为期一年的雌性激素注射的所谓“治疗”，才得以重新返回研究工作。&lt;br /&gt;　　1953年-1954年，继续在生物和物理学等方面的研究。被迫承受的对同性恋倾向的“治疗”，致使原本热爱体育运动的图灵在身心上受到极大的伤害。&lt;br /&gt;　　1954年6月7日，图灵被发现死于家中的床上。死因是氰化物中毒，警方调查结论是自杀。一代英灵，就此过早离去，成为人类科学史上的一大遗憾。&lt;br /&gt;&lt;br /&gt;转自CSDN: http://dev.csdn.net/develop/article/71/71741.shtm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-2094128514907243285?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/v_m2vYlNzAt1DmTeSNW3xhRLUVw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v_m2vYlNzAt1DmTeSNW3xhRLUVw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/v_m2vYlNzAt1DmTeSNW3xhRLUVw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v_m2vYlNzAt1DmTeSNW3xhRLUVw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/bgOfLtNErXU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/2094128514907243285/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=2094128514907243285" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/2094128514907243285?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/2094128514907243285?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/bgOfLtNErXU/alan-turing.html" title="阿兰-图灵（Alan Turing）" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_qB1PewA0e3Y/R9KEFPxq3gI/AAAAAAAAAAk/WVMapApvFU8/s72-c/alan-turing.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/03/alan-turing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQDRnk_eip7ImA9WxZXGUo.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-5967330661381442122</id><published>2008-03-08T04:05:00.000-08:00</published><updated>2008-03-08T04:12:57.742-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-08T04:12:57.742-08:00</app:edited><title>冯·诺依曼小传</title><content type="html">&lt;a href="http://bp1.blogger.com/_qB1PewA0e3Y/R9KCv_xq3fI/AAAAAAAAAAc/qVix3YEjMnY/s1600-h/250px-Jon_von_Neumann.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_qB1PewA0e3Y/R9KCv_xq3fI/AAAAAAAAAAc/qVix3YEjMnY/s320/250px-Jon_von_Neumann.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5175342682887347698" /&gt;&lt;/a&gt;&lt;br /&gt;冯·诺依曼（J.Von Neum ann）是本世纪最伟大的科学家之一。 他1913年出生于匈牙利首都布 达佩斯，6岁能心算8位数除法，8岁学会微积分，12岁读懂了函数论。通过刻苦 学习， 在17岁那年，他发表了第一篇数学论文，不久后掌握七种语言，又在最 新数学分支——集合论、泛函分析等理论研究中取得突破性进展。22岁，他在 瑞士苏黎士联邦工业大学化学专业毕业。 一年之后，摘取布达佩斯大学的数学博士学位。 转而攻向物理，为量子力学研究数学模型，又使他在理论物理学领域占据了突出的地位。 &lt;br /&gt;&lt;br /&gt;    1928年， 美国数学泰斗韦伯伦教授聘请这位26岁的柏林大学讲师到美国任教， 冯·诺依曼从此到美国定居。1933年，他与爱因斯坦一起被聘为普林斯顿大学高等研究院的第一批终身教授。  虽然电脑界普遍认为冯·诺依曼是“电子计算机之父”，数学史界却坚持说， 冯·诺依曼是本世纪最伟大的数学家之一，他在遍历理论、拓扑群理论等方面作出了开创性的工作， 算子代数甚至被命名为“冯·诺依曼代数”。物理学界表示，冯·诺依曼在30年代撰写的《量子力学的数学基础》已经被证明对 原子物理学的发展有极其重要的价值，而经济学界则反复强调，冯·诺依曼建立的经济增长横型体系， 特别是40年代出版的著作《博弈论和经济行为》，使 他在经济学和决策科学领域竖起了一块丰碑。 1957年2月8日， 冯·诺依曼因患骨癌逝世于里德医院，年仅54岁。他对电脑科学作出的巨大贡献，永远也不会泯灭其光辉！  &lt;br /&gt;&lt;br /&gt;电子计算机之父 &lt;br /&gt;&lt;br /&gt;     “电子计算机之父”的桂冠，被戴在数学家 冯·诺依曼头上， 而不是ENIAC的两位实际研究者，这是因为冯·诺依曼提出了现代电脑的体系结构。&lt;br /&gt;&lt;br /&gt;     1944年夏，戈德斯坦在阿贝丁车站等候去费城的火车，偶然邂逅闻名世界的大数学家冯·诺依曼教授。戈德斯坦抓住机会向数学大师讨教，冯·诺依曼和蔼可亲，耐心地回答 戈德斯坦的提问。听着听着，他敏锐地从这些数学问题里，察觉到不寻常事情。他反过来 向戈德斯坦发问，直问得年轻人“好像又经历了一次博士论文答辩”。最后，戈德斯坦毫 不隐瞒地告诉他莫尔学院的电子计算机项目。 &lt;br /&gt;&lt;br /&gt;         从1940年起，冯·诺依曼就是阿贝丁试炮场的顾问，计算问题也曾使数学大师焦虑万分。他向戈德斯坦表示，希望亲自到莫尔学院看看那台正在研制之中的机器。从此，冯· 诺依曼成为了莫尔小组的实际顾问，与小组成员频繁地交换意见。年轻人机敏地提出各种设想，冯·诺依曼则运用他渊博的学识，把讨论引向深入，并逐步形成电子计算机的系统 设计思想。 在ENIAC尚未投入运行前， 冯·诺依曼就看出这台机器致命的缺陷，主要弊端是程序 与计算两分离。程序指令存放在机器的外部电路里，需要计算某个题目，必须首先用人工 接通数百条线路，需要几十人干好几天之后，才可进行几分钟运算。 冯·诺依曼决定起草一份新的设计报告，对电子计算机进行脱胎换骨的改造。他把新 机器的方案命名为“离散变量自动电子计算机”，英文缩写是“EDVAC”。&lt;br /&gt;&lt;br /&gt;    1945年6月，冯 ·诺依曼与戈德斯坦、勃克斯等人，联名发表了一篇长达101页纸的报告，即计算机史上著名的“101页报告”，直到今天，仍然被认为是现代电脑科学发展里程碑式的文献。报告明确规定出计算机的五大部件，并用二进制替代十进制运算。EDVAC方案的革命意义在 于“存储程序”，以便电脑自动依次执行指令。人们后来把这种“存储程序”体系结构的 机器统称为“诺依曼机”。由于种种原因，莫尔小组发生令人痛惜的分裂，EDVAC机器无法被立即研制。1946年6月， 冯·诺依曼和戈德斯坦、 勃克斯回到普林斯顿大学高级研究院，先期完成了另一台 ISA电子计算机（ISA是高级研究院的英文缩写），普林斯顿大学也成为电子计算机的研究中心。&lt;br /&gt;&lt;br /&gt;    直到1951年，在极端保密情况下，冯·诺依曼主持的EDVAC计算机才宣告完成，它不仅可应用于科学计算，而且可用于信息检索等领域，主要缘于“存储程序”的威力。 EDVAC只用了3563只电子管和1万只晶体二极管，以1024个44比特水银延迟线来储存程序和 数据，消耗电力和占地面积只有ENIAC的1/3。&lt;br /&gt;&lt;br /&gt;    最早问世的内储程序式计算机既不是ISA，也不是EDVAC，英国剑桥大学威尔克斯（M.Wilkes）教授，抢在冯·诺依曼之前捷足先登。 威尔克斯1946年曾到宾夕法尼亚大学参加冯·诺依曼主持的培训班，完全接受了冯· 诺依曼内储程序的设计思想。回国后，他立即抓紧时间，主持新型电脑的研制，并于1949 年5月，制成了一台由3000只电子管为主要元件的计算机，命名为“EDSAC”（电子储存程序计算机）。威尔克斯后来还摘取了1967年度计算机世界最高奖——“图林奖”。&lt;br /&gt;&lt;br /&gt;    在冯·诺依曼研制ISA电脑的期间，美国涌现了一批按照普林斯顿大学提供的ISA照片 结构复制的计算机。 如:洛斯阿拉莫斯国家实验室研制的MANIAC，伊利诺斯大学制造的 ILLAC。雷明顿·兰德公司科学家沃尔（W. Ware）甚至不顾冯·诺依曼的反对，把他研制的机器命名为JOHNIAC（“约翰尼克” ，“约翰”即冯·诺依曼的名字）。冯·诺依曼的大名已经成为现代电脑的代名词，1994年，沃尔被授予计算机科学先驱奖，而冯·诺依曼本人则被追授予美国国家基础科学奖。&lt;br /&gt;&lt;br /&gt;转自CSDN http://blog.csdn.net/Soundboy/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-5967330661381442122?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NiCkwBZzoL5OlwKA0w8d3AJH5uw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NiCkwBZzoL5OlwKA0w8d3AJH5uw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NiCkwBZzoL5OlwKA0w8d3AJH5uw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NiCkwBZzoL5OlwKA0w8d3AJH5uw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/_0pDbI10oPY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/5967330661381442122/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=5967330661381442122" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5967330661381442122?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5967330661381442122?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/_0pDbI10oPY/blog-post_08.html" title="冯·诺依曼小传" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp1.blogger.com/_qB1PewA0e3Y/R9KCv_xq3fI/AAAAAAAAAAc/qVix3YEjMnY/s72-c/250px-Jon_von_Neumann.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/03/blog-post_08.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQDQXcycCp7ImA9WxZXF0w.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-5527674838780651491</id><published>2008-03-05T03:53:00.000-08:00</published><updated>2008-03-05T03:59:30.998-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-05T03:59:30.998-08:00</app:edited><title>Go To Statement Considered Harmful by Edsger W. Dijkstra</title><content type="html">&lt;a href="http://bp3.blogger.com/_qB1PewA0e3Y/R86LGq31YeI/AAAAAAAAAAU/id2aHc2u1zE/s1600-h/edsger_dijkstra5.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_qB1PewA0e3Y/R86LGq31YeI/AAAAAAAAAAU/id2aHc2u1zE/s320/edsger_dijkstra5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5174225968599228898" /&gt;&lt;/a&gt;&lt;br /&gt;For a number of years I have been familiar with the observation that the quality of programmers is a decreasing function of the density of go to statements in the programs they produce. More recently I discovered why the use of the go to statement has such disastrous effects, and I became convinced that the go to statement should be abolished from all "higher level" programming languages (i.e. everything except, perhaps, plain machine code). At that time I did not attach too much importance to this discovery; I now submit my considerations for publication because in very recent discussions in which the subject turned up, I have been urged to do so. &lt;br /&gt;My first remark is that, although the programmer's activity ends when he has constructed a correct program, the process taking place under control of his program is the true subject matter of his activity, for it is this process that has to accomplish the desired effect; it is this process that in its dynamic behavior has to satisfy the desired specifications. Yet, once the program has been made, the "making' of the corresponding process is delegated to the machine. &lt;br /&gt;My second remark is that our intellectual powers are rather geared to master static relations and that our powers to visualize processes evolving in time are relatively poorly developed. For that reason we should do (as wise programmers aware of our limitations) our utmost to shorten the conceptual gap between the static program and the dynamic process, to make the correspondence between the program (spread out in text space) and the process (spread out in time) as trivial as possible. &lt;br /&gt;Let us now consider how we can characterize the progress of a process. (You may think about this question in a very concrete manner: suppose that a process, considered as a time succession of actions, is stopped after an arbitrary action, what data do we have to fix in order that we can redo the process until the very same point?) If the program text is a pure concatenation of, say, assignment statements (for the purpose of this discussion regarded as the descriptions of single actions) it is sufficient to point in the program text to a point between two successive action descriptions. (In the absence of go to statements I can permit myself the syntactic ambiguity in the last three words of the previous sentence: if we parse them as "successive (action descriptions)" we mean successive in text space; if we parse as "(successive action) descriptions" we mean successive in time.) Let us call such a pointer to a suitable place in the text a "textual index." &lt;br /&gt;When we include conditional clauses (if B then A), alternative clauses (if B then A1 else A2), choice clauses as introduced by C. A. R. Hoare (case[i] of (A1, A2,···, An)),or conditional expressions as introduced by J. McCarthy (B1 -&gt; E1, B2 -&gt; E2, ···, Bn -&gt; En), the fact remains that the progress of the process remains characterized by a single textual index. &lt;br /&gt;As soon as we include in our language procedures we must admit that a single textual index is no longer sufficient. In the case that a textual index points to the interior of a procedure body the dynamic progress is only characterized when we also give to which call of the procedure we refer. With the inclusion of procedures we can characterize the progress of the process via a sequence of textual indices, the length of this sequence being equal to the dynamic depth of procedure calling. &lt;br /&gt;Let us now consider repetition clauses (like, while B repeat A or repeat A until B). Logically speaking, such clauses are now superfluous, because we can express repetition with the aid of recursive procedures. For reasons of realism I don't wish to exclude them: on the one hand, repetition clauses can be implemented quite comfortably with present day finite equipment; on the other hand, the reasoning pattern known as "induction" makes us well equipped to retain our intellectual grasp on the processes generated by repetition clauses. With the inclusion of the repetition clauses textual indices are no longer sufficient to describe the dynamic progress of the process. With each entry into a repetition clause, however, we can associate a so-called "dynamic index," inexorably counting the ordinal number of the corresponding current repetition. As repetition clauses (just as procedure calls) may be applied nestedly, we find that now the progress of the process can always be uniquely characterized by a (mixed) sequence of textual and/or dynamic indices. &lt;br /&gt;The main point is that the values of these indices are outside programmer's control; they are generated (either by the write-up of his program or by the dynamic evolution of the process) whether he wishes or not. They provide independent coordinates in which to describe the progress of the process. &lt;br /&gt;Why do we need such independent coordinates? The reason is - and this seems to be inherent to sequential processes - that we can interpret the value of a variable only with respect to the progress of the process. If we wish to count the number, n say, of people in an initially empty room, we can achieve this by increasing n by one whenever we see someone entering the room. In the in-between moment that we have observed someone entering the room but have not yet performed the subsequent increase of n, its value equals the number of people in the room minus one! &lt;br /&gt;The unbridled use of the go to statement has an immediate consequence that it becomes terribly hard to find a meaningful set of coordinates in which to describe the process progress. Usually, people take into account as well the values of some well chosen variables, but this is out of the question because it is relative to the progress that the meaning of these values is to be understood! With the go to statement one can, of course, still describe the progress uniquely by a counter counting the number of actions performed since program start (viz. a kind of normalized clock). The difficulty is that such a coordinate, although unique, is utterly unhelpful. In such a coordinate system it becomes an extremely complicated affair to define all those points of progress where, say, n equals the number of persons in the room minus one! &lt;br /&gt;The go to statement as it stands is just too primitive; it is too much an invitation to make a mess of one's program. One can regard and appreciate the clauses considered as bridling its use. I do not claim that the clauses mentioned are exhaustive in the sense that they will satisfy all needs, but whatever clauses are suggested (e.g. abortion clauses) they should satisfy the requirement that a programmer independent coordinate system can be maintained to describe the process in a helpful and manageable way. &lt;br /&gt;It is hard to end this with a fair acknowledgment. Am I to judge by whom my thinking has been influenced? It is fairly obvious that I am not uninfluenced by Peter Landin and Christopher Strachey. Finally I should like to record (as I remember it quite distinctly) how Heinz Zemanek at the pre-ALGOL meeting in early 1959 in Copenhagen quite explicitly expressed his doubts whether the go to statement should be treated on equal syntactic footing with the assignment statement. To a modest extent I blame myself for not having then drawn the consequences of his remark &lt;br /&gt;The remark about the undesirability of the go to statement is far from new. I remember having read the explicit recommendation to restrict the use of the go to statement to alarm exits, but I have not been able to trace it; presumably, it has been made by C. A. R. Hoare. In [1, Sec. 3.2.1.] Wirth and Hoare together make a remark in the same direction in motivating the case construction: "Like the conditional, it mirrors the dynamic structure of a program more clearly than go to statements and switches, and it eliminates the need for introducing a large number of labels in the program." &lt;br /&gt;In [2] Guiseppe Jacopini seems to have proved the (logical) superfluousness of the go to statement. The exercise to translate an arbitrary flow diagram more or less mechanically into a jump-less one, however, is not to be recommended. Then the resulting flow diagram cannot be expected to be more transparent than the original one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-5527674838780651491?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-rgSWJP8fiRk5HJsxtWA3LGQhzw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-rgSWJP8fiRk5HJsxtWA3LGQhzw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-rgSWJP8fiRk5HJsxtWA3LGQhzw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-rgSWJP8fiRk5HJsxtWA3LGQhzw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/BemKrkEHsTU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/5527674838780651491/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=5527674838780651491" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5527674838780651491?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5527674838780651491?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/BemKrkEHsTU/go-to-statement-considered-harmful-by.html" title="Go To Statement Considered Harmful by Edsger W. Dijkstra" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp3.blogger.com/_qB1PewA0e3Y/R86LGq31YeI/AAAAAAAAAAU/id2aHc2u1zE/s72-c/edsger_dijkstra5.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/03/go-to-statement-considered-harmful-by.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYNRn49cCp7ImA9WxZXFk4.&quot;"><id>tag:blogger.com,1999:blog-472153597129489028.post-5584030921354356020</id><published>2008-03-04T05:06:00.000-08:00</published><updated>2008-03-04T05:09:57.068-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-04T05:09:57.068-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="软件危机" /><title>软件危机</title><content type="html">软件危机(Software Crisis) 是计算机软件在它的开发和维护过程中所遇到的一系列严重问题。概括地说，主要包含两方面的问题：如何开发软件，怎样满足对软件日益增长的需求；如何维护数量不断膨胀的已有软件。&lt;br /&gt;&lt;br /&gt;      “软件危机”使得人们开始对软件及其特性进行更深一步的研究，人们改变了早期对软件的不正确看法。早期那些被认为是优秀的程序常常很难被别人看懂，通篇充满了程序技巧。现在人们普遍认为优秀的程序除了功能正确，性能优良之外，还应该容易看懂、容易使用、容易修改和扩充。&lt;br /&gt;&lt;br /&gt;      程序设计语言虽然为计算机的应用开拓了无比广阔的前景，但游荡在软件世界的幽灵——“软件危机”依然存在。因为软件的开发不仅受到程序设计的方法、结构的制约，而且受到开发周期以及软件开发成本的限制，更重要的是软件质量的保障与其程序设计的正确性关系极大。如果所开发的软件其可靠性得不到保障，在运行中将会产生不堪设想的严重后果。&lt;br /&gt;&lt;br /&gt;      60年代中期以后，计算机硬件技术日益进步，计算的存贮容量、运算速度和可靠性明显提高，生产硬件的成本不断降低。计算机价格的下跌为它的广泛应用创造了极好的条件。在这种形势下，迫切要求计算机软件也能与之相适应。因而，一些开发大型软件系统的要求提了出来。然而软件技术的进步一直未能满足形势发展的需要，在大型软件的开发过程中出现了复杂程度高、研制周期长、正确性难以保证的三大难题。遇到的问题找不到解决办法，致使问题堆积起来，形成了人们难以控制的局面，出现了所谓的“软件危机”。&lt;br /&gt;&lt;br /&gt;      最为突出的例子是美国IBM公司于1963年～1966年开发的IBM360系列机的操作系统。该软件系统花了大约5 000人一年的工作量，最多时，有 1000人投入开发工作，写出近100万行的源程序。尽管投入了这么多的人力和物力，得到的结果却极其糟糕。据统计，这个操作系统每次发行的新版本都是从前一版本中找出1000个程序错误而修正的结果。可想而知，这样的软件质量糟到了什么地步。&lt;br /&gt;&lt;br /&gt;      难怪该项目的负责人F·D·希罗克斯在总结该项目时无比沉痛地说：“……正像一只逃亡的野兽落到泥潭中作垂死挣扎，越是挣扎，陷得越深，最后无法逃脱灭顶的灾难，……程序设计工作正像这样一个泥潭……一批批程序员被迫在泥潭中拼命挣扎，……，谁也没有料到问题竟会陷入这样的困境……。” IBM360操作系统的历史教训已成为软件开发项目中的典型事例被记入历史史册。&lt;br /&gt;&lt;br /&gt;      如果开发的软件隐含错误，可靠性得不到保证，那么在运行过程中很可能对整个系统造成十分严重的后果，轻则影响到系统的正常工作，重则导致整个系统的瘫痪，乃至造成无可挽回的恶性事故。如，银行的存款可能被化为乌有，甚至弄成赤字；工厂的产品全部报废，导致工厂破产。&lt;br /&gt;&lt;br /&gt;      1963年，美国用于控制火星探测器的计算机软件中的一个“，”号被误写为“·”，而致使飞往火星的探测器发生爆炸，造成高达数亿美元的损失。&lt;br /&gt;&lt;br /&gt;      为了克服这一危机，一方面需要对程序设计方法、程序的正确性和软件的可靠性等问题进行系列的研究；另一方面，也需要对软件的编制、测试、维护和管理的方法进行研究，从而产生了程序设计方法学。&lt;br /&gt;&lt;br /&gt;      1968年，E·W·代克斯特拉首先提出“GOTO语句是有害的”论点，向传统程序设计方法提出了挑战，从而引起了人们对程序设计方法讨论的普遍重视。众多著名的计算机科学家都参加了这种讨论。程序设计方法学也正是在这种广泛而深入的讨论中逐渐产生和形成的。&lt;br /&gt;&lt;br /&gt;      什么是程序设计方法学呢？简言之，程序设计方法学是讨论程序的性质、程序设计的理论和方法的一门学科。它包含的内容比较丰富，例如，结构程序设计，程序正确性证明，程序变换，程序的形式说明与推导、程序综合、自动程序设计等。在程序设计方法学中，结构程序设计占有十分重要的地位，可以说，程序设计方法学是在结构程序设计的基础上逐步发展和完善起来的。&lt;br /&gt;&lt;br /&gt;      什么是结构程序设计呢？至今仍众说纷纭，还没有一个严格的，又能被大家普遍接受的定义。1974年，D·格里斯将已有的对结构程序设计的不同解释归结为13种，其中，比较有代表性的如下：&lt;br /&gt;&lt;br /&gt;      结构程序设计是避免使用GOTO语句的一种程序设计；&lt;br /&gt;      结构程序设计是自顶向下的程序设计；&lt;br /&gt;      结构程序设计是一种组织和编制程序的方法，利用它编制的程序易于理解、易于修改；&lt;br /&gt;      程序结构化的一个主要功能是使程序正确性的证明容易实现；&lt;br /&gt;      结构程序设计对设计过程中的每一步去验证其正确性，这样便自动导致自我说明和自我捍卫的程序设计风格；&lt;br /&gt;&lt;br /&gt;      总之，结构程序设计讨论了如何将大规模的和复杂的流程图转换成一种标准的形式，使得它们能够用几种标准的控制结构（通常是顺序、分支和重复）通过重复和嵌套来表示。&lt;br /&gt;&lt;br /&gt;      上述定义或解释从不同角度反映了结构程序设计所讨论的主要问题。实质上，结构程序设计是一种进行程序设计的原则和方法，按照这种原则和方法可设计出结构清晰、容易理解、容易修改、容易验证的程序。&lt;br /&gt;&lt;br /&gt;      按照结构程序设计的要求设计出的程序设计语言称为结构程序设计语言。利用结构程序设计语言，或者说按结构程序设计的思想和原则编制出的程序称为结构化程序。&lt;br /&gt;&lt;br /&gt;      在60年代末和70年代初，关于GOTO语句的用法的争论比较激烈。主张从高级程序语言中去掉GOTO语句的人认为，GOTO语句是对程序结构影响最大的一种有害的语句，他们的主要理由是：GOTO语句使程序的静态结构和动态结构不一致，从而使程序难以理解，难以查错。去掉GOTO语句后，可直接从程序结构上反映程序运行的过程。这样，不仅使程序结构清晰，便于理解，便于查错，而且也有利于程序的正确性证明。&lt;br /&gt;&lt;br /&gt;      持反对意见的人认为，GOTO语句使用起来比较灵活，而且有些情形能提高程序的效率。若完全删去GOTO语句，有些情形反而会使程序过于复杂，增加一些不必要的计算量。&lt;br /&gt;&lt;br /&gt;      1974年，D·E·克努斯对于GOTO语句争论作了全面公正的评述，其基本观点是：不加限制地使用GOTO语句，特别是使用往回跳的GOTO语句，会使程序结构难于理解，在这种情形，应尽量避免使用GOTO语句。但在另外一些情况下，为了提高程序的效率，同时又不致于破坏程序的良好结构，有控制地使用一些GOTO语句也是必要的。用他的话来说就是：“在有些情形，我主张删掉GOTO语句；在另外一些情形，则主张引进GOTO语句。”从此，使这场长达10年之久的争论得以平息。&lt;br /&gt;&lt;br /&gt;      后来，G·加科皮尼和C·波姆从理论上证明了：任何程序都可以用顺序、分支和重复结构表示出来。这个结论表明，从高级程序语言中去掉GOTO语句并不影响高级程序语言的编程能力，而且编写的程序的结构更加清晰。&lt;br /&gt;&lt;br /&gt;      结构程序设计的思想体现在采用了一些比较行之有效的方法，在这些方法中较有代表性的是“逐步求精”方法。所谓“逐步求精”方法，就是在编制一个程序时，首先考虑程序的整体结构而暂时忽略一些细节问题，然后逐步地一层一层地细化直至用所选用的语言完全描述每一个细节，即得到所期望的程序为止。换言之，它是按照先全局后局部、先整体后细节、先抽象后具体的过程组织人们的思维活动，使得编写出的程序结构清晰、容易理解、容易验证、容易修改。“逐步求精”方法与模块化设计方法既有联系又有区别。粗略地讲，逐步求精主要指一个程序的设计过程，而模块化设计主要指比较大的系统的设计过程。&lt;br /&gt;&lt;br /&gt;      此外，面对“软件危机”，人们调查研究了软件生产的实际情况，逐步感到采用工程化的方法从事软件系统的研究和维护的必要性，于是与程序设计方法学密切相关的软件工程在1968年应运而生。软件工程的主要对象是大型软件。软件工程研究的内容主要包括：软件质量保证和质量评价；软件研制和维护的方法、工具、文档；用户界面的设计以及软件管理等。软件工程的最终目的是摆脱手工生产软件的状况，逐步实现软件研制和维护的自动化。&lt;br /&gt;&lt;br /&gt;软件危机的主要表现：&lt;br /&gt; &lt;br /&gt;      1. 对软件开发成本和进度的估计常常很不准确。 &lt;br /&gt;      实际成本比估计成本有可能高出一个数量级，实际进度比预期进度拖延几个月甚至几年的现象并不罕见。这种现象降低了开发组织的信誉。为赶进度和节约成本所采取的权宜之计往往又损害了软件产品的质量，从而不可避免地引起用户的不满。 &lt;br /&gt;&lt;br /&gt;      2. 用户对“已完成的”软件系统不满意的现象经常发生。 &lt;br /&gt;      软件开发人员常常在对用户需求只有模糊的了解，甚至对所要解决的问题还没有确切认识的情况下，就仓促上阵匆忙着手编写程序。软件开发人员和用户之间的交流往往很不充分，“闭门造车”必然导致最终产品不符合用户实际需要。 &lt;br /&gt;&lt;br /&gt;      3. 软件产品的质量常常靠不住。 &lt;br /&gt;      软件可靠性和质量保证的确切定量概念刚刚出现，软件质量保证技术（审查、复审和测试）还没有坚持不懈地应用到软件开发的全过程中，这些都会导致软件产品发生质量问题。 &lt;br /&gt;&lt;br /&gt;      4. 软件常常是不可维护的。 &lt;br /&gt;      程序中的错误很难改正，实际上不可能使这些程序适应新的硬件环境，也不能根据用户的需求在原有程序中增加新的功能。&lt;br /&gt; &lt;br /&gt;      5. 软件通常没有适当的文档资料。 &lt;br /&gt;      软件不仅是程序，还应该有一整套文档资料。这些文档资料是在软件开发过程中产生出来的，而且应该是“最新的”（与代码完全一致）。缺乏文档必然给软件的开发和维护带来许多严重的困难和问题。 &lt;br /&gt;&lt;br /&gt;      6. 软件成本在计算机系统总成本中所占比例逐年上升。 &lt;br /&gt;      随着微电子技术的进步和生产自动化程度的提高，硬件成本逐年下降，然而软件开发需要大量的人力，软件成本随着通货膨胀以及软件规模和数量的不断扩大而逐年上升。美国在1995年的调查表明，软件成本大约已占计算机系统总成本的90%。 &lt;br /&gt;&lt;br /&gt;      软件危机的出现，使得人们去寻找产生危机的内在原因，发现其原因可归纳为两方面，一方面是由软件生产本身存在着复杂性，另一方面却是与软件开发所使用的方法和技术有关。&lt;br /&gt;&lt;br /&gt;      软件工程正是为克服软件危机而提出的一种概念，并在实践中不断地探索它的原理，技术和方法。在此过程中，人们研究和借鉴了工程学的某些原理和方法，并形成了一门新的学科─软件工程学，但可惜的是时至今日人们并没有完全克服软件危机。&lt;br /&gt;&lt;br /&gt;&lt;em&gt;转自 &lt;a href="http://www.itisedu.com/phrase/200603112323405.html"&gt;中程在线信息产业培训网 http://www.itisedu.com/phrase/200603112323405.html&lt;/a&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/472153597129489028-5584030921354356020?l=smartxiaofish.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W2RVRBrGhu-h1ro3CEzXkLj75yc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W2RVRBrGhu-h1ro3CEzXkLj75yc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W2RVRBrGhu-h1ro3CEzXkLj75yc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W2RVRBrGhu-h1ro3CEzXkLj75yc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/mKILS/~4/HopAtDcozU0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://smartxiaofish.blogspot.com/feeds/5584030921354356020/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=472153597129489028&amp;postID=5584030921354356020" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5584030921354356020?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/472153597129489028/posts/default/5584030921354356020?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/mKILS/~3/HopAtDcozU0/blog-post.html" title="软件危机" /><author><name>Smartxiaofish</name><uri>http://www.blogger.com/profile/10754975412648906026</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_qB1PewA0e3Y/R_mkm7V4q4I/AAAAAAAAACM/cYh5W_CSoxA/S220/city_homeless_cat_3c1b1424-x.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://smartxiaofish.blogspot.com/2008/03/blog-post.html</feedburner:origLink></entry></feed>

