<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_软件设计开发</title><subtitle type="text">.NET UML OO DataBase</subtitle><id>http://feed.cnblogs.com/blog/u/28035/rss</id><updated>2012-01-14T22:19:39Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/28035/rss"/><entry><id>http://www.cnblogs.com/virusswb/archive/2012/01/10/2318169.html</id><title type="text">网站架构资料收集整理</title><summary type="text">1.系统概况图 图1.1 系统架构概况图 图1.2 较为完整的系统架构图 2.系统使用的主要技术 下列排名不分先后 2.1前端 JavaScript，html，css，silverlight，flash Jquery Javascript类库，用来简化html的操作，事件处理，动画，异步访问，用于web的快速开发。最新版本是1.7.1，分为开发环境（大小为229k）和生产环...</summary><published>2012-01-10T07:22:00Z</published><updated>2012-01-10T07:22:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2012/01/10/2318169.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2012/01/10/2318169.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1.系统概况图&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101514266978.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101514351037.gif" width="400" height="402" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图1.1 系统架构概况图&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/WindowsLiveWriter/7d1bb181b447_CD48/%E5%A4%A7%E5%9E%8B%E7%BD%91%E7%AB%99%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/20120110151441759.jpg" width="404" height="397" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图1.2 较为完整的系统架构图&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.系统使用的主要技术&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;下列排名不分先后&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.1前端&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;JavaScript，html，css，silverlight，flash&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jquery.com/"&gt;Jquery&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Javascript类库，用来简化html的操作，事件处理，动画，异步访问，用于web的快速开发。最新版本是1.7.1，分为开发环境（大小为229k）和生产环境（大小为31k）。特点是轻量，体积小；css兼容1-3；跨浏览器。凡客，当当，亚马逊。&lt;/p&gt;  &lt;p&gt;如果从框架角度分级的话，可以有以下分类： &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;零级，完成base工作，包括扩展原有对象的方法，Ajax通讯部分，比较精简 &lt;/li&gt;    &lt;li&gt;一级，完成effect工作，包括增加常用效果转换函数，如tween、drag、maskLayer、fade等的特效 &lt;/li&gt;    &lt;li&gt;二级，完成component工作，包括对话框、列表、树、日历等的组件 &lt;/li&gt;    &lt;li&gt;三级，完成application工作，包括完整的前端平台，允许用户定义能实现一定功能的模块 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;一些UI控件和开发框架只做零级Prototype.js，和一级jQuery/Mootools；一些做到了三级，如Dojo和EXT。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/p/kissy/"&gt;Kissky&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;小巧灵活，简洁实用，使用起来让人感觉愉悦。淘宝，腾讯。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.2后端&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Php，Perl，asp，ruby，python，.net，java，jsp（java server page）&lt;/p&gt;  &lt;p&gt;静态语言：java, .net&lt;/p&gt;  &lt;p&gt;动态语言（脚本语言）：php, asp, jsp, perl, python, ruby&lt;/p&gt;  &lt;p&gt;Php是老牌的脚本语言，尽管出现了很多的新语言，但是php还是大多数网站的首选，据说全世界70%的网站都使用php。LAMP(linux+apache+mysql+php)是经典组合。&lt;/p&gt;  &lt;p&gt;ASP是Active Server Page的缩写，意为“动态服务器页面”。ASP是&lt;a href="http://baike.baidu.com/view/39784.htm"&gt;微软公司&lt;/a&gt;开发的代替CGI脚本&lt;a href="http://baike.baidu.com/view/17674.htm"&gt;程序&lt;/a&gt;的一种应用，它可以与&lt;a href="http://baike.baidu.com/view/1088.htm"&gt;数据库&lt;/a&gt;和其它程序进行交互，是一种简单、方便的编程工具。ASP的&lt;a href="http://baike.baidu.com/view/828.htm"&gt;网页&lt;/a&gt;文件的格式是。常用于各种&lt;a href="http://baike.baidu.com/view/863075.htm"&gt;动态网站&lt;/a&gt;中。&lt;/p&gt;  &lt;p&gt;JSP（Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种&lt;a href="http://baike.baidu.com/view/348756.htm"&gt;动态网页&lt;/a&gt;技术标准。JSP技术有点类似ASP技术，它是在传统的&lt;a href="http://baike.baidu.com/view/828.htm"&gt;网页&lt;/a&gt;HTML文件(*.htm,*.html)中插入Java&lt;a href="http://baike.baidu.com/view/1005329.htm"&gt;程序段&lt;/a&gt;(Scriptlet)和JSP标记(tag)，从而形成JSP文件(*.jsp)。 用JSP开发的Web应用是跨平台的，既能在Linux下运行，也能在其他&lt;a href="http://baike.baidu.com/view/880.htm"&gt;操作系统&lt;/a&gt;上运行。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://python.org/"&gt;Python&lt;/a&gt;和&lt;a href="http://www.ruby-lang.org/en/"&gt;ruby&lt;/a&gt;是近几年崛起的开源语言，特点是容易上手，能快速完成原型。同时也是较为成熟脚本语言。Python是&lt;a href="http://www.douban.com"&gt;豆瓣&lt;/a&gt;的主要语言，google，youtube等网站也都在使用。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.python.org/about/quotes/"&gt;http://www.python.org/about/quotes/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt;的前端主要使用ruby，motorola和NASA也都使用了ruby。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ruby-lang.org/en/documentation/success-stories"&gt;http://www.ruby-lang.org/en/documentation/success-stories&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.3缓存&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;•&lt;b&gt;&lt;a href="http://www.squid-cache.org/"&gt;Squid cache&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;开源。&lt;/p&gt;  &lt;p&gt;Squid服务器群，把它作为web服务器端的前置cache服务器，缓存相关请求来提高web服务器速度。Squid将大部分静态资源(图片，js，css等）缓存起来，也可以缓存频繁访问的网页，直接返回给访问者，减少应用服务器的负载。&lt;/p&gt;  &lt;p&gt;•&lt;b&gt;&lt;a href="http://memcached.org/"&gt;memcached&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;开源。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wikipedia.org"&gt;Wikipedia&lt;/a&gt;，&lt;a href="http://www.flickr.com"&gt;Flickr&lt;/a&gt;，&lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt;，&lt;a href="http://www.youtube.com"&gt;Youtube&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;memcached服务器群，一款分布式缓存产品，很多大型网站在应用; 它可以应对任意多个连接，使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间，然后建立一个HashTable，Memcached自管理这些HashTable。因为通常网站应用程序中最耗费时间的任务是数据在数据库的检索，而多个用户查询相同的SQL时，数据库压力会增大，而通过memcached的查询缓存命中，数据直接从memcached内存中取，每次缓存命中将替换到数据库服务器的一次往返，到达数据库服务器的请求更少，间接地提高了数据库服务器的性能，从而使应用程序运行得更快。它通过基于内存缓存对象来减少数据库查询的方式改善网站系统的反应，其最吸引人的一个特性就是支持分布式部署。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.4中间件&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Java，.net，c，c++&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.5存储&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.5.1关系数据库&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Oracle，mysql，mssql，postgreSQL&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.postgresql.org/about/"&gt;postgreSQL&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;关系数据库，拥有15年的历史。免费，开源。可以运行在linux、unix和windows上，支持事物、主外键、连接、视图、触发器、存储过程。包含大量的数据类型，也支持大对象。支持多种语言，c，c++，java，c#，perl，python，ruby等等。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.5.2 NoSQL存储&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;MongoDB，Redis，CouchDB，Cassandra，HBase&lt;/p&gt;  &lt;p&gt;NoSQL(not only sql)，不仅仅是SQL。用来弥补关系数据库在某些方面的不足。例如：&lt;/p&gt;  &lt;p&gt;l 高并发读写。每秒上万次的读写，关系数据库有点吃力。&lt;/p&gt;  &lt;p&gt;l 海量数据的高效存储和访问。例如：对一张表有2亿数据的表进行读写，效率较为低下。&lt;/p&gt;  &lt;p&gt;l 高扩展性。对于数据库的升级和扩展，增加节点，往往需要停机和数据迁移。&lt;/p&gt;  &lt;p&gt;有一些地方不需要关系数据库，例如：&lt;/p&gt;  &lt;p&gt;l 事务一致性。某些场合不需要事务，对于数据的一致性也没有严格要求。&lt;/p&gt;  &lt;p&gt;l 读写实时性。有些场合不需要实时的读写。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://baike.baidu.com/view/2677528.htm"&gt;http://baike.baidu.com/view/2677528.htm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mongodb.org"&gt;Mongodb&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;文档型nosql，支持主从复制。有很多的大公司使用。支持多种编程语言。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Production+Deployments"&gt;http://www.mongodb.org/display/DOCS/Production+Deployments&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.10gen.com/customers/disney"&gt;Disney&lt;/a&gt;，SAP，淘宝（监控数据），sourceforge，大众点评（用户行为分析，用户、组）。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;键值型nosql，vmware赞助，支持多种编程语言。Twitter，淘宝，新浪微博都有使用。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://couchdb.apache.org/"&gt;Couchdb&lt;/a&gt;，&lt;a href="http://cassandra.apache.org/"&gt;cassandra&lt;/a&gt;，&lt;a href="http://hbase.apache.org/"&gt;hbase&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;都是apache旗下的项目。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.5.3文件系统&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;商用中间件，自定义文件系统&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.6操作系统&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Windows，linux，unix&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.7 Web应用服务器软件&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;IIS，apache，tomcat，jboss，&lt;a href="http://www.oracle.com/technetwork/middleware/weblogic/overview/index.html"&gt;weblogic&lt;/a&gt;（BEA，商用，收费），&lt;a href="http://www-01.ibm.com/software/websphere/"&gt;websphere&lt;/a&gt;（IBM，商用，收费），lighttpd，nginx&lt;/p&gt;  &lt;p&gt;IIS&lt;/p&gt;  &lt;p&gt;微软windows操作系统专用。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;lighttpd，是一个德国人领导的开源软件，其根本的目的是提供一个专门针对高性能网站，安全、快速、兼容性好。lighttpd并且灵活的web server环境。具有非常低的内存开销，cpu占用率低，效能好，以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能，&lt;/p&gt;  &lt;p&gt;&lt;a href="http://nginx.org/"&gt;Nginx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;开源&lt;/p&gt;  &lt;p&gt;Nginx+php（FastCGI）+Memcached+Mysql+APC 是目前主流的高性能服务器搭建方式！适合大中型网站，小型站长也可以采用这种组合！&lt;/p&gt;  &lt;p&gt;Nginx 超越 Apache 的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中包括国内最大的电子地图MapBar、新浪博客、新浪播客、网易新闻等门户网站频道，六间房、56.com等视频分享网 站，Discuz！官方论坛、水木社区等知名论坛，豆瓣、YUPOO相册、海内SNS、迅雷在线等新兴Web 2.0网站，更多的网站都在使用Nginx配置。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.8 框架&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Javascript：&lt;a href="http://jquery.com/"&gt;Jquery&lt;/a&gt;，&lt;a href="http://www.prototypejs.org/"&gt;prototype.js&lt;/a&gt;，&lt;a href="http://code.google.com/p/kissy/"&gt;Kissky&lt;/a&gt;，&lt;a href="http://www.sencha.com/"&gt;extjs&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;.NET：&lt;a href="http://entlib.codeplex.com/"&gt;企业库&lt;/a&gt;，&lt;a href="http://unity.codeplex.com/"&gt;unity&lt;/a&gt;，&lt;a href="http://nhforge.org/Default.aspx"&gt;NHibernate&lt;/a&gt;，&lt;a href="http://www.springframework.net/"&gt;Sprint.NET&lt;/a&gt;，&lt;a href="http://www.mybatis.org/"&gt;ibatis&lt;/a&gt;，&lt;a href="http://www.asp.net/mvc"&gt;MVC&lt;/a&gt;，&lt;a href="http://mef.codeplex.com/"&gt;MEF&lt;/a&gt;，&lt;a href="http://compositewpf.codeplex.com/"&gt;Prism&lt;/a&gt;，&lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt;，&lt;a href="http://www.infoq.com/cn/news/2009/07/23-.NET-Open-Source-Projects"&gt;23个开源项目&lt;/a&gt;，&lt;a href="http://incubator.apache.org/lucene.net/"&gt;lucene.NET&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Java：&lt;a href="http://www.hibernate.org/"&gt;hibernate&lt;/a&gt;，&lt;a href="http://www.springsource.org/"&gt;spring&lt;/a&gt;，&lt;a href="http://struts.apache.org/"&gt;struts&lt;/a&gt;，&lt;a href="http://www.easyjf.com/html/20110130/3047424.html"&gt;easyjf&lt;/a&gt;，&lt;a href="http://logging.apache.org/log4j/"&gt;log4j&lt;/a&gt;，&lt;a href="http://baike.baidu.com/view/629119.html"&gt;开源项目&lt;/a&gt;，&lt;a href="http://lucene.apache.org/"&gt;lucene&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Python：&lt;a href="https://www.djangoproject.com/"&gt;django&lt;/a&gt;，&lt;a href="http://flask.pocoo.org/"&gt;flask&lt;/a&gt;，&lt;a href="http://bottlepy.org/docs/dev/"&gt;bottle&lt;/a&gt;，&lt;a href="http://www.tornadoweb.org/"&gt;tornado&lt;/a&gt;，&lt;a href="http://uliwebproject.appspot.com/"&gt;uliweb&lt;/a&gt;，&lt;a href="http://webpy.org/"&gt;web.py&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ruby：&lt;a href="http://rubyonrails.org/"&gt;rails&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;PHP：&lt;a href="http://pear.php.net/"&gt;PEAR&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.主流网站架构演进&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.1第一步：物理分离webserver和数据库&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;刚开始我们的网站可能搭建在一台服务器上，这个时候由于网站具备了一定的特色，吸引了部分人访问，逐渐你发现系统的压力越来越高，响应速度越来越慢，而这个时候比较明显的是数据库和应用互相影响，应用出问题了，数据库也很容易出现问题，而数据库出问题的时候，应用也容易出问题，于是进入了第一步演变阶段：将应用和数据库从物理上分离，变成了两台机器，这个时候技术上没有什么新的要求，但你发现确实起到效果了，系统又恢复到以前的响应速度了，并且支撑住了更高的流量，并且不会因为数据库和应用形成互相的影响。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101515348733.jpg" width="404" height="207" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.1&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.2第二步：增加页面缓存&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;好景不长，随着访问的人越来越多，你发现响应速度又开始变慢了，查找原因，发现是访问数据库的操作太多，导致数据连接竞争激烈，所以响应变慢，但数据库连接又不能开太多，否则数据库机器压力会很高，因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力，这个时候首先也许会选择采用squid等类似的机制来将系统中相对静态的页面（例如一两天才会有更新的页面）进行缓存（当然，也可以采用将页面静态化的方案），这样程序上可以不做修改，就能够很好的减少对webserver的压力以及减少数据库连接资源的竞争，OK，于是开始采用squid来做相对静态的页面的缓存。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101515398139.jpg" width="404" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.2&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.3第三步：增加页面片段缓存&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;增加了squid做缓存后，整体系统的速度确实是提升了，webserver的压力也开始下降了，但随着访问量的增加，发现系统又开始变的有些慢了，在尝到了squid之类的动态缓存带来的好处后，开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢，因此考虑采用类似ESI之类的页面片段缓存策略，OK，于是开始采用ESI来做动态页面中相对静态的片段部分的缓存。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101515505621.jpg" width="404" height="282" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.3&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.4第四步：数据缓存&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在采用ESI之类的技术再次提高了系统的缓存效果后，系统的压力确实进一步降低了，但同样，随着访问量的增加，系统还是开始变慢，经过查找，可能会发现系统中存在一些重复获取数据信息的地方，像获取用户信息等，这个时候开始考虑是不是可以将这些数据信息也缓存起来呢，于是将这些数据缓存到本地内存，改变完毕后，完全符合预期，系统的响应速度又恢复了，数据库的压力也再度降低了不少。可以使用的技术有：memcached。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image011" border="0" alt="clip_image011" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/20120110151602462.jpg" width="404" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.4&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.5第五步：增加webserver&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;好景不长，发现随着系统访问量的再度增加，webserver机器的压力在高峰期会上升到比较高，这个时候开始考虑增加一台webserver，这也是为了同时解决可用性的问题，避免单台的webserver down机的话就没法使用了，在做了这些考虑后，决定增加一台webserver，增加一台webserver时，会碰到一些问题，典型的有：&lt;/p&gt;  &lt;p&gt;1、如何让访问分配到这两台机器上，这个时候通常会考虑的方案是Apache自带的负载均衡方案，或LVS这类的软件负载均衡方案；&lt;/p&gt;  &lt;p&gt;2、如何保持状态信息的同步，例如用户session等，这个时候会考虑的方案有写入数据库、写入存储、cookie或同步session信息等机制等；&lt;/p&gt;  &lt;p&gt;3、如何保持数据缓存信息的同步，例如之前缓存的用户数据等，这个时候通常会考虑的机制有缓存同步或分布式缓存；&lt;/p&gt;  &lt;p&gt;4、如何让上传文件这些类似的功能继续正常，这个时候通常会考虑的机制是使用共享文件系统或存储等；&lt;/p&gt;  &lt;p&gt;在解决了这些问题后，终于是把webserver增加为了两台，系统终于是又恢复到了以往的速度。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image013" border="0" alt="clip_image013" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101516293936.jpg" width="404" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.5&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.6第六步：分库&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;享受了一段时间的系统访问量高速增长的幸福后，发现系统又开始变慢了，这次又是什么状况呢，经过查找，发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈，导致了系统变慢，这下怎么办呢，此时可选的方案有数据库集群和分库策略，集群方面像有些数据库支持的并不是很好，因此分库会成为比较普遍的策略，分库也就意味着要对原有程序进行修改，一通修改实现分库后，不错，目标达到了，系统恢复甚至速度比以前还快了。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image015" border="0" alt="clip_image015" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101517456153.jpg" width="404" height="289" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.6&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.7第七步：分表、DAL和分布式缓存&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;随着系统的不断运行，数据量开始大幅度增长，这个时候发现分库后查询仍然会有些慢，于是按照分库的思想开始做分表的工作，当然，这不可避免的会需要对程序进行一些修改，也许在这个时候就会发现应用自己要关心分库分表的规则等，还是有些复杂的，于是萌生能否增加一个通用的框架来实现分库分表的数据访问，这个在ebay的架构中对应的就是DAL，这个演变的过程相对而言需要花费较长的时间，当然，也有可能这个通用的框架会等到分表做完后才开始做，同时，在这个阶段可能会发现之前的缓存同步方案出现问题，因为数据量太大，导致现在不太可能将缓存存在本地，然后同步的方式，需要采用分布式缓存方案了，于是，又是一通考察和折磨，终于是将大量的数据缓存转移到分布式缓存上了。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image017" border="0" alt="clip_image017" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101518044662.jpg" width="404" height="517" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.7&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.8第八步：增加更多的webserver&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在做完分库分表这些工作后，数据库上的压力已经降到比较低了，又开始过着每天看着访问量暴增的幸福生活了，突然有一天，发现系统的访问又开始有变慢的趋势了，这个时候首先查看数据库，压力一切正常，之后查看webserver，发现apache阻塞了很多的请求，而应用服务器对每个请求也是比较快的，看来是请求数太高导致需要排队等待，响应速度变慢，这还好办，一般来说，这个时候也会有些钱了，于是添加一些webserver服务器，在这个添加webserver服务器的过程，有可能会出现几种挑战：&lt;/p&gt;  &lt;p&gt;1、Apache的软负载或LVS软负载等无法承担巨大的web访问量（请求连接数、网络流量等）的调度了，这个时候如果经费允许的话，会采取的方案是购买硬件负载，例如F5、Netsclar、Athelon之类的，如经费不允许的话，会采取的方案是将应用从逻辑上做一定的分类，然后分散到不同的软负载集群中；&lt;/p&gt;  &lt;p&gt;2、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈，需要进行改进，也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等；&lt;/p&gt;  &lt;p&gt;在做完这些工作后，开始进入一个看似完美的无限伸缩的时代，当网站流量增加时，应对的解决方案就是不断的添加webserver。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image019" border="0" alt="clip_image019" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101518371784.jpg" width="404" height="382" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.8&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.9第九步：数据读写分离和廉价存储方案&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;突然有一天，发现这个完美的时代也要结束了，数据库的噩梦又一次出现在眼前了，由于添加的webserver太多了，导致数据库连接的资源还是不够用，而这个时候又已经分库分表了，开始分析数据库的压力状况，可能会发现数据库的读写比很高，这个时候通常会想到数据读写分离的方案，当然，这个方案要实现并不容易，另外，可能会发现一些数据存储在数据库上有些浪费，或者说过于占用数据库资源，因此在这个阶段可能会形成的架构演变是实现数据读写分离，同时编写一些更为廉价的存储方案，例如BigTable这种。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image021" border="0" alt="clip_image021" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101518408422.jpg" width="404" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.9&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.10第十步：进入大型分布式应用时代和廉价服务器群梦想时代&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;经过上面这个漫长而痛苦的过程，终于是再度迎来了完美的时代，不断的增加webserver就可以支撑越来越高的访问量了，对于大型网站而言，人气的重要毋庸置疑，随着人气的越来越高，各种各样的功能需求也开始爆发性的增长，这个时候突然发现，原来部署在webserver上的那个web应用已经非常庞大了，当多个团队都开始对其进行改动时，可真是相当的不方便，复用性也相当糟糕，基本是每个团队都做了或多或少重复的事情，而且部署和维护也是相当的麻烦，因为庞大的应用包在N台机器上复制、启动都需要耗费不少的时间，出问题的时候也不是很好查，另外一个更糟糕的状况是很有可能会出现某个应用上的bug就导致了全站都不可用，还有其他的像调优不好操作（因为机器上部署的应用什么都要做，根本就无法进行针对性的调优）等因素，根据这样的分析，开始痛下决心，将系统根据职责进行拆分，于是一个大型的分布式应用就诞生了，通常，这个步骤需要耗费相当长的时间，因为会碰到很多的挑战：&lt;/p&gt;  &lt;p&gt;1、拆成分布式后需要提供一个高性能、稳定的通信框架，并且需要支持多种不同的通信和远程调用方式；&lt;/p&gt;  &lt;p&gt;2、将一个庞大的应用拆分需要耗费很长的时间，需要进行业务的整理和系统依赖关系的控制等；&lt;/p&gt;  &lt;p&gt;3、如何运维（依赖管理、运行状况管理、错误追踪、调优、监控和报警等）好这个庞大的分布式应用。&lt;/p&gt;  &lt;p&gt;经过这一步，差不多系统的架构进入相对稳定的阶段，同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量，结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image023" border="0" alt="clip_image023" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101518474042.jpg" width="404" height="316" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;图3.10&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4.分析&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;随着平台做大做强，很可能会走向定制操作系统，定制数据库，甚至定制硬件，定制任何可以定制的东西这样一条路。&lt;/p&gt;  &lt;p&gt;在服务器、架构、组件等技术选择方面，主要有两个方向：1选择成熟商用。2选择开源+自主研发。下面就这两个方向逐一进行简单分析。&lt;/p&gt;  &lt;p&gt;1商用的优缺点&lt;/p&gt;  &lt;p&gt;l 商用的优点之一是成熟，稳定，搭建快速。&lt;/p&gt;  &lt;p&gt;l 商用的缺点之一是费用高，随着服务器的增加，license的费用上升，成本偏高。&lt;/p&gt;  &lt;p&gt;l 商用的产品是通用化的，缺乏定制性，不能满足个性需要。&lt;/p&gt;  &lt;p&gt;2开源+自主研发的优缺点&lt;/p&gt;  &lt;p&gt;l 源码开放，可控性好，出现问题，可以从底层解决，扩展性好。&lt;/p&gt;  &lt;p&gt;l 短期时间、人力投入大，初期见效慢；长期产出大，见效明显。&lt;/p&gt;  &lt;p&gt;l 可以在软件和硬件的多个层面不断优化，充分满足个性化需要。&lt;/p&gt;  &lt;p&gt;商用和开源+自主研发各有优缺点，各有互补性，要根据使用场景的不同来进行选择，也可以根据需要配合使用。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5.总结&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;目前大型网站的主流是LAMP（linux+apache+mysql+php），或者是在这基础之上的扩展，例如增加缓存，增加中间件（中间件大多使用java，c，c++或者.NET编写，或者购买成熟的中间件产品，IBM就有很多成熟的中间件产品）；又或者替换其中的某些部分，例如前端使用python，ruby，lua这些新近流行的脚本语言，数据存储部分使用nosql或者文件系统。这样的选择有历史原因、费用原因、业务原因，也有在网站发展之后需要满足新的需求而衍生出来解决特定问题的原因。&lt;/p&gt;  &lt;p&gt;也有初期使用微软系（windows+.NET+MSSQL）来构建网站的，在后面又根据需要加入其他体系的的电商，例如：京东，当当，凡客等。也有始终采用微软系的网站，国外的&lt;a href="http://www.microsoft.com/en-us/default.aspx"&gt;微软官网&lt;/a&gt;，&lt;a href="http://stackoverflow.com/"&gt;stackoverflow&lt;/a&gt;，还有曾经辉煌的&lt;a href="http://www.myspace.com/"&gt;myspace&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;其实，现在的发展趋势是：混合体系，而非单一的体系。就是说技术体系不是单一的，也不是固定一成不变的，而是根据业务以及网站的发展，以及技术的发展，选择合适的技术解决适当的问题。&lt;/p&gt;  &lt;p&gt;架构的变更不是一件小事，对业务和网站的发展都很重要，不可能几天或者一半个月就变更一下，也不可能有事没事变更一下，应该是在关键的时候，有需要的时候，或者根据计划定期升级。&lt;/p&gt;  &lt;p&gt;我觉得有一种方式可以帮助我们进行选择。就是根据我们的目标，或者说预估的业务量，预估的成交量，预估的用户量，划分几个平台发展里程碑，或者是时间段。然后根据平台发展的里程碑来规划技术选型的里程碑。考虑规模的同时，还需要考虑业务的类型，产生的数据的类型，对这些数据的处理需求等因素。&lt;/p&gt;  &lt;p&gt;可以先定几个里程碑，这个里程碑的时间，可以根据前面的业务预估来裁定。先根据第一个里程碑要满足的业务需求，来选择当前的技术架构，并且进行存储空间规划。然后针对第一个到第二个里程碑的过度，进行预留设计，保证将来的平稳过渡。或者只是预留扩展的余地，这方面有时候有点难度，不过应该尽量做。&lt;/p&gt;  &lt;p&gt;在第二个里程碑之前的1-2个月进行第二个里程碑技术架构的讨论和设计，因为这时候相比原有的第二个里程碑的业务估计可能会有变动，或者技术上有了新的选择，都可以及时考虑到本次的设计中来。以此类推后面的里程碑技术架构变更。&lt;/p&gt;  &lt;p&gt;还有就是突发情况，因为总会有一些意料之外的情况发生，有的是业务发展的需要，有的是被动的需要。针对这些突发情况，也会进行架构的升级。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;参考文献&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.qconbeijing.com/Default.aspx"&gt;QCon北京2012大会&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.qconbeijing.com/"&gt;http://www.qconbeijing.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;全球软件开发大会&lt;/p&gt;  &lt;p&gt;QCon是由InfoQ主办的全球顶级技术盛会，每年在伦敦、北京、东京、纽约、圣保罗、杭州、旧金山召开。自2007年3月份首次举办以来，已经 有包括传统制造、金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。&lt;/p&gt;  &lt;p&gt;秉承“促进软件开发领域知识与创新的传播”原则，QCon各项议题专为中高端技术人员设计，内容源于实践并面向社区。演讲嘉宾依据各重点和热点话题，分享技术趋势和最佳实践；作为主办方，InfoQ努力为参会者提供良好的学习和交流环境。&lt;/p&gt;  &lt;p&gt;1.&lt;a href="http://www.taobao.com"&gt;淘宝&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;LAMP, .NET, Nginx, windows, linux, Oracle, MySQL, Lua, NoSQL&lt;/p&gt;  &lt;p&gt;淘宝网，是一个在线商品数量突破一亿，日均成交额超过两亿元人民币，注册用户接近八千万的大型电子商务网站，是亚洲最大的购物网站。&lt;/p&gt;  &lt;p&gt;· 日均 IP [周平均]   &lt;br /&gt;134700000&lt;/p&gt;  &lt;p&gt;· 日均 PV [周平均]   &lt;br /&gt;2559300000&lt;/p&gt;  &lt;p&gt;· 日均 IP [月平均]   &lt;br /&gt;137280000&lt;/p&gt;  &lt;p&gt;· 日均 PV [月平均]   &lt;br /&gt;2608320000 &lt;/p&gt;  &lt;p&gt;· 日均 IP [三月平均]   &lt;br /&gt;130620000&lt;/p&gt;  &lt;p&gt;· 日均 PV [三月平均]   &lt;br /&gt;2481780000&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/11/taobao-greencompute"&gt;淘宝开放低耗服务器设计规范&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.csdn.net/yefengmeander/article/details/4024507"&gt;电子商务网站（淘宝网）的系统架构解析&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.taobao.org/"&gt;淘宝开源项目&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;存放淘宝所有的开源项目&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/articles/tao-tfs"&gt;揭秘淘宝自主研发的文件系统-TFS&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;目前，国内自主研发的文件系统可谓凤毛麟角。淘宝在这一领域做了有效的探索和实践，Taobao File System（TFS）作为淘宝内部使用的分布式文件系统，针对海量小文件的随机读写访问性能做了特殊优化，承载着淘宝主站所有图片、商品描述等数据存储。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/articles/taobao-tair"&gt;淘宝开源Key/Value结构数据存储系统Tair技术剖析&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Tair是由淘宝网自主开发的Key/Value结构数据存储系统，在淘宝网有着大规模的应用。您在登录淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候，都在直接或间接地和Tair交互。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2010/07/tabao-opensource"&gt;走进淘宝开源平台&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/08/enterprise-nodejs"&gt;Node.js获得企业开发者亲睐&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;LinkedIn和淘宝部分功能使用了Node.js&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.phpv.net/html/1713.html"&gt;淘宝的可伸缩高性能互联网架构揭秘&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/07/java-taobao"&gt;Java在淘宝的应用（淘宝的架构变迁）&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/07/taobao-linhao-hbase"&gt;HBase技术在淘宝中的应用&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/interviews/fengdahui-database-architecture"&gt;冯大辉谈数据库架构&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/articles/yuexuqiang-share-outlook"&gt;淘宝架构师的年度展望&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/interviews/hl-alibaba-front-end-performance-optimization"&gt;何崚谈阿里巴巴前端性能优化最佳实践&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.csdn.net/yefengmeander/article/details/4024507"&gt;电子商务网站（淘宝网）的系统架构解析&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2.&lt;a href="http://www.qq.com"&gt;腾讯&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Php, asp&lt;/p&gt;  &lt;p&gt;· 日均 IP [周平均]   &lt;br /&gt;222000000&lt;/p&gt;  &lt;p&gt;· 日均 PV [周平均]   &lt;br /&gt;1776000000&lt;/p&gt;  &lt;p&gt;· 日均 IP [月平均]   &lt;br /&gt;218640000&lt;/p&gt;  &lt;p&gt;· 日均 PV [月平均]   &lt;br /&gt;1749120000 &lt;/p&gt;  &lt;p&gt;· 日均 IP [三月平均]   &lt;br /&gt;213930000&lt;/p&gt;  &lt;p&gt;· 日均 PV [三月平均]   &lt;br /&gt;1711440000&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/11/znx-tencent-open-platform"&gt;谈腾讯开放平台关键技术&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3.&lt;a href="http://www.yupoo.com/"&gt;又拍网&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Erlang, Python, PHP, Redis&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/12/youpai-zhaozhongqiu"&gt;又拍网架构中的消息/任务系统&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3.&lt;a href="http://www.ganji.com/index.htm"&gt;赶集网&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Php, MySQL&lt;/p&gt;  &lt;p&gt;4.&lt;a href="http://weibo.com"&gt;新浪微博&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;php&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/11/tangfl-redis"&gt;唐福林谈Redis应用实践&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;唐福林是新浪微博开放平台资深工程师，目前负责t.cn短链、用户关系、计数器等底层服务。他曾负责过包括新浪邮箱全文搜索在内的多个基于Lucene的 垂直搜索引擎开发，以及新浪爱问和新浪播客的运维，对承载大数据量、高并发的互联网基础设施建设有丰富的经验。他在QCon杭州2011大会的开放平台专 题做了名为《&lt;a href="http://www.qconhangzhou.com/ShowNews.aspx?id=7"&gt;新浪微博开放平台中的Redis实践&lt;/a&gt;》的讲座，并和参会者做了热烈的讨论。会后，InfoQ中文站对唐福林做了采访。&lt;/p&gt;  &lt;p&gt;新浪微博的注册用户数在3个月内从1.4亿增长到2亿，用户之间的关注，粉丝关系更是要再高出一个数量级，而且读取量还在以更快的速度增长。新浪微 博开放平台的接口中还有很多的数字，这些数字的读写量巨大，而且对一致性，实时性都要求很高。传统的 mysql+memcache 方案在这些场景下越来越力不从心，于是新浪微博开放平台大胆启用了 NoSql 领域的新贵 Redis 。&lt;/p&gt;  &lt;p&gt;5.&lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;LAMP&lt;/p&gt;  &lt;p&gt;&lt;a href="http://hi.baidu.com/coollzh/blog/item/e3dfbe3d08e96dc29e3d6266.html"&gt;Facebook系统架构&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://wenku.baidu.com/view/e32f84b765ce050876321353.html"&gt;Facebook架构设计中文版&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbanotes.net/arch/facebook_arch_note.html"&gt;Facebook架构学习&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;6.&lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lamp，ruby&lt;/p&gt;  &lt;p&gt;Twitter使用的大部分工具都是开源的。其结构是用Rails作前端，C，Scala和Java组成中间的业务层，使用MySQL存储数据。所有的东西都保存在RAM里，而数据库只是用作备份。Rails前端处理展现，缓存组织，DB查询以及同步插入。这一前端主要由几部分客户服务粘合而成，大部分是C写的：MySQL客户端，Memcached客户端，一个JSON端，以及其它。&lt;/p&gt;  &lt;p&gt;中间件使用了Memcached，Varnish用于页面缓存，一个用Scala写成的MQ，Kestrel和一个Comet服务器也正在规划之中，该服务器也是用Scala写成，当客户端想要跟踪大量的tweet时它就能派上用场。&lt;/p&gt;  &lt;p&gt;Twitter是作为一个“内容管理平台而非消息管理平台”开始的，因此从一开始基于聚合读取的模型改变到现在的所有用户都需要更新最新tweet的消息模型，需要许许多多的优化。这一改动主要在于三个方面：缓存，MQ以及Memcached客户端。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2009/06/Twitter-Architecture"&gt;架构的变迁&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://timyang.net/architecture/twitter-cache-architecture/"&gt;Twitter架构（Cache篇）&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;7.&lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;lamp&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/articles/ebay-scalability-best-practices"&gt;可伸缩性的最佳实践&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.jdon.com/jivejdon/thread/37753"&gt;eBay的架构特点&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/articles/tony-interview-on-architecture-security-of-ecommerce-site"&gt;聊聊电商网站的架构与安全&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;8.&lt;a href="http://www.vancl.com/"&gt;凡客&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;.net,c,c++&lt;/p&gt;  &lt;p&gt;· 日均 IP [周平均]   &lt;br /&gt;6990000&lt;/p&gt;  &lt;p&gt;· 日均 PV [周平均]   &lt;br /&gt;62910000&lt;/p&gt;  &lt;p&gt;· 日均 IP [月平均]   &lt;br /&gt;7650000&lt;/p&gt;  &lt;p&gt;· 日均 PV [月平均]   &lt;br /&gt;68850000 &lt;/p&gt;  &lt;p&gt;· 日均 IP [三月平均]   &lt;br /&gt;7983000&lt;/p&gt;  &lt;p&gt;· 日均 PV [三月平均]   &lt;br /&gt;71847000&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tech.sina.com.cn/it/2011-05-11/14255508927.shtml"&gt;栾义来：凡客历程分享——应对规模和复杂性挑战 &lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/articles/luanyilai-share-outlook"&gt;架构总监的来年展望&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;9.&lt;a href="http://www.yihaodian.com/product/index.do?merchant=2"&gt;一号店&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Java, jsp, linux, mysql, postgresql, oracle&lt;/p&gt;  &lt;p&gt;· 日均 IP [周平均]   &lt;br /&gt;2610000&lt;/p&gt;  &lt;p&gt;· 日均 PV [周平均]   &lt;br /&gt;23490000&lt;/p&gt;  &lt;p&gt;· 日均 IP [月平均]   &lt;br /&gt;2793000&lt;/p&gt;  &lt;p&gt;· 日均 PV [月平均]   &lt;br /&gt;25137000 &lt;/p&gt;  &lt;p&gt;· 日均 IP [三月平均]   &lt;br /&gt;2583000&lt;/p&gt;  &lt;p&gt;· 日均 PV [三月平均]   &lt;br /&gt;20664000&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/articles/hj-yihaodian-b2c-evolution-road"&gt;1号店电商系统演进之路&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;10.&lt;a href="http://www.yintai.com/"&gt;银泰网&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;.net,jsp,java&lt;/p&gt;  &lt;p&gt;11.&lt;a href="http://dangdang.com/"&gt;当当&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;.net,php,jquery&lt;/p&gt;  &lt;p&gt;CDN&lt;/p&gt;  &lt;p&gt;CDN的全称是Content Delivery Network，即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节，使内容传输的更快、更稳定。通过在网络各 处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络，CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应 时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容，解决 Internet网络拥挤的状况，提高用户访问网站的响应速度。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://baike.baidu.com/view/21895.htm"&gt;http://baike.baidu.com/view/21895.htm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.infoq.com/cn/news/2011/01/nosql-why"&gt;NoSQL开篇——为什么要使用NoSQL&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbanotes.net/startup/Startup_tech_style_choosing.html"&gt;说说技术型创业团队的技术选择&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.liuts.com/post/221/"&gt;续——冯大辉谈技术性创业团队的技术选型&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.csdn.net/zhongguoren666/article/details/6653646"&gt;互联网技术平台迁移杂谈&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.open-open.com/bbs/view/1325598931515"&gt;分享我的大型Java多用户商城系统开发的心得和困难 &lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bbs.shopex.cn"&gt;电子商务软件及软件服务提供商论坛&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tech.sina.com.cn/s/2006-05-24/1527953783.shtml"&gt;基于J2EE架构的电子商务网站实例解析&lt;/a&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://liriguang.iteye.com/blog/947630"&gt;中小型电子商务网站架构-从业总结&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;1、大型网站架构设计图&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101519431371.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image025" border="0" alt="clip_image025" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101519588739.gif" width="404" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2、PlentyOfFish 网站架构&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbanotes.net/arch/plentyoffish_arch.html"&gt;http://www.dbanotes.net/arch/plentyoffish_arch.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;超过 3000 万的日点击率&lt;/p&gt;  &lt;p&gt;对于动态出站(outbound)的数据进行压缩，这耗费了30%的&lt;acronym&gt;CPU&lt;/acronym&gt;能力，但节省了带宽资源&lt;/p&gt;  &lt;p&gt;负载均衡采用 &lt;a href="http://www.foundrynet.com/"&gt;ServerIron&lt;/a&gt; (Conf &lt;a href="http://www.foundrynet.com/services/documentation/sixl/slb.html"&gt;Refer&lt;/a&gt;)（ServerIron 使用简单，而且功能比 NLB 更丰富）&lt;/p&gt;  &lt;p&gt;一共三台 &lt;acronym&gt;SQL&lt;/acronym&gt; Server，一台作为主库，另外两台只读数据库支撑查询，大力气优化 DB&lt;/p&gt;  &lt;p&gt;3、YouTube 的架构&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbanotes.net/opensource/youtube_web_arch.html"&gt;http://www.dbanotes.net/opensource/youtube_web_arch.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;相当大的数据流量——每天有10亿次下载以及6,5000次上传&lt;/p&gt;  &lt;p&gt;大部分代码都是 Python 开发的&lt;/p&gt;  &lt;p&gt;Web 服务器有部分是 Apache， 用 FastCGI 模式。对于视频内容则用 &lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt; 。（国内的豆瓣用的Lighttpd）&lt;/p&gt;  &lt;p&gt;启用了单独的服务器群组来承担视频压力，并且针对 Cache 和 &lt;acronym&gt;OS&lt;/acronym&gt; 做了部分优化，访问量大的视频放在CDN上，自己的只需承担小部分访问压力&lt;/p&gt;  &lt;p&gt;用 MySQL 存储元数据--用户信息、视频信息什么的。&lt;/p&gt;  &lt;p&gt;业务层面的分区(在用户名字或者 ID 上做文章,应用程序控制查找机制)&lt;/p&gt;  &lt;p&gt;4、Yahoo！社区架构&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbanotes.net/arch/yahoo_arch.html"&gt;http://www.dbanotes.net/arch/yahoo_arch.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;5、Amazon 的 Dynamo 架构&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbanotes.net/techmemo/amazon_dynamo.html"&gt;http://www.dbanotes.net/techmemo/amazon_dynamo.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101521144303.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image029" border="0" alt="clip_image029" src="http://images.cnblogs.com/cnblogs_com/virusswb/201201/201201101521325910.jpg" width="404" height="517" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;6、财帮子（caibangzi.com）网站架构&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbanotes.net/arch/caibangzi_web_arch.html"&gt;http://www.dbanotes.net/arch/caibangzi_web_arch.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;7、说说大型高并发高负载网站的系统架构（更新）&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.toplee.com/blog/71.html"&gt;http://www.toplee.com/blog/71.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2318169.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2012/01/10/2318169.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/archive/2012/01/04/2311589.html</id><title type="text">培养我们的目标感</title><summary type="text">今天我要给大家分享的话题是：目标，培养目标感。什么叫目标？目标有很多种，也有很多的分类方式。有个人的，有家庭的，有社会的。有技能的，有生活的，有专业的。目标就是一个人想要达到的目的，或者是想要完成的一件事，也可以是对将来预期成果的一种描述。目标感无论大小，于公于私，我们每个人都会有目标。小到完成一项工作，学会一项技能，大到提高专业水平，3-5年的职业规划，甚至是人生发展，这些都是我们的目标。没有目标是一件很可怕的事情，没有目标就没有方向，没有方向就很迷茫，迷茫就没有任何收获，没有任何收获生活就失去了意义，生活失去意义就。。。。。。后面的事情大家都明白的。其实没有目标的人还是极为少的，我们大多数</summary><published>2012-01-04T01:33:00Z</published><updated>2012-01-04T01:33:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2012/01/04/2311589.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2012/01/04/2311589.html"/><content type="html">&lt;p&gt;今天我要给大家分享的话题是：目标，培养目标感。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;什么叫目标？&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;目标有很多种，也有很多的分类方式。&lt;/p&gt;&#xD;
&lt;p&gt;有个人的，有家庭的，有社会的。&lt;/p&gt;&#xD;
&lt;p&gt;有技能的，有生活的，有专业的。&lt;/p&gt;&#xD;
&lt;p&gt;目标就是一个人想要达到的目的，或者是想要完成的一件事，也可以是对将来预期成果的一种描述。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;目标感&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;无论大小，于公于私，我们每个人都会有目标。小到完成一项工作，学会一项技能，大到提高专业水平，3-5年的职业规划，甚至是人生发展，这些都是我们的目标。&lt;/p&gt;&#xD;
&lt;p&gt;没有目标是一件很可怕的事情，没有目标就没有方向，没有方向就很迷茫，迷茫就没有任何收获，没有任何收获生活就失去了意义，生活失去意义就。。。。。。后面的事情大家都明白的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实没有目标的人还是极为少的，我们大多数人或多或少都会有自己的目标。有人肯定会说了：&amp;ldquo;既然都有目标，你还说什么呢？&amp;rdquo;。我这里主要说的不是有/无，1/0这种绝对关系的问题。&lt;/p&gt;&#xD;
&lt;p&gt;是的，几乎每个人都有目标。但是有时候因为一些外界因素，或者是内因，导致目标不够明确，变得模糊，甚至可能造成某种意义的目标丢失，从某种意义上来说也就是没有了目标。&lt;/p&gt;&#xD;
&lt;p&gt;外因包括：同事、家庭、社会等对于自己的影响。内因多为个人因素，例如：身体、情绪、能力等等。在这里不对在这些因素展开讨论。本篇讨论的重点是如何培养以及强化我们的目标，如何选择适宜个人的目标，有了目标之后如何指定步骤来完成目标，最后列举一些互联网开发方面的技术目标。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;如何培养及强化目标？&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;培养要从提高个人意识方面入手，要经常问自己，当前目标执行的如何？下一个目标是什么？目标的下一阶段准备做什么？经常给自己制定目标，以及完成目标所需的步骤，然后去逐步完成目标，慢慢的就会找到自己的目标感。&lt;/p&gt;&#xD;
&lt;p&gt;强化目标的方法有很多，例如：把目标写下来，每天拿出来念上一遍，让目标成为习惯。最好用的强化方式就是：重复。重复同样适用于英语的学习。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;如何选择适宜个人的目标？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;选择个人目标要结合个人情况，包括：目前的知识水平、家庭情况、公司情况、社会情况等等可能影响目标达成的因素。综合考量，才能选出合情合理合法的个人目标。当然，也不可过分顾虑，导致错失良机。这也是个&amp;ldquo;度&amp;rdquo;的问题，如何把握好这个度，需要经验的积累，不是搞个标准就可以的，个人有个人的理解。&lt;/p&gt;&#xD;
&lt;p&gt;在目标的制定方面，个人建议，分为长远的近期的。不要都是长远的，忽略了近期的目标；也不要都是近期的，忽略的长远的。既要有战术目标，也要有战略目标。也可以将长远的分解为几个小块，几个层级，慢慢实现，这样也就有了近期的目标。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;如何完成目标？&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们都知道，想要完成目标，就需要制定详细的步骤，然后按照步骤去做，逐步达到我们的目标。&lt;/p&gt;&#xD;
&lt;p&gt;对目标进行拆解，拆解为粒度小、可执行性强、时间周期不要超过一星期的的小目标，用流行的软件开发来讲，就是让这个过程敏捷起来，让目标敏捷起来。这样利于目标的执行和检查，也会给我们更大的信心，或者及时发现目标的问题，及时修正目标。目标分解之后，形成很多小目标，在完成这些小目标的过程中，也会起到一个强化大目标的作用。&lt;/p&gt;&#xD;
&lt;p&gt;完成目标可能需要我们学习新的技能和知识，学习的过程可以制定到目标中，也可以独立制定学习的目标。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;互联网开发方面的技术目标&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;数据存储，存储选择，数据库，nosql，容量规划，存储管理，集群。&lt;/li&gt;&#xD;
&lt;li&gt;高性能的后端，并发，集群。&lt;/li&gt;&#xD;
&lt;li&gt;分析，设计。&lt;/li&gt;&#xD;
&lt;li&gt;前端，交互，用户体验，前端的性能。&lt;/li&gt;&#xD;
&lt;li&gt;等等软技能。&lt;/li&gt;&#xD;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2311589.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2012/01/04/2311589.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/archive/2011/12/23/2299218.html</id><title type="text">使用Django来处理对于静态文件的请求</title><summary type="text">引言本方法适用于linux+python2.7+django1.2，使用django自带的web服务。同样也适用于sina app engine。1、准备工作准备css文件，准备js文件，准备image文件。在网站根目录新建目录【medias】，在【medias】目录新建目录【styles】，用来存放css文件。2、配置对于静态文件访问的路径2.1、在settings.py文件中添加静态文件的目录假设mysite是网站的根目录，medias是刚才我们新建的目录STATICFILES_DIRS = ( # Put strings here, like &amp;quot;/home/html/stati</summary><published>2011-12-23T04:31:00Z</published><updated>2011-12-23T04:31:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2011/12/23/2299218.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2011/12/23/2299218.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;strong&gt;引言&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本方法适用于linux+python2.7+django1.2，使用django自带的web服务。&lt;/p&gt;&#xD;
&lt;p&gt;同样也适用于sina app engine。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;1、准备工作&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;准备css文件，准备js文件，准备image文件。&lt;/p&gt;&#xD;
&lt;p&gt;在网站根目录新建目录【medias】，在【medias】目录新建目录【styles】，用来存放css文件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;2、配置对于静态文件访问的路径&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;2.1、在settings.py文件中添加静态文件的目录&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;假设mysite是网站的根目录，medias是刚才我们新建的目录&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;STATICFILES_DIRS = (&#xD;
    # Put strings here, like "/home/html/static" or "C:/www/django/static".&#xD;
    # Always use forward slashes, even on Windows.&#xD;
    # Don't forget to use absolute paths, not relative paths.&#xD;
    'mysite/medias'&#xD;
   &#xD;
)&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;2.2、在urls.py文件中添加如下路由规则&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;urlpatterns=patterns('',&#xD;
&#xD;
	(r'^site_medias/(?P&amp;lt;path&amp;gt;.*)$','django.views.static.serve',&#xD;
		{'document_root':mysite.settings.STATICFILES_DIRS, 'show_indexes': True}),&#xD;
	&#xD;
	&#xD;
)&lt;/pre&gt;&#xD;
&lt;p&gt;将对于site_medias目录及其子目录的文件的请求，映射到settings.py文件设置的STATICFILES_DIRS中指定的路径。并且使用了show_indexes参数，参数设置为True之后，表明可以通过浏览器，浏览medias目录的资源，包括浏览文件夹及其文件。浏览地址是&lt;a title="http://localhost:8080/site_medias/" href="http://localhost:8080/site_medias/"&gt;http://localhost:8080/site_medias/&lt;/a&gt;，假设服务使用端口是8080，在设置了上面的选项之后，应该可以通过该地址浏览文件夹及文件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3、使用静态文件&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3.1、在template文件中引用css文件&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在base.html文件的head标记中添加下面的css引用。&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;link href="/site_medias/styles/site.css" rel="stylesheet" type="text/css"&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.2、在普通html文件中引用css文件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;也是直接在html文件的head标记中添加下面的内容。&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;link href="/site_medias/styles/site.css" rel="stylesheet" type="text/css"&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;完成上面的工作之后，css就应该开始起作用了。对于图片和js的引用也是类似的做法。&lt;/p&gt;&#xD;
&lt;p&gt;在django的官网有两个链接讲到了相关的内容，详细情况大家可以点击查看。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a title="https://docs.djangoproject.com/en/1.2/howto/static-files/" href="https://docs.djangoproject.com/en/1.2/howto/static-files/"&gt;https://docs.djangoproject.com/en/1.2/howto/static-files/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面这个链接的主题是：How to serve static files，也就是如何使用静态文件（包括css，js脚本，图片等等）。里面讲到了，可以使用上面的办法使用静态文件，但是django主要是用来处理动态文件的，上面的办法不高效，并且不安全，所以是不推荐的。在开发环境用一下还可以，但是生产环境，推荐使用专业的web服务来提供静态文件的处理。专业的web服务包括：appache、lighttpd、cherokee等等。结合这些专业web服务的用户，在文章中也有链接。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a title="https://docs.djangoproject.com/en/dev/howto/static-files/" href="https://docs.djangoproject.com/en/dev/howto/static-files/"&gt;https://docs.djangoproject.com/en/dev/howto/static-files/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面的链接就是将如何使用django来处理静态文件，一些处理的细节，包括配置啊、引用啊什么呢的。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2299218.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2011/12/23/2299218.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/archive/2011/12/19/2293222.html</id><title type="text">项目-团队-技术-个人（提拔篇）</title><summary type="text">是团队，就需要领导。领导从哪里来呢？途径可以有多种：1、从团队提拔2、从内部找3、从外面找。。。。。可能还有其他方式其实不论是从团队提拔还是去找现成的，这个人都是从一个团队脱颖而出的，都可能是从基础做起，在团队中表现出色之后被提拔起来的，只不过可能是在来公司之前，在其他公司的团队被提拔起来的。本文就和大家说一点关于“提拔”的个人想法。提拔一个人，通常做法是找那些能干的，肯加班的，任劳任怨的，工作能力在团队中是突出的。叫过来“小张，明天开始你就是项目经理了，加油，努力，要负起责任来。”，然后在团队中宣布一下“从明天开始，小张就是大家的项目经理，以后有什么事情先和他沟通一下，请假之类的先找他批一下</summary><published>2011-12-19T04:44:00Z</published><updated>2011-12-19T04:44:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2011/12/19/2293222.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2011/12/19/2293222.html"/><content type="html">&lt;p&gt;是团队，就需要领导。领导从哪里来呢？途径可以有多种：&lt;/p&gt;&#xD;
&lt;p&gt;1、从团队提拔&lt;/p&gt;&#xD;
&lt;p&gt;2、从内部找&lt;/p&gt;&#xD;
&lt;p&gt;3、从外面找&lt;/p&gt;&#xD;
&lt;p&gt;。。。。。可能还有其他方式&lt;/p&gt;&#xD;
&lt;p&gt;其实不论是从团队提拔还是去找现成的，这个人都是从一个团队脱颖而出的，都可能是从基础做起，在团队中表现出色之后被提拔起来的，只不过可能是在来公司之前，在其他公司的团队被提拔起来的。&lt;/p&gt;&#xD;
&lt;p&gt;本文就和大家说一点关于&amp;ldquo;提拔&amp;rdquo;的个人想法。&lt;/p&gt;&#xD;
&lt;p&gt;提拔一个人，通常做法是找那些能干的，肯加班的，任劳任怨的，工作能力在团队中是突出的。叫过来&amp;ldquo;小张，明天开始你就是项目经理了，加油，努力，要负起责任来。&amp;rdquo;，然后在团队中宣布一下&amp;ldquo;从明天开始，小张就是大家的项目经理，以后有什么事情先和他沟通一下，请假之类的先找他批一下。&amp;rdquo;&lt;/p&gt;&#xD;
&lt;p&gt;从第二天开始，小张就更加努力了，回家比以前还晚，干活比以前还卖力，但是过了一大段时间，发现这个团队整体没有什么提高，反而小张也不如以前能干了，怎么回事呢？这次提拔怎么了？这种提拔合理吗？是小张不行，还是提拔有问题，还是？？？？&lt;/p&gt;&#xD;
&lt;p&gt;今天，给大家分析一下我个人关于类似问题的看法。&lt;/p&gt;&#xD;
&lt;p&gt;首先，我认为提拔一个人，看这个人的表现是没有问题的，表现和能力肯定都是考量的一项，也应该从这两方面入手。但是是不是这样就行了呢？需要其他的吗？我觉得还是需要的，有重要的一点好像忘记了，能否承担责任，对于责任的理解也是很重要的，以及愿意承担责任之后，需要做哪些改变，从哪个角度做，如何做，都会决定本次提拔的结果。&lt;/p&gt;&#xD;
&lt;p&gt;经过我的思考，我觉得有以下几个需要注意的地方，或者说有以下几个程度可以参考。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、首先要看一个人是否愿意承担责任。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里的责任是指为团队负责，为项目负责，为整体负责，而不是为具体的工作负责。身为基层领导，不是给你权利，让你风光的，也不是给你一个头衔，想要累死你的，是让你承担团队的责任，让你担当的。&lt;/p&gt;&#xD;
&lt;p&gt;如果一个人愿意承担责任，我认为具备了提拔的基础条件，他的具体技术能力都不如这个重要。一个人不愿意承担责任，千万不要提拔，不要因为他能干就提拔，不要因为想要留住他就提吧，留住一个人可以有很多种方法，提拔一个不愿意承担责任的人，后果不堪设想，超级失败吧！！！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、其次要看这个人在愿意承担责任的基础上，是否愿意改变自己来适应新角色。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;愿意承担责任就行了吗？就可以适应新角色，进而做好新角色了吗？提拔就成功了吗？不。&lt;/p&gt;&#xD;
&lt;p&gt;因为新的角色需要新的技能，需要新的思考方式，需要新的做事方式。因为面对的下级和上级都发生了变化，以前面对具体的难题，没有下级，上级也只是关心的代码是否完成，具体的工作是否做好。现在不一样了，你是个小领导了，你的上级是更高层的领导，他们关心的不再是具体的功能是否完成，你的下级是具体的人，你需要关心他们在解决问题的时候遇到了什么问题，而不是让你解决具体的问题。&lt;/p&gt;&#xD;
&lt;p&gt;很常见的现象是，在提拔了一个工作能手之后，他还是疯狂的编写代码，做自己的工作，上面呢，也还是习惯把最难得，最重的，最繁琐的事情交给他去完成，就因为他过去完成的好。这样从自身和外界都没有转变角色，可是同时又需要他抽时间关心团队成员，团队成员的心态是否有波动，技能是否需要提高，能否适应当前项目的发展，成员对于自己发展有何诉求，项目的进展，在哪里卡壳了，等等。。。。。。。。。。。&lt;/p&gt;&#xD;
&lt;p&gt;当然了，还有可能就是他这个人就不愿意做出改变，就是愿意深入研究技术。&lt;/p&gt;&#xD;
&lt;p&gt;上面两种情况，可以说这次提拔是失败的。而且是浪费人才，浪费了一个能干的家伙，提拔了一个不称职的领导，相当的失败，双重失败。&lt;/p&gt;&#xD;
&lt;p&gt;我认为，发生上面的情况，坚决下放，将提拔的人下放会原来的岗位，或者找新的适合他的岗位给他，这样对他自身也是提高，鼓励一个人、想留住一个人不见得非得给他一个官职当当。这是我们中国人做事的问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、再次，要看他的改变的结果&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个人，愿意承担，也愿意做出改变，是否就可以了呢？提拔就成功了吗？不。&lt;/p&gt;&#xD;
&lt;p&gt;经过前面的两次，这次提拔已经成功了70%了。最后的30%要看这个人的改变结果，才能决定本次提拔的最终结果。&lt;/p&gt;&#xD;
&lt;p&gt;就是说，这个人在改变的过程中是否顺利，他是否适应了性的岗位，改变的结果如何？他再新的岗位是否发挥了作用，没有发挥是因为自身没有学习到，没有理解到，还是因为相关资源配合的不好，还是人际处理有问题，要及时的观察到，及时的给于解决，而不是任由他自己发展。&lt;/p&gt;&#xD;
&lt;p&gt;如果改变成功，说明本次提拔很成功，人选对了，岗位合适了，而且还有下一次提拔的基础，这个人的发展也就越来越顺利了，公司自然因为选对了人，后续工作都好做了很多。&lt;/p&gt;&#xD;
&lt;p&gt;如果改变不成功，或者一般，这个人还是付出了很多，就是因为学习能力，接受能力，理解能力确实很难提高了，也没有办法，人和人是有差距的，这个不能不承认。没有关系，就让他在这个新的岗位上继续干吧，反正差也不会差到哪里去得，一个人自己愿意承担，愿意改变，也作出了改变的努力，我认为肯定会有成果的，可能成果较小，总比提拔一个不愿意承担，不愿意改变的好多了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;总之，提拔合适的人到合适的岗位。而且，提拔不是一次性工作，是一个持续的工作，需要后续的配合。&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2293222.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2011/12/19/2293222.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/archive/2011/12/08/2280700.html</id><title type="text">项目-团队-技术-个人（专业篇）</title><summary type="text">1引言今天，我的话题是“专业”。这里的“专业”，指的不是我们常说的“计算机技术”、“英语”、“物理”这些个专业，但它也是我们常会提到的另一种“专业“。我们肯定听说过下面的一些说法：1、 我们的队伍很专业。2、 我们的产品很专业。3、 我很专业。4、 谁谁谁很专业。5、 我们的公司很专业。公司可以专业，团队可以专业，个人也可以专业，产品亦可以专业，到底什么才是专业？为什么大家都在强调自己或者自己的东西专业？2专业的定义按照我的理解，专业指的就是“做事的专业”。大体包括：做事的方法要专业和做事的态度要专业，以及在做事之前的准备工作要专业。准备工作包括了知识准备和技术准备。3专业的详细介绍3.1准备</summary><published>2011-12-08T06:16:00Z</published><updated>2011-12-08T06:16:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2011/12/08/2280700.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2011/12/08/2280700.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;1引言&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;今天，我的话题是&amp;ldquo;专业&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;这里的&amp;ldquo;专业&amp;rdquo;，指的不是我们常说的&amp;ldquo;计算机技术&amp;rdquo;、&amp;ldquo;英语&amp;rdquo;、&amp;ldquo;物理&amp;rdquo;这些个专业，但它也是我们常会提到的另一种&amp;ldquo;专业&amp;ldquo;。我们肯定听说过下面的一些说法：&lt;/p&gt;&#xD;
&lt;p&gt;1、 我们的队伍很专业。&lt;/p&gt;&#xD;
&lt;p&gt;2、 我们的产品很专业。&lt;/p&gt;&#xD;
&lt;p&gt;3、 我很专业。&lt;/p&gt;&#xD;
&lt;p&gt;4、 谁谁谁很专业。&lt;/p&gt;&#xD;
&lt;p&gt;5、 我们的公司很专业。&lt;/p&gt;&#xD;
&lt;p&gt;公司可以专业，团队可以专业，个人也可以专业，产品亦可以专业，到底什么才是专业？为什么大家都在强调自己或者自己的东西专业？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;2专业的定义&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;按照我的理解，专业指的就是&amp;ldquo;做事的专业&amp;rdquo;。大体包括：做事的方法要专业和做事的态度要专业，以及在做事之前的准备工作要专业。准备工作包括了知识准备和技术准备。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3专业的详细介绍&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3.1准备工作&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;让我们先来说说做事之前的准备工作，这里都有哪些&amp;ldquo;专业&amp;rdquo;呢？如何做，怎么做才叫&amp;ldquo;专业&amp;rdquo;呢？我相信大家对于这个问题，都有自己的见解和想法。其实学习从广义来说，也是一种做事。这里独立出来，是因为本文中的做事指的是为了完成任务，或者为了实现某种功能、效果，达成某种目的，而利用学习的成果来达成以上目的，这个过程被我称为&amp;ldquo;做事&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;准备工作需要通过学习来完成。&lt;/p&gt;&#xD;
&lt;p&gt;学习也需要专业，包括学习方法和学习途径的专业。因为如果不够专业，就可能会影响到后面的做事，因为不够专业的学习，产生的知识体系和结构就可能不够专业，做事过程中的选择就不够专业，做出的事情，我相信也专业不到那里去。&lt;/p&gt;&#xD;
&lt;p&gt;学习方法的专业。学习方法要尽量对头，少走弯路，符合自己的性格特点，使得自己能最大化的理解和掌握学习的内容，使得自己可以节约时间和精力。毕竟人的时间和精力都是有限的，尤其是在上了年龄之后，这个问题就会更加凸显出来。年轻的时候，时间很富裕，人的精力也旺盛，就可以不太讲究，年龄大了之后，时间精力都不足了，就更加需要专业的学习方法来节约时间和精力。&lt;/p&gt;&#xD;
&lt;p&gt;学习途径的专业。不能走外门邪道，不要妄想走捷径，不要相信所谓的速成，就算有速成，那也是给那些天资聪慧者的，但是大部分人都不是天资聪慧者，但是同时也要想办法少走弯路，提高效率，至少保证不走歪路，不要浪费我们的效率。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3.2做事方法&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;做事方法的专业。这个就需要结合行业来确定了，不同的行业，有不同的专业方法，要按照专业的方法做事，这样做成的事才会更容易被用户接受，更不容易被对手超越。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3.3做事态度&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;做事态度的专业。这个是任何行业都需要的，而且都是一样的。如果说行业不一样，学习的内容不一样，做事的方法不一样，是可以接受的。但是做事的态度，任何行业都需要专业的做事态度，态度不专业，态度不认真，结果可想而知了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;4结论&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从个人角度来说，我们要努力做专业的人；从团队角度来说，我们要努力打造专业的团队，打造专业的产品；从公司角度来说，我们要建设专业的公司，产出专业的产品，培育专业的人才。这三者的结合，我相信是那些大公司之所以称之为大的基础和根本原因。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;5扩展内容&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是针对一个软件产品团队来说，如何专业，或者说那些方面需要专业，我的一点个人理解。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;一、学习&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先离不开学习，有学习才有积累，有积累才有成功。成功之后，就更加需要学习和积累，因为我们还要持久，要持久化我们的成功。下面是一个从学习到超越的过程定义：&lt;/p&gt;&#xD;
&lt;p&gt;1、 学习。通过书籍、资料学习。&lt;/p&gt;&#xD;
&lt;p&gt;2、 思考。反思学习的内容，反思别人的产品，反思自己的产品。&lt;/p&gt;&#xD;
&lt;p&gt;3、 模仿、借鉴。模仿别人，借鉴别人好的地方，包括方法，流程，态度，产品。&lt;/p&gt;&#xD;
&lt;p&gt;4、 超越。有了以上的基础，反思自己的产品，反思别人的产品，超越就是顺其自然了。经过前面的工作之后，想不超越，都难了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;二、对专业的认识&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个产品团队，在前期可以不太专业，甚至是不专业。因为专业需要大量时间和资源。因为前期要快速出产品，要抢占先机，没有太多时间和资源，所以我们可以不专业。但是后期不能不专业，随着产品被市场初步认可，下一步市场就会提出更多、更严格的要求，这时候专业就尤为重要了。就要求我们进行领域细分，工作细分，在每个点都要加倍的专业起来，否则我们前期建立起来的市场，很快就会消失殆尽的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;三、需要专业的部门&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;产品&lt;/p&gt;&#xD;
&lt;p&gt;开发&lt;/p&gt;&#xD;
&lt;p&gt;测试&lt;/p&gt;&#xD;
&lt;p&gt;运维&lt;/p&gt;&#xD;
&lt;p&gt;市场&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;四、精彩博客&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是一些大公司，或者说在专业方面做的很不错的公司的一些团队博客，在博客中他们分享了学习工作的成果，从这些博客中可以看出他们的专业。感谢这些公司团队的无私分享，希望有更多公司加入分享的队伍，分享自己的专业，让更多的人可以学习到真正的专业，让我们一起专业起来。&lt;/p&gt;&#xD;
&lt;p&gt;从这些博客的友情链接中，可以找到更多优秀的博客，因为被这些博客链接的，大多也是比较优秀的博客。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;测试&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘宝QA&lt;a href="http://qa.taobao.com/"&gt;http://qa.taobao.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘测试&lt;a href="http://www.taobaotest.com/"&gt;http://www.taobaotest.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;技术&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘宝搜索技术团队&lt;a href="http://www.searchtb.com/"&gt;http://www.searchtb.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘宝共享数据平台&lt;a href="http://www.tbdata.org/"&gt;http://www.tbdata.org/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘宝通用产品团队&lt;a href="http://rdc.taobao.com/team/jm/"&gt;http://rdc.taobao.com/team/jm/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘宝核心系统团队&lt;a href="http://rdc.taobao.com/blog/cs/"&gt;http://rdc.taobao.com/blog/cs/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘宝数据库技术团队&lt;a href="http://www.taobaodba.com/"&gt;http://www.taobaodba.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;腾讯soso团队博客&lt;a href="http://blog.csdn.net/soso_blog"&gt;http://blog.csdn.net/soso_blog&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;新浪开发者博客&lt;a href="http://developers.sinaapp.com/"&gt;http://developers.sinaapp.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;百度搜索研发部博客&lt;a href="http://stblog.baidu-tech.com/"&gt;http://stblog.baidu-tech.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;百度互联网技术博客&lt;a href="http://blog.csdn.net/baiduforum"&gt;http://blog.csdn.net/baiduforum&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;产品与用户体验&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;淘宝用户体验团队&lt;a href="http://ued.taobao.com/"&gt;http://ued.taobao.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;百度泛用户体验&lt;a href="http://www.baiduux.com/"&gt;http://www.baiduux.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;百度无线用户体验&lt;a href="http://mux.baidu.com/"&gt;http://mux.baidu.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;阿里巴巴用户体验&lt;a href="http://www.aliued.cn/"&gt;http://www.aliued.cn/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;腾讯交互式用户体验&lt;a href="http://isux.tencent.com/"&gt;http://isux.tencent.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;腾讯WXD用户体验&lt;a href="http://wsd.tencent.com/"&gt;http://wsd.tencent.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;腾讯CDC &lt;a href="http://cdc.tencent.com/"&gt;http://cdc.tencent.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2280700.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2011/12/08/2280700.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/archive/2011/11/30/2268526.html</id><title type="text">项目-团队-技术-个人 （团队建设篇）</title><summary type="text">可能是工作的时间长了，加上自己也是个有点心的人，最近一年开始思考一些技术周边的事情。团队建设。团队如何高效。如何提高团队成员的水平。如何让团队保持进取心，保持积极的工作态度，保持他们对于技术的渴望和追求。如何激励他们，绩效，氛围，以身作则，言谈举止，哪一个更有效。感觉敏捷、结对、代码审查也许可以解决部分问题。新人如何快速融入团队，新人如何成长，缩短新人进入团队的磨合期。如何使工作3-5年的人保持积极的热情，积极的工作态度，唤醒他们对技术的渴望和追求。如何指导他们的下一步发展，如何引导他们的下一步发展，帮助他们确定下一步的发展方向。1、每天早晨进行站立会议。带头主动发言，说明进度及问题，有无需要</summary><published>2011-11-30T00:01:00Z</published><updated>2011-11-30T00:01:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2011/11/30/2268526.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2011/11/30/2268526.html"/><content type="html">&lt;p&gt;可能是工作的时间长了，加上自己也是个有点心的人，最近一年开始思考一些技术周边的事情。&lt;/p&gt;&#xD;
&lt;p&gt;团队建设。&lt;/p&gt;&#xD;
&lt;p&gt;团队如何高效。&lt;/p&gt;&#xD;
&lt;p&gt;如何提高团队成员的水平。&lt;/p&gt;&#xD;
&lt;p&gt;如何让团队保持进取心，保持积极的工作态度，保持他们对于技术的渴望和追求。&lt;/p&gt;&#xD;
&lt;p&gt;如何激励他们，绩效，氛围，以身作则，言谈举止，哪一个更有效。&lt;/p&gt;&#xD;
&lt;p&gt;感觉敏捷、结对、代码审查也许可以解决部分问题。&lt;/p&gt;&#xD;
&lt;p&gt;新人如何快速融入团队，新人如何成长，缩短新人进入团队的磨合期。&lt;/p&gt;&#xD;
&lt;p&gt;如何使工作3-5年的人保持积极的热情，积极的工作态度，唤醒他们对技术的渴望和追求。如何指导他们的下一步发展，如何引导他们的下一步发展，帮助他们确定下一步的发展方向。&lt;/p&gt;&#xD;
&lt;p&gt;1、每天早晨进行站立会议。带头主动发言，说明进度及问题，有无需要协调的资源，有无需要细化的工作。有需要的话，大家再坐下来沟通和讨论。 &lt;br /&gt;2、星期五下午，团队组织技术交流。可以是介绍一周自己的进度及工作问题，也可以提出自己的疑问，也可以讲述自己近来的学习成果，新发现。内容限定为技术话题。 &lt;br /&gt;3、鼓励工作之余学习各种技术，其他平台，其他语言，参与开源项目，将来有机会发展我们自己的开源项目。可以在周五下午分享学习的成果，学习碰到的问题，大家一起帮助解决。 &lt;br /&gt;4、建立对外的开发团队博客。在博客中建立个人简介。每个人都可以发表文章。内容限定为技术博客。学习成果，工作中解决的问题，好的分析解决方案，新的发现，都可以发表。 &lt;br /&gt;5、活跃团队气氛，加强交互，形成良性成长环境，加速新人成长，缩短新人期。 &lt;br /&gt;6、允许个人选择自己喜欢的工作内容，尽量的安排每个人做自己喜欢的工作，使得每个人对项目的整体进度有更多的了解，可以提升工作效率。 &lt;br /&gt;7、引入结对编程。两种组合形式：1、技术相差不多的两个人结对，可以加速成长。2、新人入职之后，先和骨干结对，及时发现新人的问题，编码习惯问题，思维方式问题，命名习惯问题，及时解决，加速新人成长，还可以控制新人犯错的空间。可以定期更换结对，让每个人都了解项目的整体状况，也可以避免长期从事一种工作内容导致的兴趣减低带来的效率降低。 &lt;br /&gt;8、代码共享，每个人都可以修订别人的代码，重构自己的代码。逐渐抛弃&amp;ldquo;你的代码就是你维护，我的代码就是我维护&amp;rdquo;这样一种不良的想法，项目是大家的，代码也是大家的，大家要对项目负责，不管是谁写得代码，每个人都需要对他负责，而不只是当初编写的人负责。 &lt;br /&gt;9、引入单元测试，在重构和修订代码之前，先写好单元测试，保证重构和修订不影响原有代码的功能。通过编写单元测试，增加程序可测试性，改善代码结构。从改善局部设计开始做起，在以后的编码中逐渐形成良好的编码习惯，积累设计经验。 &lt;br /&gt;10、严格把控模块之间交互接口的设计，尽量避免不合理的设计对后面模块集成带来的问题。 &lt;br /&gt;11、对代码进行审查，从代码中发现不好的习惯，同时也发现好的习惯，从代码入手，减少开发-测试的往复工作，提高编程的愉快度。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2268526.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2011/11/30/2268526.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/archive/2011/11/29/2267939.html</id><title type="text">MongoDB在Windows2003上得安装配置及使用</title><summary type="text">MongoDB安装配置及使用 引言 本文档适用于MongoDB2.0.1版本在windows2003上的安装、配置，以及使用。 官网 http://www.mongodb.org 下载 进入http://www.mongodb.org/downloads页面，下载2.0.1版本。或者根据需要下载最新的稳定版本。 安装 将下载之后的压缩包解压到任意目录即可，本文假设解压到【D:...</summary><published>2011-11-29T09:51:00Z</published><updated>2011-11-29T09:51:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2011/11/29/2267939.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2011/11/29/2267939.html"/><content type="html">&lt;p&gt;&lt;b&gt;MongoDB&lt;/b&gt;&lt;b&gt;安装配置及使用&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;引言&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;本文档适用于MongoDB2.0.1版本在windows2003上的安装、配置，以及使用。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;官网&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mongodb.org"&gt;http://www.mongodb.org&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;下载&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;进入&lt;a href="http://www.mongodb.org/downloads"&gt;http://www.mongodb.org/downloads页面，下载2.0.1&lt;/a&gt;版本。或者根据需要下载最新的稳定版本。&lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:/Documents and Settings/Administrator.KB-SHIWENBIN/Local Settings/Temp/WindowsLiveWriter-429641856/supfiles2022101/image18[1].png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image18_thumb" border="0" alt="image18_thumb" src="http://images.cnblogs.com/cnblogs_com/virusswb/201111/201111291751592880.png" width="604" height="166" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;安装&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;将下载之后的压缩包解压到任意目录即可，本文假设解压到【D:\mongodb】目录。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;创建数据目录和日志文件的目录&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:/Documents and Settings/Administrator.KB-SHIWENBIN/Local Settings/Temp/WindowsLiveWriter-429641856/supfiles2022101/image15[1].png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image15_thumb" border="0" alt="image15_thumb" src="http://images.cnblogs.com/cnblogs_com/virusswb/201111/201111291752039659.png" width="604" height="196" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;创建日志文件&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:/Documents and Settings/Administrator.KB-SHIWENBIN/Local Settings/Temp/WindowsLiveWriter-429641856/supfiles2022101/image12[1].png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image12_thumb" border="0" alt="image12_thumb" src="http://images.cnblogs.com/cnblogs_com/virusswb/201111/201111291752051413.png" width="604" height="162" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:/Documents and Settings/Administrator.KB-SHIWENBIN/Local Settings/Temp/WindowsLiveWriter-429641856/supfiles2022101/image9[1].png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image9_thumb" border="0" alt="image9_thumb" src="http://images.cnblogs.com/cnblogs_com/virusswb/201111/201111291752122082.png" width="604" height="316" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;在上面的编辑器界面中，使用【alt+f】调出【File】菜单，选择【Save】项，然后选择【Exit】项退出编辑器。检查log目录是否存在一个log.txt文件，存在可以进行下面的步骤，不存在也可以在windows界面直接建立一个空的log.txt文件。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;启动mongodb服务&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;将mongodb创建为windows系统服务，并且启动mongodb服务。&lt;/p&gt;  &lt;p&gt;进入mongodb的bin目录，使用mongod创建服务，注意其中的目录参数值。&lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:/Documents and Settings/Administrator.KB-SHIWENBIN/Local Settings/Temp/WindowsLiveWriter-429641856/supfiles2022101/image6[1].png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image6_thumb" border="0" alt="image6_thumb" src="http://images.cnblogs.com/cnblogs_com/virusswb/201111/201111291752142931.png" width="604" height="249" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;创建服务&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;mongod --install --serviceName mongodb --logpath d:\mongodb\data\log\log.txt --logappend --dbpath d:\mongodb\data\db --directoryperdb&lt;/p&gt;  &lt;p&gt;参数：&lt;/p&gt;  &lt;p&gt;directoryperdb，可选参数，每个数据库使用单独的文件夹存放。&lt;/p&gt;  &lt;p&gt;&lt;b&gt;启动服务&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;net start mongodb&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;使用&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;登录本机mongodb&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mongodb服务启动之后，打开命令行工具。&lt;/p&gt;  &lt;p&gt;登录&lt;/p&gt;  &lt;p&gt;mongo 127.0.0.1:27017&lt;/p&gt;  &lt;p&gt;27017是mongodb的默认端口&lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:/Documents and Settings/Administrator.KB-SHIWENBIN/Local Settings/Temp/WindowsLiveWriter-429641856/supfiles2022101/image3[1].png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image3_thumb" border="0" alt="image3_thumb" src="http://images.cnblogs.com/cnblogs_com/virusswb/201111/201111291752153671.png" width="604" height="79" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;登录远程mongodb&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;登录&lt;/p&gt;  &lt;p&gt;mongo 192.168.0.137:27017&lt;/p&gt;  &lt;p&gt;27017是mongodb的默认端口&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;基本命令&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;显示当前数据库&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;db&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;显示所有数据库&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;show dbs&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;创建数据库&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;没有创建数据库的命令，可以先使用【use test1】来切换数据库，这时候还没有创建数据库，在该数据库下创建集合或者给集合中添加数据之后，会自动创建数据【test1】。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;切换数据库&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;use test&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;显示数据库的集合&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;show collections&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;创建集合&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;db.createCollection(“users”)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;查看db命令的帮助&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;db.help()&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;查看collection命令的帮助&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;db.collection.help()&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;插入数据&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;db.users.save({“name”:”shiwenbin”,”age”:100})&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;检索数据&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;db.users.find()&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;分页&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;db.users.find().skip(2).limit(3)&lt;/p&gt;  &lt;p&gt;skip，掠过指定的条数。&lt;/p&gt;  &lt;p&gt;limit，获取指定的条数。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;命令帮助&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;查看任何一个命令的帮助都是都过这个命令的help()来查看关于这个命令的参数及用法。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;常见问题&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;中文乱码&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;使用代码插入中文之后，使用代码读取出来是正常的，但是在命令行工具中查看插入的中文，会显示乱码。这主要是因为cmd窗口的编码方式引起的，因为mongodb后台的编码都是utf-8，可以通过修改cmd窗口的编码来解决这个问题。&lt;/p&gt;  &lt;p&gt;1） 打开一个cmd窗口，键入【chcp 65001】&lt;/p&gt;  &lt;p&gt;2） 然后打开cmd窗口的属性窗口，在字体中选择除“点阵字体”外的其他任何字体&lt;/p&gt;  &lt;p&gt;&lt;a href="file:///C:/Documents and Settings/Administrator.KB-SHIWENBIN/Local Settings/Temp/WindowsLiveWriter-429641856/supfiles2022101/image[1].png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image_thumb[1]" border="0" alt="image_thumb[1]" src="http://images.cnblogs.com/cnblogs_com/virusswb/201111/201111291752185010.png" width="604" height="319" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;3） 再次查询数据就可以了&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2267939.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2011/11/29/2267939.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/archive/2011/11/04/2236497.html</id><title type="text">【翻译】MVC vs. MVP vs. MVVM</title><summary type="text">MVC vs. MVP vs. MVVM1 简介 原文地址： MVC vs.MVP vs.MVVM&amp;#171; Niraj Bhatt – Architect&amp;#39;s Blog 三者的目的都是分离关注，使得UI更容易变换（从Winform变为Webform），使得UI更容易进行单元测试。2 MVC MVP2.1 MVC 1、View接受用户的交互请求， 2、View将请求转交给Controller， 3、Controller操作Model进行数据更新 4、数据更新之后，Model通知View数据变化 5、View显示更新之后的数据 View和Controller使用Strategy模式实现</summary><published>2011-11-04T09:38:00Z</published><updated>2011-11-04T09:38:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/archive/2011/11/04/2236497.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/archive/2011/11/04/2236497.html"/><content type="html">&lt;div style="text-align: center;"&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;h1 style="text-align: center;"&gt;MVC vs. MVP vs. MVVM&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="text-align: center;"&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div style="text-align: center;"&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1 简介&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;　　原文地址：&lt;/div&gt;&#xD;
&lt;h3 &gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a  href="http://www.google.com.hk/url?sa=t&amp;amp;rct=j&amp;amp;q=mvc%2Bvs.%2Bmvp%2Bvs.%2Bmvvm&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CCoQFjAA&amp;amp;url=http%3A%2F%2Fnirajrules.wordpress.com%2F2009%2F07%2F18%2Fmvc-vs-mvp-vs-mvvm%2F&amp;amp;ei=Rq6zTqSBIqGJmQWV1Z28Aw&amp;amp;usg=AFQjCNGTpxvHkGQ9v8kBI5dOGVB2-ePUoA&amp;amp;sig2=VbhZva7dDQJxwOTxDh5Fjg"&gt;&lt;em&gt;MVC vs&lt;/em&gt;.&amp;nbsp;&lt;em&gt;MVP vs&lt;/em&gt;.&amp;nbsp;&lt;em&gt;MVVM&lt;/em&gt;&amp;nbsp;&amp;laquo; Niraj Bhatt &amp;ndash; Architect's Blog&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;三者的目的都是分离关注，使得UI更容易变换（从Winform变为Webform），使得UI更容易进行单元测试。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;2 MVC MVP&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2011/24476/2011110417301778.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.1 MVC&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、View接受用户的交互请求，&lt;/p&gt;&#xD;
&lt;p&gt;2、View将请求转交给Controller，&lt;/p&gt;&#xD;
&lt;p&gt;3、Controller操作Model进行数据更新&lt;/p&gt;&#xD;
&lt;p&gt;4、数据更新之后，Model通知View数据变化&lt;/p&gt;&#xD;
&lt;p&gt;5、View显示更新之后的数据&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;View和Controller使用Strategy模式实现，View使用Composite模式，View和Model通过Observer模式同步信息。Controller不知道任何View的细节，一个Controller能被多个View使用。MVC的一个缺点是很难对controller进行单元测试，Controller操作数据，但是如何从View上断言这些数据的变化呢？例如，点击一个View的按钮，提交一个事件给Controller，Controller修改Model的值。这个值反映到View上是字体和颜色的变化。测试这个Case还是有点困难的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.2 MVP&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、&amp;nbsp; View接受用户的交互请求&lt;/p&gt;&#xD;
&lt;p&gt;2、&amp;nbsp; View将请求转交给Presenter&lt;/p&gt;&#xD;
&lt;p&gt;3、&amp;nbsp; Presenter操作Model进行数据库更新&lt;/p&gt;&#xD;
&lt;p&gt;4、&amp;nbsp; 数据更新之后，Model通知Presenter数据发生变化&lt;/p&gt;&#xD;
&lt;p&gt;5、&amp;nbsp; Presenter更新View的数据&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Presenter将Model的变化返回给View。和MVC不同的是，presenter会反作用于view，不像controller只会被动的接受view的指挥。正常情况下，发现可以抽象view，暴漏属性和事件，然后presenter引用view的抽象。这样可以很容易的构造view的mock对象，提高可单元测试性。在这里，presenter的责任变大了，不仅要操作数据，而且要更新view。&lt;/p&gt;&#xD;
&lt;p&gt;在现实中mvp的实现会根据view的充、贫血而有一些不同，一部分倾向于在view中放置简单的逻辑，在presenter放置复杂的逻辑，另一部分倾向于在presenter中放置全部的逻辑。这两种分别被称为：Passive View和Superivising Controller。&lt;/p&gt;&#xD;
&lt;p&gt;在Passive View中，为了减少UI组件的行为，使用controller不仅控制用户事件的响应，而且将结果更新到view上。可以集中测试controller，减小view出问题的风险。&lt;/p&gt;&#xD;
&lt;p&gt;在Superivising Controller中的controller既处理用户输入的响应，又操作view处理view的复杂逻辑。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3 M-V-VM&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2011/24476/2011110417303626.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MVVM是在原有领域Model的基础上添加一个ViewModel，这个ViewModel除了正常的属性意外，还包括一些供View显示用的属性。例如在经典的MVP中，view有一个属性ischeck，需要在presenter中设置view的ischeck值。但是在MVVM中的presenter也会有一个ischeck属性来同步view的ischeck属性，可能会用到observer模式同步ischeck的值。在MVVM中，presenter被改名为ViewModel，就演变成了你看到的MVVM。在支持双向绑定的平台，MVVM更受欢迎。例如：微软的WPF和Silverlight。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2236497.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/archive/2011/11/04/2236497.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/articles/2214570.html</id><title type="text">《PHP5 Power Programming》学习笔记2</title><summary type="text">PHP5的高级面向对象编程1、属性和方法的重载function __get($property)function __set($property,$value)function __call($method,$args)2、数组重载有点像c#的索引器，使得访问对象可以像访问数组一样，使用下标来访问。需要实现接口interface ArrayAccess{ bool offsetExists($index); mixed offsetGet($index); void offsetSet($index,$new_value); void offsetUnset($index);}3、迭代...</summary><published>2011-10-17T01:07:00Z</published><updated>2011-10-17T01:07:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/articles/2214570.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/articles/2214570.html"/><content type="html">&lt;p&gt;PHP5的高级面向对象编程&lt;/p&gt;&#xD;
&lt;p&gt;1、属性和方法的重载&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; __get(&lt;span style="color: #800080;"&gt;$property&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; __set(&lt;span style="color: #800080;"&gt;$property&lt;/span&gt;,&lt;span style="color: #800080;"&gt;$value&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; __call(&lt;span style="color: #800080;"&gt;$method&lt;/span&gt;,&lt;span style="color: #800080;"&gt;$args&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;2、数组重载&lt;/p&gt;&#xD;
&lt;p&gt;有点像c#的索引器，使得访问对象可以像访问数组一样，使用下标来访问。&lt;/p&gt;&#xD;
&lt;p&gt;需要实现接口&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt; ArrayAccess{&lt;br /&gt;  bool offsetExists(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;);&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;mixed&lt;/span&gt; offsetGet(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;);&lt;br /&gt;  void offsetSet(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;,&lt;span style="color: #800080;"&gt;$new_value&lt;/span&gt;);&lt;br /&gt;  void offsetUnset(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;3、迭代器&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4、反射&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2214570.html?type=2" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/articles/2214570.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/virusswb/articles/2213878.html</id><title type="text">《PHP5 Power Programming》学习笔记1</title><summary type="text">PHP5和PHP4的比较1、PHP4的构造函数，使用定义一个和类名同名的function来作为类的构造函数。PHP5保留了这种做法，但是添加了一个新的方法。 function __construct($name){ $this-&amp;gt;name=$name; }2、PHP4的对象引用，需要添加&amp;amp;来声明，否则会重新创建一个新的对象。PHP5变更为面向对象的方式，只要是对象实例，赋值就代表引用，不用添加&amp;amp;来声明。3、PHP4使用new创建对象的时候，返回的是对象本身，而PHP5返回的是对象句柄，或者说是一个对象的ID号，方法调用和属性访问没有受到影响，受到影响的是对象的复制。cla</summary><published>2011-10-16T02:07:00Z</published><updated>2011-10-16T02:07:00Z</updated><author><name>Virus-BeautyCode</name><uri>http://www.cnblogs.com/virusswb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/virusswb/articles/2213878.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/virusswb/articles/2213878.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;PHP5和PHP4的比较&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、PHP4的构造函数，使用定义一个和类名同名的function来作为类的构造函数。PHP5保留了这种做法，但是添加了一个新的方法。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; __construct(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;){&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;name=&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;;&lt;br /&gt;    }&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;2、PHP4的对象引用，需要添加&amp;amp;来声明，否则会重新创建一个新的对象。PHP5变更为面向对象的方式，只要是对象实例，赋值就代表引用，不用添加&amp;amp;来声明。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3、PHP4使用new创建对象的时候，返回的是对象本身，而PHP5返回的是对象句柄，或者说是一个对象的ID号，方法调用和属性访问没有受到影响，受到影响的是对象的复制。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyClass{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #800080;"&gt;$var&lt;/span&gt;=1;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #800080;"&gt;$obj1&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MyClass();&lt;br /&gt;&lt;span style="color: #800080;"&gt;$obj2&lt;/span&gt;=&lt;span style="color: #800080;"&gt;$obj1&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #800080;"&gt;$obj2&lt;/span&gt;-&amp;gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;=2;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;echo&lt;/span&gt; &lt;span style="color: #800080;"&gt;$obj1&lt;/span&gt;-&amp;gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;.'&amp;lt;br&amp;gt;';&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;上面这段代码在PHP4输出的是1，因为构造函数返回的是对象本身，复制给$obj2的是一个全新的MyClass实例，所以修改$obj2.var并不影响$obj1.var的值。&lt;/p&gt;&#xD;
&lt;p&gt;但是在PHP5中，输出的结果是2，因为构造函数返回的是对象ID，复制给$obj2的就是$obj1的句柄，所以他们是同一个对象实例。变更哪一个，都会对另外一个产生影响。&lt;/p&gt;&#xD;
&lt;p&gt;4、instanceof替代is_a()内置函数&lt;/p&gt;&#xD;
&lt;p&gt;5、__CLASS__是一个特殊的常量，用来存储当前类名&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;PHP5面向对象&lt;/p&gt;&#xD;
&lt;p&gt;PHP5和C#的比较&lt;/p&gt;&#xD;
&lt;p&gt;1、C#的索引器和PHP5的重载数组语法&lt;/p&gt;&#xD;
&lt;p&gt;目的都是让类的实例使用起来就像数组一样。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; SampleCollection&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; T[] arr = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; T[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; T &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;[&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i]&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; arr[i];&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            arr[i] = value;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; This class shows how client code uses the indexer&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;    {&lt;br /&gt;        SampleCollection&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt; stringCollection = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SampleCollection&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;        stringCollection[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello, World&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;        System.Console.WriteLine(stringCollection[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;]);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&amp;lt;?php&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt; ArrayAccess{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;  bool       offsetExists(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;  &lt;span style="color: #0000ff;"&gt;mixed&lt;/span&gt;    offsetGet(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;  void        offsetSet(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;,&lt;span style="color: #800080;"&gt;$new_value&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;  void        offsetUnset(&lt;span style="color: #800080;"&gt;$index&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; UserToSocialSecurity &lt;span style="color: #0000ff;"&gt;implements&lt;/span&gt; ArrayAccess{&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #800080;"&gt;$db&lt;/span&gt;;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; offsetExists(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;){&lt;br /&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;  &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;db-&amp;gt;userExists(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; offsetGet(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;){&lt;br /&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;  &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;db-&amp;gt;getUserId(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; offsetSet(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;){&lt;br /&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;  &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;db-&amp;gt;setUserId(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;,&lt;span style="color: #800080;"&gt;$id&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; offsetUnset(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;){&lt;br /&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;  &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;db-&amp;gt;removeUser(&lt;span style="color: #800080;"&gt;$name&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;?}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/virusswb/aggbug/2213878.html?type=2" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/virusswb/articles/2213878.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
