<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>harry</title>
    <description></description>
    <link>http://harry.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>Ubuntu下ADSL上网设置</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/192941" style="color:red;">http://harry.javaeye.com/blog/192941</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.  配置： sudo pppoeconf<br /><br />然后根据提示输入ADSL账号与密码<br />设置完后,下次开机会自动连接的。。<br /><br />2. 其它相关的几个命令:<br /><br />上网执行:   pon dsl-provider<br />激活ADSL:  sudo /etc/ppp/pppoe_on_boot<br />断开连接：  poff<br />查看日志: sudo plog
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/192941#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 14:56:11 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/192941</link>
        <guid>http://harry.javaeye.com/blog/192941</guid>
      </item>
          <item>
        <title>无意中网上看到一篇关于gedit的文章，原来gnome自带的gedit是个宝啊</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/190727" style="color:red;">http://harry.javaeye.com/blog/190727</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          无意中网上看到一篇关于gedit的文章，发现原来gedit是个宝啊。<br />装上插件后就可以像textmate一样好用<br />http://grigio.org/textmate_gedit_few_steps<br />http://www.youtube.com/watch?v=yuAR6NxiEgQ<br />http://grigio.org/pimp_my_gedit_was_textmate_linux<br />经过使用，我推荐snap open，Class Browser，Snippets，eddt，Session Saver这几个插件
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/190727#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 22:04:32 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/190727</link>
        <guid>http://harry.javaeye.com/blog/190727</guid>
      </item>
          <item>
        <title>关于Python和Java结合的新思路</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/189380" style="color:red;">http://harry.javaeye.com/blog/189380</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本人所在的公司(一个创业型的网络公司)，主要的系统都是在java平坦上开发的。不过坦率的说用Java开发网站，不如脚本语言Python，php等用起来方便、直接。我们新的系统主要是社区这一块，决定使用python开发，使用django。这样就带来了python和原来的java系统结合的问题。<br />   比如原来的已有的积分结算系统，里面有很多关于结算的logic，我不想在python这边再实现一遍，不仅是重复的劳动，而且又要测试一遍，是否和原来的一致，更可怕的是当结算逻辑更改的时候，要维护两份代码！！！<br />   首先想到的方案是让django跑在Jython上，在网上看到已经有人这样做了，不过貌似很麻烦，还有很多未解决的bug。<br />   这样遇到了困难，转而想通过python和java通讯的方式，通过socket？这样还要自己做一套java object和python object转化的程序，麻烦，没把握能否达到想要的效果。在google上搜了一把，有很多java和python通讯的东东，不过好像没有适合我需要的。突然想起学习spring的时候，提供web service的机制中有个叫hessian的方案，基于http的二进制协议，貌似速度快，而且简单好用。hessian也提供python client访问代码。貌似可行。<br />   那么现在要做就是把原来的代码按web service的方式，封装成一个个hessian service。比如积分结算的service。然后在django的views.py中通过hessian调用这个service就可以了。<br />   虽然http调用会带来一定的开销，不过用hessian的话应该开销不大。大家觉得怎么样，现在的方案是python+hessian+java?
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/189380#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 16:01:57 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/189380</link>
        <guid>http://harry.javaeye.com/blog/189380</guid>
      </item>
          <item>
        <title>[转]一个职场人的十年工作感悟</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/175327" style="color:red;">http://harry.javaeye.com/blog/175327</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本来想起个诸如之类吸引眼球的名字，但想想有点大阵式了，只是说说毕业十年在职场的一点感受，看了，希望对DDMM有些裨益，不看，俺也算自已做了一个2006的小结。<br /><br />　　1、在职场骑驴找马，经常跳槽，薪水不断高升是一种方法（呵呵，俺LP就是如此，跳了八次，薪水从一千到现在六、七千，经常要给俺讲经验），但认定发展，固守一个地方也未尝不是一个方向，这样人脉关系，客户，环境还会更熟，容易发展（俺即是一例，毕业在国家机关呆一年出来，在这个公司呆九年了，薪水从三百到现在是LP的八倍，当然也是苦尽甘来，此是后话），前提是一定认准公司会有发展。<br /><br />　　2、去大的公司固然好，可以学到先进的管理经验等，但在一个蒸蒸日上的中小公司也是不错的，“小公司做大事”，会有机会危以重任，在与公司共同发展中学到实战经验，而一个人的经验是弥足珍贵，无法复制的！<br /><br />　　3、要有远大的目标，但一定要脚踏实地的干，“千里之行始于足下”“万丈高楼平地起”千万不能眼高手低，否则你会沦为：“心比天高，命比纸薄”。<br /><br />　　4、“与其临渊羡鱼，不如退而结网”，你羡慕别人的收入成就，报怨自已的工作或环境是无助于事的，消极工作更是要不得，因为公司损失的仅仅是工资，而你却是在浪费宝贵的时间。<br /><br />　　5、一定要坚定的靠自已，可能你有当官的亲威或富有的朋友，当你把希望寄托在别人的身上时，你会越来越难把握自已的命运！<br /><br />　　6、要把工作与生活分开，千万不要把自已的全部投入到工作中，记着，工作只是谋生的手段，乐趣还在生活中，健康是自已的，而老板只是把你当雇工，赚钱的手段，无论他说的口吐莲花。
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/175327#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Mar 2008 10:23:31 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/175327</link>
        <guid>http://harry.javaeye.com/blog/175327</guid>
      </item>
          <item>
        <title>[转]关于Maven</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/169218" style="color:red;">http://harry.javaeye.com/blog/169218</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          maven2实际上挺好的。 <br />用任何东西，都是双刃剑。关键要扬长避短。 <br />1、用maven2，最好有自己的私服。 <br />比如，Spring 2.5.1，可能刚release，repo1.maven.org/maven2/不一定有。 <br />你可以install到你的私服去。 <br />2、应该结合Ant <br />很多maven不灵活的地方，可以用ant来解决 <br />3、定义meta-inf的信息。 <br />开发OSGI的Bundle，就必须定义meta-inf信息。也可以定义自己的格式。 <br />4、不要使用maven2相关的ide。 <br />实际上，多使用命令。比如mvn eclipse.然后，导入到eclipse工程。 <br />有更新，再执行mvn eclipse，在刷新工程就可以。 <br />我非常反对，过多的依赖IDE。单元测试比较难做，无法做到持续集成！ <br />题外话：我个人强烈倾向于调式，使用mvn jetty:run； <br />数据库就用hsqldb,便于使用dbunit. <br />毕竟，现在可以使用spring,jpa/hibernate. <br />完全可以做到数据库无关性，应用服务器无关性。 <br />5、依赖关系要设计好 <br />jar和jar之间的关系，package和package之间的关系， <br />开发前，设计的时候就要规划好，不能什么都靠工具。工具不是万能的。 <br />尤其是开发OSGI bundle的时候，依赖关系一定要先设计好， <br />一定要保证单向依赖性！ <br /><br />实际上，我使用maven，中间也遇到了一些问题，总的说来，帮助还是非常大。 <br />尤其是，新来的开发人员搭建开发、测试环境、持续集成的时候，效果非常明显！ <br />我也承认maven2是好的思路，但是实现得不好。 <br />最重要的是，在新的工具出现前，我们只能选择它。 <br />不过，可以结合IVY，ant，尽可能的扬长避短。
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/169218#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 19:02:26 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/169218</link>
        <guid>http://harry.javaeye.com/blog/169218</guid>
      </item>
          <item>
        <title>[转]70位专家谈CSS设计</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/168148" style="color:red;">http://harry.javaeye.com/blog/168148</a>&nbsp;
          发表时间: 2008年03月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h4 id="subjcns!c9293f4c30d23a7f!733" style="margin-bottom: 0px"><span><div id="msgcns!c9293f4c30d23a7f!733" class="bvMsg"><p style="font-style: italic"> 原文取自<a href="http://www.smashingmagazine.com/2007/05/10/70-expert-ideas-for-better-css-coding/">smashing magazine </a>下面我对原文大致翻译一下, 以便大家阅读.</p><p><strong><br /></strong></p><p><strong>CSS 并不总是很好对付.</strong> 这取决于你的技巧和经验. CSS编码有时会成为一场噩梦, 特别是当你还不知道文件中的元素应该适用哪些选项的时候. 一个减少代码复杂性的简易法门, 就是利用哪些鲜为人知的CSS属性来创建适用性比较强的正确标注.</p><p>下面引用的70个专家技巧,附加了他们的相关文章地址.</p><ul><li>如果感兴趣你还可以阅读 <a href="http://www.smashingmagazine.com/2007/01/19/53-css-techniques-you-couldnt-live-without/">53 CSS-Techniques You Couldn&rsquo;t Live Without(53个你必须掌握的CSS技术)</a>, </li><li><a href="http://digg.com/design/70_Expert_Ideas_For_Better_CSS_Coding" title="Digg this article!">Digg this article(挖掘这篇文章)</a> 如果你觉得有用.</li></ul><br /><h3>1.1. Workflow: 上路</h3>















<ul><li><strong>当你确定了设计思路, 请用一个空白页面展开设计.</strong>















&ldquo;包括页头 , 导航条, 内容样例 和页脚 &nbsp;之后添加HTML标记, CSS控制,这样会让事情简单清晰起来.&rdquo; [<a href="http://cssing.blogspot.com/2006/02/10-css-tips-for-new.html">CSSing</a>]</li><li><strong>务必要重置CSS样式表</strong> &ldquo;你可能会经常删除哪些不必要的特殊设置, 而充分利用每个特性的缺省值. 而另一些人则倾向于做全局重置 <a href="http://leftjustified.net/journal/2004/10/19/global-ws-reset/">Global white space reset</a> , 就是在样式表的开头把所有要素的边据(margin)和空距(padding)全部归零. Eric Meyer&rsquo;s <a href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">Global Reset</a>(全局重置), <a href="http://www.christianmontoya.com/2007/02/01/css-techniques-i-use-all-the-time/">Christian Montoya&rsquo;s initial CSS file</a>(初始化CSS文件), <a href="http://businesslogs.com/design_and_usability/my_5_css_tips.php">Mike Rundle&rsquo;s initial CSS file</a>, <a href="http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/">Ping Mag&rsquo;s initial CSS file</a>. [<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">Roger Johansson</a>]</li><li><strong>使用主样式表master stylesheet.</strong>
&ldquo;一个常见的错误就是, 我看到很多初学者和中级玩家, 在使用样式表的时候, 由于不同的浏览器对一些样式有不同的缺省设置,
再没有统一化的情况下, 就会导致在不同浏览器中显示效果不一致. 而招致程序员抱怨调试困难. 其实, 你只要重置这些设置,
很多问题都可以得到避免. &rdquo; [<a href="http://www.crucialwebhost.com/blog/master-stylesheet-the-most-useful-css-technique/">Master Stylesheet: The Most Useful CSS Technique</a>(主样式表: 最有用的CSS技术)], [<a href="http://www.72dpiintheshade.com/2007/01/16/top-10-css-tips-from-a-professional-css-architect/">Ryan Parr</a>]</li></ul>















<ol><li>master.css</li><li>@import url(&quot;reset.css&quot;);</li><li>@import url(&quot;global.css&quot;);</li><li>@import url(&quot;flash.css&quot;);</li><li>@import url(&quot;structure.css&quot;);</li></ol>















<ol><li>&lt;style type=&quot;text/css&quot; media=&quot;Screen&quot;&gt;</li><li>/*\*/@import url(&quot;css/master.css&quot;);/**/</li><li>&lt;/style&gt;</li></ol>















<ul><li><strong>保持一个有用的CSS对象库.</strong> 这对调试很有用, 但应该避免出现在发布的版本中. &nbsp;因为你可以同时使用多个类名称用来调试你的一个标记(i.e. &lt;p class=&quot;floatLeft alignLeft width75&quot;&gt;...&lt;/p&gt;用了三个类名称来标记&lt;p/&gt;). [<a href="http://www.richardkmiller.com/blog/archives/2006/08/css-best-practices">Richard K. Miller</a>]</li></ul>















<ol><li>CSS:</li><li>.width100 { width: 100%; }</li><li>.width75 { width: 75%; }</li><li>.width50 { width: 50%; }</li><li>.floatLeft { float: left; }</li><li>.floatRight { float: right; }</li><li>.alignLeft { text-align: left; }</li><li>.alignRight { text-align: right; }</li></ol>















<h3>1.2. 组织化CSS编码<br /></h3>















<ul><li><strong>使用主样式表组织化CSS</strong> &ldquo;用主样式表组织化的样式非常有利于网站维护 . 在这个样式表中输入 reset.css, global.css, flash.css (如果需要) 和 structure.css 以及间歇使用的拓扑样式, 这里是一个如何使用这些技术的样例&rdquo;</li></ul>















<ol><li>h2 { }</li><li>#snapshot_box h2 {</li><li>padding: 0 0 6px 0;</li><li>font: bold 14px/14px &quot;Verdana&quot;, sans-serif; }</li><li>#main_side h2 {</li><li>color: #444;</li><li>font: bold 14px/14px &quot;Verdana&quot;, sans-serif; }</li><li>.sidetagselection h2 {</li><li>color: #fff;</li><li>font: bold 14px/14px &quot;Verdana&quot;, sans-serif; }</li></ol>















