??xml version="1.0" encoding="utf-8" standalone="yes"?>青青青国产色视频在线观看国产亚洲欧洲国产综合 ,久久精品亚洲男人的天堂 ,亚洲av永久无码精品天堂久久 http://www.tkk7.com/jhyan/zh-cnSun, 11 May 2025 22:54:10 GMTSun, 11 May 2025 22:54:10 GMT60linux 下netbeans不能使用调试功能Qtomcat shutdown出现拒绝链接Qconnection refusedQ提C?/title><link>http://www.tkk7.com/jhyan/archive/2009/06/18/282969.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Thu, 18 Jun 2009 00:56:00 GMT</pubDate><guid>http://www.tkk7.com/jhyan/archive/2009/06/18/282969.html</guid><wfw:comment>http://www.tkk7.com/jhyan/comments/282969.html</wfw:comment><comments>http://www.tkk7.com/jhyan/archive/2009/06/18/282969.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/jhyan/comments/commentRss/282969.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jhyan/services/trackbacks/282969.html</trackback:ping><description><![CDATA[<br /> <br /> 安装了fedora11 和netbeans 6.7rc2后,发现不能使用调试功能Q提C拒l链接;<br /> <br /> 同样Q启动tomcat后可以正常访问web应用Q但停止tomcat时却提示拒绝链接Q提CZ息如下:(x)<br /> <br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080;"> 1</span> <span style="color: #000000;">2009</span><span style="color: #000000;">-</span><span style="color: #000000;">6</span><span style="color: #000000;">-</span><span style="color: #000000;">17</span><span style="color: #000000;"> </span><span style="color: #000000;">9</span><span style="color: #000000;">:</span><span style="color: #000000;">53</span><span style="color: #000000;">:</span><span style="color: #000000;">03</span><span style="color: #000000;"> org.apache.catalina.connector.Connector pause<br /> </span><span style="color: #008080;"> 2</span> <span style="color: #000000;">严重: Protocol handler pause failed<br /> </span><span style="color: #008080;"> 3</span> <span style="color: #000000;">java.net.ConnectException: Connection refused<br /> </span><span style="color: #008080;"> 4</span> <span style="color: #000000;">    at java.net.PlainSocketImpl.socketConnect(Native Method)<br /> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;">    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:</span><span style="color: #000000;">333</span><span style="color: #000000;">)<br /> </span><span style="color: #008080;"> 6</span> <span style="color: #000000;">    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:</span><span style="color: #000000;">195</span><span style="color: #000000;">)<br /> </span><span style="color: #008080;"> 7</span> <span style="color: #000000;">    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:</span><span style="color: #000000;">182</span><span style="color: #000000;">)<br /> </span><span style="color: #008080;"> 8</span> <span style="color: #000000;">    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:</span><span style="color: #000000;">366</span><span style="color: #000000;">)<br /> </span><span style="color: #008080;"> 9</span> <span style="color: #000000;">    at java.net.Socket.connect(Socket.java:</span><span style="color: #000000;">519</span><span style="color: #000000;">)<br /> </span><span style="color: #008080;">10</span> <span style="color: #000000;">    at java.net.Socket.connect(Socket.java:</span><span style="color: #000000;">469</span><span style="color: #000000;">)</span></div> 上述问题都是同一原因造成的?br /> <br /> <br /> l过调试tomcat发现Qtomcat在停止的时候链接的是E计算机名Q?009Q;而我的计机名称是Eylhome.comQ,׃我没有在hosts里面配置Qylhome.comQ,D被解析成了外|地址Q?5.125.148.76Q,所以tomcat在停止时候无法链接该地址?009端口?br /> <br /> <br /> 我修改hosts使得计算机名映射?27.0.0.1后,netbeans调试功能和tomcat的停止都正常了?br /> <br /> 当然大家也可以把计算机名字修改ؓ(f)localhost,该名UC般会(x)自动加入hosts的?br /> <br /> <br /> <br /> <br /> <img src ="http://www.tkk7.com/jhyan/aggbug/282969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jhyan/" target="_blank">Joshua Yan</a> 2009-06-18 08:56 <a href="http://www.tkk7.com/jhyan/archive/2009/06/18/282969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下安装VPN客户?/title><link>http://www.tkk7.com/jhyan/archive/2009/04/26/267553.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Sun, 26 Apr 2009 04:21:00 GMT</pubDate><guid>http://www.tkk7.com/jhyan/archive/2009/04/26/267553.html</guid><wfw:comment>http://www.tkk7.com/jhyan/comments/267553.html</wfw:comment><comments>http://www.tkk7.com/jhyan/archive/2009/04/26/267553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jhyan/comments/commentRss/267553.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jhyan/services/trackbacks/267553.html</trackback:ping><description><![CDATA[<br /> <br /> 1. 安装 pptp,pptpconfig<br /> <br /> 命o(h)Q?br /> <br /> Qyum install pptp<br /> <br /> # rpm -Uvh <a target="_blank">http://pptpclient.sourceforge.net/yum/stable/fc6/pptp-release-current.noarch.rpm</a><br /> # yum --enablerepo=pptp-stable install pptpconfig<br /> <br /> 2.<br />  启动pptp config<br /> <br /> 在第2个标{N里面的routing style,默认所client to LAN?br /> <br /> 实现到内|的q接可以选择如下两种方式Q?br /> <br /> a. 单的做法:把routing style 讄为all to tunnel<br /> b.routing style 为默认,droutes<br /> <br />     点击 “Edit Network Routes...”Q添加routes?br />         比如公司内网?92.168.1.0/24<br />         添?92.168.1.0/24,下面的name无所谓了Q?br />         ok之后点startp动进行连接了Q连接后卛_从本问到公司内网<br /> <br /> <br /> <img src ="http://www.tkk7.com/jhyan/aggbug/267553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jhyan/" target="_blank">Joshua Yan</a> 2009-04-26 12:21 <a href="http://www.tkk7.com/jhyan/archive/2009/04/26/267553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>值得思考的问题http://www.tkk7.com/jhyan/archive/2009/03/25/261854.htmlJoshua YanJoshua YanWed, 25 Mar 2009 06:25:00 GMThttp://www.tkk7.com/jhyan/archive/2009/03/25/261854.htmlhttp://www.tkk7.com/jhyan/comments/261854.htmlhttp://www.tkk7.com/jhyan/archive/2009/03/25/261854.html#Feedback0http://www.tkk7.com/jhyan/comments/commentRss/261854.htmlhttp://www.tkk7.com/jhyan/services/trackbacks/261854.html
在jdon上看了一个帖子,感受颇深Q有一U?#8220;一语惊醒梦中h”的感觉?br />
我们Z么选择springQ或者其他框ӞQؓ(f)什么出CIOC,AOP,ORM{等Q简单回{是“解决问题”Q但他们解决不同的问题?br />
需要l思考一下,希望能有所“H破”

参考urlQhttp://www.jdon.com/jivejdon/thread/35373.html


防止断链Q{载如下:(x)

转蝲内容
一晃眼搞了7?q的企业应用理和研IӞ各种技术、思想L覆去折腾了很久,最qȝ是有Ҏ(gu)拨云见目的感觉了Q于是放出点大标题和各位道?br />
主要观点其实在一q半前,已经在jdon首发的文?#8220;坚持发扬EJB、Spring的光辉思想Q将lg化进行到底!”(可参 http://www.jdon.com/jivejdon/thread/31834.html)q行q论q。当时虽然观Ҏ(gu)较激烈,然实际上W者领(zhn)得不够深刻Q故有后面一q多的RoR和PHP之实c(din)随着旉的推U,与各相关?上领导、企业领对{用戗开发商ȝ、设计h员、开发h员、维护h员等{?的更多观Ҏ(gu)触,让我逐渐深入领?zhn)了Java?a id="id_http://www.jdon.com/dl/best/spring.htm" class="hotkeys ajax_query=Spring" _counted="undefined" ajaxid="query=Spring" framewidth="350" frameheight="undefined" _eventid="26">Spring所蕴含的开发哲学和思想Q于是又有此文?br /> (上文刚刚收到blogQ由于是老文Q不再发布了Q仅作ؓ(f)整理收录)

如果_(d)每种~程语言和技术都有自q目标和归宿和话,那么单来_(d)JavaEE和后来的Spring是ؓ(f)企业应用而生的。他们诞生的基本目标Q正是ؓ(f)了解军_C业应用多q的各种复杂问题。故而他们能够达到现在的领导CQƈ一直gl下厅R?br />
世间各种事业Q都应该?#8220;l一规划Q分步实?#8221;。放C息工E来_(d)是“自顶向下设计Q自底向上实?#8221;。道理谁都明白,可现实当中执行下来,L要走栗问题就在于Q这二者该如何l合Q于是实际项目中Q企业用戗分析师、设计师、程序员、维护h员L不欢而散Q最后往往各行其事Q一盘散乱。上层的L抱怨下层在“乱搞”Q而下层则嘲笑上层只会(x)“I”。结果往往是早已扔q档案袋的系l方案和图表Q一堆各U公司、各U程序的“pȝ”Q蒙头蒙脑瞎忙的l护人员?br />
那ؓ(f)什么结合不了?因ؓ(f)大家没有“共同语言”。开初UML跛_来了Q分析师讲得头头是道Q程序员看得心烦意ؕQ用h是云山雾水。于是连MF都有点烦了,q脆推v了RoR。这乍东西一看太理想了。几乎是分析员可以直接实现程序,而程序员也可以直接分析了。可惜世间难有完的事物QRoRq种q于“ 霔R”的东西也许还是有问题的。前有foxproQ后有VB、PBQ也许是W者L心有余?zhn)Q对q种q于“完美”的东西还是先放一攑֐?br />
那是不是_(d)大家真的不可能有“共同语言”Q笔者以为,有,但要折衷(又闻C实用中庸M的味道了?。如题,OO、DI、AOP、TDD和Refector正是当前的解决之道?br />
OO是根本,可以作ؓ(f)基本?#8220;共同语言”。图表不必要像UML那么复杂Q否则最后除了分析师谁都不会(x)看。只需要简单徏上模型,标上属性和接口功能Q最多连几根U说明相互关p,q样大家都懂(也就是说Q这个类是个什么东西,有什么属性,要实C什么功?。这U东西既可做pȝ说明书,也可以给开发h员,甚至生成Doc做维护文档?br /> 大家要说q不?#8220;I”吗?要的是I(好比不识字的老百姓也?x)谈d问题)Q就是只?#8220;有什?#8221;?#8220;做什?#8221;Q这h能有p。但q种“I”其实最难最Ҏ(gu)Q因“p”。有了共识之后就可以下一步了?br />
下一步是实现。这个阶D,分层、DI、AOP可以大展本领了。Spring行那会(x)Q大家是a必DI?a id="id_http://www.jdon.com/jivejdon/key/aop" class="hotkeys ajax_query=AOP" _counted="undefined" ajaxid="query=AOP" framewidth="350" frameheight="undefined" _eventid="28">AOP。可惜风头一q,现在RoR?Seam时尚q代Q很多h大概忘了七七八八。其实笔者现在看来,分层、DI?a id="id_http://www.jdon.com/jivejdon/key/aop" class="hotkeys ajax_query=AOP" _counted="undefined" ajaxid="query=AOP" framewidth="350" frameheight="undefined" _eventid="30">AOPOO之后最重要的思想Q它们的核心在于“接口和实现分?#8221;。这样一来,可以把“做什?#8221;?#8220;怎么?#8221;分家Q这才是它们的伟大之处。大家天天把“高内聚、低耦合”挂在嘴边Q各搞一套,׃八糟。J2EE太复杂,大家觉得用不上。好不容易Rod推行了用得上的标准方法,大家本可以有“共同语言”了。可惜h之天生的惰性又把我们推回到“一体化”的惔潭,一代代E序员和pȝp么不了了之了?br />
OOq是要坚持,它是当前信息世界和现实世界实现映的最好方法。DI?a id="id_http://www.jdon.com/jivejdon/key/aop" class="hotkeys ajax_query=AOP" _counted="undefined" ajaxid="query=AOP" framewidth="350" frameheight="undefined" _eventid="32">AOP也是要坚持,只有q样才能屏蔽掉具体实现技术疯狂变化的信息世界。坚?a id="id_http://www.jdon.com/jivejdon/query/searchThreadAction.shtml?query=%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1&view=on" class="hotkeys ajax_query=OO" _counted="undefined" ajaxid="query=OO" framewidth="350" frameheight="undefined" _eventid="33">OOQ我们才能不受数据存储方式变化的困扰Q坚持分层、ID、AOPQ我们才能明地分工合作Q摆ql规模和事务要求变化所带来的烦恹{?br />
最后还有TDD和RefactorQ业务在变,pȝ在变Q我们的技术也在变。一定要能测试和重构Q要能很好地试和重构,否则pȝ必被变化所毁。要惌够很好地试和重构,如果你的pȝ没有OO、分层、DI、AOPQ大家是否真可以充满底气地回{?#8220;?#8221;。在q一个问题上QJava是最令我攑ֿ的伙_(d)?a id="id_http://www.jdon.com/dl/best/spring.htm" class="hotkeys ajax_query=Spring" _counted="undefined" ajaxid="query=Spring" framewidth="350" frameheight="undefined" _eventid="35">Spring更L带来惊喜?br />
DDD(领域驱动设计)是一个好的设惻I而如今像Springq类的标准化框架则可以把q个设想变ؓ(f)现实。在q个设想里,理人员、分析师和用户定义模型功能要求,架构师根据要求选择技术方案,不同的程序员(有做dao的、做service的、做view?Ҏ(gu)接口要求实现代码Q通过试后提交。而因为有支持分层、DI、AOP的框架存?比如?a id="id_http://www.jdon.com/dl/best/spring.htm" class="hotkeys ajax_query=Spring" _counted="undefined" ajaxid="query=Spring" framewidth="350" frameheight="undefined" _eventid="37">Spring)Q布|h员就可以单地把他们组装在一赗?br /> 面对不断的需求变化,分析师仍然只需增加/变动模型和功能接口,试人员和编Eh员按作相应变化即可?br /> M设计、分步实施、按需定制、分工合作、无~组装,q种工业标准化的软g开发方式才是企业应用的{案。?a id="id_http://www.jdon.com/jivejdon/query/searchThreadAction.shtml?query=%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1&view=on" class="hotkeys ajax_query=OO" _counted="undefined" ajaxid="query=OO" framewidth="350" frameheight="undefined" _eventid="38">OO、分层、ID、AOP、TDD和Refactor是真正支撑这个开发方式的支柱。以q样的方式,DDD?x)真正成为现实?br />

信息发达国家的Y件业其实很大E度上已l实践了q种开发方?x那些大规模的外包?。这些年国内搞Java的,张嘴闭口便是SSH。可惜很多h搞了一些年后,q是“不识庐山真面?#8221;Q成天抱?#8220;好烦”。在q样燥的业环境下Q国内大多数企业应用的质量是低劣的?br /> 即你天天在写Java、天天在?a id="id_http://www.jdon.com/dl/best/spring.htm" class="hotkeys ajax_query=Spring" _counted="undefined" ajaxid="query=Spring" framewidth="350" frameheight="undefined" _eventid="39">SpringQ如果不能够“知其所以然”Q那么你的SSH注定是偷工减料的豆腐渣。所以在此劝怽从事企业应用的同道,好好静下心来Q认真思考一下你的应用所面对的各U问题,再好好思考一?a id="id_http://www.jdon.com/jivejdon/query/searchThreadAction.shtml?query=%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1&view=on" class="hotkeys ajax_query=OO" _counted="undefined" ajaxid="query=OO" framewidth="350" frameheight="undefined" _eventid="40">OO、DI、AOP、TDD和Refatorl你带来的福韟?br />
愿大家的pȝ质量都能更上一层楼Q这h可变恶性竞争ؓ(f)良性合作,让我国的信息pȝ发挥更大更好的作用?




Joshua Yan 2009-03-25 14:25 发表评论
]]>
tuscany学习(fn)W记一Qjavalg实现中服务定义与解析Q?/title><link>http://www.tkk7.com/jhyan/archive/2008/12/20/247521.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Sat, 20 Dec 2008 10:01:00 GMT</pubDate><guid>http://www.tkk7.com/jhyan/archive/2008/12/20/247521.html</guid><wfw:comment>http://www.tkk7.com/jhyan/comments/247521.html</wfw:comment><comments>http://www.tkk7.com/jhyan/archive/2008/12/20/247521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jhyan/comments/commentRss/247521.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jhyan/services/trackbacks/247521.html</trackback:ping><description><![CDATA[在学?fn)tuscany到过E遇C个疑问(javalg实现是如何解析javacL件中的服务的Q如果没有配|服务,默认服务应该是什么?Q,开始的时候一直无法想清楚Q通过阅读源码l于了解了部分解析过E?br /> <br /> 以tuscany中的CalculatorZ说明服务的定义:(x)<br /> <br /> 1.  如果按照例子本n的代码和配置Q我们应该如何获取服务呢Q?br /> <br /> <br /> <span style="color: #000000;">CalculatorService实现代码</span><br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> calculator;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.osoa.sca.annotations.Reference;<br /> <br /> <br /> </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />  * An implementation of the Calculator service.<br />  </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CalculatorServiceImpl </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> CalculatorService {<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> AddService addService;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SubtractService subtractService;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> MultiplyService multiplyService;<br /> 。。。。。。。。。。。。?br /> </span></div> <br /> 配置Q?br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;"><</span><span style="color: #800000;">component </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="CalculatorServiceComponent"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />         </span><span style="color: #0000ff;"><</span><span style="color: #800000;">implementation</span><span style="color: #ff0000;">.java class</span><span style="color: #0000ff;">="calculator.CalculatorServiceImpl"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />         </span><span style="color: #0000ff;"><</span><span style="color: #800000;">reference </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="addService"</span><span style="color: #ff0000;"> target</span><span style="color: #0000ff;">="AddServiceComponent"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />         </span><span style="color: #0000ff;"><</span><span style="color: #800000;">reference </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="subtractService"</span><span style="color: #ff0000;"> target</span><span style="color: #0000ff;">="SubtractServiceComponent"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />         </span><span style="color: #0000ff;"><</span><span style="color: #800000;">reference </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="multiplyService"</span><span style="color: #ff0000;"> target</span><span style="color: #0000ff;">="MultiplyServiceComponent"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />         </span><span style="color: #0000ff;"><</span><span style="color: #800000;">reference </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="divideService"</span><span style="color: #ff0000;"> target</span><span style="color: #0000ff;">="DivideServiceComponent"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"></</span><span style="color: #800000;">component</span><span style="color: #0000ff;">></span></div> <br />   a. 例子中获取服务的Ҏ(gu)Q?br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">CalculatorService calculatorService </span><span style="color: #000000;">=</span><span style="color: #000000;"> <br />             scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div> <br /> 通过上述代码我们可以获取相应的服务了,我们不仅要问Qؓ(f)什么能够获取相应的服务呢?<br /> <span style="color: red;"><br /> Ҏ(gu)javalg实现规范说明Q如果组件只包含一个服务,那么我们在获取服务的时候可以省略服务的名字?/span><br /> <br /> <span style="font-size: 18pt;"><span style="color: red;">我的问题是:(x)省略的服务名字是什么?</span></span><br /> <br /> <br /> b. 完整获取服务的方法:(x)<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">CalculatorService calculatorService1 </span><span style="color: #000000;">=</span><span style="color: #000000;">scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent/CalculatorServiceImpl</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div> <br /> 大家通过比较?yu)可以知道,其实省略?span style="color: red;"><span style="color: #060000;">服务名字?/span> CalculatorServiceImpl</span><br /> <br /> Z么是q个名字Q大家可以参考源码中?<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">if</span><span style="color: #000000;"> (services.isEmpty()) {<br />        </span><span style="color: #008000;">//</span><span style="color: #008000;"> class is the interface</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">       addService(type, clazz);<br />     }</span></div> <br /> <br /> 2. 自己定义一个服?br /> <br /> 自己在实Cd服务声明<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080;">1</span> <span style="color: #000000;">@Service(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br /> </span><span style="color: #008080;">2</span> <span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CalculatorServiceImpl </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> CalculatorService {<br /> </span><span style="color: #008080;">3</span> <span style="color: #000000;"><br /> </span><span style="color: #008080;">4</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> AddService addService;<br /> </span><span style="color: #008080;">5</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SubtractService subtractService;<br /> </span><span style="color: #008080;">6</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> MultiplyService multiplyService;<br /> </span><span style="color: #008080;">7</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> DivideService divideService;<br /> 。。。。。?br /> </span></div> <br /> <br /> 我们可以通过如下方式获取服务Q?br /> <br /> a. 例子中的方式<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">CalculatorService calculatorService </span><span style="color: #000000;">=</span><span style="color: #000000;"> <br />             scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div> <br /> b. 完整方式<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">CalculatorService calculatorService1 </span><span style="color: #000000;">=</span><span style="color: #000000;">scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent/CalculatorService</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div> <br /> <span style="color: #ff0000;">我们通过如下方式?span style="font-size: 24pt;">Q不能*</span>获取服务?/span><br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">CalculatorService calculatorService1 </span><span style="color: #000000;">=</span><span style="color: #000000;">scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent/CalculatorServiceImpl</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div> <br /> <br /> 原因很简单,实现不会(x)再添加默认服务(<span style="color: #000000;">CalculatorServiceImpl</span>Q了<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 源码摘录如下Q?br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080;"> 1</span> <span style="color: #000000;">org.apache.tuscany.sca.implementation.java.introspect.impl.HeuristicPojoProcessor<br /> </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"><br /> </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"><br /> </span><span style="color: #008080;"> 4</span> <span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #000000;"><</span><span style="color: #000000;">T</span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> visitEnd(Class</span><span style="color: #000000;"><</span><span style="color: #000000;">T</span><span style="color: #000000;">></span><span style="color: #000000;"> clazz, JavaImplementation type) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> IntrospectionException {<br /> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;">        List</span><span style="color: #000000;"><</span><span style="color: #000000;">org.apache.tuscany.sca.assembly.Service</span><span style="color: #000000;">></span><span style="color: #000000;"> services </span><span style="color: #000000;">=</span><span style="color: #000000;"> type.getServices();<br /> </span><span style="color: #008080;"> 6</span> <span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (services.isEmpty()) {<br /> </span><span style="color: #008080;"> 7</span> <span style="color: #000000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;"> heuristically determine the service</span><span style="color: #008000;"><br /> </span><span style="color: #008080;"> 8</span> <span style="color: #000000;">            </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br /> </span><span style="color: #008080;"> 9</span> <span style="color: #008000;">             * The following is quoted from Java Specification 1.2.1.3. Introspecting services offered by a Java implementation<br /> </span><span style="color: #008080;">10</span> <span style="color: #008000;">             * In the cases described below, the services offered by a Java implementation class may be determined<br /> </span><span style="color: #008080;">11</span> <span style="color: #008000;">             * through introspection, eliding the need to specify them using @Service. The following algorithm is used <br /> </span><span style="color: #008080;">12</span> <span style="color: #008000;">             * to determine how services are introspected from an implementation class:<br /> </span><span style="color: #008080;">13</span> <span style="color: #008000;">             * <br /> </span><span style="color: #008080;">14</span> <span style="color: #008000;">             * If the interfaces of the SCA services are not specified with the @Service annotation on the <br /> </span><span style="color: #008080;">15</span> <span style="color: #008000;">             * implementation class, it is assumed that all implemented interfaces that have been annotated <br /> </span><span style="color: #008080;">16</span> <span style="color: #008000;">             * as @Remotable are the service interfaces provided by the component. If none of the implemented <br /> </span><span style="color: #008080;">17</span> <span style="color: #008000;">             * interfaces is remotable, then by default the implementation offers a single service whose type <br /> </span><span style="color: #008080;">18</span> <span style="color: #008000;">             * is the implementation class.<br /> </span><span style="color: #008080;">19</span> <span style="color: #008000;">             </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /> </span><span style="color: #008080;">20</span> <span style="color: #000000;">            Set</span><span style="color: #000000;"><</span><span style="color: #000000;">Class</span><span style="color: #000000;">></span><span style="color: #000000;"> interfaces </span><span style="color: #000000;">=</span><span style="color: #000000;"> getAllInterfaces(clazz);<br /> </span><span style="color: #008080;">21</span> <span style="color: #000000;">            </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (Class</span><span style="color: #000000;"><?></span><span style="color: #000000;"> i : interfaces) {<br /> </span><span style="color: #008080;">22</span> <span style="color: #000000;">                </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (i.isAnnotationPresent(Remotable.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">) </span><span style="color: #000000;">||</span><span style="color: #000000;"> i.isAnnotationPresent(WebService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)) {<br /> </span><span style="color: #008080;">23</span> <span style="color: #000000;">                    addService(type, i);<br /> </span><span style="color: #008080;">24</span> <span style="color: #000000;">                }<br /> </span><span style="color: #008080;">25</span> <span style="color: #000000;">            }<br /> </span><span style="color: #008080;">26</span> <span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (services.isEmpty()) {<br /> </span><span style="color: #008080;">27</span> <span style="color: #000000;">                </span><span style="color: #008000;">//</span><span style="color: #008000;"> class is the interface</span><span style="color: #008000;"><br /> </span><span style="color: #008080;">28</span> <span style="color: #000000;">                addService(type, clazz);<br /> </span><span style="color: #008080;">29</span> <span style="color: #000000;">            }<br /> </span><span style="color: #008080;">30</span> <span style="color: #000000;">        }<br /> </span><span style="color: #008080;">31</span> <span style="color: #000000;">        Set</span><span style="color: #000000;"><</span><span style="color: #000000;">Method</span><span style="color: #000000;">></span><span style="color: #000000;"> methods </span><span style="color: #000000;">=</span><span style="color: #000000;"> getAllUniquePublicProtectedMethods(clazz, </span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br /> </span><span style="color: #008080;">32</span> <span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">type.getReferenceMembers().isEmpty() </span><span style="color: #000000;">||</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #000000;">type.getPropertyMembers().isEmpty()) {<br /> </span><span style="color: #008080;">33</span> <span style="color: #000000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;"> references and properties have been explicitly defined<br /> </span><span style="color: #008080;">34</span> <span style="color: #008000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;">            if (type.getServices().isEmpty()) {<br /> </span><span style="color: #008080;">35</span> <span style="color: #008000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;">                calculateServiceInterface(clazz, type, methods);<br /> </span><span style="color: #008080;">36</span> <span style="color: #008000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;">                if (type.getServices().isEmpty()) {<br /> </span><span style="color: #008080;">37</span> <span style="color: #008000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;">                    throw new ServiceTypeNotFoundException(clazz.getName());<br /> </span><span style="color: #008080;">38</span> <span style="color: #008000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;">                }<br /> </span><span style="color: #008080;">39</span> <span style="color: #008000;">            </span><span style="color: #008000;">//</span><span style="color: #008000;">            }</span><span style="color: #008000;"><br /> </span><span style="color: #008080;">40</span> <span style="color: #000000;">            evaluateConstructor(type, clazz);<br /> </span><span style="color: #008080;">41</span> <span style="color: #000000;">            </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br /> </span><span style="color: #008080;">42</span> <span style="color: #000000;">        }<br /> </span><span style="color: #008080;">43</span> <span style="color: #000000;">        calcPropRefs(methods, services, type, clazz);<br /> </span><span style="color: #008080;">44</span> <span style="color: #000000;">        evaluateConstructor(type, clazz);<br /> </span><span style="color: #008080;">45</span> <span style="color: #000000;">    }<br /> </span><span style="color: #008080;">46</span> </div> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <img src ="http://www.tkk7.com/jhyan/aggbug/247521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jhyan/" target="_blank">Joshua Yan</a> 2008-12-20 18:01 <a href="http://www.tkk7.com/jhyan/archive/2008/12/20/247521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HP中国区总裁的退休感a Q{载) http://www.tkk7.com/jhyan/archive/2008/12/02/243902.htmlJoshua YanJoshua YanTue, 02 Dec 2008 04:58:00 GMThttp://www.tkk7.com/jhyan/archive/2008/12/02/243902.htmlhttp://www.tkk7.com/jhyan/comments/243902.htmlhttp://www.tkk7.com/jhyan/archive/2008/12/02/243902.html#Feedback0http://www.tkk7.com/jhyan/comments/commentRss/243902.htmlhttp://www.tkk7.com/jhyan/services/trackbacks/243902.html转蝲自:(x)http://www.loveayang.com.cn/post/2008/09/HPe4b8ade59bbde58cbae680bbe8a381e79a84e98080e4bc91e6849fe8a880-efbc88ZTefbc89.aspx


一、工作与生活

我有个有的观察Q外企公司多的是25--35岁的白领Q?0岁以上的员工? 。二三十岁的外企员工是意气风发的Q但外企公司40岁附q的l理人是很尴的。我见过?0岁附q的外企l理人大多在一直蟩槽,最后大多蟩到民企——比 方说唐骏。外企员工的成功很大E度上是公司的成功,q个h的成功。西门子的确比国大Q但q不代表襉K子中国经理比国美的老板强,甚至可以说差得很q? 而进外企的h往往q不能很早理解这一点,把自q成功90Q归功于自己的能力。实际上Q外企公叔R便换个中国区ȝ理ƈ不会(x)l业l带来什么了不v的媄(jing)响? 好了Q问题来了。当q些l理?0多岁了,他们的薪资要求变得很高,而他们的才能其实又不是那么出众,作ؓ(f)外企公司的老板Q你?x)怎么选择Q有的是只要不高 薪水的,要出位的_明强干、精力冲沛的q轻人——有的是Qؓ(f)什么还要用你?
从上面这个例子,其实可以看到我们的工作轨qV二三十岁的时候,生活? 压力q比较小Qn体还比较好。上面的父母w体q好Q下面又没有孩子Q不用还房贷Q也没有孩子要上大学Q当个外企小白领q是很光鲜的Q挣得不多也够花了。但 是hl归要结婚生子,l归?x)老。到?0岁,父母老了Q要看病要吃药,要有人看护,自己要还房贷Q要q基本体面的生活Q要d?#8230;…那个时候需要挣多少? 才够花才重要。所以,看待工作Q眼光要放远一点,一时的谁高谁低q不能说明什么?br /> 从这个角度上来说Q我不太赞成q于xW一份工作的薪水Q更没有 必要攀比第一份工作的薪水Q这在刚刚出校园的学生中间是很常见的。正思h大概要工?5q_(d)q好比是一场马拉松比赛。和真正的马拉松比赛不同的是Q这ơ比 赛没有职业选手Q每个h都只有一ơ机?x)。要知道Q有很多人甚臛_持不到终点,大多Ch最后是走到l点的,只有数人是跑过l点的。因此在刚开始的时候,? 抢领先的位置q没有太大的意义。刚q社?x)的时候如果进500强公司,大概能拿?k-6k/月的工资Q有些特别技术的人才可能可以?k/月。可问题 是,5q以后拿多少Q估?k-10k了不起了。v点虽焉Q但增幅有限Q而且后面的年Mhq赶的压力越来越大?br /> 我前两天问我的一个销售,你会(x)的这些东西一个新?q就都学?x)了Q但Ch所要求的薪水却只是你的一半,到时候你怎么办?
? 业生涯就像一Z育比赛,有初赛、复赛、决赛。初赛的时候大安刚刚q社?x),大多数都是实力一般的人。这时候努力一炏V认真一点很快就能让颖而出Q于 是有的h二十多岁做了l理Q有的hq些也终于赢得了初赛Q三十多岁成了经理。然后是复赛Q能参加复赛的都是赢得初赛的。每个h都有些能耐,在聪明才Z? 不成问题Q这个时候再惌胜出׃那么Ҏ(gu)了,单靠一点点努力和认真还不够Q要有很强的坚忍_Q要懂得靠团队的力量Q要懂得收服人心Q要有长q的? ?#8230;…
看上去赢得复赛ƈ不容易,但还不是那么难。因个世界的规律是lh一Ҏ(gu)功的同时让h?jing)傲自满Q刚刚赢得初赛的人往往不知道自p得的 仅仅是初赛,有了一点小的成W大多Ch都会(x)?jing)傲自满hQ认己已l懂得了全部Q不需要再努力再学?fn)了Q他们会(x)认ؓ(f)之所以不能再q一步已l不是自q 原因了。虽然他们仍然不好对付,但是他们没有耐性,没有容h的度量,更没有清晰长q的目光。就像一只愤怒的斗牛Q虽然猛烈,最l是?x)|的。而赢得复赛的? 则象斗牛士一P不急不w,跟随着自己的节拍,慢慢耗尽Ҏ(gu)的耐心和体力。赢得了复赛以后Q大U已l是一位很了不L(fng)职业l理ZQ当上了中小公司的ȝ 理,大公司的副ȝ理,ȝ着每年几千万乃臛_亿的生意?br /> 最l的册来了。说实话我自己都q没有赢得决赛,因此对于册的决胜因素也只能凭自q 猜测而已。这个时候的输赢或许像武侠说里写得那P大家都是高手Q只能等待对方犯错了。要惌易击败对手是不可能的Q除了上浑w解敎ͼq需要一点运 气和旉。世界的规律依然发挥着作用Q赢得复赛的人已l不只是?jing)傲自满了,他们往往刚愎自用Q听不进d人的话,有些人的脾气变得暴躁Q心情变得Qw,w? 体变得糟p,他们最大的敌h是他们自己。在册中要做的只是不被自己击|Q等着别h被自己击败。这和体育比赛是一L(fng)Q最后高手之间的比赛Q就看谁p 谁p得了册?br />

