﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心有多大舞台便有多大-随笔分类-网站</title><link>http://www.blogjava.net/jjwwhmm/category/31545.html</link><description>Embrace changes, pursue excellence, share niceness. 
</description><language>zh-cn</language><lastBuildDate>Mon, 12 Apr 2010 14:34:51 GMT</lastBuildDate><pubDate>Mon, 12 Apr 2010 14:34:51 GMT</pubDate><ttl>60</ttl><item><title>从小处看gmail的性能</title><link>http://www.blogjava.net/jjwwhmm/archive/2010/04/12/318067.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 12 Apr 2010 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2010/04/12/318067.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/318067.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2010/04/12/318067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/318067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/318067.html</trackback:ping><description><![CDATA[今天无聊在看gmail首页的html代码时，看到了关于页头里的&#8220;欢迎使用 Gmail&#8221;这一行字的UI设计代码，由此看到为了性能，真正的好网站是怎么优化的：<br />
<br />
<img alt="" src="file:///C:/DOCUME%7E1/marenpei/LOCALS%7E1/Temp/moz-screenshot.png" /><br />
在上面的这段html页面中，gmail使用了一个table，代码如下：<br />
&lt;tr&gt;<br />
&nbsp;&nbsp;&lt;td nowrap="nowrap"&gt;<br />
&nbsp; &lt;table width="100%" cellspacing="0" cellpadding="0" bgcolor="#c3d9ff" align="center" style="margin-bottom: 5px;"&gt;<br />
&nbsp; &lt;tbody&gt;&lt;tr&gt;<br />
&nbsp; &lt;td valign="top" align="left" class="bubble tl<span style="color: red">"&gt;&lt;div class="SPRITE_corner_tl"&gt;&lt;/</span>div&gt;&lt;/td&gt;<br />
&nbsp; &lt;td style="padding: 5px 0pt; font-family: arial; text-align: left; font-weight: bold;" rowspan="2" class="bubble"&gt;&lt;b&gt;欢迎使用 Gmail&lt;/b&gt;&lt;/td&gt;<br />
&nbsp; &lt;td valign="top" align="right" class="bubble tr<span style="color: red">"&gt;&lt;div class="SPRITE_corner_tr"&gt;&lt;/</span>div&gt;&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt;<br />
&nbsp; &lt;tr&gt;<br />
&nbsp; &lt;td valign="bottom" align="left" class="bubble bl<span style="color: red">"&gt;&lt;div class="SPRITE_corner_bl"&gt;&lt;/</span>div&gt;&lt;/td&gt;<br />
&nbsp; &lt;td valign="bottom" align="right" class="bubble br<span style="color: red">"&gt;&lt;div class="SPRITE_corner_br"&gt;&lt;/</span>div&gt;&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt;<br />
&nbsp; &lt;/tbody&gt;&lt;/table&gt;<br />
&nbsp; &lt;/td&gt;<br />
&nbsp; &lt;/tr&gt;<br />
为了既考虑UI效果，又能避免带来速度上的影响，用了最少的图片来实现弯角效果(图片在div的SPRITE_corner<strong> CSS中</strong>)，从而避免设计成一个大的图片而影响用户浏览器下载资源的速度。<br />
从我这个非UI设计人员的视角来看，不知道GMAIL这样设计的初衷是否是这样的，如果不是的话，请高手赐教。
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/318067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2010-04-12 15:41 <a href="http://www.blogjava.net/jjwwhmm/archive/2010/04/12/318067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dr. Jeffrey Jaffe Named W3C CEO</title><link>http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315494.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 15 Mar 2010 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315494.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/315494.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/315494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/315494.html</trackback:ping><description><![CDATA[<p style="clear: none">Dr. Jeff Jaffe is Chief Executive Officer of the World Wide Web Consortium. In this role he works with Director Tim Berners-Lee, staff, and membership, and the public to evolve and communicate the W3C's organizational vision. He is responsible for all of W3C's global operations, for maintaining the interests of all of W3C's stakeholders, and for sustaining a culture of cooperation and transparency, so that W3C continues to be the leading forum for the technical development and stewardship of the Web.<br />
<br />
<br />
</p>
<p>After receiving a Ph.D. in computer science from MIT in 1979, Jeff joined IBM's Thomas J. Watson Research Center. During his tenure at IBM, he held a wide variety of technical and management positions, including vice president, Systems and Software Research, corporate vice president of technology, and general manager of IBM's SecureWay business unit, where he was responsible for IBM's security, directory, and networking software business.</p>
<p>Jeff then served as president of Bell Labs Research and Advanced Technologies, where he established new facilities in Ireland and India, and served as chairman of the board of the New Jersey Nanotechnology Consortium.</p>
<p>Most recently, Jeff served as the Executive Vice President and Chief Technology Officer for Novell. He was responsible for Novell's technology direction, as well as leading Novell's product business units.</p>
<p>Jeff was appointed by President Bill Clinton to serve on the Advisory Committee for the Presidential Commission for Critical Infrastructure Protection. He has also chaired the Chief Technology Officer group of the Computer Systems Policy Project, and has served on the National Research Council's Computer Science and Telecommunications Board. He is a Fellow of ACM and the IEEE.</p>
<p>Dr. Jaffe holds a BS in Mathematics and an MS in Electrical Engineering and Computer Science in addition to his Doctorate from the Massachusetts Institute of Technology.</p>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/315494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2010-03-15 16:29 <a href="http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[ZZ]理解form的get和post </title><link>http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315449.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 15 Mar 2010 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315449.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/315449.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/315449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/315449.html</trackback:ping><description><![CDATA[<p>(转载自<a href="http://askjava.blog.sohu.com/76540166.html">http://askjava.blog.sohu.com/76540166.html</a>)<br />
</p>
<div>
<p>在<a href="http://www.w3.org/TR/REC-html40/">HTML</a>中，<a href="http://www.w3.org/TR/REC-html40/interact/forms.html">form元素</a>用<a href="http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.1">method属性</a>来指定有两种不同的提交方法，即"get"（默认值）和"post"。</p>
<h1>1. get和post的定义</h1>
<p><a href="http://www.w3.org/">W3C</a>的<a href="http://www.w3.org/TR/REC-html40/">HTML 4.01 specification</a>说，<a href="http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13">form元素的method属性</a>用来指定发送form的HTTP方法。</p>
<ul>
    <li>使用get时，form的<a href="http://www.w3.org/TR/REC-html40/interact/forms.html#form-data-set">数据集</a>（形如control-name=current-value的键值对）被附加到form元素的action属性所指定的URI后面；
    <li>使用post时，form的数据集（形如control-name=current-value的键值对）被包装在请求的body中并被发送。 </li>
