第6章软件维护.ppt

上传人:hyn****60 文档编号:70802365 上传时间:2023-01-28 格式:PPT 页数:43 大小:157.50KB
返回 下载 相关 举报
第6章软件维护.ppt_第1页
第1页 / 共43页
第6章软件维护.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述

《第6章软件维护.ppt》由会员分享,可在线阅读,更多相关《第6章软件维护.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第6章 软件维护 6.1 软件维护的内容软件维护的内容 6.2 软件维护的特点软件维护的特点 6.3 软件维护的实施软件维护的实施 6.4 软件的可维护性软件的可维护性 第第 6 章章 软件维护软件维护返回主目录第6章 软件维护第第6章章 软件维护软件维护6.1软件维护的内容软件维护的内容 软件维护有校正性维护、适应性维护、完善性维护和预防性维护。1.校正性维护校正性维护 在软件交付使用后,由于软件开发过程中产生的错误在测试中并没有完全彻底地发现,因此必然有一部分隐含的错误被带到维护阶段来。这些隐含的错误在某些特定的使用环境下会暴露出来。为了识别和纠正错误,修改软件性能上的缺陷,应进行确定和修

2、改错误的过程,这个过程就称为校正性维护,校正性维护占整个维护工作的21%。第6章 软件维护 2.适应性维护适应性维护 随着计算机的飞速发展,计算机硬件和软件环境在不断发生变化,数据环境也在不断发生变化。为了使应用软件适应这种变化而修改软件的过程称为适应性维护。例如,某个应用软件原来是在DOS环境下运行的,现在要把它移植到Windows环境下来运行;某个应用软件原来是在一种数据库环境下工作的,现在要改到另一种安全性较高的数据库环境下工作,这些变动都需要对相应的软件作修改。这种维护活动要占整个维护活动的25%。第6章 软件维护 3.完善性维护完善性维护 在软件漫长的运行时期中,用户往往会对软件提出

3、新的功能要求与性能要求。这是因为用户的业务会发生变化,组织机构也会发生变化。为了适应这些变化,应用软件原来的功能和性能需要扩充和增强。这种增加软件功能、增强软件性能和提高软件运行效率而进行的维护活动称为完善性维护。例如,软件原来的查询响应速度较慢,要提高响应速度;软件原来没有帮助信息,使用不方便,现在要增加帮助信息。这种维护性活动数量较大,占整个维护活动的50%。第6章 软件维护 4.预防性维护预防性维护 为了提高软件的可维护性和可靠性而对软件进行的修改称为预防性维护。这是为以后进一步的运行和维护打好基础。这需要采用先进的软件工程方法对需要维护的软件或软件中的某一部分进行设计、编码和测试。在整

4、个维护活动中,预防性维护占很小的比例,只占4%。第6章 软件维护6.2 软件维护的特点软件维护的特点 6.2.1 非结构化维护和结构化维护非结构化维护和结构化维护 软件的开发过程对软件的维护有较大的影响。若不采用软件工程的方法开发软件,则软件只有程序而无文档,维护工作非常困难,这是一种非结构化的维护。若采用软件工程的方法开发软件,则各阶段都有相应的文档,容易进行维护工作,这是一种结构化的维护。1.非结构化维护非结构化维护 因为只有源程序,而文档很少或没有文档,维护活动只能从阅读、理解和分析源程序开始。第6章 软件维护 2.结构化维护结构化维护 用软件工程思想开发的软件具有各个阶段的文档,这对于

5、理解、掌握软件功能、性能、软件结构、数据结构、系统接口和设计约束有很大作用。进行维护活动时,需从评价需求说明开始,搞清楚软件功能、性能上的改变;对设计说明文档进行评价,对设计说明文档进行修改和复查;根据设计的修改,进行程序的变动;根据测试文档中的测试用例进行回归测试;最后,把修改后的软件再次交付使用。这对于减少精力、减少花费和提高软件维护效率有很大的作用。第6章 软件维护 6.2.2维护的困难性维护的困难性 软件维护的困难性主要是由于软件需求分析和开发方法的缺陷造成的。软件生存周期中的开发阶段没有严格而又科学的管理和规划,就会引起软件运行时的维护困难。这种困难表现在如下几个方面:(1)读懂别人

