﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-认识世界，认识JAVA-文章分类-优秀文章搜集</title><link>http://www.blogjava.net/qclass/category/9334.html</link><description>解放思想，实事求是</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:46:38 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:46:38 GMT</pubDate><ttl>60</ttl><item><title>程序开发团队---团队精神篇</title><link>http://www.blogjava.net/qclass/articles/51909.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Sat, 10 Jun 2006 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/51909.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/51909.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/51909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/51909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/51909.html</trackback:ping><description><![CDATA[
		<p>原文地址：<a href="http://blog.csdn.net/spsms/archive/2006/05/26/755682.aspx">http://blog.csdn.net/spsms/archive/2006/05/26/755682.aspx</a><br /><br />　　混了这么多年，从BOSS们口中听到的最多的教诲词语估计就是“团队精神”了，尽管部分BOSS实际上并不了解什么是团队精神，但他们了解中国革命的最终成功是离不开“团结就是力量”这句出自伟人之口的话语，中华民族历来都具有勤劳、团结的优秀品质，小时候在农村混，看到很多团结的现象，家属里的兄弟姐妹无论平时如何地大吵大闹动刀动枪，但一旦外部力量比如别的家属侵犯到本家属，他们会不顾从前，团结起来，一致对外，还有一个村对另一村，平时不管大家有什么矛盾，对另一村时都会团结起来，共同面对敌人，所以农村里经常发生打群架的宏大场面，一个胡同对另一个胡同的小孩，一个村的对另一村的人，场面混乱，男女老少，刀光棍影，乱石飞扬，声势浩大，老谋子什么时候有空来拍一部诸如此类题材的电影，说不定在奥斯卡颁奖大会上能扬眉吐气一把，呵呵。</p>
		<p>　　回到程序开发团体的话题，在以前的工作过程中，我有时会发现一个很怪的现象，一个程序由一个程序员开发时，程序员总是敷衍了事，效果较差，如果由两个人来开发，他们又经常性地互相推诿，效果也不好，由三个或更多的程序员负责时，效果更差，永无成事之日，真是让人烦恼，这不是程序员的技术问题，而更多的是管理问题，比如不科学的分工，或过分强调个人的责任，或程序员之间的性格冲突等原团，导致团队如同一盘散沙，没有凝聚力，这是可怕的事情，直接的结果就是项目的彻底失败。</p>
		<p>　　那么如何避免发生以上的情况，如何形成出色的团队精神，提高团队的凝聚力，让团队发挥更大的力量呢？</p>
		<p>　　要形成出色的团队精神，我觉得应在工作团队中达到以下几个方面的一致：</p>
		<p>
				<br />
				<strong>
						<font color="#ff0000">第一，   在目标上达成一致：</font>
				</strong>
				<br />　　我们都喜欢交一些志同道合的朋友，因为志不同道不合的人，让我们很难沟通与交流，也很难在思想上有火花冒出，共同的目标是一种意境，在程序开发团队中，只要有一名程序员与团队的目标不致，那么该团队的整体水平将受到影响，这种影响不仅仅来自于这个程序员本身，而也来自于团队内部其他程序员的绩效下降，在心理上，其它程序员总能感觉到团队内部的分歧或者某个同伴漠不关心的态度；因此，为了实现团队目标的一致，最好的办法莫过于让程序组自已来确定其目标，这样做的好处有：首先，在目标的制定时的广泛参与，可以确保目标能被大家充分理解，而不是某个LEADER的个人行为；另外，目标制定的过程使团队中的每个程序员可以有机会对共同的目标做出公开的承诺，提高目标的可接受性，增加目标的清晰程度。团队成员即程序员广泛也参与到目标的制定、讨论，让他们感受到自已在团队中的重要性，以及团队的成功就是他们自已的成功，以后不论遇到任何困难，他们都会团结一致，勇往直前。</p>
		<p>
				<br />
				<strong>
						<font color="#ff0000">第二，   共同承担责任：</font>
				</strong>
				<br />　　建立一个环境，使每个团队成员在这个环境中都感到自已应对团队的绩效负责，除了勇于承担自已的那部分责任，而敢于承担团队的共同责任，遇到问题或困难时，勇于接受挑战，而不是互相推诿，这样，团队的目标才能继续前进。</p>
		<p>
				<br />
				<font color="#ff0000">
						<strong>第三，   一位值得尊重的团队领导：</strong>
				</font>
				<br />　　在实际工作中，遇到一名糟糕的主管要比找到一名出色的程序容易得多。在我前些的编程工作中，我的部分领导是通过外部力量而任命的，比如老板觉得那个搞市场或搞工程或搞行政的人很能干，就派他来做程序团队的LEADER，事实上他们可能了解一些规范化的玩意，但并不具备为了在开发团队中实施自已的影响所必需的能力，这种LEADER往往喜欢不懂装懂，手提长鞭高高在上，就象一个不可一世的军官那样发号施令，不难想象，极少程序员会服他听他，一种最典型的反应就是“消极怠工”，严重的还会造成LEADER与PROGRAMMER的冲突，以致于有一方辞职不干了，多般是程序员，呵呵，因此程序开发团队的LEADER最好是一位具有优秀的开发能力和管理能力的资深程序员，他不仅仅得到团队中程序员的尊敬或崇拜，而且他也可借助自已的专业判断力量，来支撑自已作为领导者的地位，基于对开发技术与流程的了解，他会根据程序员的特点进行科学分工，并在开发过程中作出正确的判断与决策。</p>
		<p> </p>
		<p>
				<strong>
						<font color="#ff0000">第四，   关系融洽：</font>
				</strong>
				<br />　　团队成员之间应该优势互补、性格互补、相互支持、善于沟通，彼此之间坦诚相待、相互信任，并勇于表达自我，这样的团队就会齐心协力，成为一个强有力的集体。</p>
<img src ="http://www.blogjava.net/qclass/aggbug/51909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-06-10 23:46 <a href="http://www.blogjava.net/qclass/articles/51909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给学生与软件业新手的十招</title><link>http://www.blogjava.net/qclass/articles/51905.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Sat, 10 Jun 2006 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/51905.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/51905.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/51905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/51905.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/51905.html</trackback:ping><description><![CDATA[
		<p>莘莘学子与软件业新手请听听在下的十招～对于这十招提供了一些基本的解释也希望能以诙谐的方式帮助各位加深印象～相信这十招各位经过更多经历磨练后会有更多解释～所以把这篇从原篇中独立出来，希望能方便读者参考：</p>
		<p>
				<font color="#0000ff">
						<strong>第一招：看到问题念十次<br /></strong>
				</font>　a. 确认你记得问题下次还记得<br />　b. 确认你了解问题，没有漏掉什么要求<br />　c. 确认你以后碰到类似问题，还会想到它<br />　d. 确认你连做梦都会想到它～悲惨的程序设计师宿命～</p>
		<p>
				<strong>
						<font color="#0000ff">第二招：程序不会写，先开始写注解</font>
				</strong>
				<br />　a. 例用注解将问题描述，将问题做分析<br />　b. 把分析方法与解法都 document 起来～对你自己最有益处<br />　c. 直接注解而省略白纸，由注解行数的改变，让你老板知道你有在努力做～<br />　c. 人家是用照片写记忆～程序设计师是用文件写记忆～</p>
		<p>
				<strong>
						<font color="#0000ff">第三招：解法不会写，先写工具</font>
				</strong>
				<br />　a. 一个复杂的问题，尤其是面对演算法相关的所谓困难部份，如果能把工具(诸如模拟)写出来，这样是比较容易找出解法的～<br />　b. 工具总是可以拿来重覆利用的～这会让你越写越轻松～<br />　c. 写工具也是一种重要练习～</p>
		<p>
				<strong>
						<font color="#0000ff">第四招：整个问题不会解，先解会解的</font>
				</strong>
				<br />　a. divide and conquer（偶称它为个个击破法） 不用多说，不知道网上查也会知道～<br />　b. 就像写论文一样，如果无法提出所有问题的统一解决方法，限定一些条件来解<br />　c. 还有有时候一下就想最困难的问题，一来浪费进度、二来心情不佳、三来老板可能把预算砍了因为没有结果～所以先解会解的是经验上的金玉良言～因为一来你花了２０％完成了80%超越进度，老板来拍肩膀了，二来你解了简单问题心情大好，更觉得整个问题也没什么大不了，说不定困难问题因心情好（没有专牛角尖）也就想到而解决了，三来老板看你有成果说不定常拍你肩膀哩～(老板这时候真好骗～可惜薪水不好骗)</p>
		<p>
				<strong>
						<font color="#0000ff">第五招：查网络、问别人、看书获取各种解题的资源</font>
				</strong>
				<br />　a. 想想偶们还在用193x的理论，当然问题绝不可能只有你才碰到，一定粉多人早就见过了～只有你碰到的通常是你自己写出来的bug～<br />　b. 这是群策群力的时代，多找资源、人家的经验和别人帮忙～<br />　c. 对应于b, 现在这个社会最忌讳单打独斗, 那代表你不能 team work～<br />　d. 增加知名度、人缘～ Social 粉重要～切记～切记～</p>
		<p>
				<strong>
						<font color="#0000ff">第六招：暴力法求解再找最佳化<br /></font>
				</strong>　a. 先求有再求好～<br />　b. 有成果人家才看得见～不然做不出来，中间再怎么完美都没有用～<br />　c. 暴力法通常是最白痴也最有效的办法～<br />　d. 有时白痴解法最好～因为只有呆子在演东西给傻子和电脑看～你还期待有什么人会看你的程序？偶们高贵的使用者吗？<br />　e. 一代伟人邓小平同志说过：「黑猫、白猫 会抓老鼠的就是好喵」</p>
		<p>
				<strong>
						<font color="#0000ff">第七招：多印追踪资料少侦错</font>
				</strong>
				<br />　a. 讲得粉白话～就是要你可以节省出问题找错的时间～这样才有更多时间解决真正是问题的问题<br />　b. 因为有追踪资料 (trace information)不仅你可以找问题，别人也才可以帮你找出问题，想想吧～如果 compiler 只告诉你程序错，而没告诉你大约是哪里它碰到错～你要花多少时间解决一个打错字的问题<br />　c. 真正的问题也常能由追踪资料找出蜘丝马迹<br />　d. 养成习惯，不要等到当了还在想怎么写追踪资料的程序码或可以重覆发生的方法～<br />　e. 你是坏人哟～干嘛坏怕留下线索～还是你是蜘蛛精，「偶挥挥手不带走一片data而死机」所以，人家是照相机抓得住偶，程序设计师是用 bug 抓往住偶～偶不是故意帮那家快倒的、没有「即时更新技术」的公司打广告～</p>
		<p>
				<strong>
						<font color="#0000ff">第八招：多读、多写、多想、多说</font>
				</strong>
				<br />　a. 多读，像第一招，有时候会帮助你了解问题的所在或 think out of box，读也包括读参考资料～<br />　b. 多写，熟能生巧～工欲善其事，必先利其器～<br />　c. 多想，解法大部份还是要脑袋想出来，即使是人家的也要脑袋理解、吸收<br />　d. 多说，只有在你能表达出问题所在，才表示你真正了解问题～只有你能表达出你的知识，那个知识才是你的～</p>
		<p>
				<strong>
						<font color="#0000ff">第九招：学会改进重于学会重写</font>
				</strong>
				<br />　a. 任何时间都要学会成本控制～不然你就没有经费～<br />　b. 当来练习学会维护别人写得烂程序～以后碰到再怎么烂也看得懂～<br />　c. 为什么烂－用注解的方法记录下来，有机会(成本效益考量)再改进-记住是改进，不是重写<br />　d. 由这种维护的痛苦加深写好程序的方法和印象～真是歹命呀～;)<br />　e. 工作机会要找改进的粉多，完全写新的粉少～</p>
		<p>
				<font color="#0000ff">
						<strong>第十招：记得备份</strong>
				</font>
				<br />　a. 即使BMW也会 Crash，那「软～」体会可能都不死机吗？有谁说他家有装避雷针不怕闪电、有水管(ＰＶＣ)把电源线和所有线包起来不让老鼠咬～还有说他写的程序永远不会当 (如果是，偶送你Taiwan No 1封号的病毒～)<br />　b. 让电脑忙一下让脑袋休息一下，对大家都好～<br />　c. 还是记得备份～远方又传来哀嚎：「神啊～请让偶记得备份～」</p>
		<p>大约解释一下，听得懂的请消化吸收、听不懂的当偶是说笑话也可以～希望大家能把软件产业走得更进步～<br /></p>