</ul>
<p>这可以简单地理解为，get仅仅是拼接一个URI，然后直接向服务器请求数据（需要提交给服务器的数据集包含在URI中）。比如：</p>
<div><span style="color: #0000ff">&lt;</span><span style="color: #800000">form&nbsp;</span><span style="color: #ff0000">method</span><span style="color: #0000ff">="get"</span><span style="color: #ff0000">&nbsp;action</span><span style="color: #0000ff">="FormGet.aspx"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="ProductID"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="Get"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p>这个form在提交的时候，会产生这样能够一个get请求：FormGet.aspx?ProductID=1。</p>
<p>而post会把form的数据集，即ProductID=1这个键值对包装在请求的body中，发送给服务器，然后向服务器请求数据。对于：</p>
<div><span style="color: #0000ff">&lt;</span><span style="color: #800000">form&nbsp;</span><span style="color: #ff0000">method</span><span style="color: #0000ff">="post"</span><span style="color: #ff0000">&nbsp;action</span><span style="color: #0000ff">="FormPost.aspx"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="ProductID"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="Get"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p>这样一个form在提交时，我们将看到一个干净的URI：FormPost.aspx。因为数据不是拼接在URI中。</p>
<h1>2. get和post的区别</h1>
<h2>2.1 安全性</h2>
<p>如果用get提交一个验证用户名和密码的form，一般认为是不安全的。因为用户名和密码将出现在URL上，进而出现在浏览器的历史记录中。显然，在对安全性有要求的情况下，应该使用post。</p>
<h2>2.2 编码</h2>
<p><a href="http://www.w3.org/TR/REC-html40/">HTML 4.01 specification</a>指出，get只能向服务器发送ASCII字符，而post则可以发送整个<a href="http://www.w3.org/TR/REC-html40/references.html#ref-ISO10646">ISO10646</a>中的字符（如果同时指定<a href="http://www.w3.org/TR/REC-html40/interact/forms.html#adef-enctype">enctype</a>="multipart/form-data"的话）。</p>
<p>注意get和post对应的enctype属性有区别。enctype有两个值，默认值为application/x-www-form-urlencoded，而另一个值multipart/form-data只能用于post。</p>
<h2>2.3 提交的数据的长度</h2>
<p>HTTP specification并没有对URL长度进行限制，但是IE将请求的<a href="http://support.microsoft.com/kb/208427/en-us">URL长度限制为2083个字符</a>，从而限制了get提交的数据长度。测试表明如果URL超出这个限制，提交form时IE不会有任何响应。其它浏览器则没有URL的长度限制，因此其它浏览器能通过get提交的数据长度仅受限于服务器的设置。</p>
<p>而对于post，因为提交的数据不在url中，所以通常可以简单地认为数据长度限制仅受限于服务器的设置。</p>
<h2>2.4 缓存</h2>
<p>由于一个get得到的结果直接对应到一个URI，所以get的结果页面有可能被浏览器缓存。而post一般则不能，参考5。</p>
<h2>2.5 引用和SEO</h2>
<p>出于和上面相同的原因，我们可以用一个URI引用一个get的结果页面，而post的结果则不能，所以必然不能被搜索引擎搜到。</p>
<h1>3. 服务端的处理</h1>
<p>在服务端的ASP.NET程序中，对于get，我们用Request.QueryString[control-name]来取得对应的=current-value；对于post，我们用Request.Form[control-name]。</p>
<p>我们也可以笼统地使用Request[control-name]。但这样做的效率不如前者。我们可以用下面的程序比较Request.QueryString和Request的效率：</p>
<div><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@&nbsp;Page&nbsp;Language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">C#</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">runat</span><span style="color: #0000ff">="server"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">void</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;Page_PreInit(object&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(Request[</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">InputString</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">]&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">!=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">int</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;count&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">1000000</span><span style="color: #000000; background-color: #f5f5f5">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime&nbsp;start;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;value&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">""</span><span style="color: #000000; background-color: #f5f5f5">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;DateTime.Now;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">for</span><span style="color: #000000; background-color: #f5f5f5">(</span><span style="color: #0000ff; background-color: #f5f5f5">int</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;i&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">0</span><span style="color: #000000; background-color: #f5f5f5">;i&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">&lt;</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;count;i</span><span style="color: #000000; background-color: #f5f5f5">++</span><span style="color: #000000; background-color: #f5f5f5">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;Request.QueryString[</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">InputString</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;DateTime.Now;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">double</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;requestGet&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;(end&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">-</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;start).TotalSeconds;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;DateTime.Now;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">for</span><span style="color: #000000; background-color: #f5f5f5">(</span><span style="color: #0000ff; background-color: #f5f5f5">int</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;i&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">0</span><span style="color: #000000; background-color: #f5f5f5">;i&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">&lt;</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;count;i</span><span style="color: #000000; background-color: #f5f5f5">++</span><span style="color: #000000; background-color: #f5f5f5">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;Request[</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">InputString</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;DateTime.Now;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">double</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;request&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;(end&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">-</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;start).TotalSeconds;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compare.InnerHtml&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;requestGet.ToString()&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;/&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;request.ToString()&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;=&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;(requestGet&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">/</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;request).ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get.InnerHtml&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta&nbsp;</span><span style="color: #ff0000">http-equiv</span><span style="color: #0000ff">="Content-Type"</span><span style="color: #ff0000">&nbsp;content</span><span style="color: #0000ff">="text/html;&nbsp;charset=utf-8"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Request.QueryString&nbsp;/&nbsp;Request</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form&nbsp;</span><span style="color: #ff0000">method</span><span style="color: #0000ff">="get"</span><span style="color: #ff0000">&nbsp;action</span><span style="color: #0000ff">="FormGet.aspx"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="InputString"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="Post"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;&lt;</span><span style="color: #800000">br&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get:&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">span&nbsp;</span><span style="color: #ff0000">runat</span><span style="color: #0000ff">="server"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="get"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">br&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Request.QueryString&nbsp;/&nbsp;Request:&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">span&nbsp;</span><span style="color: #ff0000">runat</span><span style="color: #0000ff">="server"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="compare"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p>同样的办法我们可以比较Request.Form和Request。</p>
<p>最后得到的结果（Request.QueryString[control-name] / Request[control-name]和Request.Form[control-name] / Request[control-name]）大多数时候是小于1的。因此，我们因该尽量用Request.QueryString或Request.Form来代替Request。</p>
<h1>4. 正确地使用get和post</h1>
<p><a href="http://www.w3.org/">W3C</a>的官方建议是：当且仅当form是幂等（idempotent）的时候，使用get。幂等是一个数学上的术语，其<a href="http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?query=idempotent&amp;action=Search">定义</a>是：对于一个函数f : D -&gt; D，如果D中的所有x满足f (f x) = f x，那么这个函数是幂等的。<a href="http://www.w3.org/Protocols/">HTTP specification</a>（比如<a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">RFC 2616</a>）中，将幂等解释为：多次相同请求产生的副作用，和一次请求的副作用相同。 </p>
<p>打个比方，如果你提交一个form会从<a href="http:///www.google.com">Google</a>上查询一个关键词，那么我们可以认为这个form是幂等的，因为1次提交和10次提交的副作用是差不多的（10次查询可能会多消耗一些电能）；如果你提交一个form是订购一个<a href="http://www.amazon.com/Hasbro-Transformers-Ultimate-Bumblebee-Figure/dp/B000OKXRQ0">终极大黄蜂（Utimate bumblebee）</a>，那么这就不是幂等的：要是你不小心多提交了1次form的话，你可能会被老婆乱骂，你不小心又提交了10次的话，你可能就破产了——一次提交和多次提交的副作用明显不同，所以这不是幂等的。</p>
<p>所以，一般来说，如果提交这个请求纯粹只是从服务端获取数据而不进行其他操作，并且多次提交不会有明显的副作用，应该使用get。比如：</p>
<ul>
    <li>搜索引擎的查询：<a href="http://www.google.com/search?q=yandixin">http://www.google.com/search?q=yandixin</a>；
    <li>分页：ArticleList.asp?Page=1。 </li>