6、的程序是困难的。要修改别人编写的程序,首先要看懂、理解别人的程序。而理解别人的程序是非常困难的,这种困难程度随着程序文档的减少而很快的增加,如果没有相应的文档,困难就达到非常严重的地步。一般程序员都有这样的体会,修改别人的程序,还不如自己重新编程序。第6章 软件维护 (2)文档的不一致性。文档不一致性是维护工作困难的又一因素。它会导致维护人员不知所措,不知根据什么进行修改。这种不一致表现在各种文档之间的不一致以及文档与程序之间的不一致。这种不一致是由于开发过程中文档管理不严所造成的。在开发中经常会出现修改程序却遗忘了修改与其相关的文档,或某一文档做了修改,却没有修改与其相关的另一文档这类现象。

7、要解决文档不一致性,就要加强开发工作中的文档版本管理工作。(3)软件开发和软件维护在人员和时间上的差异。如果软件维护工作是由该软件的开发人员来进行,则维护工作就变得容易,因为他们熟悉软件的功能、结构等。但通常开发人员与维护人员是不同的,这种差异会导致维护的困难。第6章 软件维护 6.2.3软件维护的费用软件维护的费用 软件维护的费用在总费用中的比重是在不断增加的,它在1970年占35%40%,1980年上升到40%60%,1990年上升到70%80%。软件维护费用不断上升,这只是软件维护有形的代价。另外还有无形的代价,即要占用更多的资源。由于大量软件的维护活动要使用较多的硬件、软件和软件工程师

8、等资源,这样一来,投入新的软件开发的资源就因不足而受到影响。由于维护时的改动,在软件中引入了潜在的故障,从而降低了软件的质量。第6章 软件维护 软件维护费用增加的主要原因是软件维护的生产率非常低。例如,在1976年美国的飞行控制软件每条指令的开发成本是75美元,而维护成本是每条指令大约4000美元,也就是说生产率下降了50倍。用于软件维护工作的活动可分为生产性活动和非生产性活动两种。生产性活动包括分析评价、修改设计和编写程序代码等。非生产性活动包括理解程序代码功能、解释数据结构、接口特点和设计约束。维护活动总的工作量由下式表示:M=P+Kexp(C-D)其中:M表示维护工作的总工作量;P表示生

9、产性活动工作量;K表示经验常数;C表示复杂性程度;D表示维护人员对软件的熟悉程度。第6章 软件维护6.3 软件维护的实施软件维护的实施 6.3.1 维护的组织维护的组织 1.临时维护小组临时维护小组 临时维护小组是非正式的机构,它执行一些特殊的或临时的维护任务。例如,对程序排错的检查,检查完善性维护的设计和进行质量控制的复审等。临时维护小组采用“同事复审”或“同行复审”等方法来提高维护工作的效率。2.长期维护小组长期维护小组 对长期运行的复杂系统需要一个稳定的维护小组。维护小组由以下成员组成。第6章 软件维护 1)组长 维护小组组长是该小组的技术负责人,负责向上级主管部门报告维护工作。组长应是

10、一个有经验的系统分析员,具有一定的管理经验,熟悉系统的应用领域。2)副组长 副组长是组长的助手。在组长缺席时完成组长的工作,具有与组长相同的业务水平和工作经验。副组长还执行同开发部门或其他维护小组联系的任务。在系统开发阶段,收集与维护有关的信息;在维护阶段,他同开发者继续保持联系,向他们传送程序运行的反馈信息。因为大部分维护要求是由用户提出的,所以副组长同用户保持密切联系也是非常重要的。第6章 软件维护 3)维护负责人 维护负责人是维护小组的行政负责人。他通常管理几个维护小组的人事工作,负责维护小组成员的人事管理工作。4)维护程序员 维护程序员负责分析程序改变的要求和执行修改工作。维护程序员不