<img src ="http://www.blogjava.net/qclass/aggbug/51905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-06-10 23:39 <a href="http://www.blogjava.net/qclass/articles/51905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于软件开发团队的一些思考</title><link>http://www.blogjava.net/qclass/articles/51903.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Sat, 10 Jun 2006 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/51903.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/51903.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/51903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/51903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/51903.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#ff0000">
						<strong>概述：<br /></strong>
				</font>
				<br />　　目前一些软件开发团队，特别是中小型团队，由于在低成本模式下运行，加之对软件过程管理的不尽规范，在团队建设上只重视代码开发，不重视设计，只重视编程技术，不重视需求分析、架构设计等技术，只重视开发过程，不重视测试过程，只重视任务，不重视风险等问题，是许多软件公司不能很好的以高效率模式开发出稳定可靠的软件产品的重要原因。 <br /><br />　　软件产品的开发，技术路线确定以后，团队组织以及过程管理就成为团队领导人的核心工作内容，项目负责人一般情况下也是技术决策人，这种角色的兼任对中小团队来说也是有效的，但问题出现在项目负责人大多都是优秀程序员出身，对软件技术有着很高的热情，但对项目管理以及更高层次上的团队建设方面就显得有些能力不足。这也会造成一些软件开发的高手做出来的产品却不尽如人意的尴尬局面。<br /> <br />　　其实在工作中，以公司的现有条件以及技术特点，在目前一些成熟的模型基础上建立个有公司自身特点的团队建设基本原则以及实施办法，执之以恒的加以贯彻执行，对公司产品目标的形成，公司核心技术的形成，公司核心团队的形成都会产品重大的影响。 </p>
		<p>
				<strong> <font color="#ff0000">具有一定普遍意义的风险：<br /></font></strong>
				<br />　　在许多项目开发或产品开发中，失败的原因一般有以下几类，一是功能及性能没能满足应用的需求；二是需求变化导致项目成本的增加；三是技术水平不足导致项目成本的增加；四是团队出现重大变动，导致研发过程不能正常继续。<br /> <br />　　功能及性能方面：一般来说，功能及性能方面主要是需求目标没能得到充分重视，特别是性能、安全以及部署等非功能性需求；对核心业务本身，需求分析过程中是被关注最多的，但如何理解这些核心业务，如何用正确的架构完成核心业务的实现，这期间如果控制不当，也会产生许多导致成本增加、工期延长等许多不确定性结果。在需求分析阶段，对需求没有系统的过程控制，带来的风险是非常大的，这往往会成为项目失败在技术上的最先出现的原因；虽然所有的软件团队对需求分析都非常重视，但如果在方法及管理过程中不能有效的控制与管理，也很难避免由于需求阶段存在的风险给整个产品或项目带来严重的问题，几乎所有的中小型软件团队都会有过类似的经历。 <br /><br />　　需求变化：需求变化是当前软件产品或项目必需适应的，为了具备这个适应能力，除了在架构设计方面要考虑到系统的可维护性，可扩展性以外，对需求的变更管理及相应的风险评估经实践证明是比较有效的管理手段，在这方面技术与技术管理同样重要，缺少哪个环节，都会给产品或项目带来可能导致项目失败的隐患。 <br /><br />　　技术水平不足：在沈阳地区具有一定的普遍性，目前沈阳市软件开发人员资源并不丰富，大多数优秀开发人员都流向了北京、上海等行业发达地区，其它比较好的开发人员基本上都在大型企业中，根据近两年的经验，能在社会中用招聘方式组建的研发团队，即要有一定的实践经验，同时要保障在同一平台下工作，其质量很难达到快速开发的目的，即使是存在了许多年的团队，也会随着技术人员的流动对团队技术水平带来许多的不确定性；如何能有效的吸引高素质高水平程序员，如何有效的培养高忠诚度的核心员工以及如何有效的利用外部资源，这是目前大多数软件开发团队所面临的重要课题。 <br /><br />　　团队出现重大变动：这是个比较极端的情况，但却会经常发生，在对2003-2004两年政府项目就多次出现了因为项目团队中人员流动多大，导致项目无法进行的情况（如省民防办、新闻出版局等），这也是一个不容忽视的风险。 <br /><br />　　要有效的规避风险，在其变成问题前采取有效的措施，是风险管理的主要任务，这里并不做具体的风险评估，只是由于在团队建设方面存在的一些不完善，会成为这些风险（甚至不只是这些）存在的原因，所以才显得重要，其实说到底，就是软件产品不可能是小作坊式的开发方式能完成的，是否具备完善有效的控制能力，规避由其所带来的质量与可靠性方面引起的风险是关系到团队生存的大事。 </p>
		<p> </p>
		<p>
				<font color="#ff0000">
						<strong>团队模型的完善：<br /></strong>
				</font>
				<br />　　团队模型是软件开发队伍建设的基础，一个结构合理的团队，虽然不能保证项目一定成功，但却是保障产品长期稳定的保持高质量、高可靠性的基础。 <br /><br />　　这里所建议的团队模型，参考了敏捷开发和CMM、MSF等重要模型，并在实践中应用了两年以上，应该说是一个有效的中小团队模型；这个模型本身不是固定不变的，它应结合不同时期，不同团队的特点，加以完善，提高其可行性与有效性。 </p>
		<p> </p>
		<p>
				<font color="#ff0000">
						<strong>团队模型中的重要概念：<br /></strong>
				</font>
				<br />
				<font color="#ff0000">
						<strong>团队的基本构思：</strong>
				</font>
				<br />
				<br />　　为了弥补传统项目小组自上而下的层次结构的一些不足，研发团队应是小型、跨学科的小组，在这样的小组中成员们共同承担各项职责，权衡彼此间能力差异，以便将主要精力集中到手头上的工作中。他们拥有共同的项目前景，以部署产品为中心，坚持高标准的质量和沟通，保持乐意学习的心态。本文描述了小组中的各种角色群，以及他们的目标和职能领域。同时提供了指导，以便根据产品规模和复杂性来保障一个高效的团队。 </p>
		<p>
				<br />
				<strong>
						<font color="#ff0000">清晰的责任，共同的职责：</font>
				</strong>
				<br />
				<br />　　将工作进行中需要共同承担的职责和确保工作如期完成需明确的工作责任结合起来。 <br /><br />　　团队模型基于这样一个前提，即小组里的每个角色都代表了对项目的一种独一无二的观点，但是没有哪个个人能够完全代表所有的不同质量目标。为了解决这一问题，把对各种利益相关人的清晰角色职责与实现这个项目成功的整个小组的责任结合起来了。<br /> <br />　　在小组内部，每个角色通过对小组本身负责（也对他们各自所属的组织负责）实现该角色的质量目标。在这种意义上，每个角色都对最终解决方案质量的一部分负责。小组成员之间共同承担职责（根据不同小组角色指派）。角色之间是相互依赖的，有以下两个原因：首先，就其必要性而言，因为把每个角色的工作分隔开来是不可能的；其次，出于优先的原因，如果每个角色都了解全局情况，那么小组的效率会更高。这种相互的依赖性会鼓励小组成员对由他们负责的直接区域以外的工作做出评论和贡献，以确保小组所有的知识、能力和经验能够被应用到产品的构造里。项目的成功属于所有的小组成员；他们共同分享一个成功的项目所带来的荣誉和回报，他们也同时希望，即使是一项不太成功的项目，也能做到全心投入并从中吸取教训以完善他们的专长。 </p>
		<p> </p>
		<p>
				<strong>
						<font color="#ff0000">赋予小组成员权力：</font>
				</strong>
		</p>
		<p>　　在一个高效的小组里，所有的成员都被赋予权力以便根据他们自己的承诺交付任务，并且充分信任小组的其他成员也能实现各自的承诺。类似的，未来客户也能够认为小组将会兑现其承诺，并进行相应的规划。在最坏的情况下，小组也应该尽快地告知客户项目出现了哪些延迟和变化。 <br /><br />　　赋予小组成员权力，让其承担指派的承诺。这种授权包括向小组成员提供进行工作所需的各种资源；负责制定决策以有效影响队员的工作；理解队员的权力界限，并不断增加各种可用途径来处理越权问题。 <br /><br />　　准备好向其他成员允诺。这些准备包含了心态（进行面谈并乐意采取行动）、就绪，并理解承诺的内在含义以及它对当前工作量和资源的影响。这样做的结果就是，不到小组成员清楚承诺的内在含义，就不要作出承诺。相反，小组成员要提出一个更小的、他们能够理解的承诺，例如对这些承诺的内在含义进行研究，然后再迅速坚定地作出承诺。对较小承诺的成功交付将建立小组的信任。 <br /><br />　　清晰定义自己担负的承诺。这样可以避免一些可能会导致小组成员间信任危机的误会。 <br /><br />　　做出一切合理的努力来交付承诺的工作。如果一个小组有来自不同组织的成员，那么合理的期望也将因人而异。例如，某些小组成员可能认为在周末工作是合理的；而其他人则可能将他们视为例外或者可能在周末几乎不会去上班。 <br /><br />　　发现承诺陷入危机时进行真诚的沟通。有时将无法避免事情的变化，原因可能是某些任务的优先级调整、一个意外事件或仅仅是因为一项工作延期完成。及早的进行沟通将使与之相依赖的其他小组成员可以有机会制定相应的计划。也许他们还可以提出解决这些问题的途径。 <br />　　这些行为应与企业文化是融合在一起的，队员们已经将它们视为一种文化，因此很少讨论它们。但是，团队有时需要与不同的组织一起工作，在这些组织中的相关的价值观念并没有被完全地了解和注重。这些组织常常呈现出一种高度推诿的文化，这种文化约束着应该开放的信息流。在这些情况下，团队领导应当根据这一点来清楚地陈述他们的期望并帮助新的小组成员适应这种工作方式。 </p>
		<p>
				<br />
				<strong>
						<font color="#ff0000">共同的项目设想：</font>
				</strong>
				<br />
				<br />　　全力提倡采用一个共同的设想，以便把注意力放在小组的工作方法上，包括在一个操作环境里交付产品完整的解决方案及服务。 <br /><br />　　对项目和过程的目标有一个清晰的了解是很重要的。因为小组成员和客户都在猜测这项解决方案能为组织做些什么。一个共同的设想将使这些猜测明确化，并确保所有参与者都在为完成相同的目标而努力着。共同的设想是团队组织模型的基础之一。 <br /><br />　　当所有的参与者都了解了这一设想并朝着这一设想工作的时候，小组便能够根据成员使自己的决策与这一设想体现的更为广阔的小组意图相吻合，从而获得他们的权力。 <br /><br />　　没有共同的设想，小组成员可能出现与目标相抵触的观点，作为一个团体的交付将变得更加困难。并且即便小组完成交付，小组成员也很难确定自己的成功，因为这种成功依赖于他们评价成功的设想。 </p>
		<p> </p>
		<p>
				<strong>
						<font color="#ff0000">以客户为中心： <br /><br /></font>
				</strong>　　满足客户对任何优秀的团队来说都被看作是第一位的。在整个开发过程中，以客户为中心包含了小组对了解和解决客户业务问题的承诺。衡量以客户为中心的理念体系获得成功的方法之一是能否使设计中每一个特性都符合客户和用户需求。同样，实现客户满意度的一个关键方式是使用户积极地参与设计并在整个开发过程中提供反馈意见。这样，小组和客户都能的使期望和需求更加吻合。 <br /> </p>
		<p>
				<strong>
						<font color="#ff0000">零缺陷：</font>
				</strong>
				<br />
				<br />　　在一个成功的团队中，所有成员都感到要对产品的质量负责。产品质量责任不能由一个团队成员委托给另一个成员或部门。同样，每个成员都要作为客户的拥护者，在整个开发周期中考虑最终产品的可用性。 <br /><br />　　零缺陷理念是对质量的承诺。这意味着目标是尽可能最高效地执行工作，这样即使不得不在明天就交付产品，他们也可以交付出一些东西。这个想法是让每一天都有一个接近可交付的产品。这并不意味着交付不存在任何缺陷的代码；这意味这产品满足或超出了项目出资人的质量要求并在预想阶段被小组接受。 <br /><br />　　用自动机车装配线作类比最有力的描述了这一概念。传统上，工作人员将汽车由单独的部分组装起来并且为他们自身的质量负责。当汽车下线，一名检查员进行检查并判断该汽车的质量是否达到售卖的标准。然而在这个过程的后期，大量的时间将花费在查找所有的问题上，因为在此时进行纠错是极富价值的。同样，既然质量是不可预计的，在后期决定产品是否可售卖所需花费的时间也是不可预计的。 <br /><br />　　在当前的汽车制造业中，质量已经成为了“第一工作”。这意味着当工作正在进行时（例如正在装配一扇车门或是安装一部收音机），检查员同时审查该项工作以确保它符合为标准的汽车所定义的质量标准。只要在整个装配过程中保持该级别的质量，那么在后期为确保这辆汽车的质量可接受只需要花费更少的时间和资源。这使生产过程更可预测因为检测员只需要检查各个部分的整合处而不是所有个别的工作。</p>
		<p> </p>
