﻿<?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-Tin's Blog</title><link>http://www.blogjava.net/iamtin/</link><description>You are coming a long way, baby~Thinking, feeling, memory...</description><language>zh-cn</language><lastBuildDate>Thu, 05 Mar 2026 17:51:31 GMT</lastBuildDate><pubDate>Thu, 05 Mar 2026 17:51:31 GMT</pubDate><ttl>60</ttl><item><title>我的Blog迁移</title><link>http://www.blogjava.net/iamtin/archive/2008/06/04/move_this_blog_to_zztin.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Wed, 04 Jun 2008 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2008/06/04/move_this_blog_to_zztin.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/205714.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2008/06/04/move_this_blog_to_zztin.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/205714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/205714.html</trackback:ping><description><![CDATA[自己申请域名把blog迁移了一下。因为内容也很少和Java相关，感兴趣的朋友轻修改一下订阅地址。
<div>Rss: http://feed.feedsky.com/iamtin</div>
<div>Blog: http://tin.zztin.com</div>
<img src ="http://www.blogjava.net/iamtin/aggbug/205714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2008-06-04 10:00 <a href="http://www.blogjava.net/iamtin/archive/2008/06/04/move_this_blog_to_zztin.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Re:架构考量-选择的难度</title><link>http://www.blogjava.net/iamtin/archive/2007/11/28/reply_architecture_debate_of_haokanbu.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Wed, 28 Nov 2007 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/11/28/reply_architecture_debate_of_haokanbu.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/163835.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/11/28/reply_architecture_debate_of_haokanbu.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/163835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/163835.html</trackback:ping><description><![CDATA[在中文网织年会上和啄木鸟老大HD讨论了一下好看簿的架构问题，而后老黄写了一个blog entry：<br />
<a title="架构考量-选择的难度" href="http://blog.opensource.org.cn/hdcola/2007/11/post-8.html">架构考量-选择的难度</a><br />
里面谈到了架构一个高支撑能力的Web 2.0应用需要考虑的架构选型问题，对我很有帮助。我也回复一下他的建议：<br />
<br />
非常不好意思，今天检查google reader才发现HD老大记录了这个谈话。而我都没有在blog里面记录这个事情。不过和HD老大的谈话回来我还是仔细消化了一下。关于交换机的事情我已经反思了，后来在切换服务器的时候的确发现了百兆和千兆的区别，rsync在百兆网络下的确造成了我们的切换宕计时间变长。当时我们停止服务15分钟，如果是千兆网络估计5分钟以内就可以了，所以如HD所说，我们也许应该选择HW的千兆。<br />
关于文件服务的问题，我想目前的关键还是需要看看是否有热点数据。不过对于网站来说，由于首页和离首页深度比较近的页面被访问的可能性要明显的高，所以如果使用squid做反向代理肯定可以减轻静态文件服务的压力。但是问题也在这里，一定要流量对静态文件有压力的时候再加Squid。<br />
其实本次切换的主要问题是将动态服务与静态服务分开。因为没有选择纯磁盘阵列用光纤或者iSCSI的方式挂在到动态服务器（因为原先的2950充当了文件服务器），所以为了不浪费计算资源我们将动态服务器（8G内存，Raid1和15k rpm硬盘）和静态服务器（8G内存，Raid5和750G X 6的7200 rpm硬盘）分开处理，这样动态服务器跑Django，静态服务器跑Lighttpd。他们之间只需要一个读写的通讯，因为是内部通讯，所以用http是没有意义的。用NFS可能是最直接的方法。用SAN或者iSCSI的方式其实也是可行的，前者是成本问题，而后者是浪费计算资源的问题，所以我们自然的按HD的意思上了NFSv4。<br />
然后又引出MogileFS的问题。其实这是个大文件存储的真谛问题。如果数据量达到一定程度，单个节点不可以承受的时候，那么我们只能选择数据分片，可以时髦的叫做shard，如google做的map reduce的GFS。或者干脆就自己写个简单的数据索引，然后路由分区一下，这个概念就是MogileFS。MogileFS就是利用多个有自己的计算资源的静态服务器来分区存储并管理它们的一个准分布式文件系统（因为MogileFS不支持随机访问，只是整存整取，所以说是准文件系统），它已经能解决我们Web 2.0应用的问题了，Flickr也是这么干的&#8230;&#8230;选用它或者自己做是个看起来和做起来都挺简单的问题，只是它比什么都不需要改变的NFS还是稍微麻烦一点。所以这个作为未来的一种被选方案。其实呼应一下HD在方案分析里面说的应付流量压力的目标，MogileFS只是用来解决存储压力的一个方式。<br />
关于FS，我最近也作了Research，发现这还真是一个坑呀，非常大的坑。XFS、JFS、nb的ZFS都是好方案，但是大文件系统还要考虑分区表格式，MBR已经成了限制，用GPT吧你还不好引导（因为如果你都是大硬盘的话，单弄一个小的上MBR引导，其它再分GPT，势必要浪费一块硬盘，非常不划算），然后LVM解决引导问题吧用起来还不踏实（毕竟它的条带化不是硬件的Raid那样可靠），然后你又需要去对比那几个FS，反正头大。最后还是硬着头皮上了XFS。<br />
我觉得架构考量就像HD所说的，你有无数选择，这些选择造成了噪音，然后在你四处碰壁的时候，你可能选择了第一个可以用的方案去实施。而实际上你会很快发现更好的方案&#8230;&#8230;架构的重构代价是可怕的&#8230;&#8230;所以有了更好的方案可能也不会实施，或者要很久以后再实施。所以，这个经验是需要年头的，也许，也许，很多的方案都让被实施者称为了学徒练手的冬瓜，脑袋上的伤口只有冬瓜自己知道。虽然我作为学徒&#8230;&#8230;看着也疼。我发誓，下次我一定做到更好！<br />
<br />
相关的好看簿故事，我把好看簿服务器升级的过程用照片故事的形式记录下来了，欢迎大家参观：<br />
<a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.haokanbu.com/story/2991/" target="_blank">http://www.haokanbu.com/story<wbr>/2991/</a><br />
<br />
还有关于中国网志2007的记录<br />
<a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.haokanbu.com/story/3022/" target="_blank">http://www.haokanbu.com/story<wbr>/3022/</a><br />
<br />
<img src ="http://www.blogjava.net/iamtin/aggbug/163835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-11-28 22:39 <a href="http://www.blogjava.net/iamtin/archive/2007/11/28/reply_architecture_debate_of_haokanbu.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何安装Siege并进行测试</title><link>http://www.blogjava.net/iamtin/archive/2007/10/24/how_to_use_siege.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Wed, 24 Oct 2007 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/10/24/how_to_use_siege.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/155580.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/10/24/how_to_use_siege.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/155580.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/155580.html</trackback:ping><description><![CDATA[<div id="searchable">
<p>如何安装Siege并进行测试 <br />
<br />
在CentOS 5上面的过程。其它系统安装方式略有不同参照它的官方网站。<br />
</p>
<h2 id="安装siege">安装siege</h2>
<pre class="wiki">yum -y install siege
</pre>
<h2 id="配置siege">配置siege</h2>
<p>运行一次siege，它会在你的~目录创建一个.siegerc。你可以在里面修改你需要的东西。里面有说明，可以自己修改。需要说明的是里面有一个benchmark的属性，为false。siege不同于ab在于测试并发的时候请求也有个随机延迟，这样比较接近实际效果。 </p>
<h2 id="运行siege">运行siege</h2>
<p>一般用法： </p>
<pre class="wiki">siege -c 100 -r 10 -f someScript.url
</pre>
<p>-c是并发量，-r是重复次数。 url文件就是一个文本，每行都是一个url，它会从里面随机访问的。 </p>
<p>类似ab的纯并发压力测试： </p>
<pre class="wiki">siege -c 100 -r 10 http://www.google.com</pre>
<p>手册在此，因为siege很早就有，命令语法也变了很多，要么直接man siege，要么就看官方手册： <a class="ext-link" href="http://www.joedog.org/Siege/Manual"><span class="icon">http://www.joedog.org/Siege/Manual</span></a> </p>
<p>== 关于sproxy === sproxy是用来录制siege脚本的代理工具。可是我没有在CentOS上调试成功，需要自己编译安装。好处是方便模拟post请求和cookie等，但是目前没有用到。 <a class="ext-link" href="http://www.joedog.org/Sproxy/Manual"><span class="icon">http://www.joedog.org/Sproxy/Manual</span></a> </p>
</div>
<img src ="http://www.blogjava.net/iamtin/aggbug/155580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-10-24 13:52 <a href="http://www.blogjava.net/iamtin/archive/2007/10/24/how_to_use_siege.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Twitter的性能调优的关键点</title><link>http://www.blogjava.net/iamtin/archive/2007/10/16/scaling_twitter_the_key_points.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Tue, 16 Oct 2007 00:42:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/10/16/scaling_twitter_the_key_points.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/153144.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/10/16/scaling_twitter_the_key_points.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/153144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/153144.html</trackback:ping><description><![CDATA[<p>Twitter的水平扩展的一些关键点，虽然它是个RoR应用，但是这些建议绝对是放之四海而皆准的，非常好的总结。<br />
因为年初Twitter曾经遇到了性能瓶颈，而且几乎束手无策。当初很多人开始怀疑Ruby的性能问题，而后Twitter站起来了 ^__^</p>
<p>有时间的朋友看看这个slide：<a href="http://www.slideshare.net/Blaine/scaling-twitter">http://www.slideshare.net/Blaine/scaling-twitter</a>，没有时间的看看我的摘要。<br />
<br />
开发：<br />
1、一定要测试！一定要早点测试！一定要早点测试！否则你就死定了。不要存任何侥幸心理，从项目的开始就写好测试。<br />
2、对任何部分都要测试。还是测试！<br />
3、性能测试要交给用户来做。那样才有意义。所以要做好log。用好分析工具：Munin（服务器内存占用监控）、Nagios（服务器服务网络状态监控）、AWStats &amp; Google Analytics、错误日志、发现了错误马上进入问题跟踪系统（Trac、Jira&#8230;&#8230;太多了，但是最好有一个）。</p>
<p><br />
架构：<br />
1、使用可以分区的架构。按照架构上的功能清晰的分区。这意味着你可以通过替换一个实现来改进性能，因为性能和复杂度往往是不可兼得的。</p>
<p>对于数据库：<br />
1、尽量不要分布式数据库，包括数据库分区。最好通过提高单台服务器的性能提升这个节点的性能。更重要的是查询优化。通过备份服务器解决单点故障。<br />
2、对where子句中的字段增加index。（这个当然了）<br />
3、扁平化查询，比如一个user有很多朋友，查一个人的朋友如果通过外键会浪费很多性能。可以把ids序列化为1,2,3这样，然后用like查询速度更快。<br />
4、一定要优化你的SQL，不要寄希望于ORM给你解决（不管是DataMapper、ActiveRecord或者UnitOfWork）。</p>
<p>Cache：<br />
1、一定要考虑Cache，最重要的是领域对象的Cache，一定要考虑Memcache，如Memcached。<br />
2、应该有90%的查询可以Cache。<br />
3、但是要注意Cache实效问题（要及时标注实效），这个是个难点也是个重点。<br />
4、可以考虑用Message来标记实效（这样可以保证异步，无阻塞的按照顺序的让数据失效），据称也不是很难。</p>
<p>Messaging：<br />
1、混合应用。不用去看Java的OpenFire了，即使它很好，完全可以考虑erlang的ejabberd了，俄罗斯的产物。<br />
2、排队问题有很多解决方案：ActiveMQ、RabbitMQ、MySQL + Lightweight Locking、Drb（for ruby）</p>
 <img src ="http://www.blogjava.net/iamtin/aggbug/153144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-10-16 08:42 <a href="http://www.blogjava.net/iamtin/archive/2007/10/16/scaling_twitter_the_key_points.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型Java Web项目的架构和部署调优问题</title><link>http://www.blogjava.net/iamtin/archive/2007/09/17/java_web_architecture_and_performance_turnning.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Mon, 17 Sep 2007 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/09/17/java_web_architecture_and_performance_turnning.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/146003.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/09/17/java_web_architecture_and_performance_turnning.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/146003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/146003.html</trackback:ping><description><![CDATA[<img height="44" alt="" src="http://www.infoq.com/styles/cn/i/logo.gif" width="140" border="0" /> 本文已经发表于InfoQ中文站，（<a href="http://www.infoq.com/cn/news/2007/09/java_web_architecture_turnning">大型Java Web项目的架构和部署问题</a>）<br />