<ul><li><strong>使用标注组织样式表.</strong> &ldquo;把你的样式表分成不同的区域, 例如: 全局(文件体, 段落, 列表等), 页头, 页尾,页面结构, &nbsp;文字风格, 导航条, 表单, 标注, 扩展,等. [<a href="http://www.erraticwisdom.com/2006/01/18/5-tips-for-organizing-your-css">5 Tips for Organizing Your CSS(组织化CSS的5的窍门)</a>]</li></ul>















<ol><li>/* -----------------------------------*/</li><li>/* ----------&gt;&gt;&gt; GLOBAL &lt;&lt;&lt;-----------*/</li><li>/* -----------------------------------*/</li></ol>















<ul><li><strong>用一个内容表来组织样式表.</strong>















在你的CSS文件头, 画一个内容表, 例如, 你可以勾画出CSS控制的不同区域, 用醒目的分割来划分他们. &nbsp;[<a href="http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/">5 Steps to CSS Heaven(5步跨进CSS天国)</a>]</li><li><strong>用字母次序表规划样式表.</strong> &ldquo;我不知道怎么想到这个主意的, 反正用了几个月, 发现找到这些样式很容易.(译者注: 对于中文用户, 除非每个样式的名称很准确,并能被大家理解, 否则可用性会很差.)&rdquo; [<a href="http://www.christianmontoya.com/2007/02/01/css-techniques-i-use-all-the-time/">Christian Montoya</a>]</li></ul>