</ul>
<p>如果提交这个请求会产生其它操作和影响，就应该使用post。比如：</p>
<ul>
    <li>修改服务器上数据库中的数据；
    <li>发送一封邮件；
    <li>删除一个文件。 </li>
</ul>
<p>另一个要考虑的因素是安全性。见2.1。</p>
<h1>5. 浏览器差异</h1>
<ul>
    <li>IE 6：URL长度限制为2083个字符；post之后，刷新页面不会自动重新post数据，会出现警告；<br />
    &nbsp;<br />
    并且，在后退的过程中有可能出现&#8220;Page has Expired&#8221;（通常是向自己post，然后后退时）：<br />
    &nbsp;<br />
    微软的技术支持人员<a href="http://www.thescripts.com/forum/thread314750.html">号称</a>&#8220;this is not a bug or problem specified to the ASP.NET but a security feature of the IE Browser&#8221;，并且说&#8220;You can also inform your users of this&#8221;，实在是荒唐。另外，<a href="http://support.microsoft.com/kb/183763">一篇KB</a>也提到这个问题，说将Response.CacheControl设为"Public"即可，经测试仅在第一次后退时有效。
    <li>IE 7：和IE 6相同；
    <li>Firefox 2.0.0.11：刷新页面不会自动重新post数据，会出现警告；<br />
    &nbsp;
    <li>Opera 9.24：正常（自动post数据）；
    <li>Safari 3.0.4：post之后，刷新页面、前进、后退都不会自动重新post数据，会出现警告。<br />
    &nbsp; </li>