二?Ҏ(gu)
你工作快乐么Q你的工作好么?
? 没有觉得q了一D|间以后工作很不开心?有没有觉得自己入错了行?有没有觉得自己没有得到应有的待遇Q有没有觉得工作像一团ؕL天上班都是一U痛苦?? 没有很想换个工作Q有没有觉得其实现在的公司ƈ没有当初惌得那么好Q有没有觉得q䆾工作是当初因为生存压力而找的,实在不适合自己Q你从工作中得到你想 要得到的了么Q你每天开心么Q?br /> 天上愤怒的人很多,你有没有惌Q你Z么不快乐Q你Z么愤怒?
其实Q你不快乐的Ҏ(gu)Q是因ؓ(f)你不知道要什么!你不知道要什么,所以你不知道去q求什么,你不知道q求什么,所以你什么也得不到?br /> ? 总觉得,职业生首先要关注的是自己,自己惌什么。大多数人大概没惌q个问题Q唯一的想法只是我惌一份工作,我想要一份不错的薪水。我知道所有h? 于薪水的渴望Q可是你x隔几q重来一ơ找工作的过E么Q你xq都在这U对于工作和薪水的焦急不安中度过么?不想的话Q就好好x楚。饮鸩止_(d)不能? 为口渴就拼命喝毒药。越是焦急,是觉得自己需要一份工作,饥不择食。越想不清楚Q越Ҏ(gu)p|Q你的经历越来越差,下一份工作的人看着你的历就q 头。于是你喝(f)Q越渴越喝,陷入恶性@环。最l只能哀叹世事不公或者生不逢时Q只能到天上来发泄一把,在失败者的共鸣当中L一点心理^衡Ş了。大 多数人都有生存压力,我也是。有生存压力׃(x)有很多焦虑,U极的h?x)从焦虑中得到动力,而消极的人则?x)因为焦虑而迷失方向。所有h都必d压力下做出? 择,q就是世道——你喜欢也Ş不喜Ƣ也|?br /> 一般我们处理的事情分ؓ(f)重要的事情和紧急的事情Q如果不做重要的事情׃(x)常常d紧急的事情。比如锻? w体保持健康是重要的事情Q而看病则是紧急的事情。如果不ȝw体保持健康Q就?x)常ؓ(f)了病痛烦恹{又比如防火是重要的事情Q而救火是紧急的事情Q如果不 注意防火Q就要常常救火。找工作也是如此Q想好自q竟要什么是重要的事情,扑ַ作是紧急的事情Q如果不惛_Q就?x)常常要扑ַ作。往往紧急的事情lh的压 力比较大Q迫使h们去赶紧做。相Ҏ(gu)说重要的事情反而没有那么大的压力,大多Ch做事情都是以压力为导向的。压力之下,总觉得非要先做紧急的事情Q结果就 是永q到处救火,永远没有停歇的时候——很多h的工作也像是救火队一样忙痛苦,也是因ؓ(f)工作中没有做好重要的事情——那些说自己zd水深火热Z生存? 不上那么多的朋友Q今天找工作困难是当初你们没有做重要的事情,是结果不是原因。如果今天你们还是因为急于要找一份工作而不L考,那么或许来要l承 受痛苦找工作的结果?br /> 我始l觉得我要说的话题沉重了点,需要很多思考,q比唐笑打武警的话题来的枯燥乏味。但是,天下没有L的成功。成功,要付代h(hun)。请先忘C切的生存压力Q想惌辈子你最惌的是什么?所以,最要紧的事情,先想好自己想要什么?br /> 三、什么是好工?/strong>
? 初微软有个唐骏,很多大学里的q轻得这才是他们向往的职业生涯。我在清华BBS里发的帖子被q些学子们所不屑Q那个时候学生们只想出国或者去外企。不 q如今看来,我还是对的。唐骏去了盛大,陈天桥创立的盛大Q一家民营公司。一个高学历的v归在500强的公司里拿高薪_(d)q大U是很多q轻人的梦想。问? 是,每年毕业的大学生都在做这个梦Q好的职位却只有500个?br /> 人都是要面子的,也是喜欢攀比的Q即使在工作上也喜欢攀比,不管那是不是自己惌 的。大家认为外企公司很好,可是好在哪里呢?好吧Q他们在比较好的写字|q是你想要的么?他们出差住比较好的酒店,q是你想要的么?别h?x)M慕一份外? 公司的工作,q是你想要的么?那一切都是给别h看的Q你q嘛要活得那么辛苦给别h看?Q!另一斚wQ他们薪水福利一般,q没有特别了不vQ他们的晋升Z(x) 比较?yu),很难做到很高阶的ȝQ他们虽然厌恶常常加班,却不敢不加班Q因?#8220;你不q有得是人干”Q大部分情况下会(x)找个台湾?香港?新加坡h来管你,? q些人又往往有些莫名其妙的优感。你x楚了么,500Z定好么?扑ַ作究竟是考虑你想要什么,q是考虑别h想看什么?
我的大学同学们大多数 都到国了,甚至毕业q么多年了,q有人最q到国外M。出国真的有那么好么Q我的大学同学们大多数还是在博士、博士后、访问学者地边缘挣扎着Q至今只? 一个正l在一个美国大学里拿到个正式的教职。国内的教授很难当么Q我有几个表亲也M国外了,他们的父母独自在国内Q没有h照顾Q有好几ơh亲在安昏? 都没人知道。出国,真的q么光彩么?像有h说的Q?#8220;很多事情像看A片,看的得很爽,做的人未必?#8221;
人L扑ֈ那个最好的Q可是,什么是最好的Q你觉得是最好的那个Q是因ؓ(f)你的了解,q是因ؓ(f)别h说它是最好的Q即使它对于别h是最好的Q对于你也一定是最好的么?
? 于自己想要什么,自己要最清楚Q别人的意见q不是那么重要。很多hL常常被别人的意见所影响Q亲戚的意见、朋友的意见、同事的意见……问题是,你究竟是 要过谁的一生?人的一生不是父母一生的l集Q也不是儿女一生的前传Q更不是朋友一生的外篇Q只有你自己对自q一生负责,别h无法也负不vq个责Q。自? 做的军_Q至到最后,自己没什么可后?zhn)的。对于大多数正常智力的h来说Q所做的军_没有大的寚wQ无论怎么L(fng)选择Q都是可以尝试的。比如你没有考入? ׃的那个学校,没有入现在这个行业,q辈子就q不下去了,׃(x)很失败?不见得?br /> 我想Q好工作应该是适合你的工作。具体点_(d)应该是能l你带来? 惌的东西的工作。你或许应该以此来衡量你的工作究竟好不好Q而不是拿公司的大、规模、外企还是国企、是不是有名、是不是上市公司来衡量。小公司未必? 是好公司Q赚钱多的工作也未必是好工作。你q是要先弄清楚你惌什么,如果你不清楚你想要什么,你就永远也不?x)找到好工作Q因Z永远只看C得不到的? 西,你得到的Q都是你不想要的?br /> 可能最好的已经在你的n边,只是你还没有学会(x)珍惜。h们L盯着得不到的东西Q而忽视了那些已经得到的东ѝ?br /> 四、普通h
? 发现中国人的励志和国外的励志存在非常大的不同。中国的励志比较鼓励人立下大志愿Q卧薪尝胆,有朝一日成富成c(din)而国外的励志比较鼓励人勇敢面对现实生 z,面对普通h的困境,虽然l果也是成富成贵Q但L(fng)不一栗相Ҏ(gu)_(d)我觉得后者在操作上更现实Q而前者则需要用999个失败者来堆砌一个成功者的? 事?br /> 我们都是普通h。普通h的意思就是,概率qg事是很准的。因此,我们不会(x)买彩中500万,我们不会(x)成ؓ(f)比尔·盖茨或者李嘉诚Q我们不?x)坐飞机掉下来,我们当中很少的h?x)创业成功,我们之中?0Q的Z(x)dQ我们之中大部分Z(x)z过65?#8230;…
所 以请你在惌p什么的时候,要得“现实”一炏V你说我惌做李嘉诚Q抱歉,我帮不上你。成为比?#183;盖茨或者李嘉诚q种人,是靠命的Q看我写的这文章绝 对不?x)让你成Z们——即使你成ؓ(f)了他们,也绝对不是我q篇文章的功功?#8220;王侯相宁有U乎”Q但真正当皇帝的只有一个hQ王侯将思h也不多。目标定得高 些对于喜Ƣ挑战的人来说有好处Q但对于大多数普通h来说Q反而比较容易灰心沮丧,很容易就攑ּ了?br /> 回过头来_(d)李嘉诚比你有钱大?0万倍,他比 你更快乐么?或许有。但有没有比你快?0万倍?一定没有。他比你最多也快乐一两倍,甚至有可能还不如你快乐。寻找自己想要的东西不是和别人比赛,比谁 要得更多、更高,比谁的目标更q大。虽然成为李嘉诚q个目标很宏大,但你q不见得?x)从q个目标以及(qing)q求目标的过E当中获得快乐,而且基本上你也做不到。你 必须听听你内心的声音Q寻扄正能够你获得快乐的东西Q那才是你想要的东西?br /> 你想要的东西Q或者我们把它称之ؓ(f)“目标”。目标其实ƈ没有高低? 分,你不需要因q目标没有别hq大而不好意思。达到自q目标其实是成功Q成功有大有,快乐却是一L(fng)。我们追逐成功,其实q逐的是成功带来的 快乐Q而非成功本n。职业生涯的道\上,我们常常?x)被攀比的心态蒙住眼睛,忘记了追求的I竟是什么,忘记了是什么能使我们更快乐?br /> C会(x)上一夜暴? 的新d多,q些消息M(x)在我们的心里面掀起很多涟漪。涟漪多了就变成惊涛骇浪Q心里的惊涛骇浪除了打翻承蝲你目标的船Qƈ不会(x)使得你也一夜暴富?#8220;? 见贼吃肉Q不见贼挨揍”。我们这些普通h既没有当“?#8221;的勇气,又缺乏当“?#8221;的狠辣、绝冟뀂虽然M?#8220;吃肉”Q却更害?#8220;挨揍”Q偶?dng)看到几个?#8220;挨揍 ”?#8220;?#8221;按奈不住,或者心思活动,或者大感不公,真要叫你d“?#8221;Q却也不敢?br /> 我还是过普通h的日子,要普通h的快乐,臛_晚上睡得着觉?