11、仅具有软件开发方面的知识和经验,也应具有软件维护方面的知识和经验,还应熟悉程序应用领域的知识。第6章 软件维护 6.3.2维护的流程维护的流程 软件维护的流程如下:(1)制定维护申请报告。(2)审查申请报告并批准。(3)进行维护并做详细记录。(4)复审。1.制定维护申请报告制定维护申请报告 所有软件维护申请报告应按规定的方式提出。该报告也称为软件问题报告。它是维护阶段的一种文档,由申请维护的用户填写。第6章 软件维护 在软件维护组织内部还要制定一份软件修改报告,该报告是维护阶段的另一种文档,用来指出:(1)为满足软件问题报告实际要求的工作量。(2)要求修改的性质。(3)请求修改的优先权。(4)

12、关于修改的事后数据。提出维护申请报告之后,由维护机构来评审维护请求。评审工作很重要,通过评审回答要不要维护,从而可以避免盲目的维护。第6章 软件维护 2.维护过程维护过程 一个维护申请提出之后,经评审需要维护,则按下列过程实施维护:(1)首先确定要进行维护的类型。有许多情况,用户可以把一个请求看作校正性维护,而软件开发者可以把这个请求看作适应性或完善性维护,此时,对不同观点就要协商解决。(2)对校正性维护从评价错误的严重性开始。如果存在一个严重的错误,例如一个系统的重要功能不能执行,则由管理者组织有关人员立即开始分析问题。如果错误并不严重,则校正性维护与软件其他任务一起进行,统一安排按计划进行

13、维护工作。第6章 软件维护 (3)对适应性和完善性维护。如同它是另一个开发工作一样,建立每个请求的优先权,安排所要求的工作。若设置一个极高的优先权,当然也就意味着要立即开始此项维护工作了。(4)实施维护任务。不管维护类型如何,大体上要开展相同的技术工作。这些工作包括修改软件设计、必要的代码修改、单元测试、集成测试、确认测试以及复审,每种维护类型的侧重点不一样。(5)“救火”维护。存在着并不完全适合上面所述的经过仔细考虑的维护申请,这时申请的维护称为“救火”维护,在发生重大的软件问题时,就会出现这种情况。第6章 软件维护 3.维护的复审维护的复审 在维护任务完成后,要对维护任务进行复审。进行复审

14、时要回答下列问题:(1)给出当前情况,即设计、代码和测试的哪些方面已经完成?(2)各种维护资源已经用了哪些?还有哪些未用?(3)对于这个工作,主要的、次要的障碍是什么?(4)复审对维护工作能否顺利进行有重大影响,对一个软件机构来说也是有效的管理工作的一部分。第6章 软件维护 6.3.3维护技术维护技术 1.面向维护的技术面向维护的技术 面向维护的技术涉及软件开发的所有阶段。在需求分析阶段,对用户的需求进行严格的分析定义,使之没有矛盾和易于理解,可以减少软件中的错误。例如美国密执安大学的ISDOS系统就是需求分析阶段使用的一种分析与文档化工具,可以用它来检查需求说明书的一致性和完备性。在设计阶段

15、,划分模块时充分考虑将来改动或扩充的可能性。使用结构化分析和结构化设计方法,采用容易变更的、不依赖于特定硬件和特定操作系统的设计。第6章 软件维护2.维护支援技术维护支援技术维护支援技术包括下列各方面的技术:(1)信息收集。(2)错误原因分析。(3)软件分析与理解。(4)维护方案评价。(5)代码与文档修改。(6)修改后的确认。(7)远距离的维护。第6章 软件维护 6.3.4维护的副作用维护的副作用 维护的目的是为了延长软件的寿命并让其创造更多的价值,经过一段时间的维护,软件中的错误减少了,功能增强了。但修改软件是危险的,每修改一次,潜伏的错误就可能增加一分。这种因修改软件而造成的错误或其他不希

16、望出现的情况称为维护的副作用。维护的副作 用有编码副作用、数据副作用和文档副作用三种。1.编码副作用编码副作用 在使用程序设计语言修改源代码时可能引入如下错误:(1)删除或修改一个子程序、一个标号和一个标识符。第6章 软件维护 (2)改变程序代码的时序关系,改变占用存储的大小,改变逻辑运算符。(3)修改文件的打开或关闭。(4)改进程序的执行效率。(5)把设计上的改变翻译成代码的改变。(6)为边界条件的逻辑测试做出改变。以上这些变动都容易引入错误,要特别小心、仔细的修改,避免引入新的错误。第6章 软件维护 2.数据副作用数据副作用 在修改数据结构时,有可能造成软件设计与数据结构不匹配,因而导致软