</ul>
<h1>6. 参考</h1>
<ul>
    <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">Hypertext Transfer Protocol -- HTTP/1.1</a>，<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htm">Chapter 9 Method Definitions</a>
    <li><a href="http://www.cs.tut.fi/~jkorpela/forms/methods.html">Methods GET and POST in HTML forms - what's the difference </a>
    <li><a href="http://www.htmlhelp.com/faq/cgifaq.2.html#8">What is the difference between GET and POST </a>
    <li><a href="http://www.w3.org/TR/REC-html40/">HTML 4.01 Specification</a>（W3C Recommendation 24 December 1999），<a href="http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13">Section 17.13: Form submission</a>
    <li><a href="http://classicasp.aspfaq.com/forms/what-is-the-limit-on-querystring/get/url-parameters.html">What is the limit on QueryString / GET / URL parameters?</a>&nbsp; </li>
</ul>
</div>
 <img src ="http://www.blogjava.net/jjwwhmm/aggbug/315449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2010-03-15 11:20 <a href="http://www.blogjava.net/jjwwhmm/archive/2010/03/15/315449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载：再谈创业者管哪个重要</title><link>http://www.blogjava.net/jjwwhmm/archive/2009/12/22/306904.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Tue, 22 Dec 2009 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2009/12/22/306904.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/306904.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2009/12/22/306904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/306904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/306904.html</trackback:ping><description><![CDATA[今天看了邵博士的这篇文章，感触颇丰，所以转过来<br />