<img src ="http://www.blogjava.net/qclass/aggbug/51903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-06-10 23:35 <a href="http://www.blogjava.net/qclass/articles/51903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene 分词原理</title><link>http://www.blogjava.net/qclass/articles/45958.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Sat, 13 May 2006 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/45958.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/45958.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/45958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/45958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/45958.html</trackback:ping><description><![CDATA[Lucene是一个高性能的java全文检索工具包，它使用的是倒排文件索引结构。该结构及相应的生成算法如下： <br /><br />0）设有两篇文章1和2 <br />文章1的内容为：Tom lives in Guangzhou,I live in Guangzhou too. <br />文章2的内容为：He once lived in Shanghai. <br /><br />1)由于lucene是基于关键词索引和查询的，首先我们要取得这两篇文章的关键词，通常我们需要如下处理措施 <br />a.我们现在有的是文章内容，即一个字符串，我们先要找出字符串中的所有单词，即分词。英文单词由于用空格分隔，比较好处理。中文单词间是连在一起的需要特殊的分词处理。 <br />b.文章中的”in”, “once” “too”等词没有什么实际意义，中文中的“的”“是”等字通常也无具体含义，这些不代表概念的词可以过滤掉 <br />c.用户通常希望查“He”时能把含“he”，“HE”的文章也找出来，所以所有单词需要统一大小写。 <br />d.用户通常希望查“live”时能把含“lives”，“lived”的文章也找出来，所以需要把“lives”，“lived”还原成“live” <br />e.文章中的标点符号通常不表示某种概念，也可以过滤掉 <br />在lucene中以上措施由Analyzer类完成 <br /><br />经过上面处理后 <br />文章1的所有关键词为：[tom] [live] [guangzhou] [i] [live] [guangzhou] <br />文章2的所有关键词为：[he] [live] [shanghai] <br /><br />2) 有了关键词后，我们就可以建立倒排索引了。上面的对应关系是：“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来，变成：“关键词”对“拥有该关键词的所有文章号”。文章1，2经过倒排后变成 <br />关键词 文章号 <br />guangzhou 1 <br />he 2 <br />i 1 <br />live 1,2 <br />shanghai 2 <br />tom 1 <br /><br />通常仅知道关键词在哪些文章中出现还不够，我们还需要知道关键词在文章中出现次数和出现的位置，通常有两种位置：a)字符位置，即记录该词是文章中第几个字符（优点是关键词亮显时定位快）；b)关键词位置，即记录该词是文章中第几个关键词（优点是节约索引空间、词组（phase）查询快），lucene中记录的就是这种位置。 <br /><br />加上“出现频率”和“出现位置”信息后，我们的索引结构变为： <br />关键词 文章号[出现频率] 出现位置 <br />guangzhou 1[2] 3，6 <br />he 2[1] 1 <br />i 1[1] 4 <br />live 1[2],2[1] 2，5，2 <br />shanghai 2[1] 3 <br />tom 1[1] 1 <br /><br />以live 这行为例我们说明一下该结构：live在文章1中出现了2次，文章2中出现了一次，它的出现位置为“2,5,2”这表示什么呢？我们需要结合文章号和出现频率来分析，文章1中出现了2次，那么“2,5”就表示live在文章1中出现的两个位置，文章2中出现了一次，剩下的“2”就表示live是文章2中第 2个关键字。 <br /><br />以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的（lucene没有使用B树结构），因此lucene可以用二元搜索算法快速定位关键词。 <br /><br />实现时 lucene将上面三列分别作为词典文件（Term Dictionary）、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词，还保留了指向频率文件和位置文件的指针，通过指针可以找到该关键字的频率信息和位置信息。 <br /><br />Lucene中使用了field的概念，用于表达信息所在位置（如标题中，文章中，url中），在建索引中，该field信息也记录在词典文件中，每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。 <br /><br />为了减小索引文件的大小，Lucene对索引还使用了压缩技术。首先，对词典文件中的关键词进行了压缩，关键词压缩为&lt;前缀长度，后缀&gt;，例如：当前词为“阿拉伯语”，上一个词为“阿拉伯”，那么“阿拉伯语”压缩为&lt;3，语&gt;。其次大量用到的是对数字的压缩，数字只保存与上一个值的差值（这样可以减小数字的长度，进而减少保存该数字需要的字节数）。例如当前文章号是16389（不压缩要用3个字节保存），上一文章号是16382，压缩后保存7（只用一个字节）。 <br /><br />下面我们可以通过对该索引的查询来解释一下为什么要建立索引。 <br />假设要查询单词 “live”，lucene先对词典二元查找、找到该词，通过指向频率文件的指针读出所有文章号，然后返回结果。词典通常非常小，因而，整个过程的时间是毫秒级的。 <br />而用普通的顺序匹配算法，不建索引，而是对所有文章的内容进行字符串匹配，这个过程将会相当缓慢，当文章数目很大时，时间往往是无法忍受的。<br /><img src ="http://www.blogjava.net/qclass/aggbug/45958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-05-13 11:54 <a href="http://www.blogjava.net/qclass/articles/45958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2006年最新统计web2.0新鲜网站列表及介绍 </title><link>http://www.blogjava.net/qclass/articles/45952.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Sat, 13 May 2006 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/45952.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/45952.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/45952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/45952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/45952.html</trackback:ping><description><![CDATA[        Posted by kunstao in 网络新知Ten Bills，似乎是个卖T恤衫的网站。 用户可以付上10个美元可以挑选一件个性化的，自己中意的T恤衫。网站后台其实是一个供画家，设计师，音乐迷，艺术爱好者，自由思想家们交流的平台。 在这里大家可以共同为了T恤衫的设计献计献策。据称，T恤衫已经成了现代艺术的载体。 
<p>　　Alex’s Coupons 提供近1000家商店的最新的交易情况和折扣券的信息。 同时也提供一些有关儿童癌症方面的知识。 站长是一个患有癌症的7岁女孩的父亲，他自女儿10个月起就一直坚持与癌症斗争。</p><p>　　Pooxi法国的在线视频向导和视频搜索引擎</p><p>　　projectspaces 团队协作工具</p><p>　　HomePortals是又一个可定制，可扩展的桌面主页产品。产品的独特之处在于，任何模块均可定制，并且可以与其他网络服务的界面可以完全融合。 你可以定制一个新的模块(其他用户可以复制)，你也可以修改已有的模块的特性。比如，你可以选择一个预设好的模块，上面可以显示delicious的书签和flickr的图片。</p><p>　　HomePorals同时拥有一个很好的博客blogging工具模块，在blog总可以内置flickr和delicious，这样访客可以对该用户有个深度的理解。</p><p>　　AjaxTrans 翻译工具，提供英,西，德，意,葡,法等语言之间的实时互译。</p><p>　　Findory ，这是一个blog和新闻的个性化引擎。 已实现正向现金流</p><p>　　Diglog：记录有趣、新鲜的信息，分享。类似Slashdot，digg。</p><p>　　LinkLike同一领域的blogger和公司网站，利用广告位交换提高各自网站流量的网站。</p><p>　　Bibli，发布和共享你的作品，如诗歌，小故事，剧本和小说等。</p><p>　　Favorville2。0的互助平台，这是一家位于多伦多的网站，其基本原理是这样的，用户经注册后，即可发布求助或给予帮助的信息，每次帮助结束的时候，用户需要对另一个用户的帮助进行评级和评论。 被帮助和帮助过别人的人形成一个圈子。 也有交友的特性。</p><p>　　Fotoflix相片共享和相片管理</p><p>　　Clipfire允许用户提交电子商务的交易，其他用户可以对交易进行评级，并将最好的交易置顶。 有点象 Digg，但是只是在电子商务领域。</p><p>　　url(x) URL页面链接的缩写服务</p><p>　　blummy:一个书签集成工具。</p><p>　　Magnatune这其实是03年就上线的网站，它具有独特的音乐付费模式，可能会代表将来网络音乐的消费模式。</p><p>　　blogall：在线的博客网址站,博客站点收藏夹。</p><p>　　Near-time网络协同服务，用户可以创建团体空间，整合群体博客，wiki和日程。 小型企业，工作组以及一些专业人员将是Near-time的目标用户，它提供一个中心化的交流沟通平台，方便团组互动,协作和知识分享，无需安装软件。</p><p>　　Librivox这是一个巨大的项目，打算将已经免于版权保护的书籍录制成音频，以播客的形式放于网上供用户播放收听，这个项目需要大量的志愿者。</p><p>　　OPML增加新的RSS新闻聚合。。包括一个先进的Podcast播客，可以播放视频文件，也包括一个”阅读清单”，允许用户订阅别人推荐的内容。</p><p>　　爬狗：专业的格式化搜索引擎：目前有房产租售、求职招聘、物品交易、交友约会、企业服务、个人服务、餐饮娱乐消费等。</p><p>　　jigsaw：提供名片交易,分享。盈利模式清晰，已经获得VC。不过涉及个人隐私,有争议。</p><p>　　Diigo意为“Digest of Internet Information，Groups and other stuff”，有一个社会性书签网站，可以允许用户高亮显示多个内容区，该网站有不少新的功能。</p><p>　　Browsr从某种意义来说,，这是一个标准的书签网站，但它似乎又缺乏作为社会性书签应有的一些先进功能，如 Delicious Shadows和Wink。</p><p>　　但Browsr也有特色的功能，在这里，书签可以分成各个类别，其他的用户可以评级该书签的有用性，而后Browsr会生成一个内含最受欢迎的类别和评级最高的书签的目录页面。</p><p>　　Kolablog 多媒体blog服务，可以拖放发布视频文件，在线播客的录制(甚至可以将Skype中的对话录制成播客)，配音的幻灯片等。</p><p>　　ZohoWriter，在线字处理，编辑，共享文件，tagging，发布至blog，等，现已结束beta正式发布。</p><p>　　Echosign帮助管理执行文件的工具。 解决了类似律师事务所等需要在文件上签字的文件的传输问题。</p><p>　　retrievr 站内内置Flash的画板，用户可以粗略地在首页的画板上画出想找的对象的草图，系统会帮用户从Flickr的图片库中搜索和发现类似的图片，并显示在页面上。</p><p>　　yousendit通过这个服务，你可以”email”很大的文件。 你把此文件上传至网站，告诉网站你要发给的email地址，收件人将收到一个链接，通过该链接他/她可以下载此文件，最大可上传的文件为1G。单个邮件中不能发送多个文件，那是你可发送压缩文件，现提供的免费服务中，允许单一文件在一周内可以下载25次。</p><p>　　Dottunes共享你的原创的iTune音乐作品的软件</p><p>　　YorZ 为公司寻找高级人才的平台。 公司悬赏为成功的推荐人提供奖金。</p><p>　　Shopify 位于加拿大渥太华的网站，旨在解决现在存在于电子商务中的诸如托管，设计及支付方面的问题。 是一个2。0的电子商务平台，提供了一些方便买卖双方为完成交易所必须的一些基本功能。 06年初上线。</p><p>　　hamachi位于加拿大温哥华的网站，12月刚发布了beta版。 用来将2台以上的电脑组建成虚拟网络，并可以进行安全的交流。 也可以远程登录电脑，使用Windows的文件共享,玩LAN游戏。 据称至05年12月已有78。5万用户。</p><p>　　Openvlog在你的blog中创建你自己的视频频道，上传或录制视频并与他人共享</p><p>　　Buzzingo是一个”Yahoo Buzz Index和 Google的I’m feeling lucky 概念的混血应用，自动生成内容，并每个小时更新。</p><p>　　Extratasty共享 ，搜索饮料配方的网站。</p><p>　　Lexxe新的搜索引擎，直接从页面提供简短的，准确的答案。 声称比其他任何搜索引擎的结果的准确度和相关度提高50%。</p><p>　　dPolls 这家位于以色列的网站，为你的网站提供一个设计美观，富于Ajax给你的互动的民意小测验。</p><p>　　Springdoo无需打字，你可以通过麦克风和电脑或直接用电话机录制声频文件，并通过任何email系统将此’声音”发送出去。</p><p>　　MediaMax在线文件和数字媒体的存储网站，免费空间从10G增加到 25G。</p><p>　　FON共享wifi热点宽带接入，让更多的人享受全球的wifi服务</p><p>　　ESBN新型的基于社会的针对电子作家，电子内容提供者和电子出版者的DRM解决方案，数字媒体，如电子书，歌曲，软件和播客的等，可以被分配到一个ESBN的ID号码，并可以跟踪有关所有权，版权，转让寄授权方面的信息。</p><p>　　TRUVEO是一个去年9月推出的媒体搜索引擎，可以快速收录媒体内容，如视频和音频内容。 已被AOL收购。</p><p>　　iNods聚合了blog以及其他一些边缘性的内容，重点主要专注于”购物”这一领域。 iNods把有关购物的blog以及blog后面的评论聚合在一起，将这些内容集中呈现给读者。 iNods也提供搜索，搜索结果可以将读者指向具体的blog并阅读其详细的内容。</p><p>　　HyperSuper个性化新闻聚合，你只要告知该网站你感兴趣的内容，该网站即为你定制个性化的新闻页面。</p><p>　　FeedXS来自荷兰，创意源之于能让任何人可以跳过blog直接发布RSS feed，也许这会成为email的替代品用以发布个人的新闻。</p><p>　　iOweYou在线费用分摊计数器，供共住同一个房间的学生和室友用于分摊费用的工具。</p><p>　　VideoEgg创新视频发布解决方案提供者，刚刚获得August Capital的投资。</p><p>　　BillMonk一项允许人们跟踪记录朋友间债权债务关系的新服务。比如，我以AA制和B朋友吃饭，我付了100美元的帐(这样我和B各承担50美元); 而另一次我和B喝咖啡是B埋的单(B付了16美元)，这样BillMonk就会自动帮我算出B欠我42美元。</p><p>　　LOYOO:在网络上注册ID号，购买有ID号的服装，穿服装和别人认识的网站,好不容易有一个中国的有点意思的站，不过还不太实用。</p><p>　　dohop旅游搜索引擎，比较多个旅游承运人的价格(机票)，现在的价格一欧元标注，来自冰岛。</p><p>　　Hanzo社会性网络存档服务</p><p>　　egoSurf 搜索你的网站/blog在yahoo，MSN，delicious和Technorati的排名。</p><p>　　中国第一,世界第二的1000tags–千签网出台了，这是站长在其博客中的声明。　　1000tags第一个利用“Tag云”进行商业广告的网站，思路类似英国小伙子的”百万首页”milliondollarhomepage。 最多只卖1000个tags，所以域名就叫1000tags。Tag分2种，一是“独家TAG”，用户可以指定某个tag并买断该tag，当访客点击此tag的时候，网站即指向该tag所链接的需要广告的站点。 独家tag的最低费用为250美元，具体看tag字体的大小和字数的多少而定。 最多只卖其中的50个tag作为”独家tag”，售完为止。二是“共享tag”，即多个用户可以共用一个tag，当访客点击此tag时，网站指向该tag的多个用户的需要广告的站点，这些被广告的站点的排名不分先后。 共享tag的最低费用为25美元。 共享的用户越多，该tag的字体越大。因为只售50个独家tag，数量有限，网站不赞成用户去购买独家tag，网站鼓励用户使用共享tag。</p><p>　　你有钱:网络账本;用户自定义分类标签来管理帐务;并形成交流的小圈子。</p><p>　　Veetro一款管理软件，单机版免费。 主要提供财务帐单，项目管理，日程共享，文档管理及销售管理等方面的软件解决方案</p><p>　　PXN8 在线图像编辑器，可将编辑好的图片直接放入Flickr中，或存储在桌面。</p><p>　　NewsLetterArchive 存档并向公众开放所有的邮件新闻，内容由用户贡献</p><p>　　BuddyMarks在线书签管理，可设置私密或共享</p><p>　　GatherNews 2。0的社会性新闻站点，允许用户提交内容，并与用户建立收入分享的机制(基于用户在网上的活动)yubnub命令行。 输入一句命令，自动接入其他的web服务，并显示结果</p><p>　　MeetWithApproval用于安排朋友聚会的网站。 由发起人在该网创建一个”聚合页面”，网站会将此页面通知所有将参加聚会的人员。 每个人通过访问该页面，由大家共同来决定最佳的日子和聚会的最佳方案。</p><p>　　Montastic免费注册后即可监控你所指定的网站的情况，网站的情况通过RSS和邮件通知你。</p><p>　　HelpSpot 基于web的客户服务软件应用，便于管理多个问题咨询，提高服务支持人员的工作效率，适用于大中小型企业的客服。</p><p>　　BiddingBuddies基于eBay混血的SNS网站，是一个经eBay认证的网络应用。 直接可以将用户在eBay的个人资料导入到BiddingBuddies，在该站，用户发现新的买家或卖家，认识新的朋友，共享书签，参加兴趣小组等。</p><p>　　Podzinger曾于前些时候介绍过。 来自麻省的剑桥。 Pozdzinger利用声音识别技术将播客文件转换成可搜索的文本文件。 这一技术原来为中央情报局和其他的一些政府部所说使用。 搜索结果按日期和相关性的高低予以列出。</p><p>　　用户可以从搜索结果中选择所要收听的播客内容。 用户也可以用RSS订阅搜索结果。</p><p>　　Podzinger有CPC广告支持。</p><p>　　Oyogi允许某个群组进行:</p><p>　　1。 运用基于web的即时通讯工具，在成员间就某一话题进行实时协作</p><p>　　2。 问题的互问互答。</p><p>　　3。 对 1和2中的内容进行存储并可进行搜索。</p><p>　　TrueShare商务级的在线文件管理和备份服务。 允许无限量用户使用。 可以发送，接收，备份，存储和获取各种文件类型。 可以为不同的客户创建不同的文件目录，并可跟踪文件的使用情况。 每月30美元提供3G的空间和30G的传输带宽。</p><p>　　图书漂流:关于分享藏书，以书会友的公益性项目。海外有bookcrossing。图书漂流活动源于上世纪60年代的欧洲，该活动是指书友将自己不再阅读的书贴上特定的标签投放到公共场所，如公园的长凳上，无偿地提供给拾取到的人阅读。拾取的人阅读之后，根据标签提示，再以相同的方式将该书投放到公共环境中去。</p><p>　　奇波网:即时搜索,国外称作Instant Search Engine，又称Current Event Search Engine(当前事件搜索引擎)，是指以RSS/ATOM、TAG等新兴技术为基础，专注于频繁更新的博客网站和新闻网站，给用户提供接近实时效果的搜索结果。</p><p>　　ChatSum在你的浏览器上加载一个对话框，让你可以跟正在访问同一个网站的ChatSum的用户聊天交流。</p><p>　　GookBox存储音乐到Gmail邮箱，并直接在POP3邮箱中播放。</p><p>　　Hotpads基于地图的房屋出租的搜索引擎，不是一个混血网站，而是全新的地图应用，现阶段最主要的地区在华盛顿特区，迈阿密，达拉斯和凤凰城</p><p>　　Suckingfish公开或私人小组间的协作平台。 搜索共同感兴趣的主题</p><p>　　WebJay允许用户在网上发布音乐播放清单的网站，已被Yahoo收购。</p><p>　　Fruitcast　播客广告平台</p><p>　　Scupio酷比:号称新一代的搜索引擎，使用者不限字数，利用无限关键字来完整描述出想要搜索的概念，还可以以整篇文章长来直接搜索。酷比来自台湾。</p><p>　　Airset新型的日程协作共享和联系信息管理工具</p><p>　　newzingo自动给滚动的Google新闻进行TAG，并将这些Tag显示在”TAG云”中，TAG的字体越大，跟这个新闻相关的新闻越多。</p><p>　　你的Google新闻MAP</p><p>　　Nuvvo免费的网上学习管理系统，允许教师公布课程表，并进行网上教学。</p><p>　　Shozu 是基于手机的图片,视频分享，它其实提供中间的一个工具内容，用户通过shozu ，将图片上传到指定的在线分享站点，如flickr，Webshots，textamerica。　　使用它需要下载一个安装在手机上面的客户端软件!</p><p>　　Q图是一个创造、收集和分享可爱图片的开放平台。用户可以把一个网页上好看的图片提取出来，也可以用收集的图制作好看的图文日记，再复制到blog上。</p><p>　　packagemapper用地图显示你所寄送的快件(FedEx联邦特快，UPS联合包裹和USPS美国邮政)运送的路线图。 你只要输入承运人和快件号码，即可跟踪你寄送的快件的派送情况。 可以输入多个快件号。 </p><img src ="http://www.blogjava.net/qclass/aggbug/45952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-05-13 11:46 <a href="http://www.blogjava.net/qclass/articles/45952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Java性能优化技巧集锦</title><link>http://www.blogjava.net/qclass/articles/45117.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Mon, 08 May 2006 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/45117.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/45117.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/45117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/45117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/45117.html</trackback:ping><description><![CDATA[
		<p> <span class="Title" twffan="done">Java性能优化技巧集锦<br /></span></p>
		<p>文章原始地址：<a href="http://blog.csdn.net/softj/archive/2006/05/04/707989.aspx">http://blog.csdn.net/softj/archive/2006/05/04/707989.aspx</a><br /><br />一、通用篇 <br />　　1.1 不用new关键词创建类的实例 <br />　　1.2 使用非阻塞I/O <br />　　1.3 慎用异常 <br />　　1.4 不要重复初始化变量 <br />　　1.5 尽量指定类的final修饰符 <br />　　1.6 尽量使用局部变量 <br />　　1.7 乘法和除法 <br />二、J2EE篇 <br />　　2.1 使用缓冲标记 <br />　　2.2 始终通过会话Bean访问实体Bean <br />　　2.3 选择合适的引用机制 <br />　　2.4 在部署描述器中设置只读属性 <br />　　2.5 缓冲对EJB Home的访问 <br />　　2.6 为EJB实现本地接口 <br />　　2.7 生成主键 <br />　　2.8 及时清除不再需要的会话 <br />　　2.9 在JSP页面中关闭无用的会话 <br />　　2.10 Servlet与内存使用 <br />　　2.11 HTTP Keep-Alive <br />　　2.12 JDBC与Unicode <br />　　2.13 JDBC与I/O <br />　　1.14 内存数据库 <br />三、GUI篇 <br />　　3.1 用JAR压缩类文件 <br />　　3.2 提示Applet装入进程 <br />　　3.3 在画出图形之前预先装入它 <br />　　3.4 覆盖update方法 <br />　　3.5 延迟重画操作 <br />　　3.6 使用双缓冲区 <br />　　3.7 使用BufferedImage <br />　　3.8 使用VolatileImage <br />　　3.9 使用Window Blitting <br />四、补充资料 <br />=================================== <br />正文: <br />=================================== <br />一、通用篇 </p>
		<p>“通用篇”讨论的问题适合于大多数Java应用。 </p>
		<p>1.1 不用new关键词创建类的实例 </p>
		<p>用new关键词创建类的实例时，构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口，我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。 </p>
		<p>在使用设计模式（Design Pattern）的场合，如果用Factory模式创建对象，则改用clone()方法创建新的对象实例非常简单。例如，下面是Factory模式的一个典型实现： </p>
		<p>
				<br />public static Credit getNewCredit() {<br />return new Credit();<br />} </p>
		<p> </p>
		<p>改进后的代码使用clone()方法，如下所示： </p>
		<p>
				<br />private static Credit BaseCredit = new Credit();<br />public static Credit getNewCredit() {<br />return (Credit) BaseCredit.clone();<br />} </p>
		<p> </p>
		<p>上面的思路对于数组处理同样很有用。 </p>
		<p>1.2 使用非阻塞I/O </p>
		<p>版本较低的JDK不支持非阻塞I/O API。为避免I/O阻塞，一些应用采用了创建大量线程的办法（在较好的情况下，会使用一个缓冲池）。这种技术可以在许多必须支持并发I/O流的应用中见到，如Web服务器、报价和拍卖应用等。然而，创建Java线程需要相当可观的开销。 </p>
		<p>JDK 1.4引入了非阻塞的I/O库（java.nio）。如果应用要求使用版本较早的JDK，在这里有一个支持非阻塞I/O的软件包。 </p>
		<p>请参见Sun中国网站的《调整Java的I/O性能》。 </p>
		<p>1.3 慎用异常 </p>
		<p>异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地（Native）方法，fillInStackTrace()方法检查堆栈，收集调用跟踪信息。只要有异常被抛出，VM就必须调整调用堆栈，因为在处理过程中创建了一个新的对象。 </p>
		<p>异常只能用于错误处理，不应该用来控制程序流程。 </p>
		<p>1.4 不要重复初始化变量 </p>
		<p>默认情况下，调用类的构造函数时， Java会把变量初始化成确定的值：所有的对象被设置成null，整数变量（byte、short、int、long）设置成0，float和 double变量设置成0.0，逻辑值设置成false。当一个类从另一个类派生时，这一点尤其应该注意，因为用new关键词创建一个对象时，构造函数链中的所有构造函数都会被自动调用。 </p>
		<p>1.5 尽量指定类的final修饰符 </p>
		<p>带有final修饰符的类是不可派生的。在Java核心API中，有许多应用final的例子，例如java.lang.String。为String类指定final防止了人们覆盖length()方法。 </p>
		<p>另外，如果指定一个类为final，则该类所有的方法都是final。Java编译器会寻找机会内联（inline）所有的final方法（这和具体的编译器实现有关）。此举能够使性能平均提高50%。 </p>
		<p>1.6 尽量使用局部变量 </p>
		<p>调用方法时传递的参数以及在调用中创建的临时变量都保存在栈（Stack）中，速度较快。其他变量，如静态变量、实例变量等，都在堆（Heap）中创建，速度较慢。另外，依赖于具体的编译器/JVM，局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。 </p>
		<p>1.7 乘法和除法 </p>
		<p>考虑下面的代码： </p>
		<p>
				<br />for (val = 0; val &lt; 100000; val +=5) { alterX = val * 8; myResult = val * 2; } </p>
		<p> </p>
		<p>用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码： </p>
		<p>
				<br />for (val = 0; val &lt; 100000; val += 5) { alterX = val &lt;&lt; 3; myResult = val &lt;&lt; 1; } </p>
		<p> </p>
		<p>修改后的代码不再做乘以8的操作，而是改用等价的左移3位操作，每左移1位相当于乘以2。相应地，右移1位操作相当于除以2。值得一提的是，虽然移位操作速度快，但可能使代码比较难于理解，所以最好加上一些注释。 </p>
		<p>二、J2EE篇 </p>
		<p>前面介绍的改善性能技巧适合于大多数Java应用，接下来要讨论的问题适合于使用JSP、EJB或JDBC的应用。 </p>
		<p>2.1 使用缓冲标记 </p>
		<p>一些应用服务器加入了面向JSP的缓冲标记功能。例如，BEA的WebLogic Server从6.0版本开始支持这个功能，Open Symphony工程也同样支持这个功能。JSP缓冲标记既能够缓冲页面片断，也能够缓冲整个页面。当JSP页面执行时，如果目标片断已经在缓冲之中，则生成该片断的代码就不用再执行。页面级缓冲捕获对指定URL的请求，并缓冲整个结果页面。对于购物篮、目录以及门户网站的主页来说，这个功能极其有用。对于这类应用，页面级缓冲能够保存页面执行的结果，供后继请求使用。 </p>
		<p>对于代码逻辑复杂的页面，利用缓冲标记提高性能的效果比较明显；反之，效果可能略逊一筹。 </p>
		<p>请参见《用缓冲技术提高JSP应用的性能和稳定性》。 </p>
		<p>2.2 始终通过会话Bean访问实体Bean </p>
		<p>直接访问实体Bean不利于性能。当客户程序远程访问实体Bean时，每一个get方法都是一个远程调用。访问实体Bean的会话Bean是本地的，能够把所有数据组织成一个结构，然后返回它的值。 </p>
		<p>用会话Bean封装对实体Bean的访问能够改进事务管理，因为会话Bean只有在到达事务边界时才会提交。每一个对get方法的直接调用产生一个事务，容器将在每一个实体Bean的事务之后执行一个“装入-读取”操作。 </p>
		<p>一些时候，使用实体Bean会导致程序性能不佳。如果实体Bean的唯一用途就是提取和更新数据，改成在会话Bean之内利用JDBC访问数据库可以得到更好的性能。 </p>
		<p>2.3 选择合适的引用机制 </p>
		<p>在典型的JSP应用系统中，页头、页脚部分往往被抽取出来，然后根据需要引入页头、页脚。当前，在JSP页面中引入外部资源的方法主要有两种：include指令，以及include动作。 </p>
		<p>
				<br />include指令：例如&lt;%@ include file="copyright.html" %&gt;。该指令在编译时引入指定的资源。在编译之前，带有include指令的页面和指定的资源被合并成一个文件。被引用的外部资源在编译时就确定，比运行时才确定资源更高效。 <br />include动作：例如&lt;jsp:include page="copyright.jsp" /&gt;。该动作引入指定页面执行后生成的结果。由于它在运行时完成，因此对输出结果的控制更加灵活。但时，只有当被引用的内容频繁地改变时，或者在对主页面的请求没有出现之前，被引用的页面无法确定时，使用include动作才合算。 <br />2.4 在部署描述器中设置只读属性 </p>
		<p>实体Bean的部署描述器允许把所有get方法设置成“只读”。当某个事务单元的工作只包含执行读取操作的方法时，设置只读属性有利于提高性能，因为容器不必再执行存储操作。 </p>
		<p>2.5 缓冲对EJB Home的访问 </p>
		<p>EJB Home接口通过JNDI名称查找获得。这个操作需要相当可观的开销。JNDI查找最好放入Servlet的init()方法里面。如果应用中多处频繁地出现EJB访问，最好创建一个EJBHomeCache类。EJBHomeCache类一般应该作为singleton实现。 </p>
		<p>2.6 为EJB实现本地接口 </p>
		<p>本地接口是EJB 2.0规范新增的内容，它使得Bean能够避免远程调用的开销。请考虑下面的代码。 </p>
		<p>
				<br />PayBeanHome home = (PayBeanHome) <br />javax.rmi.PortableRemoteObject.narrow <br />(ctx.lookup ("PayBeanHome"), PayBeanHome.class); <br />PayBean bean = (PayBean) <br />javax.rmi.PortableRemoteObject.narrow <br />(home.create(), PayBean.class); </p>
		<p>
				<br />第一个语句表示我们要寻找Bean的Home接口。这个查找通过JNDI进行，它是一个RMI调用。然后，我们定位远程对象，返回代理引用，这也是一个 RMI调用。第二个语句示范了如何创建一个实例，涉及了创建IIOP请求并在网络上传输请求的stub程序，它也是一个RMI调用。 </p>
		<p>要实现本地接口，我们必须作如下修改： </p>
		<p>
				<br />方法不能再抛出java.rmi.RemoteException异常，包括从RemoteException派生的异常，比如 TransactionRequiredException、TransactionRolledBackException和 NoSuchObjectException。EJB提供了等价的本地异常，如TransactionRequiredLocalException、 TransactionRolledBackLocalException和NoSuchObjectLocalException。 <br />所有数据和返回值都通过引用的方式传递，而不是传递值。 <br />本地接口必须在EJB部署的机器上使用。简而言之，客户程序和提供服务的组件必须在同一个JVM上运行。 <br />如果Bean实现了本地接口，则其引用不可串行化。 <br />请参见《用本地引用提高EJB访问效率》。 </p>
		<p>2.7 生成主键 </p>
		<p>在EJB之内生成主键有许多途径，下面分析了几种常见的办法以及它们的特点。 </p>
		<p>利用数据库内建的标识机制（SQL Server的IDENTITY或Oracle的SEQUENCE）。这种方法的缺点是EJB可移植性差。 </p>
		<p>由实体Bean自己计算主键值（比如做增量操作）。它的缺点是要求事务可串行化，而且速度也较慢。 </p>
		<p>利用NTP之类的时钟服务。这要求有面向特定平台的本地代码，从而把Bean固定到了特定的OS之上。另外，它还导致了这样一种可能，即在多CPU的服务器上，同一个毫秒之内生成了两个主键。 </p>
		<p>借鉴Microsoft的思路，在Bean中创建一个GUID。然而，如果不求助于JNI，Java不能确定网卡的MAC地址；如果使用JNI，则程序就要依赖于特定的OS。 </p>
		<p>还有其他几种办法，但这些办法同样都有各自的局限。似乎只有一个答案比较理想：结合运用RMI和JNDI。先通过RMI注册把RMI远程对象绑定到JNDI树。客户程序通过JNDI进行查找。下面是一个例子： </p>
		<p>
				<br />public class keyGenerator extends UnicastRemoteObject implements Remote { <br />private static long KeyValue = System.currentTimeMillis(); <br />public static synchronized long getKey() throws RemoteException { return KeyValue++; } </p>
		<p>
				<br />2.8 及时清除不再需要的会话 </p>
		<p>为了清除不再活动的会话，许多应用服务器都有默认的会话超时时间，一般为30分钟。当应用服务器需要保存更多会话时，如果内存容量不足，操作系统会把部分内存数据转移到磁盘，应用服务器也可能根据“最近最频繁使用”（Most Recently Used）算法把部分不活跃的会话转储到磁盘，甚至可能抛出“内存不足”异常。在大规模系统中，串行化会话的代价是很昂贵的。当会话不再需要时，应当及时调用HttpSession.invalidate()方法清除会话。HttpSession.invalidate()方法通常可以在应用的退出页面调用。 </p>
		<p>2.9 在JSP页面中关闭无用的会话 </p>
		<p>对于那些无需跟踪会话状态的页面，关闭自动创建的会话可以节省一些资源。使用如下page指令： </p>
		<p>
				<br />&lt;%@ page session="false"%&gt; </p>
		<p>2.10 Servlet与内存使用 </p>
		<p>许多开发者随意地把大量信息保存到用户会话之中。一些时候，保存在会话中的对象没有及时地被垃圾回收机制回收。从性能上看，典型的症状是用户感到系统周期性地变慢，却又不能把原因归于任何一个具体的组件。如果监视JVM的堆空间，它的表现是内存占用不正常地大起大落。 </p>
		<p>解决这类内存问题主要有二种办法。第一种办法是，在所有作用范围为会话的Bean中实现HttpSessionBindingListener接口。这样，只要实现valueUnbound()方法，就可以显式地释放Bean使用的资源。 </p>
		<p>另外一种办法就是尽快地把会话作废。大多数应用服务器都有设置会话作废间隔时间的选项。另外，也可以用编程的方式调用会话的 setMaxInactiveInterval()方法，该方法用来设定在作废会话之前，Servlet容器允许的客户请求的最大间隔时间，以秒计。 </p>
		<p>2.11 HTTP Keep-Alive </p>
		<p>Keep-Alive功能使客户端到服务器端的连接持续有效，当出现对服务器的后继请求时，Keep-Alive功能避免了建立或者重新建立连接。市场上的大部分Web服务器，包括iPlanet、IIS和Apache，都支持HTTP Keep-Alive。对于提供静态内容的网站来说，这个功能通常很有用。但是，对于负担较重的网站来说，这里存在另外一个问题：虽然为客户保留打开的连接有一定的好处，但它同样影响了性能，因为在处理暂停期间，本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时，Keep- Alive功能对资源利用的影响尤其突出。 </p>
		<p>2.12 JDBC与Unicode </p>
		<p>想必你已经了解一些使用JDBC时提高性能的措施，比如利用连接池、正确地选择存储过程和直接执行的SQL、从结果集删除多余的列、预先编译SQL语句，等等。 </p>
		<p>除了这些显而易见的选择之外，另一个提高性能的好选择可能就是把所有的字符数据都保存为Unicode（代码页13488）。Java以Unicode形式处理所有数据，因此，数据库驱动程序不必再执行转换过程。但应该记住：如果采用这种方式，数据库会变得更大，因为每个Unicode字符需要2个字节存储空间。另外，如果有其他非Unicode的程序访问数据库，性能问题仍旧会出现，因为这时数据库驱动程序仍旧必须执行转换过程。 </p>
		<p>2.13 JDBC与I/O </p>
		<p>如果应用程序需要访问一个规模很大的数据集，则应当考虑使用块提取方式。默认情况下，JDBC每次提取32行数据。举例来说，假设我们要遍历一个5000 行的记录集，JDBC必须调用数据库157次才能提取到全部数据。如果把块大小改成512，则调用数据库的次数将减少到10次。 </p>
		<p>在一些情形下这种技术无效。例如，如果使用可滚动的记录集，或者在查询中指定了FOR UPDATE，则块操作方式不再有效。 </p>
		<p>1.14 内存数据库 </p>
		<p>许多应用需要以用户为单位在会话对象中保存相当数量的数据，典型的应用如购物篮和目录等。由于这类数据可以按照行/列的形式组织，因此，许多应用创建了庞大的Vector或HashMap。在会话中保存这类数据极大地限制了应用的可伸缩性，因为服务器拥有的内存至少必须达到每个会话占用的内存数量乘以并发用户最大数量，它不仅使服务器价格昂贵，而且垃圾收集的时间间隔也可能延长到难以忍受的程度。 </p>
		<p>一些人把购物篮/目录功能转移到数据库层，在一定程度上提高了可伸缩性。然而，把这部分功能放到数据库层也存在问题，且问题的根源与大多数关系数据库系统的体系结构有关。对于关系数据库来说，运行时的重要原则之一是确保所有的写入操作稳定、可靠，因而，所有的性能问题都与物理上把数据写入磁盘的能力有关。关系数据库力图减少I/O操作，特别是对于读操作，但实现该目标的主要途径只是执行一套实现缓冲机制的复杂算法，而这正是数据库层第一号性能瓶颈通常总是 CPU的主要原因。 </p>
		<p>一种替代传统关系数据库的方案是，使用在内存中运行的数据库（In-memory Database），例如TimesTen。内存数据库的出发点是允许数据临时地写入，但这些数据不必永久地保存到磁盘上，所有的操作都在内存中进行。这样，内存数据库不需要复杂的算法来减少I/O操作，而且可以采用比较简单的加锁机制，因而速度很快。 </p>
		<p>三、GUI篇 </p>
		<p>这一部分介绍的内容适合于图形用户界面的应用（Applet和普通应用），要用到AWT或Swing。 </p>
		<p>3.1 用JAR压缩类文件 </p>
		<p>Java档案文件（JAR文件）是根据JavaBean标准压缩的文件，是发布JavaBean组件的主要方式和推荐方式。JAR档案有助于减少文件体积，缩短下载时间。例如，它有助于Applet提高启动速度。一个JAR文件可以包含一个或者多个相关的Bean以及支持文件，比如图形、声音、HTML 和其他资源。 </p>
		<p>要在HTML/JSP文件中指定JAR文件，只需在Applet标记中加入ARCHIVE = "name.jar"声明。 </p>
		<p>请参见《使用档案文件提高 applet 的加载速度》。 </p>
		<p>3.2 提示Applet装入进程 </p>
		<p>你是否看到过使用Applet的网站，注意到在应该运行Applet的地方出现了一个占位符？当Applet的下载时间较长时，会发生什么事情？最大的可能就是用户掉头离去。在这种情况下，显示一个Applet正在下载的信息无疑有助于鼓励用户继续等待。 </p>
		<p>下面我们来看看一种具体的实现方法。首先创建一个很小的Applet，该Applet负责在后台下载正式的Applet： </p>
		<p>
				<br />import java.applet.Applet;<br />import java.applet.AppletStub;<br />import java.awt.Label;<br />import java.awt.Graphics;<br />import java.awt.GridLayout; <br />public class PreLoader extends Applet implements Runnable, AppletStub {<br />String largeAppletName;<br />Label label;<br />public void init() {<br />// 要求装载的正式Applet<br />largeAppletName = getParameter("applet");<br />// “请稍等”提示信息<br />label = new Label("请稍等..." + largeAppletName);<br />add(label);<br />} <br />public void run(){<br />try {<br />// 获得待装载Applet的类<br />Class largeAppletClass = Class.forName(largeAppletName); <br />// 创建待装载Applet的实例<br />Applet largeApplet = (Applet)largeAppletClass.newInstance(); <br />// 设置该Applet的Stub程序<br />largeApplet.setStub(this); <br />// 取消“请稍等”信息<br />remove(label); <br />// 设置布局<br />setLayout(new GridLayout(1, 0));<br />add(largeApplet); <br />// 显示正式的Applet<br />largeApplet.init();<br />largeApplet.start();<br />}<br />catch (Exception ex) {<br />// 显示错误信息<br />label.setText("不能装入指定的Applet");<br />} <br />// 刷新屏幕<br />validate();<br />} <br />public void appletResize(int width, int height) {<br />// 把appletResize调用从stub程序传递到Applet<br />resize(width, height);<br />}<br />}</p>
		<p> </p>
		<p>编译后的代码小于2K，下载速度很快。代码中有几个地方值得注意。首先，PreLoader实现了AppletStub接口。一般地，Applet从调用者判断自己的codebase。在本例中，我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地方是， AppletStub接口包含许多和Applet类一样的方法，但appletResize()方法除外。这里我们把对appletResize()方法的调用传递给了resize()方法。 </p>
		<p>3.3 在画出图形之前预先装入它 </p>
		<p>ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate()，能够用一次repaint()操作在屏幕上画出图形。下面提供了一个例子。 </p>
		<p>
				<br />public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {<br />if ((flags &amp; ALLBITS) !=0 {<br />repaint();<br />}<br />else if (flags &amp; (ERROR |ABORT )) != 0) {<br />error = true;<br />// 文件没有找到，考虑显示一个占位符<br />repaint();<br />}<br />return (flags &amp; (ALLBITS | ERROR| ABORT)) == 0;<br />} </p>
		<p>当图形信息可用时，imageUpdate()方法被调用。如果需要进一步更新，该方法返回true；如果所需信息已经得到，该方法返回false。 </p>
		<p>3.4 覆盖update方法 </p>
		<p>update()方法的默认动作是清除屏幕，然后调用paint()方法。如果使用默认的update()方法，频繁使用图形的应用可能出现显示闪烁现象。要避免在paint()调用之前的屏幕清除操作，只需按照如下方式覆盖update()方法： </p>
		<p>public void update(Graphics g) {<br />paint(g);<br />} </p>
		<p>更理想的方案是：覆盖update()，只重画屏幕上发生变化的区域，如下所示： </p>
		<p>public void update(Graphics g) {<br />g.clipRect(x, y, w, h);<br />paint(g);<br />} </p>
		<p>
				<br />3.5 延迟重画操作 </p>
		<p>对于图形用户界面的应用来说，性能低下的主要原因往往可以归结为重画屏幕的效率低下。当用户改变窗口大小或者滚动一个窗口时，这一点通常可以很明显地观察到。改变窗口大小或者滚动屏幕之类的操作导致重画屏幕事件大量地、快速地生成，甚至超过了相关代码的执行速度。对付这个问题最好的办法是忽略所有“迟到” 的事件。 </p>
		<p>建议在这里引入一个数毫秒的时差，即如果我们立即接收到了另一个重画事件，可以停止处理当前事件转而处理最后一个收到的重画事件；否则，我们继续进行当前的重画过程。 </p>
		<p>如果事件要启动一项耗时的工作，分离出一个工作线程是一种较好的处理方式；否则，一些部件可能被“冻结”，因为每次只能处理一个事件。下面提供了一个事件处理的简单例子，但经过扩展后它可以用来控制工作线程。 </p>
		<p>
				<br />public static void runOnce(String id, final long milliseconds) {<br />synchronized(e_queue) { // e_queue: 所有事件的集合<br />if (!e_queue.containsKey(id)) {<br />e_queue.put(token, new LastOne());<br />}<br />} <br />final LastOne lastOne = (LastOne) e_queue.get(token);<br />final long time = System.currentTimeMillis(); // 获得当前时间<br />lastOne.time = time; <br />(new Thread() {public void run() {<br />if (milliseconds &gt; 0) {<br />try {Thread.sleep(milliseconds);} // 暂停线程<br />catch (Exception ex) {}<br />}<br />synchronized(lastOne.running) { // 等待上一事件结束<br />if (lastOne.time != time) // 只处理最后一个事件<br />return;<br />}<br />}}).start();<br />} <br />private static Hashtable e_queue = new Hashtable(); <br />private static class LastOne {<br />public long time=0;<br />public Object running = new Object();<br />} </p>
		<p>
				<br />3.6 使用双缓冲区 </p>
		<p>在屏幕之外的缓冲区绘图，完成后立即把整个图形显示出来。由于有两个缓冲区，所以程序可以来回切换。这样，我们可以用一个低优先级的线程负责画图，使得程序能够利用空闲的CPU时间执行其他任务。下面的伪代码片断示范了这种技术。 </p>
		<p>
				<br />Graphics myGraphics;<br />Image myOffscreenImage = createImage(size().width, size().height);<br />Graphics offscreenGraphics = myOffscreenImage.getGraphics(); <br />offscreenGraphics.drawImage(img, 50, 50, this);<br />myGraphics.drawImage(myOffscreenImage, 0, 0, this); </p>
		<p>
				<br />3.7 使用BufferedImage </p>
		<p>Java JDK 1.2使用了一个软显示设备，使得文本在不同的平台上看起来相似。为实现这个功能，Java必须直接处理构成文字的像素。由于这种技术要在内存中大量地进行位复制操作，早期的JDK在使用这种技术时性能不佳。为解决这个问题而提出的Java标准实现了一种新的图形类型，即BufferedImage。 </p>
		<p>BufferedImage子类描述的图形带有一个可访问的图形数据缓冲区。一个BufferedImage包含一个ColorModel和一组光栅图形数据。这个类一般使用RGB（红、绿、蓝）颜色模型，但也可以处理灰度级图形。它的构造函数很简单，如下所示： <br />public BufferedImage (int width, int height, int imageType) </p>
		<p>ImageType允许我们指定要缓冲的是什么类型的图形，比如5-位RGB、8-位RGB、灰度级等。 </p>
		<p>3.8 使用VolatileImage </p>
		<p>许多硬件平台和它们的操作系统都提供基本的硬件加速支持。例如，硬件加速一般提供矩形填充功能，和利用CPU完成同一任务相比，硬件加速的效率更高。由于硬件加速分离了一部分工作，允许多个工作流并发进行，从而缓解了对CPU和系统总线的压力，使得应用能够运行得更快。利用VolatileImage可以创建硬件加速的图形以及管理图形的内容。由于它直接利用低层平台的能力，性能的改善程度主要取决于系统使用的图形适配器。VolatileImage的内容随时可能丢失，也即它是“不稳定的（volatile）”。因此，在使用图形之前，最好检查一下它的内容是否丢失。VolatileImage有两个能够检查内容是否丢失的方法： </p>
		<p>public abstract int validate(GraphicsConfiguration gc);<br />public abstract Boolean contentsLost(); </p>
		<p>每次从VolatileImage对象复制内容或者写入VolatileImage时，应该调用validate()方法。contentsLost()方法告诉我们，自从最后一次validate()调用之后，图形的内容是否丢失。 </p>
		<p>虽然VolatileImage是一个抽象类，但不要从它这里派生子类。VolatileImage应该通过 Component.createVolatileImage()或者 GraphicsConfiguration.createCompatibleVolatileImage()方法创建。 </p>
		<p>3.9 使用Window Blitting </p>
		<p>进行滚动操作时，所有可见的内容一般都要重画，从而导致大量不必要的重画工作。许多操作系统的图形子系统，包括WIN32 GDI、MacOS和X/Windows，都支持Window Blitting技术。Window Blitting技术直接在屏幕缓冲区中把图形移到新的位置，只重画新出现的区域。要在Swing应用中使用Window Blitting技术，设置方法如下： </p>
		<p>setScrollMode(int mode); </p>
		<p>在大多数应用中，使用这种技术能够提高滚动速度。只有在一种情形下，Window Blitting会导致性能降低，即应用在后台进行滚动操作。如果是用户在滚动一个应用，那么它总是在前台，无需担心任何负面影响。 </p>
<img src ="http://www.blogjava.net/qclass/aggbug/45117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-05-09 00:01 <a href="http://www.blogjava.net/qclass/articles/45117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用Java编写多线程程序 </title><link>http://www.blogjava.net/qclass/articles/45116.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Mon, 08 May 2006 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/45116.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/45116.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/45116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/45116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/45116.html</trackback:ping><description><![CDATA[
		<table style="WORD-BREAK: break-all; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<div twffan="done">
												<div style="MARGIN: auto 0cm; LINE-HEIGHT: 150%" twffan="done">
														<strong>
																<font size="3">
																		<font face="宋体">
																				<font color="#588558">
																						<span style="COLOR: #333333" twffan="done">一、简介</span>
																				</font>
																		</font>
																</font>
														</strong>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">1</span>
																		</strong>
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">、什么是线程</span>
																		</strong>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　要说线程，就必须先说说进程，进程就是程序的运行时的一个实例。线程呢可以看作单独地占有</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">CPU</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">时间来执行相应的代码的。对早期的计算机（如</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">DOS</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">）而言，线程既是进程，进程既是进程，因为她是单线程的。当然一个程序可以是多线程的，多线程的各个线程看上去像是并行地独自完成各自的工作，就像一台一台计算机上运行着多个处理机一样。在多处理机计算机上实现多线程时，它们确实可以并行工作，而且采用适当的分时策略可以大大提高程序运行的效率。但是二者还是有较大的不同的，线程是共享地址空间的，也就是说多线程可以同时读取相同的地址空间，并且利用这个空间进行交换数据。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">2</span>
																		</strong>
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">、为什么要使用线程</span>
																		</strong>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　为什么要使用多线程呢？学过《计算机体系结构》的人都知道。将顺序执行程序和采用多线程并行执行程序相比，效率是可以大大地提高的。比如，有五个线程</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">thread1, thread2, thread3, thread4, thread5</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，所耗的</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">CPU</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">时间分别为</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">4</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">5</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">1</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">2</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">7</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">。（假设</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">CPU</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">轮换周期为</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">4</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">个</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">CPU</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">时间，而且线程之间是彼此独立的）顺序执行需要花费</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">19</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">个</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">CPU</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">时间，而并行需要的时间肯定少于</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">19</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">个</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">CPU</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">时间，至于具体多少时间要看那些线程是可以同时执行的。这是在非常小规模的情况下，要是面对大规模的进程之间的交互的话，效率可以表现得更高。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">3</span>
																		</strong>
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">、</span>
																		</strong>
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		</strong>
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">中是如何实现多线程的</span>
																		</strong>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　与其他语言不一样的是，线程的观念在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">是语言中是重要的，根深蒂固的，因为在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">语言中的线程系统是</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">语言自建的，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done"> java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">中有专门的支持多线程的</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">API</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">库，所以你可以以最快的速度写一个支持线程的程序。在使用</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">创建线程的时候，你可以生成一个</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Thread</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">类或者他的子类对象，并给这个对象发送</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">start()</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">消息（程序可以向任何一个派生自</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done"> Runnable </span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">接口的类对象发送</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done"> start() </span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">消息的），这样一来程序会一直执行，直到</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">run</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">返回为止，此时该线程就死掉了。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">语言中，线程有如下特点：</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　§</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">在一个程序中而言，主线程的执行位置就是</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">main</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">。而其他线程执行的位置，程序员是可以自定义的。值得注意的是对</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Applet</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">也是一样。</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />
																		</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　§</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">每个线程执行其代码的方式都是一次顺序执行的。</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />
																		</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　§</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">一个线程执行其代码是与其他线程独立开来的。如果诸线程之间又相互协作的话，就必须采用一定的交互机制。</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />
																		</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　§</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">前面已经说过，线程是共享地址空间的，如果控制不当，这里很有可能出现死锁。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　各线程之间是相互独立的，那么本地变量对一个线程而言就是完全独立，私有的。所以呢，线程执行时，每个线程都有各自的本地变量拷贝。对象变量</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">(instance variable)</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">在线程之间是可以共享的，这也就是为什么在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">中共享数据对象是如此的好用，但是</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">线程不能够武断地访问对象变量：他们是需要访问数据对象的权限的。</span>
																</font>
														</font>
												</div>
												<div style="MARGIN: auto 0cm; LINE-HEIGHT: 150%" twffan="done">
														<strong>
																<font size="3">
																		<font face="宋体">
																				<font color="#588558">
																						<span style="COLOR: #333333" twffan="done">二、准备知识</span>
																				</font>
																		</font>
																</font>
														</strong>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　在分析这个例子之前，然我们先看看关于线程的几个概念，上锁，信号量，和</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">所提供的</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">API</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">上锁</span>
																		</strong>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　对于大多数的程序而言，他们都需要线程之间相互的通讯来完成整个线程的生命周期，二实现线程之间同步的最简单的办法就是上锁。为了防止相互关联的两个线程之间错误地访问共享资源，线程需要在访问资源的时候上锁和解锁，对于锁而言，有读锁，写锁和读写锁等不同的同步策略。在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">中，所有的对象都有锁；线程只需要使用</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">synchronized</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">关键字就可以获得锁。在任一时刻对于给定的类的实例，方法或同步的代码块只能被一个线程执行。这是因为代码在执行之前要求获得对象的锁。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<strong>
																				<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">信号量</span>
																		</strong>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　通常情况下，多个线程所访问为数不多的资源，那怎么控制呢？一个比较非常经典而起非常简单的办法就是采用信号量机制。信号量机制的含义就是定义一个信号量，也就是说能够提供的连接数；当有一个线程占用了一个连接时，信号量就减一；当一个线程是放了连接时，信号量就加一。采用这种方法就可以简单有效地控制线程的同步问题，而且实现起来也特别方便。看下面的代码：</span>
																</font>
														</font>
												</div>
												<div style="BORDER-RIGHT: #0099cc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #0099cc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ddedfb; PADDING-BOTTOM: 4pt; BORDER-LEFT: #0099cc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #0099cc 0.75pt solid" twffan="done">
														<div style="MARGIN: 3.75pt" twffan="done">
																<font face="宋体">
																		<font color="#588558">class Semaphore { <br />private int count; <br />public Semaphore(int count) { <br />this.count = count; <br />} <br /><br />public synchronized void acquire() { <br />while(count == 0) { <br />try { <br />wait(); <br />} catch (InterruptedException e) { <br />//keep trying <br />} <br />} <br />count--; <br />} <br /><br />public synchronized void release() { <br />count++; <br />notify(); //alert a thread that<span style="FONT-FAMILY: 宋体" twffan="done">´</span></font>
																</font>
																<font face="宋体">
																		<font color="#588558">s blocking on this semaphore <br />} <br />}</font>
																</font>
														</div>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">中提供了哪些</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">api</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">以编写多线程程序</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">
																<font face="宋体" color="#588558">　　这里只列出几个常用的方法和属性值。</font>
														</span>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />
																		</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　属性值，有三个</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">MAX_PRIORITY</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">MIN_PRIORITY</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">NORM_PRIORITY </span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　方法：</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Thread(); //</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">建立一个线程</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />void run(); //</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">对于一个继承了</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Runnable</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">接口的</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">class</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">而言，</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />//</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">他运行一个线程</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">,</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">否着他什么都不做</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />void setPriority(int newPriority); //</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">设置优先级</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />void start(); //</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">运行一个程序</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />void sleep(long millis); //</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">线程睡眠</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">millis</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">毫秒</span>
																</font>
														</font>
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">
																				<br />static void yield(); //</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">临时</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">pause</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">一个程序以便起他线程运行</span>
																</font>
														</font>
												</div>
												<div style="MARGIN: auto 0cm; LINE-HEIGHT: 150%" twffan="done">
														<strong>
																<font size="3">
																		<font face="宋体">
																				<font color="#588558">
																						<span style="COLOR: #333333" twffan="done">三、程序示例</span>
																				</font>
																		</font>
																</font>
														</strong>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　<strong>例一、</strong></span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　让我们看看下面的例子。取钱的流程是输入密码，然后确定要取得金额，如果所取的金额小于或等于可以取出的金额，</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">WITHDRAW</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">则返回</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">TRUE</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，然后</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">ATM</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">机出钱，然后打印清单；否则返回</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">FALSE</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，然后打印清单。如下图：</span>
																</font>
														</font>
												</div>
												<div style="BORDER-RIGHT: #0099cc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #0099cc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ddedfb; PADDING-BOTTOM: 4pt; BORDER-LEFT: #0099cc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #0099cc 0.75pt solid" twffan="done">
														<div style="MARGIN: 3.75pt" twffan="done">
																<font face="宋体">
																		<font color="#588558">public class AutomatedTellerMachine extends Teller { <br />public void withdraw(float amount) { <br />Account a = getAccount(); <br />if (a.deduct(amount)) <br />dispense(amount); <br />printReceipt(); <br />} <br />} <br /><br />public class Account { <br />private float total; <br />public boolean deduct(float t) { <br />if (t &lt;= total) { <br />total -= t; <br />return true; <br />} <br />return false; <br />} <br />} </font>
																</font>
														</div>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　就这个例子而言，假设有这种情况，对同一个账号可以在不同的地方取钱，在同一时间，不同地点，妻子和丈夫取钱，妻子输入了账号上的最大金额，丈夫也是一样，假如妻子输入后已经得到</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">true</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">的返回值，但是丈夫的线程所得到的值还没有更新，这样丈夫也能够得到</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">true</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">的返回值，这样就出现了问题！这个问题怎么解决呢？在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">java</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">里面提供了控制机制以保证</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">deduct</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">操作时的原子性，那就是关键字</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">synchronized</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Account</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">的</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">deduct</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">方法加入</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">synchronized</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">就可以解决这个问题。</span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　<strong>例二、</strong></span>
																</font>
														</font>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　在这里我们用多线程中最典型的例子，生产者与消费者问题。在这个例子里面我们定义了生产者</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Producer</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，消费者</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Consumer</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">和仓库</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Warehouse</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">三个类，在整个程序的生命周期里，生产者随机地制造出产品放到仓库中，消费者也是随即地从仓库中取出产品。</span>
																</font>
														</font>
												</div>
												<div style="BORDER-RIGHT: #0099cc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #0099cc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ddedfb; PADDING-BOTTOM: 4pt; BORDER-LEFT: #0099cc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #0099cc 0.75pt solid" twffan="done">
														<div style="MARGIN: 3.75pt" twffan="done">
																<font face="宋体">
																		<font color="#588558">import exception.ProducerConsumerException; <br /><br />/** <br />* Consumer.java <br />* Consumer <br />* By: Jiabo <br />* Date: Mar 21, 2004 <br />* Time: 2:47:58 PM <br />*/ <br />public class Consumer extends Thread { <br /><br />private Warehouse warehouse; <br />private String id; <br /><br />public Consumer(Warehouse warehouse, String id) { <br />this.warehouse = warehouse; <br />this.id = id; <br />} <br /><br />public void run() { <br /><br />int tmp = (int) Math.random() * 10; <br /><br />try { <br />warehouse.get(tmp); <br />System.out.println("Consumer # " + this.id + " get " + tmp); <br />} catch (ProducerConsumerException e) { <br />e.printStackTrace(); <br />} <br /><br />try { <br />sleep((int) (Math.random() * 100)); <br />} catch (InterruptedException e) { <br />e.printStackTrace(); <br />} <br />} <br />} </font>
																</font>
														</div>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　在这个类中，值得注意的一点是</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">run</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">方法中必须使用</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">try-catch</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">，因为，消费者从仓库中取东西时有可能诸如仓库中的储量不够得异常，在消费者里面也是一样，只不过异常变为仓库已满。</span>
																</font>
														</font>
												</div>
												<div style="BORDER-RIGHT: #0099cc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #0099cc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ddedfb; PADDING-BOTTOM: 4pt; BORDER-LEFT: #0099cc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #0099cc 0.75pt solid" twffan="done">
														<div style="MARGIN: 3.75pt" twffan="done">
																<font face="宋体">
																		<font color="#588558">import exception.*; <br /><br />/** <br />* Producer.java <br />* Producer <br />* By: Jiabo <br />* Date: Mar 21, 2004 <br />* Time: 2:47:45 PM <br />*/ <br />public class Producer extends Thread { <br /><br />private Warehouse warehouse; <br />private String id; <br /><br />public Producer(Warehouse warehouse, String id) { <br />this.warehouse = warehouse; <br />this.id = id; <br />} <br /><br />public void run() { <br /><br />int tmp = (int) Math.random() * 10; <br /><br />if (tmp != 0) { <br />try { <br />warehouse.put(tmp); <br />System.out.println("Consumer # " + this.id + " put " + tmp); <br />} catch (ProducerConsumerException e) { <br />e.printStackTrace(); <br />} <br />} <br /><br />try { <br />sleep((int) (Math.random() * 100)); <br />} catch (InterruptedException e) { <br />e.printStackTrace(); <br />} <br />} <br />} </font>
																</font>
														</div>
												</div>
												<div style="LINE-HEIGHT: 150%" twffan="done">
														<font face="宋体">
																<font color="#588558">
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">　　最重要的一部分在</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">Warehouse</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">类，如上所说为了保证</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">get</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">何</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">set</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">的原子性，在这里使用了</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: '&#xB;'" twffan="done">synchronized</span>
																		<span style="FONT-SIZE: 10.5pt; COLOR: #333333" twffan="done">关键字，并且在操作时抛出了可能跑出的异常。</span>
																</font>
														</font>
												</div>
												<div style="BORDER-RIGHT: #0099cc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #0099cc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ddedfb; PADDING-BOTTOM: 4pt; BORDER-LEFT: #0099cc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #0099cc 0.75pt solid" twffan="done">
														<div style="MARGIN: 3.75pt" twffan="done">
																<font face="宋体">
																		<font color="#588558">import exception.*; <br /><br />/** <br />* Warehouse <br />* By: Jiabo <br />* Date: Mar 21, 2004 <br />* Time: 2:48:10 PM <br />*/ <br />public class Warehouse { <br /><br />// max capability of the warehouse <br />private int MAX; <br />private int contents; <br /><br />// init with max capacity <br />public Warehouse(int max) { <br />this.MAX = max; <br />this.contents = 0; <br />} <br /><br />public synchronized void get(int amount) throws ProducerConsumerException { <br /><br />// the amount you want to get is bigger than the contends that the warehouse stores <br />if (amount &gt; this.contents) { <br />throw new NotEnoughGoodsException(); <br />} <br /><br />amount -= contents; <br />} <br /><br />public synchronized void put(int amount) throws ProducerConsumerException { <br /><br />// the amount you want to put is out of the capability of the warehouse <br />if (amount &gt; (this.MAX - this.contents)) { <br />throw new WarehouseFullException(); <br />} else if (this.contents == 0) { <br />// warehouse is empty <br />throw new WarehouseEmptyException(); <br />} <br /><br />amount += contents; <br />} <br />} </font>
																</font>
														</div>
												</div>
												<div twffan="done">
														<font size="3">
																<font face="Times New Roman">
																		<font color="#588558">
																		</font>
																</font>
														</font> </div>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/qclass/aggbug/45116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-05-08 23:58 <a href="http://www.blogjava.net/qclass/articles/45116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>帮你免于失业的十大软件技术</title><link>http://www.blogjava.net/qclass/articles/39197.html</link><dc:creator>Q系列类、方法、变量……</dc:creator><author>Q系列类、方法、变量……</author><pubDate>Tue, 04 Apr 2006 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/qclass/articles/39197.html</guid><wfw:comment>http://www.blogjava.net/qclass/comments/39197.html</wfw:comment><comments>http://www.blogjava.net/qclass/articles/39197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qclass/comments/commentRss/39197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qclass/services/trackbacks/39197.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">能跟上关键技术的发展，是你在就业市场和未来保持优势的最佳手段。你对我们列出的十门技术精通吗？哪怕是大略精通？ <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">罗素·琼斯，执行编辑 2002年12月11日 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">我不知道你的具体工作是什么。如果你是某冷门领域的专家而变得不可或缺，或者你们的公司十分稳固，以你现有的技术就足以安度你的职业生涯，那我不知道你是否有失业的危险。不管怎样，请你先不要急着寄出那些告诉我你们的公司对用VB3十分满意或你们除C以外永不用其它语言的信件，并保留起那些讲述.NET将如何把Java扫地出门、XML将如何取代关系型数据库、或你怎样能用汇编语言或C写任何软件而任何其它开发工具都不重要的信件。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">现在，想象一下如果你像很多受裁员和公司倒闭影响的同行一样失去了工作，那将会怎样。如果你突然需要搬往它处该怎么办？如果你的公司突然做了技术转向又怎么办？ <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">在目前的就业市场，经理们是根据当前和未来的开发需要招聘雇员。作为开发人员，你所掌握的知识是你找工作和保住工作的关键。你要了解技术的发展方向，跟上技术的变化，这一点十分重要，即使你永远不用再找开发方面的工作。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">这里是我选出的当前最重要的十大开发技术，最重要的排在前面。看完本文后，请务必加入talk.editors.devx讨论组，提出你选出的十大技术。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<strong>
												<font color="#ff0000" size="4">1. XML</font>
										</strong>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">首先，你要了解XML。我不是说仅仅是XML规格本身，还包括一系列相关的基于XML的语言：最重要的是XHTML、XSLT、XSL、DTDs、XML Schema (XSD)、XPath、XQuery和SOAP。那些在过去5年内从未碰过键盘的人，可能不知道XML为何物。XML是一种文本文件，使用与HTML类似的标记。XML能定义一个树状结构，并能描述所含的数据。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<font size="3">
						<font color="#000080">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">XML最好的一点是既能存结构化数据也能存非结构化数据。它既能存贮和描述</span>
								<span style="FONT-SIZE: 10pt; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体; mso-ascii-font-family: 宋体" twffan="done">
										<font face="Times New Roman">“</font>
								</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">规格的</span>
								<span style="FONT-SIZE: 10pt; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体; mso-ascii-font-family: 宋体" twffan="done">
										<font face="Times New Roman">”</font>
								</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">(regular)表格数据，也能容纳和描述</span>
								<span style="FONT-SIZE: 10pt; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体; mso-ascii-font-family: 宋体" twffan="done">
										<font face="Times New Roman">“</font>
								</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">粗糙的</span>
								<span style="FONT-SIZE: 10pt; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体; mso-ascii-font-family: 宋体" twffan="done">
										<font face="Times New Roman">”</font>
								</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">(ragged)文件数据。 <o:p></o:p></span>
						</font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">XHTML是现今写HTML的首选方法。因为它是形式完好（well formed）的XML，比起古老的、通常是畸形（malformed）的HTML文件，XHTML格式的文件更容易处理。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">XSLT和XSL是用于把XML文件转成其它格式的语言。可转换的格式包括：文本文件、PDF文件、HTML、以逗号为分隔符的文件，或其它XML文件。 <br /><o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3">
										<br />DTD和XML Schema描述XML文件所能包含的内容的类型，并让你 “ 验证 ” XML文件内容的合理性，而不用写特殊代码以确保内容符合规则要求。 <br /> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">XPath和XQuery是用于从XML文件中抽取单个项目或一组项目的查询语言。XQuery扩展了XPath，因而更重要。XQuery与XML的关系正像SQL与关系数据库的关系。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">SOAP是Web服务之间的一个标准通讯协议。尽管你不需要对SOAP标准一清二楚，你应该熟悉一般的schema和它的工作原理，以便能应用这门技术。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<font color="#ff0000">
												<strong>2. Web服务</strong>
										</font>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">Web服务是XML流行后的一个直接产物。因为你能用XML描述数据和物件，因为你能用schema确保XML文件内容的合理性，因为XML是基于文本的规范，XML为跨平台通讯标准提供了一个极其方便的基本格式。如果你还从来没碰到Web服务，你可能很快就会碰到，在未来5年内，你几乎肯定会碰到。熟悉Web服务十分重要，因为它是目前所有跨不同机器、不同语言、不同平台和不同地点的通讯协议中最简单的一个。不管你需要与否，Web服务是迈向互用性的重要一步。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<font size="3">
						<font color="#000080">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">XML工作组主席John Bosak曾说XML</span>
								<span style="FONT-SIZE: 10pt; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体; mso-ascii-font-family: 宋体" twffan="done">
										<font face="Times New Roman">“</font>
								</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">给Java一些事做</span>
								<span style="FONT-SIZE: 10pt; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体; mso-ascii-font-family: 宋体" twffan="done">
										<font face="Times New Roman">”</font>
								</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">。实际上，Web服务让所有语言都有了一些事做。Web服务让在大型机上运行的COBOL应用软件能调用在手持设备上运行的Java应用程序、能让Java applet与.NET服务器交谈、能让微机软件与Web服务器无缝连接，并提供了一个相对容易的方法，让企业不光能向外界提供数据，还能提供功能，而且是一种与语言、平台和位置都独立的方法。 <o:p></o:p></span>
						</font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<font color="#ff0000">
												<strong>3. 面向对象的编程</strong>
										</font>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">很多程序员仍认为OOP是象牙塔里的技术。但如果你想一下是什么语言在过去的10年里占主导地位，你就会理解OOP不是象牙塔里的技术。OOP从Smalltalk开始，传到C++和Pascal (Delphi)。Java使OOP大踏步地迈向主流，几年后的VB.NET和C#则完全确立了OOP的优势地位。尽管这些语言中的多数并不要求你必须会OOP，但我觉得如果你不了解OOP的基本概念也不知道如何应用这些概念，你能找到的编程工作将越来越少。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<font color="#ff0000">
												<strong>4. Java、C++、C#和VB.NET</strong>
										</font>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">我把这些语言列在一起，并不是建议你成为每一种语言的专家。我的理由是：学习编程最有效的方法之一是看代码，而你能看到的大量的代码很可能不是用你所喜爱的语言编写的。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">在过去几年，各语言的能力越来越接近。现在，你可以用VB.NET写Windows服务、Web应用程序或命令行程序。即使你只使用一种语言，你也应该学一些其它语言，以便能看懂那些样例，并将其翻译到你所用的语言。这4种语言是基本核心，还有其它一些满足不同需要、颇具用途的语言，如FORTRAN、COBOL、APL、ADA、Perl和Lisp。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<strong>
												<font color="#ff0000">5. JavaScript</font>
										</strong>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">尽管名字有些相像，但Java与JavaScript并无关联。为什么一个脚本语言会如此重要呢？因为所有主流浏览器都用JavaScript。如果你需要写Web应用程序，你就有足够的理由学JavaScript。JavaScript可以用作ASP或ASP.NET的服务器语言，也可以当做用于扩展XSLT的功能语言(functional language)。JavaScript是Mozilla/Netscape中用于激活基于XUL的程序接口的首选语言。JavaScript的一个变种ActionScript是Flash MX的编程语言。将来，JavaScript很可能成为新设备的编程语言，以及大型应用软件中的宏语言。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">与JavaScript相对照的是VBScript。尽管Microsoft的软件对VBScript有良好的支持，但VBScript在未来的开发工作中很可能是一个糟糕的选择。就是Microsoft也倾向于用JavaScript（或Microsoft自己的变种：JScript）写客户端程序。在选择脚本语言时，请选择JavaScript。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<strong>
												<font color="#ff0000">6. 正则表达式（Regular Expressions）</font>
										</strong>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">查寻关系数据库可以用SQL，查询XML可以用XPath和XQuery，查询纯文本文件则可以用正则表达式。例如，你可以用一个命令从一个HTML文件中查找并删除所有的注释。各种开发语言内置的一些简单的文本查询功能，如"IndexOf"函数或VB中经典的"InStr"函数或"Like"操作符，根本不能与正则表达式相提并论。现在，各种主要的开发语言都提供使用正则表达式的途径。尽管正则表达式本身既难懂更难读（是回到早期计算机时代的一种倒退），但它却是一个功能强大而且未被充分利用的工具。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<strong>
												<font color="#ff0000">7. 设计模式</font>
										</strong>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">正像OOP通过把对象分类以简化编程一样，设计模式对一些普遍的对象之间的交互进行分类，并赋予一个恰当的名称。OOP用得越多，设计模式就越有用。一些最常用的模式的名称已经变成了软件开发领域共同使用的术语，所以要跟上信息的主流，你就要对设计模式有相当的理解。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<strong>
												<font color="#ff0000">8. Flash MX</font>
										</strong>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">如果你需要在客户端得到比HTML和CSS更多的图形和更强的编程功能，Flash是你的答案。用Flash编程比开发Java applets或写.NET代码要快得多，也容易得多。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">在最新版本 (MX) 中，Flash不仅仅是画图和制造动画的工具，它已经成为一个编程功能强大的开发环境：能调用SOAP Web服务，也能调用远端服务器上的ColdFusion、Java或.NET程序。Flash无处不在。它的引擎存在于世界上大多数客户端计算机，包括手持设备、置顶盒、甚至是新的书写板电脑。所以使用Flash能大大扩展你的程序的应用范围。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<strong>
												<font color="#ff0000">9. Linux/Windows</font>
										</strong>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">熟悉Linux。在一台旧机器或新机器上安装Linux。下载图形用户界面，在其基础上写一些程序。安装Apache，写一个Web应用程序。这个世界不再仅仅是属于Windows，这种趋势可能还会持续下去。如果你是一名中坚的Linux开发人员，那就抛弃你对Windows的憎恶，看看你能否做一些Windows编程。Windows能继续在台式电脑上称王是有其原因的，这不仅仅是因为Microsoft控制了这个市场。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">没人知道你们公司会在什么时候决定从Linux转向Windows（或从Windows转向Linux），或者你想跳到一家用另一种平台的公司，或者你想出了开发一个杀手软件的好主意，所以你要争取拥有在不同操作系统上的编程经验。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<strong>
												<font color="#ff0000">10. SQL</font>
										</strong>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">尽管SQL不像本文讨论的其它技术那样新，而且SQL的重要性在未来10年内很可能降低，但它仍然是一项基本技能。很多开发人员还没有掌握这门技术，或掌握得不够，不足以有效率地使用它。不要依赖具有图形用户界面的SQL生成器替你做事情，你要自己手工地写查询命令，直到你熟悉基本的SQL语法为止。了解SQL不仅能帮助你日后学习XQuery，你还有可能马上发现能简化或改进目前项目的方法。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">
										<font color="#ff0000">
												<strong>培养好奇心</strong>
										</font>
										<o:p>
										</o:p>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">最后，（对，我意识到这是第11门技术），好奇心是你最重要的技能。要去尝试各种东西。新语言或新技术对你当前或将来的工作可能有用，也可能没用，但并不是你所学的每一件事都是为了工作。不要害怕失败，万事开头难，学新技术也是如此。大多数失败是因为人们希望太快地学到太多的东西。要对每一点进步感到满意，不要让时间（或缺乏时间）妨碍你。相反，你要安排时间留心、研究、试验新的开发技术和工具。 <o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<o:p>
								<font color="#000080" size="3"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: ZH-CN; mso-bidi-font-family: 宋体" twffan="done">
						<font size="3">
								<font color="#000080">你可能永远也没有必要成为这些技术的专家，而且我的选择可能根本不适合你的特殊情况，但通过培养好奇心，你将会发现你应该了解的东西。 <o:p></o:p></font>
						</font>
				</span>
		</p>
<img src ="http://www.blogjava.net/qclass/aggbug/39197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qclass/" target="_blank">Q系列类、方法、变量……</a> 2006-04-04 16:46 <a href="http://www.blogjava.net/qclass/articles/39197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>