17、件错误。数据副作用是修改软件信息结构导致的结果,有以下几种:(1)重新定义局部或全局的常量,重新定义记录或文件格式。(2)增加或减少一个数组或高层数据结构的大小。(3)修改全局或公共数据。(4)重新初始化控制标志或指针。(5)重新排列输入/输出或子程序的参数。第6章 软件维护 3.文档副作用文档副作用 对数据流、软件结构、模块逻辑或任何其他有关特性进行修改时,必须对相关技术文档进行相应修改。否则会导致文档与程序功能不匹配、缺省条件改变和新错误信息不正确等错误使文档不能反映软件当前的状态。如果对可执行软件的修改没有反映在文档中,就会产生如下文档副作用:(1)修改交互输入的顺序或格式,没有正确的记

18、入文档中。(2)过时的文档内容、索引和文本可能造成冲突等。因此,必须在软件交付之前对整个软件配置进行评审,以减少文档副作用。事实上,有些维护请求并不要求改变软件设计和源代码,而是指出在用户文档中不够明确的地方。第6章 软件维护 在这种情况下,维护工作主要集中在文档。为了控制因修改而引起的副作用,要做到:按模块把修改分组;自顶向下的安排被修改模块的顺序;每次修改一个模块对每个修改了的模块,在安排修改下一个模块之前要确定这个修改的副作用。可使用交叉引用表、存储映像表和执行流程跟踪等。第6章 软件维护6.4 软件可维护性软件可维护性 6.4.1可维护性定义可维护性定义 软件可维护性是指软件能够被理解

19、、校正、适应及增强功能的容易程度。软件的可维护性、可使用性和可靠性是衡量软件质量的几个主要特性,也是用户十分关心的几个问题。但是影响软件质量的这些主要因素,目前还没有对它们普遍适用的定量度量的方法,就其概念和内涵来说则是很明确的。软件的可维护性是软件开发阶段的关键目标。影响软件可维护性的因素较多,设计、编码及测试中的疏忽和低劣的软件配置,缺少文档等都对软件的可维护性产生不良影响。第6章 软件维护 软件可维护性可用下面7个质量特性来衡量,即可理解性、可测试性、可修改性、可靠性、可移植性、可使用性和效率。对于不同类型的维护,这7种特性的侧重点也不相同。这些质量特性通常体现在软件产品的许多方面。为使

20、每一个质量特性都达到预定的要求,需要在软件开发的各个阶段采取相应的措施加以保证,即这些质量要求要渗透到各开发阶段的各个步骤中。因此,软件的可维护性是产品投入运行以前各阶段针对上述各质量特性要求进行开发的最终结果。第6章 软件维护 6.4.2可维护性的度量可维护性的度量 目前有若干对软件可维护性进行综合度量的方法,但要对可维护性作出定量度量还是困难的。还没有一种方法能够使用计算机对软件的可维护性进行综合性的定量评价。下面是度量一个可维护的软件的7种特性时常采用的方法,即质量检查表、质量测试和质量标准。质量检查表是用于测试程序中某些质量特性是否存在的一个问题清单。检查者对检查表上的每一个问题,依据

21、自己的定性判断,回答“是”或者“否”。质量测试与质量标准则用于定量分析和评价程序的质量。由于许多质量特性是相互抵触的,要考虑几种不同的度量标准去度量不同的质量特性。第6章 软件维护 6.4.3提高可维护性的方法提高可维护性的方法 怎样才能得到可维护性高的程序呢?可从下面5个方面来解决这个问题:(1)建立明确的软件质量目标。(2)利用先进的软件开发技术和工具。(3)建立明确的质量保证工作。(4)选择可维护的程序设计语言。(5)改进程序文档。1.建立明确的软件质量目标建立明确的软件质量目标第6章 软件维护 实际上,有一些可维护特性是相互促进的,如可理解性和可测试性,可理解性和可修改性;而另一些则是

