﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-huyi-文章分类-通用技术</title><link>http://www.blogjava.net/huyi/category/514.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 02:46:42 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 02:46:42 GMT</pubDate><ttl>60</ttl><item><title>毕业设计开题报告</title><link>http://www.blogjava.net/huyi/articles/2277.html</link><dc:creator>HuYi's Blog</dc:creator><author>HuYi's Blog</author><pubDate>Mon, 21 Mar 2005 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/huyi/articles/2277.html</guid><wfw:comment>http://www.blogjava.net/huyi/comments/2277.html</wfw:comment><comments>http://www.blogjava.net/huyi/articles/2277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi/comments/commentRss/2277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi/services/trackbacks/2277.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">1.</SPAN></B><B><SPAN style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt">研究内容</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本论文研究以下内容：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; tab-stops: list 42.0pt; mso-list: l1 level2 lfo2"><SPAN lang=EN-US>1.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">软件设计方法学的历史。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; tab-stops: list 42.0pt; mso-list: l1 level2 lfo2"><SPAN lang=EN-US>2.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的出现。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; tab-stops: list 42.0pt; mso-list: l1 level2 lfo2"><SPAN lang=EN-US>3.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的应用范围。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; tab-stops: list 42.0pt; mso-list: l1 level2 lfo2"><SPAN lang=EN-US>4.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">各大厂商对</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的支持。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; tab-stops: list 42.0pt; mso-list: l1 level2 lfo2"><SPAN lang=EN-US>5.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>dotNET</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的实现。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">2.</SPAN></B><B><SPAN style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt">研究意义及国内外研究现状</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向对象技术（</SPAN><SPAN lang=EN-US>OOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）很好的解决了软件系统中角色划分的问题。借助于面向对象的分析，设计和实现，可以把现实生活中很多名词物件，如人，苹果，股票等等转换为面向对象系统中的对象，从而可以将现实中的问题转换为软件的功能。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>OOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术发展到今天，即便已经是相当成熟，但还是有部分问题不能解决，或者是说不能“优雅”的解决。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举一个经常遇到且容易理解的例子。绝大部分系统都需要进行日志记录，以跟踪系统运行的状况，日志是开发人员快速查错的手段，也为系统优化等工作提供有力的依据。在面向对象的系统中，常用的做法是用一个类似</SPAN><SPAN lang=EN-US>Logable</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的接口来标示这个对象是“可被记录日志”的，或者是提供一个超类为所有的子类提供一个日志记录器（</SPAN><SPAN lang=EN-US>Logger</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。从实现的角度考虑，系统中若有大量的类需要日志功能，将日志记录器以硬编码的方式穿插在这些类里，一旦需要更改，很可能会有大量的类需要改动，更有甚者，如果日志记录的需求是项目后期提出的，那么满足这个需求将是一场恶梦，同时系统出错的几率也大大增加。从</SPAN><SPAN lang=EN-US>OOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计的原则来讲，如果一个应用系统是做物品交易的，那么它应该关注的只是它自身的业务―转帐，配货。一堆的系统运行信息，对业务是无益的，但对整个系统，是必要的，把日志记录器生硬的嵌入到业务模型中，也不符合单一职责原则。类似于日志这样散落在系统各处的功能点还有很多，在性能优化，上下文相关信息处理等各个方面都设计到这样的问题，把这种行为归结为“横切关注点（</SPAN><SPAN lang=EN-US>Crosscutting Concern</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）”，因为它跨越了给定编程模型中的典型职责边界。横切行为的实现是分散的，这种行为难以做逻辑思维，实现和更改。面向方面编程（</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>Aspect</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">－</SPAN><SPAN lang=EN-US>Oriented Programming</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）便是为解决这些问题而生的。</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为开发人员提供一种关注横切点的机制，自动将横切关注点织入（</SPAN><SPAN lang=EN-US>Weave</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）到面向对象的软件体系结构当中。所以，</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并不是</SPAN><SPAN lang=EN-US>OOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的替代，而是它的延续和补充。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不仅可以帮助我们解决代码混乱和代码分散所带来的问题，还有以下一些好处：</SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。模块话横切关注点，</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用最小的耦合处理每个关注点，使得即使是横切关注点也是模块化的，这样的实现产生的系统，其代码冗余小，模块化的实现还使得系统容易理解和维护；</SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。系统容易扩展，由于方面模块根本不知道横切关注点，所以很容易通过建立新的方面加入新的功能。另外当系统加入新的模块时，已有的方面自动横切进来，使系统易于扩展；</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。设计决定的迟绑定，使用</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以推迟为将来的需要做决定；</SPAN><SPAN lang=EN-US>4</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。更好的代码重用性，</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把每个方面实现为独立的模块，模块之间是松耦合的。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在国外，施乐公司帕诺阿尔托研究中心（</SPAN><SPAN lang=EN-US>Xerox PARC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）开发了全球第一个</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发环境－</SPAN><SPAN lang=EN-US>AspectJ</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这个加强版的</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言提供了一整套语法，能够清晰的的描述横切关注点，并将其织入到</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源代码中。织入后的代码仍然是标准的</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源代码，从而还保证了</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的移植能力。著名的微软公司也无声无息的对</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行了大量的研究，并且应用于新的体系结构中。</SPAN><SPAN lang=EN-US>COM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＋，</SPAN><SPAN lang=EN-US>dotNET</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中都可以找到</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的身影。一大批国际著名厂商先后在</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上投入了大量的研发力量。同时，各种</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架也孕育而生，如</SPAN><SPAN lang=EN-US>Aspect</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＃等等。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">国内，也有小部分先行者开始</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">研究，并且有一定的成果，如</SPAN><SPAN lang=EN-US>AOP.net</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">直至如今，也并不成熟，还不是主流的开发技术。需要开发者们投入更多的精力去论证，完善它。</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">未来是美好的，它必将引起</SPAN><SPAN lang=EN-US>SP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</SPAN><SPAN lang=EN-US>OOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之后的另一场大革命。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 12.0pt">3.</SPAN></B><B><SPAN style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt">难点，关键问题及研究方法，可行性等</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">难点及其关键问题。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是场刚开始不久的革命，所以可参阅的资料非常上，特别是中文资料。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">横切代码的织入方式，既是实现</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">思想的关键，也是难点。通常有两种做法：一是静态织入，</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">由预处理器，编译期，编译后的链接器，<SPAN lang=EN-US>loader，JIT或者VM来完成；另一种途径是动态织入，也就是使用interceptor在运行时织入。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>应该说第一种织入方式的实现难度较大。需要对编译原理及对应平台（通常是虚拟机，最常见的是Java和dotNET）有深入的了解，能熟练应用对应平台上类似于汇编一级的语言。这种织入方式将带来最高的执行效率。动态织入实现的难度相对较小。但需要动态运行环境（Java，dotNET）的支持，运行效率不如静态织入的方式，但其动态部署的能力相当强大，编程更加灵活。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">研究方法</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先阅读已有的研究文献，建立对</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">整体上的认识。当有了一个比较清晰的概念，则开始剖析流行的</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架，对</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更进一层的理解。最后尝试使用</SPAN><SPAN lang=EN-US>doNET</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现</SPAN><SPAN lang=EN-US>AOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编程。</SPAN></P><img src ="http://www.blogjava.net/huyi/aggbug/2277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi/" target="_blank">HuYi's Blog</a> 2005-03-21 13:09 <a href="http://www.blogjava.net/huyi/articles/2277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 技术测试：你是oltp应用开发方面的高手吗？</title><link>http://www.blogjava.net/huyi/articles/1636.html</link><dc:creator>HuYi's Blog</dc:creator><author>HuYi's Blog</author><pubDate>Thu, 03 Mar 2005 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/huyi/articles/1636.html</guid><wfw:comment>http://www.blogjava.net/huyi/comments/1636.html</wfw:comment><comments>http://www.blogjava.net/huyi/articles/1636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi/comments/commentRss/1636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi/services/trackbacks/1636.html</trackback:ping><description><![CDATA[技术测试：你是oltp应用开发方面的高手吗？<BR><BR>这里是一篇技术测试的文章，希望所有那些自称的和被人吹捧的技术高手来看一看，做做我们的几个测试，看看你属于那种层次的高手？<BR><BR>以下测试是针对oltp开发而言的，对于做算法和桌面程序的，不是我这里要讨论的对象。<BR><BR>好了，第一个考题：你能否做一个统计系统，功能上和易数差不多，能够通过页面嵌入方式记录一个网站的显示次数，来访分析，时段分析，日期分析等等。怎么，这就被难住了，那你算哪门子高手？啊哈，这位说了，这些都easy，手到擒来，很好，很好，看来在实现功能上，你具有了高手的基本能力，不过且慢，如果你认为可以实现这些功能就能自称做个易数统计出来，未免也太小瞧了技术这碗饭的分量，实现这些功能，就中国而言，至少有6位数的程序员可以作到，而设计这么一套系统（仅从功能考虑），也至少有5位数的程序员可以作到，明白吗？你不过是这里面平平常常的一个而已了，要高兴还早呢。<BR><BR>第二个考题：呵呵，其实还是做这些功能，不过加个条件，我只给你一台PC Server（单/双PIII 733+512M Ecc内存+18G SCSI硬盘），你要支撑300万/天的请求调用。琢磨琢磨吧。<BR>简简单单的一个cgi+数据库，那是肯定死翘翘了，怎么办？<BR>第一，你要建立三层体系模型，后台数据库必须通过中间应用层和前台CGI分开。<BR>第二，合理分配使用共享内存空间，并合理通过IPC信号量防止内存区的读写冲突和死锁。<BR>第三，必要时改写web server原代码以获得效率最优化，比如改写apache server的http_log.c程序并重新编译。<BR>如果你对建立这么一套系统的整体架构非常清楚，那么恭喜，你可以在一个比较不错的网络公司做一个CTO了，中国能够清晰搭建这样系统的人，不过4位数而已（当然，能够在这样系统里进行编码工作的，肯定还是有5位数以上的，毕竟左右都是c语言而已）。<BR>知道为什么层出不穷那么多统计系统，虽然功能花哨，但是最后都撑不过易数，基本功不扎实，光靠功能花哨，那是没前途的。<BR><BR>在这个领域做的比较好的，好耶，网易，adsunion，腾讯，太极链等几家而已。<BR>那些所谓广告交换没什么技术瓶颈的人，自己做一套大并访系统出来再说话。<BR><BR>第三个考题，还是这些功能，（我够贫的是吧）我要你一天能记录下3000万次浏览日志，不但要统计，还要完整记录，以供随时查验，当然主机环境提升一下，处理数据的主机用集群，但是核心数据库还是用一台电脑的，这次用sun的小型机，比如RS6000什么的；还有这次再加个条件，数据损失不能超过0.01%。<BR>这个已经不再象建立一个网站了，到象是大型电信的计费中心。你能胜任吗？<BR>这时候要求对整体操作系统，对C语言，对数据库核心都必须有深入骨髓的理解，甚至于，对于数据的导入导出和一些日志的数据库记录，你已经不能再用sql去写了！要利用数据库产品的核心接口按照其数据存储格式直接进行文件或设备块的读写操作！对于一些负载非常大而性能要求又非常高的系统，甚至你需要建立一套独立的数据库体系和数据结构体系。这不是玩笑，因为我领教过这样的系统。<BR>在中国，能搭建这样平台的高手，最多3位数而已。主要集中在电信计费领域，如亚信这样的企业。<BR><BR>第四个考题，这次每天的请求不是3000万了，而是3万万，我没说胡话，3万万！不过你的工作变了，我不要你再做后面的数据处理，我只让你做一个前端报文转发处理，这次我很苛刻，给你一台PII的PC服务器，256M Ecc内存，而数据损失要求则绝对不能超过0.0001%，你的工作很简单，对来往的请求进行简单识别并转发到合适的应用服务器处理。<BR>你用web server转发？别开玩笑了！这时候，你已经别无选择，用汇编自己写一套报文处理程序，作为看守进程驻入内存并挂在接收报文的端口上，你对效率的理解，应当已经超出了对操作系统的认识，对编程语言的认识，而直接达到对CPU指令集的认识程度上，是的，你必须清楚自己的每一条汇编指令是不是已经达到最小的CPU指令占用。必须能计算出分解和处理一条报文的流程需要多少CPU指令循环，是不是已经针对CPU的指令集达到了最大优化，当然，你还必须很熟悉TCP/IP协议对每一种报文的格式定义和规范，不过这和汇编指令的效率优化而言，到不显得有多高深了。<BR>我们经常说CISCO是硬件产品服务商，错了！他们的利润主要就来自于这样的算法！！中国联想、华为等等都想强占这块肥肉的市场，但是在高端领域（其实并不是硬件高端，而是算法高端！），我们还是彻底的空白。<BR>庆幸的是，我知道国内有人在做这样的事情了，当宽带不可避免的成为主流的时候，这种算法的强度和要求，会成为攫取利润的最好途径。<BR>中国在这方面能达到标准的，又有几个人呢？<BR><BR>出了这四个考题，没别的意思，我刚大学毕业的时候，也是自视甚高，因为当时的感觉是，和专业课的计算机作业相比（我是力学专业的，动不动要求编程解一个偏微分方程的收敛解，来分析什么旋流场的速度、温度等的分布），做wewebb开发简直毫无算法可言。再加上当时国内做web数据库的也少，动辄以为自己已经是满高手了，结果幸好跑到给电信做计费的企业混了一年，接触了国内最大的电信集中计费中心的解决方案（一直在运营，还不错），才知道敢情OLTP应用里面学问大的很，自己这点皮毛拿出来吹嘘简直是不知天高地厚。现在看看外面一堆和我当初一样的小毛孩子整天做两个烂程序就自诩高手，只好出来说几句。<BR><BR>其实对于OLTP应用而言，功能的实现一般都非常容易，和那些从事力学、数学、物理等行业的数值计算相比简直毫无算法可言，而OLTP的技术难点主要在于性能，也就是你做一个桌面程序或算法程序，都不会面临并访过高的处理问题，但是做一个OLTP应用，无论如何你都必须直视一下子很多访问冲上来的情况，如果这个问题解决不了，无论多好的创意，多好的功能，都不会得到持续和长远的发展。<BR><BR>由于很多创业者和投资者对技术不通或半通，他们往往拿一个性能指标有很大缺陷的东东当个宝贝，因为一般而言，开发出新东东大家都只是忙着测试功能，很少有对性能进行完整测评的，只有持续运营到一定阶段，并访达到一定程度，性能缺陷开始暴露，才临急抱佛脚，这时候造成的损失就很不核算，甚至是压根解决不了，只好放弃某种功能，从而使品牌信誉整体下降。<BR><BR>加强算法基础，加强技术基础，少卖弄一些花里胡哨的东西，是走向技术高手的真正路线，那些今天学会了什么语言，明天又学会了什么语言的主儿，别吹嘘了，从70年代到现在，最值钱的程序员一直是写汇编和写标准C的，不为什么，因为这是真功夫。<img src ="http://www.blogjava.net/huyi/aggbug/1636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi/" target="_blank">HuYi's Blog</a> 2005-03-03 10:28 <a href="http://www.blogjava.net/huyi/articles/1636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 技术专题：大型应用系统的一些讨论 -- by 曹政</title><link>http://www.blogjava.net/huyi/articles/1469.html</link><dc:creator>HuYi's Blog</dc:creator><author>HuYi's Blog</author><pubDate>Thu, 24 Feb 2005 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/huyi/articles/1469.html</guid><wfw:comment>http://www.blogjava.net/huyi/comments/1469.html</wfw:comment><comments>http://www.blogjava.net/huyi/articles/1469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi/comments/commentRss/1469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi/services/trackbacks/1469.html</trackback:ping><description><![CDATA[技术专题：大型应用系统的一些讨论<BR><BR>第一：作为OLTP应用（联机事物处理，区别于OLAP），响应速度和处理并访能力是系统整体性能评价的第一要旨。<BR>作为带动性能提升的主要因素，占第一位的是系统的体系架构、第二位的是数据结构定义、第三位的才是选择怎样的语言和系统平台。当然，很多情况下在考虑体系结构的时候是有基于系统平台的考量，但是一般而言，系统体系结构并不是依存于某特定平台才能确定的。<BR><BR>作为高并访应用的OLTP而言，一般在涉及数据库操作和数据存储操作的时候，应当明确的关键问题是，数据库操作的触发和执行是不应当基于用户请求的，这也是三层体系结构的真谛所在。也就是说，如果一个用户请求就触发了一个数据库操作，不管你使用的是php,jsp,asp,cfm,fcg还是com组件或其他什么东东，严格讲都不是真正的三层体系，因为这时中间层实际上并不存在。即便使用了预编译，即便使用了数据连接池（Connect Pool），即使系统提供了足够的缓冲处理，都是不够的。<BR><BR>举个例子而言，如果你在一个页面上使用了计数器，最简单的方法是每次页面请求的时候，处理程序直接数据库中相关记录加1，不管使用什么语言，什么平台，或调用什么控件，亦或采用了数据库内部的存储过程处理（显然这样效率很高）。但是这还不够，比如类似于易数统计这样的系统，当它每天处理几百万至上千万请求的时候，任何数据库就都无法容忍这样的操作，因为对于update操作，数据库缓冲的存在基本是无用的。<BR>那么取代的手段是怎样的，前台的API程序将来访请求的一些信息按照一个指定规范直接扔到指定缓冲区里面，这样API程序（请注意这里我不提CGI,CGI效率那么差，在这样的场合是不推荐的）的处理过程很简单，效率很高。后台的看守进程从缓冲区读取数据，通过指定管道（数据连接池，固定数据库连接进程维持常连接状态）和数据库进行数据更新操作，这样的好处有以下几点，第一是当并访瞬间高峰时，前台响应不会受很大影响，缓冲可能会造成溢出而损失数据，但是不会影响前台的展示，而且当缓冲合理分配时，这种压力也会减轻，而后台看守进程可以将任务负载均衡分布处理，一时处理不完的在系统负载减轻时可以继续处理，这样后台负载可以均担，减少因瞬态高峰造成系统崩溃的隐患；第二是当缓冲区数据存储合理安排时，后台可以作到批量处理，要知道数据库批量更新比一个一个单独更新的效率会高很多，这样从处理任务量上减轻系统负载！<BR>针对以上补充一点说明，一般而言，针对良好的商业数据库而言，select操作比update操作的效率高一个数量级，因为前者可以充分利用缓冲，而后者不能，因此将update操作批量化和后台化是非常重要的！<BR><BR>第二：动态页面的静态化至关重要<BR>很多人会对这个问题感到疑惑，因为提到动态页面，自然是能够根据不同条件动态显示的页面，这也是相对于静态主页的优势，为什么要退回去静态化？<BR>其实静态化不等于就是静态主页，这也是基于效率和性能的考虑。还是用例子表达。<BR>范例１：新闻系统<BR>新闻的时效性是最重要的，为了减少维护和提高更新速度，现有的新闻系统很强调后台更新的即时展示。<BR>我们现在要考虑一个问题，一个新闻系统的首页每天显示动辄几万至几百万次，而新闻每天的更新频率最多几十到几百次，也就是在新闻标题列表两次更新之间，有几千至几万人看到的是同样的东西，类似这样的东东，就要考虑静态化处理了。同样，对于每一条新闻而言，几百至几千人看到的是同样的东西，依然有这样的处理需求。类似这样的问题，作为新闻标题列表的页面和单一新闻页面，都应当是静态html发布，这样最符合效率原则，而后台的维护程序仅仅在更新和发布新闻的时候，对这种静态html以文本文件方式打开和操作，这样就不会影响时效性和维护的便捷性。新浪的新闻系统绝对是这样的，我还看到了很多免费共享软件，可惜没有这样处理的。<BR>范例２：广告交换系统<BR>广告交换系统和上述有一些区别，在于每个用户所看到的东西都是不同的，每次用户刷新也是不同的，这种情况下上述方式就无法解决。但是静态化的工作还是需要的。<BR>实际上这里面有一个小窍门就是广告交换系统或类似系统（即便是商业广告投放系统）从需求定义而言并不需要100%严格的交换比例，甚至也不可能作到100%严格的交换比例，这时候后台进程就应当对需要投放的广告内容定时进行预生成（比如间隔三分钟生成一次），并放入缓冲，前台的API程序在接受用户请求后，根据用户请求的参数和条件，在预生成的广告队列里面进行二次生成，并将这次投放的记录放到存放统计的缓冲（这是本文刚开始就提到的手段，后台对统计信息的处理同前文），前台程序虽然也进行了动态生成过程，但是由于数据来源是缓冲中的预生成信息，因此处理量小，处理效率高，而后台进程则将原本需要每次请求进行的类似操作集中一次进行，同样从架构上减少了系统处理的工作量。而作为代价，仅仅是投放过程中的交换显示比会由于三分钟预生成中的统计变化而显得不那么精确，但是当系统运营时间很长以后，这种不精确会逐步调整到可以完全忽略的地步。<BR><BR>第三：那种语言效率最高<BR>这是一个最原始的问题，php＋zend,fcg,jsp,IIS API都宣称自己非常之快，实际上他们都是采用了提前加载，预编译，驻留内存，缓冲分配等手段，使得处理请求响应的速度非常之快，但是这种速度仅仅是处理响应的速度，当系统需要对后台数据库，对后台文件，甚至对后台shell进行操作的时候，最快的毋庸质疑，还是C语言，而且是标准C语言，有一个事实必须提醒诸位，尽管高级语言层出不穷，但是从70年代到21世纪，世界上最值钱的程序员一直是标准C的程序员（当然还有更原始的汇编程序员）。其实一个大型系统，前台动态展示采用asp也好，cfm也好，fcg也好，jsp也好都是无关紧要的，关键是采用合适的架构并把烦琐的数据操作尽可能放到后台执行。<BR>放到后台执行的准则是，将动态化过程中所有可以集中批量处理的，所有可以通过缓冲交换的，所有重复性的工作，所有与用户请求没有直接关联的，一概放到后台，以看守进程，或者定时程序进行。<BR><BR>第四：安全问题考虑。<BR>当一个大的网上应用系统，如果有些程序，访问量不高，因此网站设计者认为效率无所谓，可以通过api直接对数据库进行烦琐操作，那么就危险了，实质上那种程序往往成为基于CGI的D.o.s攻击的靶子，（本人恰恰是这方面的专家<IMG src="http://www.discuz.net/images/smilies/smile.gif" align=absMiddle border=0>）。因为当有人通过伪装报文，瞬间大量请求这个处理效率不高，反应缓慢的程序的时候，系统资源就会大量被占用，很快就会因为系统资源过载而导致系统崩溃或拒绝服务。<BR>请注意这种攻击是导致系统资源的过载而不是带宽，由于宽带网的接近，基于带宽的拒绝服务攻击将越来越困难，但是恰恰相反的是，基于系统资源的拒绝服务攻击将越来越容易，所以网站设计者，千万不可在任何一个地方掉以轻心，而烦琐操作后台化，对这样的攻击行为就有很好的抗击能力，这一点也是我这里再次要强调的。<BR>再补充一句，进行这样的攻击非常容易，以至于一个完全不会写程序的人，只要懂得一些网络，就可以在很短时间掌握，并给大型站点带来严重打击。<BR>第五：数据支持<BR><BR>本人罗里罗嗦这么半天，大家不知道是不是不耐烦，我有何德何能在此逞强？<BR><A href="http://www.isme.net/" target=_blank><FONT color=#003366>www.isme.net</FONT></A>是目前每天支撑接近300万次广告链调用的免费广告交换系统，瞬间高峰每秒请求超过50次，每天流量12G以上。我在系统正常运行的过程中作过测试（系统已经有一定负载），通过apache的ab进行标准测试，对广告链投放程序，测试结果是在100个并访情况下，瞬间处理能力可达到每秒1300次广告链请求！如果不是合理分配内存缓冲和后台看守进程的预生成，如果每个请求程序都要到数据库跑一趟，这个数字是绝对不可能达到的。<BR><BR>任何人都可以在apache下面用ab对自己写的程序进行速度评测，看看你的程序能达到怎样的处理能力？<img src ="http://www.blogjava.net/huyi/aggbug/1469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi/" target="_blank">HuYi's Blog</a> 2005-02-24 10:12 <a href="http://www.blogjava.net/huyi/articles/1469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>