<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[柠檬居IT技术网 - News]]></title>
  <subtitle type="html"><![CDATA[分享最前卫最时尚的技术！- http://www.nmju.net]]></subtitle>
  <id>http://www.nmju.net/</id>
  <link rel="alternate" type="text/html" href="http://www.nmju.net/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.nmju.net/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2009-07-06T21:06:22+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[对SQL说不！NoSQL的数据库技术革命]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2009-07-06T21:06:22+08:00</updated>
	  <published>2009-07-06T21:06:22+08:00</published>
		  <summary type="html"><![CDATA[就像当年波士顿的爱国者为反抗英国重税的行动一样，NoSQL的支持者们从各地涌来，分享他们如何推翻缓慢而昂贵的关系数据库的暴政，怎样使用更有效和更便宜的方法来管理数据，他们开始对SQL说不！NoSQL组织上个月在旧金山的行动让人闻到了数据库革命的味道，好像一个现代IT业版的波士顿倾茶事件正在策划之中。<br/><br/>在NoSQL运动的最新一次聚会中，来自世界各地的150人挤满了CBS Interactive的一间会议室。<br/><br/>就像当年波士顿的爱国者为反抗英国重税的行动一样，NoSQL的支持者们从各地涌来，分享他们如何推翻缓慢而昂贵的关系数据库的暴政，怎样使用更有效和更便宜的方法来管理数据。云计算可能会为数据库技术的发展带来新的契机，如果想在云中获得丰富而随需应变的可伸缩性，你需要一个非关系数据库。<br/><br/>“关系型数据库给你强加了太多东西。它们要你强行修改对象数据，以满足RDBMS （relational database management system，关系型数据库管理系统）的需要，”Java工具提供商SpringSource公司的首席工程师Jon Travis说，他是本次集会的10位发言人之一，在他看来，基于NoSQL的替代方案“只是给你所需要的”。<br/><br/><strong>开源的兴起</strong><br/><br/>反SQL运动的主要倡导者都是Web和Java开发者，他们中许多人都在创业的初期历经了资金短缺并因此与Oracle说再见，然后效仿Google和Amazon的道路建设起自己的数据存储解决方案，并随后将自己的成果开源发布。现在，他们的开源数据商店管理着成百TB甚至PB的数据，由于Web 2.0和云计算的兴起，无论从技术上还是从经济上他们都无需再返回从前，甚至连想也不用想。<br/><br/>“Web 2.0的企业应该抓住机会，他们需要可扩展性，”总部设在伦敦的NoSQL会议组织者Johan Oskarsson说，他任职于著名的音乐网站Last.fm，其他的大多数与会者也都是网络开发者。<br/><br/>Oskarsson说，许多人甚至抛弃了MySQL开源数据库这个长期以来Web 2.0的宠儿，而改由NoSQL的方案来替代，因为优势实在是引人注目。51CTO.com之前曾报道过MySQL创始人宣布创建开源数据库联盟的消息，过度的商业化是MySQL失去原来的优势。<br/><br/>例如Facebook建立了自己的Cassandra数据商店并且在其网站上重点推出一项新的搜索功能，没有使用到现有的MySQL数据库。据Facebook的工程师Avinash Lakshma介绍，Cassandra仅用0.12毫秒就可以写入50GB的数据，比MySQL快了超过2500倍。Google也开始公测他们的云数据库Fusion Tables，这是一个和传统数据库完全不同的数据库，主要优势能够简单的解决关系型数据库中管理不同类型数据麻烦，以及排序整合的常见操作的性能问题等。<br/><br/><strong>什么是NoSQL（从技术上说）？</strong><br/><br/>从这些NoSQL项目的名字上看不出什么相同之处：Hadoop、Voldemort、Dynomite，还有其它很多。<br/><br/>但是，它们通常在某些方面相同：<br/><br/>不要叫它们数据库。Amazon.com的首席技术官Werner Vogels将他们的重要的Dynamo系统称作“高可用性的键值商店”。Google将自己的BigTable称作“管理结构化数据的分布式存储系统”，在51CTO.com之前的外电《云服务颠覆开发传统观念》中曾提到，Google的Big Table不是SQL数据库，原因是SQL数据库支持的一些功能实在难以进行分割，这与我们跨机器存储数据的想法无法结合。它们都是许多NoSQL追随者的效仿模式。<br/><br/>它们可以处理超大量的数据。比如Zvents公司以BigTable模式搭建的开源数据库Hypertable，据Zvents工程师Doug Judd介绍，它可以每天在搜索引擎中写入10亿单元数据。<br/><br/>另外，BigTable与其姊妹技术MapReduce相结合，每天可以处理多达20PB的数据。<br/><br/>“毫无疑问，数据量越来越巨大也让人们寻找其他的数据库替代技术，”SpringSource的Travis说。<br/><br/>它们运行在便宜的PC服务器集群上。PC集群扩充起来非常方便并且成本很低，避免了“sharding”操作的复杂性和成本。<br/><br/>Google曾表示一个BigTable的大集群可以管理数千台服务器上多达6PB的数据。<br/><br/>“Oracle会告诉你需要购买一些硬件然后正确配置Oracle RAC，然而用其他的神奇软件你也可以达到相同的可扩展性。但是两者的开销可是天差地别。”SpringSource首席技术官Javier Soltero说。<br/><br/>它们击碎了性能瓶颈。NoSQL的支持者称，通过NoSQL架构可以省去将Web或Java应用和数据转换成SQL友好格式的时间，执行速度变得更快。<br/><br/>“SQL并非适用于所有的程序代码，”数据库分析师Curt Monash说。对于那些繁重的重复操作的数据，SQL值得花钱。但是当数据库结构非常简单时，SQL可能没有太大用处。<br/><br/>Adobe公司资深计算机科学家Raffaele Sena说，当一年半前Adobe准备重新更新ConnectNow网络协作服务时，正是由于上面的理由，他们决定不采用关系型数据库。<br/><br/>Adobe决定使用Terracotta 提供的Java集群软件，管理Java格式的数据，Sena说，这使ConnectNow的性能提高到前一版本的2至3倍。<br/><br/>没有过多的操作。虽然NoSQL的支持者也承认关系数据库提供了无可比拟的功能集合，而且在数据完整性上也发挥绝对稳定，他们同时也表示，企业的具体需求可能没有那么多。<br/><br/>以Adobe的ConnectNow为例，Sena说，当用户在线时它会不通过数据库而制作三份会话数据，在离线后删除。“因此我们并不需要数据库，因为具体所需要的数据是在内存中的，”他说。<br/><br/><strong>Bootstrap支持</strong><br/><br/>因为NoSQL项目都是开源的，因此它们缺乏供应商提供的正式支持。这一点它们与大多数开源项目一样，不得不从社区中寻求支持。<br/><br/>但是一些人承认，没有正式的官方支持，万一出了差错会是可怕的，至少很多管理人员是这样看。<br/><br/>“我们确实需要做一些说服工作，”Adobe的Sena承认，“但基本在他们看到我们的第一个原型运行良好之后，我们就能够说服他们，这是条正确的道路。”<br/><br/>“大多数大型企业已经习惯于使用关系型数据库管理系统。因此他们会想为什么要改变呢？”Monash说。比如MapReduce和类似的项目“对企业有意。但是在具体使用时，它很可能会和一个分析DBMS（数据库管理系统）相集成。”<br/><br/>即使NoSQL的组织者Oskarsson也承认，就算是他自己的公司Last.fm也还没有做好转为NoSQL替代者的准备，现在依然在使用开源数据库。<br/><br/>他认为这场革命目前仍然需要等待。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=141" /> 
	  <id>http://www.nmju.net/default.asp?id=141</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Frontpage2003的怪bug，自动添加“../”的父级目录]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2009-05-27T08:27:24+08:00</updated>
	  <published>2009-05-27T08:27:24+08:00</published>
		  <summary type="html"><![CDATA[<p>用FrontPage2003</p>
<p>无意中发现一个bug</p>
<p>稍加研究，基本发现这个bug的规律了</p>
<p>首先是我的系统版本和Frontpage版本：</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194115.jpg" /></p>
<p>我的文件路径（后面有描述，和路径有关哦～）</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194212.jpg" /></p>
<p>页面中有如下代码：</p>
<p>注：CSS中有背景文件的定义，文件body中也有文件路径，用红线标注出来了</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194339.jpg" /></p>
<p>随便找body中一个图片路径，手工修改html代码，用到三级父目录好了</p>
<p>如下：</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194433.jpg" /></p>
<p>存盘</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194449.jpg" /></p>
<p>再编辑html代码，假设之前路径搞错了，需要减少两级父目录</p>
<p>如下：</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194540.jpg" /></p>
<p>存盘</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194449.jpg" /></p>
<p>此时发现，所有涉及图片路径的字段，都添加上了&ldquo;../&rdquo;这样的父目录（红线标注了）</p>
<p><img alt="" border="0" src="http://www.yici.net/content/uploadfiles/2007-09/20070929_194629.jpg" /></p>
<p>此时无论你再次编辑，添加或者减少父目录&ldquo;../&rdquo;的标记，只要你存盘，总会在每一个涉及图片路径的地方自动添加一次&ldquo;../&rdquo;</p>
<p>汗&hellip;&hellip;</p>
<p>不知道ms对于发现bug有没有奖励啊？</p>
<p>　</p>
<p>呵呵</p>
<p>　</p>
<p><span style="color: #ff0000"><strong>经过反复试验，基本找到原因了，页面所在目录如果是中文名的话修改并保存几次后就会出现问题。</strong></span></p>
<p><span style="color: #ff0000"><strong>所在目录是英文的话一点问题没有，所在目录的上级目录有无中文无所谓。</strong></span></p>
<p>汗&hellip;&hellip;</p>
<p>这算什么怪事啊&hellip;&hellip;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=139" /> 
	  <id>http://www.nmju.net/default.asp?id=139</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Microsoft Web Platform Installer 2.0 Beta 发布]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2009-03-24T14:46:27+08:00</updated>
	  <published>2009-03-24T14:46:27+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;微软网络平台安装试用版（网络 PI ）的提供了一个单一，免费包安装和配置微软的整个网络平台，包括IIS7，Visual Web Developer 2008 Express Edition， SQL Server 2008 Express Edition 或 .NET Framework。利用网络平台安装的简单的用户界面，您可以选择自定的组成部分或更多...</p>
<p>&nbsp;</p>
<div><b>下载:</b><a href="http://go.microsoft.com/fwlink/?LinkID=145505" target="_blank">Microsoft Web Platform Installer 2.0 Beta</a></div>
<div>&nbsp;</div>
<div>站长语：好像是一个集成化开发平台，各个功能都可以使用，不过在服务器上没试过，值得期待</div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=133" /> 
	  <id>http://www.nmju.net/default.asp?id=133</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[31 个用来测试你网站各项性能的免费在线工具]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-11-04T19:07:02+08:00</updated>
	  <published>2008-11-04T19:07:02+08:00</published>
		  <summary type="html"><![CDATA[<div id="wrapper">
<div id="main">
<div id="content">
<div id="contentWrapper">
<div id="newsBox">
<div id="news">
<div id="news_content">你是否肯定你的网站完全兼容各大浏览器？是否知道多少秒可以打开你的网站？ 是否可以自信地说你的网站根本就没有打不开的时候？ 是否&hellip;&hellip;<br />
虽然它看似不重要，但这些在一定程度上也对你的网站的访问量产生了影响 （ <a href="http://zsk.akaka.com.cn/2007/06/25-way-to-improve-web/">其它一部分影响浏览量的原因及解决办法</a> ）。这里列出了一份 <a href="http://zsk.akaka.com.cn/2007/06/31-free-tests-online/">31 个我最喜爱的免费在线测试工具</a>，你可以通过这些工具来测试你的网站，并根据结果对你的网站进行修改。<br />
<strong>网站代码验证</strong> 没人可以细致到保证自己的网站代码都是正确的，你可以通过以下测试来验证网站代码是否正确。
<p><strong>1 . <a href="http://www.htmlhelp.com/tools/validator/">WDG HTML Validator</a></strong> 一个很好的工具，能找出网站语法错误的地方，并标注出来，也可选择对网站上单独的每一页进行单页分析。（ <strong>强烈推荐</strong> ）<br />
<br />
<strong>2 . <a href="http://validator.w3.org/">W3C Markup Validation Service</a></strong> 对 HTML 和 XHTML 都能进行代码测试，自称是互联网络上第一个（也是使用者最多的）的 HTML 验证工具。<br />
<br />
<strong>3 . <a href="http://jigsaw.w3.org/css-validator/">W3C CSS Validation Service</a></strong> 用于验证 css 源代码，能够标注出不好的 css 代码设计。例如：&ldquo;Same colors for color and background-color in two contexts&rdquo;。<br />
<br />
<strong>4 . <a href="http://www.xml.com/pub/a/tools/ruwf/check.html">RUWF XML Syntax Checker</a></strong> 用于查找 XML 文件的错误。<br />
<br />
<strong>5 . <a href="http://validator.w3.org/feed/">W3C Feed Validation Service</a></strong> 用于查找 Atom 和 RSS feed 中的错误语法。（ <strong>这个我经常用到</strong> ）<br />
<br />
<strong>6 . <a href="http://validator.w3.org/checklink">W3C Link Checker</a></strong> 用于搜寻查明你网站内的所有链接里是否有断链。（ <strong>强烈推荐</strong> ）<br />
<br />
<strong>7 . <a href="http://juicystudio.com/services/linktest.php">Juicy Studio Link Analyser</a></strong> 测试网站内的链接的 URL 是否存在死链，与 W3C Link Checker 很类似。<br />
<strong>网站的使用性</strong> <br />
我们常常看到网站设计者把重点放在怎网站的吸引力上，而完全不考虑会不会影响来访者的使用，一个浏览难度很大的网页是注定要失败，要让你的来访者方便的得到他要的信息（从而成为重复访客），你的网站应当遵循 WCAG section 508 易用性规则。<br />
<br />
<strong>8 . <a href="http://webxact.watchfire.com/">Watchfire WebXACT</a></strong> 所有严谨的设计师和开发者都必须使用的工具，它会生成一个非常详尽的报告书，包括：网站质量，易用性和隐私等。（<strong> 强烈推荐</strong> ）<br />
<br />
<strong>9 . <a href="http://checker.atrc.utoronto.ca/index.html">ATRC Web Accessibility Checker</a></strong> 测试网站的 WCAG 2.0 Level2 兼容性，它会生成一份报告，提出一系列建议，如：如何提升页头，链接，数据，图表和文字的访问速度。<br />
<br />
<strong>10 . <a href="http://www.wave.webaim.org/wave/index.jsp">WAVE 3.0 Web Accessibility Tool</a></strong> 高度可定制的工具，它采用了图形化模型展示网站兼容性问题（ WCAG 1.0 and section 508 ）。（ <strong>强烈推荐</strong> ）<br />
<br />
<strong>11 . <a href="http://www.tawdis.net/taw3/cms/en">TAW Web Accessibility Test</a></strong> 测试网页是否存在冲突（ WCAG 1.0 兼容性 ），通过图形模式生成一份依据 wcag 优先模式为基础的网站修改建议。<br />
<br />
<strong>12 . <a href="http://www.cynthiasays.com/">HiSoftware CynthiaSays portal</a></strong> 采用了非常严格的规则来测试网页（ 根据 section 508 和 WCAG 1.0 规则 ），生成的报告也极为详细（ 详细到很难看懂 ）。<br />
<br />
<strong>13 . <a href="http://www.sidar.org/hera/index.php.en">HERA Accessibility testing with Style</a></strong> 使用一种极为复杂但容易理解方式指出网页的 wcag1.0 兼容性问题。<br />
<br />
<strong>14 . <a href="http://juicystudio.com/services/csstest.php">Juicy Studio CSS Analyser</a></strong> 进行了色彩对比测试，以确保你的网站的色调会符合 WCAG 1.0 的要求。<br />
<br />
<strong>15 . <a href="http://juicystudio.com/services/readability.php">Juiciy Studio Readability Test</a></strong> 分析你网站上的文字是否有语法错误或拼写错误等问题，容易让人理解不（ 根据 the Flesch Reading Ease 和 Flesch-Kincaid grade level algorithms 规则 ）。（ 适合英文网站使用 ）<br />
<strong>网站的速度</strong> <br />
打开你的网站的速度快慢，是来访者会不会再次访问网站的关键因素，在一般情况下，一个网络不是很快的来访者是不愿意访问一个充满着图片、flash 动画、多媒体文件的网站。为了使你的网站覆盖人群的范围最大化，你必须优化你的网站，使它的打开速度尽可能的快。<br />
<br />
<strong>16 . <a href="http://www.websiteoptimization.com/services/analyze/">Web Page Analyzer from Website Optimization</a></strong> 一个很好的工具，它在分析完一个网页后，会为减少加载时间提出优化建议，着重优化物体的数目，图片和网站的总体大小。（ <strong>强烈推荐</strong> ）<br />
<br />
<strong>17 . <a href="http://www.websitepulse.com/help/tools.php">WebSitePulse Test Tools</a></strong> 有一系列的工具来确定网站的加载速度和主机信息。<br />
<br />
<strong>18 . <a href="http://internetsupervision.com/scripts/urlcheck/check.aspx">Internet Supervision Url Check</a></strong> 从世界各地不同的服务器来测试你的网站的加载时间，用于确定是不是各地的来访者都能顺利快速的打开你得网站。<br />
<strong>浏览器模拟工具</strong> <br />
这是一个普遍的问题，因为现在有着很多的操作系统和浏览器，你得网站必须得兼容它们，但这绝不是一件容易的事。通过下列工具，你可以了解你得网站在各种浏览器上的显示效果。<br />
<br />
<strong>19 . <a href="http://browsershots.org/">Browsershots</a></strong> 能给出你的网站在不同浏览器下显示效果的截图，包括：Firefox 和 Internet Explorer （ Windows ）、Firefox 和 Safari （ Mac OS X ）、Iceweasal 和 Konqueror （ Linux ），但是结果要在 1 - 3 小时后才能出来。<br />
<br />
<strong>20 . <a href="http://ipinfo.info/netrenderer/">IE NetRenderer</a></strong> 实时生成你的网站在 Internet Explorer 5.5 、6.0 和 7.0 下的截图。<br />
<br />
<strong>21 . <a href="http://ready.mobi/launch.jsp?locale=en_EN">MobiReady Report</a></strong> 分析使用手机访问网页的兼容性问题，会生成一份详细的报告，并提供了在两种不同类型的手机浏览器上你得网站可能显示的样子。<br />
<strong>搜索引擎优化 (SEO) </strong><br />
一个网站，如果对搜索引擎有着比较好的友好度，一定会比较有竞争力。<br />
<br />
<strong>22 . <a href="http://www.urltrends.com/">UrlTrends</a></strong> 会显示网站的访客是如何通过搜索引擎来到你的网站，还有各个流量是多少。这些数据是包括 Google, Yahoo, MSN, Alexa, AlltheWeb, AltaVista 和其他一些网站。（ <strong>强烈推荐</strong> ）<br />
<br />
<strong>23 . <a href="http://www.iwebtool.com/backlink_checker">iWEBTOOL Backlink Checker</a></strong> 一个很好的工具，它能找出有什么站点链接到你的站点，那些站点是什么类型的站点。<br />
<br />
<strong>24 . <a href="http://www.iwebtool.com/multirank">iWEBTOOL Multi-Rank Checker</a></strong> 显示你网站的 Alexa 和 Google PageRank 数值。<br />
<br />
<strong>25 . <a href="http://adlab.microsoft.com/default.aspx">Microsoft adCenter Labs: Advertising and Keyword Research Tools</a></strong> 一个极好的工具，用于分析和预测你网站的来访者和市场。（ <strong>强烈推荐</strong> ）<br />
<br />
<strong>26 . <a href="http://whois.domaintools.com/">Domain Tools Whois lookup</a></strong> 一个 WHOIS 网络工具。<br />
<br />
<strong>27 . <a href="http://www.seo-browser.com/">SEO-Browser</a></strong> 可以让你看到在搜索引擎眼里一样的网站（ 去掉所有的&rdquo;美丽&rdquo;配件 ）。<br />
<br />
<strong>28 . <a href="http://www.seoworkers.com/tool/analyzer.html">SEO Workers SEO Analysis Tool</a></strong> 非常有用的工具，分析了网站上的各种分类特征，包括 meta 标签、关键字密度及加载时间。（ <strong>强烈推荐</strong> ）<br />
<br />
<strong>29 . <a href="http://www.seekport.co.uk/seekbot/">Seekport Seekbot</a></strong> 可以分析网站的数据和内容，以得出搜索引擎会如何有效的解释分析的网站。<br />
<br />
<strong>30 . <a href="http://www.seochat.com/seo-tools/">SEO Chat SEO Tools</a></strong> 用以分析网站 Google adsense 盈利潜力，关键字密度，Meta tag 等等&hellip;&hellip;<br />
<br />
<strong>31 . <a href="http://www.marketleap.com/publinkpop/">Marketleap Search Engine Marketing Tools</a></strong> 用来分析网页，让你知道你的网站检索、设定的关键字好不好。<br />
　</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=116" /> 
	  <id>http://www.nmju.net/default.asp?id=116</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[提高网页打开速度的一些小技巧]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-11-04T19:02:40+08:00</updated>
	  <published>2008-11-04T19:02:40+08:00</published>
		  <summary type="html"><![CDATA[互联网带宽越来越宽，似乎让网页的加载速度得到了质的飞跃。其实不然，因为随着带宽的提高，网页上的对象也越来越多，因此加快网页打开速度还是一个重要的课题。加快网页的打开速度，有三个路径，一是提高网络带宽，二是用户在本机做优化，三是网站设计者对网页做一定的优化。这篇文章站在一个网站设计者的角度，分享一些优化网页加载速度的小技巧。<br/><br/><br/><br/>一、优化图片<br/><br/>几乎没有哪个网页上是没有图片的。如果你经历过56K猫的年代，你一定不会很喜欢有大量图片的网站。因为加载那样一个网页会花费大量的时间。<br/><br/>即使在现在，网络带宽有了很多的提高，56K猫逐渐淡出，优化图片以加快网页速度还是很有必要的。<br/><br/>优化图片包括减少图片数、降低图像质量、使用恰当的格式。<br/><br/>1、减少图片数：去除不必要的图片。<br/><br/>2、降低图像质量：如果不是很必要，尝试降低图像的质量，尤其是jpg格式，降低5%的质量看起来变化不是很大，但文件大小的变化是比较大的。<br/><br/>3、使用恰当的格式：请参阅下一点。<br/><br/>因此，在上传图片之前，你需要对图片进行编辑，如果你觉得photoshop太麻烦，可以试试一些在线图片编辑工具。懒得编辑而又想图片有特殊的效果？可以试试用过调用javascript来实现图片特效。<br/><br/>二、图像格式的选择<br/><br/>一般在网页上使用的图片格式有三种，jpg、png、gif。三种格式的具体技术指标不是这篇文章探讨的内容，我们只需要知道在什么时候应该使用什么格式，以减少网页的加载时间。<br/><br/>1、JPG：一般用于展示风景、人物、艺术照的摄影作品。有时也用在电脑截屏上。<br/><br/>2、GIF：提供的颜色较少，可用在一些对颜色要求不高的地方，比如网站logo、按钮、表情等等。当然，gif的一个重要的应用是动画图片。就像用Lunapic制作的倒映图片。<br/><br/>3、PNG：PNG格式能提供透明背景，是一种专为网页展示而发明的图片格式。一般用于需要背景透明显示或对图像质量要求较高的网页上。<br/><br/>三、优化CSS<br/><br/>CSS叠层样式表让网页加载起来更高效，浏览体验也得到提高。有了CSS，表格布局的方式可以退休了。<br/><br/>但有时我们在写CSS的时候会使用了一些比较罗嗦的语句，比如这句：<br/><br/><br/><br/>margin-top: 10px;<br/>margin-right: 20px;<br/>margin-bottom: 10px;<br/>margin-left: 20px;<br/><br/><br/>你可以将它简化为：<br/><br/><br/>margin: 10px 20px 10px 20px;<br/><br/><br/>又或者这句：<br/><br/><br/>&lt;p class=&#34;decorated&#34;&gt;A paragraph of decorated text&lt;/p&gt;<br/>&lt;p class=&#34;decorated&#34;&gt;Second paragraph&lt;/p&gt;<br/>&lt;p class=&#34;decorated&#34;&gt;Third paragraph&lt;/p&gt;<br/>&lt;p class=&#34;decorated&#34;&gt;Forth paragraph&lt;/p&gt;<br/><br/><br/>可以用div来包含：<br/><br/><br/>&lt;div class=&#34;decorated&#34;&gt;<br/>&lt;p&gt;A paragraph of decorated text&lt;/p&gt;<br/>&lt;p&gt;Second paragraph&lt;/p&gt;<br/>&lt;p&gt;Third paragraph&lt;/p&gt;<br/>&lt;p&gt;Forth paragraph&lt;/p&gt;<br/>&lt;/div&gt;<br/><br/><br/>简化CSS能去除冗余的属性，提高运行效率。如果你写好CSS后懒得去做简化，你可以使用一些在线的简化CSS工具，比如CleanCSS。<br/><br/>四、网址后加斜杠<br/><br/>有些网址，比如&#34;www.kenengba.com/220&#34;，当服务器收到这样一个地址请求的时候，它需要花费时间去确定这个地址的文件类型。如果220是一个目录，不妨在网址后多加一个斜杠，让其变成www.kenengba.com/220/，这样服务器就能一目了然地知道要访问该目录下的index或default文件，从而节省了加载时间。<br/><br/>五、标明高度和宽度<br/><br/>这点很重要，但很多人由于懒惰或其它原因，总是将其忽视。当你在网页上添加图片或表格时，你应该指定它们的高度和宽度，也就是height和width参数。如果浏览器没有找到这两个参数，它需要一边下载图片一边计算大小，如果图片很多，浏览器需要不断地调整页面。这不但影响速度，也影响浏览体验。<br/><br/>下面是一个比较友好的图片代码：<br/><br/><br/>&lt;img id=&#34;moon&#34; height=&#34;200&#34; width=&#34;450&#34; src=&#34;<a href="http://www.kenengba.com/moon.png" target="_blank" rel="external">http://www.kenengba.com/moon.png</a>&#34; alt=&#34;moon image&#34; /&gt;<br/><br/><br/>当浏览器知道了高度和宽度参数后，即使图片暂时无法显示，页面上也会腾出图片的空位，然后继续加载后面的内容。从而加载时间快了，浏览体验也更好了。<br/><br/>六、减少http请求<br/><br/>当浏览者打开某个网页，浏览器会发出很多对象请求（图像、脚本等等），视乎网络延时情况，每个对象加载都会有所延迟。如果网页上对象很多，这可以需要花费大量的时间。<br/><br/>因此，要为http请求减负。如何减负？<br/><br/>1、去除一些不必要的对象。<br/><br/>2、将临近的两张图片合成一张。<br/><br/>3、合并CSS<br/><br/>看看下面这段代码，需要加载三个CSS：<br/><br/><br/>&lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;/body.css&#34; /&gt;<br/>&lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;/side.css&#34; /&gt;<br/>&lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;/footer.css&#34; /&gt;<br/><br/><br/>我们可以将其合成一个：<br/><br/><br/>&lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;/style.css&#34; /&gt;<br/><br/><br/>从而减少http请求。<br/><br/>七、其它小技巧（译者添加）<br/><br/>1、去除不必要加载项。<br/><br/>2、如果在网页上嵌入了其它网站的widget，如果有选择余地，一定要选择速度快的。<br/><br/>3、尽量用图片代替flash，这对SEO也有好处。<br/><br/>4、有些内容可以静态化就将其静态化，以减少服务器的负担。<br/><br/>5、统计代码放在页尾。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=113" /> 
	  <id>http://www.nmju.net/default.asp?id=113</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[大型网站架构演变和知识体系]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-11-04T18:49:48+08:00</updated>
	  <published>2008-11-04T18:49:48+08:00</published>
		  <summary type="html"><![CDATA[<div id="main">
<div class="post">
<div class="postText">
<p class="MsoNormal"><span style="font-family: 宋体">之前也有一些介绍大型网站架构演变的文章，例如</span><span lang="EN-US">LiveJournal</span><span style="font-family: 宋体">的、</span><span lang="EN-US">ebay</span><span style="font-family: 宋体">的，都是非常值得参考的，不过感觉他们讲的更多的是每次演变的结果，而没有很详细的讲为什么需要做这样的演变，再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术，于是有了写这篇文章的想法，在这篇文章中</span> <span style="font-family: 宋体">将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的知识体系，希望能给想从事互联网行业的同学一点初步的概念，</span><span lang="EN-US">:)</span><span style="font-family: 宋体">，文中的不对之处也请各位多给点建议，让本文真正起到抛砖引玉的效果。</span><span lang="EN-US"><br />
&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体"><span style="font-family: 宋体">架构演变第一步：物理分离</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">和数据库</span></span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">最开始，由于某些想法，于是在互联网上搭建了一个网站，这个时候甚至有可能主机都是租借的，但由于这篇文章我们只关注架构的演变历程，因此就假设这个时候</span> <span style="font-family: 宋体">已经是托管了一台主机，并且有一定的带宽了，这个时候由于网站具备了一定的特色，吸引了部分人访问，逐渐你发现系统的压力越来越高，响应速度越来越慢，而这个时候比较明显的是数据库和应用互相影响，应用出问题了，数据库也很容易出现问题，而数据库出问题的时候，应用也容易出问题，于是进入了第一步演变阶段：将应用和数据库从物理上分离，变成了两台机器，这个时候技术上没有什么新的要求，但你发现确实起到效果了，系统又恢复到以前的响应速度了，并且支撑住了更高的流量，并且不会因为数据库和应用形成互相的影响。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" o:ole="" style="width: 144.75pt; height: 73.5pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image001.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="99" alt="" width="195" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步架构演变对技术上的知识体系基本没有要求。</span><span lang="EN-US"><br />
&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体">架构演变第二步：增加页面缓存</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">好景不长，随着访问的人越来越多，你发现响应速度又开始变慢了，查找原因，发现是访问数据库的操作太多，导致数据连接竞争激烈，所以响应变慢，但数据库连</span> <span style="font-family: 宋体">接又不能开太多，否则数据库机器压力会很高，因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力，这个时候首先也许会选择采用</span><span lang="EN-US">squid </span><span style="font-family: 宋体">等类似的机制来将系统中相对静态的页面（例如一两天才会有更新的页面）进行缓存（当然，也可以采用将页面静态化的方案），这样程序上可以不做修改，就能够</span> <span style="font-family: 宋体">很好的减少对</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">的压力以及减少数据库连接资源的竞争，</span><span lang="EN-US">OK</span><span style="font-family: 宋体">，于是开始采用</span><span lang="EN-US">squid</span><span style="font-family: 宋体">来做相对静态的页面的缓存。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1026" type="#_x0000_t75" o:ole="" style="width: 144.75pt; height: 116.25pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image003.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="156" alt="" width="195" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">前端页面缓存技术，例如</span><span lang="EN-US">squid</span><span style="font-family: 宋体">，如想用好的话还得深入掌握下</span><span lang="EN-US">squid</span><span style="font-family: 宋体">的实现方式以及缓存的失效算法等。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体">架构演变第三步：增加页面片段缓存</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">增加了</span><span lang="EN-US">squid</span><span style="font-family: 宋体">做缓存后，整体系统的速度确实是提升了，</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">的压力也开始下降了，但随着访问量的增加，发现系统又开始变的有些慢了，在尝</span> <span style="font-family: 宋体">到了</span><span lang="EN-US">squid</span><span style="font-family: 宋体">之类的动态缓存带来的好处后，开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢，因此考虑采用类似</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">之类的页面片段缓存策略，</span><span lang="EN-US">OK</span><span style="font-family: 宋体">，于是开始采用</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">来做动态页面中相对静态的片段部分的缓存。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1027" type="#_x0000_t75" o:ole="" style="width: 252pt; height: 175.5pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image005.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="235" alt="" width="337" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">页面片段缓存技术，例如</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">等，想用好的话同样需要掌握</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">的实现方式等；</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体">架构演变第四步：数据缓存</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">在采用</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">之类的技术再次提高了系统的缓存效果后，系统的压力确实进一步降低了，但同样，随着访问量的增加，系统还是开始变慢，经过查找，可能会发现系</span> <span style="font-family: 宋体">统中存在一些重复获取数据信息的地方，像获取用户信息等，这个时候开始考虑是不是可以将这些数据信息也缓存起来呢，于是将这些数据缓存到本地内存，改变完毕后，完全符合预期，系统的响应速度又恢复了，数据库的压力也再度降低了不少。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1028" type="#_x0000_t75" o:ole="" style="width: 255pt; height: 192.75pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image007.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="258" alt="" width="341" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">缓存技术，包括像</span><span lang="EN-US">Map</span><span style="font-family: 宋体">数据结构、缓存算法、所选用的框架本身的实现机制等。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体"><span style="font-family: 宋体">架构演变第五步：</span> <span style="font-family: 宋体">增加</span><span lang="EN-US">webserver</span></span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">好景不长，发现随着系统访问量的再度增加，</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">机器的压力在高峰期会上升到比较高，这个时候开始考虑增加一台</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">，这也是为了同时解决可用性的问题，避免单台的</span><span lang="EN-US">webserver down</span><span style="font-family: 宋体">机的话就没法使用了，在做了这些考虑后，决定增加一台</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">，增加一台</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">时，会碰到一些问题，典型的有：</span><span lang="EN-US"><br />
1</span><span style="font-family: 宋体">、如何让访问分配到这两台机器上，这个时候通常会考虑的方案是</span><span lang="EN-US">Apache</span><span style="font-family: 宋体">自带的负载均衡方案，或</span><span lang="EN-US">LVS</span><span style="font-family: 宋体">这类的软件负载均衡方案；</span><span lang="EN-US"><br />
2</span><span style="font-family: 宋体">、如何保持状态信息的同步，例如用户</span><span lang="EN-US">session</span><span style="font-family: 宋体">等，这个时候会考虑的方案有写入数据库、写入存储、</span><span lang="EN-US">cookie</span><span style="font-family: 宋体">或同步</span><span lang="EN-US">session</span><span style="font-family: 宋体">信息等机制等；</span><span lang="EN-US"><br />
3</span><span style="font-family: 宋体">、如何保持数据缓存信息的同步，例如之前缓存的用户数据等，这个时候通常会考虑的机制有缓存同步或分布式缓存；</span><span lang="EN-US"><br />
4</span><span style="font-family: 宋体">、如何让上传文件这些类似的功能继续正常，这个时候通常会考虑的机制是使用共享文件系统或存储等；</span><span lang="EN-US"><br />
</span><span style="font-family: 宋体">在解决了这些问题后，终于是把</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">增加为了两台，系统终于是又恢复到了以往的速度。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1029" type="#_x0000_t75" o:ole="" style="width: 255pt; height: 192.75pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image009.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="244" alt="" width="341" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">负载均衡技术（包括但不限于硬件负载均衡、软件负载均衡、负载算法、</span><span lang="EN-US">linux</span><span style="font-family: 宋体">转发协议、所选用的技术的实现细节等）、主备技术（包括但不限于</span><span lang="EN-US">ARP</span><span style="font-family: 宋体">欺骗、</span><span lang="EN-US">linux heart-beat</span><span style="font-family: 宋体">等）、状态信息或缓存同步技术（包括但不限于</span><span lang="EN-US">Cookie</span><span style="font-family: 宋体">技术、</span><span lang="EN-US">UDP</span><span style="font-family: 宋体">协议、状态信息广播、所选用的缓存同步技术的实现细节等）、共享文件技术（包括但不限于</span><span lang="EN-US">NFS</span><span style="font-family: 宋体">等）、存储技术（包括但不限于存储设备等）。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体">架构演变第六步：分库</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">享受了一段时间的系统访问量高速增长的幸福后，发现系统又开始变慢了，这次又是什么状况呢，经过查找，发现数据库写入、更新的这些操作的部分数据库连接的</span> <span style="font-family: 宋体">资源竞争非常激烈，导致了系统变慢，这下怎么办呢，此时可选的方案有数据库集群和分库策略，集群方面像有些数据库支持的并不是很好，因此分库会成为比较普遍的策略，分库也就意味着要对原有程序进行修改，一通修改实现分库后，不错，目标达到了，系统恢复甚至速度比以前还快了。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1030" type="#_x0000_t75" o:ole="" style="width: 255pt; height: 192.75pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image011.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="243" alt="" width="341" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步更多的是需要从业务上做合理的划分，以实现分库，具体技术细节上没有其他的要求；</span></p>
<p class="MsoNormal"><font face="宋体">但同时随着数据量的增大和分库的进行，在数据库的设计、调优以及维护上需要做的更好，因此对这些方面的技术还是提出了很高的要求的。</font></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体"><span style="font-family: 宋体">架构演变第七步：分表、</span><span lang="EN-US">DAL</span><span style="font-family: 宋体">和分布式缓存</span></span></strong><span lang="EN-US"><br />
</span><span style="font-family: 宋体">随着系统的不断运行，数据量开始大幅度增长，这个时候发现分库后查询仍然会有些慢，于是按照分库的思想开始做分表的工作，当然，这不可避免的会需要对程序</span> <span style="font-family: 宋体">进行一些修改，也许在这个时候就会发现应用自己要关心分库分表的规则等，还是有些复杂的，于是萌生能否增加一个通用的框架来实现分库分表的数据访问，这个在</span><span lang="EN-US">ebay</span><span style="font-family: 宋体">的架构中对应的就是</span><span lang="EN-US">DAL</span><span style="font-family: 宋体">，这个演变的过程相对而言需要花费较长的时间，当然，也有可能这个通用的框架会等到分表做完后才开始做，同时，在这个阶段可</span> <span style="font-family: 宋体">能会发现之前的缓存同步方案出现问题，因为数据量太大，导致现在不太可能将缓存存在本地，然后同步的方式，需要采用分布式缓存方案了，于是，又是一通考察和折磨，终于是将大量的数据缓存转移到分布式缓存上了。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1031" type="#_x0000_t75" o:ole="" style="width: 255.75pt; height: 328.5pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image013.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="439" alt="" width="342" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">分表更多的同样是业务上的划分，技术上涉及到的会有动态</span><span lang="EN-US">hash</span><span style="font-family: 宋体">算法、</span><span lang="EN-US">consistent hash</span><span style="font-family: 宋体">算法等；</span></p>
<p class="MsoNormal"><span lang="EN-US">DAL</span><span style="font-family: 宋体">涉及到比较多的复杂技术，例如数据库连接的管理（超时、异常）、数据库操作的控制（超时、异常）、分库分表规则的封装等；</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体"><span style="font-family: 宋体">架构演变第八步：增加更多的</span><span lang="EN-US">webserver</span></span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">在做完分库分表这些工作后，数据库上的压力已经降到比较低了，又开始过着每天看着访问量暴增的幸福生活了，突然有一天，发现系统的访问又开始有变慢的趋势</span> <span style="font-family: 宋体">了，这个时候首先查看数据库，压力一切正常，之后查看</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">，发现</span><span lang="EN-US">apache</span><span style="font-family: 宋体">阻塞了很多的请求，而应用服务器对每个请求也是比较快的，看来</span> <span style="font-family: 宋体">是请求数太高导致需要排队等待，响应速度变慢，这还好办，一般来说，这个时候也会有些钱了，于是添加一些</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">服务器，在这个添加</span><span lang="EN-US"> webserver</span><span style="font-family: 宋体">服务器的过程，有可能会出现几种挑战：</span><span lang="EN-US"><br />
1</span><span style="font-family: 宋体">、</span><span lang="EN-US">Apache</span><span style="font-family: 宋体">的软负载或</span><span lang="EN-US">LVS</span><span style="font-family: 宋体">软负载等无法承担巨大的</span><span lang="EN-US">web</span><span style="font-family: 宋体">访问量（请求连接数、网络流量等）的调度了，这个时候如果经费允许的话，会采取的方案是购</span> <span style="font-family: 宋体">买硬件负载，例如</span><span lang="EN-US">F5</span><span style="font-family: 宋体">、</span><span lang="EN-US">Netsclar</span><span style="font-family: 宋体">、</span><span lang="EN-US">Athelon</span><span style="font-family: 宋体">之类的，如经费不允许的话，会采取的方案是将应用从逻辑上做一定的分类，然后分散到不同的软负载集群中；</span><span lang="EN-US"><br />
2</span><span style="font-family: 宋体">、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈，需要进行改进，也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等；</span><span lang="EN-US"><br />
</span><span style="font-family: 宋体">在做完这些工作后，开始进入一个看似完美的无限伸缩的时代，当网站流量增加时，应对的解决方案就是不断的添加</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1032" type="#_x0000_t75" o:ole="" style="width: 348.75pt; height: 330pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image015.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="441" alt="" width="466" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">到了这一步，随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高，这个时候要求对所采用的技术都要有更为深入的理解，并需要根据网站的需求来做更加定制性质的产品。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体">架构演变第九步：数据读写分离和廉价存储方案</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">突然有一天，发现这个完美的时代也要结束了，数据库的噩梦又一次出现在眼前了，由于添加的</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">太多了，导致数据库连接的资源还是不够用，而这个时候又已经分库分表了，开始分析数据库的压力状况，可能会发现数据库的读写比很高，这个时候通常会想到数据读写分离的方案，当然，这个方案要实现并不</span> <span style="font-family: 宋体">容易，另外，可能会发现一些数据存储在数据库上有些浪费，或者说过于占用数据库资源，因此在这个阶段可能会形成的架构演变是实现数据读写分离，同时编写一些更为廉价的存储方案，例如</span><span lang="EN-US">BigTable</span><span style="font-family: 宋体">这种。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1033" type="#_x0000_t75" o:ole="" style="width: 415.5pt; height: 297.75pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image017.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="398" alt="" width="555" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">数据读写分离要求对数据库的复制、</span><span lang="EN-US">standby</span><span style="font-family: 宋体">等策略有深入的掌握和理解，同时会要求具备自行实现的技术；</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">廉价存储方案要求对</span><span lang="EN-US">OS</span><span style="font-family: 宋体">的文件存储有深入的掌握和理解，同时要求对采用的语言在文件这块的实现有深入的掌握。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 14pt; font-family: 宋体">架构演变第十步：进入大型分布式应用时代和廉价服务器群梦想时代</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体">经过上面这个漫长而痛苦的过程，终于是再度迎来了完美的时代，不断的增加</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">就可以支撑越来越高的访问量了，对于大型网站而言，人气的重要毋</span> <span style="font-family: 宋体">庸置疑，随着人气的越来越高，各种各样的功能需求也开始爆发性的增长，这个时候突然发现，原来部署在</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">上的那个</span><span lang="EN-US">web</span><span style="font-family: 宋体">应用已经非常庞大</span> <span style="font-family: 宋体">了，当多个团队都开始对其进行改动时，可真是相当的不方便，复用性也相当糟糕，基本是每个团队都做了或多或少重复的事情，而且部署和维护也是相当的麻烦，</span> <span style="font-family: 宋体">因为庞大的应用包在</span><span lang="EN-US">N</span><span style="font-family: 宋体">台机器上复制、启动都需要耗费不少的时间，出问题的时候也不是很好查，另外一个更糟糕的状况是很有可能会出现某个应用上的</span><span lang="EN-US">bug</span><span style="font-family: 宋体">就导</span> <span style="font-family: 宋体">致了全站都不可用，还有其他的像调优不好操作（因为机器上部署的应用什么都要做，根本就无法进行针对性的调优）等因素，根据这样的分析，开始痛下决心，将</span> <span style="font-family: 宋体">系统根据职责进行拆分，于是一个大型的分布式应用就诞生了，通常，这个步骤需要耗费相当长的时间，因为会碰到很多的挑战：</span><span lang="EN-US"><br />
1</span><span style="font-family: 宋体">、拆成分布式后需要提供一个高性能、稳定的通信框架，并且需要支持多种不同的通信和远程调用方式；</span><span lang="EN-US"><br />
2</span><span style="font-family: 宋体">、将一个庞大的应用拆分需要耗费很长的时间，需要进行业务的整理和系统依赖关系的控制等；</span><span lang="EN-US"><br />
3</span><span style="font-family: 宋体">、如何运维（依赖管理、运行状况管理、错误追踪、调优、监控和报警等）好这个庞大的分布式应用。</span><span lang="EN-US"><br />
</span><span style="font-family: 宋体">经过这一步，差不多系统的架构进入相对稳定的阶段，同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量，结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal"><span lang="EN-US"><v:shape id="_x0000_i1034" type="#_x0000_t75" o:ole="" style="width: 414.75pt; height: 322.5pt"><v:imagedata src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image019.emz" o:title=""></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img height="431" alt="" width="554" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG" /><br />
&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">这一步涉及的知识体系非常的多，要求对通信、远程调用、消息机制等有深入的理解和掌握，要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体">运维这块涉及的知识体系也非常的多，多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span><span style="font-family: 宋体">说起来确实不怎么费力，整个网站架构的经典演变过程都和上面比较的类似，当然，每步采取的方案，演变的步骤有可能有不同，另外，由于网站的业务不同，会有不同的专业技术的需求，这篇</span><span lang="EN-US">blog</span><span style="font-family: 宋体">更多的是从架构的角度来讲解演变的过程，当然，其中还有很多的技术也未在此提及，像数据库集群、数据挖掘、搜索等，但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、</span><span lang="EN-US">CDN</span><span style="font-family: 宋体">镜像等来支撑更大的流量，因此在真实的发展过程中还会有很多的不同，另外一个大型网站要做到的远远不仅仅上面这些，还有像安全、运维、运营、服务、存储等，要做好一个大型的网站真的很不容易，写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍，</span><span lang="EN-US">:)</span><span style="font-family: 宋体">。</span></p>
<br />
ps:最后附上几篇LiveJournal架构演变的文章：<br />
从LiveJournal后台发展看大规模网站性能优化方法<br />
http://blog.zhangjianfeng.com/article/743&nbsp;&nbsp;&nbsp; <br />
另外从这里：http://www.danga.com/words/大家可以找到更多关于现在LiveJournal网站架构的介绍。<br />
　</div>
</div>
</div>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=109" /> 
	  <id>http://www.nmju.net/default.asp?id=109</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[从实施CMM-3再看CMM—CMM学习心得]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-10-05T18:22:08+08:00</updated>
	  <published>2008-10-05T18:22:08+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;<a onclick="javascript:tagshow(event, 'CMM');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">CMM</font></strong></u></a>三级认证；在进行基于CMM过程改进<a onclick="javascript:tagshow(event, '%B9%FD%B3%CC');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">过程</font></strong></u></a>中，自己对CMM有了一些心得、体会，总结如下希望大家指正。如果有意见请发邮件到: heqingemail@163.net<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>CMM是优雅的</strong><br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;CMM将<a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">管理</font></strong></u></a>理论和<a onclick="javascript:tagshow(event, '%C8%ED%BC%FE');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">软件</font></strong></u></a><a onclick="javascript:tagshow(event, '%CA%B5%BC%F9');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">实践</font></strong></u></a>紧密结合，但是整个结构又如此清晰完整；是一个完美的结构，这个结构是美的，是一种强大、庄重的理论美。<br />
&nbsp;&nbsp;&nbsp;&nbsp;这个完美的分段式结构在CMMI中继续采用，并且更加精致和完善。<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM的结构主要包括如下几部分。<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="16%" bgcolor="#c0c0c0"><b>
            <p align="center">结构</p>
            </b></td>
            <td class="hui14" valign="top" width="84%" bgcolor="#c0c0c0"><b>
            <p align="center">说明</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">等级</td>
            <td class="hui14" valign="top" width="84%">CMM划分为五个等级，描述了每个等级的组织过程特征，每个等级代表一种组织的过程能力等级；指明了组织级过程改进的整体策略（关注于那些过程域）</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">关键过程域</td>
            <td class="hui14" valign="top" width="84%"><clk></clk>每个等级包括几个过程域，说明了在一个等级中必要的过程；是一组学科或者逻辑上紧密联系的活动的集合</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">目标</td>
            <td class="hui14" valign="top" width="84%">每个过程域均有自己的目标，这些目标用于支持过程能力等级特征</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">关键实践</td>
            <td class="hui14" valign="top" width="84%">组成一个过程域的活动，从逻辑上描述了<a onclick="javascript:tagshow(event, '%CA%B5%CF%D6');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">实现</font></strong></u></a>这个过程域目标必须或者推荐执行的活动；属于具体的操作指导</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="16%">公共特性</td>
            <td class="hui14" valign="top" width="84%">关键实践按照公共特性被组织起来，这些公共特性反映了过程有效执行的特征</td>
        </tr>
    </tbody>
</table>
<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;除第一级外，CMM的每一级是按完全相同的结构构成的。每一个成熟度等级都是通过一些(2&mdash;7个)关键过程域（KPA）描述的，每一个关键过程域都规定了一些目标，过程必须吻合这些目标以满足这个关键过程域。这些关键过程域规定了一些重要领域，机构应该关注以使它的过程向成熟等级发展。从整体来说软件能力成熟度级别从低到高的变化代表了企业的生产活动由高风险低效率到高<a onclick="javascript:tagshow(event, '%D6%CA%C1%BF');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">质量</font></strong></u></a>、高生产率的进展。 整个CMM模型通过等级、关键过程域、公共特性和过程改进理论联系起来；通过关键过程域、关键实践和具体实践联系起来，提供具体的说明和指导。<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面对CMM结构的各个组成部分分别进行说明。<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;CMM的等级划分</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;Crosby(克罗斯比)最早在《质量是免费》中提出了管理过程等级的划分，也是为五级。<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM基于全面质量管理的理论，参照当时软件工程的实践将过程能力划分为五个等级，用于评估一个软件组织的过程成熟度。<br />
&nbsp;&nbsp;&nbsp;&nbsp;每个成熟度等级说明了组织软件<a onclick="javascript:tagshow(event, '%BF%AA%B7%A2');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">开发</font></strong></u></a>过程的特征，如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="12%" bgcolor="#c0c0c0"><b>
            <p align="center">等级</p>
            </b></td>
            <td class="hui14" valign="top" width="88%" bgcolor="#c0c0c0"><b>
            <p align="center">等级特征</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级一</td>
            <td class="hui14" valign="top" width="88%"><clk></clk>没有一系列的准则来指导<a onclick="javascript:tagshow(event, '%CF%EE%C4%BF');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">项目</font></strong></u></a>的执行，一个项目的结果主要取决于依靠编程组和项目负责人的能力，因此，其结果是难于预料的</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级二</td>
            <td class="hui14" valign="top" width="88%">有纪律的，可以重复以前项目的成功经验，实现部分的可视性</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级三</td>
            <td class="hui14" valign="top" width="88%">项目活动是标准和一致的，不同项目采用相同的标准，从而保持稳定的<a onclick="javascript:tagshow(event, '%D0%D4%C4%DC');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">性能</font></strong></u></a></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级四</td>
            <td class="hui14" valign="top" width="88%">对过程建立了度量，性能只在一定范围内变动，从而可以进行有效的预测</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="12%">等级五</td>
            <td class="hui14" valign="top" width="88%">为了提高过程能力不断进行改进活动，并可以度量其结果</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;过程能力描述如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="26%" bgcolor="#c0c0c0" height="31">
            <div align="center"><b>管理内容<br />
            能力等级</b></div>
            </td>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center"><a onclick="javascript:tagshow(event, '%CF%EE%C4%BF%B9%DC%C0%ED');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">项目管理</font></strong></u></a></p>
            </b></td>
            <td class="hui14" valign="top" width="21%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">组织过程管理</p>
            </b></td>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">定量管理</p>
            </b></td>
            <td class="hui14" valign="top" width="19%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">不断改进</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级一：初始</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="21%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级二：可重复</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级三：已定义</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级四：定量管理</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="19%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="26%">等级五：不断改进</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="21%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="19%" bgcolor="#ff0000">　</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;关键过程域（KPA） SEI根据实践经验确认关键的软件工程领域，这些过程域作为软件生产活动的关键部分被选择出来，是评价和形成过程能力的主要方面。<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;可以将这些关键过程域归为三类：管理过程、组织过程、工程过程。其中管理过程包括项目管理的内容以及一些基础内容。<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="14%" bgcolor="#c0c0c0"><b>
            <p align="center">类别</p>
            </b></td>
            <td class="hui14" valign="top" width="86%" bgcolor="#c0c0c0"><b>
            <p align="center">过程域</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%" rowspan="2">
            <p align="center">管理过程</p>
            </td>
            <td class="hui14" valign="top" width="86%">项目管理：<a onclick="javascript:tagshow(event, '%D0%E8%C7%F3');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">需求</font></strong></u></a>管理、软件项目策划、软件项目跟踪和监督、软件子合同管理、<br />
            集成软件管理、组间协调、定量过程管理</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="86%">支持：软件<a onclick="javascript:tagshow(event, '%C5%E4%D6%C3%B9%DC%C0%ED');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">配置管理</font></strong></u></a>、软件质量保证</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">组织过程</td>
            <td class="hui14" valign="top" width="86%">
            <p>组织过程焦点、组织过程定义、培训大纲、定量过程管理</p>
            <p><clk></clk><a onclick="javascript:tagshow(event, '%BC%BC%CA%F5');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">技术</font></strong></u></a>变革管理、过程变更管理</p>
            </td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">工程过程</td>
            <td class="hui14" valign="top" width="86%">软件产品工程、同行评审、软件质量管理、缺陷预防</td>
        </tr>
    </tbody>
</table>
<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;目标</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;每个关键过程域包括两个或者四个的目标；这些目标用于描述这个关键过程域的意义和价值，是对过程进行评价和改进的标准；在某个等级上所有关键过程域的目标集合构成了这个等级的特征；每个目标均有一组关键实践用于实现这个目标，可以说目标是关键实践的选择依据，作为评估标准具有如下作用：<br />
目标用来确定一个机构或项目组是否有效地执行了该KPA<br />
&nbsp;&nbsp;&nbsp;&nbsp;目标概述了该KPA包括的关键实践（KP）<br />
&nbsp;&nbsp;&nbsp;&nbsp;在为适应关键实践而采取选择时，目标能用来确定这种适应是否有效<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>公共特性</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;五个公共特性：方针、能力、活动、测量、验证<br />
&nbsp;&nbsp;&nbsp;&nbsp;这是企业管理的五个主要环节；一个好的管理要建立大政&ldquo;方针&rdquo;的明确承诺和要求、要提供必要的资源和&ldquo;能力&rdquo;，这样才能进行必要的&ldquo;活动&rdquo;，要&ldquo;验证&rdquo;活动被执行（类似于QA），要对活动进行&ldquo;测量&rdquo;保证了解活动的情况和质量（类似于QC）。<br />
<br />
<img title="点击图片可在新窗口打开" height="424" src="http://www.testage.net/attachments/2008/03/31427_200803271133461.gif" width="551" style="cursor: pointer" alt="" /><br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="14%" bgcolor="#c0c0c0"><b>
            <p align="center">公共特性</p>
            </b></td>
            <td class="hui14" valign="top" width="15%" bgcolor="#c0c0c0"><b>
            <p align="center">中文</p>
            </b></td>
            <td class="hui14" valign="top" width="71%" bgcolor="#c0c0c0"><b>
            <p align="center">说明</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">CO</td>
            <td class="hui14" valign="top" width="15%">执行承诺</td>
            <td class="hui14" valign="top" width="71%">要怎样？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">AB</td>
            <td class="hui14" valign="top" width="15%">能力</td>
            <td class="hui14" valign="top" width="71%">能做到吗？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">AC</td>
            <td class="hui14" valign="top" width="15%">活动</td>
            <td class="hui14" valign="top" width="71%">做什么？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">VE</td>
            <td class="hui14" valign="top" width="15%">验证</td>
            <td class="hui14" valign="top" width="71%">做了没有？</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="14%">ME</td>
            <td class="hui14" valign="top" width="15%">测量</td>
            <td class="hui14" valign="top" width="71%">做的怎样？</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;这些公共特性反映了一个过程被执行的各种要素，关键实践按照这样分类非常有利于具体的<a onclick="javascript:tagshow(event, '%CA%B5%CA%A9');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">实施</font></strong></u></a>。 执行承诺：实施保证是企业为了建立和实施相应KPA所必须采取的行动，这些行动主要牵涉到企业范围的政策和高层管理的责任。<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;能力：实施能力描述为了使某软件过程得以始终如一地执行的必须在项目或企业中存在的先决条件，是企业实施KPA的前提条件。企业必须采取措施，在满足了这些条件后，才有可能执行KPA的实践活动。实施能力关注于<a onclick="javascript:tagshow(event, '%CF%EE%C4%BF%BC%C6%BB%AE');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">项目计划</font></strong></u></a>的实践；资源的配置；责任的布置与授权；以及各种有关的培训等，这些都是为了执行这个关键过程域的活动而对特定人以及作为整体的机构的能力开发起非常重要作用的事务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;活动：实现某个关键过程域所必需的岗位、活动（按照计划或按照规程活动）、产品等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;验证：监督管理过程的活动，一般包括高级管理者、项目经理、SQA的进度管理<br />
&nbsp;&nbsp;&nbsp;&nbsp;测量：说明这个过程活动的状态和质量的信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>关键实践 （KP）</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;在关键过程域的目标之下，有一组相关联的关键实践（Key Practices），这些关键实践是评价一个组织过程能力的某种指示器，可以基本等价的说明过程能力。<br />
&nbsp;&nbsp;&nbsp;&nbsp;一个过程域的所有关键实践按照公共特性组织起来；这些关键实践一般情况下是达到目标所必要的；因为CMM是作为评估标准出现的，所以是&ldquo;必要&rdquo;的才能保证评估的标准。子实践和说明中，罗列了较多的推荐的最佳实践。<br />
&nbsp;&nbsp;&nbsp;&nbsp;关键实践的几个特点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;描述了对有效执行和制度化该KPA起主要作用的从属活动和基础构造<br />
&nbsp;&nbsp;&nbsp;&nbsp;因为CMM是作为评估标准出现的，所以规定做什么，而不去规定如何实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;实现该KPA的目标所允许做的实践活动<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>基于过程模型(CMM)的改进</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>CMM模型的过程改进价值</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;过程改进是从全面质量管理理论中派生出来的；基础是建立稳定的过程、<a onclick="javascript:tagshow(event, '%B7%D6%CE%F6');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">分析</font></strong></u></a>过程、改进过程；目标是增进过程效率和过程质量；通过过程度量的手段（统计过程控制），来量化过程、进行控制，进行预测。<br />
CMM的<a onclick="javascript:tagshow(event, '%BF%F2%BC%DC');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">框架</font></strong></u></a>结构具有双重属性。一方面，它是描述性的模型，这点可以从它对那些当一个企业处于某一个特定的能力成熟度级别时所要求具备的必不可少的各种特性的描述看出。另一方面，它又是指示性的模型，这点可以从它以详细的实践活动来说明一个正在执行政府大规模软件合同的企业在处于某一个特定的能力成熟度级别时的特征的表达方式看出来。 CMM这种双重属性的目的是要有意的使它处于一个适当的抽象程度，从而避免不适当地限制一个企业如何去改进它的软件过程。CMM只描述软件过程改进要进行哪些方面的行动，要满足那些目标，但却不指定具体怎样去做。尽管软件机构可以用不同的方式实现CMM。但是要将CMM的提出的特性与软件开发中现有的过程联系起来是相当困难的。我们在使用CMM时必须牢记这个特点：CMM只指明要做什么，但不规定如何去做。因此我们可以选用我们认为最适当的办法去完成所要求做的事。<br />
过程模型集合了领域内必要实践、补充了最佳实践，并指明了改进的先后顺序。所以可以认为CMM对过程改进提供了足够的支持和帮助<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>过程改进路径说明</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;首先分析各个等级之间的差距和区别，然后明确向更高等级改进的主要方面，并结合CMM的关键过程域就可以得到过程改进的基本路径了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;过程能力描述如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="27%" bgcolor="#c0c0c0" height="31">
            <div align="center"><b>管理内容<br />
            能力等级</b></div>
            </td>
            <td class="hui14" valign="top" width="18%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">项目管理</p>
            </b></td>
            <td class="hui14" valign="top" width="20%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">组织过程管理</p>
            </b></td>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">定量管理</p>
            </b></td>
            <td class="hui14" valign="top" width="18%" bgcolor="#c0c0c0" height="31"><b>
            <p align="center">不断改进</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级一：初始</td>
            <td class="hui14" valign="top" width="18%">　</td>
            <td class="hui14" valign="top" width="20%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级二：可重复</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级三：已定义</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级四：定量管理</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="18%">　</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="27%">等级五：不断改进</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="20%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="17%" bgcolor="#ff0000">　</td>
            <td class="hui14" valign="top" width="18%" bgcolor="#ff0000">　</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;从上图，可以发现各个等级之间的差距，差距汇总如下：<br />
<table cellspacing="1" cellpadding="7" width="98%" align="center" border="1">
    <tbody>
        <tr>
            <td class="hui14" valign="top" width="17%" bgcolor="#c0c0c0"><b>
            <p align="center">路径</p>
            </b></td>
            <td class="hui14" valign="top" width="83%" bgcolor="#c0c0c0"><b>
            <p align="center">说明</p>
            </b></td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">一级到二级</td>
            <td class="hui14" valign="top" width="83%">加强项目管理，实施支持过程</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">二级到三级</td>
            <td class="hui14" valign="top" width="83%">根据项目管理的经验，建立、稳定组织标准过程</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">三级到四级</td>
            <td class="hui14" valign="top" width="83%">在标准过程基础上建立针对性的度量体系；度量、稳定过程性能</td>
        </tr>
        <tr>
            <td class="hui14" valign="top" width="17%">四级到五级</td>
            <td class="hui14" valign="top" width="83%">根据度量的结果进行不断的改进</td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;可以看出为什么基于CMM的过程改进不能跨级进行，因为他们是依赖上一个等级的。尤其要避免的一种情况，就是跨域等级二，很多企业已开始就致力于组织级过程的建立，这个是比较危险的；软件生产主要还是一种项目，没有建立良好的项目管理基础，没有从项目中有效的积累经验，这样的改进容易失败。<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;广泛实施，成功<a onclick="javascript:tagshow(event, '%D3%A6%D3%C3');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">应用</font></strong></u></a></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;作为美国国防部（BOB）评估软件供应商的标准，作用显著。<br />
&nbsp;&nbsp;&nbsp;&nbsp;后来发现标准本身所明确的要求也是企业进行改进的良好指南。<br />
&nbsp;&nbsp;&nbsp;&nbsp;标准一旦可被确定，那么标准本身也就是进行改进的指南。<br />
&nbsp;&nbsp;&nbsp;&nbsp;作为过程改进的指南发挥更加广泛用途，影响深远。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>理解CMM需要注意以下问题</strong>　<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;它仅指明该做什么，而没有指明如何做，它不是<a onclick="javascript:tagshow(event, '%B7%BD%B7%A8');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">方法</font></strong></u></a>论，但我们在学习CMM时，可以从中学到分析问题的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;它仅指明该做的关键内容，仅描述软件过程的本质属性，而并非面面俱到。抓问题的主要方面的思想贯穿在整个CMM模型中<br />
<clk></clk>&nbsp;&nbsp;&nbsp;&nbsp;软件过程是指软件工程过程、软件管理过程和软件组织过程三者的有机结合。软件工程过程是我们理解的常规的软件的需求分析、<a onclick="javascript:tagshow(event, '%C9%E8%BC%C6');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">设计</font></strong></u></a>、编码、<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">测试</font></strong></u></a>等过程;软件管理过程是指为使软件工程过程顺利进行而实施的管理活动的集合。上述两个过程是以软件工程组为主的活动。软件组织的过程是企业级的对软件的组织活动,是以企业为主的活动<br />
&nbsp;&nbsp;&nbsp;&nbsp;它是从软件过程的角度考虑问题，而并非关注软件开发<a onclick="javascript:tagshow(event, '%B9%A4%BE%DF');" href="http://www.nmju.net/javascript:;" target="_self"><u><strong><font color="#000000">工具</font></strong></u></a>,与框架软件生存周期无关，也与所采用的开发技术无关<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM为改善整个企业的软件过程提供了指南，而并非针对某个具体项目。CMM并不能保证在这个过程框架下，产品开发百分之百的成功。产品的成功是多种因素的组合，例如市场等因素<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM1.1是针对大型软件企业(500人以上)的，对小型的软件企业(50人以下)需要裁减<br />
&nbsp;&nbsp;&nbsp;&nbsp;CMM认为过程的不断改进基于许多小的、步骤的进化而不是革命性的创新<br />
&nbsp;&nbsp;&nbsp;&nbsp;基于CMM的过程改善投资力度大、周期长，而技术投资则可能在短期内有较快回报。单独依靠技术改进可能在短期内取得较快回报，但最终可能一无所获。<br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=103" /> 
	  <id>http://www.nmju.net/default.asp?id=103</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Web 前端优化最佳实践之内容篇]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-07-01T09:43:58+08:00</updated>
	  <published>2008-07-01T09:43:58+08:00</published>
		  <summary type="html"><![CDATA[<p>Yahoo! 的 Exceptional Performance team 在 Web 前端方面作出了卓越的贡献。广为人知的<a href="http://developer.yahoo.com/performance/rules.html"><font color="#0082ff">优化规则</font></a>也由 13 条到 14 条，再到 20 条，乃至现在的 <a href="http://developer.yahoo.com/performance/"><font color="#0082ff">34 条</font></a>--真是与时俱进啊。最新的 34 条也针对不同的角度做了分类。</p>
<p>面向内容的优化规则目前有 10 条。</p>
<h4>1. 尽量减少 <acronym title="HyperText Transfer Protocol
">HTTP</acronym> 请求 (Make Fewer <acronym title="HyperText Transfer Protocol
">HTTP</acronym> Requests) </h4>
<p>作为第一条，可能也是最重要的一条。根据 Yahoo! 研究团队的数据分析，有很大一部分用户访问会因为这一条而取得最大受益。有几种常见的方法能切实减少 <acronym title="HyperText Transfer Protocol
">HTTP</acronym> 请求：</p>
<ul>
    <li>1) <strong>合并文件</strong>，比如把多个 <acronym title="Cascading Style Sheets
    ">CSS</acronym> 文件合成一个； </li>
    <li>2) <strong><acronym title="Cascading Style Sheets
    ">CSS</acronym> Sprites</strong> 利用 <acronym title="Cascading Style Sheets
    ">CSS</acronym> background 相关元素进行背景图<strong>绝对</strong>定位；参见：<a href="http://alistapart.com/articles/sprites"><font color="#0082ff">CSS Sprites: Image Slicing's Kiss of Death</font></a> </li>
    <li>3) <strong>图像地图</strong> </li>
    <li>4) <strong>内联图象</strong> 使用 <a href="http://tools.ietf.org/html/rfc2397"><font color="#0082ff">data: URL scheme</font></a> 在实际的页面嵌入图像数据.</li>
</ul>
<h4>2. 减少 <acronym title="Domain Name System
">DNS</acronym> 查找 (Reduce <acronym title="Domain Name System
">DNS</acronym> Lookups)</h4>
<p>必须明确的一点，DNS 查找的开销是很大的。另外，我倒是觉得这是 Yahoo! 所有站点的通病，Yahoo！主站点可能还不够明显，一些分站点，存在明显的类似问题。对于国内站点来说，如果过多的使用了站外的 Widget ，也很容易引起过多的 <acronym title="Domain Name System
">DNS</acronym> 查找问题。</p>
<h4>3. 避免重定向 (Avoid Redirects)</h4>
<p>不是绝对的避免，尽量减少。另外，应该注意一些不必要的重定向。比如对 Web 站点子目录的后面添加个 / (Slash) ，就能有效避免一次重定向。http://www.dbanotes.net/arch 与 http://www.dbanotes.net/arch<strong>/</strong> 二者之间是有差异的。如果是 Apache 服务器，通过配置 Alias 或mod_rewrite 或是 DirectorySlash 能够消除这个问题。</p>
<h4>4. 使得 Ajax 可缓存 (Make Ajax Cacheable)</h4>
<p>响应时间对 Ajax 来说至关重要，否则用户体验绝对好不到哪里去。提高响应时间的有效手段就是 Cache 。其它的一些优化规则对这一条也是有效的。 </p>
<h4>5. 延迟载入组件 (Post-load Components)</h4>
<h4>6. 预载入组件 (Preload Components)</h4>
<p>上面两条严格说来，都是属于<strong>异步</strong>这个思想灵活运用的事儿。</p>
<h4>7. 减少 <acronym title="Document Object Model
">DOM</acronym> 元素数量 (Reduce the Number of <acronym title="Document Object Model
">DOM</acronym> Elements)</h4>
<h4>8. 切分组件到多个域 (Split Components Across Domains)</h4>
<p>主要的目的是提高页面组件并行下载能力。但不要跨太多域名，否则就和第二条有些冲突了。</p>
<h4>9. 最小化 iframe 的数量 (Minimize the Number of iframes)</h4>
<p>熟悉 <acronym title="Search Engine Optimization
">SEO</acronym> 的朋友知道 iframe 是 <acronym title="Search Engine Optimization
">SEO</acronym> 的大忌。针对前端优化来说 iframe 有其好处，也有其弊端，一分为二看问题吧。</p>
<h4>10. 杜绝 http 404 错误 (No 404s)</h4>
<p>对页面链接的充分测试加上对 Web 服务器 error 日志的不断跟踪能有效减少 404 错误，亦能提升用户体验。值得一提的是，CSS 与 Java Script 引起的 404 错误因为定位稍稍&quot;难&quot;一点而往往容易被忽略。</p>
<p>这是内容篇的 10 条。应该说具体引导性的内容还不够详细。逐渐会根据自己的理解补充上来。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=81" /> 
	  <id>http://www.nmju.net/default.asp?id=81</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Ajax，浏览器崩溃的元凶？]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-06-30T08:52:21+08:00</updated>
	  <published>2008-06-30T08:52:21+08:00</published>
		  <summary type="html"><![CDATA[<p>今天早些时候，当我完成一篇博文并且将其发布的时候，浏览器卡住了大概15秒，总之至少有5到10秒后，我的浏览器彻底的崩溃了，当时使用的是IE7，IE8又是完全不同的情况。我开始认识到浏览器当掉这样的情况是多么频繁的发生。每天，我都要经历浏览器卡住或者其它使我勃然大怒的性能问题若干次。如果仅仅是一天发生一次，或者只发生在桌面或者移动设备上，这都没什么关系。但是自从这个世界决定每一个单页都使用Ajax后，总体上导致了大部分页面常被卡住。我越来越多的思考这件事，不先处理回应是多么美好的事情，我开始认为，也许在十年前Ajax出现的时候并没有得到重用是件好事情。</p>
<p>诚然，Ajax的出现是有着充分的理由的，但是为什么在它刚出现的时候几乎完全被忽视了呢？Jesse James命名了Ajax，随之整个世界为其震撼。WTF？如果它真的超赞，至少市场上相当一部分份额会注意到它的吧？现在我们简直离不开Ajax了。有多少Flash网站有&rdquo;Demo&quot;或者&quot;Non-Flash Site&quot;可用？为什么同样的事情没有发生在Ajax上？</p>
<p>思量了一下我的日常浏览，Ajax确实节约了一些时间。Gmail的作用是相当明显的，我也常常使用它。但是整体而言，当认识到我在浏览器悬挂上浪费了那么多的时间，或者浏览器彻底当掉等情况，这些使我所做的彻底白费。现在你可能会想&ldquo;那些浏览器上出现的故障也不能确定都是Ajax惹得祸啊，我们以前又不是没遇到过类似的情况。&rdquo;OK，这是有一定的道理，但是我能清楚的计算出，脚本比它所期望的时间运行得更长的次数。同时，浏览器悬挂的事情现在我每天都能遇到很多次。每次发生时我都被打扰到，然后调查发现就是Ajax造成的。我知道在一些公众性质的服务器上，是用Ajax来载入一些特定的页。对于Gmail来说又怎么样了呢？记得我曾因为它的快速而在我心里留下了相当好的印象，对于目前我仍可以容忍它在B/C上的缓慢。虽然当我登陆后，几乎要花10秒的时间来载入&hellip;感谢上帝我们还有HTML&hellip;</p>
<p>其实我也知道，这并不是Ajax的责任。自从它开始流行后，人们到处的使用它。大概我真的老了，我还清楚的记得在开发者大会上，人们围绕着关于页面快速载入的问题的讨论，而反对于用Ajax来取代。眼下它被用的越来越滥，造成了上述的情形，最终或许它会耗尽自身。这就是所谓的&ldquo;When it gets here, it won't be a second too soon&hellip;&rdquo; </p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=79" /> 
	  <id>http://www.nmju.net/default.asp?id=79</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[国际：能否成为优秀程序员与Java无关]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.nmju.net/</uri>
		 <email>luckcf@gmail.com</email>
	  </author>
	  <category term="" scheme="http://www.nmju.net/default.asp?cateID=13" label="News" /> 
	  <updated>2008-06-30T08:50:54+08:00</updated>
	  <published>2008-06-30T08:50:54+08:00</published>
		  <summary type="html"><![CDATA[<p><font face="Arial">最近有些人因为计算机科学系的毕业生编程水平低就对Java进行指责，尽管我不是特别喜欢Java，但是我想为它辩护：我认为学习Java不是这些学生不够优秀的真正原因。这是一个敏感的议题，如果我的言语冒犯了某些人，在这里先说声抱歉。<br /><strong>&nbsp;<br />与语言无关</strong></font></p>
<p><font face="Arial">坦白的讲，学生学习的第一种语言和他们最终有多优秀并无关系。你所见到的大多数&ldquo;核心语言&rdquo;（入Java，C#，C/C++，Vb.NET等）在大学里是按照计划传授的：<br />&nbsp;<br />低层次：序列，条件语句和循环；<br />中间水平：函数，对象和递归；<br />高层次：模块设计，设计模式，创建API程序；<br />高层次优化：订单的复杂性和算法优化；<br />这些原则涵盖了大量的&ldquo;学习计划&rdquo; ，你可以教他们上面列出的所有编程知识。对于其他的语言（特别是， Java的），上面列出的知识有什么遗漏吗？ </font></p>
<p><font face="Arial">指针；<br />低层次编程优化；<br />操作符怎样转换为机器编码；<br />&nbsp;<br />最重要的一点是这些都是编程技能需要的一小部分，它们不需要第一语言是C / C + + （或同级语言）。尽早教这些知识是有必要的;有了这些做基础,他们可以轻松地适应教学范围以外的核心引导课程。</font></p>
<p><font face="Arial"><strong>计算机科学系毕业生存在哪些问题呢？</strong></font></p>
<p><font face="Arial"><strong>1.&nbsp;&nbsp;&nbsp; 缺乏编程热情</strong></font></p>
<p><font face="Arial">讲师让学生对编程没有热情可以认为是事实。但重要的一点是，我在一个伟大的程序员身上看到的是他们对编程的热爱。获得热情的最佳方式是让自己感染别人,把自己的热情传递给别人。最好的方法是通过教学，在这点上我深有感触。在大学期间，我参加Microsoft的一些培训，深切感受到教师的热情传给了我。<br />&nbsp;<br />讲师们似乎对乐趣与激情感到困惑。他们认为一些东西并不需要别人感到有乐趣,努力使课程&ldquo;更有趣&rdquo;、不无聊是不正确的做法。有能力创造一些已几乎原始的感觉，乐趣和能量,讲师需要努力探索让学生对他们的创造力感到兴奋和激励，即使这是件艰苦的工作。<br />&nbsp;<br /><strong>2.算法和数学知识的匮乏</strong></font></p>
<p><font face="Arial">算法和数学很容易被误认为是无趣的领域，如果没有正确的教导，这当然可以成为现实。不过，这些都是一个核心部分的学习计划。事实上，他们是独立的语言证明Java是不应该被谴责的，并且他们比语言选择更重要写。有了扎实的算法和数学基础知识，程序员使用任何一种语言都可以很好的代码。<br />&nbsp;<br />如果算法和数学正在被抛弃，那是因为讲师认为他们太枯燥，他们需要找到有人可以令他们兴奋！举一个例子，在高中和大学都学过矩阵数学，在高中我的理解很简单，使用过程中也没有问题；在大学，感觉它是如此错综复杂，让我混淆到忘了基础知识。如果教导错误任何事情都会变得枯燥乏味，讲师们需要停止对内容的批判，要开始探索新的教学方式。</font></p>
<p><font face="Arial"><strong>结论</strong></font></p>
<p><font face="Arial">此刻问题的所在不是Java而是课程和传授它们的人。没有创造的激情、教学的核心算法和数学，学生永远不会成为优秀的程序员。</font></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.nmju.net/article.asp?id=78" /> 
	  <id>http://www.nmju.net/default.asp?id=78</id>
  </entry>	
		
</feed>
