??xml version="1.0" encoding="utf-8" standalone="yes"?> 回到E序开发团体的话题Q在以前的工作过E中Q我有时会发C个很怪的现象Q一个程序由一个程序员开发时Q程序员L敯了事Q效果较差,如果׃个h来开发,他们又经常性地互相推诿Q效果也不好Q由三个或更多的E序员负责时Q效果更差,永无成事之日Q真是让人烦|q不是程序员的技术问题,而更多的是管理问题,比如不科学的分工Q或q分个h的责任,或程序员之间的性格冲突{原团,D团队如同一盘散沙,没有凝聚力,q是可怕的事情Q直接的l果是目的彻底失败?/p>
那么如何避免发生以上的情况,如何形成的团队精,提高团队的凝聚力Q让团队发挥更大的力量呢Q?/p>
要Ş成出色的团队_Q我觉得应在工作团队中达C下几个方面的一_
W四Q ?关系融洽Q?/font>
混了q么多年Q从BOSS们口中听到的最多的教诲词语估计是“团队精”了Q尽部分BOSS实际上ƈ不了解什么是团队_Q但他们了解中国革命的最l成功是M开“团l就是力量”这句出自伟Z口的话语Q中华民族历来都h勤劳、团l的优秀品质Q小时候在农村P看到很多团结的现象,家属里的兄弟姐妹无论qx如何地大吵大闹动刀动枪Q但一旦外部力量比如别的家属R犯到本家属,他们会不从前,团结hQ一致对外,q有一个村对另一村,qx不管大家有什么矛盾,对另一村时都会团结hQ共同面Ҏ人,所以农村里l常发生打群架的宏大场面Q一个胡同对另一个胡同的孩Q一个村的对另一村的人,场面混ؕQ男奌少Q刀光棍影,q飞扬Q声势浩大,老谋子什么时候有I来拍一部诸如此c题材的电媄Q说不定在奥斯卡颁奖大会上能扬眉吐气一把,呵呵?/p>
W一Q ?在目标上达成一_
我们都喜Ƣ交一些志同道合的朋友Q因为志不同道不合的人,让我们很难沟通与交流Q也很难在思想上有火花冒出Q共同的目标是一U意境,在程序开发团队中Q只要有一名程序员与团队的目标不致Q那么该团队的整体水q_受到影响Q这U媄响不仅仅来自于这个程序员本nQ而也来自于团队内部其他程序员的W效下降,在心理上Q其它程序员总能感觉到团队内部的分歧或者某个同伴漠不关心的态度Q因此,Z实现团队目标的一_最好的办法莫过于让E序l自已来定其目标,q样做的好处有:首先Q在目标的制定时的广泛参与,可以保目标能被大家充分理解Q而不是某个LEADER的个为;另外Q目标制定的q程使团队中的每个程序员可以有机会对共同的目标做出公开的承诺,提高目标的可接受性,增加目标的清晰程度。团队成员即E序员广泛也参与到目标的制定、讨论,让他们感受到自已在团队中的重要性,以及团队的成功就是他们自已的成功Q以后不论遇CQ何困难,他们都会团结一_勇往直前?/p>
W二Q ?共同承担责QQ?/font>
建立一个环境,使每个团队成员在q个环境中都感到自已应对团队的W效负责,除了勇于承担自已的那部分责QQ而敢于承担团队的共同责QQ遇到问题或困难Ӟ勇于接受挑战Q而不是互相推诿,q样Q团队的目标才能l箋前进?/p>
W三Q ?一位值得重的团队领|
在实际工作中Q遇C名糟p的ȝ要比扑ֈ一名出色的E序Ҏ得多。在我前些的~程工作中,我的部分领导是通过外部力量而Q命的Q比如老板觉得那个搞市场或搞工E或搞行政的人很能干Q就z他来做E序团队的LEADERQ事实上他们可能了解一些规范化的玩意,但ƈ不具备ؓ了在开发团队中实施自已的媄响所必需的能力,q种LEADER往往喜欢不懂装懂Q手提长鞭高高在上,p一个不可一世的军官那样发号施oQ不难想象,极少E序员会服他听他Q一U最典型的反应就是“消极怠工”,严重的还会造成LEADER与PROGRAMMER的冲H,以致于有一方辞职不q了Q多般是E序员,呵呵Q因此程序开发团队的LEADER最好是一位具有优U的开发能力和理能力的资q序员Q他不仅仅得到团队中E序员的敬或崇拜,而且他也可借助自已的专业判断力量,来支撑自已作为领D的CQ基于对开发技术与程的了解,他会ҎE序员的特点q行U学分工Qƈ在开发过E中作出正确的判断与决策?/p>
团队成员之间应该优势互补、性格互补、相互支持、善于沟通,彼此之间坦诚相待、相互信任,q勇于表达自我,q样的团队就会齐心协力,成ؓ一个强有力的集体?/p>
W一招:看到问题念十?br />
a. 认你记得问题下ơ还记得
b. 认你了解问题,没有漏掉什么要?br /> c. 认你以后碰到类似问题,q会惛_?br /> d. 认你连做梦都会惛_它~悲惨的程序设计师宿命?/p>
W二招:E序不会写,先开始写注解
a. 例用注解问题描qͼ问题做分析
b. 把分析方法与解法?document h~对你自己最有益?br /> c. 直接注解而省略白U,由注解行数的改变Q让你老板知道你有在努力做?br /> c. 人家是用照片写记忆~E序设计师是用文件写记忆?/p>
W三招:解法不会写,先写工具
a. 一个复杂的问题Q尤其是面对演算法相关的所谓困N份,如果能把工具(诸如模拟)写出来,q样是比较容易找法的?br /> b. 工具L可以拿来重覆利用的~q会让你写轻松~
c. 写工具也是一U重要练习~
W四招:整个问题不会解,先解会解?/font>
a. divide and conquerQ偶U它Z个击破法Q?不用多说Q不知道|上查也会知道~
b. 像写论文一P如果无法提出所有问题的l一解决ҎQ限定一些条件来?br /> c. q有有时候一下就x困难的问题,一来浪费进度、二来心情不佟뀁三来老板可能把预砍了因为没有结果~所以先解会解的是经验上的金玉良a~因Z来你׃Q0Q完成了80%越q度Q老板来拍肩膀了,二来你解了简单问题心情大好,更觉得整个问题也没什么大不了Q说不定困难问题因心情好Q没有专牛角)也就惛_而解决了Q三来老板看你有成果说不定常拍你肩膀哩~(老板q时候真好骗~可惜薪水不好骗)
W五招:查网l、问别h、看书获取各U解题的资源
a. x偶们q在?93x的理论,当然问题l不可能只有你才到Q一定粉多h早就见过了~只有你碰到的通常是你自己写出来的bug?br /> b. q是策力的时代,多找资源、h家的l验和别人帮忙~
c. 对应于b, 现在q个C会最忌讳单打独斗, 那代表你不能 team work?br /> d. 增加知名度、h~~ Social _重要~切记~切讎ͽ
W六招:暴力法求解再找最佛_
a. 先求有再求好?br /> b. 有成果h家才看得见~不然做不出来Q中间再怎么完美都没有用?br /> c. 暴力法通常是最白痴也最有效的办法~
d. 有时白痴解法最好~因ؓ只有呆子在演东西l傻子和电脑看~你还期待有什么h会看你的E序Q偶们高늚使用者吗Q?br /> e. 一代伟人邓^同志说过Q「黑猫、白?会抓老鼠的就是好c?/p>
W七招:多印q踪资料侦?/font>
a. 讲得_白话~是要你可以节省出问题找错的旉~这h有更多时间解决真正是问题的问?br /> b. 因ؓ有追t资?(trace information)不仅你可以找问题Q别Z才可以帮你找出问题,x吧~如果 compiler 只告诉你E序错,而没告诉你大U是哪里它碰到错~你要花多少旉解决一个打错字的问?br /> c. 真正的问题也常能pt资料找丝马q?br /> d. L习惯Q不要等到当了还在想怎么写追t资料的E序码或可以重覆发生的方法~
e. 你是坏h哟~q嘛坏怕留下线索~q是你是蜘蛛_,「偶挥挥手不带走一片data而死机」所以,人家是照相机抓得住偶Q程序设计师是用 bug 抓往住偶~偶不是故意帮那家快倒的、没有「即时更新技术」的公司打广告~
W八招:多读、多写、多惟뀁多?/font>
a. 多读Q像W一招,有时候会帮助你了解问题的所在或 think out of boxQ读也包括读参考资料~
b. 多写Q熟能生巧~工欲善其事,必先利其器~
c. 多想Q解法大部䆾q是要脑袋想出来Q即使是人家的也要脑袋理解、吸?br /> d. 多说Q只有在你能表达出问题所在,才表CZ真正了解问题~只有你能表辑և你的知识Q那个知识才是你的~
W九招:学会改进重于学会重写
a. M旉都要学会成本控制~不然你没有经费~
b. 当来l习学会l护别h写得烂程序~以后到再怎么烂也看得懂~
c. Z么烂Q用注解的方法记录下来,有机?成本效益考量)再改q?C是改q,不是重写
d. pU维护的痛苦加深写好E序的方法和印象~真是歹命呀?)
e. 工作Z要找改进的粉多,完全写新的粉~
W十招:记得备䆾
a. 即BMW也会 CrashQ那「Y~」体会可能都不死机吗Q有谁说他家有装遉K针不怕闪c有水管(QͼQ?把电源线和所有线包v来不让老鼠咬~q有说他写的E序永远不会?(如果是,偉你Taiwan No 1号的病毒~)
b. 让电脑忙一下让脑袋休息一下,对大安好~
c. q是记得备䆾~远方又传来哀嚎:「神啊~误偶记得备份~?/p>
大约解释一下,听得懂的h化吸收、听不懂的当偶是说笑话也可以~希望大家能把Y件业走得更q步?br />
h一定普遍意义的风险Q?br />
在许多项目开发或产品开发中Q失败的原因一般有以下几类Q一是功能及性能没能满应用的需求;二是需求变化导致项目成本的增加Q三是技术水q不_致项目成本的增加Q四是团队出现重大变动,D研发q程不能正常l箋?br />
功能及性能斚wQ一般来_功能及性能斚w主要是需求目标没能得到充分重视,特别是性能、安全以及部|等非功能性需求;Ҏ心业务本w,需求分析过E中是被x最多的Q但如何理解q些核心业务Q如何用正确的架构完成核心业务的实现Q这期间如果控制不当Q也会生许多导致成本增加、工期g长等许多不确定性结果。在需求分析阶D,寚w求没有系l的q程控制Q带来的风险是非常大的,q往往会成为项目失败在技术上的最先出现的原因Q虽然所有的软g团队寚w求分析都非常重视Q但如果在方法及理q程中不能有效的控制与管理,也很N免由于需求阶D存在的风险l整个品或目带来严重的问题,几乎所有的中小型Y件团队都会有q类似的l历?
需求变化:需求变化是当前软g产品或项目必需适应的,Z具备q个适应能力Q除了在架构设计斚w要考虑到系l的可维护性,可扩展性以外,寚w求的变更理及相应的风险评估l实践证明是比较有效的管理手D,在这斚w技术与技术管理同样重要,~少哪个环节Q都会给产品或项目带来可能导致项目失败的隐患?
技术水q不I在沈阛_区具有一定的普遍性,目前沈阳市Y件开发h员资源ƈ不丰富,大多CU开发h员都向了北京、上L行业发达地区Q其它比较好的开发h员基本上都在大型企业中,Ҏq两q的l验Q能在社会中用招聘方式组建的研发团队Q即要有一定的实践l验Q同时要保障在同一q_下工作,其质量很难达到快速开发的目的Q即使是存在了许多年的团队,也会随着技术h员的动对团队技术水q_来许多的不确定性;如何能有效的吸引高素质高水^E序员,如何有效的培养高忠诚度的核心员工以及如何有效的利用外部资源,q是目前大多数Y件开发团队所面的重要课题?
团队出现重大变动Q这是个比较极端的情况,但却会经常发生,在对2003-2004两年政府目多ơ出C因ؓ目团队中h员流动多大,D目无法q行的情况(如省民防办、新d版局{)Q这也是一个不容忽视的风险?
要有效的规避风险Q在其变成问题前采取有效的措施,是风险管理的主要dQ这里ƈ不做具体的风险评伎ͼ只是׃在团队徏设方面存在的一些不完善Q会成ؓq些风险Q甚至不只是q些Q存在的原因Q所以才昑־重要Q其实说到底Q就是Y件品不可能是小作坊式的开发方式能完成的,是否具备完善有效的控制能力,规避由其所带来的质量与可靠性方面引L风险是关pd团队生存的大事?
团队模型的完善:
团队模型是Y件开发队伍徏讄基础Q一个结构合理的团队Q虽然不能保证项目一定成功,但却是保障品长期稳定的保持高质量、高可靠性的基础?
q里所的团队模型,参考了敏捷开发和CMM、MSF{重要模型,q在实践中应用了两年以上Q应该说是一个有效的中小团队模型Q这个模型本w不是固定不变的Q它应结合不同时期,不同团队的特点,加以完善Q提高其可行性与有效性?
团队模型中的重要概念Q?br />
团队的基本构思:
Z弥补传统目组自上而下的层ơ结构的一些不I研发团队应是型、跨学科的小l,在这L组中成员们共同承担各项职责Q权衡彼此间能力差异Q以便将主要_֊集中到手头上的工作中。他们拥有共同的目前景Q以部v产品Z心,坚持高标准的质量和沟通,保持乐意学习的心态。本文描qC组中的各种角色,以及他们的目标和职能领域。同时提供了指导Q以便根据品规模和复杂性来保障一个高效的团队?
清晰的责任,共同的职责:
工作进行中需要共同承担的职责和确保工作如期完成需明确的工作责ȝ合v来?
团队模型Zq样一个前提,卛_l里的每个角色都代表了对目的一U独一无二的观点,但是没有哪个个h能够完全代表所有的不同质量目标。ؓ了解册一问题Q把对各U利益相关h的清晰角色职责与实现q个目成功的整个小l的责Ql合h了?br />
在小l内部,每个角色通过对小l本w负责(也对他们各自所属的l织负责Q实现该角色的质量目标。在q种意义上,每个角色都对最l解x案质量的一部分负责。小l成员之间共同承担职责(Ҏ不同组角色指派Q。角色之间是怺依赖的,有以下两个原因:首先Q就其必要性而言Q因为把每个角色的工作分隔开来是不可能的Q其ơ,Z优先的原因,如果每个角色都了解全局情况Q那么小l的效率会更高。这U相互的依赖性会鼓励组成员对由他们负责的直接区域以外的工作做出评论和A献,以确保小l所有的知识、能力和l验能够被应用到产品的构造里。项目的成功属于所有的组成员Q他们共同分享一个成功的目所带来的荣誉和回报Q他们也同时希望Q即使是一不太成功的目Q也能做到全心投入ƈ从中吸取教训以完善他们的专长?
赋予组成员权力Q?/font>
在一个高效的组里,所有的成员都被赋予权力以便Ҏ他们自己的承Z付Q务,q且充分信Q组的其他成员也能实现各自的承诺。类似的Q未来客户也能够认ؓ组会兑现其承诺,q进行相应的规划。在最坏的情况下,组也应该尽快地告知客户目出现了哪些gq和变化?
赋予组成员权力Q让其承担指z承诺。这U授权包括向组成员提供q行工作所需的各U资源;负责制定决策以有效媄响队员的工作Q理解队员的权力界限Qƈ不断增加各种可用途径来处理越权问题?
准备好向其他成员允诺。这些准备包含了心态(q行面谈q乐意采取行动)、就l,q理解承诺的内在含义以及它对当前工作量和资源的媄响。这样做的结果就是,不到组成员清楚承诺的内在含义,׃要作出承诺。相反,组成员要提Z个更的、他们能够理解的承诺Q例如对q些承诺的内在含义进行研IӞ然后再迅速坚定地作出承诺。对较小承诺的成功交付将建立组的信仅R?
清晰定义自己担负的承诺。这样可以避免一些可能会D组成员间信d机的误会?
做出一切合理的努力来交付承诺的工作。如果一个小l有来自不同l织的成员,那么合理的期望也因异。例如,某些组成员可能认ؓ在周末工作是合理的;而其他h则可能将他们视ؓ例外或者可能在周末几乎不会M班?
发现承诺陷入危机时进行真诚的沟通。有时将无法避免事情的变化,原因可能是某些Q务的优先U调整、一个意外事件或仅仅是因Z工作g期完成。及早的q行沟通将使与之相依赖的其他小l成员可以有Z制定相应的计划。也总们还可以提出解决q些问题的途径?
q些行ؓ应与企业文化是融合在一LQ队员们已经它们视ZU文化,因此很少讨论它们。但是,团队有时需要与不同的组l一起工作,在这些组l中的相关的价D念ƈ没有被完全地了解和注重。这些组l常常呈现出一U高度推诿的文化Q这U文化约束着应该开攄信息。在q些情况下,团队领导应当Ҏq一Ҏ清楚地陈qC们的期望q帮助新的小l成员适应q种工作方式?
共同的项目设惻I
全力提倡采用一个共同的设想Q以便把注意力放在小l的工作Ҏ上,包括在一个操作环境里交付产品完整的解x案及服务?
寚w目和q程的目标有一个清晰的了解是很重要的。因为小l成员和客户都在猜测q项解决Ҏ能ؓl织做些什么。一个共同的设想ɘq些猜测明确化,q确保所有参与者都在ؓ完成相同的目标而努力着。共同的设想是团队组l模型的基础之一?
当所有的参与者都了解了这一设想q朝着q一设想工作的时候,组便能够根据成员自己的决{与q一设想体现的更为广阔的组意图相吻合,从而获得他们的权力?
没有共同的设惻I组成员可能出现与目标相抵触的观点,作ؓ一个团体的交付变得更加困难。ƈ且即便小l完成交付,组成员也很隄定自q成功Q因U成功依赖于他们评h成功的设惟?
以客户ؓ中心Q?
满客户对Q何优U的团队来说都被看作是W一位的。在整个开发过E中Q以客户Z心包含了组对了解和解决客户业务问题的承诺。衡量以客户Z心的理念体系获得成功的方法之一是能否设计中每一个特性都W合客户和用户需求。同P实现客户满意度的一个关键方式是使用L极地参与设计q在整个开发过E中提供反馈意见。这P组和客户都能的使期望和需求更加吻合?
零缺P
在一个成功的团队中,所有成员都感到要对产品的质量负责。品质量责M能由一个团队成员委托给另一个成员或部门。同P每个成员都要作ؓ客户的拥护者,在整个开发周期中考虑最l品的可用性?
零缺L忉|对质量的承诺。这意味着目标是尽可能最高效地执行工作,q样即不得不在明天׃付品,他们也可以交付出一些东ѝ这个想法是让每一天都有一个接q可交付的品。这q不意味着交付不存在Q何缺L代码Q这意味q品满x出了项目出资h的质量要求ƈ在预想阶D被组接受?
用自动机车装配线作类比最有力的描qCq一概念。传l上Q工作h员将汽R由单独的部分l装hq且Z们自w的质量负责。当汽R下线Q一名检查员q行查ƈ判断该汽车的质量是否辑ֈ售卖的标准。然而在q个q程的后期,大量的时间将p在查找所有的问题上,因ؓ在此时进行纠错是极富价值的。同P既然质量是不可预计的Q在后期军_产品是否可售卖所需p的时间也是不可预计的?
在当前的汽R刉业中,质量已经成ؓ了“第一工作”。这意味着当工作正在进行时Q例如正在装配一扇R门或是安装一部收xQ,查员同时审查该项工作以确保它W合为标准的汽R所定义的质量标准。只要在整个装配q程中保持该U别的质量,那么在后期ؓ保q辆汽R的质量可接受只需要花Ҏ的旉和资源。这使生产过E更可预因为检员只需要检查各个部分的整合处而不是所有个别的工作?/p>
Pooxi法国的在U视频向导和视频搜烦引擎
projectspaces 团队协作工具
HomePortals是又一个可定制Q可扩展的桌面主品。品的独特之处在于QQ何模块均可定Ӟq且可以与其他网l服务的界面可以完全融合?你可以定制一个新的模?其他用户可以复制)Q你也可以修改已有的模块的特性。比如,你可以选择一个预讑֥的模块,上面可以昄delicious的书{֒flickr的图片?/p>
HomePorals同时拥有一个很好的博客blogging工具模块Q在blogd以内|flickr和deliciousQ这栯客可以对该用h个深度的理解?/p>
AjaxTrans 译工具Q提供英,西,P??法等语言之间的实时互译?/p>
Findory Q这是一个blog和新ȝ个性化引擎?已实现正向现金流
DiglogQ记录有、新鲜的信息Q分享。类似SlashdotQdigg?/p>
LinkLike同一领域的blogger和公司网站,利用q告位交换提高各自网站流量的|站?/p>
BibliQ发布和׃n你的作品Q如诗歌Q小故事Q剧本和说{?/p>
Favorville2?的互助^収ͼq是一家位于多伦多的网站,其基本原理是q样的,用户l注册后Q即可发布求助或l予帮助的信息,每次帮助l束的时候,用户需要对另一个用L帮助q行评和评论?被帮助和帮助q别人的人Ş成一个圈子?也有交友的特性?/p>
Fotoflix相片׃n和相片管?/p>
Clipfire允许用户提交电子商务的交易,其他用户可以对交易进行评U,q将最好的交易|顶?有点?DiggQ但是只是在电子商务领域?/p>
url(x) URL面链接的羃写服?/p>
blummy:一个书{N成工兗?/p>
Magnatuneq其实是03q就上线的网站,它具有独特的音乐付费模式Q可能会代表来|络音乐的消Ҏ式?/p>
blogallQ在U的博客|址?博客站点收藏夏V?/p>
Near-time|络协同服务Q用户可以创建团体空_整合体博客Qwiki和日E?型企业Q工作组以及一些专业h员将是Near-time的目标用P它提供一个中心化的交沟通^収ͼ方便团组互动,协作和知识分享,无需安装软g?/p>
Librivoxq是一个巨大的目Q打将已经免于版权保护的书c录制成音频Q以播客的Ş式放于网上供用户播放收听Q这个项目需要大量的志愿者?/p>
OPML增加新的RSS新闻聚合。。包括一个先q的Podcast播客Q可以播放视频文Ӟ也包括一个”阅L单”,允许用户订阅别h推荐的内宏V?/p>
爬狗Q专业的格式化搜索引擎:目前有房产租售、求职招聘、物品交易、交友约会、企业服务、个人服务、餐饮娱乐消费等?/p>
jigsawQ提供名片交?分n。盈利模式清晎ͼ已经获得VC。不q涉及个人隐U?有争议?/p>
Diigo意ؓ“Digest of Internet InformationQGroups and other stuff”,有一个社会性书{站,可以允许用户高亮昄多个内容区,该网站有不少新的功能?/p>
Browsr从某U意义来?Q这是一个标准的书签|站Q但它似乎又~Z作ؓC会性书{ֺ有的一些先q功能,?Delicious Shadows和Wink?/p>
但Browsr也有特色的功能,在这里,书签可以分成各个cdQ其他的用户可以评该书{有用性,而后Browsr会生成一个内含最受欢q的cd和评U最高的书签的目录页面?/p>
Kolablog 多媒体blog服务Q可以拖攑֏布视频文Ӟ在线播客的录?甚至可以Skype中的对话录制成播?Q配音的qȝ片等?/p>
ZohoWriterQ在U字处理Q编辑,׃n文gQtaggingQ发布至blogQ等Q现已结束beta正式发布?/p>
Echosign帮助理执行文g的工兗?解决了类似律师事务所{需要在文g上签字的文g的传输问题?/p>
retrievr 站内内置Flash的画板,用户可以_略地在首页的画板上dx的对象的草图Q系l会帮用户从Flickr的图片库中搜索和发现cM的图片,q显C在面上?/p>
yousendit通过q个服务Q你可以”email”很大的文g?你把此文件上传至|站Q告诉网站你要发l的email地址Q收件h收C个链接,通过该链接他/她可以下载此文gQ最大可上传的文件ؓ1G。单个邮件中不能发送多个文Ӟ那是你可发送压~文Ӟ现提供的免费服务中,允许单一文g在一周内可以下蝲25ơ?/p>
Dottunes׃n你的原创的iTune音乐作品的Y?/p>
YorZ 为公司寻NUh才的q_?公司悬赏为成功的推荐人提供奖金?/p>
Shopify 位于加拿大渥太华的网站,旨在解决现在存在于电子商务中的诸如托,设计及支付方面的问题?是一??的电子商务^収ͼ提供了一些方便买卖双方ؓ完成交易所必须的一些基本功能?06q初上线?/p>
hamachi位于加拿大温哥华的网站,12月刚发布了beta版?用来?C上的电脑l徏成虚拟网l,q可以进行安全的交流?也可以远E登录电脑,使用Windows的文件共?玩LAN游戏?据称?5q?2月已?8?万用戗?/p>
Openvlog在你的blog中创Z自己的视频频道,上传或录制视频ƈ与他人共?/p>
Buzzingo是一个”Yahoo Buzz Index?Google的I’m feeling lucky 概念的血应用Q自动生成内容,q每个小时更新?/p>
Extratasty׃n Q搜索饮料配方的|站?/p>
Lexxe新的搜烦引擎Q直接从面提供短的Q准的{案?声称比其他Q何搜索引擎的l果的准度和相兛_提高50%?/p>
dPolls q家位于以色列的|站Qؓ你的|站提供一个设计美观,富于Ajaxl你的互动的民意测验?/p>
Springdoo无需打字Q你可以通过麦克风和电脑或直接用电话机录制声频文Ӟq过Memailpȝ此’声音”发送出厅R?/p>
MediaMax在线文g和数字媒体的存储|站Q免费空间从10G增加?25G?/p>
FON׃nwifi热点宽带接入Q让更多的h享受全球的wifi服务
ESBN新型的基于社会的针对电子作家Q电子内Ҏ供者和电子出版者的DRM解决ҎQ数字媒体,如电子书Q歌Ԍ软g和播客的{,可以被分配到一个ESBN的IDLQƈ可以跟踪有关所有权Q版权,转让寄授权方面的信息?/p>
TRUVEO是一个去q?月推出的媒体搜烦引擎Q可以快速收录媒体内容,如视频和音频内容?已被AOL收购?/p>
iNods聚合了blog以及其他一些边~性的内容Q重点主要专注于”购物”这一领域?iNods把有兌物的blog以及blog后面的评合在一P这些内定w中呈现给读者?iNods也提供搜索,搜烦l果可以读者指向具体的blogqd详细的内宏V?/p>
HyperSuper个性化新闻聚合Q你只要告知该网站你感兴的内容Q该|站即ؓ你定制个性化的新闻页面?/p>
FeedXS来自荷兰Q创意源之于能让M人可以蟩qblog直接发布RSS feedQ也许这会成为email的替代品用以发布个h的新闅R?/p>
iOweYou在线费用分摊计数器,供共住同一个房间的学生和室友用于分摊费用的工具?/p>
VideoEgg创新视频发布解决Ҏ提供者,刚刚获得August Capital的投资?/p>
BillMonk一允思h们跟t记录朋友间债权债务关系的新服务。比如,我以AA制和B朋友吃饭Q我付了100元的帐(q样我和B各承?0元); 而另一ơ我和B喝咖啡是B埋的?B付了16元)Q这样BillMonk׃自动帮我出BƠ我42元?/p>
LOYOO:在网l上注册IDP购买有IDL服装Q穿服装和别识的|站,好不Ҏ有一个中国的有点意思的站,不过q不太实用?/p>
dohop旅游搜烦引擎Q比较多个旅游承qh的h?机票)Q现在的h一Ƨ元标注Q来自冰岛?/p>
HanzoC会性网l存档服?/p>
egoSurf 搜烦你的|站/blog在yahooQMSNQdelicious和Technorati的排名?/p>
中国W一,世界W二?000tags–千{出台了,q是站长在其博客中的声明。 1000tagsW一个利用“Tag云”进行商业广告的|站Q思\cM英国伙子的”百万首”milliondollarhomepage?最多只?000个tagsQ所以域名就?000tags。Tag?U,一是“独家TAG”,用户可以指定某个tagq买断该tagQ当访客点击此tag的时候,|站x向该tag所链接的需要广告的站点?独家tag的最低费用ؓ250元Q具体看tag字体的大和字数的多而定?最多只卖其中的50个tag作ؓ”独家tag”,售完为止。二是“共享tag”,卛_个用户可以共用一个tagQ当访客点击此tagӞ|站指向该tag的多个用L需要广告的站点Q这些被q告的站点的排名不分先后?׃ntag的最低费用ؓ25元?׃n的用戯多,该tag的字体越大。因为只?0个独家tagQ数量有限,|站不赞成用户去购买独家tagQ网站鼓q户用共享tag?/p>
你有?|络账本;用户自定义分cL{来理帐务;qŞ成交的圈子?/p>
Veetro一Ƅ理YӞ单机版免贏V?主要提供财务帐单Q项目管理,日程׃nQ文档管理及销售管理等斚w的Y件解x?/p>
PXN8 在线囑փ~辑器,可将~辑好的囄直接攑օFlickr中,或存储在桌面?/p>
NewsLetterArchive 存档q向公众开放所有的邮g新闻Q内容由用户贡献
BuddyMarks在线书签理Q可讄U密或共?/p>
GatherNews 2?的社会性新ȝ点,允许用户提交内容Qƈ与用户徏立收入分享的机制(Z用户在网上的zd)yubnub命o行?输入一句命令,自动接入其他的web服务Qƈ昄l果
MeetWithApproval用于安排朋友聚会的网站?由发起h在该|创Z个”聚合页面”,|站会将此页面通知所有将参加聚会的h员?每个人通过讉K该页面,由大家共同来军_最佳的日子和聚会的最x案?/p>
Montastic免费注册后即可监控你所指定的网站的情况Q网站的情况通过RSS和邮仉知你?/p>
HelpSpot Zweb的客h务Y件应用,便于理多个问题咨询Q提高服务支持h员的工作效率Q适用于大中小型企业的客服?/p>
BiddingBuddiesZeBay淯的SNS|站Q是一个经eBay认证的网l应用?直接可以用户在eBay的个料导入到BiddingBuddiesQ在该站Q用户发现新的买家或卖家Q认识新的朋友,׃n书签Q参加兴小l等?/p>
Podzinger曾于前些时候介l过?来自ȝ的剑桥?Pozdzinger利用声音识别技术将播客文g转换成可搜烦的文本文件?q一技术原来ؓ中央情报局和其他的一些政府部所说用?搜烦l果按日期和相关性的高低予以列出?/p>
用户可以从搜索结果中选择所要收听的播客内容?用户也可以用RSS订阅搜烦l果?/p>
Podzinger有CPCq告支持?/p>
Oyogi允许某个组q行:
1?q用Zweb的即旉讯工具Q在成员间就某一话题q行实时协作
2?问题的互问互{?/p>
3??1?中的内容q行存储q可q行搜烦?/p>
TrueShare商务U的在线文g理和备份服务?允许无限量用户用?可以发送,接收Q备份,存储和获取各U文件类型?可以Z同的客户创徏不同的文件目录,q可跟踪文g的用情c?每月30元提供3G的空间和30G的传输带宽?/p>
图书漂流:关于分n藏书Q以书会友的公益性项目。v外有bookcrossing。图书漂活动源于上世纪60q代的欧zԌ该活动是指书友将自己不再阅读的书贴上特定的标{投攑ֈ公共场所Q如公园的长凳上Q无偿地提供l拾取到的h阅读。拾取的人阅M后,Ҏ标签提示Q再以相同的方式该书投攑ֈ公共环境中去?/p>
奇L|?x搜烦,国外UCInstant Search EngineQ又UCurrent Event Search Engine(当前事g搜烦引擎)Q是指以RSS/ATOM、TAG{新兴技术ؓ基础Q专注于频繁更新的博客网站和新闻|站Q给用户提供接近实时效果的搜索结果?/p>
ChatSum在你的浏览器上加载一个对话框Q让你可以跟正在讉K同一个网站的ChatSum的用戯天交?/p>
GookBox存储音乐到Gmail邮箱Qƈ直接在POP3邮箱中播放?/p>
HotpadsZ地图的房屋出U的搜烦引擎Q不是一个血|站Q而是全新的地囑ֺ用,现阶D|主要的地区在华盛特区,q阿密,达拉斯和凤凰?/p>
Suckingfish公开或私人小l间的协作^台?搜烦共同感兴的主题
WebJay允许用户在网上发布音乐播放清单的|站Q已被Yahoo收购?/p>
Fruitcast 播客q告q_
Scupioh:LC代的搜烦引擎Q用者不限字敎ͼ利用无限关键字来完整描述出想要搜索的概念Q还可以以整文章长来直接搜索。酷比来自台湾?/p>
Airset新型的日E协作共享和联系信息理工具
newzingo自动l滚动的Google新闻q行TAGQƈ这些Tag昄在”TAG云”中QTAG的字体越大,跟这个新ȝ关的新闻多?/p>
你的Google新闻MAP
Nuvvo免费的网上学习管理系l,允许教师公布评表,q进行网上教学?/p>
Shozu 是基于手机的囄,视频分nQ它其实提供中间的一个工具内容,用户通过shozu Q将囄上传到指定的在线分n站点Q如flickrQWebshotsQtextamerica。 使用它需要下载一个安装在手机上面的客L软g!
Q图是一个创造、收集和分n可爱囄的开攑^台。用户可以把一个网上好看的图片提取出来,也可以用攉的图制作好看的图文日讎ͼ再复制到blog上?/p>
packagemapper用地图显CZ所寄送的快g(FedEx联邦特快QUPS联合包裹和USPS国邮政)q送的路线图?你只要输入承qh和快件号码,卛_跟踪你寄送的快g的派送情c?可以输入多个快g受?
文章原始地址Q?a >http://blog.csdn.net/softj/archive/2006/05/04/707989.aspx
一、通用?
1.1 不用new关键词创建类的实?
1.2 使用非阻塞I/O
1.3 慎用异常
1.4 不要重复初始化变?
1.5 量指定cȝfinal修饰W?
1.6 量使用局部变?
1.7 乘法和除?
二、J2EE?
2.1 使用~冲标记
2.2 始终通过会话Bean讉K实体Bean
2.3 选择合适的引用机制
2.4 在部|描q器中设|只d?
2.5 ~冲对EJB Home的访?
2.6 为EJB实现本地接口
2.7 生成主键
2.8 及时清除不再需要的会话
2.9 在JSP面中关闭无用的会话
2.10 Servlet与内存?
2.11 HTTP Keep-Alive
2.12 JDBC与Unicode
2.13 JDBC与I/O
1.14 内存数据?
三、GUI?
3.1 用JAR压羃cL?
3.2 提示Applet装入q程
3.3 在画出图形之前预先装入它
3.4 覆盖updateҎ
3.5 延迟重画操作
3.6 使用双缓冲区
3.7 使用BufferedImage
3.8 使用VolatileImage
3.9 使用Window Blitting
四、补充资?
===================================
正文:
===================================
一、通用?
“通用”讨论的问题适合于大多数Java应用?
1.1 不用new关键词创建类的实?
用new关键词创建类的实例时Q构造函数链中的所有构造函数都会被自动调用。但如果一个对象实CCloneable接口Q我们可以调用它的clone()Ҏ。clone()Ҏ不会调用McL造函数?
在用设计模式(Design PatternQ的场合Q如果用Factory模式创徏对象Q则改用clone()Ҏ创徏新的对象实例非常单。例如,下面是Factory模式的一个典型实玎ͼ
public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()ҎQ如下所C:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思\对于数组处理同样很有用?
1.2 使用非阻塞I/O
版本较低的JDK不支持非dI/O API。ؓ避免I/OdQ一些应用采用了创徏大量U程的办法(在较好的情况下,会用一个缓冲池Q。这U技术可以在许多必须支持q发I/O的应用中见刎ͼ如Web服务器、报价和拍卖应用{。然而,创徏JavaU程需要相当可观的开销?
JDK 1.4引入了非d的I/O库(java.nioQ。如果应用要求用版本较早的JDKQ在q里有一个支持非dI/O的Y件包?
请参见Sun中国|站的《调整Java的I/O性能》?
1.3 慎用异常
异常Ҏ能不利。抛出异帔R先要创徏一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本圎ͼNativeQ方法,fillInStackTrace()Ҏ查堆栈,攉调用跟踪信息。只要有异常被抛出,VM必调整调用堆栈,因ؓ在处理过E中创徏了一个新的对象?
异常只能用于错误处理Q不应该用来控制E序程?
1.4 不要重复初始化变?
默认情况下,调用cȝ构造函数时Q?Java会把变量初始化成定的|所有的对象被设|成nullQ整数变量(byte、short、int、longQ设|成0Qfloat?double变量讄?.0Q逻辑D|成false。当一个类从另一个类zӞq一点尤其应该注意,因ؓ用new关键词创Z个对象时Q构造函数链中的所有构造函数都会被自动调用?
1.5 量指定cȝfinal修饰W?
带有final修饰W的cL不可z的。在Java核心API中,有许多应用final的例子,例如java.lang.String。ؓStringcL定final防止了h们覆盖length()Ҏ?
另外Q如果指定一个类为finalQ则该类所有的Ҏ都是final。Java~译器会LZ内联QinlineQ所有的finalҎQ这和具体的~译器实现有养I。此举能够性能q_提高50%?
1.6 量使用局部变?
调用Ҏ时传递的参数以及在调用中创徏的时变量都保存在栈QStackQ中Q速度较快。其他变量,如静态变量、实例变量等Q都在堆QHeapQ中创徏Q速度较慢。另外,依赖于具体的~译?JVMQ局部变量还可能得到q一步优化。请参见《尽可能使用堆栈变量》?
1.7 乘法和除?
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码Q?
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
修改后的代码不再做乘?的操作,而是改用{h的左U?位操作,每左U?位相当于乘以2。相应地Q右U?位操作相当于除以2。值得一提的是,虽然UM操作速度快,但可能代码比较难于理解Q所以最好加上一些注释?
二、J2EE?
前面介绍的改善性能技巧适合于大多数Java应用Q接下来要讨论的问题适合于用JSP、EJB或JDBC的应用?
2.1 使用~冲标记
一些应用服务器加入了面向JSP的缓冲标记功能。例如,BEA的WebLogic Server?.0版本开始支持这个功能,Open Symphony工程也同h持这个功能。JSP~冲标记既能够缓冲页面片断,也能够缓冲整个页面。当JSP面执行Ӟ如果目标片断已经在缓冲之中,则生成该片断的代码就不用再执行。页面~冲捕获Ҏ定URL的请求,q缓冲整个结果页面。对于购物篮、目录以及门L站的主页来说Q这个功能极其有用。对于这cd用,面U缓冲能够保存页面执行的l果Q供后h使用?
对于代码逻辑复杂的页面,利用~冲标记提高性能的效果比较明显;反之Q效果可能略逊一{V?
请参见《用~冲技术提高JSP应用的性能和稳定性》?
2.2 始终通过会话Bean讉K实体Bean
直接讉K实体Bean不利于性能。当客户E序q程讉K实体BeanӞ每一个getҎ都是一个远E调用。访问实体Bean的会话Bean是本地的Q能够把所有数据组l成一个结构,然后q回它的倹{?
用会话Bean装对实体Bean的访问能够改q事务管理,因ؓ会话Bean只有在到达事务边界时才会提交。每一个对getҎ的直接调用生一个事务,容器在每一个实体Bean的事务之后执行一个“装?d”操作?
一些时候,使用实体Bean会导致程序性能不佳。如果实体Bean的唯一用途就是提取和更新数据Q改成在会话Bean之内利用JDBC讉K数据库可以得到更好的性能?
2.3 选择合适的引用机制
在典型的JSP应用pȝ中,头、页脚部分往往被抽取出来,然后Ҏ需要引入页头、页脚。当前,在JSP面中引入外部资源的Ҏ主要有两U:include指oQ以及include动作?
include指oQ例?lt;%@ include file="copyright.html" %>。该指o在编译时引入指定的资源。在~译之前Q带有include指o的页面和指定的资源被合ƈ成一个文件。被引用的外部资源在~译时就定Q比q行时才定资源更高效?
include动作Q例?lt;jsp:include page="copyright.jsp" />。该动作引入指定面执行后生成的l果。由于它在运行时完成Q因此对输出l果的控制更加灵zR但Ӟ只有当被引用的内定wJ地改变Ӟ或者在对主面的请求没有出C前,被引用的面无法定Ӟ使用include动作才合?
2.4 在部|描q器中设|只d?
实体Bean的部|描q器允许把所有getҎ讄成“只诠Z。当某个事务单元的工作只包含执行d操作的方法时Q设|只d性有利于提高性能Q因为容器不必再执行存储操作?
2.5 ~冲对EJB Home的访?
EJB Home接口通过JNDI名称查找获得。这个操作需要相当可观的开销。JNDI查找最好放入Servlet的init()Ҏ里面。如果应用中多处频繁地出现EJB讉KQ最好创Z个EJBHomeCachecREJBHomeCachecM般应该作为singleton实现?
2.6 为EJB实现本地接口
本地接口是EJB 2.0规范新增的内容,它得Bean能够避免q程调用的开销。请考虑下面的代码?
PayBeanHome home = (PayBeanHome)
javax.rmi.PortableRemoteObject.narrow
(ctx.lookup ("PayBeanHome"), PayBeanHome.class);
PayBean bean = (PayBean)
javax.rmi.PortableRemoteObject.narrow
(home.create(), PayBean.class);
W一个语句表C我们要LBean的Home接口。这个查N过JNDIq行Q它是一个RMI调用。然后,我们定位q程对象Q返回代理引用,q也是一?RMI调用。第二个语句C了如何创Z个实例,涉及了创建IIOPhq在|络上传输请求的stubE序Q它也是一个RMI调用?
要实现本地接口,我们必须作如下修改:
Ҏ不能再抛出java.rmi.RemoteException异常Q包括从RemoteExceptionz的异常,比如 TransactionRequiredException、TransactionRolledBackException?NoSuchObjectException。EJB提供了等L本地异常Q如TransactionRequiredLocalException?TransactionRolledBackLocalException和NoSuchObjectLocalException?
所有数据和q回值都通过引用的方式传递,而不是传递倹{?
本地接口必须在EJB部v的机器上使用。简而言之,客户E序和提供服务的lg必须在同一个JVM上运行?
如果Bean实现了本地接口,则其引用不可串行化?
请参见《用本地引用提高EJB讉K效率》?
2.7 生成主键
在EJB之内生成主键有许多途径Q下面分析了几种常见的办法以及它们的特点?
利用数据库内建的标识机制QSQL Server的IDENTITY或Oracle的SEQUENCEQ。这U方法的~点是EJB可移植性差?
由实体Bean自己计算主键|比如做增量操作)。它的缺Ҏ要求事务可串行化Q而且速度也较慢?
利用NTP之类的时钟服务。这要求有面向特定^台的本地代码Q从而把Bean固定C特定的OS之上。另外,它还D了这样一U可能,卛_多CPU的服务器上,同一个毫U之内生成了两个主键?
借鉴Microsoft的思\Q在Bean中创Z个GUID。然而,如果不求助于JNIQJava不能定|卡的MAC地址Q如果用JNIQ则E序p依赖于特定的OS?
q有其他几种办法Q但q些办法同样都有各自的局限。似乎只有一个答案比较理惻Il合q用RMI和JNDI。先通过RMI注册把RMIq程对象l定到JNDI树。客L序通过JNDIq行查找。下面是一个例子:
public class keyGenerator extends UnicastRemoteObject implements Remote {
private static long KeyValue = System.currentTimeMillis();
public static synchronized long getKey() throws RemoteException { return KeyValue++; }
2.8 及时清除不再需要的会话
Z清除不再zd的会话,许多应用服务器都有默认的会话时旉Q一般ؓ30分钟。当应用服务器需要保存更多会话时Q如果内存容量不I操作pȝ会把部分内存数据转移到磁盘,应用服务器也可能Ҏ“最q最频繁使用”(Most Recently UsedQ算法把部分不活跃的会话转储到磁盘,甚至可能抛出“内存不”异常。在大规模系l中Q串行化会话的代h很昂늚。当会话不再需要时Q应当及时调用HttpSession.invalidate()Ҏ清除会话。HttpSession.invalidate()Ҏ通常可以在应用的退出页面调用?
2.9 在JSP面中关闭无用的会话
对于那些无需跟踪会话状态的面Q关闭自动创建的会话可以节省一些资源。用如下page指oQ?
<%@ page session="false"%>
2.10 Servlet与内存?
许多开发者随意地把大量信息保存到用户会话之中。一些时候,保存在会话中的对象没有及时地被垃圑֛收机制回收。从性能上看Q典型的症状是用h到系l周期性地变慢Q却又不能把原因归于M一个具体的lg。如果监视JVM的堆I间Q它的表现是内存占用不正常地大v大落?
解决q类内存问题主要有二U办法。第一U办法是Q在所有作用范围ؓ会话的Bean中实现HttpSessionBindingListener接口。这P只要实现valueUnbound()ҎQ就可以昑ּ地释放Bean使用的资源?
另外一U办法就是尽快地把会话作废。大多数应用服务器都有设|会话作废间隔时间的选项。另外,也可以用~程的方式调用会话的 setMaxInactiveInterval()ҎQ该Ҏ用来讑֮在作废会话之前,Servlet容器允许的客戯求的最大间隔时_以秒计?
2.11 HTTP Keep-Alive
Keep-Alive功能使客L到服务器端的q接持箋有效Q当出现Ҏ务器的后l请求时QKeep-Alive功能避免了徏立或者重新徏立连接。市Z的大部分Web服务器,包括iPlanet、IIS和ApacheQ都支持HTTP Keep-Alive。对于提供静态内容的|站来说Q这个功能通常很有用。但是,对于负担较重的网站来_q里存在另外一个问题:虽然为客户保留打开的连接有一定的好处Q但它同样媄响了性能Q因为在处理暂停期间Q本来可以释攄资源仍旧被占用。当Web服务器和应用服务器在同一台机器上q行ӞKeep- Alive功能对资源利用的影响其H出?
2.12 JDBC与Unicode
惛_你已l了解一些用JDBC时提高性能的措施,比如利用q接池、正地选择存储q程和直接执行的SQL、从l果集删除多余的列、预先编译SQL语句Q等{?
除了q些显而易见的选择之外Q另一个提高性能的好选择可能是把所有的字符数据都保存ؓUnicodeQ代码页13488Q。Java以Unicode形式处理所有数据,因此Q数据库驱动E序不必再执行{换过E。但应该CQ如果采用这U方式,数据库会变得更大Q因为每个Unicode字符需?个字节存储空间。另外,如果有其他非Unicode的程序访问数据库Q性能问题仍旧会出玎ͼ因ؓq时数据库驱动程序仍旧必L行{换过E?
2.13 JDBC与I/O
如果应用E序需要访问一个规模很大的数据集,则应当考虑使用块提取方式。默认情况下QJDBC每次提取32行数据。D例来_假设我们要遍历一?000 行的记录集,JDBC必须调用数据?57ơ才能提取到全部数据。如果把块大改?12Q则调用数据库的ơ数减到10ơ?
在一些情形下q种技术无效。例如,如果使用可滚动的记录集,或者在查询中指定了FOR UPDATEQ则块操作方式不再有效?
1.14 内存数据?
许多应用需要以用户为单位在会话对象中保存相当数量的数据Q典型的应用如购物篮和目录等。由于这cL据可以按照行/列的形式l织Q因此,许多应用创徏了庞大的Vector或HashMap。在会话中保存这cL据极大地限制了应用的可~性,因ؓ服务器拥有的内存臛_必须辑ֈ每个会话占用的内存数量乘以ƈ发用h大数量,它不仅服务器h格昂贵,而且垃圾攉的时间间隔也可能廉到难以忍受的E度?
一些h把购物篮/目录功能转移到数据库层,在一定程度上提高了可伸羃性。然而,把这部分功能攑ֈ数据库层也存在问题,且问题的Ҏ与大多数关系数据库系l的体系l构有关。对于关pL据库来说Q运行时的重要原则之一是确保所有的写入操作E_、可靠,因而,所有的性能问题都与物理上把数据写入盘的能力有兟뀂关pL据库力图减少I/O操作Q特别是对于L作,但实现该目标的主要途径只是执行一套实现缓冲机制的复杂法Q而这正是数据库层W一h能瓉通常L CPU的主要原因?
一U替代传l关pL据库的方案是Q用在内存中运行的数据库(In-memory DatabaseQ,例如TimesTen。内存数据库的出发点是允许数据时地写入Q但q些数据不必怹C存到盘上,所有的操作都在内存中进行。这P内存数据库不需要复杂的法来减I/O操作Q而且可以采用比较单的加锁机制Q因而速度很快?
三、GUI?
q一部分介绍的内定w合于图形用L面的应用QApplet和普通应用)Q要用到AWT或Swing?
3.1 用JAR压羃cL?
Java档案文gQJAR文gQ是ҎJavaBean标准压羃的文Ӟ是发布JavaBeanlg的主要方式和推荐方式。JAR档案有助于减文件体U,~短下蝲旉。例如,它有助于Applet提高启动速度。一个JAR文g可以包含一个或者多个相关的Bean以及支持文gQ比如图形、声韟뀁HTML 和其他资源?
要在HTML/JSP文g中指定JAR文gQ只需在Applet标记中加入ARCHIVE = "name.jar"声明?
请参见《用档案文件提?applet 的加载速度》?
3.2 提示Applet装入q程
你是否看到过使用Applet的网站,注意到在应该q行Applet的地方出C一个占位符Q当Applet的下载时间较长时Q会发生什么事情?最大的可能是用户掉头d。在q种情况下,昄一个Applet正在下蝲的信息无疑有助于鼓励用户l箋{待?
下面我们来看看一U具体的实现Ҏ。首先创Z个很的AppletQ该Applet负责在后C载正式的AppletQ?
import java.applet.Applet;
import java.applet.AppletStub;
import java.awt.Label;
import java.awt.Graphics;
import java.awt.GridLayout;
public class PreLoader extends Applet implements Runnable, AppletStub {
String largeAppletName;
Label label;
public void init() {
// 要求装蝲的正式Applet
largeAppletName = getParameter("applet");
// “请E等”提CZ?br />label = new Label("L{?.." + largeAppletName);
add(label);
}
public void run(){
try {
// 获得待装载Applet的类
Class largeAppletClass = Class.forName(largeAppletName);
// 创徏待装载Applet的实?br />Applet largeApplet = (Applet)largeAppletClass.newInstance();
// 讄该Applet的StubE序
largeApplet.setStub(this);
// 取消“请E等”信?br />remove(label);
// 讄布局
setLayout(new GridLayout(1, 0));
add(largeApplet);
// 昄正式的Applet
largeApplet.init();
largeApplet.start();
}
catch (Exception ex) {
// 昄错误信息
label.setText("不能装入指定的Applet");
}
// h屏幕
validate();
}
public void appletResize(int width, int height) {
// 把appletResize调用从stubE序传递到Applet
resize(width, height);
}
}
~译后的代码于2KQ下载速度很快。代码中有几个地方值得注意。首先,PreLoader实现了AppletStub接口。一般地QApplet从调用者判断自qcodebase。在本例中,我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地ҎQ?AppletStub接口包含许多和AppletcMLҎQ但appletResize()Ҏ除外。这里我们把对appletResize()Ҏ的调用传递给了resize()Ҏ?
3.3 在画出图形之前预先装入它
ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate()Q能够用一ơrepaint()操作在屏q上d囑Ş。下面提供了一个例子?
public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {
if ((flags & ALLBITS) !=0 {
repaint();
}
else if (flags & (ERROR |ABORT )) != 0) {
error = true;
// 文g没有扑ֈQ考虑昄一个占位符
repaint();
}
return (flags & (ALLBITS | ERROR| ABORT)) == 0;
}
当图形信息可用时QimageUpdate()Ҏ被调用。如果需要进一步更斎ͼ该方法返回trueQ如果所需信息已经得到Q该Ҏq回false?
3.4 覆盖updateҎ
update()Ҏ的默认动作是清除屏幕Q然后调用paint()Ҏ。如果用默认的update()ҎQ频J用图形的应用可能出现昄闪烁现象。要避免在paint()调用之前的屏q清除操作,只需按照如下方式覆盖update()ҎQ?
public void update(Graphics g) {
paint(g);
}
更理想的Ҏ是:覆盖update()Q只重画屏幕上发生变化的区域Q如下所C:
public void update(Graphics g) {
g.clipRect(x, y, w, h);
paint(g);
}
3.5 延迟重画操作
对于囑Ş用户界面的应用来_性能低下的主要原因往往可以归结为重dq的效率低下。当用户改变H口大小或者滚动一个窗口时Q这一炚w常可以很明昑֜观察到。改变窗口大或者滚动屏q之cȝ操作D重画屏幕事g大量地、快速地生成Q甚臌q了相关代码的执行速度。对付这个问题最好的办法是忽略所有“迟到?的事件?
在这里引入一个数毫秒的时差,卛_果我们立x收到了另一个重MӞ可以停止处理当前事g转而处理最后一个收到的重画事gQ否则,我们l箋q行当前的重画过E?
如果事g要启动一耗时的工作,分离Z个工作线E是一U较好的处理方式Q否则,一些部件可能被“冻l”,因ؓ每次只能处理一个事件。下面提供了一个事件处理的单例子,但经q扩展后它可以用来控制工作线E?
public static void runOnce(String id, final long milliseconds) {
synchronized(e_queue) { // e_queue: 所有事件的集合
if (!e_queue.containsKey(id)) {
e_queue.put(token, new LastOne());
}
}
final LastOne lastOne = (LastOne) e_queue.get(token);
final long time = System.currentTimeMillis(); // 获得当前旉
lastOne.time = time;
(new Thread() {public void run() {
if (milliseconds > 0) {
try {Thread.sleep(milliseconds);} // 暂停U程
catch (Exception ex) {}
}
synchronized(lastOne.running) { // {待上一事gl束
if (lastOne.time != time) // 只处理最后一个事?br />return;
}
}}).start();
}
private static Hashtable e_queue = new Hashtable();
private static class LastOne {
public long time=0;
public Object running = new Object();
}
3.6 使用双缓冲区
在屏q之外的~冲区绘图,完成后立x整个囑Ş昄出来。由于有两个~冲区,所以程序可以来回切换。这P我们可以用一个低优先U的U程负责dQ得程序能够利用空闲的CPU旉执行其他d。下面的伪代码片断示范了q种技术?
Graphics myGraphics;
Image myOffscreenImage = createImage(size().width, size().height);
Graphics offscreenGraphics = myOffscreenImage.getGraphics();
offscreenGraphics.drawImage(img, 50, 50, this);
myGraphics.drawImage(myOffscreenImage, 0, 0, this);
3.7 使用BufferedImage
Java JDK 1.2使用了一个Y昄讑֤Q得文本在不同的^C看v来相伹{ؓ实现q个功能QJava必须直接处理构成文字的像素。由于这U技术要在内存中大量地进行位复制操作Q早期的JDK在用这U技术时性能不佳。ؓ解决q个问题而提出的Java标准实现了一U新的图形类型,即BufferedImage?
BufferedImage子类描述的图形带有一个可讉K的图形数据缓冲区。一个BufferedImage包含一个ColorModel和一l光栅图形数据。这个类一般用RGBQ红、绿、蓝Q颜色模型,但也可以处理灰度U图形。它的构造函数很单,如下所C:
public BufferedImage (int width, int height, int imageType)
ImageType允许我们指定要缓冲的是什么类型的囑ŞQ比?-位RGB?-位RGB、灰度{?
3.8 使用VolatileImage
许多gq_和它们的操作pȝ都提供基本的g加速支持。例如,g加速一般提供矩形填充功能,和利用CPU完成同一d相比Q硬件加速的效率更高。由于硬件加速分M一部分工作Q允许多个工作流q发q行Q从而缓解了对CPU和系lȝ的压力,使得应用能够q行得更快。利用VolatileImage可以创徏g加速的囑Ş以及理囑Ş的内宏V由于它直接利用低层q_的能力,性能的改善程度主要取决于pȝ使用的图形适配器。VolatileImage的内定w时可能丢失,也即它是“不E_的(volatileQ”。因此,在用图形之前,最好检查一下它的内Ҏ否丢失。VolatileImage有两个能够检查内Ҏ否丢qҎQ?
public abstract int validate(GraphicsConfiguration gc);
public abstract Boolean contentsLost();
每次从VolatileImage对象复制内容或者写入VolatileImageӞ应该调用validate()Ҏ。contentsLost()Ҏ告诉我们Q自从最后一ơvalidate()调用之后Q图形的内容是否丢失?
虽然VolatileImage是一个抽象类Q但不要从它q里z子类。VolatileImage应该通过 Component.createVolatileImage()或?GraphicsConfiguration.createCompatibleVolatileImage()Ҏ创徏?
3.9 使用Window Blitting
q行滚动操作Ӟ所有可见的内容一般都要重画,从而导致大量不必要的重d作。许多操作系l的囑Ş子系l,包括WIN32 GDI、MacOS和X/WindowsQ都支持Window Blitting技术。Window Blitting技术直接在屏幕~冲Z把图形移到新的位|,只重L出现的区域。要在Swing应用中用Window Blitting技术,讄Ҏ如下Q?
setScrollMode(int mode);
在大多数应用中,使用q种技术能够提高滚动速度。只有在一U情形下QWindow Blitting会导致性能降低Q即应用在后台进行滚动操作。如果是用户在滚动一个应用,那么它L在前収ͼ无需担心M负面影响?
|素·琼斯Q执行编?2002q?2?1?
我不知道你的具体工作是什么。如果你是某冷门领域的专家而变得不可或~,或者你们的公司十分E_Q以你现有的技术就以安度你的职业生Q那我不知道你是否有׃的危险。不怎样Q请你先不要急着寄出那些告诉我你们的公司对用VB3十分满意或你们除C以外怸用其它语a的信Ӟq保留v那些讲述.NET如何把Java扫地出门、XML如何取代关pd数据库、或你怎样能用汇编语言或C写Q何Y件而Q何其它开发工具都不重要的信g?
现在Q想象一下如果你像很多受裁员和公司倒闭影响的同行一样失M工作Q那会怎样。如果你H然需要搬往它处该怎么办?如果你的公司H然做了技术{向又怎么办?
在目前的׃市场Q经理们是根据当前和未来的开发需要招聘雇员。作为开发h员,你所掌握的知识是你找工作和保住工作的关键。你要了解技术的发展方向Q跟上技术的变化Q这一点十分重要,即你永q不用再扑ּ发方面的工作?
q里是我选出的当前最重要的十大开发技术,最重要的排在前面。看完本文后Q请务必加入talk.editors.devx讨论l,提出你选出的十大技术?
1. XML
首先Q你要了解XML。我不是说仅仅是XML规格本nQ还包括一pd相关的基于XML的语aQ最重要的是XHTML、XSLT、XSL、DTDs、XML Schema (XSD)、XPath、XQuery和SOAP。那些在q去5q内从未过键盘的hQ可能不知道XMLZ物。XML是一U文本文Ӟ使用与HTMLcM的标记。XML能定义一个树状结构,q能描述所含的数据?
XML最好的一Ҏ既能存结构化数据也能存非l构化数据。它既能存贮和描q?/span>
?/font>
规格?/span>
?/font>
(regular)表格数据Q也能容U_描述
?/font>
_糙?/span>
?/font>
(ragged)文g数据?
XHTML是现今写HTML的首选方法。因为它是Ş式完好(well formedQ的XMLQ比起古老的、通常是畸形(malformedQ的HTML文gQXHTML格式的文件更Ҏ处理?
XSLT和XSL是用于把XML文g转成其它格式的语a。可转换的格式包括:文本文g、PDF文g、HTML、以逗号为分隔符的文Ӟ或其它XML文g?
DTD和XML Schema描述XML文g所能包含的内容的类型,q让??验证 ?XML文g内容的合理性,而不用写Ҏ代码以确保内容符合规则要求?
XPath和XQuery是用于从XML文g中抽取单个项目或一l项目的查询语言。XQuery扩展了XPathQ因而更重要。XQuery与XML的关pL像SQL与关pL据库的关pR?
SOAP是Web服务之间的一个标准通讯协议。尽你不需要对SOAP标准一清二楚,你应该熟悉一般的schema和它的工作原理,以便能应用这门技术?
2. Web服务
Web服务是XML行后的一个直接物。因Z能用XML描述数据和物Ӟ因ؓ你能用schema保XML文g内容的合理性,因ؓXML是基于文本的规范QXMLq_通讯标准提供了一个极其方便的基本格式。如果你q从来没到Web服务Q你可能很快׃到Q在未来5q内Q你几乎肯定会碰到。熟悉Web服务十分重要Q因为它是目前所有跨不同机器、不同语a、不同^台和不同地点的通讯协议中最单的一个。不你需要与否,Web服务是迈向互用性的重要一步?
XML工作l主席John Bosak曾说XML
?/font>
lJava一些事?/span>
?/font>
。实际上QWeb服务让所有语a都有了一些事做。Web服务让在大型Zq行的COBOL应用软g能调用在手持讑֤上运行的Java应用E序、能让Java applet?NET服务器交谈、能让微Y件与Web服务器无~连接,q提供了一个相对容易的ҎQ让企业不光能向外界提供数据Q还能提供功能,而且是一U与语言、^台和位置都独立的Ҏ?
3. 面向对象的编E?/strong>
很多E序员仍认ؓOOP是象牙塔里的技术。但如果你想一下是什么语a在过ȝ10q里占主导地位,你就会理解OOP不是象牙塔里的技术。OOP从Smalltalk开始,传到C++和Pascal (Delphi)。Java使OOP大踏步地q向LQ几q后的VB.NET和C#则完全确立了OOP的优势地位。尽这些语a中的多数q不要求你必MOOPQ但我觉得如果你不了解OOP的基本概念也不知道如何应用这些概念,你能扑ֈ的编E工作将来少?
4. Java、C++、C#和VB.NET
我把q些语言列在一Pq不是徏议你成ؓ每一U语a的专家。我的理由是Q学习编E最有效的方法之一是看代码Q而你能看到的大量的代码很可能不是用你所喜爱的语a~写的?
在过dq_各语a的能力越来越接近。现在,你可以用VB.NET写Windows服务、Web应用E序或命令行E序。即使你只用一U语aQ你也应该学一些其它语aQ以便能看懂那些样例Qƈ其译C所用的语言。这4U语a是基本核心,q有其它一些满不同需要、颇L途的语言Q如FORTRAN、COBOL、APL、ADA、Perl和Lisp?
5. JavaScript
管名字有些相像Q但Java与JavaScriptq无兌。ؓ什么一个脚本语a会如此重要呢Q因为所有主浏览器都用JavaScript。如果你需要写Web应用E序Q你有_的理由学JavaScript。JavaScript可以用作ASP或ASP.NET的服务器语言Q也可以当做用于扩展XSLT的功能语a(functional language)。JavaScript是Mozilla/Netscape中用于激zd于XUL的程序接口的首选语a。JavaScript的一个变UActionScript是Flash MX的编E语a。将来,JavaScript很可能成为新讑֤的编E语aQ以及大型应用Y件中的宏语言?
与JavaScript相对照的是VBScript。尽Microsoft的Y件对VBScript有良好的支持Q但VBScript在未来的开发工作中很可能是一个糟p的选择。就是Microsoft也們于用JavaScriptQ或Microsoft自己的变U:JScriptQ写客户端程序。在选择脚本语言Ӟ请选择JavaScript?
6. 正则表达式(Regular ExpressionsQ?/font>
查寻关系数据库可以用SQLQ查询XML可以用XPath和XQueryQ查询纯文本文g则可以用正则表达式。例如,你可以用一个命令从一个HTML文g中查扑ƈ删除所有的注释。各U开发语a内置的一些简单的文本查询功能Q如"IndexOf"函数或VB中经典的"InStr"函数?Like"操作W,Ҏ不能与正则表辑ּ相提q论。现在,各种主要的开发语a都提供用正则表辑ּ的途径。尽正则表辑ּ本n既难懂更难读Q是回到早期计算机时代的一U倒退Q,但它却是一个功能强大而且未被充分利用的工兗?
7. 设计模式
正像OOP通过把对象分cM化编E一P设计模式对一些普遍的对象之间的交互进行分c,q赋予一个恰当的名称。OOP用得多Q设计模式就有用。一些最常用的模式的名称已经变成了Y件开发领域共同用的术语Q所以要跟上信息的主,你就要对设计模式有相当的理解?
8. Flash MX
如果你需要在客户端得到比HTML和CSS更多的图形和更强的编E功能,Flash是你的答案。用Flash~程比开发Java applets或写.NET代码要快得多Q也Ҏ得多?
在最新版?(MX) 中,Flash不仅仅是d和制造动ȝ工具Q它已经成ؓ一个编E功能强大的开发环境:能调用SOAP Web服务Q也能调用远端服务器上的ColdFusion、Java?NETE序。Flash无处不在。它的引擎存在于世界上大多数客户端计机Q包括手持设备、置盒、甚x新的书写板电脑。所以用Flash能大大扩展你的程序的应用范围?
9. Linux/Windows
熟悉Linux。在一台旧机器或新机器上安装Linux。下载图形用L面,在其基础上写一些程序。安装ApacheQ写一个Web应用E序。这个世界不再仅仅是属于WindowsQ这U趋势可能还会持l下厅R如果你是一名中坚的Linux开发h员,那就抛弃你对Windows的憎Ӟ看看你能否做一些Windows~程。Windows能l在台式电脑上称王是有其原因的,q不仅仅是因为Microsoft控制了这个市场?
没h知道你们公司会在什么时候决定从Linux转向WindowsQ或从Windows转向LinuxQ,或者你惌C家用另一U^台的公司Q或者你惛_了开发一个杀手Y件的好主意,所以你要争取拥有在不同操作pȝ上的~程l验?
10. SQL
管SQL不像本文讨论的其它技术那hQ而且SQL的重要性在未来10q内很可能降低,但它仍然是一基本技能。很多开发h员还没有掌握q门技术,或掌握得不够Q不以有效率地使用它。不要依赖具有图形用L面的SQL生成器替你做事情Q你要自己手工地写查询命令,直到你熟悉基本的SQL语法为止。了解SQL不仅能帮助你日后学习XQueryQ你q有可能马上发现能简化或改进目前目的方法?
培养好奇?/strong>
最后,Q对Q我意识到这是第11门技术)Q好奇心是你最重要的技能。要d试各U东ѝ新语言或新技术对你当前或来的工作可能有用,也可能没用,但ƈ不是你所学的每一件事都是Z工作。不要害怕失败,万事开头难Q学新技术也是如此。大多数p|是因Zh们希望太快地学到太多的东ѝ要Ҏ一点进步感到满意,不要让时_或缺乏时_妨碍你。相反,你要安排旉留心、研I、试验新的开发技术和工具?
你可能永q也没有必要成ؓq些技术的专家Q而且我的选择可能Ҏ不适合你的Ҏ情况Q但通过培养好奇心,你将会发C应该了解的东ѝ?