22、相互矛盾的,如效率和可移植性,效率和可修改性等。为保证程序的可维护性,应该在一定程度上满足可维护性的各个特性,但各个特性的重要性随着程序用途的不同或计算机环境的不同而改变。对编译程序来说,效率和可移植性是主要的;对信息管理系统来说,可使用性和可修改性可能是主要的。通过大量实验证明,强调效率的程序包含的错误比强调简明性的程序所包含的错误要高出10倍。因此明确软件所追求的质量目标对软件的质量和生存周期的费用将产生很大的影响。第6章 软件维护 2.使用先进的软件开发技术和工具使用先进的软件开发技术和工具 利用先进的软件开发技术能大大提高软件质量和减少软件费用。例如,面向对象的软件开发方法就是一个非常

23、实用而强有力的软件开发方法。面向对象方法与人类习惯的思维方法一致,用现实世界的概念来思考问题,从而能自然地解决问题。它强调模拟现实世界中的概念而不强调算法,它鼓励开发者在开发过程中都使用应用领域的概念去思考,开发过程自始至终都围绕着建立问题领域的对象模型来进行。按照人们习惯的思维方式建立起问题领域的模型,模拟客观世界,使描述问题的问题空间和描述解法的解空间在结构上尽可能一致,开发出尽可能直观、自然的表现求解方法的软件系统。面向对象方法开发出的软件的稳定性好。第6章 软件维护 传统方法开发出来的软件系统的结构紧密依赖于系统所需要完成的功能。当功能需求发生变化时,将引起软件结构的整体修改,因而这样

24、的软件结构是不稳定的。面向对象方法以对象为中心构造软件系统,用对象模拟问题领域中的实体,以对象间的联系刻画实体间的联系,根据问题领域中的模型来建立软件系统的结构。由于客观世界的实体及其之间的联系相对稳定,因此建立的模型也相对稳定。当系统的功能需求发生变化时,并不会引起软件结构的整体变化,往往只需要做一些局部性的修改。所以面向对象方法构造的软件系统也比较稳定。第6章 软件维护 面向对象方法构造的软件可重用性好。对象所固有的封装性和信息隐蔽机制,使得对象内部的实现和外界隔离,具有较强的独立性。因此对象类提供了比较理想的模块化机制和比较理想的可重用的软件成分。由于对象类是理想的模块机制,它的独立性好

25、,修改一个类通常很少涉及到其他类。若只修改一个类的内部实现部分而不修改该类的对外接口,则可以完全不影响软件的其他部分。由于面向对象的软件技术符合人们习惯的思维方式,用这种方法所建立的软件系统的结构与问题空间的结构基本一致,因此面向对象的软件系统比较容易理解。第6章 软件维护 对面向对象的软件系统进行维护,主要通过对从已有类派生出一些新类的维护来实现。因此,维护时的测试和调试工作也主要围绕这些新派生出来的类进行。类是独立性很强的模块,向类的实例发消息即可运行它,观察它是否能正确的完成要求它做的工作。对类的测试通常比较容易实现,如果发现错误也往往集中在类的内部,比较容易调试。总之,面向对象方法开发

26、出来的软件系统,稳定性好、容易修改、容易理解,易于测试和调试,因而可维护性好。第6章 软件维护 3.建立明确的质量保证建立明确的质量保证 质量保证是指为提高软件质量所做的各种检查工作。质量保证检查是非常有效的方法,不仅在软件开发的各阶段中得到了广泛应用,而且在软件维护中也是一个非常重要的工具。为了保证可维护性,以下 4 类检查是非常有用的。1)在检查点进行检查 检查点是指软件开发的每一个阶段的终点。在检查点进行检查的目标是证实已开发的软件是满足设计要求的。在不同的检查点检查的内容是不同的。例如,在设计阶段检查的重点是可理解性、可修改性和可测试性,可理解性检查的重点是检查设计的复杂性。第6章 软