<ol><li>body {</li><li>background:#fdfdfd;</li><li>color:#333;</li><li>font-size:1em;</li><li>line-height:1.4;</li><li>margin:0;</li><li>padding:0;</li><li>}</li></ol>















<ul><li><strong>把代码分成不同的块.</strong>. &ldquo;很多人直觉上都会这么做, 只要变成习惯, 经年累月的实践, 这应该是最好的办法. 例如:: /* Structure */, /* Typography */ etc.&rdquo; [<a href="http://www.blogherald.com/2006/09/08/css-tips-and-tricks/">CSS Tips and Tricks(CSS窍门和魔法)</a>]</li><li><strong>钩子, 线, 和铅坠Hook, line, and sinker.</strong> 一旦你的CSS文档已经分成了不同的区块, 你就应该思考, 如何让这些小节点上的钩子结构化, 这将给你节省大量的时间, 并让文档更有说服力.&rdquo; [<a href="http://www.72dpiintheshade.com/2007/01/16/top-10-css-tips-from-a-professional-css-architect/">Ryan Parr</a>]</li><li><strong>把样式表分成不同的块.</strong>
&ldquo;我通常把自己的样式表分成三个块. 第一部分是元素直白定义, 变换文体, 页头风格, 重置表单的间距, 一些链接的风格, 等等. 接下来,
我会定义一些类, 例如提示框, 警告框, &nbsp;等等, 我倾向于先定义主容器, 然后定义这个主容器中的元素,
这样扫一眼,就可以看到文档的规划结构, 对于哪些没有约束的容器, 我一般也要给他们一个名字.&quot; [<a href="http://snook.ca/archives/html_and_css/top_css_tips/">Jonathan Snook</a>]</li></ul>















<h3>1.3. Workflow: 控项编号, 类, 同类项, 属性 Handling IDs, Classes, Selectors, Properties</h3>















<ul><li><strong>让容器最小化.</strong> &ldquo;结构化灌装文档. 新手会使用很多像表格一样的单元去构建一个文档. 而用结构化的要素构建文档才是最有效的. 要做到这点, 必须开始之前统盘考虑所有要素, 争取用通用的结构获得相同的效果, 而不是不断定义哪些小巧的DIV单元. &rdquo; [<a href="http://www.72dpiintheshade.com/2007/01/16/top-10-css-tips-from-a-professional-css-architect/">Ryan Parr</a>]</li><li><strong>属性最小化.</strong> &ldquo;善用CSS. 这个大原则可以派生很多小原则: 如果没有一个点来增加属性, 就不要增加, 如果你不确定该属性的用途, 就不要增加, 如果相同的属性被赋予很多地方, 争取在一个地方定义它.&rdquo; [<a href="http://cssing.blogspot.com/2006/02/10-css-tips-for-new.html">CSSing</a>]</li><li><strong>同类项最小化.</strong> &ldquo;避免不必要的同类项, 同类项越少, 问题就越容易处理.&rdquo; [<a href="http://snook.ca/archives/html_and_css/top_css_tips/">Jonathan Snook</a>]</li><li><strong> CSS 修复点(hack)最小化.</strong> &ldquo;除非是公认的或文档化的缺陷, 尽量不要使用修复点. 我常常看到的情况是, 修复点本身变成了问题. 最好找到问题的根源, 从根本上解决或避免, 而不是滥用修复点.[<a href="http://www.search-this.com/2007/03/26/10-quick-tips-for-an-easier-css-life/">10 Quick Tips for an easier CSS life(10个让CSS更简单的窍门)</a>]</li><li><strong>使用CSS常量开发.</strong> &ldquo;所谓常量 &ndash; 就是在很多地方使用的固定数值. 在CSS文档前面创建这些常量的说明, 颜色对照表, 利用替换的方式, 可以减少修订中的错误.&rdquo; [<a href="http://24ways.org/2006/faster-development-with-css-constants">Rachel Andrew</a>]</li></ul>















<ol><li># /*</li><li># Dark grey (text): #333333</li><li># Dark Blue (headings, links) #000066</li><li># Mid Blue (header) #333399</li><li># Light blue (top navigation) #CCCCFF</li><li># Mid grey: #666666</li><li># */</li></ol>















<ul><li><strong>使用通用命名空间.</strong> 一套好的命名体系, 会在修复缺陷时, 节省大量时间. 我建议使用 parent_child 结构. [<a href="http://christopher-scott.org/blog/10-css-tips-you-might-not-have-known-about">10 CSS Tips</a>]</li><li><strong>按语法定义类和编号.</strong>















&ldquo;错误的名称会引起岐义, 不便于沟通协作, 也会导致重复定义&quot;. [<a href="http://www.digital-web.com/articles/markup_as_craft/">Garrett Dimon</a>]</li><li><strong>用通用的CSS定义给同类项编组.</strong>















&ldquo;当一些元素的类型,类,或ID:s 使用相同的属性, 你可以把这些同类项编组, 以便一起定义, 而不是分开重复定义&rdquo; [<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">Roger Johansson</a>]</li><li><strong>如果一个独立属性需要复用, 就把它独立出来.</strong>















&ldquo;如果你发现一个属性的定义被广泛使用, 不妨把它单拿出来定义&rdquo; [<a href="http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/">5 Steps to CSS Heaven</a>]</li><li><strong>尽可能树状化表达你的编号和类.</strong> 文档的层次化 <a href="http://www.456bereastreet.com/archive/200509/css_21_selectors_part_1/">contextual selectors</a> 十分必要. 这样可以使文档更容易阅读和使用. [<a href="http://placenamehere.com/article/156/TenSimpleCSSTips">Chric Casciano</a>]</li><li><strong>学会充分利用CSS的瀑性(继承性)特征.</strong> &ldquo;如果你的网站中有两个类似的显示区(box),你愿意定义两个样式, 还是定义一个样式后, 用一个外部样式对它进行修正?&rdquo; [<a href="http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/">5 Steps to CSS heaven</a>]</li><li><strong>使用工具化标记(Tag): &lt;small&gt;, &lt;em&gt; 和 &lt;strong&gt;.</strong>















&ldquo;可以充分使用这些工具化标记, 对XHTML来说, 它具有更好的语意结构性, 过多的利用类来定义类似的要素, 会让文档结构本身的语法环境遭到破坏&quot;. [<a href="http://businesslogs.com/design_and_usability/my_5_css_tips.php">Mike Rundle&rsquo;s 5 CSS Tips</a>]</li></ul>















<h3>1.4. Workflow: 使用缩写标注</h3>















<ul><li><strong>缩写十六进位色彩标注.</strong> &ldquo;在颜色定义中: #000 等同于 #000000, #369 等同于 #336699 &nbsp;[<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">Roger Johansson</a>]</li><li><strong>用 LoVe/HAte-次序定义链接伪类</strong>















Link, Visited, Hover, Active. &ldquo;可以确保你看到所有的链接样式.&rdquo; [<a href="http://meyerweb.com/eric/css/link-specificity.html">Eric Meyer</a>]</li></ul>















<ol><li>a:link { color: blue; }</li><li>a:visited { color: purple; }</li><li>a:hover { color: purple; }</li><li>a:active { color: red; }</li></ol>















<ul><li><strong>用 TRouBLed-次序定义外边距, 内边距和边框</strong>:















Top, Right, Bottom, Left. &ldquo;用顺时针的方向,从顶部开始定义, 养成这种习惯,还可以用缩写法快速定义.&rdquo; [<a href="http://www.456bereastreet.com/lab/developing_with_web_standards/css/">Roger Johansson</a>]</li><li><strong>使用缩写属性 <a href="http://www.456bereastreet.com/archive/200502/efficient_css_with_shorthand_properties/">shorthand properties</a>.</strong><br />















&ldquo;使用缩写定义 margin, padding and border 属性可以节省大量空间.</li></ul>















<ol><li>CSS:</li><li>margin: top right bottom left;</li><li>margin:1em 0 2em 0.5em;</li><li>(margin-top: 1em; margin-right: 0; margin-bottom: 2em; margin-left: 0.5em;)</li></ol>















<ol><li>CSS:</li><li>border:width style color;</li><li>border:1px solid #000;</li></ol>















<ol><li>CSS:</li><li>background: color image repeat attachment position;</li><li>background:#f00 url(background.gif) no-repeat fixed 0 0;</li></ol>















<ol><li>CSS:</li><li>font: font-style (italic/normal) font-variant (small-caps) font-weight font-size/line-height font-family;</li><li>font: italic small-caps bold 1em/140% &quot;Lucida Grande&quot;,sans-serif;</li></ol>















<h3>1.5. Workflow: 建立拓扑结构</h3>















<ul><li><strong>用62.5%的比例, 保持 EM单位和PX单位的协同性</strong>. &nbsp;font-size 的缺省值是 16px; 利用这个原则, 你可以换算一个 Em 大约是10像素 &nbsp;(16 x 62.5% = 10). &ldquo;我倾向于让不同文字之间的比例保持在62.5%. 这样可以让你同时用em 和 px 两种方法思考 &rdquo; [<a href="http://snook.ca/archives/html_and_css/top_css_tips/">Jonathan Snook</a>]</li><li><strong>使用通用字符集UTF-8编写代码</strong>. . [<a href="http://www.netmag.co.uk/zine/design-tutorials/20-pro-tips">20 pro tips</a>]</li></ul>















<ol><li>&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/ html;charset=utf-8&quot; /&gt;</li></ol>















<ul><li><strong>使用 CSS转换大小写.</strong> 如果你相让一些内容全部大写, 很简单,只需要在CSS中做如下定义即可&rdquo;. [<a href="http://www.netmag.co.uk/zine/design-tutorials/20-pro-tips">20 pro tips</a>]</li></ul>















<ol><li>h1 {</li><li>text-transform: uppercase;</li><li>}</li></ol>















<ul><li><strong>使用 small-caps .</strong> 例如:</li></ul>















<ol><li>h1 {</li><li>font-variant: small-caps;</li><li>}</li></ol>















<ul><li><strong>Cover all the bases - 定义通用字体.</strong>















&ldquo;如果我们使用某些特殊的字体, 必须要确定浏览者的机器上也装载这些字体, 因此我们必须了解哪些是通用的字体, 才能保证设计和展示是一致的. [<a href="http://www.communitymx.com/content/article.cfm?cid=FAF76&amp;print=true">Getting into good coding habits</a>]</li></ul>















<ol><li>p {</li><li>font-family: Arial, Verdana, Helvetica, sans-serif;</li><li>}</li></ol>















<ul><li><strong>用 1.4em - 1.6em 定义线高 line-height.</strong> &ldquo;line-height:1.4&rdquo; &nbsp;合理的线长 line-lengths应避免超过10个单词 . 例如纯黑或纯白在CRT显示器上过亮. 尝试使用次白 (#fafafa) 和灰黑(#333333,).比较理想&rdquo; [<a href="http://www.christianmontoya.com/2007/02/01/css-techniques-i-use-all-the-time/">Christian Montoya</a>]</li><li><strong>用 100.01% 定义HTML元素(html-element).</strong> 这个特义值 100.01% 定义字符大小可以解决很多浏览器的bug. 首先, 用百分比设置缺省的 body font size 就用这个值, 这样基本上可以解决IE, Opera, Safari中的字体不同大小和缩放的问题.&rdquo; [<a href="http://www.communitymx.com/content/article.cfm?cid=FAF76&amp;print=true">CSS: Getting into good habits</a>]</li></ul>















<h3>1.6. Workflow: 调试</h3>















<ul><li><strong>给每个容器加边框</strong> &ldquo;例如. div { border:1px red dashed; } 这样看起来很舒服. 还有其他的方法 <a href="http://www.squarefree.com/bookmarklets/webdevel.html">bookmarklets that apply borders</a> 例如 * { border: 1px solid #ff0000; }. [<a href="http://placenamehere.com/article/156/TenSimpleCSSTips">Chric Casciano</a>]. &nbsp;[<a href="http://www.mezzoblue.com/css/cribsheet/">CSS Crib Sheet</a>]</li></ul>















<ol><li>* { border: 1px solid #f00; }</li></ol>















<ul><li><strong>调试时, 先检查封闭元素.</strong>















&ldquo;很多意想不到的错误,都是由于该封闭的元素,没有被封闭导致的&quot;. [<a href="http://christopher-scott.org/blog/10-css-tips-you-might-not-have-known-about">10 CSS Tips</a>]</li></ul>















<h3>2.1. 技术窍门: IDs, Classes</h3>















<ul><li><strong>每页只能有一个ID, 但可以有多个类.</strong> &ldquo;检查你的















IDs: 一个页面只能有一个元素使用一个确定的ID,很多元素可以用相同的类定义, 注意 ID 和 Class 的名字只能用使用 [A-Za-z0-9]















的字母或数字以及连接符号 (-), 开始字母不能用数字或连接符号(参照















CSS2 语法和类型.&rdquo; [<a href="http://www.456bereastreet.com/lab/developing_with_web_standards/css/">Roger Johansson</a>]</li><li><strong>元素在同类项(selectors)中是大小写相关的</strong>.















&ldquo;记住大小写相关. 当 CSS用在XHTML, 因为XML是大小写相关的.&rdquo; [<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">Roger Johansson</a>]</li><li>CSS classes 和 IDs 必须合法. &ldquo;我们在定义这些对象的使用最好用他们的功能, 而不是他的外观&rdquo; [<a href="http://learningtheworld.eu/2006/best-practices/#css">CSS Best Practices</a>]</li><li><strong>一个元素可以使用多个类</strong>&ldquo;你可以分配多个类给一个元素, 因此你通过多定义一些不同的类,而有选择的使用他们,完成你对样式的约束.&rdquo; [<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">Roger Johansson</a>]</li></ul>















<h3>2.2. 技术窍门: 利用同类项</h3>















<p>Roger Johansson 曾写过很有用的一篇文章 <a href="http://www.456bereastreet.com/archive/200509/css_21_selectors_part_1/">CSS 2.1 Selectors</a>. 强烈推荐阅读这篇文章.你可以发现很多有用的东西. 例如同类项父子定义 &lsquo;&gt;&rsquo; 和 &lsquo;+&rsquo; 在 IE6 和早期版本中并不支持.















</p><ul><li><strong>你可以使用子同类项.</strong> &ldquo;A child selector















targets an immediate child of a certain element. A child selector















consists of two or more selectors separated by a greater than sign,















&ldquo;&gt;&rdquo;. The parent goes to the left of the &ldquo;&gt;&rdquo;, and whitespace is















allowed around the combinator. This rule will affect all strong















elements that are children of a div element. [<a href="http://www.456bereastreet.com/archive/200510/css_21_selectors_part_2/">Roger Johansson</a>]</li></ul>















<ol><li>div &gt; strong { color:#f00; }</li></ol>















<ul><li><strong>使用多血缘同类项(</strong>adjacent sibling selector )<strong>.</strong> An















adjacent sibling selector is made up of two simple selectors separated















by a plus sign, &ldquo;+&rdquo;. Whitespace is allowed around the adjacent sibling















combinator. The selector matches an element which is the next sibling















to the first element. The elements must have the same parent and the















first element must immediately precede the second element. [<a href="http://www.456bereastreet.com/archive/200510/css_21_selectors_part_2/">Roger Johansson</a>]</li></ul>















<ol><li>p + p { color:#f00; }</li></ol>















<ul><li><strong>使用特性同类项</strong> 一个特性同类项, 可以通过四种方式找到要定义的对象:</li></ul>















<ol><li>[att]</li><li>Matches elements that have an att attribute, regardless of its value.</li><li>[att=val]</li><li>Matches elements that have an att attribute with a value of exactly &ldquo;val&rdquo;.</li><li>[att~=val]</li><li>Matches elements whose att attribute value is















a space-separated list that contains &ldquo;val&rdquo;. In this case &ldquo;val&rdquo; cannot















contain spaces.</li><li>[att|=val]</li><li>Matches elements whose att attribute value is















a hyphen-separated list that begins with &ldquo;val&rdquo;. The main use for this















is to match language subcodes specified by the lang attribute (xml:lang















in XHTML), e.g. &ldquo;en&rdquo;, &ldquo;en-us&rdquo;, &ldquo;en-gb&rdquo;, etc.</li><li></li></ol>















<ul><li>The selector in the following rule matches all p elements that have a title attribute, regardless of which value it has:</li></ul>















<ol><li>p[title] { color:#f00; }</li></ol>















<ul><li>The selector matches all div elements that have a class attribute with the value error:</li></ul>















<ol><li>div[class=error] { color:#f00; }</li></ol>















<ul><li>Multiple attribute selectors can be used in the same selector. This















makes it possible to match against several different attributes for the















same element. The following rule would apply to all blockquote elements















that have a class attribute whose value is exactly &ldquo;quote&rdquo;, and a cite















attribute (regardless of its value):</li></ul>















<ol><li>blockquote[class=quote][cite] { color:#f00; }</li></ol>















<ul><li><strong>使用降阶同类项descendant selectors.</strong> &ldquo;Descendant















selectors can help you eliminate many class attributes from your markup















and make your CSS selectors much more efficient. &rdquo; [<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">Roger Johansson</a>]</li></ul>















<h3>2.3. 技术窍门: 链接样式化</h3>















<ul><li><strong>如果使用锚点, 你要小心.</strong> &ldquo;如果在你的编码中使用锚点 (&lt;a name=&quot;anchor&quot;&gt;) 你要注意, 他会使用 :hover 和 :active 这些伪类. 为避免这些问题, 你要使用ID 来定义这些锚点,或使用内部约束 <a href="http://dbaron.org/css/1999/09/links" title="Notes on suggesting link styles">slightly more arcane</a> 语法: :link:hover, :link:active&rdquo; [<a href="http://www.mezzoblue.com/css/cribsheet/">Dave Shea</a>]</li><li><strong>定义链接关系</strong> &ldquo;The rel attribute is supposed to indicate a semantic link relationship from one resource to another.</li></ul>















<ol><li>a[rel~=&quot;nofollow&quot;]::after {</li><li>content: &quot;\2620&quot;;</li><li>color: #933;</li><li>font-size: x-small;</li><li>}</li><li>a[rel~=&quot;tag&quot;]::after {</li><li>content: url(http://www.technorati.com/favicon.ico);</li><li>}</li></ol>















<ul><li>&ldquo;These make use of the attribute selector for space separated lists















of values. Any a element with a relationship containing those values















will be matched. Links with the nofollow relationship will be followed















by a dark red skull and crossbones (?) and those with the tag















relationship will be followed by the Technocrati icon.&rdquo; [<a href="http://lachy.id.au/log/2005/04/handy-css">Handy CSS</a>]</li><li>You can mark external links automatically. Many people make use of the non-standard rel=&quot;external&quot;















relationship to indicate a link to an external site. However, adding















that to each and every link is time consuming and and unnecessary. This















style rule will place an north east arrow after any link on your site















to an external site. [<a href="http://lachy.id.au/log/2005/04/handy-css">Handy CSS</a>]</li></ul>















<ol><li>a[href^=&quot;http://&quot;]:not([href*=&quot;smashingmagazine.com&quot;])::after {</li><li>content: &quot;\2197&quot;;</li><li>}</li></ol>















<ul><li><strong>利用 outline: none;</strong>来去除链接产生的虚点框. 这一点对导航条很有用 <a href="http://sonspring.com/journal/removing-dotted-links">remove dotted links</a> </li></ul>















<ol><li>a:focus {</li><li>outline: none;</li><li>}</li></ol>















<h3>2.4. 技术窍门: CSS-技术</h3>















<ul><li><strong>付给&lt;body&gt; 标记一个 ID.</strong> &ldquo;大多数情况下, 给body 放置一个 ID , 可以逐页控制CSS, 而不必要不断更换模板&rdquo; [<a href="http://www.72dpiintheshade.com/2007/01/16/top-10-css-tips-from-a-professional-css-architect/">Ryan Parr</a>, <a href="http://alistapart.com/articles/bodyswitchers">Invasion of Body Switchers</a>]</li><li><strong>用CSS创建相同高度的列.</strong> <a href="http://www.positioniseverything.net/articles/onetruelayout/equalheight">Equal Height Technique</a>: a method to make all columns appear to be the same height. But without the need for faux column style background images. <a href="http://www.alistapart.com/articles/fauxcolumns/">Faux Columns</a>: with background images.</li><li><strong>用 CSS做垂直布局.</strong> &ldquo;假设你有一个导航菜单高度是2em. 解决方案: 在CSS中把线高设定成和显示模块一样的高度.在这个案例中,字符可以在显示模块中间浮动. &rdquo; [<a href="http://evolt.org/article/rdf/17/60369/">Evolt.org</a>]</li><li><strong>使用伪元素 pseudo-elements 和类 classes 创建动态内容.</strong> <a href="http://www.456bereastreet.com/archive/200510/css_21_selectors_part_3/">Pseudo-classes and pseudo-elements</a>.















Pseudo-classes and pseudo-elements can be used to format elements based















on information that is not available in the document tree. For example,















there is no element that refers to the first line of a paragraph or the















first letter of an element&rsquo;s text content. You can use :first-child,















:hover, :active, :focus, :first-line, :first-letter, :before, :after















and more.</li><li><strong>通过设置 &lt;hr&gt; 分割的更漂亮.</strong> &ldquo;把水平分割线 (&lt;hr&gt;) 用图形代替可以增加页面的美观性. [<a href="http://www.richardkmiller.com/blog/archives/2006/08/css-best-practices">CSS: Best Practices</a>]</li><li><strong>在每个页面使用相同的导航条 (X)HTML-编码.</strong>















&ldquo;许多网站都想强化导航条, 但你需要在每个页面优化导航条代码, 我们如何把两者完美的处理好呢?&rdquo; [<a href="http://www.sitepoint.com/article/top-ten-css-tricks">Ten More CSS Tricks you may not know</a>]</li></ul>















<ol><li>XHTML:</li><li>&lt;ul&gt;</li><li>&lt;li&gt;&lt;a href=&quot;#&quot; class=&quot;home&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;</li><li>&lt;li&gt;&lt;a href=&quot;#&quot; class=&quot;about&quot;&gt;About us&lt;/a&gt;&lt;/li&gt;</li><li>&lt;li&gt;&lt;a href=&quot;#&quot; class=&quot;contact&quot;&gt;Contact us&lt;/a&gt;&lt;/li&gt;</li><li>&lt;/ul&gt;</li></ol>















<ul><li>Insert an id into the &lt;body&gt; tag.















The id should be representative of where users are in the site and















should change when users move to a different site section.</li></ul>















<ol><li>CSS:</li><li>#home .home, #about .about, #contact .contact</li><li>{</li><li>commands for highlighted navigation go here</li><li>}</li></ol>















<ul><li><strong>布局中,使用&quot; margin: 0 auto;&quot; 水平居中.</strong> &ldquo;利用 CSS来水平居中一个元素, 你需要设定这个元素的宽度,和水平间距就可以做到.&rdquo; [<a href="http://www.smashingmagazine.com/category/css/www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_2/">Roger Johansson</a>]</li></ul>















<ol><li>XHTML:</li><li>&lt;div id=&quot;wrap&quot;&gt;</li><li>&lt;!-- Your layout goes here --&gt;</li><li>&lt;/div&gt;</li></ol>















<ol><li>CSS:</li><li>#wrap {</li><li>width:760px; /* Change this to the width of your layout */</li><li>margin:0 auto;</li><li>}</li></ol>















<ul><li><strong>给 RSS-feeds附加样式.</strong> &ldquo;用 XSL stylesheet (turn links into clickable links,















etc)格式化, CSS让非技术人员更能接受. [<a href="http://www.petefreitag.com/item/208.cfm">Pete Freitag</a>]</li></ul>















<ol><li>&lt;?xml version=&quot;1.0&quot; ?&gt;</li><li>&lt;?xml-stylesheet type=&quot;text/css&quot; href=&quot;http://you.com/rss.css&quot; ?&gt;</li><li>...</li></ol>















<ul><li><strong>在老的浏览器中隐藏CSS .</strong> &ldquo;最基本的办法就是利用@import 方法,解决隐藏问题.&quot; &nbsp; [<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">Roger Johansson</a>]</li></ul>















<ol><li>@import &quot;main.css&quot;;</li></ol>















<ul><li><strong>在块级的元素定义中, 必须声明外间距和内间距Always declare margin and padding in block-level elements.</strong> [<a href="http://christopher-scott.org/blog/10-css-tips-you-might-not-have-known-about">10 CSS Tips</a>]</li><li><strong>要么设定宽度, 要么设定内间距和外间距</strong> &ldquo;我的一个重要原则是, 如果我设定了宽度,就不必要设定间距, 同理, 如果设定了间距, 就不必要设定宽度. 在盒状显示模块中, 特别你你用百分比处理的情况下, 我才用设定容器宽度, 里面的元素使用间距设定, 这样一切就会变得游刃有余. &rdquo; [<a href="http://snook.ca/archives/html_and_css/top_css_tips/">Jonathan Snook</a>]</li><li><strong>避免使用内间距/边框 和固定的宽度同时定义一个元素.</strong>















&ldquo;IE5 会让这样的定义出错, 一切变得一团糟. 为修订宽度的错误, 在父对象中设置内间距,取代子元素固定宽度的方法. [<a href="http://www.mezzoblue.com/css/cribsheet/">CSS Crib Sheet</a>]</li><li><strong>提供打印样式.</strong> </li></ul>















<ol><li>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;print.css&quot; media=&quot;print&quot;&gt;</li><li><strong>or</strong></li><li><strong>&lt;style type=&rdquo;text/css&rdquo; media=&rdquo;print&rdquo;&gt; @import url(print.css); &lt;/style&gt;</strong></li></ol>















<ul><li>This ensures that the CSS will only apply to printed output and not















affect how the page looks on screen. With your new printed stylesheet















you can ensure you have solid black text on a white background and















remove extraneous features to maximise readability. <a href="http://www.smashingmagazine.com/2007/02/21/printing-the-web-solutions-and-techniques/">More about CSS-based print-Layouts</a>. [<a href="http://www.netmag.co.uk/zine/design-tutorials/20-pro-tips">20 pro tips</a>]</li></ul>















<h3>2.5. 技术窍门: IE 改进</h3>















<ul><li><strong>强制 IE 透明化处理 PNG图像.</strong>















&ldquo;理论上, PNG 文件支持不同的透明度;















但是. 一个Explorer 6 缺陷让这种方法很难跨浏览器使用&rdquo; [<a href="http://blog.outer-court.com/archive/2007-03-30-n51.html">CSS Tips, Outer-Court.com</a>]</li></ul>















<ol><li>#regular_logo</li><li>{</li><li>background:url('test.png'); width:150px; height:55px;</li><li>}</li><li>/* \ */</li><li>* html #regular_logo</li><li>{</li><li>background:none;</li><li>float:left;</li><li>width:150px;</li><li>filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png', sizingMethod='scale');</li><li>}</li><li>/* */</li></ol>















<ul><li><strong>在IE中可以定义最小宽度min-width和最大宽度 max-width .</strong> 你可以用微软的动态表达式解决这个问题. [<a href="http://www.sitepoint.com/article/top-ten-css-tricks">Ten More CSS Trick you may not know</a>]</li></ul>















<ol><li>#container</li><li>{</li><li>min-width: 600px;</li><li>max-width: 1200px;</li><li>width:expression(document.body.clientWidth &lt; 600? &quot;600px&quot; : document.body.clientWidth &gt; 1200? &quot;1200px&quot; : &quot;auto&quot;);</li><li>}</li></ol>















<ul><li><strong>在IE中使用条件说明</strong> &ldquo;在IE/WIN中,最安全的方式是使用条件说明 <a href="http://msdn.microsoft.com/workshop/author/dhtml/overview/ccomment_ovw.asp">conditional comments</a>. 这比使用修正点更有效. 利用这种方法, 可以让IE 使用自己的样式, &rdquo; [<a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_2/">Roger Johansson</a>]</li></ul>















<ol><li>&lt;!--[if IE]&gt;</li><li>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie.css&quot; /&gt;</li><li>&lt;![endif]--&gt;</li></ol>















<h3>Workflow: 获得灵感</h3>















<ul><li><strong>玩转 CSS.</strong> &ldquo;玩. 用背景图玩. 用浮动玩.&rdquo; [<a href="http://chunkysoup.net/article/12/AbusingMargins">Play with positive and negative margins</a>. 充分利用继承性和瀑性去玩. [<a href="http://placenamehere.com/article/156/TenSimpleCSSTips">Chric Casciano</a>]</li><li><strong>多学习别人的经验</strong> 努力学习哪些大网站的经验.<br />















[<a href="http://www.netmag.co.uk/zine/design-tutorials/20-pro-tips">20 pro tips</a>]</li></ul>















<h3>参考和推荐内容:</h3>















<ul><li><a href="http://www.456bereastreet.com/archive/200503/css_tips_and_tricks_part_1/">CSS Tips and Tricks</a> by <em>Roger Johansson</em></li><li><a href="http://blog.jm3.net/2007/03/16/the-only-ten-things-to-know-about-css/">(The Only) Ten Things To Know About CSS</a> by <em>John Manoogian</em></li><li><a href="http://www.mezzoblue.com/archives/2003/11/19/css_crib_she/">CSS Crib Sheet</a> by <em>Dave Shea</em></li><li><a href="http://www.sitepoint.com/article/top-ten-css-tricks">My Top Ten CSS Tricks [CSS Tutorials]</a> by <em>Trenton Moss</em></li><li><a href="http://blog.outer-court.com/archive/2007-03-30-n51.html">CSS Tips</a> by <em>Philipp Lenssen</em></li><li><a href="http://www.snook.ca/archives/html_and_css/top_css_tips/">Top CSS Tips</a> by <em>Jonathan Snook</em></li><li><a href="http://tantek.com/log/2004/09.html#d07t1434">Ten CSS tricks &mdash; corrected and improved</a> by <em>Tantek &Ccedil;elik</em></li><li><a href="http://www.webcredible.co.uk/user-friendly-resources/css/more-css-tricks.shtml">Ten More CSS Trick you may now know</a> by <em>Trenton Moss</em></li><li><a href="http://www.christianmontoya.com/2007/02/01/css-techniques-i-use-all-the-time/">CSS techniques I use all the time</a> by <em>Christian Montoya</em></li><li><a href="http://www.stopdesign.com/log/2005/05/03/css-tip-flags.html">CSS Tip Flags</a> by <em>Douglas Bowman</em></li><li><a href="http://businesslogs.com/design_and_usability/my_5_css_tips.php">My 5 CSS Tips</a> by <em>Mike Rundle</em></li><li><a href="http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/">5 Steps to CSS Heaven</a> by <em>Ping Mag</em></li><li><a href="http://lachy.id.au/log/2005/04/handy-css">Handy CSS</a> by <em>Lachlan Hunt</em></li><li><a href="http://erraticwisdom.com/2006/01/18/5-tips-for-organizing-your-css">Erratic Wisdom: 5 Tips for Organizing Your CSS</a> by <em>Thame Fadial</em></li><li><a href="http://www.seomoz.org/blog/css-properties-you-probably-never-use">15 CSS Properties You Probably Never Use (but perhaps should)</a> by <em>SeoMoz</em></li><li><a href="http://christopher-scott.org/blog/10-css-tips-you-might-not-have-known-about">10 CSS Tips You Might Not Have Known About</a> by <em>Christopher Scott</em></li><li><a href="http://www.alistapart.com/articles/12lessonsCSSandstandards">A List Apart: Articles: 12 Lessons for Those Afraid of CSS and Standards</a> by <em>Ben Henick</em></li><li><a href="http://www.dkeithrobinson.com/entry/tips_for_a_better_design_review_process/">Tips for a better design review process</a> by <em>D. Keith Robinson</em></li><li><a href="http://www.netmag.co.uk/zine/design-tutorials/20-pro-tips">20 pro tips - .net magazine</a> by <em>Jason Arber</em></li><li><a href="http://www.richardkmiller.com/blog/archives/2006/08/css-best-practices">CSS Best Practices</a> by <em>Richard K Miller</em></li><li><a href="http://www.search-this.com/2007/03/26/10-quick-tips-for-an-easier-css-life/">10 Quick Tips for an Easier CSS Life</a> by <em>Paul Ob</em></li><li><a href="http://www.72dpiintheshade.com/2007/01/16/top-10-css-tips-from-a-professional-css-architect/">10 CSS Tips from a Professional CSS Front-End Architect</a> by <em>72 DPI in the shade team blog</em></li><li><a href="http://www.d.umn.edu/itss/support/Training/Online/webdesign/css.html#tips">Web Design References: Cascading Style Sheets</a> by <em>Laura Carlson</em></li><li><a href="http://www.communitymx.com/content/article.cfm?cid=FAF76&amp;print=true">Getting Into Good Coding Habits</a> by <em>Adrian Senior</em></li></ul></div></span></h4>
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/168148#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 05 Mar 2008 14:57:11 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/168148</link>
        <guid>http://harry.javaeye.com/blog/168148</guid>
      </item>
          <item>
        <title>使用一个servlet来分配所有的gwt service</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/149465" style="color:red;">http://harry.javaeye.com/blog/149465</a>&nbsp;
          发表时间: 2007年12月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          GWT中默认一个service对应一个servlet，这样会使web.xml要配置很多servlet, 不是很方便。我这里通过一个Dispatch servlet来分配service, 这样每个service都成了pojo，使得配置更加方便，也容易测试。<br /><br />1. Server code<br /><br />Configure web.xml like<br /><br />       &lt;servlet><br />                &lt;servlet-name>gwt-dispatch&lt;/servlet-name><br />                &lt;servlet-class><br />                        com.xxxxx.gwt.GwtRpcServiceDispatch<br />                &lt;/servlet-class><br />                &lt;init-param><br />                        &lt;param-name>prefix&lt;/param-name><br />                        &lt;param-value>/gsvc&lt;/param-value><br />                &lt;/init-param><br />        &lt;/servlet><br />        &lt;servlet-mapping><br />                &lt;servlet-name>gwt-dispatch&lt;/servlet-name><br />                &lt;url-pattern>/gsvc/*&lt;/url-pattern><br />        &lt;/servlet-mapping><br /><br />prefix参数表示service访问url的根路径<br /><br />Why it works: Let's see the code of GwtRpcServiceDispatch.java<br />   1 /**<br />   2  * @author xwang<br />   3  * Dispatch the gwt services<br />   4  */<br />   5 public class GwtRpcServiceDispatch extends RemoteServiceServlet {<br />   6     private static final long serialVersionUID = -2797202947611240618L;<br />   7 <br />   8     private Injector injector;<br />   9 <br />  10     private int beginIndexOfClassName;<br />  11 <br />  12     @Override<br />  13     public void init(ServletConfig config) throws ServletException {<br />  14         super.init(config);<br />  15         // get guice injector, it init by ServletContextListener<br />  16         injector = InjectorHolder.getInjector();<br />  17         if (injector == null) {<br />  18             throw new UnavailableException("Guice Injector not found (did you forget to register a "<br />  19                     + this.getClass().getSimpleName() + "?)");<br />  20         }<br />  21 <br />  22         // set prefix of service url<br />  23         String prefix = config.getInitParameter("prefix");<br />  24         if (prefix == null || prefix.length() == 0) {<br />  25             beginIndexOfClassName = 1;<br />  26         } else if (prefix.startsWith("/")) {<br />  27             beginIndexOfClassName = prefix.length() + 1;<br />  28         } else {<br />  29             beginIndexOfClassName = prefix.length() + 2;<br />  30         }<br />  31     }<br /><br />这里先要设置Guice Injector， 应为我们的service中用到了guice. 其次设置prefix的长度.<br /><br />接着就可以根据URL来实例化RomteService，如下：<br /><br />   1 /**<br />   2      * get service implement class's instance<br />   3      * @return service implement class's instance<br />   4      */<br />   5     protected Object getCurrentHandler() {<br />   6         String classPath = getThreadLocalRequest().getRequestURI();<br />   7         // /gsvc/com/xxxxx/bus/domain/service/LandmarkService => com.xxxxx.bus.domain.service.LandmarkService<br />   8         String className = classPath.substring(beginIndexOfClassName);<br />   9         if (className.endsWith("/")) {<br />  10             className = className.substring(0, className.length() - 1);<br />  11         }<br />  12         className = className.replaceAll("/", ".");<br />  13 <br />  14         Class&lt;?> clazz = null;<br />  15         try {<br />  16             clazz = Class.forName(className);<br />  17         } catch (ClassNotFoundException e) {<br />  18             e.printStackTrace();<br />  19             throw new IllegalStateException(e.getMessage());<br />  20         }<br />  21 <br />  22         return injector.getInstance(clazz);<br />  23     }<br /><br />当然我们需要重新定义RemoteServiceServlet的主处理方法：<br /><br />   1     // this is the main method of RemoteServiceServlet to process request<br />   2     @Override<br />   3     public String processCall(String payload) throws SerializationException {<br />   4         Object serviceHandler = getCurrentHandler(); //get instance of RemoteService<br />   5 <br />   6         try {<br />   7             RPCRequest rpcRequest = RPC.decodeRequest(payload, serviceHandler.getClass(), this);<br />   8             return RPC.invokeAndEncodeResponse(serviceHandler, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest<br />   9                     .getSerializationPolicy());<br />  10         } catch (IncompatibleRemoteServiceException ex) {<br />  11             getServletContext().log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex);<br />  12             return RPC.encodeResponseForFailure(null, ex);<br />  13         }<br />  14     }<br /><br />还要重新定义support方法：<br /><br />   1     // RemoteServiceServlet use this judge the instance<br />   2     public boolean supports(Object handler) {<br />   3         return handler instanceof RemoteService;<br />   4     }<br /><br />现在我们的RemoteService就成为了一个pojo如：<br /><br />   1 public interface LandmarkService extends RemoteService {<br />   2 ...........<br />   3 }<br />   4 <br />   5 public class LandmarkServiceImpl implements LandmarkService {<br />   6 ...........<br />   7 }<br /><br />2. Client code<br /><br />gwt client这边需要用<br /><br />   1 ServiceHelper.registerServiceEntryPoint(instance);<br /><br />获取访问URL.<br /><br />why it works:<br />   1      /**<br />   2      * register service url<br />   3      * @param svcObj service object<br />   4      * com.xxxxx.bus.domain.service.LandmarkService => /gsvc/com/xxxxx/bus/domain/service/LandmarkService<br />   5      */<br />   6     public static void registerServiceEntryPoint(Object svcObj) {<br />   7         ServiceDefTarget endpoint = (ServiceDefTarget) svcObj;<br />   8         String endpointText = GWT.getTypeName(svcObj);<br />   9         endpointText = endpointText.substring(0, endpointText.indexOf("_Proxy"));<br />  10         endpointText = endpointText.replace('.', '/');<br />  11         endpoint.setServiceEntryPoint("/gsvc/" + endpointText);<br />  12     }<br /><br />GWT.getTypeName can get the class name of service object<br /><br />你可以使用如下代码的方式构造你的service<br />   1 public interface LandmarkService extends RemoteService {<br />   2     public static class Initer {<br />   3         private static LandmarkServiceAsync instance;<br />   4         public static LandmarkServiceAsync getInstance(){<br />   5             if (instance == null) {<br />   6                 instance = (LandmarkServiceAsync) GWT.create(LandmarkService.class);<br />   7                 ServiceHelper.registerServiceEntryPoint(instance);<br />   8             }<br />   9             <br />  10             return instance;<br />  11         }<br />  12     }<br />  13 ........
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/149465#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Dec 2007 16:30:23 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/149465</link>
        <guid>http://harry.javaeye.com/blog/149465</guid>
      </item>
          <item>
        <title>读《谈“80后”程序员为什么找不到工作？》感想：少一分拒绝，多一份理解</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/138868" style="color:red;">http://harry.javaeye.com/blog/138868</a>&nbsp;
          发表时间: 2007年11月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p>虽然不是很喜欢csdn上的新闻风格，不过偶偶还是会去瞧瞧的，毕竟上面好的翻译过来的文章还是有的。</p>
<p>今天看到一篇<font face="Arial">《谈&ldquo;80后&rdquo;程序员为什么找不到工作？》：</font></p>
<p>所谓&ldquo;80后&rdquo;，是指22~27岁之间、受过高等教育、刚刚毕业走向社会或者拥有几年工作经验年轻的一代。</p>
<p>我也是呀，刚毕业开始工作，碰巧也算个程序员，向来不愤青的我，禁不住想愤青一回。首先我承认文章里说的80后的种种缺点，确实有存在，但是否存在普遍现象，我就无从得知了。(BTW: 文章的作者应该是阅&ldquo;80后&rdquo;无数吧。)</p>
<p>简单的概括文章所属80后的缺点就是 浮躁 两字。可是80后一代成长的社会环境呢，变化大，各种价值观并存，总体来说就是一个浮躁的社会，谁也说不清谁对谁错。浮躁的社会出浮躁的人不是很符合社会规律嘛？</p>
<p>总算也是个大学生，带着父母的期待来到学校，却发现高教园里满大街都是大学生，自信荡然无存。软件工程不是新兴专业，怎么学的人一大堆，能在其中成为佼佼者吗？不仅后怕起来。</p>
<p>进学校之前听到的都是对学校的赞美之辞，进来后听到的都是骂学校的脏话，黑暗的就业率。</p>
<p>疯狂自信也好、超级自卑也好，其实是迷茫。不管是不是80后，这个年纪都会迷茫吧，80后是不是特别严重？那我就不知道啦，去问问那个阅人无数的人吧？不知道如何才算是实现自我价值，一辈子迷茫.......你实现了吗？</p>
<p>社会责任，更是可笑，几条所谓的基本方法就想解救芸芸众生，no way!</p>
<p>你们公司的社会责任呢，难道公司没有吸收，引导应届生的责任吗？同志！80后不需要这些废话，他们需要的是前辈创造出来的良好的氛围，优秀的榜样，有吗？我们还要模仿别人多久？</p>
<p>最后，我始终相信80后将为中国的软件行业创造更好的环境，至少比现在更好，因为我们就是未来。</p>
<p>希望以后能看到有文章中记录着：某公司吸收了多少多少应届生，在某伯乐引导下为公司创造了多少多少的财富，这样的情景。教教我们什么是社会责任吧，求你们了<img alt="" src="/javascripts/fckeditor/editor/images/smiley/msn/devil_smile.gif" /></p>
</blockquote>
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/138868#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Nov 2007 21:26:03 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/138868</link>
        <guid>http://harry.javaeye.com/blog/138868</guid>
      </item>
          <item>
        <title>会导致你创业失败的18个因素[转]</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/130186" style="color:red;">http://harry.javaeye.com/blog/130186</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在最近的一次演讲中，有人问我，哪些错误会导致创业失败。站在那里愣了几秒后，我意识到，这是一个很难回答的问题。它等于是在问：一个初创公司如何才能成功。如果你能避免所有导致失败的错误，那么你自然就会成功。这个问题太大了，很难在那样短的时间里回答清楚。<br />
<br />
后 来我又认识到，这个问题如果从另一个角度看，也许是有意义的。假如你有一个清单，列出了所有你不应该做的事情，那么只需要把这个清单取反，你就得到了一张 成功的处方。而在实际应用中，这样的清单会更有价值。查觉你正在做不应该做的事情，总比一直记着你应该做的事情更容易些。[1]<br />
<br />
从某种意 义上说，导致创业失败的错误只有一个：没人需要你做的东西。如果你在做的东西是用户需要的，那么你应该能够生存下去，其它的问题都无关紧要。但如果你在做 的东西不符合用户的需求，那么你死定了，任何事都改变不了这个结局。所以，这个清单里列出的18个错误，实际上是导致初创公司不能满足用户所需的因子。几 乎所有失败的原因，都可以归结到这里面来。<br />
<br />
<strong>1 孤家寡人 （Single Founder）<br />
<br />
</strong>不知你是否注意到，极少有成功的初创公司是由一个人创办的？一些你可能会以为是单一创始人的公司，比如说甲骨文（Oracle），实际上是由多个人一起创办的。这似乎不是一个巧合。<br />
<br />
单一创始人有什么问题呢？最起码，这反映了一种信心的缺乏。隐含的信息是，创始人无法说服他的任何一个朋友跟他一起打天下。这很值得玩味：别忘了，他的朋友是最了解他的人。<br />
<br />
就算朋友们都错了，公司实际上可能很有前途；但是，单一创始人的不利仍然是很明显的。一个人创业实在太难了。就算你无所不能，你也需要同伴们来集思广益，避免愚蠢的举动，以及在遇到挫折时互相鼓励。<br />
<br />
最重要的一点是，创业的过程中你可能遇到难以承受的低点。当你有多个创始伙伴时，彼此信念上的支撑就好比捆成了一捆的箭。每个人都暗暗给自己打气：&ldquo;我绝不能让我的朋友们失望。&rdquo;这是一个人最强大的动力之一。而单一的创始人则缺少了这一动力。<br />
<strong><br />
2 缺少地利 （Bad Location）</strong><br />
<br />
并 不是所有的地方都适合创业的。硅谷是创业的最佳地点，波士顿其次，再其次是西雅图、奥斯汀、丹佛和纽约。除此之外，几乎没有什么其它的选择了。就算在纽 约，初创公司的密度也已经降到了硅谷的二十分之一左右。而在像休斯敦、芝加哥和底特律这样的地方，创业的可能性几乎可以忽略不计。<br />
<br />
为什么会有这么大的差别呢？其实，其它的业界也有类似的情况。全美第六大的时装中心在哪儿？第六大的石油，金融，出版中心又分别是哪里？不管答案是什么，可以肯定，这些中心的规模要远远小于榜首的规模。<br />
<br />
为 什么某些城市会成为初创公司的聚集地呢？这个问题很有意思。我想答案与在其它业界得出的结论类似：因为那里聚集了大批的专业人士。那里的专业水准较高；人 们对你所做的东西更容易产生共鸣；你能更容易地找到你想要雇用的人；周边工业也较发达；你有更多的机会碰上跟你在一个领域内的人；等等，等等。天知道这些 综合因素是怎样促成了初创公司在硅谷的繁荣，又是怎样让底特律这样的城市黯然失色。不过，数字能够说明一切：在硅谷的初创公司密度远远超出了在底特律得到 的数字。<br />
<br />
<strong>3 领域偏狭 （Marginal Niche）</strong><br />
<br />
在向 Y Combinator 申请风投的团队里，大多数都犯了一个共同的错误：为了避免竞争而刻意选取那些很狭隘、很冷僻的领域。<br />
<br />
如果你看过孩子们打棒球的话，你会发现，在某个年龄段以下的孩子会有些怕球。面对来球，他们的本能反应是躲避。我在八岁的时候当过外野手，不过没有接到过多少球，因为每次球朝我飞来的时候，我总是闭上眼睛，举起手套来保护自己，而不是去力争接到球。<br />
<br />
一个初创公司，如果净是挑选那些偏狭的项目来做的话，就跟我在八岁时对付来球的策略一样。要知道，如果你能够有所成就的话，就必然会有竞争者，早晚都要面对。所以说，如果你不想竞争的话，那么你想出来的点子好不到哪儿去。<br />
<br />
我想，这种遇到大的困难就退缩的举动，往往是人们在潜意识下作出的。这跟你有一个很大的构想但却决定追求一个较小的较稳妥的目标不同，因为你在潜意识里就拒绝大的构想。解决这一问题的办法是假装你在为别人而不是为自己做策划。想想看，有什么好的主意适合某人去进行创业呢？<br />
<br />
<strong>4 拾人牙慧 （Derivative Idea）</strong><br />
<br />
我们收到的许多申请都是在效仿一些已经存在的公司。现有的公司的确能够给你一些想法，但绝对不是最好的。如果你回顾一下那些成功的初创公司，很少是从模仿别人起家的。他们的灵感来自哪儿呢？通常是由创始人发现了一些尚未解决的特定问题。<br />
<br />
我 们自己的初创公司的业务是编写软件，使之能够生成在线商店的网站。当初我们是独此一家；少数几家支持在线交易的网站都是由互联网的专业设计人员手工编写 的，成本很高。我们认识到，一旦在线购物红火起来的话，这些网站必然是要由软件来生成的，所以我们就写了这样一个软件。这个想法的起源很直接，如此而已。<br />
<br />
那 些对你个人产生影响的问题应该是最好的问题。苹果（Apple）的诞生是因为斯蒂夫&middot;沃兹尼亚克（Steve Wozniak）需要一台电脑；谷歌（Google）则是由于拉瑞（Larry）和谢尔盖（Sergey）在网上找不到他们想要的东西；而 Hotmail 是因为沙比尔&middot;巴蒂亚（Sabeer Bhatia）和杰克&middot;史密斯（Jack Smith）无法在工作中互发电子邮件。<br />
<br />
所以，不要去照搬 Facebook，在上面做些零敲碎打的工作；你应该到别的方向上去发掘灵感。也不要受已有的公司的影响，去炒他们的冷饭；你应该去找寻未解决的问题，然后设想一下什么样的公司能够解决那些问题。[2] 你需要弄清楚，人们在抱怨什么以及期待什么？<br />
<br />
<strong>5 固执己见 （Obstinacy）</strong><br />
<br />
在某些领域里，成功的途径需要你认准了想做的事情并坚持到底，不管遇到多大的挫折。而创业则另当别论。如果你是想要赢得一块奥林匹克金牌的话，那么你应该咬定目标，决不放弃；因为你的目标十分明确。但是，创业更像是从事科学研究，你更应该遵循自然规律而不是主观臆断。<br />
<br />
你应该避免过于坚持原来的计划，因为它可能是错误的。大多数成功的初创公司，最后做的都不是他们刚开始企图做的&mdash;&mdash;而且差别往往很大，以至于你很难把他们同最初的公司联系起来。在创业的过程中，你应该准备好接受任何更好的主意；而最难做到的就是放弃你已有的想法。<br />
<br />
当 然，这里也有一个度的问题。每周都换一个想法显然也不可能成功。有什么标准能够帮助你做决定吗？一个办法就是衡量那些新的想法是否代表了某种进展。如果你 能够利用大部分你所做过的东西，那么你可能是在一个螺旋式上升的过程中；反之，如果你需要从头开始的话，那就不是一个好兆头。<br />
<br />
幸运的是，你可以向你的用户寻求建议。如果你转向一个新方向，而用户又对此反响热烈的话，那么你很可能押对宝了。<br />
<br />
<strong>6 遇人不淑 （Hiring Bad Programmers）</strong><br />
<br />
在早先的清单里我忘了列上这一条了，因为我所碰到的创始人大多是程序员。对于他们来说，这不是什么大问题。就算他们偶尔雇用了一两个差劲的程序员，也不至于天就塌下来了。紧要关头，他们都可以亲自操刀上阵，力挽狂澜。<br />
<br />
不 过，当我回溯90年代那些倒闭的电子商务初创公司时，却发现正是差劲的程序员毁了那些公司。很多公司都是由商业领域的人员创办的。他们以为初创公司就是有 个好的点子，然后雇用一批程序员来实现它。这真是想得容易做的难。这些商业领域的人员根本就无法区分程序员的好坏。他们甚至接触不到最好的程序员，因为没 有哪个程序高手愿意去实现一个商人的构想。<br />
<br />
事实是，这些人招募了一些他们以为是好的程序员（至少这些程序员的简历是这样吹嘘的，什么微软 认证的开发人员了，等等），但实际上却难副其实。接下来他们就会很困惑地发现，自己的公司就像老牛拉破车一样吱嘎吱嘎，而竞争对手们却跟坐了火箭一样。这 种初创公司具有那些大公司的所有缺点，却没有那些大公司所具备的优势。<br />
<br />
如果你本人不是程序员的话，怎样才能挑选好的程序员呢？我不认为有什么好办法。我本来想说，你可以找个程序高手来帮你做这件事儿。但问题是，你怎么找到这个最初的程序高手呢？<br />
<br />
<strong>7 开发平台选取不当 （Choosing the Wrong Platform）</strong><br />
<br />
同 上面一条相关的问题是开发平台选取不当（通常差劲儿的程序员都会犯这个错误）。我认为，在经济泡沫时期，很多初创公司都因为在 Windows 的平台上构建基于服务器的应用而身陷泥沼。Hotmail 在被微软收购若干年之后仍然运行在 FreeBSD （译者：一个 Unix 平台）上，估计是因为 Windows 无法胜任其负荷。假如 Hotmail 的创始人选择了 Windows 的话，他们很可能早就失败了。<br />
<br />
PayPal 刚刚躲过了一劫。在同某个ｄｏｔｃｏｍ合并后（译者：这里应该是指 ｅＢａｙ，不知道作者同 ｅＢａｙ 有什么过节？:)），新的CEO 想要转到 Windows 上&mdash;&mdash;尽管 PayPal 的联合创始人马克斯&middot;莱文奇恩（Max Levchin）向他展示过他们的软件系统在 Windows 上的处理能力只有在 Unix 上的百分之一。幸运的是，最终他们换了 CEO，而不是操作系统平台。<br />
<br />
平台是一个很模糊的词。它既可以指操作系统，也可以指编程语言，或者是编程语言之上的框架结构。它所隐含的意义，既包含了支持，也包含了限制，就如同房子的地基一样。<br />
<br />
你 不得不慎而又慎地选择平台。有些平台，对外行来说，似乎是很好的、很负责的选择，就象90年代的 Windows 一样；一旦你选了他们，就无异于自掘坟墓。Java applets 大概是最典型的例子了。它曾经被人们认为是发布应用的新途径。结果却是，100个对此深信不疑的初创公司里，就有100个被毁掉了。<br />
<br />
怎样选取正确的平台呢？通常的办法是招些好的程序员来让他们选择。如果你自己不是程序员的话，也有一个小窍门：到顶尖的计算机系里参观一下，看看他们在科研项目里都使用什么。<br />
<br />
<strong>8 发布迟缓 （Slowness in Launching）</strong><br />
<br />
所有的公司，不论大小，在完成软件之前都会有一段困难时期。从某种意义上说，这是一种固有的特性；软件的完成度永远都是在85%左右。你需要有极大的毅力来推动软件的完成并向用户发布。[3]<br />
<br />
初创公司总是用各种各样的借口来为推迟发布辩解。这些借口跟人们在日常生活中为自己的迟到所找的理由大同小异：总是有一些事儿要在这之前办好。也许吧。不过假如你的软件已经全部完成，按个按钮就可以发布的话，你还会等吗？<br />
<br />
尽快发布的一个目的就是迫使你完成应该完成的工作。一个软件，只要还没有发布，就不算真正完成。不管你认为这个软件已经如何完善了，在临发布之即，总还是有一大堆的事儿要做；这种情形已经司空见惯了。发布的另一个目的就是，只有通过用户反馈，你才能真正明白要做什么。<br />
<br />
有一些问题，同发布延迟是有联系的：工作节奏太慢，没有真正搞清楚问题，惧怕同用户打交道，害怕别人的评论，分心过多，过于完美，等等。解决这些问题，只需要推动自己尽快发布一些东西就可以了。<br />
<br />
<strong>9 发布过早 （Launching Too Early）</strong><br />
<br />
发布过早的情况比发布迟缓要少见得多，不过并不是没有。发布过早的危险是有可能毁掉了你的名誉。早期的使用者在试用了你发布的东西后，如果发现什么不满意的地方，他们可能就不会再来了。<br />
<br />
如果你想发布一样产品的话，最低要求是什么呢？我们建议初创公司认真考虑自己想要做的是什么，确定其核心内容；这些核心内容既要本身就能够有用处，又要能够作为基础，在此之上逐渐地拓展成一个完整的项目。一旦确定了这些，就应该尽可能快地完成它们。<br />
<br />
我和很多其他的程序员就是按照这一办法来编写软件的。思考一下总的目标，然后动手编写一些有用的最小模块。这些模块早晚是要写的，所以不用担心作无用功。在大多数情况下你会发现，实现这些模块既能够在精神上获得鼓舞，又能够帮助你对余下的部分看得更清楚。<br />
<br />
其实，你需要打动的那些早期的试用者们是很宽容的。他们并不期待一个新发布的产品无所不能；但是，多少它应该有点儿用处。<br />
<br />
<strong>10 没有明确的目标用户 （Having No Specific User in Mind）</strong><br />
<br />
如果你不了解用户，就不可能作出他们喜欢的东西。在前面我曾经提到过，大多数成功的初创公司，都是从解决创始人遇到的问题开始的。这里面有这样一条规则：你所创造的财富是跟你对问题的理解程度成正比的；而你最了解的就是你自己的问题。[4]<br />
<br />
这条理论反过来说就是：如果你试图解决一个你不懂的问题，那无异于往自己的脖子上套绞索。<br />
<br />
但 是还是有很多创始人，喜欢假定存在某些用户愿意用他们的产品，至于这些用户会是谁，他们也不很清楚。那些创始人需要这些产品吗？不，他们不能算是目标市 场。那么会是谁呢？年轻人？对本地活动感兴趣的人？还是商业领域的用户？什么样的商业领域？加油站？电影制片厂？还是军工采购商？<br />
<br />
你当然可以为与你不同类型的用户打造产品。我们就曾这么做过。问题是，你必须认识到你踏入了一个危险地带。这就好比你在借助仪表在飞行：你自己的直觉将帮不上任何忙。因此你的每一步操作都必须小心谨慎，并且要经常查看你的仪表。<br />
<br />
这种情况下，用户就是你的仪表。你必须遵循&ldquo;从实践中来&rdquo;的原则。任何主观猜测都是不允许的；你必须接触用户并考察他们的反应。所以，当你为别人而不是你自己设计产品的时候，你必须去说服一些特定的用户来使用你的产品；如果你做不到这一点的话，那么失败是必然的。<br />
<br />
<strong>11 筹集的资金太少 （Raising Too Little Money）</strong><br />
<br />
大多数成功的初创公司到某一阶段都会接受投资。这就跟要有多个创始人一样，从统计上来说，是一个保靠的举措。那么，你应该接受多少投资呢?<br />
<br />
初创公司的资金是用时间来衡量的。每个还没有盈利的初创公司（几乎所有的初创公司在刚开始时都不可能盈利）在钱花光之前都会有一段时间。这段时间有时候被喻为&ldquo;跑道&rdquo;（runway）。这是一个很好的比喻，它在提醒你，当你钱花光的时候，要么起飞，要么撞毁。<br />
<br />
太少的钱意味着你没有足够的跑道起飞。当然，起飞的概念也需要视情况而定。通常你需要更上层楼：从仅仅有个想法和正在实现的原型；到有了原型，正在发布；到已经发布了产品，正处于显著的增长期。这也要看投资者的想法，毕竟他们是你在实现盈利前要说服的人。<br />
<br />
如 果你是从投资人那里接受资金的话，那么数量至少应该能够支撑你到下一个阶段。[5] 幸运的是，你对下一个阶段是什么以及需要花费多少都有所控制。我们建议初创公司在刚开始的时候把这两项指标都设得低一些：基本上不花什么钱，以及把初期目 标定为构造一个坚实的原型。这样做会给你最大的灵活性。<br />
<br />
<strong>12 花销无度 （Spending Too Much）</strong><br />
<br />
有时候很难把花销无度和筹集的资金太少区分开来。如果钱不够用了，你既可以说是开销太多，也可以说是筹集的资金太少。区分这两条的唯一办法是跟别的初创公司做个比较。如果你筹集了五百万的资金却还是不够用，那么原因就很可能是花销无度。<br />
<br />
现在那些乱花钱的烧包们要比以前少多了。创业者们似乎已经学到了教训；再加上创业越来越便宜。所以在写这篇文章的时候，我并没有发现几个初创公司是在烧钱。我们投资的公司里一个都没有。（不仅仅是因为我们的投资都比较小，也因为许多公司都进行了多轮筹资。）<br />
<br />
最 经典的烧钱方式是雇用一大批人。这么做会对你造成双重伤害：既增加了成本，又减慢了速度。所以说，钱花得越快，你就得想办法让它撑下去的时间越长。许多软 件大师们都懂得这一道理；弗雷德&middot;布鲁克斯（Fred Brooks）在他的《人月神话》（The Mythical Man-Month）中作过详细的解说。<br />
<br />
对于招人，我们有三条基本的建议：（a） 能免则免；（b） 用股份代替工资，这样做不仅仅省钱，更重要的是，你希望你的人是愿意把自己的利益同公司的利益挂钩的人；（c）招的人应该仅限于两类，或者写代码，或者出去拉客户，因为刚开始的时候，你只需要做这两件事情。<br />
<br />
<strong>13 筹集的资金太多 （Raising Too Much Money）</strong><br />
<br />
筹集的资金太少显然是不行的，那么太多的资金是不是也有问题呢？<br />
<br />
是， 也不是。关键不在于钱的本身，而在于随之而来的问题。一个风投曾经说过，&ldquo;一旦你从我这拿了几百万的资金，那么计时就开始了。&rdquo;风投们给你投资，并不是让 你把钱放在银行里然后整天泡碗面；他们希望钱用在工作上。[6] 最起码，你也要有一个像样的办公室，以及一些工作人员。而这会改变你的工作氛围&mdash;&mdash;并不一定是朝有利的方向。现在，你的大多数人马都是你的雇员了，而不是 合伙创始人。他们不可能像你那样投入；他们需要有人来告诉他们做些什么；更糟的是，有人会开始玩起办公室里的那些猫腻。<br />
<br />
当你筹集了很多钱的时候，你的公司就会搬到繁华地段，并且开始拖家带口。<br />
<br />
而 更危险的是，一旦你拿到了一大笔钱，那么你就会尝到船大难掉头的滋味。假设你最初的计划是向公司们出售某种产品。从风投那儿拿到钱后，你雇用了一些销售人 员来做这事儿。后来你发现，应该把力量投入到消费者身上而不是那些商业公司。销售方式会有根本的不同。这时候，你怎么办？在实际当中，你甚至可能根本认识 不到这点。招的人越多，你就越倾向于沿着既定的方向而不做改变。<br />
<br />
争取大笔投资的另一个缺陷就是耗时太长。你能筹到的钱跟你所花的时间是成 正比的。[7] 当投资达到上百万时，投资者会变得相当谨慎。风投们从来不会明确地说是或不是；他们会没完没了地约你谈话。因此，从风投那里筹集一笔相当规模的资金是一件 很花时间的事情&mdash;&mdash;可能比你创业所需的时间还长。当你的竞争者们争分夺秒于开发产品的时候，我想你不会愿意把你的时间都花在投资人身上。<br />
<br />
我 们建议那些寻求风投的创业者一旦遇到合适的协议就接受它。如果你能够从一个有信誉的基金那里拿到一笔基本合理的钱，并且没有什么不合情理的条条框框的话， 那么成交好了；然后投入到建设你的公司里去。[8] 就算你能够从别的地方拿到多三成的钱，又怎么样呢？创业是一个要么赚得盆满钵满，要么输得精光的游戏。为了一点点小利而在投资者间四处游走无疑是在浪费时 间。<br />
<br />
<strong>14 受制于投资者 （Poor Investor Management）</strong><br />
<br />
作为公司的创始人，你应该掌握公司的投资者。你不应该忽略他们，因为他们可能提供有见地的建议。但你绝不能把公司运作交到他们手上；那应该是你的职责。如果投资者对于运作其所投资的公司有足够的见地的话，那他们干吗不自己创立一个公司呢？<br />
<br />
由 于忽略投资者而惹恼他们的后果，要比向他们缴械投降的后果轻得多。我们创业的时候，曾经错误地忽略了投资者。结果，跟投资者的争吵牵扯了我们的很多精力。 不过，这也要好过投降许多，那样的话，公司可能就完了。一个知道自己在做什么的创始人，就算只花一半的精力在产品上，也比什么都不懂的投资者花上全部的精 力要强。<br />
<br />
掌握投资者所花的工夫通常取决于你从他们那里拿了多少钱。如果你筹集的资金有相当规模，那么投资者也相应的得到了相当规模的控制 权。如果他们在董事会里占了大多数，那么他们就是你名义上的老板。更常见的情形是，创始人和投资者的权重相等，决定性的投票来自于外部的中立董事。这时 候，投资人只需要说服那些中立董事，就获得了公司的控制权。<br />
<br />
如果一切都很顺利的话，那么这也无所谓。只要你的进展看上去很迅速，大多数的 投资者不会插手你的事情。问题是，对于一个初创公司来说，不可能指望一帆风顺。就算那些非常成功的公司，都曾经被投资者找过很大的麻烦。最有名的一个例子 就是苹果。它的董事会曾犯过一个致命的错误：解雇了斯蒂夫&middot;乔布斯（Steve Jobs）。（译者：1985年，因为权力斗争，Steve 被赶出了苹果电脑；1996年，随着他的NeXT公司被苹果收购，他又回到苹果，并在1997年重掌大权。请参见 <a href="http://zh.wikipedia.org/wiki/%E5%8F%B2%E8%92%82%E5%A4%AB%C2%B7%E4%B9%94%E5%B8%83%E6%96%AF">wikipedia 词条<img alt="" src="http://i.ixnp.com/images/v2.23.0.3/t.gif" style="border-width: 0px; margin: 0px; padding: 1px 0px 0px; background-position: -630px 0px; display: inline; font-weight: normal; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v2.23.0.3/theme/green/palette.gif); visibility: visible; width: 14px; line-height: normal; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms',arial,helvetica,sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none;" id="snap_com_shot_link_icon" class="snap_preview_icon" /></a>。）即使是 Google，早期跟投资者也有过很不愉快的经历。<br />
<br />
<strong>15 为（不存在的）利润而牺牲用户 （Sacrificing Users to (Supposed) Profit）</strong><br />
<br />
我 在一开始的时候就说过，如果你做的东西是用户需要的，那么应该没什么问题。你可能注意到，我没有提及任何关于正确的商业模式的事情。这并不是说赚钱并不重 要。我并不建议创业者们搞那些更本就没有希望赚钱的公司，然后希冀着在倒闭前把公司卖掉。我们告诉创业者们不要担心商业模式的最初原因是觉得搞出一个人们 需要的东西要比这难得多。<br />
<br />
我并不清楚这件事儿为什么这么难。看起来应该是一件很直截了当的事情。不过，只有为数不多的初创公司做到了这一点。从这儿你就可以看出这件事儿有多难。<br />
<br />
正 是因为做出一个人们需要的东西要比赚钱难得多，所以你应该稍后再考虑商业模式的问题，就好比你把一些琐碎而麻烦的功能留给第二版一样。在第一版里，解决那 些最核心的问题。对于初创公司来说，最核心的问题就是怎样来创造财富（=人们在多大程度上需要你的产品*需要你的产品的人数），而不是怎样把财富转变为钞 票。<br />
<br />
能够获胜的都是那些用户至上的公司。以 Google 为例，他们先是开发了搜索引擎，然后才考虑怎么赚钱。总有一些初创公司的创始人认为，不在一开始就考虑商业模式是不负责任的举动。这些创始人通常是被那些思想僵化的投资者所蛊惑。<br />
<br />
如果说不考虑商业模式是不负责任的举措，那么不考虑产品本身的不负责任性要十倍于此。<br />
<br />
<strong>16 自命清高 （Not Wanting to Get Your Hands Dirty）</strong><br />
<br />
几乎所有的程序员都更愿意把时间花在写代码上而另找人去处理商业上与钱有关的龌龊事儿。这并不是因为懒。Larry 和 Sergey 在刚开始的时候显然也是这么认为的。在开发了新的搜索算法后，他们所作的第一个尝试就是找一家公司买下它。<br />
<br />
创办一个公司？算了吧。大多数的程序大师们更满足于仅仅有个点子。不过，正如 Larry 和 Sergey 所发现的，点子是没有什么市场的。没人会去相信一个点子，除非你把它用在你的产品里，并以此获得用户。这样人们才会给你更多的关注。<br />
<br />
也 许这一点会有所改变，不过我很怀疑。对收购者来说，没有比用户更具说服力的东西了。这不仅仅是因为风险降低了；要知道，收购者们都是人，他们很难把几百万 的美金砸到一堆年轻人身上，就为了他们机灵。当点子被一个公司实现并且拥有很多用户时，投资者们可以安慰自己，他们买的是用户，而不是看不见摸不到的机 灵。这对于他们来说更容易接受些。[9]<br />
<br />
如果你想要吸引用户的话，你可能不得不离开你的计算机，到外面去寻找一些用户。这的确不是一项愉 快的工作；不过，如果你能够做下来的话，那么成功的几率就大大增加了。2005年夏天，在我们资助的第一批初创公司里，绝大多数的创始人都埋头于编写他们 的应用程序。只有一个创始人，花了一半的时间去同手机公司的执行长官们交谈，以敲定一些买卖。对于一个程序员来说，你能想出比这更痛苦的事情吗？[10] 不过，他的付出是有回报的：那家初创公司看起来是那一批里最成功的，他们获得了一大笔订单。<br />
<br />
如果你要创办一家公司的话，就必须面对一个事实：你不可能只是坐在那里写程序。至少你们当中的一位需要花费一定的时间在商业上面。<br />
<br />
<strong>17 内部争斗 （Fights Between Founders）</strong><br />
<br />
创始人之间的争斗出乎意料地普遍。我们资助的初创公司中，大约20%的公司都有创始人退出的现象。这种频繁发生的事情让我们更加倾向于股权授让（vesting）。尽管不是必须条件，我们还是建议创始人们授让股权，这样，中途有人退出的话，也不会造成什么混乱。<br />
<br />
一个创始人的离开并不会毁了公司。许多成功的初创公司都有过类似的情形。[11] 幸运的是，离开的通常都是投入最少的。<br />
假如有三个创始人，其中一个不是很积极的退出了，没什么大不了的。如果有两个创始人，其中的一个走了；又或者离开的那个具备关键技术，那么就可能会有麻烦。就算这样也还不至于天塌下来。Blogger 曾经走得只剩了一个人，但最后又振作了起来。<br />
<br />
如 果创始人们能够更加谨慎地选择他们的创业伙伴，那么大多数的争吵都可以避免。多数的争吵并不是因事而起，而是因人而起。也就是说，是早晚会发生的。而大多 数因为争吵而一怒离开的创始人，可能从一开始就信心不足，只不过被掩饰起来了。不要掩饰你的疑虑。在公司成立前把问题解决掉要容易许多。所以，不要因为怕 疏远你的同屋而拉他入伙；也不要因为某人有某种用得上的技能就一起开公司，而不管你喜不喜欢他。一个初创公司，最重要的因素就是人，所以不要在这上面有什 么将就。<br />
<br />
<strong>18 不能够全时投入 （A Half-Hearted Effort）</strong><br />
<br />
你 所听说过的失败的初创公司，都是一些很特殊的例子。他们实际上是失败者中的佼佼者。最通常的失败者并不是因为犯了这些很特殊的错误，而是因为没有做什么事 儿&mdash;&mdash;我们从未听说过这些失败者；他们往往是两三个人，在工作之余，玩儿上一把；从未取得过什么真正的进展，渐渐地也就放弃了。<br />
<br />
从统计上 说，如果想要避免失败的话，一个很重要的事情就是辞掉你的日常工作。绝大多数失败的初创公司，其创始人都属于业余性质；而那些成功的初创公司，创始人都是 全副身家扑在了上面。假如把初创公司的失败比作是疾病的话，疾病控制中心就会贴出一张告示，警告大家辞掉日常工作。<br />
<br />
这是不是说，你必须辞掉你的日常工作呢？也不一定。我在这里胡乱猜测一下。我想那些还没有辞掉工作的创始人，大多缺少一种创办公司所必需的决心；他们的意识深处是知道这一点的。他们之所以不敢投入更多的时间是因为他们知道，这不是一个好的投资。[12]<br />
<br />
我还猜测，有相当多的人，如果能够迈出这一步而全时去做的话，是能够成功的，可惜的是，他们没有这样做。我不知道这样的人有多少，不过，如果把 成功者/骑墙者/毫无希望者 做个分布的话，那些如果辞掉工作就可能成功的人，要比那些现实中的成功者多出一个数量级。[13]<br />
<br />
如果这是真的话，那么大多数有可能成功的初创公司最终失败的原因都是其创始人不能够全心全意地投入在上面。这跟我所得出的结论也是一致的。绝大多数的初创公司之所以失败，是因为他们做不出用户需要的东西；而之所以做不出来，是因为他们的努力不够。<br />
<br />
换句话说，创业跟做其它事情一样。你可能犯的最大错误就是不够努力。如果有什么成功的秘诀的话，就是不要否认这一点。<br />
<br />
<br />
<br />
<strong>注释</strong><br />
<br />
[1] 这个清单并没有列出所有的原因，只列出了那些你能够掌控的因素。有些事情是你没法控制的，比如说，能力不足或是运气不好。<br />
<br />
[2] 好笑的是，从 Facebook 衍化出来的一个可行的点子，就是针对那些非在校学生的 Facebook。<br />
<br />
[3] Steve Jobs 曾试图用&ldquo;Real artists ship&rdquo;来鼓动人们。这是一个很漂亮的句子，可惜并不代表事实。艺术里面的很多著名作品都未完成。对于有明确期限的领域来说，比如建筑和制片，这句话可 能是对的。不过就算在这些领域里，人们也总是能拖就拖。<br />
<br />
[4] 这里也许还有另一个因素：初创公司的创始人们一般都站在技术的最前沿，他们所面临的问题往往具有很特殊的价值。<br />
<br />
[5] 你所筹集的资金，应该比你认为所需要的要多，大概多50%到100%吧。因为编写软件所花的时间往往比你估计的要长很多。<br />
<br />
[6] 人们有时候会把我们也叫作风投，我这里要声明一下，我们并不算风投。风投的手笔很大，而且花的是别人的钱；而我们花的是自己的钱，数量也很小，更像是天使投资。<br />
<br />
[7] 当然并不是线性的，不然你永远也筹不到五百万美金。不过在实际操作中，你会觉得真的是没个尽头似的。<br />
<br />
就算你把风投不可能投资的情况也考虑进去的话，对于一般情况来说，你也会觉得费时太长。而追求大的投资的危险不仅仅在于花费的时间很长，更严重的是，你可能花了时间却拿不到一分钱。<br />
<br />
[8] 有些风投会故意压低你的价值来试探你有没有胆量去要求更多。这是一个俗不可耐的游戏，不过的确有些风投在玩儿。如果你在同这样的风投打交道，那么应该在估价上进行一番讨价还价。<br />
<br />
[9] 假如 YouTube 的创始人在2005年跑到 Google 说，&ldquo;你们的视频设计太差了。给我们一千万的话，我们就指出你们犯的所有错误。&rdquo;那他们肯定会受到嘲笑。可是18个月后，为了买这一课，Google 支付了16个亿。也许部分原因是因为 Google 可以安慰自己：我们是在买一种新事物，一个社区，或是类似的某个模糊概念。<br />
<br />
我并不是挑剔 Google。他们已经领先于他们的竞争者了。那些竞争者可能已经错过了视频这班船。<br />
<br />
[10] 事实上是有的：就是跟政府打交道。不过电话公司会很高兴。<br />
<br />
[11] 这种情况比人们看到的要多得多，因为公司们从来不会宣扬这种家丑。你知道苹果最初有三个创始人吗？<br />
<br />
[12] 我并不是瞧不起这些人。我自己也缺少这种果断。在 Viaweb 之后，我曾经有两次都很接近于开办一个公司，但每次都打了退堂鼓。因为我意识到，缺少了生存危机，我很难承受创业的那份紧迫感。<br />
<br />
[13] 那么你怎么知道你属于哪类人呢？是那些应该辞掉工作的人？还是更大多数的平平稳稳过日子的人？我得说，单凭你自己是很难作判断的。你必须寻求外部的建议。 我们自认自己是投资者，不过从另一个角度看的话，Y Combinator 是一项建议人们辞掉或是不要辞掉工作的服务。我们可能会犯错误，而且是经常犯，但至少，我们是根据我们自己的结论来押宝的。
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/130186#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Oct 2007 16:59:57 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/130186</link>
        <guid>http://harry.javaeye.com/blog/130186</guid>
      </item>
          <item>
        <title>[摘]什么是scgi</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/106423" style="color:red;">http://harry.javaeye.com/blog/106423</a>&nbsp;
          发表时间: 2007年07月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          SCGI与FastCGI相似，也是CGI的一个替代协议，但是与FastCGI相比，SCGI更容易实现。<br />
<br />
<h3><span class="mw-headline">Specification</span></h3>
<p>The client connects to a SCGI server over a reliable stream protocol allowing transmission of 8-bit bytes. The client begins by sending a request. See below for the format of the request. When the SCGI server sees the end of the request it sends back a response and closes the connection. The format of the response is not specified by this protocol.</p>
<p><a name="Request_Format" id="Request_Format"></a></p>
<h3><span class="editsection"></span><span class="mw-headline">Request Format</span></h3>
<p>A request consists of a number of headers and a body. The format of the headers is:</p>
<pre>        headers ::= header*<br />        header ::= name NUL value NUL<br />        name ::= notnull+                <br />        value ::= notnull+<br />        notnull ::= &lt;01&gt; | &lt;02&gt; | &lt;03&gt; | ... | <ff><br />        NUL = &lt;00&gt;<br /></ff></pre>
<p>Duplicate names are not allowed in the headers. The first header must have the name &quot;CONTENT_LENGTH&quot; and a value that is a nonempty sequence of ASCII digits giving the length of the body in decimal. The &quot;CONTENT_LENGTH&quot; header must always be present, even if its value is &quot;0&quot;. There must also always be a header with the name &quot;SCGI&quot; and a value of &quot;1&quot;. In order to facilitate the transition from CGI, standard CGI environment variables should be provided as SCGI headers.</p>
<p>The headers are sent encoded as a netstring. The body is sent following the headers and its length is specified by the &quot;CONTENT_LENGTH&quot; header.</p>
<p><a name="Example" id="Example"></a></p>
<h3><span class="editsection"></span><span class="mw-headline">Example</span></h3>
<p>The web server (a SCGI client) opens a connection and sends the concatenation of the following strings:</p>
<pre>        &quot;70:&quot;<br />            &quot;CONTENT_LENGTH&quot; &lt;00&gt; &quot;27&quot; &lt;00&gt;<br />            &quot;SCGI&quot; &lt;00&gt; &quot;1&quot; &lt;00&gt;<br />            &quot;REQUEST_METHOD&quot; &lt;00&gt; &quot;POST&quot; &lt;00&gt;<br />            &quot;REQUEST_URI&quot; &lt;00&gt; &quot;/deepthought&quot; &lt;00&gt;<br />        &quot;,&quot;<br />        &quot;What is the answer to life?&quot;<br /></pre>
<p>The SCGI server sends the following response:</p>
<pre>        &quot;Status: 200 OK&quot; &lt;0d 0a&gt;<br />        &quot;Content-Type: text/plain&quot; &lt;0d 0a&gt;<br />        &quot;&quot; &lt;0d 0a&gt;<br />        &quot;42&quot;<br /></pre>
<p>The SCGI server closes the connection.</p>
<br />
相关：什么是FastCGI<br />
1. FastCGI 像是一个常驻 (long-live) 型的 CGI，它可以一直执行着，只要激活后，不会每次都要花费时间去 fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 模式)。 <br />
2. FastCGI 可在任何平台上使用，Netscape Enterprise 及 IIS 都有 FastCGI 的模块可供使用，阿帕契 (Apache，以及利用 Apache 衍生出做的服务器) 上也有 mod_fastcgi 可用。 <br />
3. FastCGI 支持 C/C++，Ruby, Perl，Tcl，Java，Python 等程序语言。 <br />
4. FastCGI 的应用程序亦兼容于 CGI。即 FastCGI 的应用程序也可以当成 CGI 来执行。 <br />
5. 现有的 CGI 程序要改写成 FastCGI 非常简单，最少可能只需要多加入三行程序代码。 <br />
6. FastCGI 的侦错方式与 CGI 大同小异，只要带入程序所需的环境变量及参数，即可在命令列模式执行或侦错。 <br />
7. FastCGI 应用程序的写作方式与 CGI 类似，除了几项原则要特别注意外，FastCGI 的写作方式跟 CGI 几乎一样，与学习 Web Server API 比较起来， FastCGI 简单多了。 <br />
8. FastCGI 支授分布式运算 (distributed computing)，即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/106423#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Jul 2007 15:38:54 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/106423</link>
        <guid>http://harry.javaeye.com/blog/106423</guid>
      </item>
          <item>
        <title>[转]人工智能方面的成功案例特点</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/100194" style="color:red;">http://harry.javaeye.com/blog/100194</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>著名工业分析家Esther Dyson曾说过，人工智能方面某些最为成功的应用的特点是：人工智能如葡萄干撒布在一块葡萄干面包内那样的应用：葡萄干并不占多大的地方，但却提供了主要的营养源。</p>
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/100194#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jul 2007 21:18:00 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/100194</link>
        <guid>http://harry.javaeye.com/blog/100194</guid>
      </item>
          <item>
        <title>openlaszlo简介</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/73167" style="color:red;">http://harry.javaeye.com/blog/73167</a>&nbsp;
          发表时间: 2007年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">
<p>openlaszlo（开源拉兹罗）是一个新兴开源RIA架构，尽管他不如现在的Ajax那么火爆，也不如Flex那么</p>
<p>根正苗红，但是他的独特之处是别的开发平台所不具备的。具体特性，整理如下：</p>
<p>&nbsp;&nbsp; * 多种运行时目标选择，不只是swf，而且还有dhtml，将来会考虑在移动设备等其他硬件上运行</p>
<p>laslzo应用。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 现在正在进行swf9及dhtml的研究，具体细节见这个地方记录：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><a href="http://wiki.openlaszlo.org/Legals_Project">http://wiki.openlaszlo.org/Legals_Project</a>。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 该公司已经宣布支持dhtml的高级ajax应用：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><a href="http://www.laszlosystems.com/company/press/press_releases/pr_mar_06.php">http://www.laszlosystems.com/company/press/press_releases/pr_mar_06.php</a><br />
&nbsp;&nbsp;&nbsp;&nbsp; 而且其图片搜索demo程序（LZXPIX）也可以看到了：<br />
&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.openlaszlo.org/">http://www.openlaszlo.org</a><br />
&nbsp;&nbsp;&nbsp;&nbsp; 但是可以看出还是在起步阶段，性能上还是不如用flash的。</p>
<p>&nbsp;&nbsp; * 独特的语法结构：真正的面向对象和基于组件的编程模型<br />
&nbsp;&nbsp;&nbsp;&nbsp; 相比Flex的组件及actionscript来说，构建lzx组件更为容易；相比javascript来说lzx语法是面向</p>
<p>对象的，而且可视的和不可视的元素及类库更为丰富。</p>
<p>&nbsp;&nbsp; * 部署方式灵活：可以在普通的servlet容器中运行，也可以脱离容器，直接部署一个swf应用程序</p>
<p>&nbsp;&nbsp; * 脱离基于页面思维的编程思想：lzx不是一个个的页面，而是一个整体的应用程序，这个跟jsp页面</p>
<p>、mxml页面截然不同。</p>
<p>&nbsp;&nbsp; * 强大的绑定功能：视图绑定和数据绑定<br />
&nbsp;&nbsp;&nbsp;&nbsp; 绑定功能让界面开发变得容易，方便，是laszlo的精华所在。</p>
<p>&nbsp;&nbsp; 其他特性见官方的文档记录：<br />
&nbsp;&nbsp; 概略：<a href="http://www.openlaszlo.org/overview">http://www.openlaszlo.org/overview</a><br />
&nbsp;&nbsp; 平台架构：<a href="http://www.openlaszlo.org/architecture">http://www.openlaszlo.org/architecture</a><br />
&nbsp;&nbsp; 高级Ajax应用（LZXPIX）：<a href="http://www.openlaszlo.org/advancedajax">http://www.openlaszlo.org/advancedajax</a><br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 该公司CTO兼创始人David Temkin 对Ajax的看法（mp3语音材料）：<br />
&nbsp;&nbsp; <a href="http://www.cio.com/podcasts/weekinreview.html">http://www.cio.com/podcasts/weekinreview.html</a><br />
&nbsp;&nbsp; 中的Open AJAX Consortium Looks to Ease Development，他认为ajax还是处于起步阶段，还有很多</p>
<p>改进的地方。</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/73167#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Apr 2007 10:15:11 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/73167</link>
        <guid>http://harry.javaeye.com/blog/73167</guid>
      </item>
          <item>
        <title>[转]企业的存在，是要解决现实问题</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/72490" style="color:red;">http://harry.javaeye.com/blog/72490</a>&nbsp;
          发表时间: 2007年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial" size="2">只有很清晰地知道，自己的存在，自己企业的存在，是要解决什么样的现实问题，能够使多少人因此受益，并且有准备、坚定、有方法地去完成的，才能够得到真正志同道合的贤者的帮助，社会资源的注入。才能够持续得到祝福和发展。</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://harry.javaeye.com/blog/72490#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Apr 2007 15:15:23 +0800</pubDate>
        <link>http://harry.javaeye.com/blog/72490</link>
        <guid>http://harry.javaeye.com/blog/72490</guid>
      </item>
          <item>
        <title>[转]商业软件编程很无聊？</title>
        <author>harry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harry.javaeye.com">harry</a>&nbsp;
                    链接：<a href="http://harry.javaeye.com/blog/72263" style="color:red;">http://harry.javaeye.com/blog/72263</a>&nbsp;
          发表时间: 2007年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>一篇是<a href="http://www.thoughtworks.com/">Thoughtworks</a>前员工Ravi Mohan写的，《<a href="http://ravimohan.blogspot.com/2006/07/but-martin-enterprise-software-is.html">但是</a><a href="http://ravimohan.blogspot.com/2006/07/but-martin-enterprise-software-is.html">马老大，商业编程就是无聊</a>》。Martin Fowler在<a href="http://martinfowler.com/bliki/CustomerAffinity.html">一篇帖子</a>里说，编写企业软件不光是捣腾数据。并不是只有解决算法问题，操纵硬件，和应用大量数学才有意思。关心顾客（马丁所谓的客户亲和力），全力让自己的软件为客户带来商业利益也是挑战所在，趣味所存。Ravi在帖子里不以为然，认为不管<a href="http://blog.csdn.net/mfowler/">Martin Fowler</a>怎么辩白，商业编程无趣是不争的事实。不信可以看看人心所向。从来只见有天赋的程序员屁颠屁颠地去开发编译器，操作系统，TCP/IP stack, 大规模并行系统，高性能服务器，游戏引擎等系统级软件。哪怕优秀的商业软件程序员也无限渴望去开发系统软件。相反，从来没见那个能靠系统开发软件挣钱的牛程无限向往开发商业软件。这好比柏林墙没倒前，只见东德人拼死冲到西德去，没见有什么西德人拼死要到东德去的（愤青们就不用和我争论东德怎么好了哈。Ravi自己的例子而已。东德好不好关我P事）。Ravi还说，哪怕<a href="http://www.thoughtworks.com/">Thoughtworks</a>内部员工也无限向往系统编程。每次Thoughtworks讨论把生意扩展到嵌入式编程和非其它非企业计算领域时，Thoughtworks的员工们都士气高涨。然后Ravi引了老愤青Paul Graham的话，<strong>号称集中精力攻克困难但定义清晰的问题完全是出于自我保护的需要，因为成天解决琐碎问题不能让人学到任何东西，只能让人变蠢</strong>。做系统编程给人的满足感比做琐碎的商业编程大多了。Ravi进一步谈到Martin Fowler其实也承认商业软件开发遇到的问题太过随意，很多都是为了满足客户莫名其妙的要求，不会带给程序员成长的机会。他尤其赞同Martin说的&ldquo;<strong>商业编程的真正挑战在于找到软件中能给客户的生意带来切实利益的东西。要做到这点，我们需要扎实的行业知识和技术功底。</strong>&rdquo;。可惜的是，大多数商业软件程序员处于尴尬的境地：论行业知识不如行业专家。论编程技术不如真正的hacker(黑客这个词已经等同于cracker了，所以我还是用原文)。当然，这种尴尬情况在其它编程领域也存在，但症状没有那么严重。搞笑的是，Ravi说其实Martin算是商业程序员里比较幸运的，总有机会和牛人们合作，找出他的代码到底有什么商业价值，而这和普通的&ldquo;编码人&rdquo;有本质区别。这也是为什么外包的工作如此无趣的原因：商业方面的分析已经定了。编码的框架已经定了。承接外包项目的程序员发挥余地实在有限，更不用说趣味二字了。作者的要点是，要想让自己的工作变得有趣有意义，要么就下大力气变成业务专家。要么就变成可以玩儿转系统的编程高手。其实系统编程高手也是业务专家。只不过他们的业务领域恰好和技术领域重合。</div>
<div>&nbsp;</div>
<div>第二篇帖子是<a href="http://weblog.raganwald.com/">Reg Braithwaite</a>的一篇帖子，<span>《<a href="http://weblog.raganwald.com/2006/09/business-programming-simply-isnt-that.html">商业编程没有那么难？》</a></span>。这篇帖子同时引了Reganwald另外一篇短文，<span>《<a href="http://weblog.raganwald.com/2006/05/how-to-make-programming-hard-for.html">怎么让编程变得困难》</a></span>。Reg在两篇文章里都谈到了同样的一个观点：商业编程从表面上看来都是广泛而肤浅的。程序员有大量问题要解决，但没有什么问题特别深刻。哪怕你用最新的技术都不足以让普通的商业编程变得更有意义。用Reg的话来说就是用Ruby On Rails编程好比聆听Jaco Pastorius，什么人都能干。只有在复制Jaco的盛宴时才能真正获取学习经验。还是以RoR为例。用RoR远远不够（其实不用也无所谓）。仔细研究RoR的代码，学习怎么设计自己的DSL才是正道。在<span>《商业编程没有那么难？》</span>里面，Reg举了三个例子。一个是从信用卡的使用情况实时判断被使用的信用卡是否被盗。一个是实时卡车调度问题，能针对路矿和递送要求优化卡车路线和发车时间表。还有一个是销售辅助系统，能学习潜在客户的特质，帮助销售决定是否跟进。嗯，两个模式识别和学习问题，一个调度和网络流优化问题。都是非常有挑战性的问题。都可以让一个普通的商业项目变得趣味十足（当然也能让我们的压力陡增）。当然，如果你对每月一张固定的工资单感到满意，知道自己的工作马上就要外包给西贡的大学生也能安然入睡，就不用自找麻烦了。作者的要点就是：挑战不是别人给的，而是在勃勃雄心驱使下，你自己找的。也许以后做每个项目时，我们应该给自己找点有挑战性的问题，激发自己的潜力。不然做的项目再多，也不过浪费人生。</div>
<div>&nbsp;</div>
<div>第三篇帖子是XML发明人<a href="http://www.tbray.org/ongoing/">Tim Bray</a>的一篇<span><a href="http://www.tbray.org/ongoing/When/200x/2006/09/11/Other-Languages">短文</a></span>。在Tim的<span><a href="http://www.tbray.org/ongoing/When/200x/2006/09/07/JRuby-guys">努力</a></span>下，JRuby的两个主程加入了Sun。新闻公布后Tim收到几乎所有JVM语言作者的询问，问为啥子Sun独选了JRuby那俩哥们，能不能给其它JVM语言也提供支持。于是Tim谈了JRuby受到重视的原因。首先，没人要求，没人给钱的情况下，这俩老大投入大量精力，运用各种技术把半死的JRuby项目盘活了。其次，JRuby背后有活跃的社区（大半因为Rails的风潮）。第三，他