五、蟩槽与U篏
? 先要说明Q工作是一仉要理智的事情Q所以不要在工作上耍个性。天涯上或许?x)有得你很有个性而叫好,但煤气公司、电(sh)话公怸?x)因得你很有个性而免 了你的帐单。当你很帅地炒掉了你的老板Q当你很酷地挖苦了一番招聘的HRQ̎单还是要照付Q只是你赚钱的时间更了Q除了你自己Q没人受损失?br /> ? q不反对xQ但x决不是解决问题的办法Q而且频繁x的后果是让h觉得没有忠诚度可aQ而且不能安心工作。现在很多h从网上找工作Q很多找工作的网? 常常lhZ“馊主?#8221;。要知道他们是盈利性企业,当然要从自n盈利的角度来考虑Q大家越是频J蟩槽、频J找工作他们是生意兴隆Q所以鼓动h们蟩槽是? 们的工作。所以他们会(x)常常告诉你,你拿的薪水少了,你n受的利待遇差了Q又?#8220;薪情快报”又是“赞叹自由奔放的灵?#8221;。至于是否会(x)因此让你不能安心Q你 跳了槽是否解决问题,是否更加开心——那些,他们不着?br /> 要蟩槽肯定是有问题。一般来说问题发生了Q躲是躲不开的。很多hx是因h者那? 的不开心,如果q种不开心在现在q个公司不能解决Q那么在下一个公司多半也解决不掉。你必须怿Q?0%的情况下你所在的公司q没有那么烂Q你认ؓ(f)不错? 公司也没有那么好。就像《围城》里说的Q?#8220;城里的h拼命惛_出来Q而城外的人拼命想冲进?#8221;。每个公叔R有每个公司的问题Q没有问题的公司是不存在的。换 个环境你都不知道?x)碰C么问题,与其如此Q不如就在当下把问题解决掉。很多问题当你真的想要去解决的时候,或许q没有那么难。有的时候你觉得问题无法? 冻I事实上,那只?#8220;你觉?#8221;?br /> 人生的曲U应该是曲折向上的,偶尔?x)遇CP但大势d是曲折向上的Q而不是像脉冲波一h每回到v炏V我? q不面试者,30多岁了,四五份工作经历,每次多则3q少?q?0多岁的时候回到v点从一个初U职位开始干P拿基本初U的薪水Q和20多岁的年? ZL(fng)争,不觉得有点辛苦么Q这U日子好q么Q?br /> 我非怸赞成在一个行业不过3q以后换行业。基本上Q?5岁以前我们的生存资本靠打|35? 以后生存的资本靠的就是积累,q种U篏包括人际关系、经验、h脉、口?#8230;…如果常常更换行业Q代表几q的U篏付之东流Q一切从头开始。如果换了两ơ行 业,35岁的时候大概只?q以下的U篏Q而一个没有换q行业的有?0q的U篏Q谁?x)占优势Q工作到2--3q的时候,很多得工作不利Q好 像到了一个瓶颈,心情烦闷Q就惌职,乃至换一个行业,觉得q样所有一切烦恼都可以抛开Q会(x)好很多。其实这样做只是让你从头开始,到时候还是会(x)发生和原? 行业一L(fng)困难。熬q去向上跨了一大步Q要知道每个人都?x)经历这个过E,每个人的职业生中都?x)碰到几个瓶颈,你熬q去了而别人没有熬q去你就领先了? 跑长跑的Z(x)知道Q开始的时候很LQ但是很快会(x)有第一ơ的隑֏Q但q了q一D又能跑很长一D,接下来会(x)到W二ơ的隑֏Q坚持过了以后又能跑一Dc(din)如? 往复,隑֏一ơ比一ơ厉宻I直到坚持不下M。大多数人第一ơ就坚持不了了,一些h能坚持到W二ơ,W三ơ虽然大安坚持不住了,可是跑到q里的h也没? 个了Q这点资本够你安稳z这一辈子了?br /> 一份工作到两三q的时候,大部分h都会(x)变成熟手。这个时候往往?x)陷入不断的重复Q有很多Z(x)觉得厌倦,? 些h?x)觉得自己已l搞懂了一切,从而懒得去Lq步了。很多时候的x是因得失d了Q觉得自己已l完成比赛了Q其实这个时候比赛才刚刚开始。工? 两三q的人,无论是客户关pRh脉、手下、与领导的关pR在业内的名?#8230;…q都是远q不够的。但E有成W的hL?x)自我感觉良好的Q每个h都觉得自p? 户关p铁得要命,觉得自己在业界的口碑好得很。其实,可以肯定地说Q一定不是。这个时候,q是要拿出前两年的干劲来Q稳扎稳打——积累才刚刚开始?br /> 你够了解你的客户么Q你知道他最大的烦恼是什么么Q?br /> 你够了解你的老板么?你知道他最大的烦恼是什么么Q?br /> 你够了解你的手下么Q你知道他最大的烦恼是什么么Q?br /> 如果你不知道Q你凭什么觉得自己已l积累够了?如果你都不了解,你怎么能让他们帮你的忙Q做你想让他们做的事情?如果他们不做你想让他们做的事情,你又何来的成功?
六、等?/strong>
“{待”Q这是个躁的h们最不喜Ƣ的话题。本来不惌q个话题Q因Z(x)引v太多的争论,而我又无意和Z些,但是考虑到对于职业生涯的长久规划Q这是一个躲避不了的话题Q还是决定写一写,不爱看的L(fng)开吧?br /> q? 不是每次I红灯都?x)被汽R撞,q不是每个罪犯都?x)被抓到Qƈ不是每个错误都会(x)被惩|,q不是每个贪官都?x)被枪毙Qƈ不是你的每一份努力都?x)得到回报,q不 是你的每一ơ坚持都?x)有人看刎ͼq不是你每一点付出都能得到公正的回报Qƈ不是你的每一个善意都能被理解……q个Q就是世道。好吧,世道不够好,可是Q你 有推M道的勇气么?如果没有Q你有更好的解决办法么?有很多时候,人需要一点耐心Q一点信心。每个hM(x)轮到几次不公q的事情Q而通常Q安心等待是最? 的办法?br /> 有很多时候我们需要等待,需要耐得住寂寞,{待属于你的那一刅R周润发{待q,刘d华等待过Q周星驰{待q,王菲{待q,张艺谋也{待 q?#8230;…看到了他们如今的功成名就的hQ你可曾看到当初他们的等待和耐心Q你可曾看到金马奖媄(jing)帝在街边摆地摊?你可曄到d云社一h在剧场里l一位观众说 相声Q你可曾看到周星驰的角色甚至q一句台词都没有Q每一个成功者都有一D低沉苦L(fng)日子Q我几乎能想象得出来他们借酒愁的样子,我也能想象得Z们ؓ(f) 了生存而挣扎的H迫。在他们一生中最灿烂好的日子里Q他们(f)望成功,但却两手I空Q一如现在的你。没有h保证他们来一定会(x)成功Q而他们的选择是耐住? 寞。如果当时的他们d叨着“成功只是属于Ҏ(gu)阶?#8221;Q你觉得他们今天?x)怎样Q?br /> 曄我也不明白有些hZ么ƈ不比我有能力却要坐在我的头上Q年 U比我大׃定要当我的领gQؓ(f)什么有些烂Z需要努力就能赚钱?Z么刚刚改革开攄时候的那么Ҏ(gu)赚钱Q而轮到我们的时候,什么事情都要正规化 了?有一天我H然惛_Q我q在上学的时候他们就在社?x)里挣扎奋斗了,他们在社会(x)上奋斗U篏了十几二十年Q我们新人来了,他们有的我都惌Q我q不是在要公 qI我这是在抢劫。因为我要得太急,因ؓ(f)我忍不住寂寞。二十多岁的男hQ没有钱Q没有事业,却有蓬勃的欲望?br /> 人L?x)遇到挫折的QhL?x)有低? 的,人L?x)有不被人理解的时候的QhL有要低声下气的时候,q些时候恰恰是人生最关键的时候。因为大安?x)碰到挫折,而大多数不了q个门槛——你 能过Q你成功了。在q样的时刻,我们需要耐心{待Q满怀信心地去{待。相信生zM?x)放弃你Q机?x)M(x)来的。至,你还q轻Q你没有坐牢Q没有生M了的 病,没有Ơ还不v的债。比你不q的q多q比你幸q的人,你还怕什么?Q\要一步步赎ͼ虽然到达l点的那一步很Ȁ动h心,但大部分的脚步是q_甚至枯燥 的。但没有q些脚步Q或者耐不住这些^凡枯燥,你终归是无法q来最后的那些Ȁ动h心?br /> 逆境Q是上帝帮你淘汰竞争者的地方。要知道Q你不好受,别h也不好受Q你坚持不下MQ别Z一栗千万不要告诉别Z坚持不住了,那只能让别h获得坚持的信心,让竞争者看着你微W的面孔Q失M心,退出比赛。胜利属于那些有耐心的h?br /> ? 最l望的时候,我会(x)ȝ?sh)?jing)《The Pursuit of Happyness》《Jerry Maguire》,让自己重新鼓起勇气。因为,无论什么时候,我们总还是有希望。当所有的人离开的时候,我不失去希望Q我不放弃。每天下班坐在R里,我喜 Ƣ哼着《隐形的膀》看着H外Q我知道Q我在静静等待,{待属于我的那一刅R?br /> 原帖里伊吉网友的话我很喜Ƣ,抄录在这里:(x)
“每个人都希望Q自己是独一无二的特D者?br /> 含着金匙出生、投胎到好家庭、工作安排到?sh)力局、拿1万月薪这L(fng)概率事Ӟ当然最好轮到自己?br /> U军长征两万五、打成右z֏革命、胼手胝牺牲尊严去奋斗Q最好留l祖辈父辈和别h?br /> 自然Q不是每个吃q苦的h都会(x)得到回报?br /> 但是QQ何时代,每一个既得利益者n后,都有他的辈父辈奋斗挣扎乃至血付出生命的n影?br /> 慕别h有个好爸爸,没什么不可以?br /> 问题是,你的下一代,?x)有一个好爸爸吗?
至于问到Z么不能有同样的赢面概率?我只能问Qؓ(f)什么物U竞争中Qh和猴子不能有同样的赢面概率?
物竞天择。猴子的灵魂不一定比你卑微,但你w后有几十万q的cMh猿进化积淀(wn)?#8221;

七、入对行?跟对?/strong>
在中国,大概很少有h是一份职业做到底的。虽然如此,W一份工作还是有些需要注?br /> W? 一份工作对人最大的影响是入行Q现代的职业分工已经很细Q我们基本上只能在一个行业里成ؓ(f)专家Q不可能在多个行业里成ؓ(f)专家。很多案例也证明即一个h 在一个行业非常成功,到另外一个行业,往往完全不是那么回事情?#8220;你想改变世界Q还是想卖一辈子汽水Q?#8221;是乔布斯邀(g)L(fng)事可乐总裁U翰•斯考利加盟Ҏ(gu)? 所说的话,l果q位在百事非常成功的U翰Q到了苹果表现^q뀂其实没有哪个行业特别好Q也没有哪个行业特别差,或许有报道说哪个行业的^均薪资比较高Q但 是他们没说的是,那个行业的^均压力也比较大。看上去很美的行业一旦进入才发现很多地方其实q不那么完美Q只是外人看不见?br /> 说实话,我自己都没有发大财,所以我的徏议只是让人快乐工作的Q不是如何发大胦的徏议,我们只讨Z般普通打工者的情况?br /> ? 认ؓ(f)选择什么行业ƈ没有太大关系Q看问题不能只看眼前。比如,从前q开始,国家开始整医疗行业,很多医药公司开不下去,很多医药行业的销售开始{行。其 实医药行业的不景气是针对所有公司的Qƈ非针对一家公司,大家的日子都不好q,q个时候跑掉是非常不划的。大多数正规的医药公司即使不做新生意撑个两三 qL能撑的,大多数医药销售靠工资撑个两三q也是可以撑的。国家不可能永远捏着医药行业不放的,两三q以后光景dq会(x)好v来的Q那个时候别人都跑了? 你没跑,那时的日子应该会(x)好过很多。有的时候觉得自p个行业不行了Q问题是Q再不行的行业,做得人少了也变成了好行业。当大家都觉得不好的时候,往往? 是最好的时候。大安觉得金融行业好,金融行业门槛高不_(d)有多h削尖脑袋要钻q去Q竞争激烈。进M后还要时时提Ԍ一个疏忽,p后来的hl挤? 了,压力巨大Q又如何谈得上快乐,也就未必?#8220;?#8221;工作了?br /> 太阳能这个东西至今还不能q入实际应用的阶D,但是中国已经?家和太阳能有关的公司 在纽交所上市了;国美、苏宁、永乐其实是贸易型企业,也能上市Q鲁泰hl连l?0q利润增长超q?0%Q卖茶的一茶一座、卖衣服的v澜之安能上?#8230;…? 实选什么行业真的不重要Q关键是怎么做。事情都是h做出来的Q关键是人?br /> 有一Ҏ(gu)需要记住的Q这个世界上有史以来直到我们能够预见得到的未来,? 功的人L数Q有q人L数Q大多数人是一般的Q普通的Q不太成功的。因此,大多Ch的做法和看法Q往往都不是距L功最q的做法和看法。因此大? Ch说好的东西不见得好,大多Ch说不好的东西不见得不好。大多数人都ȝ股的时候说明跌只是旉问题Q大家越是热情高涨的时候,跌的日子近。大多数? 买房子的时候,房h(hun)不会(x)涨,而房h的差不多的时候,大多Ch才开始买房子。不?x)有q样一件事情让大家都变成功Q发了胦Q历史上不曾有过Q将来也不会(x)? 生。有些东西即使一时运气好得到了,q是?x)在别的时候、别的地方失ȝ?br /> q轻人在职业生刚开始的时候,其要注意的是,要做对的事情Q不要让? ׃后几十年的h生L提心吊胆Q更不值得Z一份工作赔上自q青春q华。我的公司是个不行較的公司,以前很多Z理解Q甚臌q员工也不理解。不q? 如今Q我们是同行中最大的企业Q客户乐意和我们打交道,其是在国家打击腐|的时候,每个人都知道我们做生意不l钱的名壎ͼ都敢于和我们做生意。而勇于给 q公司Q不是倒了Q就是跑了,要不是每天睡不好觉Qhq是要看长远一炏V很多时候,看v来最q的路,其实是最q的路,看v来最q的路,其实是最q的 路?br /> 跟对人是_(d)入行后要跟个好领对{好老师。刚q社?x)的人做事情往往没有l验Q需要有传n教。对于一个h的发展来_(d)一个好领导是非帔R要的。所?#8220;?#8221;的标准,不是他让你少q活多拿钱,而是以下三个?br /> ? 先,好领D有宽q的心胸。如果一个领导每天都?x)发脾气Q那几乎可以肯定他不是个心胸宽广的hQ能发脾气的时候却不发脾气的领|多半是非常厉害的领导? 中国人当领导最大的毛病是容忍不了能力比自己强的人,所以常常可以看到的一个现象是Q领导很有能力,手下一庸才或者手下一闲人。如果看到这L(fng)环境Q? q是不要ȝ好?br /> 其次Q领D愿意从下属的角度来思考问题,q一点其实是从面试的时候就能发现的。如果这位领导L从自q角度来考虑问题Q几? 不听你说什么,q就危险了。从下属的角度来考虑问题q不代表同意下属的说法,但他必须了解下属的立场。下属ؓ(f)什么要q么惻I然后他才有办法说服你。只兛_ 自己怎么想的领导Q往往难以获得下属的信服?br /> 最后,领导敢于承担责Q。如果出了问题就把责d下推Q有了功力_往自己w上揽,q样的领g跟也|。选择领导Q要选择关键时刻能抗得住的领|能够Z属的错误买单的领|因ؓ(f)q是他作为领导的责Q?br /> ? 可能Q你?l)C到好领导Q因为,中国的领导往往是屁股决定脑袋的领导。因Z坐领导的位置Q所以他的话比较有道理Q这是传l观念官本位的误区,可能有大? 的这U无知无能的领导Q只是,q对于你其实是好事。如果将来有一天你要超q他Q你希望他比较聪明还是比较笨Q相Ҏ(gu)说这L(fng)领导其实不难搞定Q只是你要把 自己的nD|下来而已。多认识一些hQ多和比自己强的人打交道Q同栯扑ֈ好的老师。不要和一同样郁L(fng)Zh诉社?x),控诉老板Q这帮不上你Q只?x)? 你更消极。和那些比你强的人打交道Q看他们是怎么想的Q怎么做的Q学?fn)他们,然后跟更强的人打交道?br /> 八、选择
我们每天做的最多的事情Q其实是选择Q因此在谈职业生涯的时候不得不提到q个话题?br /> ? 始终认ؓ(f)Q在很大的范围内Q我们究竟会(x)成ؓ(f)一个什么样的hQ决定权在我们自己。每天我们都在做各种各样的选择Q我可以不去写这文章,d人的帖子拍拍? _(d)也可以写下这些文字,帮助别h的同时也整理自己的思\Q我可以多注意下格式让别人易于阅读,也可以写成一堆;我可以就q样发上来,也可以在发以前再? 几遍Q你可以选择不刮胡子去面试Q也可以选择出门前照照镜?#8230;…每天Q每一L们都在做q样那样的决定。我们可以O不经心,也可以多׃心思。成千上? 的小选择累计hQ就军_了最l我们是个什么样的h?br /> 从某U意义上来说Q我们的未来不是别hl的Q是我们自己选择的。很多h?x)说我命苦啊Q没得? 择啊……如果你认?#8220;d软还是去IBM”?#8220;上清华还是上北大”?#8220;当销售副总还是当厂长”q种才叫选择的话Q的你没有什么选择Q大多数人都没有什? 选择。但每天你都可以选择是否为客h务更周到一些,是否对同事更耐心一些,是否把工作做得更l致一些,是否把情况了解得更清楚一些,是否把不清楚的问? 再弄清楚一?#8230;…你也可以选择是否在痛苦中l箋坚持Q是否抛弃掉自己的那些负面的xQ是否原谅一个h的错误,是否怿我在q里写下的这些话Q是否不要再 犯同L(fng)错误……
生活每天都在l你选择的机?x),每天都在l你改变自己人生的机?x)。你可以选择赖在C撒泼打滚Q也可以选择咬牙站v来。你永远都有 选择。有些选择不是立杆见媄(jing)的,需要篏U,比如农民可以选择自己常常L圎ͼ也可以选择让老天L地。诚Ӟ你今天浇水下去,苗不见得今天马上长出来Q? 但常常浇_(d)大部分苗l究?x)长出来的。如果你不浇Q收成一定很p糕?br /> 每天Q生z都在给你机?x)。它不会(x)l你一叠现金也不会(x)拱手送你个好工作Q但实际 上,它还是在l你Z(x)。我的家庭是一个普通的家庭Q没有Q何了不v的社?x)关pR我的父亲在大学毕业以后p分配C边疆Q那个小县城只有一条马路。他们那 一代h其实比我们更有理由抱怨,他们什么也没得刎ͼq轻的时候文化大革命Q书都没得读Q支援边疆插队落P{到老了Q却要给q轻人机?x)了。他有够的理由 像成千上万那L(fng)青年一P坐在那里抱怨生不逢时Q怨气冲天。然而,在分配到边疆的十q之后,国家恢复招研I生Q他考回了原来的学校。研I生毕业Q他被分 配到了安徽一家小单位里。又是三q以后,国家招收W一届博士生Q他又考回了原来的学校Q成Z国第一代博士,那时的他比现在的我年U还大。生zdƈ没有攑ּ 他,他也没有攑ּ生活?0q的{待Q他做了他自q选择。他没有攑ּQ他没有破罐子破摔,所以时机到来的时候,他改变了自己的h生。你最l会(x)成ؓ(f)什么样 的hQ就军_在你的每个小的选择之间?br /> 你选择怿什么,你选择和谁交朋友,你选择做什么,你选择怎么?#8230;…我们面(f)太多的选择。而这些选择? 中,意识形态层面的选择又远比客观条件的选择来得重要得多。比如,选择做什么品其实ƈ不那么重要,而选择怎么做才重要。选择用什么hq不重要Q而选择? 么带q些人才重要。大多数时候选择客观条gq不要紧Q大多数关于客观条g的选择q没有对错之分,要紧的是选择怎么做。一个大学生毕业了,他要d软也好, 他要卖猪肉也好,他要创业也好Q他要做游戏代练也好Q只要不犯法Q不害hQ都没有什么关p,要紧的是Q选择了以后怎么把事情做好?br /> 除了q些Q你q? 可以选择旉和环境。比如,你可以选择把这辈子最大的困难攑֜最有体力、最有精力的时候,也可以走一步看一步,{到?0岁再说。只是到?0多岁Q那? 是一辈子最脆弱的时候。上有老下有小Q如果在那个时候碰上了职业危机Q实在是一件很苦恼的事情。与其如此,不如?0多岁30多岁的时候吃点苦Q好让自? 脆弱的时候活得从容一些。你可以选择在温室里成长Q也可以选择到野外磨砺,你可以选择在办公室吹冷气的工作Q也可以选择40度的L(fng)下去见你的客戗只 是,q一切最l会(x)累积hQ引gC应得的未来?br /> 我不敢说所有的事情你都有得选择Q但是绝大部分事情你有选择Q只是往往你不把这当作一U选择。认真对待每一ơ选择Q才?x)有比较好的未来?br /> ?ji)、选择职业
? 业的选择Qȝ来说无非是销售、市场、客服、物、行ѝh事、胦务、技术、管理几个大cR有个有的现象是Q?00强的CEO当中最多的是销售出 w,W二多的人是财务nQ这两者加h大概过95Q。现代IT行业也有技术出w成板的,但实际上Q后来他们还是从事了很多销售和市场的工作,q且 表现Q公司才获得了成功。完全靠技术能力成为公司老板的,几乎没有。这是有原因的,因ؓ(f)销售就是一门跟人打交道的学问,而管理其实也是跟人打交道的学 问,q两者之中有很多盔R的东西Q它们的共同目标是“让别人去做某件特定的事情?#8221;而胦务则是从数字的层面了解生意的本质Q从宏观上看待生意的本质Q对 于一个生意是否挣钱,是否可以正常q作Q有着最深刻的认识?br /> 公司的时候是销售主导公司,而公司大的时候是财务d公司。销售的局限性在于只看h 情不看数字,财务的局限性在于只看数字不看h情。公司初期,q营成本低,有订单就zd下去Q跟客户也没有什么谈判的条gQ别l生意做已经谢天谢地了? q个时候订单压倒一切,客户的要求压倒一切,所以当然要h情。公司大了以后,一切都要规范化Q免得因Z规范引v一些不必要的风险,同时q营成本也变 高,必须提高利润率,把有限的资金攑ֈ最有出的地方。对于上市公司来_(d)股东才不你客户是不是最q出国,最q是不是哪个省又在搞严打Q到了时候就要把 业W拿出来,拿不出来抛股票Q这个时候就是数字压倒一切?br /> 前两天听到有一句话觉得很有道理Q开始的时候我们想“能做什?#8221;Q等到公司做大了 有规模了Q我们想“不能做什?#8221;。很多h在工作中觉得Z么领D么保守,q也不行那也不行Q错q很多机?x)。很多时候是因ؓ(f)你还q轻Q你想的?#8220;能做什? ”Q而作为公叔RD考虑的方面很多,他比较关?#8220;不能做什?#8221;?br /> 我ƈ非鼓吹大安d销售或者胦务,I竟选择什么样的职业,和你I竟要选择什? L(fng)人生有关pR有些h喜Ƣ下班按时回Ӟ看看书听听音乐,那也挺好Q但׃适合找个销售的工作了,否则?x)是折磨自己。有些h喜Ƣ出风头Q喜Ƣ成Z h的中心,如果选择做胦务工作,大概也干不久Q因Z般老板不喜Ƣ胦务太U极Q也不喜Ƣ胦务的话太多。先惛_自己要过怎样的h生,再决定要找什么样的职 业。有很多的不快乐Q其实是源自不满뀂而不满Q很多时候是源自于心不定。而心不定则是因ؓ(f)不清楚究竟自p什么,不清楚要什么的l果是什么都惌Q? l果什么都没得到?br /> 我想Q我们还是因为生z而工作,不是因ؓ(f)工作而生zR生zL最要紧的,工作只是生活中的一部分。我L觉得生活的各Ҏ(gu)面都? 怺影响的,如果生活本n一团ؕ麻,工作也不?x)顺利。所以要有娱乐,要有C交Q要ȝw体Q要有和睦的家庭……最要紧的,要开心。我的两个销售找我聊天, 一肚子苦水。我问他们,2q以前你什么都没有Q工资不高,没有客户关系Q没有业l,处于被开的边~,现在的你比那时条件好了很多,Z么现在却更加不开? 了?如果你做得越好越不开心,那你Z么还要工作?首先的首先,是要让自己高兴v来,让自己心态好h。这U发自内心的改变?x)让你更有耐心Q更有信 心,更有气质Q更能包?#8230;…否则Q看看镜子里的你Q你满意么?
有h?x)说Q你说得Ҏ(gu)Q我每天加班Q不加班老板׃(x)把我炒掉Q每天篏得要死,哪有? 间娱乐、社交、锻|Q那是h们把目标讑֮太高的缘故。如果你q在动不动就?x)被老板炒掉的边~,那么你当然不能设立太高的目标Q难道你q想每天L高尔 夫?Q你没时间去健n戉KDn体,但是上下班的时候多走几步可以吧Q有楼梯的时候走走楼梯不走电(sh)梯可以吧Q办公的间隙扭扭脖子、拉拉肩膀、做做俯卧撑可以 ?#8230;…谁规定锻炼就一定要拿出每天2个小时去健n房?Q你没时间社交,每月参加郊游一ơ可以吧Q周末去参加个什么音乐班Q绘ȝ之类的可以吧Q去试认识 一些同行,和他们找Z(x)交流交流可以?#8230;…开始的时候L有些隄Q但q出q一步就?x)向良性@环的方向发展。而每天工作得很苦P剩下的时间用来咀D P只会(x)陷入恶性@环,让生zL加糟p?br /> 虽然d惠普仅有十五天,但感觉上惠普已经L很远。我的心思更多得攑֜规划自己W二阶段的h生,qƈ非代表我Ҏ(gu)普没有Q何眷恋,主要q是想以此驱动自己往前走?br /> 万科的王石登珠穆朗玛峰的体验l我很多启发。虽然在出发时携带大量的物资Q但是登的q程中,必须不断减轻负荷Q最l只有一个氧气瓶和他M峰顶。登山如此,漫长的h生又何尝不是?br /> 我宣布退休后Q接到同事、朋友、同学的贺。大部分人都认ؓ(f)我能够在q样的职位上?qing)年龄选择退休,是一U勇气,也是一U福气?q有一部分人怀疑我只是借此Z(x)换个工作Q当然还有一些h说我在HP做不下去了,此Z(x)d?br /> 我多q来已经?fn)惯别hҎ(gu)的说三道四,但对于好友,我还是挺兛_大家是否真正理解我的xQ这也是写这文章的目的?br /> ׃受我父亲早逝的影响Q我很早׃定决心,要在有生之年实现自己的愿望。我不要像我父亲一P为家庭生zd一辈子Q(f)l前感伤Q懊D己有很多没有实现的理惟?br /> 一本杂志的文章提到我们在生前就应该思考自q墓志铭,因ؓ(f)那代表你自己对完h生的定义Q我们应该尽可能在有生之q去实现它。我希望我的墓志铭上除了与家人及(qing)好友有关的内容外Q是q样写着Q?br /> 1. q个人曾l服务于一家全球最大的IT公司QHPQ?5q_(d)和她一L(fng)历过数次重大的变革,看着她从以电(sh)子A表ؓ(f)主要的业务变革成全球最大的IT公司?br /> 2. q个人曾l在全球发展最快的国家Q中国)工作16q_(d)q担任HP中国区总裁7q_(d)见证?qing)经历过中国攚w开攄关键、最新突破阶D,与中国一hѝ?br /> 3. q个人热爱飞行,曄是一个有执照的飞行员Q篏U飞行时数超qX时Q曾l在X个机v降过?br /> 4. q个人曾l获得管理硕士学位,在领导管理上特别x中国企业的组l行为及(qing)l效Qƈ且在q个领域上获得中国企业界的认可?br /> ? Ҏ(gu)25q才ȝW?和第2两项成果Q我不知q要Ҏ(gu)多久才能达成W?和第4的愿望。特别是W?个愿望需要经历学术的训练Q才能将我的l验ȝ成知识,? 则我的经验将无法有效影响?qing)传授他人。因此,重新q入学校学习(fn)Q拿一个管理学位是有必要的Q更何况q是我一个非帔R要的愿望?br /> 另一斚wQ我25q? 的时间都花在q营(Operation)的领域,兢兢业业的做好职业h士的工作。这是一份好工作——特别是在HP——这份工作也帮助我徏立胦务的基础Q支 持家庭的发展。但是我不想l其一生,都陷入在q营的领域,我想像企业家一P有机?x)靠一些点?Ideas)赚钱。虽焉险很高,但是值得一试。即使失 败,也不枉走一回,q也是第4个愿望其中的一部䆾?br /> Carly Fiorina曄Ҏ(gu)说过Q?#8220;q个世界上有好想法的人很多,但有能力d现的人很?#8221;2007q??1日在北大演讲Ӟ有h问v哪些书对我媄(jing)响较大。我惛_我h生观有媄(jing)响的其中一本书?#8220;TriggerPoint”Q它的主要观Ҏ(gu)Qh生最需要的不是规划Q而是在适当的时机掌握机?x),采取行动?br /> ? q些愿望在我心中已经酝酿一D很长的旉Q开始的时候,也许一q想个一两次Q过了也忘掉,但逐渐的,q个心中的声x来愈大,出现的频率也愈来愈高。当 它几乎每一个星期都?x)来与我对话Ӟ我知道时机已l成熟。但和Q何h一P要丢掉自q在所拥有的、所熟?zhn)的环境?qing)E_的收入,转到一条自己未曄历过? 存在未知风险的道路,需要绝大的勇气、家人的支持和好友的鼓励。有舍才有得Q真是知易行难,我很高兴自己l于跨出了第一步?br /> 我要感谢HP的EER 提前退休优惠政{,它是其中一个关键的TriggerPointsQ另一个关键因素是在去q五六月发生的事。当时我家老大从大学毕业,老二从高中毕业。在 他们l箋工作?qing)求学前Q这是一个黄金时D,让我们全家可以相聚一D较长的旉Q我为此很早p划休一个长假,带着他们到各地游玩,但这个计划因为工作上一 仉要的事情QMark Hurd访华Q不得不取消。这个事件刺Ȁ了我必须严肃地去对待那心中的声音Q我?x)不会(x)l不断的错失很多关键的机?我已l年q?0Q我?x)不会(x)走向和我? 亲一L(fng)道\Q?br /> Z部老总Charles跟我_(d)很多人在所有对他有利的星星都排成一列时Q还是错失时机。我知道原因Q因为割舍及(qing)改变对h是多? 的困难。我怿大部分的人都有自׃h生的理想Q但我也怿很多人最l只是把q些理想当成是惻I然后不断Cؓ(f)自己L不能实现的藉口。南非前ȝ曼d拉曾 l说q:(x)“与改变世界相比,改变自己更困难?#8221;真是一针见血?br /> 什么是快乐?qing)有意义的h生?我相信每一个h的定义都不一栗对我来_(d)能实现我墓志铭上的内容就是我的定义。在中国惠普总裁的位|上固然可以吸引很多的关注及(qing)眼球Q但是我太太?qing)较亲近的好友都知道那不是我q求的,那只是ؓ(f)扮演好这个角色必d力做好的地方?br /> 做一个没有名片的人士Q虽然只有十多天的时_(d)但我发现我的脑袋里已l空出很多空间及(qing)能量Q让我可以静心的为我ChapterII的新生活做细致的调研?qing)规划?br /> 我预订以两年的时间来完成转轨的准备工作,q且花多Ҏ(gu)间与家h共处。这两年的时间我希望拿到飞行执照Q拿到管理有关的士学位Q提升英文的水^Q徏立新的网l,多认识不同行业的人,保持与大陆的联系。希望两q后Q我可以利回到大陆d现我W四个愿望?br /> 毫不意外Q在生活上,我发现很多需要调整的地方?br /> ? 十多q来Q我生活的步调及(qing)节奏几乎完全被公司及(qing)工作所左右Q不断涌出的Deadline?qing)Q务驱动我每天的安排。一旦离开q样的环境,W一个需要调整的? 是要依靠自己的自律及(qing)意志力来驱动每天的活动。睡觉睡到自焉的态度l对不正,放松自己Q不l事情设定目标及(qing)旉表,或者对错失旉目标无所谓,也不? 。没有年度,季度Q月?qing)周计划也不正确?br /> 担Q高层l理多年Q已l养成交待事情的?fn)惯Q自q旉主要花在思考、决{及(qing)q踪目的进展情c(din)更? 是依靠一个庞大的团队来执行具体的事项Q及(qing)U书来处理很多协调、繁琐的事情。到国后,很多事情需要打“800?sh)?#8221;联系Q但q些?sh)话很忙Q常让你? Waitingline上等待很长的旉。当我在{待Ӟ我可以体?x)以前秘书工作辛苦的地方Q但同时也提醒我自己Q在q个阶段要改变态度Q培L大的耐? ?qing)自己动手做的能力?br /> 生活的内容也要做出很大的调整Q多出时间锻Dn体,多出旉x家hQ多出时间关注朋友,多出旉体验不同的休闲活动及(qing)飞行。一步步的,希望生活逐步调整到我所期望的轨道上Q期待这两年的生zL充实又充满乐及(qing)意义?br /> W? 一个快乐的体验是准备?qing)参加大儿子的订婚礼。那U全心投入,不需担忧工作数字的感觉真好。同时我也租好了公寓Q买好了家具?qing)R子,陪家人在周末的时候到 Reno?qing)Lake Tahoe玩了一。LakeTahoe我去了多ơ,但这ơ的体验有所不同Q我从心里欣赏到它的丽。但同时我也在加紧调研的工作Qؓ(f)甌大学?qing)飞行学? 做准备,q段旉也和在硅L(fng)朋友?qing)一些风险投资公司见面,了解不同的业?br /> 我的人生观是Q?#8220;完美的演出来自充分的准备Q勇于改变自己,适应不断变化的环境,Z(x)不断出玎ͼ快乐?qing)有意义的h生来自于实现自己心中的愿望,而非外在的掌?#8221;?br /> ? dӞ有两位好朋友送给我两个不同的语QBaron的是“多年功过化烟?#8221;Q杨华的?#8220;莫春者,风乎舞雩Q咏而归”Q它们分别代表了我离开惠普?qing)走? 未来的心情。我ȝ人生有三个阶D:(x)一个阶D|为现实找一份工作,一个阶D|为现实但可以选择一份自己愿意投入的工作Q一个阶D|为理惛_做一些事情?br /> 我珍惜我的福气,感激HP?qing)同事、好朋友l我的支持、鼓励及(qing)协助Q将q篇文字化我心声的文章与好友分n?