27、件维护 2)验收检查 验收检查是一个特殊的检查点的检查,它是把软件从开发转移到维护的最后一次检查。它对减少维护费用,提高软件质量是非常重要的。验收检查实际上是我们已讲过的验收测试的一部分,只不过验收检查是从维护角度提出验收条件或标准的。3)周期性的维护检查 上述两种软件检查适用于新开发的软件。对已运行的软件应进行周期性的维护检查。为了改正在开发阶段未发现的错误,使软件适应新的计算机环境并满足变化的用户需求,对正在使用的软件进行改变是不可避免的。改变程序可能引入新错误并破坏原来程序概念的完整性。第6章 软件维护 4)对软件包的检查 上述检查方法适用于组织内部开发和维护的软件或专为少数几个用户设计

28、的软件,很难适用于享有多个用户的通用软件包。因为软件包属于卖方的资产,用户很难获得软件包的源代码和完整的文档。对软件包的维护通常采用下述方法。使用单位的维护程序员在分析研究卖方提供的用户手册、操作手册、培训教程、新版本策略指导、计算机环境和验收测试的基础上,深入了解本单位的希望和要求,编制软件包检验程序。软件包检验程序是一个测试程序,它检查软件包程序所执行的功能是否与用户的要求和条件相一致。第6章 软件维护 4.选择可维护的语言选择可维护的语言 程序设计语言的选择对维护影响很大。低级语言很难理解,很难掌握,因而很难维护。一般来说,高级语言比低级语言更容易理解,在高级语言中,一些语言可能比另一些

29、语言更容易理解。第四代语言,例如查询语言、图形语言、报表生成语言和非常高级语言等,对减少维护费用来说是一种最有吸引力的语言。人们容易使用、理解和修改它们。例如,用户使用第四代语言开发商业应用程序比使用通常的高级语言要快好多倍。一些第四代语言是过程语言,而另一些是非过程语言。第6章 软件维护 对非过程的第四代语言,用户不需要指出实现的算法,用户只需向编译程序或解释程序提出自己的要求。例如它能自动地选择报表格式、选择字符类型等。自动生成指令能改进软件可靠性。此外,第四代语言容易理解,容易编程,程序容易修改,因此改进了可维护性。5.改进程序的文档改进程序的文档 1)程序文档 程序员利用程序文档来理解

30、程序的内部结构、程序同系统内其他程序、操作系统和其他软件系统如何相互作用。程序文档包括源代码的注释、设计文档、系统流程图、程序流程图和交叉引用表等。第6章 软件维护 程序文挡是对程序功能、程序各组成部分之间的关系、程序设计策略和程序实现过程的历史数据等的说明和补充。程序文档对提高程序的可阅读性有重要作用。为了维护程序,人们必须阅读和理解程序文档。通常过低估计文档的价值是因为人们过低估计用户对修改的需求。虽然人们对文档的重要性还有许多不同的看法,但大多数人同意以下的观点:(1)好的文档能提高程序的可阅读性,但坏的文档比没有文档更坏。(2)好的文档意味着简明性,风格的一致性,容易修改。(3)程序编

31、码中应该有必要的注释以提高程序的可理解性。(4)程序越长、越复杂,则它对文档的需求也越迫切。第6章 软件维护 2)用户文档 用户文档提供用户如何使用程序的命令和指示,通常是指用户手册。更好的用户文档是联机的,用户在终端就可以阅读到它,这给没有经验的用户提供必要的帮助和引导。3)操作文档 操作文档指导用户如何运行程序,它包括操作员手册、运行记录和备用文件目录等。4)数据文档 数据文档是程序数据部分的说明,它由数据模型和数据词典组成。数据模型表示数据内部结构和数据各部分之间的功能依赖性。通常数据模型是用图形表示的。数据词典列出了程序中使用的全部数据项,包括数据项的定义、数据项的使用以及在什么地方使用。第6章 软件维护 5)历史文档 历史文档用于记录程序开发和维护的历史,不少人尚未意识到它的重要性。历史文档有三类,即系统开发日志、出错历史和系统维护日志。了解系统如何开发和系统如何维护的历史对维护程序员来说是非常有用的信息,因为系统开发者和维护者是分开的。利用历史文档可以简化维护工作。例如理解原设计意图,指导维护员如何修改代码而不破坏系统的完整性。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