<br />
http://shaoblog.com/2009/01/22/%e5%86%8d%e8%b0%88%e5%88%9b%e4%b8%9a%e8%80%85%e7%ae%a1%e5%93%aa%e4%b8%aa%e9%87%8d%e8%a6%81/<br />
<br />
<p>昨天QQ的马化腾到我们这边来聊天，谈到了创始人重视产品在企业成功的重要性。即使在QQ已经这么成功，市值近百亿美金的今天，他还花很多时间在产品上。听上去很简单也很自然，但是我看到很多创始人做不到。</p>
<p>创业者要管的太多了，产品，市场，销售，财务，技术，找人，炒人，公关。不可能每件事情都事必躬亲，一定有些需要交给手下领头。哪两件最重要？我觉得是找人和产品。别的事都可能找到好的人代劳，但产品和找人不行。</p>
<p>找到一个好的人太关键了。我从前写了很多：<a href="http://shaoblog.com/2007/05/30/returnee/">海龟还是土鳖？</a>，<a href="http://shaoblog.com/2007/04/04/if-cannot-hire/">招不到称心的人怎么办?</a>，<a href="http://shaoblog.com/2007/04/01/%E6%8B%9B%E6%80%8E%E4%B9%88%E6%A0%B7%E7%9A%84%E4%BA%BA/">招怎么样的人</a>，今天就不多说了。只加一句：找什么样的人，决定公司的文化，所以创业者是一定要自己做的。</p>
<p>找到好的人，可以一手代包市场，销售，财务，技术，公关（找到好的人，能放心的把我的一个部门让他管，知道他会管的比我更好时，感觉太好了！），但产品是一个公司的灵魂。它需要融会贯通：从市场这边了解目标用户是谁和他们的需求，平衡销售那边经常和市场部不同的意见，与技术讨论什么能做，什么不能做。其中有很多取舍，很多推动，不是创始人CEO，很难做好这个工作。另外，创始人应该是最了解用户的需求的人，因为他创业的激情就来自于为用户解决一个问题，增添一个价值。</p>
<p>做易趣时我产品放权太多。虽然我们那时的产品部很不错，但没有创始人每天的介入，他们的任务是不可能完成的。我给我们那时候2002年的产品打75分。2003年走了后，平台迁移到eBay后，分数就惨不忍睹了。网站改个字需要九个礼拜，改个功能需要在总部排队九个月。（这里的故事很长了，产品只是一部分，文化的变化更致命。以后有空和易趣那些老员工们应该一起写本书。）</p>
<p>放眼世界上翘楚的产品，AMAZON，APPLE，NINTENDO，他们的CEO或创始人都是注重产品，不放权的疯子。</p>
<br />
<br />
<br />
<p>上一篇<a href="http://shaoblog.com/2009/01/10/创业，管哪个事情最重要？/">创业，管哪个事情最重要？</a>引起了一些<a href="http://friendfeed.com/e/bcc2d888-c9fb-774c-214e-fe9d17a05586">有趣的争议</a>，关于产品还是市场重要。我觉得这个问题对创业者很关键，所以再来写一篇。ha，这个月写了两篇，为前几个月补过。</p>
<p>首先，问题不是说企业里哪个部门重要。一个企业的成功，是很多因素的乘法。乘法和加法不同：后者如有一个因素是零，对整体不一定有大影响，但前者里如果有个因素是零，结果是零 - 产品，市场做得再好，财务出问题，公司照样死。当企业成功是乘法时，讨论哪个部门重要，没什么意义。比较有意义的问题是：创业者哪个比较可以放权，哪个需要自己抓。（谢谢<a href="http://blog.donews.com/keso/archive/2009/01/18/1461216.aspx">keso</a>帮我澄清too。）这个问题太重要了，因为我坚信一个初创的企业，最重要的资源是创始人的时间和精力。我们现在谈的，是这个资源的分配问题。</p>
<p>第二，做产品，从来不是（或不应该是）空想的。我觉得产品部是公司最难的工作。它需要综合权衡各个部门的要求。</p>
<p>a）市场：我们的现有用户是这么样的人？他们的需求是什么？我们的潜在用户是谁？他们的需求是什么？很多时候，人（尤其是经理人）会太注重现有顾客，忽视潜在客户。人也会太注重用户能表达的需求（市场调查拿得到得），忽略用户不知道怎么表达的需求（需要靠创业的自觉来发掘的）。</p>
<p>b）销售：什么样的产品卖得掉，容易销售？在有些公司，市场和销售的目标用户是一样的。在有些公司，用户（主要用产品的人）和顾客（付钱的人）是不一样的。如何满足和权衡他们不同的需求？在易趣那时，用户是买家，顾客是卖家，他们的需求往往不同，甚至相反。</p>
<p>c）技术：那些产品容易做，那些难做？如何取舍时间vs功能？技术部会经常说：市场部要的功能不可能做，或需要太久。有时技术部有个好点子，能做个眩的新功能，市场部不要。相信谁的判断？</p>
<p>d）客服：用户很多的反馈和问题，需要多重视？什么是1%的不重要的用户提出来的，什么是我们的核心用户的要求，或是潜在的核心用户的问题（解决了这个问题，他就成了核心用户）？</p>
<p>还有很多例子可举。我的感觉是产品最最需要一个创始者以一个公司<strong>总体</strong>和<strong>长远</strong>的发展为目标，权衡各个部门的<strong>利益</strong>和<strong>偏见</strong>（甚至惯性或惰性），最终以创始者的<strong>直觉</strong>做决定。</p>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/306904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2009-12-22 14:28 <a href="http://www.blogjava.net/jjwwhmm/archive/2009/12/22/306904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>要挖满足下面条件的一个人，可以吗？</title><link>http://www.blogjava.net/jjwwhmm/archive/2009/03/16/260059.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 16 Mar 2009 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2009/03/16/260059.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/260059.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2009/03/16/260059.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/260059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/260059.html</trackback:ping><description><![CDATA[要求:<br />
1.对Unix系统管理,网络,数据库,安全,分布式系统开发等各方面技术都有一定涉猎及经验<br />
2.精通一门编程语言,如Java,C,Php等<br />
3.精通企业系统集成设计模式<br />
3.对互联网有深刻认识，对电子商务,SNS,SAAS,支付,CRM,ERP等行业有过从业经验或有一定理解，熟悉主流电子商务网站的业务模式<br />
4.至少要有一个大型系统的系统分析/设计经验，有过百万级别会员数量以上系统的分析、设计经验者更佳<br />
5.至少有一个产品的完整开发经验，包括需求分析,产品设计,系统设计,程序开发,3人以上的开发团队管理,软件配置管理,质量控制,产品运营等各方面工作都有一定理解及经验<br />
6.优秀的口语及书面沟通表达能力,能熟练使用Word,PowerPoint,Project,UML工具编写各种类型文档,能熟练阅读英文&nbsp;<br />
7.有自己创业经验者优先
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/260059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2009-03-16 17:36 <a href="http://www.blogjava.net/jjwwhmm/archive/2009/03/16/260059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不会偷懒的程序员不是好程序员!</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Fri, 20 Jun 2008 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/209400.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/209400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/209400.html</trackback:ping><description><![CDATA[<p>今天看了篇文章:<br />
http://blogoscoped.com/archive/2005-08-24-n14.html<br />
<br />
这篇文章是讲为什么好的程序员是既懒有笨的!哈哈!<br />
我记得在看UNIX编程艺术时,里面也有这么段话,说不会偷懒的程序员不是好程序员!<br />
为什么呢!我们可以举些简单的例子:<br />
1.只有懒惰的程序员才会去编写那些可以最终代替自己工作的自动化工具,好的程序员都会有一套自己的代码自动生成工具,有的是用模板语言,有的是用shell.在开发一个新的系统时,系统基础框架设计好后,很多业务层代码基本上都是一个模子出来的,要想让这些代码都是从一个模子里出来,那么就需要在底层下很大的功夫才能做到.所以,每个程序员够应该有,或者会写代码自动生成工具,当然,这个工具并不是一个成功工具!它的前提是你必须在底层有足够的抽象.<br />
<br />
2.只有懒惰的程序员才不会去去写大段的冗余重复的代码,他们会想出各种方法来避免这种冗余代码的情况,做的好的,就是在系统的基础架构层来解决大部分这样的问题,通过精致的设计模式,高度抽象的模块,易用的接口,高度可配置的基础平台等等来实现,做的一般的会利用各种开源工具来代替自己想要的代码,做的差些的就是不断利用refactor重构出那些重复代码.<br />
<br />
3.好程序员怎么可能"笨"呢!哈哈!俺们可都是天之骄子啊!小心我扔你鸡蛋啊!<br />
很聪明的程序员一般比较自信,难以听进别人的意见,在一个团队中,最怕的并不是怕没有技术好的人,而是怕那些很聪明的人不跟你团队保持一致,举个例子,可能团队里有一套通用的数据存取方法,但聪明的程序员会坚持己见,自己发明出一套新的方法来!聪明的程序员会认为自己更懂客户的需求,而不顾市场人员提出的需求.这也是为什么很多人会说"要对团队中听话的人委以重任",我当然不同意这种看法,但是,既聪明团队意识又好的人,就比较少见了.团队不行的话,一个人再聪明又有什么用?<br />
<br />
4.聪明的程序员喜欢自己重新发明轮子!笨的程序员喜欢利用聪明的程序员写出的代码!<br />
<br />
5.聪明的程序员一般有自己思维的定势,笨的程序员因为什么都不懂,所以他的眼里什么都是可能,什么都是不可能!查找代码问题的时候,聪明的程序员首先会说:这是系统的bug,笨的程序员会看看自己的代码是不是有拼写错误!笨的程序员跟容易换位思考,下面有个例子:<br />
一段关于web开发问题的程序员和客服人员的对话:<br />
</p>
<p>&#8220;从昨天开始我们的用户就看不到我们站点上的Logo了。&#8221;<br />
&#8220;他试过重启浏览器么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他试过重启电脑么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他清空过浏览器Cache么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他的浏览器版本是IE6么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他确信是真的看不到Logo了么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他是在电脑显示器屏幕上看我们的站点么？&#8221;<br />
&#8220;什么？&#8221;<br />
&#8220;比如说，它可能是打印出来看不到？&#8221;<br />
&#8220;不。他是在显示器上看的。&#8221;<br />
&#8220;除了站点Logo之外，他是不是其他的图片都看不到？&#8221;<br />
&#8220;什么？哦。我再问问他。&#8221;<br />
</p>
<p>也许,聪明的程序员遇到这个问题的时候,甚至可能去找个图形算法分析下这个图片是否有问题!<br />
<br />
最后,以<a href="http://blogoscoped.com/archive/2005-08-24-n14.html">http://blogoscoped.com/archive/2005-08-24-n14.html</a>中的故事结尾,,以博列为看官一笑^_^<br />
It&#8217;s like the story of the centipede(蜈蚣). The centipede was very good at walking with its hundred legs. It never spent a thought on just how it could walk. Until one day, when a big black bug(臭虫) asked the centipede &#8220;How can you manage to <em>walk</em> with all those feet? Don&#8217;t you find it hard to coordinate their rhythm?&#8221; The black bug already left, when the centipede was still sitting down, pondering <em>how</em> it could walk, wondering, and (for the first time in his life) even worrying a little bit. From that day on, the centipede couldn&#8217;t walk anymore.<br />
So you better not think too much if you want to achieve something. And of course this is only half the truth, too... </p>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/209400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-20 11:38 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你的编程语言可以这样做吗？(map/reduce的js示范) (转)</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 09 Jun 2008 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/206800.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/206800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/206800.html</trackback:ping><description><![CDATA[有一天，你在浏览自己的代码，发现有两大段代码几乎一样。实际上，它们确实是一样的——除了一个关于意大利面（Spaghetti）而另一个关于巧克力慕思（Chocolate Moose）。
<div class="code">&nbsp;// 一个小例子:<br />
&nbsp;<br />
&nbsp;alert("偶要吃意大利面!");<br />
&nbsp;alert("偶要吃巧克力慕思!");</div>
嗯，这个例子碰巧是用javascript写的，不过你就算不懂JavaScript，应该也能明白它在干什么。 <br />
<br />
拷贝代码不好。于是，你创建了个函数
<div class="code">&nbsp;function SwedishChef( food ){<br />
&nbsp;alert("偶要吃" + food + "!");<br />
&nbsp;}</div>
<div class="code">&nbsp;SwedishChef("意大利面");<br />
&nbsp;SwedishChef("巧克力慕思");</div>
Ok，这只是一个很小很小的例子而已，相信你能想像到个更实际一点的例子。这段代码有很多优点，你全都听过几万次了：可维护性、可读性、抽象性 = 好！ <br />
<br />
现在你留意到有另外两段代码几乎跟它们一模一样，除了一个反复调用一个叫BoomBoom的函数，另一个反复调用一个叫PutInPot的。除此之外，這两段代码简直没什么两样:
<div class="code">&nbsp;alert("拿龙虾");<br />
&nbsp;PutInPot("龙虾");<br />
&nbsp;PutInPot("水");</div>
<div class="code">&nbsp;alert("拿鸡肉");<br />
&nbsp;BoomBoom("鸡肉");<br />
&nbsp;BoomBoom("椰子酱");</div>
现在要想个办法，使得你可以將一个函数用作另一个函数的参数。这是个重要的能力，因为你更容易将框架代码写成一个函数（emu注：还记得template method模式吧？）。
<div class="code">&nbsp;function Cook( i1, i2, f ){<br />
&nbsp;alert("拿" + i1);<br />
&nbsp;f(i1);<br />
&nbsp;f(i2);<br />
&nbsp;}</div>
<div class="code">&nbsp;Cook( "龙虾", "水", PutInPot );<br />
&nbsp;Cook( "鸡肉", "椰子酱", BoomBoom );</div>
看看，我们居然把函数当成调用参数传递了！ <br />
<br />
你的编程语言能办到吗？ <br />
<br />
等等&#8230;&#8230;假如我们已经有了PutInPot和BoomBoom这些函数的具体实现代码（而且又不需要在别的地方重用它们），那么用内联语法把它们写进函数调用里面不是比显式的声明这两个函数更漂亮吗？
<div class="code">&nbsp;Cook( "龙虾", <br />
&nbsp;"水", <br />
&nbsp;function(x) { alert("pot " + x); }  );<br />
&nbsp;Cook( "鸡肉", <br />
&nbsp;"椰子酱", <br />
&nbsp;function(x) { alert("boom " + x); } );</div>
耶，真方便！请注意我只是随手创建了个函数，甚至不用考虑怎么为它起名，只要拎着它的耳朵把它往一个函数里头一丢就可以了。 <br />
<br />
当你一想到作为参数的匿名函数，你也许想到对那些对数组里的每个元素进行相同操作的代码。
<div class="code">&nbsp;var a = [1,2,3];</div>
<div class="code">&nbsp;for (i=0; i&lt;a.length; i++){<br />
&nbsp;a[i] = a[i] * 2;<br />
&nbsp;}</div>
<div class="code">&nbsp;for (i=0; i&lt;a.length; i++){<br />
&nbsp;alert(a[i]);<br />
&nbsp;}</div>
常常要对数组里的所有元素做同一件事，因此你可以写个这样的函数来帮忙：
<div class="code">&nbsp;function map(fn, a){<br />
&nbsp;for (i = 0; i &lt; a.length; i++){<br />
&nbsp;a[i] = fn(a[i]);<br />
&nbsp;}<br />
&nbsp;}</div>
现在你可以把上面的东西改成：
<div class="code">&nbsp;map( function(x){return x*2;}, a );<br />
&nbsp;map( alert, a );</div>
另一个常见的任务是将数组内的所有元素按照某总方式汇总起来：
<div class="code">&nbsp;function sum(a){<br />
&nbsp;var s = 0;<br />
&nbsp;for (i = 0; i &lt; a.length; i++)<br />
&nbsp;s += a[i];<br />
&nbsp;return s;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;function join(a){<br />
&nbsp;var s = "";<br />
&nbsp;for (i = 0; i &lt; a.length; i++)<br />
&nbsp;s += a[i];<br />
&nbsp;return s;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;alert(sum([1,2,3]));<br />
&nbsp;alert(join(["a","b","c"]));</div>
sum和join长得很像，你也许想把它们抽象为一个将数组内的所有元素按某种算法汇总起來的泛型函数：
<div class="code">&nbsp;function reduce(fn, a, init){<br />
&nbsp;var s = init;<br />
&nbsp;for (i = 0; i &lt; a.length; i++)<br />
&nbsp;s = fn( s, a[i] );<br />
&nbsp;return s;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;function sum(a){<br />
&nbsp;return reduce( function(a, b){ return a + b; }, a, 0 );<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;function join(a){<br />
&nbsp;return reduce( function(a, b){ return a + b; }, a, "" );<br />
&nbsp;}</div>
许多早期的编程语言没法子做这种事。有些语言容许你做，却又困难重重（例如C有函数指针，但你要在別处声明和定义函数）。面向对象语言也不确保你用函数可以干些啥（把函数当对象处理？）。 <br />
<br />
如
果你想将函数视为一类对象，Java要求你建立一个有单方法的对象，称为算子对象。许多面向对象语言要你为每个类都建立一个完整文件，像这样开发可真叫
快。如果你的编程語言要你使用算子对象来包装方法（而不是把方法本身当成对象），你就不能徹底得到现代（动态）编程语言的好处。不妨试试看你可否退货拿回
些钱？ <br />
<br />
不用再写那些除了经过一个数组对每个元素做一些事情之外一无是处的函数，有什么好处？ <br />
<br />
让我们看回map函数。当你要对数组内的每个元素做一些事，你很可能不在乎哪个元素先做。无论由第一个元素开始执行，还是是由最后一个元素执行，你的结果都是一样的，对不？如果你手头上有2個CPU，你可以写段代码，使得它们各对一半的元素工作，于是乎map快了两倍。 <br />
<br />
或
者，发挥一下想像力，设想你在全球有千千万万台服务器分布在全世界的若干个数据中心，你有一个真的很大很大的数组，嗯，再发挥一下想像力，设想这个数组记
录有整个互联网的内容。还了，现在你可以在几千台服务器上同时执行map，让每台服务器都来解决同一个问题的一小部分。 <br />
<br />
那么在这个例子里面，编写一段非常快的代码来搜索整个互联网这个问题，其实就和用一个简单的字符串搜索器（算子）作为参数来调用map函数一样简单了。 <br />
<br />
希
望你注意到一个真正有意思的要点，如果你想要把map/reduce模式变成一个对所有人都有用，对所有人都能立刻派上用场的技术，你只需要一个超级天才
来写最重要的一部分代码，来让map/reduce可以在一个巨大的并行计算机阵列上运行，然后其他旧的但是一向在单一个循环中运行良好的代码，仍可以保
持正确的运行，惟一的差别只是比原来单机运行快了n倍。这意味着它们都一不留神突然变成可以被用来解决一个巨大的问题的代码。 <br />
<br />
让我再啰嗦一下，通过把&#8220;循环&#8221;这个概念加以抽象，你可以把用任何你喜欢的方式来实现&#8220;循环&#8221;过程，包括可以实现让循环迭代速度随着硬件计算能力保持令人满意的同步增长。 <br />
<br />
你现在应该可以明白不久为何对那些对<a href="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" title="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" target="_blank">除了Java之外什么都沒被学过的计算机系学生表示不满</a>了：<br />
( <a href="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" title="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" target="_blank">http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html</a> ) ：<br />
<br />
Without
understanding functional programming, you can't invent MapReduce, the
algorithm that makes Google so massively scalable. The terms Map and
Reduce come from Lisp and functional programming. MapReduce is, in
retrospect, obvious to anyone who remembers from their 6.001-equivalent
programming class that purely functional programs have no side effects
and are thus trivially parallelizable. The very fact that Google
invented MapReduce, and Microsoft didn't, says something about why
Microsoft is still playing catch up trying to get basic search features
to work, while Google has moved on to the next problem: building
Skynet^H^H^H^H^H^H the world's largest massively parallel
supercomputer. I don't think Microsoft completely understands just how
far behind they are on that wave. <br />
<br />
不理解函数式编程，你就发明不了MapReduce这个让Google的计算能力如此具有可扩展性的算法。Map和Reduce这两个术语源自Lisp语言和函数式编程&#8230;&#8230;（这是另一篇文章的内容，emu也不是很理解其中的各种说法的来龙去脉，就不翻译了） <br />
<br />
我希望你现在明白，把函数当成基本类型的（动态）编程语言能让你在编程过程中更好的进行抽象化，也就是使代码精悍、功能更内聚、更具可重用性及更具有扩展性。很多的Google应用使用Map/Reduce模式，因此一有人对其优化或修正缺陷，它们就都可以从中得益。 <br />
<br />
我
准备要再罗嗦一下，我认为最有生产力的编程语言莫过于能让你在不同层次上都可以进行抽象化的。老掉牙的FORTRAN 语言以前是不让你写函数的注。C
有函数指针，可是它们都非常丑丑丑丑丑丑丑丑陋，不允许匿名声明，又不能在用它们时实现它们而偏偏要放在別处去实现。Java让你使用算子对象，一种更丑
陋的东西。正如Steve Yegge所述，Java是個<a href="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" title="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" target="_blank">名词王国</a> <br />
( <a href="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" title="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" target="_blank">http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html</a> )。 <br />
<br />
<strong>作者注：</strong>这
里提起了FORTRAN，不过我上次使用FORTRAN是27年前的事了。FORTRAN是有函数的，我码字那会儿脑子里面想的大概是GW-BASIC语
言。（emu注，basic确实只有所谓的子程序和go-sub语句，作用只是重新组织代码结构而已，没有参数和调用堆栈，因此没有真正的函数调用）<br />
<br />
<strong>译者注：</strong>原作者起了《你的编程语言可以这样做吗》这个标题其实并不是这篇文章的真正价值所在，我转这篇文章也不是因为原作者可以把语言的初级技巧玩得转，而是因为这是一篇map/reduce模型的示范。
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/206800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-09 18:39 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖茨向开发人员告别演讲的一句话有感</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 04 Jun 2008 10:18:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/205900.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/205900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/205900.html</trackback:ping><description><![CDATA[周二在&#8220;TechEd Developers&#8221;大会上，微软董事会主席比尔&#183;盖茨(Bill Gates)面对满屋的开发人员，发表了退隐前的最后一次公开演讲。在开幕演讲上，盖茨说了这么一句话，&#8220;微软的成功在于我们和开发人员的关系。&#8221; <br />
看到这句话的时候,我想到了现在的公司,现在公司老板的意思就是不要企业文化,而是通过明确的管理规范来约束企业员工,如果所有的员工都一视同仁,开发人员与市场人员,运营人员都在相同的管理制度下工作的话,那么怎么来提现"微软的成功在于我们和开发人员的关系"?<br />
我一直坚定自己从事互联网行业的工作,就是因为在这个舞台上,每个人都可能有机会,每一个人都更加能够发挥自己的主观能动性,而且更加容易.作为互联网企业中最前线的员工---开发人员,如果企业不能提供一个有效的机制来激发他们创作的激情,而只是把他们当作工具来使用的话,那么很难想像企业的前途.又联想到现在google大量高级开发人员,甚至管理人员都纷纷出走,究其原因,是因为这里限制了他们的创造性.我相信,没有一个其它的行业能比处在互联网行业这个时代的浪潮之尖的行业中更能体会到创造的乐趣!<br />
所以,我认为,互联网企业中,公司与开发人员的关系这个问题,应该要被提到公司的战略管理的高度来重视这个问题.
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/205900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-04 18:18 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Collective Intelligence读书笔记之Inroduction to Collective Intelligence</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 19 May 2008 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/201369.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/201369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/201369.html</trackback:ping><description><![CDATA[在第一章的Collective Intelligence的介绍中,作者通过Netflix和google两个公司的例子来说明了Collective Intelligence的应用.但具体Collective Intelligence的定义到底是什么呢?作者并没有明确给出,所以我在读书笔记中也就直接用这两个单词了.
<div>这本书将会告诉读者,通过一些API,应用机器学习算法和统计方法来收集数据的一些方法.那么什么是机器学习呢?这个概念我倒是还有映像,幸好以前研究过语音识别,所以对人工智能方面的知识还有一点基础^_^作者给出的定义是:</div>
<div>An algorithm is given a set of data and infers information about the properties of the data---and that information allows it to make predictions about other data that it might see in the future.简单的说,就是给定一组数据,然后通过一个算法推断出一个数据模型,然后,利用这个模型可以对未来的其它数据做出预测.作者通过一个垃圾邮件过滤的简单例子形象的说明了机器学习的过程!</div>
<div>机器学习常用到的一些算法包括决策树,神经网络等,我还记得语音识别中用到了隐马尔科夫模型,DTW,线性预测LPC,聚类等模型,但主要的都是基于数学方法和统计方法,真是后悔数学没学好啊:(</div>
<div>作者罗列了一些机器学习算法的应用场景,例如Google的page rank,Amozon的推荐系统,在金融系统中的防欺骗检测,产品市场预测,供应链管理等方面.</div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/201369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-19 13:38 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Collective Intelligence读书笔记之Foreword</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Fri, 16 May 2008 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/200924.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/200924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/200924.html</trackback:ping><description><![CDATA[<p>今天终于拿到了这本期盼已久的书,可惜是英文的,鉴于对这本书的敬仰!也只好咬着头皮读下去了!<br />
刚看了序言,把里面精彩的两段摘录下来:<br />
Web2.0...Getting users to participage is the first step.Learning from those users and shapping your site based on what they do and pay attention to is the second step.<br />
在web2.0中,让用户参与到你的系统中来只是其中的第一步,更多的是要从这些用户的行为中不断学习,并在这些经验的基础上优化你的web站点<br />
<br />
It's not longer enough to know how to build a database-backed web site.If you want to succeed,you need to know how to mine the data that users are ading,both explicitly and as a side effect of their activity on your site.<br />
如果你想成功的话,仅仅局限于知道怎么构建一个基于数据路的web站点还是很不够的,你需要知道怎么从用户增加的web内容中提炼出有用的数据.</p>
 <img src ="http://www.blogjava.net/jjwwhmm/aggbug/200924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-16 15:22 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>