Joshua Yan 2008-12-02 12:58 发表评论
]]>
写cookie备忘http://www.tkk7.com/jhyan/archive/2008/11/13/240321.htmlJoshua YanJoshua YanThu, 13 Nov 2008 07:02:00 GMThttp://www.tkk7.com/jhyan/archive/2008/11/13/240321.htmlhttp://www.tkk7.com/jhyan/comments/240321.htmlhttp://www.tkk7.com/jhyan/archive/2008/11/13/240321.html#Feedback0http://www.tkk7.com/jhyan/comments/commentRss/240321.htmlhttp://www.tkk7.com/jhyan/services/trackbacks/240321.html 写cookieӞcookie的内容不能包含分PQ)Q否则在ie下会(x)造成cookie内容不完_(d)ff下没有问题,估计是因为ieҎ(gu)分号解析cookie


比如Q正常情况下Q?br />
cookie1=value1
cookie2=value2

但是Q如?br />
cookie1="value1;value11;value12"
cookie2=value2

在ie下面可能?x)造成

cookie1="value1
cookie2=value2

q有可能是:(x)

cookie1="value1;value11;value12;cookie2=value2"




Joshua Yan 2008-11-13 15:02 发表评论
]]>
越SOAQ动态业务应用的C业应用框Ӟ2Q{?/title><link>http://www.tkk7.com/jhyan/archive/2008/10/06/232644.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Mon, 06 Oct 2008 05:08:00 GMT</pubDate><guid>http://www.tkk7.com/jhyan/archive/2008/10/06/232644.html</guid><wfw:comment>http://www.tkk7.com/jhyan/comments/232644.html</wfw:comment><comments>http://www.tkk7.com/jhyan/archive/2008/10/06/232644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jhyan/comments/commentRss/232644.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jhyan/services/trackbacks/232644.html</trackback:ping><description><![CDATA[<h3>W二部分Q动态业务应用构建实践——两个自适应pȝ的故?/h3> <p>生力提高是生活水^提高的基本组成。美国的l验表明Q长期的生力强劲增长表Cؓ(f)伴随l织l构和企业资金安排变化的技术革斎ͼ以及(qing)人力资本的投 入。但是,支撑q些生力增长的军_因素的是一个更基本的因素:(x)C会(x)对其自nq行重大转变的意志,以及(qing)Ҏ(gu)术进步和随那个进步而来的经机?x)将使h们改? 其生zȝ信心?a target="_blank"></a><br /> </p> <p>–Roger W. Ferguson Jr.和W(xu)illiam L. WascherQ美国经学?x)在政府中做的经专题演Ԍ?x)q去生力大爆炸的教训,《经学展望杂志》,2004q春?8PW??/p> <p>“一旦着手自动化q些[企业]程Q技术实现大U占10%Q其?0%都是变更和流E管?#8221;</p> <p>–Mark EvansQTesoro Petroleum的CIOQ管理自动化Q?004q??/p> <h4>W一部分ȝ</h4> <p>?a >本文的第一部分</a>Q? 我们介绍了一U构建新型ITpȝ的企业架构,我们UC为动态业务架构(DBAQ。这些DBA非常适合支持h动态操作(包含最C务的一个分c)的企业? W一部分q指出,用例是当前系l架构和设计的基本输入,q描qC依赖通过它收集的需求对当前企业架构Ҏ(gu)的种U制U。这一新提出的新框架用企业事件模? 作ؓ(f)L(fng)Qƈ企业视Z个具有清C息架构的自适应pȝ。以新的自适应pȝ和信息理Zؓ(f)基础Q在基础层Q该框架同时捕捉企业程和业务变更。用例仅? 设计q程的后期作ZU需求细化方法被引入。这U框架优先的方式受到了传l工E方法学的启发,但针对像企业q样的自适应pȝq行了修攏V?/p> <h4>介绍</h4> <p>告别手工作坊q向软g工程加入正确工程技术的时候到了。这是将复杂软g应用Q尤其是在企业领域中Q构建成高度可靠、易于改变和方便调试的公共标准的 唯一Ҏ(gu)。选择q执行正的pȝ架构是ɘq种Ҏ(gu)发挥作用的最重要因素。我们徏议的解决Ҏ(gu)使得围绕唯一一个系l架构进行标准化Q不考虑软g应用Qƈ避免 成本高昂的重新构架成为可能?/p> <p>正如本文W一部分提到的,构架软g应用和设计其它工E品之间有一个根本性的区别。因Y件是和信息打交道Q而信息是变更?#8220;载体”Q那么必d最 基础的别将变更构徏C息架构之中。此外,业务操作变更的方式和技术团体将变更引入pȝ的方式走得是完全不同的\径。它们各自都是对变更反应不同q具? 不同操作的组l(一个是业务和一个是技术)。在构架q程中,可以把这两个l织作ؓ(f)两个不同的自适应pȝ对待。这正是我们选择“两个自适应pȝ的故?#8221;作ؓ(f) 本文W二部分副标题的原因?/p> <p>在设计企业应用的q程中涉?qing)两个自适应pȝ?/p> <p>本文W一部分提到Q能成功应对构徏DBA复杂性的唯一Ҏ(gu)是用架构先行的Ҏ(gu)论。几个世U以来,工程师们一直在使用q种Ҏ(gu)论——但L设计“? ?#8221;架构。一旦要应用变更Q系l极可能必须先停止工作再q行修改。例如,要改变由装配U组装的产品必须先停止装配线Q然后应用变_(d)最后重新启动装配线?/p> <p>当今Z务构建ITpȝ的Y件工E师们很可能是遵@的同样套路。当业务变化提出了修改应用的需求时Q它很可能就触发了一个成本高昂的升。开发? 必须从头开始一个新业务需求,q且旧的设计常常l受大量的重新构架。这U升U周期可能需要几个月。如果企业应用是由外部开发商按照自己的日E构建的Q那? 整个q程可能耗时更长而且l果可能达不C务预期。Mark Evans说得好,过90%的努力只直接和应用变更相兟?/p> <p>c由新的自适应pȝ理论和它们信息架构(参见局外h观点Q的帮助Q我们徏议的企业应用设计解决Ҏ(gu)引入了两个互补但唯一的框架。这两个框架让我们可 以有效地处理和协调业务操作和技术团体操作中的变更。对设计q程而言Q业务操作和技术团体操作可以被视ؓ(f)两个截然不同的自适应pȝQ它们各自都有自q需 求?/p> <p>业务操作可由基础动态业务^台的通用概念来表C。根据自适应pȝ理论QQ何企业业务功能均?cd程。主程cd支持正常操作Q而其他两个则? 责引入变化:(x)内部决策制订程处理理和其他企业变更决{;业务环境变更程处理客户决策和变更的其他外部来源。因此,我们提出的业务流E框Ӟ基本动? 业务q_Q是围绕着业务操作或h(hun)值@环构v来的Q它包含的两cd更由两个不同的变更管理^台来处理。从信息处理观点来看Q实现这些操作的pȝ可以比作? l事件模型构建的“信息装配U?#8221;Q参见第一部分Q。企业的业务操作可以按照cM源自丰田_刉最?jng)_늚价值流E图QValue Stream MappingQ方法论的方法来识别。结果是Q生命周?事g模型成ؓ(f)pȝ设计和架构的主要驱动力,不可靠的用例集合不再是系l架构的主要输入?/p> <p>技术操作有其自w的挑战和独特的动态性。技术操作的主要目标是如何不同的团队在引入变更的过E中能最大限度的合作。基动态业务应用是h两类程的自适应pȝQ操作和操作变更。这两个程技术支持(操作Q和技术开发(操作变更Q与业务用户联系在了一赗?/p> <img alt="" _href="img://Fig1.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig1.jpg" /> <p>?. 构徏和维护基业务动态^台既需要业务流E框Ӟ也需要业务系l变更管理框架?/p> <p>两个框架必须合ƈC个既考虑技术团队操作,又考虑业务用户zd的独特系l设计中。这个系l是围绕服务器端架构设计的。虽然仿效了它们的结构和控制层次Q但是这是ؓ(f)不同cd用户合作提供支持的唯一Ҏ(gu)?/p> <h4>设计服务器端基础设施的复杂性比桌面应用的要高几个数量</h4> <p>每个企业软g的设计者都认识刎ͼ实现完整的企业客?服务器应用要比构建桌面应用更复杂。对于桌面应用,接口是围l一个角艌Ӏ一个主要Q务和一个清 晰接口构建的Q整个应用运行在单独一台机器之上。接口可以通过一pd函数实现来构建。对于服务器端应用,实现要复杂得多。复杂性的来源之一是Q服务器? 应用要实现包括管理员在内的多个角艌Ӏ管理员不可能扮演一个被动角Ԍ他需要一个可以在必要时改变操作参数的界面。此外,Z保证正常使用Q技术支持必? 对应用进行监?/p> <p>要更好地理解实现桌面应用和实现客?服务器应用之间的区别Q我们可以看看将一个桌面应用变成客?服务器应用需要经q哪些步骤。假设我们需要? 作ؓ(f)服务器端应用实现的MS Word写信。首先,你需要一个技术支持负责设|字体、页面和所有其他设|。每当你需要不同设|的时候,你都必须hq个技术支持完成变更。在你写信时Q? 理员必d定字体,信头{等。一旦完成这些,同一理员可能还需在它发送前对其q行审核。这个例子虽然看h单,但是它可以帮助我们理解当试图桌? 开发过E中获得的知识外推到客户/服务器应用时QY件架构师面(f)的挑战?/p> <p>事实上,当多个用户在使用同一个应用时Q业务上或技术上Q,它需要完全不同的Ҏ(gu)。架构必L分布式(用户可能在不同地炏V用不同机器)、有状? Q状态不再由编码到应用中的下一个窗口来定义Q、动态性(理员或外部用户可能需要一个业务实体能在运行时被改变,cMl理可能要求一个品或服务不能 再以相同h出售或客户可能要求订单改变的方式Q和层次性(所有组l有一个控制层U,q样不同用户pҎ(gu)E进行不同控Ӟ的Q务或程提供支持。所有这 些新性质都必被内嵌臛_用的基础之中Q否则它?yu)必d每次q行变更时被重写?/p> <p>但是qƈ非设计服务器端应用的唯一区别。当桌面应用崩溃Ӟ用户只需重启它就行了。因为它实现的是单Q务,重新做一遍即可,即便丢失了大部分? 据。用户ƈ不需要一个专门的技术团队来帮助他运行应用程序。对于客?服务器应用而言Q情况就完全不一样了。由于多个用户同时工作,一旦出现问题,只有? 有技术知识和有权使用工具监测应用的技术支持团队能够制定如何应用恢复正常操作的决{。ƈ且技术团队自q操作蓝图完全不同于业务操作蓝图。技术团队有 自己的流E控制层ơ、自q分布式环境、自己实现变更的Ҏ(gu)和自q状态?/p> <p>l果是,构架一个能在企业q行的客?服务器应用要比构架一个桌面应用复杂几个数量。服务器端的主要复杂度源于它必须支持两个自适应pȝQ一? 是技术团体,另一个是业务团队Q他们各自又都有自己的操作和控制层次。在构架同时支持理和技术支持两个自适应pȝ的应用时Q需要遵守应用于自适应pȝ? 其相关信息的法则?/p> <p>在构架这cd杂系l的q程中,如果有一个理想的架构Q那么就用不着在每ơ业务或技术引入变更时重新q工了。理x形是拥有一个标准组仉合,它具? 用事件模型实现的定义良好的行为。在不同控制U别实现的事件模型将q些lg链接C个控制层ơ中。在桌面中,一l自w具有事件模型的定义良好的组件由一? 清晰的控制层U链接到了一赗服务器端就要落后得多了。用中的J2EE?NET或其它现存专有架构都~少为分布式、动态性、有状态和层次性环境提供支 持的基本lg。由于Web标准是无状态、扁q뀁静态和只针对单服务器的Q它们对单个自适应pȝ都无法提供很大帮助,更别提两个了?/p> <p>Ҏ(gu)自适应pȝ?qing)其兌信息的法则,一个控制层ơLW合3个模式:(x)</p> <ul> <li>初始化过EL相同的自向下顺?</li> <li>层之间的信息传播L늅定的规则:(x)命o(h)自向下,反馈自底向?</li> <li>每个层有其自n的正常操作,它们在收C个反馈或命o(h)之前不会(x)改变。处理命令或反馈L需要变更管理的能力。ƈ且由于有两类交互——命令和反馈——因而需要两cM同的变更理</li> </ul> <p>我们展C如何用标准组Ӟ它们一赯链接在一个动态、有状态且分布式的控制层次中)为服务器端应用实C个标准架构。但是首先,我们先l出另一个Q何计机使用者都熟?zhn)的以事gZ心的q_?/p> <h4>微Y它的未来徏立在了针对GUI的一pdlg和一个静态事件模型之?/h4> <p>微Y之所以如此成功有许多原因Q但是其中一炚w常突出。他们不来自Apple和IBM的诸多批评和竞争Q将Windows操作pȝ构徏成了一个桌 面标准。一U解释可能是Q微软是W一家不仅提供与Apple利用Mac完成的工作类似的操作环境Q而且q拥有一l最方便的OS和GUIlg的公司。这些组 件被实现成了可供调用的API。利用这个组件模型,包括微Y在内的Y件公司就能够构徏数据库、办公应用和cMVisual Basicq样的开发工兗这些应用都能利用被构徏成结构体和控件的Windows内置层次事g模型?/p> <p>在开发WindowsӞ微Y拥有的优势在于,大多数OS和GUI的主要组Ӟq同它们的事件模型一P要么已经是现成的Q要么就是可以凭直觉方便 地构建。对于Q何桌面应用来_(d)控制层次看v来异乎寻常的单。在GUI栈的端是扮演其余GUIlg容器的各个窗口。打开H口Q内嵌的控g也就自动地被 初始化。关闭窗口,每个lg也跟着一起关闭。用API捕获那些事g以及(qing)Windows应用的开发都和一个插件架构十分相U?/p> <a _href="resource://Fig2_lg.jpg" ><img alt="" _href="img://Fig2.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig2.jpg" /></a> <p>?. 微YWindows控制层次模型——一个用戗一个应用、一个位|、一l静态功?/p> <p>q些API的实现就是Windows操作pȝ自n。它是控制初始化q程的那个层U,也是最l必d理错误而不是崩溃或丢失数据的层U。在服务器端Q? lg、它们的事g和控制层ơ被一个需求搞复杂了,那就是ؓ(f)有状态、动态、分布式和层ơ性Q务提供本地支持。这正是自适应企业操作q_QAEOPQ的主要? 标?/p> <h4>围绕动态结构和控制q行设计QAEOP提高了生产力</h4> <p>一些年前,IBM招募了上千名企业架构师决心降低它们各垂直行业的客户化解决Ҏ(gu)个数。一q多之后Q他们将它们的数目由过60个降低到了不?0 个。付出巨大的努力和不优U的结果显CZ问题的巨大。尽投入了庞大的资源,但IBM实难以创徏能对他们客户都适用的通用解决Ҏ(gu)Q不他们在行业? 深度和公司大。一U可能o(h)他们努力复杂化的一件事是,他们是以一l不完善的遗留解x案开始的?/p> <p>我们的目标是相同的:(x)创徏一个几乎普遍适用于所有行业的通用解决Ҏ(gu)。如果有从一个新鲜想法开始的自由Q我们一开始就?x)关注那些我们认为最重要的基 本原则。大多数企业架构虽然依赖现有技术、组件或象SOAq样的趋势,但是AEOP架构要优于它们。它从一开始就认识到技术在企业中扮演的Ҏ(gu)角色是? 高生产力。这个角色对所有技术解x案(不论它是否是ITQ都是有效的。在IT情Ş下,׃业务的动态性和存在于企业系l各用户之间的复杂关p,架构需? 围绕企业程的结构、控制和动态性来构徏?/p> <p>q种Ҏ(gu)q提供了一U手D|解决由Nicholas Carr的《IT没什么大不了的(IT doesn't matterQ》生的讨论Q该文发表于2003q?月的《哈?jng)商业评论》。询问IT是否是业务相关的Q就好像询问装配U是否是业务相关的一栗它不仅? 诸如通用或丰田这L(fng)公司臛_重要Q而且是Q何一家制造业公司的一部分Q包括象Intelq样的高U技行业明星。装配线的媄(jing)响力寚w些定制品或服务无处 不在的行业(如食品或保健领域Q来说要得多。虽然在象通用q样的公司看来装配线是重要的Q但是它不过是高生力的促成因素。相同的事实也适用于ITQ它 可能寚w些依赖信息处理运营的公司来说是一回事Q但是对其他公司可能无关紧要了。IT唯一的不同之处在于,它远没有装配U技术成熟?/p> <p>要分析IT如何能提高生产力Q就要了解那些决定了技术如何被交付和用的基本商业机制。我们必ȝ看信息处理的基本角色Qƈ询问驱动企业q营的核? 信息元素是什么。在工程领域Q这一q程得到了相当好的理解,可以从几个例子看一炏V当一个工E师开始设计一枉机时Q他从来不会(x)把飞机看作一个诸如螺 母、螺钉、电(sh)Uѝ连接器、܇、电(sh)动发动机、杠杆、面板等q样零g的集合。他查看q接它们的方式和它们在交付功能过E中扮演的角艌Ӏ一枉机的l构是围l机 {引擎、舱和Lw徏造的Qƈ采用一U能够最大化不同参与者间交互的控制层U。徏{师在设计一栋房子时也是q样。在建筑师清楚房中需要的卧室数目和生 zȝ家庭人员个数之前Q待安装的空调、器h늺型号都不重要?/p> <p>在当今的Ҏ(gu)中,企业软g大多都是围绕技术组件和标准被构?设计的。需求是一U评估生产力增长或企业Y件结构、控制和动态性的一U补救方法。事? 上,高别架构推荐只以表现层、业务层和持久层Z心。当前还没有一U架构方法提供一个解x案来支持现实中的动态、分布式、有状态和层次的业务流E架 构?/p> <p>Z更好地类比,不妨让我们看看工E师是如何设计装配线的。首先,它们以易于维护和l修计目标。这是Z么装配线架构和设计是围绕可交换性? 模块化和标准化组件徏造的原因。由于装配线不会(x)动态变化,那么W二个标准就是要易于针对新模型重新进行配|。这正是机器人在装配U上如此行的原因。不? d有多复杂Q都可以方便地针对范围广泛的当前和将来Q务重新编E。只有在q两个标准被满之后Q设计工E师才会(x)着手努力最优化每个Ҏ(gu)的Q务?/p> <p>Z构架/设计一个通用的AEOPQ我们识别出?个需要在设计中被解决的基本因素,它们对生产力的提高有重大影响。它们几乎对所有企业都是相同的Q不些企业涉?qing)的领域或生产规模?x)</p> <p><strong>1Q通过为技术支持、开发h员和业务用户之间的合作操作提供支持,提高技术团队操作的生?/strong></p> <p>Ҏ(gu)个架构媄(jing)响最大的是不同技术团队和业务用户之间的关pM?qing)需求变更引入的方式。由于IT团队是在应用上花Ҏ(gu)间最多的一个团队,提高它的生力应该是架构的首要Q务?/p> <p>在这一背景下,技术团队正常操作的l构与控制ƈ不复杂。业务用h开一个触发业务事件的应用。这些事件应用处理信息。技术支持团队监应用。应用虽然处于生产环境,但是开发团队常常要计划下次升q实现新的需求变更?/p> <p>整个处理的控刉循相同的层次架构Q在控制金字塔的端是开发者团队。因为是他们实现未来的功能,他们对实现拥有所有控制权。接下来是技术支持团 队,因ؓ(f)他们可以停止和重启服务器或改变部分系l配|。对应用拥有最控制权的团队包括业务用戗经理或工h。他们对应用脚本只能唯命是从?/p> <p>׃企业是动态的Q功能变更的h可能出现得非常早Q甚臛_应用安装和运转之前。事实上Q需求只有在下次开?x)的时候才生效。结果,在我们查看什么对 生力有驱动作用的时候就?x)发玎ͼ如何变更{换ؓ(f)代码是一个重要因素。在AEOP中,当发生变更时Q你?x)发现L存在同样的用L(fng)。开发团队是接受变更 h的团队,监测应用的团队安装它q接受配|来支持它,接着是业务团队接受培训来使用新功能?/p> <p>作ؓ(f)q个l构和控制层U的l果Q企业应用的层L围绕3个^台构建的Q一个ؓ(f)开发团队实现功能、一个ؓ(f)技术支持团队实施它和一个支持业务用戗它们每个都有自qȝ命周期和驱动设计的事件模型?/p> <p>因ؓ(f)AEOP主要是支持技术团队操作的动态性,所以这U?#8220;3个^?#8221;的结构、它们的lg和事件模型都是围l变更请求的生命周期而构建的?/p> <p><strong>2Q通过?cd本业务用户之间的合作事g提供支持Q提高业务操作的生?/strong> </p> <p>不同cd基本业务用户间合作是生力的W二大媄(jing)响因素。在M企业程中最多有3cd本用P分别代表了自适应pȝ?个方面:(x)代表操作的工人、代 表决{制定流E的l理和代表经环境(它价值@环成为闭环)的客戗h(hun)值@环的其他业务参与者,如供应商和政府代理,都扮演次要角Ԍq且它们的流E都 可以使用q?U基本流E(操作、管理和环境Q中的一个标识?/p> <p>业务是动态的。业务中最大的生力杠杆之一是变更引入流E的效率。业务中有两cd_(d)(x)l理引入的内部变更和消费者引入的外部变更。这些变更在某个? 间作为更新被引入C业应用中。一个有效的架构/设计必须解决q种动态性。一U理想的企业应用架构能够只需最的代码和配|改变就能适应大多数变更。由? 业务日益依赖支持它们q营的技术,一个快速而有效的更新应用Ҏ(gu)Ҏ(gu)个生产力十分重要?/p> <p>Zq一点,AEOP针对业务操作中的高合作只定义了3cM业架构:(x)</p> <ul> <li>静态架构:(x)U操作性的——目前所有的企业软g都属于此cR除了最单的配置变更之外Q完成业务流E变更通常都至要求IT部门停止应用的运转。静态架构的行ؓ(f)cM于汽车制造商在引入新模型时停止装配线?/li> <li>? 内部Q内部决{)驱动的动态架构:(x)提供了对动态操作的支持q实Cl理和工Z间的关系。在q种情况下,在正常操作期_(d)以及(qing)在变更动态应用于当前所有实 例时Q经理决{是被自动考虑到的。因为经理和工h在不同的旉U上操作Q他们需要处理内部决{的变更理q_来嫁接他们的zd。客户在其中不扮演指D? 的那些流E都属于q个cd?/li> <li>扩展的(内部和外部决{)动态架构:(x)提供了对动态操作的支持q全部3cd本用P工h、经? 和客P之间的合作自动化。这是最复杂的业务操作架构。它有两个不同的变更理q_Q一个针Ҏ(gu)常操作应用于内部决策的方式,另一个针寚w些希望改变订? 在正常操作时的执行方式的客户?/li> </ul> <p>注意Q在M企业中,不论什么类型的业务程Q它L与管?#8220;命o(h)和控?#8221;的结构和客户反馈“相连”的。结果,不论应用的目标业务流E是什么,每个应用都属?#8220;全动态类?#8221;?/p> <p>操作q_架构的动态性是以业务变更生命周期ؓ(f)中心的。它们受内部决策Q经理制定内部决{)和外部变_(d)客户可以军_l进行中的已有订单和服务施加变化Q驱动?/p> <p><strong>3Q通过提供在生命周?事gU别完全解耦的架构Q提高开发团队的生?/strong> </p> <p>前一个生产力因素跟业务变更对架构/设计的媄(jing)响息息相兟뀂理x况下Q架?设计中的业务变更可以通过变更理模块的界面来完成。该界面使经理和客户有权自动向工作中所有操作应用变更?/p> <p>有时Q变更需要开发团队实现新功能。在实现新功能时Q应用的架构/设计应该支持高生产力?/p> <p>当前Ҏ(gu)是将一pdlg归到有数据库讉K权限?#8220;业务?#8221;上。这U设计有一个基本错误。在q一设计中的数据库很可能是关pL据库Q它保存层次性信息或有状态信息的能力很差。它们很可能依赖~存机制Q它们需要消耗惊人的计算资源Q在后台持箋更新大量数据?/p> <p>无论怎样Q企业中的所有业务流E都?x)链接到M务实体(一个品或一个服务)。对于一个链接到M务实体的业务程来说Q现有历史是最重要的方面? 即Ҏ(gu)单的交易来说也是如此。去一个商店买东西的前提是Q你的金融资源将Z提供购买产品所需的够金?#8220;资源”Q而且商店?#8220;待售”的品。一个实 体的历史由最l描q它整个生命周期的事件组成。由于可能改变实体状态的事g可以在业务结构内的Q何位|和多个控制U别被触发,围绕q个业务实体动态构建的 AEOP架构必须是有状态、层ơ性和分布式的?/p> <p>׃生命周期围绕事g而构建,围绕它们可以构徏整个AEOP。Q何事件实现都可以按照同一U通用Ҏ(gu)完成Q整个生命周期可以被认ؓ(f)是反映主业务实体 转换信息?#8220;装配U?#8221;。因此,可以用相同的l构来实CӞq装配:(x)1Q从各需要位|(分布式)(g)索出来的信息元素Q?Q在某一时刻瞬间存在的(如,(g)? 一张信用卡交易的̎户信息必M实时方式完成Q信息元素;3Q可׃定的业务程实现的信息元素;4Q已l应用了一定的业务规则的信息元素?/p> <p>AEOP的另一个优势是能够围绕同一个事件模型设计两cd更管理。最l,q个操作q_的实现可以在事gU别解耦。操作^台可以作Z个插件API基础设施来构建,像Windows API是围l着桌面集成事g模型构徏的一栗?/p> <p>需要注意的是,文献中记载的EDAQ事仉动架构)跟AEOP事g模型是不一L(fng)。EDA是围l非l构化事件流构徏的,而AEOP是围l由一l生命周期模杉K接在一L(fng)l构化事件流构徏的?/p> <a _href="resource://Fig3_lg.jpg" ><img alt="" _href="img://Fig3.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig3.jpg" /></a> <p>?. AEOP控制层次模型——按变更cd分组的多个用戗多个客L(fng)应用、多个分布地炏V多个静态功?/p> <p>lg?qing)其事g的AEOP层包含5U:(x)</p> <ul> <li>OSU:(x)在这里可以找到所有OSlgQ如内核、文件系l、网l和I/O。OS可能q有GUIlgQ运行监各U应用及(qing)其活动的囑Ş化工h?x)用到它们?</li> <li>技 术Q在q里可以扑ֈ所有传l的Z服务器的lgQ如应用服务器、BPM引擎、业务规则引擎、数据库。这儿还有实CWeb和W(xu)eb服务、消息传递等标准 的组件。它们或多或扮演了和飞计中标准雉件相同的角色。螺母、螺钉、电(sh)动发动机、液压܇、电(sh)Uѝ连接器、椅、电(sh)子面ѝ马辑֯许多其他工业讑֤ 都是通用的,不只限于飞机。可是它们在可能简化和标准化设计的q程中扮演了一个关键角艌Ӏ?/li> <li>AEOP技术操作Q这是拥? 特定于AEOPlg的顶U别。这里有3U组件——安?启动/持久?恢复q_、系l^台和操作q_。它们分别代表了合作q行客户/服务器应用的3个小 l:(x)业务用户团队、技术支持团队和开发团队。每个组件实C特定的事Ӟ如技术支持团队能监测错误和重启应用。对于那些需要和外部pȝ合作的应用,q存? 被称为外部系l监督者^台的W?cȝ件。这个组件管理与外部pȝ交互的初始化、正常操作和错误译?/li> <li>AEOP业务操作U:(x)它是业务实现的顶U别,在操作^C下的一U。它也包含了3个主要组Ӟ(x)正常操作、内部决{管理变更和外部环境交互Q即客户决策Q管理变更。这里包括许多其他组Ӟ如外部系l操作翻译器、系lMap、许可证理器等?</li> <li>AEOP事g处理U:(x)q是实现的插件。在q一U实C被激zM务流E的整个正常操作。由于每个功能被分解成了事gU的函数Q整个架构围l事件模型被解耦了。这可以包括操作错误、操作变_(d)以及(qing)甚至安全讉K?/li> </ul> <p>昄Q在q个AEOP的简短描qCq有很多lg和事件没有被覆盖到。在下一节我们将围绕q?个组件进一步分析其l节?/p> <p>AEOP事g模型和事仉动架构(EDAQ之间存在着差异。EDA是一U提倡生事件、检事件、消费事件、对事g做出反应的Y件架构模式(来自l? 基百U)。EDA~失的是如何捕捉业务程的结构和控制。此外,AEOP区别?cMӞ一个针Ҏ(gu)常操作、一个驱动内部变更和一个针对外部变更。它们负 责不同的待处理模块,而EDA则用相同的Ҏ(gu)处理所有模块。AEOP使用生命周期在一个分布式、层ơ、有状态和动态的l构中将事g分组?/p> <h4>AEOP中的信息“装配U?#8221;是围l动态生命周期模式的多联装(Multi-shellQ容器构建的</h4> <p>所有现代Y件^台都是围l某UŞ式的容器模式构徏的。AEOP也不例外。基于J2EE的应用服务器甚至有两cd器:(x)Servlet和EJB。操作系 l可被视为是一U应用程序的容器。容器的概念?#8220;计算源是有限?#8221;q一思想有一定联pR容器在AEOP架构中的使用是不同的Q?/p> <ul> <li>容器创徏和管理的对象是业务实体资源的直接表示。例如,AEOP操作容器理整个订单生命周期Q不仅仅是反映现有计机资源的对象?</li> <li>容器可以区分作ؓ(f)正常事g序列一部分、改变受资源状态的调用和触发正常操作之外变更的调用。由于存在两cd_(d)因而每个容器都兌两类变更理模块。ؓ(f)了提供比现有静态架构更好的企业动态现实支持,AEOP容器支持受管资源的动态生命周期?</li> <li>? 器ƈ非类似J2EE应用服务器中的单独结构。各容器按照控制层次链接在了一赗集成的事g模型驱动了系l外产生事g的接收和处理。在q种情况下,既不在最 端也不在最底端的容器扮演了双重角色Q一个作源生命周期管理器Q另一个作为受理的资源。这是l予pȝ容器的多联装QMulti-shellQ结 构?/li> </ul> <p>整个AEOP架构和实现是围绕描述容器Q它理代表真实业务实体的资源)的模式而构建的Q对正常操作和变更进行了区别Q是反映业务控制层的结构的一部分?/p> <img alt="" _href="img://Fig4.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig4.jpg" /> <p>?. AEOP多联装(Multi-shellQ容器架构将技术置于顶端,业务操作|于中间Q事件处理置于底?/p> <p>每个AEOP容器可能处理3cMӞ(x)Q?Q由“事g模型”模块标识的正常操作;Q?Q来自由控制层中上层容器发出的内部变更的事Ӟ或(3Q来自由控制层中下层容器发出的外部变更的事件?/p> <p>除了ȝ命周期及(qing)其关联的事g模型Q那里还有被认ؓ(f)是正常操?#8220;静态部?#8221;的业务实体。例如,在正常操作期间不期望改变的项目h(hun)格或物理位置。它? 是通过所谓的“静态模?#8221;的模块捕捉到的。这q不意味着它们是固定且隔M业务动态之外。静态模型只有通过变更理程使用内部和外部变更来更新?/p> <p>AEOP控制层次可被用来讄容器的模式:(x)初始化、操作和关闭。只有处于操作模式的容器才能处理事g?/p> <p>在AEOP架构中,?个相兛_素:(x)1Q组件和控制的高U别技术结构,2Q操作^収ͼ3Q事件处理^台?/p> <p>高别AEOP技术代表整个应用,该应用可被认为是一个自适应pȝ。它?个主要^収ͼq且它们各自也都可被认ؓ(f)是一个自适应子系l:(x)上面的^台扮 演了理角色Q下面的q_扮演了环境角艌Ӏ每个^台自己都有定义良好的、实C自n功能的事件模型,q且它还要和其他两个q行交互。在每个q_上我们都? 以发C个仓储,它可以是一个缓存数据库或一个较传统的关pL据库?/p> <p>与外部系l的集成遵@相同的事件模型。根据外部系l类型的不同Q可以用的集成{略有两U。如果AEOP只有讉K持久化仓储的权限Q它可以使用始终 q行的调度Q务来查看数据库记录中的数据变更。第二个Ҏ(gu)依赖API调用Q如果可以将外部pȝ实现Ҏ(gu)在主业务实体变更时发赯用,那么可以实施这个策 略?/p> <img alt="" _href="img://Fig5.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig5.jpg" /> <p>?. 高别AEOP多联装(Multi-shellQ容器架?/p> <p>q?个^C的每一个也都是围绕特定生命周期元素构徏的。操作^台围l主业务实体生命周期Q系l运行时q_围绕用户?x)话Q安?持久化^台围l版本控制生命周期?/p> <p>虽然数据只能按照苛刻的事件模型蓝图来处理Q但是相同的数据却可以被M有权讉Kpȝ且有正确证书的用戯问。但是,很少有针对^台用L(fng)数据查看 工具。例如,pȝq行时^台有一个针对运行时错误的查看器Q它被用来监用户和分布式系l。这一工具也可在各子系l失效时重新启动它们?/p> <p>AEOP技术q实C一个完整的初始化过E。启动过E中Q在用户可以q行W一个Q务之前,应用必须l历3个步骤:(x)</p> <ul> <li><strong>启动应用Q?/strong>pȝ理员启动主应用。这是通过启动像TomcatQJ2EE servlet容器Q以?qing)Axisq样的容器(Web服务q_Q做到的。应用可以将Spring框架加蝲C个轻量容器中,q用Spring bean配置文g加蝲初始?#8220;启动”模块?#8220;启动”模块初始?#8220;pȝ”模块。该模块负责d用的编码配|。它q可能包含对现有q程数据源的连接、读? q程部v的应用版本的Web服务端点、测试方法和对各U分布式pȝ的开放互联性,以及(qing)提供正常操作、性能和日志相x据的功能。生数据的主要用户是开? 者和技术支持?/li> <li><strong>安装/启动/持久?恢复 “pȝ”模块Q?/strong>q个模块实现了所有系l相关的功能Q包括检查系l配|。它的主要功能是一个包含所有资源(q程数据源、用戗版本、集中的服务器、连接、安全数据等Q及(qing)其状态的pȝMap载入~存。该模块提供了应用监视器。这个模块的主要用户是技术支持。步骤:(x) <ul> <li>此阶D늚W一个步骤是验证分布式系l上Uƈ正在q行。如果远E系l没有激z,一个被调度的操作变更将被发送给操作pȝQ由它那些依赖它们的Q务无效。它q将把它们的~存数据设ؓ(f)“q时”。它q将l应用A表盘发送一个信Pq在日志中记录?</li> <li>一旦这个工作完成,它就验证那些q程数据位置的Y件版本是否正。如果不正确Q它?yu)它们失效Qƈl应用A表盘发送一个信号和日志记录的动作?</li> <li>最后一步是(g)查那些远E分布式pȝ的数据定义。如果它们改变了Q将采取同前一zd相同的步骤?/li> </ul> </li> <li><strong>启动d用运转:(x)</strong>q是用户可以讉K应用之前的最后一个步骤。它?yu)操作上下文Q连同所有激zȝ用户实例和它们的状态蝲入缓存。操作上下文的一部分是指向分布式pȝ数据?qing)其状态,以及(qing)q些分布式系l操作上下文的指针。这个模块的主要用户是业务用戗?/li> </ul> <img alt="" _href="img://Fig6.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig6.jpg" /> <p>?. pȝ控制层񔼋定?个主要容器的状?/p> <p>初始化之后,同一架构被用来控制主应用的操作就l状态。它?个场景:(x)</p> <ul> <li>用户q行/创徏查询时生的错误Q这是最普通的场景。一旦错误被操作模型子^台检到Q系l就被设|成“操作错误”模式Q一 条消息将被发送给pȝ模型子^収ͼq且待显C的新状?警报被发送给监测d用的技术支持团队。出于日志记录的目的Q这是给开发团队的信息Q,同一错误? 被发送给安装/持久?恢复模型子^台。用户也收C条显C当前事件状态以?qing)可用选择的消息。一个选择是由前一步恢复实例。因为整个操作是围绕保证前一 事g被成功完成的事g模型构徏而成的,qo(h)q一选择成ؓ(f)可能?/li> <li>l理或数据源理员改变操作上下文Q在q个情况下,d用被讄成特D的“操作变更”模式。当前受变更影响、正在运行Q务的所有用户都被通知。他们有两个选择Q要么经历一个实例更新过E,要么单地忽略?</li> <li>产生了一个环境系l错误:(x)在这个情况下Q监IT环境的技术支持团队会(x)得到通知。它是通过能够监测集群或J2EE/NET应用服务器的工具做到的。此Ӟd用将试图记录最q的zd或帮助调试的应用服务器堆栈信息?/li> </ul> <p>接下来的l节是关于AEOP操作q_的。事件模型是围绕业务实体的类型构建的。每个品类型的服务有其自己的生命周期,它由自己的事件蓝图表C。事 件蓝图是定义良好的有序事仉合。每个蓝囑օ联一l变更类型。内部或外部事g可以是正常操作的一部分Q或可以代表不同cd的变更。每个事件必被清晰地标 出,因ؓ(f)它是要被一定的模块处理的。这U方法不同于事g驱动的架构方法,后者将事g视ؓ(f)“在你的企业内部或外部发生的值得注意的东?#8221;。它也不同于 EDAQEDA是以事gl构Z心的Q比如它需要有事g头、事件体、事件时戳等。AEOP没有Mq些限制Q因为整个结构是由它的类型决定的?/p> <img alt="" _href="img://Fig7.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig7.jpg" /> <p>?. AEOP?#8220;信息装配U?#8221;是围l业务操作的容器被构建的</p> <p>操作q_使得3cd本用户——工人(他们支持正常操作Q,l理Q他们触发内部操作变_(d)和外部业务团体(即用P——之间的交互自动化?/p> <p>最后一个要详细描述的^台是AEOP事g处理?#8220;装配U?#8221;概念能在过一个世U的旉里如此流行,其中一个原因就是,每一步可以轻易地和其余的步骤 解耦。除此之外,不管他需要执行什么工作,每个“岗位”的工人都遵循相同步骤。当一个品的d例到达这?#8220;岗位”Q它?yu)像一个需要用各U零?#8220;填充 ”的空 “?#8221;一栗这些零件有两类Q在当前“岗位”待组装的Ҏ(gu)零gQ对装配q程只v帮助作用的零Ӟ我们U这些零件ؓ(f)“工具”。例如,一?#8220;工具”可能是帮? 装配q程的某U胶水。这三个待组装元素有它们自己的仓库,它们有自q“到达”旉安排Qƈ且它们遵循特D的装配q程逻辑。一旦组装完成,在到达下一?#8220; l装岗位”之前Q那个零件实例不?x)发生Q何事情?/p> <p>“信息装配U?#8221;跟真实的装配U概念非常相伹{在事g处理期间Q我们遇到的是同cM息:(x)代表M务实体的“?#8221;Q特定于一个事件和需要被增加实例的信 息,以及(qing)被称?#8220;工具”、只特定于需要被增加事g的信息?#8220;工具”cd信息的主要特征是Q它是有限的Q可以ؓ(f)同一事g多次使用它,q且在处理事件过E中? 可能把它“用光”Q在某种E度上类D配过E期间用来粘住零件的“胶水”。在订单处理中,“工具”信息的一个例子就是企业给客户的赊账限额。他可能一ơ? 使用所有可用赊账限额支付品,或者他可能军_只用部分,他可以用它支付多次购买Qƈ且在一个购买过E中他可能把?#8220;用光”了?/p> <p>另外它与“仓库概念”也很怼?#8220;待装?#8221;信息对何时开始检索它有明的规则。例如,当客L(fng)信用卡支付帐单时Q̎户信息是实时从银行检索出来的。保存在M其他数据“仓库”中的值都不是一个有效的倹{?/p> <p>处理事g期间Q从各系l取信息可以通过事g“定位”层和事g“调度?#8221;层来完成。只有在完成q两步之后,“信息”才能按照逻辑q行“装配”?#8220;定位 ”层用一U面向消息的lgQ?#8220;调度?#8221;层用以调度Z心的lgQ?#8220;逻辑”层用BPM/业务规则引擎作ؓ(f)ȝ件。次序L不变的?/p> <p>调度器在架构/设计中的d不仅仅是安排不同d的时_(d)它的另一个Q务是帮助设计一个在事g层完成控制状态变化的多线E架构。这是通过使用调度? 作ؓ(f)一个事件模块做到的Q它把在状态变化期间可能有q行d的流E{换成单独?#8220;泳道”。这P我们可以在事g层像调度器处理每个事件子d那样来实? 状态变化逻辑了。这P程“泳道”中的失效整个pȝ处于一个清晰可辨的状态中?</p> <img alt="" _href="img://Fig8.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig8.jpg" /> <p>?. AEOP事g处理容器——定位、调度和逻辑</p> <p>l合所有这3个元素,“信息装配U?#8221;可以被构建成对Q何企业系l都是通用的,不论企业涉的领域和规模大小。这与装配线的方法类|h于汽车制造业Q后来扩展至所有其他制造行业?/p> <p>AEOP事g处理容器针对内外部变更有两类变更理模块。假如一个事件被标识Z个变_(d)决策表将把具体的变更cd和特D事件联pv来。这个架构是 作ؓ(f)一l插件来设计的,它是Ҏ(gu)现有实例的状态被调用的。例如,在订单处理中Q对于预付和未付订单而言Q处理h(hun)格变更的Ҏ(gu)是不同的?/p> <h4>ȝ——数天内完成架构、数周内完成设计、数月内完成实现——构建集成的DBA服务器端基础设施的简易之?/h4> <p>AEOPҎ(gu)有诸多优炏V主要优Ҏ(gu)它标准化了服务器端应用的架构Q这正是当今IT所~失的。它?yu)这个服务器端实现{变成事g插g代码的编写,cM微YWindows应用的编写方式?/p> <a _href="resource://Fig9_lg.jpg" ><img alt="" _href="img://Fig9.jpg" src="http://www.infoq.com/resource/articles/beyond-soa-dba-part-2/zh/resources/Fig9.jpg" /></a> <p>?. 自适应操作q_支持动态、拥有控制层U、分布式和有状态的业务</p> <p>使用AEOP实现应用?步骤包括Q?/p> <ol> <li>获取对象和变更cd</li> <li>获取3个^台的lg</li> <li>构徏每个事g处理?个模?/li> </ol> <p>在这个架构中Q像SOAq样的技术和架构概念扮演配角。像BPM引擎、调度器、消息传递这L(fng)lg在架构中有明的角色Q但是它们对设计的媄(jing)响很 。这cM于飞计中各零件扮演角色的方式。电(sh)动发动机、电(sh)Uѝ螺母和螺钉Ҏ(gu)个飞机的功能臛_重要Q但是它们对设计q程却非如此?/p> <p>׃q种Ҏ(gu)不依赖于业务Q可以构建类似微软Visual C++向导或Visual Basicq样的工兯一步实现q程自动化。这不仅提高了开发团队的生力,而且q有助于开发者关注实现的真实斚wQ而不是与错误的架?#8220;搏斗”?/p> <p><strong>卛_到来的第三部分——案例研I和局外h观点 <br /> 本文在W三部分l箋Q它探讨一个真实实现的案例研究和新的自适应pȝ理论的简要ȝ?/strong></p> <p>查看英文原文Q?a target="_blank" >Beyond SOA, a New Type of Framework for Dynamic Business Applications - Part II</a>?/p> <p><br /> </p> <p>转自Qhttp://www.infoq.com/cn/articles/beyond-soa-dba-part-2<br /> </p> <p><br /> </p> <img src ="http://www.tkk7.com/jhyan/aggbug/232644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jhyan/" target="_blank">Joshua Yan</a> 2008-10-06 13:08 <a href="http://www.tkk7.com/jhyan/archive/2008/10/06/232644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>越SOAQ动态业务应用的C业应用框?1) 转蝲http://www.tkk7.com/jhyan/archive/2008/10/06/232641.htmlJoshua YanJoshua YanMon, 06 Oct 2008 05:05:00 GMThttp://www.tkk7.com/jhyan/archive/2008/10/06/232641.htmlhttp://www.tkk7.com/jhyan/comments/232641.htmlhttp://www.tkk7.com/jhyan/archive/2008/10/06/232641.html#Feedback0http://www.tkk7.com/jhyan/comments/commentRss/232641.htmlhttp://www.tkk7.com/jhyan/services/trackbacks/232641.html

W一部分——即使拥有全部需求和最佌计,你的架构仍然很可能失败,原因在于……

目前的管理学校,教育培养的是公司l营者。设计公司几乎没有引起重?#8230;…几乎从来没有MZؓ(f)了取得计划的增长和稳定性,有意识和有思想地设计一个组l?/strong>

—?nbsp; Jay W. ForresterQ设计未来(1998Q?/strong>

介绍

在一名为《动态业务应用势在必行(The Dynamic Business Applications ImperativeQ》的论文中,Forrester的高U分析师John R. Rymer指出了当今应用的一个致命缺P(x)

当今应用qZd找一U将孤立的信息和功能l映到他们d和过E的Ҏ(gu)Q它们强qI(xin)T人员花高额预来跟踪不断变化的市场、策略、规章制度和业务模型?/p>

在下一?q内QIT的主要目标应该是发明C代企业YӞ适应业务和业务工作,同时能随业务演变而演变?/p>

ForresterU这个新生代为动态业务应用, 了和业务q程?qing)工作(Zh而设计)的紧密配合,对业务变化的自适应Qؓ(f)变化而构建)。在q个阶段Q动态业务应用的需求比创徏它们所需的设计实跉|? 晰。工具都是现成的Q面向服务架构(SOAQ、业务过E管理(BPMQ和业务规则领域中的先驱——包括独立Y件开发商QISVQ——已l开始向我们展示? q种Ҏ(gu)。现在就是开始这D|E的时候?/p>

在这由两部分组成的文章中,我们?x)从架构和方法论的角度,采用历史的观?gu)看待q些动态业务应用(DBAQ的发展。我们的目标是获得一U能使应用容易适应业务变化和其他必要修改的构徏Ҏ(gu)。随着企业?1世纪x灉|性,DBA是业务和IT在未来几十年内成功的关键?/p>

?1. 灉|性和效率—?1世纪企业的两个主要驱动力

动态性对我们意味着什么?

在Y件工E领域,许多框架或品都声称h自适应性。在我们设法理解一个解x案在适应变化斚wI竟有多好之前,需要给pȝ是如何变化的——它们的动态性——下一个可靠的定义?/p>

早期的面向对象方法论认识?a >[1]Qؓ(f)了ɾpȝ分析中立Q它必须Z两类现实世界的需求:(x)

  • 现实世界的实?—?攉现实世界实体的信息和它们间的关系Q有助于分析师开始以一U系l的、结构的、客观的观点来看待需求,而非一U技术的、主观的观点
  • 现实世界的事?—?pȝ行ؓ(f)只由改变现实世界实体状态的事g的出现来驱动

在这L(fng)背景下,对于每一个被分析的系l,我们总能识别一个或多个最重要的实体。每个实体都又包?个关联元素:(x)事g、状态和生命周期。每个事件代 表状态中的一个变化,所有普通实体状态的有序和代表了一个生命周期。但是,那些触发状态变化且是正常流E一部分的事件与那些触发状态变化但不是正常程一 部分的事件之间有明显的差异。例如,当一个品订单被提交之后Q一l可能发生的事g包括付费处理和订单交付。当一个用户变更订单或当企业改变h(hun)格时Q我? 不能认ؓ(f)q些动作是正常流E的一部分Q因此它们与实体Q如订单Q的生命周期无关。核心实体实例的生命周期单独定义了在正常操作中系l最有可能处理的东西? 所有其他事件类型,如变化或中间步骤Q被区别对待?/p>

q个场景对很多工E师都不陌生Q一个系l模型包含一个核心实体结构,该实体具有一l事Ӟq些事gl成了实体的生命周期。这个系l模型对分析师和? 计者都很清C易于理解。徏模工P如有限状态机、实体关pd、实体状态{换图和数据流图,Z帮助q种Ҏ(gu)已经l过了快20q的完善。那些ؓ(f)复杂pȝ Q如I客380或F-22Q后者是世界上最高的战斗机Q服务、拥有数十亿行代码的软g是q样被编写出来的。用对象流图(它是捕获事g和状态{换的? 模型Q虚拟化实体生命周期是这个模型的关键。在q个情况下,架构可以被认为是静态的Q因为整个系l状态在旉轴上的Q意一炚w是确定的?/p>

?2. 事g模型、状态变化和生命周期是正常操作的核心

普通事件、状态、生命周期间的关p,以及(qing)从其他事件类型中分出的普通事件是理解所的动态操作框架的基础。正如James Martin 和James Odell很久以前在《面向对象分析设计》中所写的Q分析师、设计师和实现者都应该使用同一pȝ模型。分析师使用数据图思考,设计师用结构图思考,E? 序员使用Java和SQL思考。在数据上下文中,分析师识别对象类型,q思考改变对象状态的事g。最l用户也理解q个相同的认识。他们也应该按照对象c? 型、事件、对象状态的变化Q以?qing)触发和控制事g的业务规则进行思考。Martin和Odell了对象流囑֯pȝ设计师的重要性:(x)“事g模式适合按照? 件、触发器、条件和操作来描q过E。但是这U方式不适合描述大型复杂q程。一个系l领域常常太大或太复杂,无法表示成事件和触发器。此外,可能只有一个高 U别的认识才是必要的。这Ҏ(gu)略别的规划其正确。在q样的情况下Q一个对象流图是有用的。对象流图(OFDQ与数据图QDFDQ类|因ؓ(f)它们描述 了活动和其他zd间的接口。在DFD中,q个接口传递数据。在对象技术中Q我们不再限于数据传递。相反,囑ֺ该表CZ一个活动传递到另一个活动的Mcd 事物Q不论它是报表、零部g、已完货物、设计、服务、硬件、Y件——或数据。简而言之,OFD指的是被生的对象Q以?qing)生和交换它们的活动?#8221;

Z捕获与业务操作关联的信息,业务分析师用价值流E图QValue Stream MappingQ对OOҎ(gu)行了补充。h(hun)值流E图h于丰甎ͼ与精益制造关pȝ密。美国国家环境保护局h(hun)值流E图定义?#8220;用来认识那些产生产品或交 付服务的zd序列与信息流E的_q程映射Ҏ(gu)?#8221;此处的关键词?#8220;产品”?#8220;服务”。它们显C合适的信息程在整个企业中扮演的统一角色?/p>

把过E流囑֒价值流E图两个概念l合在一起后Q它产生了一个完全代表整个企业经营范围、可被方便翻译成OOQ图2Q概늚框架基础?/p>

但是Q许多系lƈ不是静态的Q它们变化无常的行ؓ(f)无法被一l关pd事g捕获。事实上Q它们发生在不可知的[2]未来Q传l用来捕获它们动态特点的工具不v作用。所有的业务应用和绝大多数现实世界的pȝ都归于此cR这些系l,Z它们和其他外部系l的交互方式Q处?cd化:(x)

  • 正常工作 —? l成d体或实体们生命周期的正常事g序列。通过每个事g——实体改变其状态——通常可以方便地定义一个过E。在正常工作行ؓ(f)内部Q有些操作上下文元素? 期望被改变。例如,当一个客戯购一个品时Q在整个提取订单、准备订单和交付订单的过E中Q诸如h(hun)根{组成和交付方式{是不期望被改变的?
  • 内部变化 —?如上所qͼ在整个核心实体生命周期内Q某些上下文元素不期望被改变。在现实世界中,qƈ不L真理Q因为管理决{或其他因素?x)迫使上下文元素变化。我们称内部pȝ属性的变化是内部变化?
  • ? 部或环境变化 —? 不管一个企业如何相信他?#8220;拥有”一个客P但是q个客户L保留改变他或Ҏ(gu)志的自由。一个系l不太可能与外部pȝQ如客户或供应商QL有一?#8220;固定 ?#8221;合同。然而,正常工作很可能围l这?#8220;固定?#8221;规则集合q行设计。我们称pȝ外部引v的变化ؓ(f)外部变化?/li>

要对现实世界pȝ建模Q就必须处理好这所?U变化类型。这U模型与静态架构模型相比,在管理复杂性上有了极大的提高。从正常工作的观Ҏ(gu)看,内部 和外部系l完全独立于M息流q行。内部和外部pȝ甚至有它们自q操作——管理有其自w的决策周期Q客h其自q操作环境——由各自的信息流描述。就 信息而言Q这3U系l分别运行在3个^行宇宙中。解册3U非同步信息的唯一办法是为每个信息流实现一个独立全面的变更理。这U复杂交互在? 3Q动态操作图Q中表示?/p>

邮轮公司l客h供的服务可以作ؓ(f)解释动态操作的例子。在订购Ӟ一个客户会(x)军_在游览期间他计划参与的服务。但是,不仅客户可能在游览前和游览中 改变LQ而且邮轮公司也可能会(x)Z利用新机?x)或应对未知事g改变服务。按照当前方法设计的pȝQ大部分变更都以极高的运营成本h工处理。用基于动态业 务应用架构原则设计出的系l,来自客户和内部管理决{的变更׃个与正常工作完全集成的变更管理子pȝ负责。这不仅能降低成本,而且q提高了服务质量Q甚 臛_以最优化q营来提高利润。因为是完全通用的,它还可以重用标准lg。最l结果对于参与的每个人、业务、IT和客h说是多赢的?/p>

?3. 动态操作有3个维度——正怺件、内部控制和外部反馈

动态业务应用的目标之一是使设计和软g实现变得单,以支持对所有业务来说司I惯的动态系l。以我们的经验,与一个框架优先的工程学相l合是构Z个DBA的最有效的技术方法?/p>

设计企业pȝ要求框架先行

构徏动态业务应用说h单,做v来难。工E,包括软g工程Q都采用了有癑ֹ历史的框架优先方法。设计一座桥梁、一枉机或者甚x一个Y件应用都 使用相同的方法:(x)一个设计团队先攉需求,然后使用一l定义良好的框架步骤来设计和构徏pȝ。在设计桥梁和其他工E系l时Q现有框架已被证明非常成功。但 在用它来ؓ(f)业务pȝ开发Y件时Q却?l)C壁。这两类pȝ之间有一个根本区别。在设计桥梁和飞机时Q最l结果L一个拥有静态架构的pȝQ当变更发生Ӟ? 增加桥梁负重或飞机速度Q整个系l可能就要重头重新设计。不q的是,软g也常怋用一个静态架构进行设计:(x)每当一个非预期的变更被引入到运营中Ӟ很可? 所有事情都停了下来Q用包含新增功能的pȝ替代现有pȝ。因Z务运营在一个不断变化的环境中,而且比以往更依赖ITpȝQ这U停——走式的解决Ҏ(gu)? 不可接受的。持l升U和在企业基设施中集成系l的成本已经辑ֈ了无法支撑的地步?/p>

依赖业务涉众作ؓ(f)我们全部需求的输入首先是个问题。考虑到需求,目前q没有真正适合动态操作的“框架优先”软g设计Ҏ(gu)。甚臛_内基梅隆软g工程 学院也表C架构是由场景驱动的Q场景以涉众输入为基被创建出来:(x)“诱导一个Y件密集型pȝ的业务目标是标准架构设计和分析方法的一个组成部分。业务目? 是驱动方法的引擎Q通过它们的实现作ؓ(f)场景……一个理想的设计Ҏ(gu)或过E必考虑众多涉众和众多媄(jing)响?#8221;

作ؓ(f)工程师,当我们收集系l需求时Q我们怎能知道我们得到了正的场景或是否遇上了正确的涉众?我们又如何能说明业务未来的变化,而这些变化通常q参与的涉众都不知道Q?/p>

“企业l营者和企业设计师之间存在着Ҏ(gu)区别。ؓ(f)了说明这点,考虑一下在一枉机成功操作背后的两种最重要的h。一个是飞机设计师,另一个是q架? 机的飞行员。设计师创造的飞机q^庸的飞行员都可成功驾驶。一般情况下Q经理更像是飞行员而非一个设计师。一个经理管理一个组l,q和一个飞行员N飞机 没什么两栗飞行员的成功依赖于那些创造了一架成功飞机的飞机设计师。另一斚wQ是谁来设计一家由理者管理的公司呢?几乎从没有Q何h有意识和有思想? 去设计一个组l,以取得有计划的增长和E_性。在当前的管理学校中Q教育培ȝ是企业的l营者,而如何设计企业几乎不受重视?#8221;

在几q前完成的报?#8220;设计未来”中,MIT的教授和pȝ动态之父Jay ForresterQ指个问题是我们Z业设计系l的基本限制Q?/p>

Forrester的观察进一步当前的企业架构方法失效。在我们需要设计一个企业系l架构时Q作为知识主要来源的涉众甚至是错误的分类。他们是? 业的“用户”Q不?#8220;设计?#8221;。在设计飞机Ӟ飞机设计师决不可能去询问飞行员或乘客关于飞机刉方面的事情。但是,在学校、工E或MBA评中却没有? 业设计这门课?/p>

那么回到企业架构Q其中有一个根本的断档。企业架构的“用户”是企业涉众,很可能是熟?zhn)企业动态性的企业毕业生,但是他们不熟(zhn)工E方法。企业系l? 的设计者和构徏者——Y件工E师——熟(zhn)静态框Ӟ但是对动态框架却很陌生。事实上Q还没有说明业务动态的框架。根据企业架构框Ӟq是一个需要填补的~? 口。这个框架只描述企业是如?#8220;被设计的”Q但是也?x)定义开发\U图和主要组Ӟ使用它们来构Z业的支持pȝ?/p>

?4. 企业架构的业务和工程Ҏ(gu)

我们Ҏ(gu)改变我们架构和设计信息系l的方式Q以一U不要求业务涉众作ؓ(f)主要输入的方式。我们推荐利用一个以业务实体生命周期和事件模型ؓ(f)中心的框架作为架构的主要输入来源。业务场景只被用来微调一个已完架构,而不是作Z要驱动力?/p>

q种框架优先Ҏ(gu)从一开始就说明了业务动态,而不是事后诸葛亮。它暗示被设计的企业应用是动态适应的,而不是像׃天的Ҏ(gu)论所实现的那h静态适应的。这U方法成数量U的减小了开发和l护软g的成本,q砍掉了与改变和l护现有pȝ直接相关的超q?0%的IT开销?/p>

Fig 5. Z框架的Y件解x案开发方?/strong>

在我们徏议的Ҏ(gu)中,业务场景只被作ؓ(f)一个已完架构的微调Q而不是主要驱动力。我们将我们的直觉、经验和技巧输入到设计q程中越晚,产生D巨大损失的错误的可能性就少。由涉众输入引v的需求变更会(x)在已l徏好的现有解决Ҏ(gu)框架中处理,减少了风险和延迟?/p>

一份Standish报告研究表明Q超q?千万元的项目,成功率只?%。行业咨询和哈佛(jng)商学院教授Andrew McAfee表示Q部|如此高成本技术(如ERP、CRM、供应链理、电(sh)子商务和其他企业应用Q组l的成功率在25% ~ 70%之间。McAfeeȝ_(d)(x)“q些面(f)的问题ƈ非是单独的,它们都是同一事情的不同例子,基本上都是用IT改变业务q程的结果?#8221;。最q,q些? 分比有所提高Q但是对于复杂系lIT仍缺乏清晰的路线。框架优先的Ҏ(gu)能业务变化集成到IT实现中,q提供了业务和技术之间更清晰的{换,可以成功率 提高接近100%。徏构复杂系l的旉由几个月或几q羃短至几天?/p>

动态操作的服务器架?—?忘记SOAQ迎接信息装配线

90q代早期Q事件几乎是每本面向对象Ҏ(gu)Zc中的核心角艌Ӏ随着象Windowsq样ZGUI操作pȝ的出玎ͼGUI开发^C靠复杂事件模型来设计和构建单个应用。但是,在客h-服务器环境中Q服务器端的事g处理LZ一个简单得多的模型?/p>

当基于Web的技术(如J2EE?NETQ开始替代传l的客户?服务器应用,客户机和服务器都l历了根本的转变。客L(fng)的富OS事g模型? Web览器和原始的脚本语a代替。在服务器端Q事件处理由无状态、扁q的、静态架构所替代。其方式非常cM网传lWeb览器的方式?/p>

Z模拟现实世界的需求,需要一个有状态的、层ơ的、动态的和分布式的架构,设计必须严重依赖数据库来存储范围q泛的各U动态信息。但是根据其? 义,关系数据库非帔R合存储不常变化的数据间关系。保存动态、分布式、层ơ的和有状态信息要求一个不同的基础设施Q它不是以关pL据库Z心的?/p>

ZWeb的技术ؓ(f)支持现实世界pȝ引入了其他挑战。当J2EE应用服务器在一个分布式环境被用时Q用Java作ؓ(f)~程语言的一个最大优势完? 没有了。Java虚拟机的垃圾回收从来没有被设计成能自动清除在多实例间交换的内存对象。在q种情况下,架构师和设计师必ȝ排整个对象生命周期,不考虑 ~程语言的能力。甚臛_数据保存在数据库中时Q这U相同的数据清除问题也变得非常困难?/p>

正如我们已经看到的,一旦我们能从正常工作中分离变化Q架构就能只依赖事g和生命周期进行设计和实现。围l生命周期进行系l设计已l经历了一个世U——它被称配线?/p>

在装配线?0世纪早期引入之前Q制造业的工作方式多多少和今天面向服务架构QSOAQ处理信息的方式一栗每个对于SOA服务的调用一般都被视 Z个无状态调用。ؓ(f)了说明以前调用的历史Q每个服务必d全实现如何处理系l内部状态。一旦需求改变,几乎所有服务也需要以成本极高的方式重新编码来? 变它们各自的实现?/p>

?6. 服务器架构是以事件模型ؓ(f)基础?/strong>

我们使用以事件模型和生命周期Z心的信息架构作ؓ(f)业务需求和pȝ架构的双向翻译^台。事件模型在下一U被扩展成四个基本模型:(x)状态、分布式、层ơ和动态。所有这5个模型可被基需求和架构模型中的业务或技术h员方便地解释Q?/p>

  • 事g模型/生命周期—? 它是构徏其他模型的基核心。对业务用户来说Q它是h(hun)值流Q反映?服务生命周期和ؓ(f)客户创造h(hun)值的q程序列。对技术h员来_(d)同一事g序列反映了代? 业务实体对象的状态变化。最l结果是Q事件模型扮演了解耦元素,大大化了设计和实现。事件模型还扮演了另一个重要角艌Ӏ因为其他四个模型是围绕事g模型 而构建的Q它q扮演一个集成^台。事实上Q事件模型是创造实现变更、层ơ和分布式组件的唯一办法?
  • 状态模?/strong>—?对业务用h_(d)q个模型扮演了企业的面板Q捕获当前经营的整体状况。对技术h员来_(d)它是pȝ的整体状态,它是全部生命周期实例的当前状态,以及(qing)它们的变化之和?
  • 分布式模?/strong> —?对业务用h_(d)q个模型捕获了其生命周期内控制?服务的各U组l。对技术h员来_(d)d体只能基于分布式模型来控制?
  • 层次模型—?所有业务都有代表管理层U的层次l构。所有系l设计应该在架构上反映这U控制层ơ。正如销售VP不能lC(j)EO下命令一P低层U的lg不能l高层的组件发送执?#8220;命o(h)”?
  • 动态模?/strong>—?l事件模型之后最重要的模型。业务用户用它来捕获^时必被处理的全部变更。如前所qͼ有两U变化类型:(x)外部Q如客户输入Q内部,如管理决{。对技术h员来_(d)动态模型被译成一个匹配各U事件、生命周期和变化cd的插件架构?/li>

q?个模型不仅可以被用在初始设计Q对贯穿整个pȝ生命周期的需求变更亦有裨益。它们一起Ş成了自适应pȝ设计所~失的框架步骤。这5个模型排除了用例作ؓ(f)企业架构的主输入的必要性。它们可以被译成一个清晰和全面的工E问题集合,与在桥梁或飞计中使用的方法类伹{?/p>

?7. 自适应架构是以5个模型ؓ(f)基础的信息架构结?/strong>

q?个模型定义了以信息变化和装配Uؓ(f)中心的动态业务应用通用架构。最重要的子pȝ是:(x)静态模型、变更管理、虚拟装配对象和事g处理。在下一个细化层U,q有两个子系l:(x)pȝ命o(h)和控制与持久化?/p>

q个架构q解决了在寻求一个适用于事务型工作隐ȝ通用解决Ҏ(gu)q程中长期存在的问题Q它是由Jim Gray[3]? 几十q前提出的。因为整个设计以单个事g的执行ؓ(f)中心Q不仅可以实?#8220;UdC一个装配步?#8221;Q而且也可实现“Ud到前一个装配步?#8221;。实现需要根据用? 的输入决定前往哪个“方向”。通过多个步?#8220;链接”在一P可以使用相同的架构实C个事务型工作的“撤销QUndoQ?#8221;操作?/p>

动态业务应用的一个关键元素是事g处理。用新的自适应pȝ信息理论Q可以用一个通用lgl构?#8220;执行”每个事g。这个组件用声明性编E来内嵌 业务逻辑、调用工作流引擎、调度器和业务规则引擎。这个实C仅可以极大加速自适应pȝ开发,而且可以使后期改变非常容易处理,也减了l护复杂集成的需 要?/p>

我们围绕事gQ操作)和事件生命周期创Z个供l控制、运营和环境的物理模型。生命周期控制器为离散事件管理装配信息。变更管理功能指导标准事件模型和个体事g内外部变更的执行?/p>

l论

我们已经讨论了扁q뀁无状态、静态、客L(fng)——服务器、基于Web的解x案的演变方式所带来的IT架构和层ơ、有状态、动态、分布式业务的现实世 界之间的p。我们还讨论了传l工E方法ؓ(f)什么不能支撑能支持动态业务的自适应pȝ的开发。我们展C两个问题的可能解x案可以用一U新的模型驱动架? Ҏ(gu)来找到?/p>

本文的第二部分将描述动态业务应用的可能架构Qƈl出一个案例研IӞ介绍我们概念的实际实现?/p>

参考文?/h3>

[1] Yourdon Systems Method —?Model Driven Systems Development —?Yourdon Press, 1993

[2] Eric D. Beinhocker —?"The Origin of Wealth", HBS Press Book,2006 —? 在他的新?#8220;The Origin of Wealth”中,麦肯锡公叔RU顾问Eric D. Beinhocker声称Q将l济视ؓ(f)一U静态、^衡的pȝ的传l观Ҏ(gu)在经受一场彻底的反思,包括为数众多的原则。新的中心是Q?#8220;复杂l济?#8221;Q其中经 被视ؓ(f)一U高度动态的、不断演变、几乎无法预的pȝ。这个摘录涉?qing)在未来未知时公司如何来制定战略?/p>

[3] Mark Whitehorn ,The Register, Interview with Jim Gray —?http://www.regdeveloper.co.uk/2006/05/30/jim_gray/

查看英文原文Q?a title="Beyond SOA: A New Enterprise Architecture Framework for Dynamic Business Applications">Beyond SOA: A New Enterprise Architecture Framework for Dynamic Business Applications



转自Qhttp://www.infoq.com/cn/articles/dynamic-business-applications



Joshua Yan 2008-10-06 13:05 发表评论
]]>判断js函数是否存在Q如果存在则执行http://www.tkk7.com/jhyan/archive/2008/09/25/231060.htmlJoshua YanJoshua YanThu, 25 Sep 2008 03:00:00 GMThttp://www.tkk7.com/jhyan/archive/2008/09/25/231060.htmlhttp://www.tkk7.com/jhyan/comments/231060.htmlhttp://www.tkk7.com/jhyan/archive/2008/09/25/231060.html#Feedback2http://www.tkk7.com/jhyan/comments/commentRss/231060.htmlhttp://www.tkk7.com/jhyan/services/trackbacks/231060.html
一定要dtry catch块,否则不v作用?br />
 1      try 
 2       {  
 3         if(typeof(eval(funcName))=="function")  
 4         {
 5             funcName();
 6         }
 7       }catch(e)
 8       {
 9       //alert("not function"); 
10       } 


Joshua Yan 2008-09-25 11:00 发表评论
]]>
document.body.scrollTop 值Mؓ(f)0的解x法(转蝲Q?/title><link>http://www.tkk7.com/jhyan/archive/2008/08/29/225618.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Fri, 29 Aug 2008 09:00:00 GMT</pubDate><guid>http://www.tkk7.com/jhyan/archive/2008/08/29/225618.html</guid><wfw:comment>http://www.tkk7.com/jhyan/comments/225618.html</wfw:comment><comments>http://www.tkk7.com/jhyan/archive/2008/08/29/225618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jhyan/comments/commentRss/225618.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jhyan/services/trackbacks/225618.html</trackback:ping><description><![CDATA[<div class="p9x11hr" id="articleBody"> <p>做页面的时候可能会(x)用到位置固定的层Q读?document.body.scrollTop 来设|层的位|,像这P(x)</p> <pre class="code">window.onscroll = function ()<br /> {<br /> var oFix = document.getElementById("divfix");<br /> oFix.style.top = document.body.scrollTop + "px";<br /> }</pre> <p>可是怎么没有辑ֈ预期效果呢,输出 document.body.scrollTop 的g看,一直都?0。原来是 DTD 的问?要是面直接?开头的话就没有问题了。但是要W合 web 标准QDTD 当然是不能少的。具?DTD 时用 document.documentElement.scrollTop 代替 document.body.scrollTop 可以了?/p> <pre class="code">window.onscroll = function ()<br /> {<br /> var oFix = document.getElementById("divfix");<br /> oFix.style.top = document.<span id="h5dbvdf" class="caution">documentElement</span>.scrollTop + "px";<br /> }<br /> </pre> <p>~者注Q?/p> <ul> <li>面h DTDQ或者说指定?DOCTYPEQ时Q?document.documentElement?/li> <li>面不具?DTDQ或者说没有指定?DOCTYPEQ时Q?document.body?/li> <li>?IE ?Firefox 中均是如此?/li> <li>Z兼容Q可以用如下代码:(x) <div id="3hnhxrp" class="code">var scrollTop = window.pageYOffset  <br />                 || document.documentElement.scrollTop  <br />                 || document.body.scrollTop  <br />                 || 0;</div> </li> </ul> <br /> 转自Qhttp://www.cftea.com/c/2008/06/U1FSRIC247DWTK2M.asp<br /> </div> <img src ="http://www.tkk7.com/jhyan/aggbug/225618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jhyan/" target="_blank">Joshua Yan</a> 2008-08-29 17:00 <a href="http://www.tkk7.com/jhyan/archive/2008/08/29/225618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://xsdjiagu.com" target="_blank">ʪôýˬƵ</a>| <a href="http://qiwangxuan.com" target="_blank">޳AVƬ߹ۿ </a>| <a href="http://www4438xx2.com" target="_blank">޹Ļ߹ۿ</a>| <a href="http://gttest5.com" target="_blank">޹߹ۿ</a>| <a href="http://sdtuoliuta.com" target="_blank"></a>| <a href="http://jldledu.com" target="_blank">Ӳֳִˬѿ </a>| <a href="http://8b22.com" target="_blank">ɫݺݰվ</a>| <a href="http://26cgw.com" target="_blank">ƷAVһ</a>| <a href="http://wwwabxx.com" target="_blank">Ů18ëƬƵ</a>| <a href="http://343dd.com" target="_blank">þùƷվ</a>| <a href="http://flowsns.com" target="_blank">av˾Ʒ</a>| <a href="http://txtmp3.com" target="_blank">޹ƷþþþϼӰԺ</a>| <a href="http://gwcyy.com" target="_blank">ͼƬ߹ۿ</a>| <a href="http://guanxianedu.com" target="_blank">޾ƷѶ</a>| <a href="http://yy1514.com" target="_blank">ĻmvߵӰ</a>| <a href="http://339258.com" target="_blank">վѹۿ</a>| <a href="http://bbav04.com" target="_blank">޹Ů޹</a>| <a href="http://zcrencai.com" target="_blank">selaobanƵѾƷ</a>| <a href="http://caoliusq1024.com" target="_blank">ۺɫƵ</a>| <a href="http://txa6.com" target="_blank">޳һ</a>| <a href="http://cztbm.com" target="_blank">EEUSSӰԺWWW߹ۿ</a>| <a href="http://600c81.com" target="_blank">þþƷ69Ʒ</a>| <a href="http://miya863.com" target="_blank">Ʒһvr </a>| <a href="http://ystchem.com" target="_blank">ƷѴƬ</a>| <a href="http://yg1617.com" target="_blank">޻ɫ߹ۿ</a>| <a href="http://scienfood.com" target="_blank">þþžѸƵ</a>| <a href="http://959901cc.com" target="_blank">A߲</a>| <a href="http://hetaoqpj.com" target="_blank">Ļ</a>| <a href="http://gw311.com" target="_blank">߹ۿձһ</a>| <a href="http://www-01313.com" target="_blank">˹վvƬѹۿ </a>| <a href="http://35633487.com" target="_blank">þ޴ɫĻþþ</a>| <a href="http://2222jjjj.com" target="_blank">ĻƵѹۿ</a>| <a href="http://jinmenonline.com" target="_blank">͹ƷƵƷ</a>| <a href="http://hkcp168.com" target="_blank">˾Ʒ2020</a>| <a href="http://www611rr.com" target="_blank">18δֹѹۿ</a>| <a href="http://sdhgjscl.com" target="_blank">ģ߹ۿ</a>| <a href="http://xiamenwave.com" target="_blank">ŮȸͰƵѰ</a>| <a href="http://9v9av.com" target="_blank">AV鶹Ʒ</a>| <a href="http://langya2255.com" target="_blank">벻޳?Ƭ</a>| <a href="http://js-jiarui.com" target="_blank">޹Ʒþ</a>| <a href="http://868664.com" target="_blank">ѿaɫƬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>