<style>
blockquote {background:#eee;font-size:12px;}
</style>
<p>一位ID是jackson1225的网友在javaeye询问了<a title="一个大型Web系统的架构和部署选型问题" href="http://www.javaeye.com/topic/117564?page=1" target="_blank">一个大型Web系统的架构和部署选型问题</a>，希望能提高现有的基于Java的Web应用的服务能力。由于架构模式和部署调优一直是Java社区的热门话题，这个问题引发了很多热心网友的讨论，其中一些意见对其它大型Web项目也有很好的指导意义。在讨论之初jackson1225这样描述了当前的应用的架构和部署方案：</p>
<blockquote>
<p>目前系统架构如下:</p>
<ol>
    <li>web层采用struts+tomcat实现，整个系统采用20多台web服务器，其负载均衡采用硬件F5来实现；
    <li>中间层采用无状态会话Bean+DAO+helper类来实现，共3台weblogic服务器，部署有多个EJB，其负载均衡也采用F5来实现；
    <li>数据库层的操作是自己写的通用类实现的，两台ORACLE数据库服务器，分别存放用户信息和业务数据；一台SQL SERVER数据库，是第三方的业务数据信息； </li>
</ol>
<p>web层调用EJB远程接口来访问中间件层。web层首先通过一个XML配置文件中配置的EJB接口信息来调用相应的EJB远程接口；</p>
<p>该系统中一次操作涉及到两个ORACLE库以及一个SQL SERVER库的访问和操作，即有三个数据库连接，在一个事务中完成。</p>
</blockquote>
<p>这样的架构其实很多公司都在使用，因为Struts和Tomcat分别是最流行的Java Web MVC框架和Servlet容器，而F5公司的负载均衡是横向扩展常见的解决方案（例如配置session sticky方案）。由于这个系统中有跨数据源的事务，所以使用Weblogic Server EJB容器和支持两阶段提交的数据库驱动就可以保证跨数据源的事物完整性（当然，容器管理的分布式事务并非是唯一和最优的解决方案）。</p>
<p>但是随着Rod Johnson重量级的著作《J2EE Development without EJB》和其中的Spring框架的流行，轻量级框架和轻量级容器的概念已经深入人心。所以对于jackson1225提出的这个场景，大多数网友都提出了置疑，认为这个系统滥用了技术，完全是在浪费钱。网友们大都认为SLSB（无状态会话Bean）完全没有必要出现在这个场景中，认为SLSB通过远程接口访问本地资源会有很大的性能开销，这种观点也是Rod johnson在without EJB中批判EJB 2.x中的一大反模式。</p>
<p>由于JavaEE是一个以模式见长的解决方案，模式和架构在JavaEE中占有很重要的地位，所以很多业内专家也都警惕&#8220;反模式（Anti-patterns）&#8221;的出现。对于上面所述的方案是否是反模式，jackson1225马上站出来申辩：</p>
<blockquote>
<p>我们项目就是把EJB作为一个Facade，只是提供给WEB层调用的远程接口，而且只用了无状态会话Bean，所以性能上还可以的。</p>
</blockquote>
<p>这个解释很快得到了一些网友的认可，但是大家很快意识到架构的好坏决定于是否能够满足用户的需求，davexin（可能是jackson1225的同事）描述了这个系统的用户和并发情况：</p>
<blockquote>
<p>现在有用户4000万，马上要和另一个公司的会员系统合并，加起来一共有9000万用户。数据量单表中有一亿条以上的数据。这是基本的情况，其实我觉得现在的架构还是可以的，现在支持的并发大概5000并发用户左右，接下来会进行系统改造，目标支持1万个并发用户。</p>
</blockquote>
<p>具体的并发量公布后又有网友置疑这个数据，认为这个系统的Servlet容器支持的并发数太小，怀疑是否配置不够优化。davexin又补充了该项目的服务器配置：</p>
<blockquote>
<p>系统前端tomcat都是用的刀片，配置在2G内存，cpu大概在2.0G，每台机器也就支持250-400个并发，再多的话，就会相应时间非常的常，超过20秒，失去了意义 ，所以我们才得出这样的结论的。</p>
</blockquote>
<p>一位ID是cauherk的网友提出了比较中肯的意见，他没有从Web容器单纯的并发支持能力上提出改进方案，而是提出了对于类似的应用的<a title="一些通用的改进提示" href="http://www.javaeye.com/topic/117564?page=4#368432" target="_blank">一些通用的改进提示</a>，这里摘要一下：</p>
<blockquote>
<ol>
    <li>数据库压力问题
    <p>可以按照业务、区域等等特性对数据库进行配置，可以考虑分库、使用rac、分区、分表等等策略，确保数据库能正常的进行交易。</p>
    <li>事务问题
    <p>要在两个数据库中操作，那么必须考虑到分布式事务。你应该仔细的设计你的系统，来避免使用分布式事务，以避免分布式事务带来更多的数据库压力和其它问题。推荐你采用延迟提交的策略(并不保证数据的完整)，来避免分布式事务的问题，毕竟commit失败的几率很低。</p>
    <li>web的优化
    <p>将静态、图片独立使用不同的服务器，对于常态的静态文件，采用E-TAG或者客户端缓存， google很多就是这样干的。对于热点的功能，考虑使用完全装载到内存，保证绝对的响应速度，对于需要频繁访问的热点数据，采用集中缓存(多个可以采用负载均衡)，减轻数据库的压力。</p>
    <p>对于几乎除二进制文件，都应该在L4上配置基于硬件的压缩方案，减少网络的流量。提高用户使用的感知。</p>
    <li>网络问题
    <p>可以考虑采用镜像、多路网络接入、基于DNS的负载均衡。如果有足够的投资，可以采用CDN(内容分发网)，减轻你的服务器压力。</p>
    </li>
</ol>
</blockquote>
<p>cauherk的这个分析比较到位，其中ETags的方案是最近的一个热点，InfoQ的&#8220;<a title="使用ETags减少Web应用带宽和负载" href="http://www.infoq.com/cn/articles/etags" target="_blank">使用ETags减少Web应用带宽和负载</a>&#8221;里面对这种方案有很详细的介绍。一般以数据库为中心的Web应用的性能瓶颈都在数据库上，所以cauherk把数据库和事务问题放到了前两位来讨论。但是davexin解释在所讨论的这个项目中数据库并非瓶颈：</p>
<blockquote>
<p>我们的压力不在数据库层，在web层和F5。 当高峰的时候 ，F5也被点死了，就是每秒点击超过30万，web动态部分根本承受不了。根据我们程序记录，20台web最多承受5000个并发，如果再多，tomcat就不响应了。就像死了一样。</p>
</blockquote>
<p>这个回复让接下来的讨论都集中于Web容器的性能优化，但是<a title="JavaEye站长robbin发表了自己的意见" href="http://www.javaeye.com/topic/117564?page=5#369868" target="_blank">JavaEye站长robbin发表了自己的意见</a>，将话题引回了这个项目的架构本身：</p>
<blockquote>
<p><strong>performance tuning最重要的就是定位瓶颈在哪里，以及瓶颈是怎么产生的。</strong></p>
<p><strong>我的推测是瓶颈还是出在EJB远程方法调用上！</strong></p>
<p>tomcat上面的java应用要通过EJB远程方法调用，来访问weblogic上面的无状态SessionBean，这样的远程方法调用一般都在100ms~500ms级别，或者更多。而如果没有远程方法调用，即使大量采用spring的动态反射，一次完整的web请求处理在本地JVM内部的完成时间一般也不过20ms而已。一次web请求需要过长的执行时间，就会导致servlet线程被占用更多的时间，从而无法及时响应更多的后续请求。</p>
<p>如果这个推测是成立的话，那么我的建议就是既然你没有用到分布式事务，那么就干脆去掉EJB。weblogic也可以全部撤掉，业务层使用spring取代EJB，不要搞分布式架构，在每个tomcat实例上面部署一个完整的分层结构。</p>
<p>另外在高并发情况下，apache处理静态资源也很耗内存和CPU，可以考虑用轻量级web server如lighttpd/litespeed/nginx取代之。</p>
</blockquote>
<p>robbin的推断得到了网友们的支持，davexin也认同robbin的看法，但是他解释说<a title="公司认为放弃SLSB存在风险" href="http://www.javaeye.com/topic/117564?page=6#370089" target="_blank">公司认为放弃SLSB存在风险</a>，所以公司倾向于通过将Tomcat替换为Weblogic Server 10来提升系统的用户支撑能力。<a title="robbin则马上批评了这种做法" href="http://www.javaeye.com/topic/117564?page=6#370107" target="_blank">robbin则马上批评了这种做法</a>：</p>
<blockquote>
<p>坦白说我还从来没有听说过大规模互联网应用使用EJB的先例。为什么大规模互联网应用不能用EJB，其实就是因为EJB性能太差，用了EJB几乎必然出现性能障碍。</p>
<p>web容器的性能说到底无非就是Servlet线程调度能力而已，Tomcat不像WebLogic那样附加n多管理功能，跑得快很正常。对比测试一下WebLogic的数据库连接池和C3P0连接池的性能也会发现类似的结论，C3P0可要比WebLogic的连接池快好几倍了。这不是说WebLogic性能不好，只不过weblogic要实现更多的功能，所以在单一的速度方面就会牺牲很多东西。</p>
<p>以我的经验来判断，使用tomcat5.5以上的版本，配置apr支持，进行必要的tuning，使用BEA JRockit JVM的话，在你们目前的刀片上面，支撑500个并发完全是可以做到的。结合你们目前20个刀片的硬件，那么达到1万并发是没问题的。当然这样做的前提是必须扔掉EJB，并置web层和业务层在同一个JVM内部。</p>
</blockquote>
<p>接下来robbin还针对davexin对话题中的应用分别在tomcat和weblogic上的测试数据进行了分析：</p>
<blockquote>引用：
<blockquote>
<p>2。1台weblogic10 Express（相当于1台tomcat，用于发布jsp应用）加1台weblogic10（发布ejb应用），能支持1000个并发用户......<br />
......<br />
4。1台tomcat4.1加1台weblogic8，只能支持350个并发用户，tomcat就连结超时，说明此种结构瓶颈在tomcat。 </p>
</blockquote>
<p>这说明瓶颈还不在EJB远程调用上，但是问题已经逐渐清楚了。为什么weblogic充当web容器发起远程EJB调用的时候可以支撑1000个并发，但是tomcat只能到350个？只有两个可能的原因：</p>
<p>
<ol>
    <li>你的tomcat没有配置好，严重影响了性能表现
    <li>tomcat和weblogic之间的接口出了问题 </li>
</ol>
<p>&nbsp;</p>
</blockquote>
<p>接着springside项目发起者江南白衣也提出了一个总体的优化指导：</p>
<blockquote>
<p>1.基础配置优化</p>
<p>tomcat 6？ tomcat参数调优?<br />
JRockit JVM? JVM参数调优？<br />
Apache+Squid 处理静态内容？ </p>
<p>2.业务层优化</p>
<p>部分功能本地化，而不调remote session bean?<br />
异步提交操作,JMS？<br />
cache热点数据？ </p>
<p>3.展示层优化</p>
<p>动态页面发布为静态页面？<br />
Cache部分动态页面内容？ </p>
</blockquote>
<p>davexin在调整了Tomcat配置后应验了robbin对tomcat配置问题的质疑，davexin这样描述经过配置优化以后的测试结果：</p>
<blockquote>
<p>经过测试，并发人数是可以达到像robbin所说的一样，能够在600人左右，如果压到并发700人，就有15%左右的失败，虽然在调整上面参数之后，并发人数上去了，但是在同样的时间内所完成的事务数量下降了10%左右，并且响应时间延迟了1秒左右，但从整体上来说，牺牲一点事务吞吐量和响应时间，并发人数能够提高500，觉得还是值得的。</p>
</blockquote>
<p>至此这个话题有了一个比较好的结果。这个话题并非完全针对一个具体的项目才有意义，更重要的是在分析和讨论问题的过程中网友们解决问题的思路，尤其是cauherk、robbin、江南白衣等几位网友提出的意见可以让广大Java Web项目开发者了解到中、大型项目所需要考虑的架构和部署所需要考虑的关键问题，也消除了很多人对轻量Servlet容器与EJB容器性能的一些误解。</p>
<p>在讨论中还有一些小插曲，如davexin和江南白衣讨论了<a title="JRocket的实时（Realtime）版本是否可以提升Servlet容器的相应能力" href="http://www.javaeye.com/topic/117564?page=8#371197" target="_blank">JRocket的实时（Realtime）版本是否可以提升Servlet容器的相应能力</a>，答案是不可以。还有ID为mfc42d的网友从Servlet容器的并发支持能力引申到了<a title="Java的线程调度能力和NIO对Servelet容器的意义" href="http://www.javaeye.com/topic/117564?page=8#377459" target="_blank">Java的线程调度能力和NIO对Servelet容器的意义</a>，他推荐了自己的两篇不错的blog&#8220;<a title="java的线程实现" href="http://blogger.org.cn/blog/more.asp?name=hongrui&amp;id=25175" target="_blank">java的线程实现</a>&#8221;和&#8220;<a title="java进程使用的最大内存的数值" href="http://blogger.org.cn/blog/more.asp?name=hongrui&amp;id=23973" target="_blank">java进程使用的最大内存的数值</a>&#8221;，blog文章里面从JVM源码级别分析了Java的线程支持能力，面临JVM性能调优问题的网友可以认真阅读一下。</p>
<img src ="http://www.blogjava.net/iamtin/aggbug/146003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-09-17 22:48 <a href="http://www.blogjava.net/iamtin/archive/2007/09/17/java_web_architecture_and_performance_turnning.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从CTO如何设计软件到如何才是架构师</title><link>http://www.blogjava.net/iamtin/archive/2007/09/15/cto_design_project_and_how_to_be_architect.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Sat, 15 Sep 2007 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/09/15/cto_design_project_and_how_to_be_architect.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/145365.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/09/15/cto_design_project_and_how_to_be_architect.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/145365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/145365.html</trackback:ping><description><![CDATA[一段对话，关于架构师和设计者的。<br />
起因是javaeye的这个帖子：<a href="http://www.javaeye.com/topic/120219" title="固定链接：看看国外CTO是如何设计Java软件的">看看国外CTO是如何设计Java软件的</a>
<br />
<br />
<span style="color: #0817ff;">我回复maqujun说：</span><br />
呵呵，国外不止是CTO这样做。<br />
我国外的一些朋友在大学的时候计算机相关的作业就是这样的，这种做法一般不叫design by interface。老外一般叫做design by contract，因为contract有的时候是interface，有的时候是UML，有的时候是描述非常详细的类设计文档，但是结果是一样的，要求的外观和接口，内部怎么实现是你的事情。<br />
<br />
<span style="color: #0817ff;">maqujun又回复说：</span><br />
其实CTO不做这种事啦，我的文章写的有点偏题了。interface design是我的工作。我在文中是对我自己工作的总结经验，希望和更多人分享。你所说的国外大学的计算机相关的作业的内容，我很认同。这才是大学中应该学的东西。可惜我们中国的大学根本就没有这方面的涉及。有些差距在一开始的地方就形成了。不过好在我们自己可以弥补它。<br />
<br />
哈哈，很高兴收到你的回复。交个朋友吧。我加你为好友！ :D<br />
<br />
<span style="color: #0817ff;">我又回复：</span><br />
哈哈，是呀。我还真没见过公司里面专门有人做interface design的，这样不错，api会变漂亮。<br />
老外的计算机教育让我觉得在国内上大学基本上就是浪费时间。<br />
<br />
<span style="color: #0817ff;">maqujun回复：</span><br />
哈哈，&#8220;国内上大学基本上就是浪费时间&#8221;有同感！<br />
不过我可不是专门做interface design的哦。我不是架构工程师，我是软件开发工程师，本质还是做开发的。design部分只是一个新项目的开始前的工作而已。<br />
<br />
<span style="color: #0817ff;">我的感想：</span><br />
架构师这个概念比较虚。在国内，架构师其实就是有强烈基础倾向的开发者，他们有很大的热情来实验一个自己熟悉或者感兴趣的东西，从概念上这不是架构师。<br />
<br />
我很关注国外的一些架构师描述如何成为架构师。架构师其实最重要的是见识！要无倾向性的研究技术和需求。我很喜欢的印度的一位精神导师克里希姆纳提说过自由的前提是要学会聆听，而聆听就是在听的时候心理不要有任何反抗或者评论的去听，所有的思考都要留在听到以后。电影《教父》里面有一句台词我非常喜欢，不要仇恨你的敌人，因为那会影响你的判断力。我想这都是一个意思。如果想要成为架构师就要多聆听，然后思考，又清楚的判断力，这样选择才会是正确的！<br />
<img src ="http://www.blogjava.net/iamtin/aggbug/145365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-09-15 14:57 <a href="http://www.blogjava.net/iamtin/archive/2007/09/15/cto_design_project_and_how_to_be_architect.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>说说我对moo、prototype、JQuery的看法</title><link>http://www.blogjava.net/iamtin/archive/2007/09/13/reply_to_javaeye_fins_why_leave_prototype_choose_moo.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Thu, 13 Sep 2007 00:40:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/09/13/reply_to_javaeye_fins_why_leave_prototype_choose_moo.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/144680.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/09/13/reply_to_javaeye_fins_why_leave_prototype_choose_moo.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/144680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/144680.html</trackback:ping><description><![CDATA[因为javaeye的fins的这个帖子：<a href="http://www.javaeye.com/topic/122425?page=1">我为什么选择mootools,抛弃了prototype. (mootools与prototype 核心代码分析)</a><br />
我发表了一下我的看法<img src="/CuteSoft_Client/CuteEditor/images/emwink.gif" align="absmiddle" border="0"  alt="" /><br />
<br />
我觉得fins同学的一些说法会造成没有深入使用这几个框架的朋友的误解。因为这几个框架的思想是不一样的，所以它们的语法也是不同的。fins同学的评价似乎更像从Java的OO想法来评价几个js框架。<br />
其实，moo一开始的想法就是light weight，所以它的很多语法其实就是没有语法。fins说的json语法，其实就是js里面的散列对象嘛，javascript语法本来就是这个样子呀，不包装就是这样。而这种方式如果写的好读起来很像DSL，很舒服，moo充分发挥了这个好处。<br />
prototype和JQuery都没有强调继承这样的概念。javascript的强大很大就来自它的原形继承，如果要用好它就要利用好原形继承。prototype在这方面很像Ruby，比如Enumerable，这是一种按照行为的抽象，很符合Ruby/Python里面Module的想法，并非所有行为都要抽象到一个对象再继承，行为本身也可以抽象再混入。<br />
JQuery我觉得像Python。write less do more这个想法也比较pythonic。在这个框架中有很强的函数式编程的味道，其实javascript已经具备了函数式编程的语法能力，所以使用FP的强大是JQuery受欢迎的原因之一。<br />
<br />
说回来，还是流派原因。moo的产生比前两者要晚。prototype已经开始走大而全的路子了，而且配套的script.aculo.us也是越来越臃肿（而且这个特效库的代码质量的确不怎么好），但是要看到RoR里面使用RJS简化Ajax应用开发都得益于这些大而全的库，所以我们也没什么可抱怨的，只能说没有使用RoR少享受点便利吧。JQuery继续保持它的优美，插件也越来越多，我了解到的很多使用Django进行Web开发的朋友都在用JQuery。而moo，越来越受欢迎，我们也要认真关注它的体积，如果它能持续保持苗条，那么轻量级Web项目就很有可能越来越多的选用它。<br />
每年学一门新语言，学两三个新框架，肯定是有益的。fins转阵营说明你也在拥抱变化呀:D<br />
<img src ="http://www.blogjava.net/iamtin/aggbug/144680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-09-13 08:40 <a href="http://www.blogjava.net/iamtin/archive/2007/09/13/reply_to_javaeye_fins_why_leave_prototype_choose_moo.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>充满Trick的CSS，两难的选择</title><link>http://www.blogjava.net/iamtin/archive/2007/09/10/css_trick_to_be_or_not_to_be.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Mon, 10 Sep 2007 00:02:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/09/10/css_trick_to_be_or_not_to_be.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/143872.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/09/10/css_trick_to_be_or_not_to_be.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/143872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/143872.html</trackback:ping><description><![CDATA[<img height="44" alt="" src="http://www.infoq.com/styles/cn/i/logo.gif" width="140" border="0" /> 本文已经发表于InfoQ中文站，（<a href="http://www.infoq.com/cn/news/2007/09/css_trick_to_be_or_not_to_be" target="_blank">充满Trick的CSS，两难的选择</a>）
<p>javaeye的hax最近在他的blog上进行了一场关于如何写css的讨论，其中反思和讨论了一些关于基于标准或trick进行设计的选择问题，这个问题也是<a href="http://www.infoq.com/cn/news/2007/07/dhh-debates-ria-future" target="_blank">David Heinemeier Hansson对于XHTML/CSS/Javascript标准进行RIA开发话题</a>的一个延展。我们可以从中思考如何在不完美的技术中选择一条相对完美的技术路线？</p>
<p>讨论的起因是淘宝网的UED团队成员段王爷在他的blog上发表了一篇<a href="http://ued.taobao.com/blog/2007/08/12/css-notes/" target="_blank">关于淘宝网页面设计上的小技巧（Trick）</a>的介绍，这个技巧是为了让一些条目之间的分隔线完全使用css生成，不使用多余的class，段王爷还对比了其它三种常见实现方法。实现方法如下： </p>
<blockquote style="background: #eee;font-style:normal;">从很久很久以前开始，类目间的横线无非都只有三种。<br />
1、背景图<br />
在a标签设置一个padding 用宽1px高不等的背景图来position到右侧。<br />
缺点：最后一个还是要用class来隐藏掉背景。<br />
2、符号<br />
在每个a标签之间用&#8220;|&#8221;符号来填充。<br />
缺点：html文件变大，文件维护变得很麻烦，而且在html中毫无意义。<br />
3、a标签右侧的boder。<br />
同背景图一样，只不过使用border-right来代替。缺点也同上。<br />
<br />
其实现有（淘宝的实现方式）是利用ul的overflow:hidden 再将li的margin-left:-1px的做法做出来的。这样的做法就可以同时避免以上的缺点了。<br />
</blockquote>
<p>上面提到的使用border的传统方式需要在第一或者最后一个元素上面添加class来隐藏border，Realazy也在他的blog中给出了一种不错的解决方案，他推荐这样做：</p>
<blockquote style="background: #eee;font-style:normal;">导航项目间的竖线，我们往往通过border或者background来实现。特殊需求是，第一项左边无竖线或最后一项右边无竖线。按照一般的编程方法，控制第一项要比控制最后一项容易得多。<br />
<br />
区分第一项的还有一个好处是，CSS有一个:first-child的伪元素（pseudo element）可以让我们轻而易举的选择第一个子元素。遗憾的是，当前全球占有率最高的浏览器，IE6，并不支持这个伪元素。我们可以手工给第一个元素加上class然后再定义它。等ie6淘汰之时，就可以放心用 :first-child了，相权衡的话，我觉得给第一项加上class="first"也不失为实用主义做法。 </blockquote>
<p>Realazy提出的方案的思路是使用基于标准的css选择器（selector），这种方法的好处是可以实现完美的内容与表现分离。但是现实的问题是并非所有的浏览器都基于标准实现，这也正是基于标准的RIA开发面对的最大问题，尤其以CSS和Javascript问题最大。javaeye的hax在他的blog中提出了自己对于这个Trick的不同意见：</p>
<blockquote style="background: #eee;font-style:normal;">因为我觉得这个方法一点也不好。很简单的一个理由：这只是一个trick，只适合这特殊情况，假设你要换用&#8220;-&#8221;来分割呢？作为插入分割符号来说，真正合理使用css的，我给一个例子：<br />
li ~ li:before { content:'-'; margin:0.25em; }
<p>优点：含义非常清晰，维护性极高。你可以换任何的分隔字符，可以设定字体，可以设定颜色、大小等样式，甚至可以换用图片作为分隔。</p>
好了，下面说缺点。唯一的缺点：<strong>IE不支持。</strong> </blockquote>
<p>hax给出的方案在IE中无法使用，其实对于大部分网站来说这就相当于绝大多数用户都无法看到这种表现，这就意味着失败。淘宝UED的小马提出&#8220;实用第一&#8221;，从这种观点上说hax的方案就是不实用的。但是hax提出可以使用<a href="http://dean.edwards.name/IE7/" target="_blank">Dean Edwards的IE7 Javascript库</a>：</p>
<blockquote style="background: #eee;font-style:normal;">IE7是一个可以让IE像标准浏览器一样工作的Javascript库。它修正了很多CSS问题，让PNG在IE5和IE6下正常工作。 </blockquote>
<p>IE7这个库动态的实现了很多IE原本不支持的伪类（Pseudo Classes），让完全基于标准的css选择器（使用伪类）成为可能。随后，hax在他的另外一篇blog<a href="http://hax.javaeye.com/blog/112287" target="_blank">&#8220;面向未来的CSS实践&#8221;</a>中作了如下设想：</p>
<blockquote style="background: #eee;font-style:normal;">我推崇一种面向未来的CSS实践。<strong>即大胆采用CSS2.1甚至部分CSS3的特性。</strong>因为绝大多数特性，Firefox、Opera、 Safari等都已经很好的支持了。MSIE7也改进了许多，将来IE也无疑终究会完全支持CSS2.1。对于目前的IE，除了graceful degradation的方式（实际上整个内容样式分离的原则和良好的CSS设计可以确保这点，比如淘宝以前的&#8220;裸体&#8221;所体现的），可以考虑通过特定手段来patch之。<br />
<br />
在这点上，我必须说，我原来也是一直坚持只用ie6的selector的。是什么改变了我？就是Dean Edwards的IE7！它的出现不仅在于实践价值——即提供了一个对于IE的补丁，让开发者可以直接写CSS2甚至CSS3。 </blockquote>
<p>hax提出的这种方式是比较激进的，他还在<a href="http://hax.javaeye.com/blog/112287" target="_blank">&#8220;面向未来的CSS实践&#8221;</a>中进一步的描述了通过脚本修正的方式解决IE不支持标准伪类和多class问题的设想，他的核心想法就是让CSS的开发可以遵循标准，减少为了优雅退化（graceful degradation）而向最低支持（浏览器）兼容造成的表达方式限制。但是hax自己也提出了这种思路面临的尴尬，它举了table布局的实用性价值为例：</p>
<blockquote style="background: #eee;font-style:normal;"><strong>我认为出现这样讽刺的情况，即遵循标准的人活得比不遵循的人更累，是很有问题的。</strong>这种矛盾在我身上存在着，2001年的时候我在某bbs上发了个贴，大数 table布局之罪，但是过了几天我又跑上去说table布局在某种情况下也可以用用。 dlee同志貌似到现在也跟我当时一样。如果你确实认为，table布局从实用主义角度无法被完全否定，那DHH同志采用实用主义的角度来力挺 html/css/js就也有点心虚，那个标题也就显得带点任性味道&#8230;&#8230;</blockquote>
<p>&#8220;遵循标准的人活得比不遵循的人更累&#8221;这句话说出了很多坚持基于标准进行CSS设计的开发人员的心声，这其实是实用性和坚持标准之间的一些交换，现实世界中两个方面如何平衡正是广大XHTML/CSS/Javascript开发者需要认真思考的，关键的问题，还是目的要明确。盲目的遵循标准，例如很多开发者着迷于使用div布局代替table，但是却没有明确的目标就会迷失，hax这样评价：</p>
<blockquote style="background: #eee;font-style:normal;">从实用主义角度说，谨慎的table布局也许更简单，因为它更好的映射到了grid模型上。如果你转用div/span，<strong>标签是清晰了，但是css是混乱的！</strong>这些属性（css属性）是分散的，css代码无法反映整体，无法记录你的grid 布局意图！这是为什么我们经常说我有一个css trick的原因，它是trick而已，是你达到最终目的的手段，但是你的目的，<strong>你的意图，没有好好加入文档的话，那维护起来恐怕也不见得轻松。</strong>
<p>table布局 其他css样式 = 清晰的布局意图和内容的混合体</p>
<p>div容器 css样式 = 内容样式分离，但是从css代码中很难看出布局意图</p>
关于div/css布局还有一些误区，简单的把table标签换成div是没有意义的（若干层级的div可能比table更糟糕）。<strong>实际上我们希望的是语义标签。</strong> </blockquote>
<p>我们应该看到，CSS的意图是将表现分离。从设计的角度就是实现语义化的html结构，让html/xhtml尽量只表达纯粹的数据结构。但是此时css里面的布局意图是比较难以被记录的（难以被理解就难以维护，难以重构），有其在充斥了大量Trick的情况下，这正是广大程序员/设计人员需要解决的，我们是否应该通过不断地重构来找到这个矛盾的平衡点呢？欢迎大家讨论。最后附上淘宝UED团队的小马总结的淘宝CSS编程原则：</p>
<blockquote style="background: #eee;font-style:normal;">
<ol>
    <li><strong>尽量不使用hack</strong>
    <li><strong>尽量不使用ie6不支持的选择符</strong> </li>
</ol>
能符合这两个条件的最简洁的写法，就是我们的目标。 </blockquote>   <img src ="http://www.blogjava.net/iamtin/aggbug/143872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-09-10 08:02 <a href="http://www.blogjava.net/iamtin/archive/2007/09/10/css_trick_to_be_or_not_to_be.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐一个iTunes特效插件</title><link>http://www.blogjava.net/iamtin/archive/2007/08/03/134276.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Fri, 03 Aug 2007 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/08/03/134276.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/134276.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/08/03/134276.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/134276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/134276.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/iamtin/archive/2007/08/03/134276.html'>阅读全文</a><img src ="http://www.blogjava.net/iamtin/aggbug/134276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-08-03 16:42 <a href="http://www.blogjava.net/iamtin/archive/2007/08/03/134276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非常好的职业建议，来自Scott Adams</title><link>http://www.blogjava.net/iamtin/archive/2007/08/03/scott_adams_on_career.html</link><dc:creator>Tin</dc:creator><author>Tin</author><pubDate>Fri, 03 Aug 2007 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/iamtin/archive/2007/08/03/scott_adams_on_career.html</guid><wfw:comment>http://www.blogjava.net/iamtin/comments/134266.html</wfw:comment><comments>http://www.blogjava.net/iamtin/archive/2007/08/03/scott_adams_on_career.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/iamtin/comments/commentRss/134266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamtin/services/trackbacks/134266.html</trackback:ping><description><![CDATA[<p>非常好的职业建议，来自Scott Adams<br>从一个非常喜欢的人的blog看到的，这个人是Tomcat的作者，现在是Apple的Object C开发者，兼重要的RoR作者，兼资深摄影师，兼Mac大fans，他叫James Duncan Davidson（<a href="http://duncandavidson.com/">http://duncandavidson.com/</a>）。<br>在一篇Blog讲到，Scott Adams说：<br>Everyone has at least a few areas in which they could be in the top 25% with some effort. In my case, I can draw better than most people, but I&#8217;m hardly an artist. And I&#8217;m not any funnier than the average standup comedian who never makes it big, but I&#8217;m funnier than most people. The magic is that few people can draw well and write jokes. It&#8217;s the combination of the two that makes what I do so rare. And when you add in my business background, suddenly I had a topic that few cartoonists could hope to understand without living it.<br>翻译一下就是说：<br>每个人都可以找到通过一些努力就可以跻身前25%的行业。例如我，我可以比大多数人画的好，但是我还够不上艺术家的水平。我也没有达到喜剧演员那种好笑的水平，但是我比大多数人好笑。魔法在于没什么人即画得好又会写笑话。所以混合一下我就很稀有了。加上我的商业知识背景，我突然发现我比其它的动画人更能理解它（商务）。</p>
<p>思考一下，其实就是当下流行的mush up。你混合一下你的长处，也许你就找到了你真正的长处，你的职业。<br>同时James又推荐了Stay Hungry，Stay Foolish，他说他37岁了依然觉得那是篇很好的文章。我很早之前也推荐过这篇文章，大家继续看看。</p>
<img src ="http://www.blogjava.net/iamtin/aggbug/134266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamtin/" target="_blank">Tin</a> 2007-08-03 16:06 <a href="http://www.blogjava.net/iamtin/archive/2007/08/03/scott_adams_on_career.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>